summaryrefslogtreecommitdiff
path: root/frontend/gamma
authorGiulio Cesare Solaroli <giulio.cesare@clipperz.com>2011-10-06 00:36:10 (UTC)
committer Giulio Cesare Solaroli <giulio.cesare@clipperz.com>2011-10-06 00:36:10 (UTC)
commit6ba274c79e60e417132b260bd0117c5a68121387 (patch) (unidiff)
tree57c1f95d0fbf9b80312c5c6b6f4a4f951e31c770 /frontend/gamma
parent13ebf1b1987a1566d081ff1ba89b4dca197b7d2e (diff)
downloadclipperz-6ba274c79e60e417132b260bd0117c5a68121387.zip
clipperz-6ba274c79e60e417132b260bd0117c5a68121387.tar.gz
clipperz-6ba274c79e60e417132b260bd0117c5a68121387.tar.bz2
Fixed the copyright headers
Diffstat (limited to 'frontend/gamma') (more/less context) (ignore whitespace changes)
-rw-r--r--frontend/gamma/css/clipperz/clipperz.css15
-rw-r--r--frontend/gamma/css/clipperz/compact.css15
-rw-r--r--frontend/gamma/css/clipperz/iPhone.css15
-rw-r--r--frontend/gamma/css/clipperz/ie.css15
-rw-r--r--frontend/gamma/html/exitPage_template.html15
-rw-r--r--frontend/gamma/html/mobile_template.html15
-rw-r--r--frontend/gamma/js/Bookmarklet.js15
-rw-r--r--frontend/gamma/js/BookmarkletHash.js15
-rw-r--r--frontend/gamma/js/Bookmarklet_1.js15
-rw-r--r--frontend/gamma/js/Bookmarklet_2.js15
-rw-r--r--frontend/gamma/js/Clipperz/Async.js15
-rw-r--r--frontend/gamma/js/Clipperz/Base.js15
-rw-r--r--frontend/gamma/js/Clipperz/ByteArray.js15
-rw-r--r--frontend/gamma/js/Clipperz/CSVProcessor.js15
-rw-r--r--frontend/gamma/js/Clipperz/Crypto/AES.js15
-rw-r--r--frontend/gamma/js/Clipperz/Crypto/Base.js15
-rw-r--r--frontend/gamma/js/Clipperz/Crypto/BigInt.js15
-rw-r--r--frontend/gamma/js/Clipperz/Crypto/BigInt_scoped.js15
-rw-r--r--frontend/gamma/js/Clipperz/Crypto/ECC/BinaryField/Curve.js15
-rw-r--r--frontend/gamma/js/Clipperz/Crypto/ECC/BinaryField/FiniteField.js15
-rw-r--r--frontend/gamma/js/Clipperz/Crypto/ECC/BinaryField/Point.js15
-rw-r--r--frontend/gamma/js/Clipperz/Crypto/ECC/BinaryField/Value.js15
-rw-r--r--frontend/gamma/js/Clipperz/Crypto/ECC/StandardCurves.js15
-rw-r--r--frontend/gamma/js/Clipperz/Crypto/PRNG.js15
-rw-r--r--frontend/gamma/js/Clipperz/Crypto/RSA.js15
-rw-r--r--frontend/gamma/js/Clipperz/Crypto/SHA.js15
-rw-r--r--frontend/gamma/js/Clipperz/Crypto/SRP.js15
-rw-r--r--frontend/gamma/js/Clipperz/DOM.js15
-rw-r--r--frontend/gamma/js/Clipperz/Date.js15
-rw-r--r--frontend/gamma/js/Clipperz/KeePassExportProcessor.js15
-rw-r--r--frontend/gamma/js/Clipperz/KeyValueObjectStore.js15
-rw-r--r--frontend/gamma/js/Clipperz/Logging.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/BookmarkletProcessor.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/Connection.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/Crypto.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/DataModel/DirectLogin.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/DataModel/DirectLoginBinding.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/DataModel/DirectLoginFormValue.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/DataModel/DirectLoginInput.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/DataModel/EncryptedRemoteObject.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/DataModel/OneTimePassword.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/DataModel/Record.Version.Field.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/DataModel/Record.Version.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/DataModel/Record.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/DataModel/User.Header.Legacy.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/DataModel/User.Header.OneTimePasswords.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/DataModel/User.Header.Preferences.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/DataModel/User.Header.RecordIndex.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/DataModel/User.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/Date.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/Proxy.js15
-rwxr-xr-xfrontend/gamma/js/Clipperz/PM/Proxy/Proxy.JSON.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/Proxy/Proxy.Offline.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/Proxy/Proxy.Test.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/Strings.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/Strings/MessagePanelConfigurations.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/Strings/Strings_defaults.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/Strings/Strings_en-US.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/Toll.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Canvas/CoverActions/download.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Canvas/CoverActions/look.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Canvas/Features/directLogin.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Canvas/Features/protect.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Canvas/Features/share.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Canvas/Features/store.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Canvas/GraphicFunctions.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Canvas/Logo/normal.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Canvas/Marks/exclamationMark.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Canvas/Marks/info.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Canvas/Marks/questionMark.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Canvas/RegisterButton/normal.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Canvas/Star/normal.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Canvas/Tips/close.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Canvas/Tips/open.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Common/Components/BaseComponent.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Common/Components/Button.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Common/Components/ComponentSlot.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Common/Components/FaviconComponent.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Common/Components/MessagePanelWithProgressBar.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Common/Components/PasswordEntropyDisplay.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Common/Components/ProgressBar.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Common/Components/SimpleMessagePanel.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Common/Components/TabPanelComponent.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Common/Components/Tooltip.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Common/Components/TranslatorWidget.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Common/Controllers/DirectLoginRunner.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Common/Controllers/ProgressBarController.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Common/Controllers/TabPanelController.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Common/Controllers/WizardController.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Compact/MainController.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/AccountPanel.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/AppPage.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/BookmarkletComponent.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/CardDialogComponent.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/CardDialogRecordDirectLoginComponent.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/CardDialogRecordFieldComponent.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/ColumnManager.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/CreateNewCardSplashComponent.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/DataPanel.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/DateColumnManager.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/DeleteObjectColumnManager.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginColumnManager.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginEditingBindingComponent.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginEditingComponent.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginEditingFormValueComponent.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginsColumnManager.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/FaviconColumnManager.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/GridComponent.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/ImageColumnManager.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/LinkColumnManager.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/LoginForm.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/LoginPage.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/LoginProgress.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/NewUserCreationComponent.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/Page.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/PageFooter.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/PageHeader.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/PasswordTooltip.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/RulerComponent.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/TabSidePanel.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/TextColumnManager.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/ToolsPanel.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/UnlockPasswordComponent.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/UserInfoBox.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/AppController.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/CardDialogController.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/CardsController.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/DirectLoginWizardController.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/DirectLoginsController.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/FilterController.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/GridController.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/LoginController.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/MainController.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/NewUserWizardController.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/iPhone/Components/CardDetail.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/iPhone/Components/CardList.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/iPhone/Components/LoginForm.js15
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/iPhone/Controllers/MainController.js15
-rw-r--r--frontend/gamma/js/Clipperz/Set.js15
-rw-r--r--frontend/gamma/js/Clipperz/Signal.js15
-rw-r--r--frontend/gamma/js/Clipperz/Style.js15
-rw-r--r--frontend/gamma/js/Clipperz/Visual.js15
-rw-r--r--frontend/gamma/js/Clipperz/YUI/DomHelper.js15
-rw-r--r--frontend/gamma/js/Clipperz/YUI/DomQuery.js15
-rw-r--r--frontend/gamma/js/Clipperz/YUI/Utils.js15
-rw-r--r--frontend/gamma/js/main.js15
-rw-r--r--frontend/gamma/js/main_iPhone.js15
-rw-r--r--frontend/gamma/tests/SimpleTest/SimpleTest.Async.js15
-rwxr-xr-xfrontend/gamma/tests/index.html15
-rw-r--r--frontend/gamma/tests/tests/Bookmarklet/Bookmarklet.css15
-rw-r--r--frontend/gamma/tests/tests/Bookmarklet/Fail.html15
-rw-r--r--frontend/gamma/tests/tests/Bookmarklet/Twitter.html15
-rw-r--r--frontend/gamma/tests/tests/Bookmarklet/index.html15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Async.html15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Async.test.js15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Base.html15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Base.test.js15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/ByteArray.html15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/ByteArray.test.js15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Crypto/AES.html15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Crypto/AES.performance.html15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Crypto/Base.html15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Crypto/BigInt.html15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Crypto/ECC.B283.deferred.html15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.FiniteField.B283.html15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.FiniteField.html15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.Value.html15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Crypto/ECC.K283.deferred.html15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Crypto/JSCrypto_vs_Clipperz.html15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Crypto/JSCrypto_vs_Clipperz.test.js15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Crypto/PRNG.html15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Crypto/RSA.html15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Crypto/SHA.html15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Crypto/SHA.test.js15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Crypto/SRP.html15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Crypto/Usage.html15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Crypto/index.html15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Crypto/jscrypto.js15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/DOM.html15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/DOM.test.js15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Date.html15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Date.test.js15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/KeePassExportProcessor.data.js15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/KeePassExportProcessor.html15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/KeePassExportProcessor.test.js15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/KeyValueObjectStore.html15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/KeyValueObjectStore.test.js15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/BookmarkletProcessor.html15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/BookmarkletProcessor.test.js15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/Connection.data.js15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/Connection.html15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/Connection.test.js15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/Crypto.html15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/Crypto_performanceEvaluation.html15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/Crypto_test.html15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/DataModel/DirectLogin.html15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/DataModel/DirectLogin.test.js15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/DataModel/DirectLoginConfigurations.data.js15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/DataModel/EncryptedRemoteObject.html15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/DataModel/EncryptedRemoteObject.test.js15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/DataModel/OneTimePassword.html15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/DataModel/OneTimePassword.test.js15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/DataModel/Record.html15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/DataModel/Record.test.js15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.data.js15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.data.old.js15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.html15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.test.js15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/DataModel/index.html15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/Date.html15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/Date.test.js15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/Proxy.html15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/Proxy.test.js15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/Toll.html15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/Toll.test.js15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/UI/Web/Controllers/MainController.html15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/UI/Web/Controllers/MainController.test.js15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/UI/Web/Controllers/index.html15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/UI/Web/index.html15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/UI/index.html15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/index.html15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/RoboFormExportProcessor.html15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Set.html15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Set.test.js15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/index.html15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/index_googleCode.html15
-rw-r--r--frontend/gamma/tests/tests/Clipperz/index_testECC.html15
-rw-r--r--frontend/gamma/tests/tests/Components/CardDialogEditing/CardDialogEditing_test.js15
-rw-r--r--frontend/gamma/tests/tests/Components/CardDialogEditing/User.data.js15
-rw-r--r--frontend/gamma/tests/tests/Components/CardDialogEditing/dragAndDrop_test.js15
-rw-r--r--frontend/gamma/tests/tests/Components/CardDialogEditing/index.html15
-rw-r--r--frontend/gamma/tests/tests/Components/CardDialogNew/User.data.js15
-rw-r--r--frontend/gamma/tests/tests/Components/CardDialogNew/cardDialogNew_test.js15
-rw-r--r--frontend/gamma/tests/tests/Components/CardDialogNew/index.html15
-rw-r--r--frontend/gamma/tests/tests/Components/FullApp/User.data.js15
-rw-r--r--frontend/gamma/tests/tests/Components/FullApp/index.html15
-rw-r--r--frontend/gamma/tests/tests/Components/FullApp/main_test.js15
-rw-r--r--frontend/gamma/tests/tests/Components/GridLayout/GridLayout_test.js15
-rw-r--r--frontend/gamma/tests/tests/Components/GridLayout/TestPageComponent.js15
-rw-r--r--frontend/gamma/tests/tests/Components/GridLayout/User.data.js15
-rw-r--r--frontend/gamma/tests/tests/Components/GridLayout/index.html15
-rw-r--r--frontend/gamma/tests/tests/Components/GridLayout/test.css15
-rw-r--r--frontend/gamma/tests/tests/Components/ProgressBar/index.html15
-rw-r--r--frontend/gamma/tests/tests/Components/ProgressBar/progressBar_test.js15
-rw-r--r--frontend/gamma/tests/tests/Components/SimpleMessagePanel/index.html15
-rw-r--r--frontend/gamma/tests/tests/Components/SimpleMessagePanel/simpleMessagePanel_test.js15
-rw-r--r--frontend/gamma/tests/tests/Components/Tooltips/index.html15
-rw-r--r--frontend/gamma/tests/tests/Components/Tooltips/tooltips_test.js15
-rw-r--r--frontend/gamma/tests/tests/Components/UnlockPassword/User.data.js15
-rw-r--r--frontend/gamma/tests/tests/Components/UnlockPassword/index.html15
-rw-r--r--frontend/gamma/tests/tests/Components/UnlockPassword/unlockPassword_test.js15
-rw-r--r--frontend/gamma/tests/tests/Components/crossWindowsBookmarklet/CrossWindowsBookmarklet_test.js15
-rw-r--r--frontend/gamma/tests/tests/Components/crossWindowsBookmarklet/index.html15
-rw-r--r--frontend/gamma/tests/tests/index.html15
255 files changed, 1530 insertions, 2295 deletions
diff --git a/frontend/gamma/css/clipperz/clipperz.css b/frontend/gamma/css/clipperz/clipperz.css
index dba4d57..68d9942 100644
--- a/frontend/gamma/css/clipperz/clipperz.css
+++ b/frontend/gamma/css/clipperz/clipperz.css
@@ -1,408 +1,405 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29/* @override 26/* @override
30 https://www.example.com/DEVELOPMENT/css/clipperz.css 27 https://www.example.com/DEVELOPMENT/css/clipperz.css
31 http://www.example.com/DEVELOPMENT/css/clipperz.css 28 http://www.example.com/DEVELOPMENT/css/clipperz.css
32 https://www.clipperz.com/gamma/css/clipperz.css 29 https://www.clipperz.com/gamma/css/clipperz.css
33 https://www.example.com/iPHONE/css/clipperz.css 30 https://www.example.com/iPHONE/css/clipperz.css
34*/ 31*/
35 32
36/* 33/*
37Color list: 34Color list:
38- login box: 35- login box:
39 light#ff9955 36 light#ff9955
40 dark#ff6622 37 dark#ff6622
41- login button: 38- login button:
42 regular#dd5500 39 regular#dd5500
43 hover#773311 40 hover#773311
44- login translations: 41- login translations:
45 box: #cc6622; 42 box: #cc6622;
46 not-selected: 43 not-selected:
47 color: #ddaa99 44 color: #ddaa99
48 background:#994422 45 background:#994422
49 selected: #772211; 46 selected: #772211;
50 47
51*/ 48*/
52 49
53html { 50html {
54 height: 100%; 51 height: 100%;
55} 52}
56 53
57body { 54body {
58 /*margin-left: 15px; margin-right: 15px;*/ 55 /*margin-left: 15px; margin-right: 15px;*/
59 font-family: Helvetica, Arial, Geneva, sans-serif; 56 font-family: Helvetica, Arial, Geneva, sans-serif;
60 margin: 0px; 57 margin: 0px;
61/* 58/*
62 min-width: 600px; 59 min-width: 600px;
63*/ 60*/
64 height: 100%; 61 height: 100%;
65} 62}
66 63
67img.favicon { 64img.favicon {
68 height: 16px; 65 height: 16px;
69 width: 16px; 66 width: 16px;
70} 67}
71 68
72/* @group Misc */ 69/* @group Misc */
73 70
74.clear { 71.clear {
75 clear: both; 72 clear: both;
76} 73}
77 74
78.hidden_none { 75.hidden_none {
79 display: none; 76 display: none;
80 visibility: hidden; 77 visibility: hidden;
81} 78}
82 79
83.keepTogether { 80.keepTogether {
84 display: inline-block; 81 display: inline-block;
85 white-space: nowrap; 82 white-space: nowrap;
86} 83}
87 84
88body.ext-gecko .keepTogether { 85body.ext-gecko .keepTogether {
89 display: -moz-inline-box; 86 display: -moz-inline-box;
90 } 87 }
91 88
92/* @end */ 89/* @end */
93 90
94/* @group Loading */ 91/* @group Loading */
95 92
96div#loading { 93div#loading {
97 margin-left: auto; 94 margin-left: auto;
98 margin-right: auto; 95 margin-right: auto;
99 text-align: center; 96 text-align: center;
100 margin-top: 60px; 97 margin-top: 60px;
101 width: 200px; 98 width: 200px;
102} 99}
103 100
104div#loading img { 101div#loading img {
105 border: 0px; 102 border: 0px;
106} 103}
107 104
108div#loading h5 { 105div#loading h5 {
109 font-size: 16pt; 106 font-size: 16pt;
110 padding: 0px; 107 padding: 0px;
111 color: #333366; 108 color: #333366;
112} 109}
113 110
114div#loading h2 { 111div#loading h2 {
115 padding-left: 20px; 112 padding-left: 20px;
116 color: #ff9200; 113 color: #ff9200;
117} 114}
118 115
119 116
120/* @end */ 117/* @end */
121 118
122/* @group Login page */ 119/* @group Login page */
123 120
124/* @group Header */ 121/* @group Header */
125 122
126div.pageHeader { 123div.pageHeader {
127 background-color: #1f2148; 124 background-color: #1f2148;
128 min-width: 1013px; 125 min-width: 1013px;
129} 126}
130 127
131div#logoFrame { 128div#logoFrame {
132 padding: 16px 16px 60px 16px; 129 padding: 16px 16px 60px 16px;
133 min-height: 44px; 130 min-height: 44px;
134} 131}
135 132
136 133
137div#logoFrame div#logo { 134div#logoFrame div#logo {
138 background: url(../images/old/logo.png); 135 background: url(../images/old/logo.png);
139 width: 150px; 136 width: 150px;
140 height: 39px; 137 height: 39px;
141} 138}
142 139
143 140
144div#loading div#logo { 141div#loading div#logo {
145 background: url(../images/old/logo_blue.png); 142 background: url(../images/old/logo_blue.png);
146 width: 193px; 143 width: 193px;
147 height: 58px; 144 height: 58px;
148 display: block; 145 display: block;
149} 146}
150 147
151h5.clipperzPayoff { 148h5.clipperzPayoff {
152 color: white; 149 color: white;
153 font-size: 13pt; 150 font-size: 13pt;
154 font-weight: normal; 151 font-weight: normal;
155 padding-left: 20px; 152 padding-left: 20px;
156 white-space: nowrap; 153 white-space: nowrap;
157 margin: 0px; 154 margin: 0px;
158 padding-left: 4px; 155 padding-left: 4px;
159} 156}
160 157
161 158
162/* @group Misc links */ 159/* @group Misc links */
163 160
164div#miscLinks { 161div#miscLinks {
165 float: right; 162 float: right;
166} 163}
167 164
168div#miscLinks ul { 165div#miscLinks ul {
169 margin: 12px 0px 0px; 166 margin: 12px 0px 0px;
170 padding: 15px; 167 padding: 15px;
171} 168}
172 169
173div#miscLinks ul li { 170div#miscLinks ul li {
174 display: inline; 171 display: inline;
175 margin: 0px; padding: 0px; border: 0px; 172 margin: 0px; padding: 0px; border: 0px;
176} 173}
177 174
178div#miscLinks ul li a { 175div#miscLinks ul li a {
179/* 176/*
180 color: #ccccff; 177 color: #ccccff;
181*/ 178*/
182 color: white; 179 color: white;
183 margin: 0px; padding: 0px; border: 0px; 180 margin: 0px; padding: 0px; border: 0px;
184 font-weight: normal; 181 font-weight: normal;
185 text-decoration: none; 182 text-decoration: none;
186 font-size: 12pt; 183 font-size: 12pt;
187 border-left: 1px solid #45486b; 184 border-left: 1px solid #45486b;
188 padding: 15px; 185 padding: 15px;
189 margin: 0px; 186 margin: 0px;
190 min-width: 70px; 187 min-width: 70px;
191} 188}
192 189
193div#miscLinks ul li a#donateHeaderLink { 190div#miscLinks ul li a#donateHeaderLink {
194 border-left: 0px; 191 border-left: 0px;
195} 192}
196 193
197div#miscLinks ul li a:hover { 194div#miscLinks ul li a:hover {
198 color: #ff9200; 195 color: #ff9200;
199} 196}
200 197
201 198
202 199
203/* @end */ 200/* @end */
204 201
205 202
206/* @group Features Tabs */ 203/* @group Features Tabs */
207#featureTabs table { 204#featureTabs table {
208 width: 100%; 205 width: 100%;
209 padding: 6px; 206 padding: 6px;
210 padding-bottom: 46px; 207 padding-bottom: 46px;
211} 208}
212 209
213#featureTabs table tr td { 210#featureTabs table tr td {
214 width: 25%; 211 width: 25%;
215 vertical-align: top; 212 vertical-align: top;
216 font-size: 11pt; 213 font-size: 11pt;
217 color: white; 214 color: white;
218} 215}
219 216
220#featureTabs table tr td img { 217#featureTabs table tr td img {
221 float: left; 218 float: left;
222} 219}
223 220
224#featureTabs table tr td span { 221#featureTabs table tr td span {
225 display: block; 222 display: block;
226 padding: 5 10 5 85; 223 padding: 5 10 5 85;
227} 224}
228 225
229div#featureTabs canvas.featureIcon { 226div#featureTabs canvas.featureIcon {
230 width: 76px; 227 width: 76px;
231 height: 76px; 228 height: 76px;
232 display: block; 229 display: block;
233 float: left; 230 float: left;
234 231
235 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ff9955), to(#ff6622), color-stop(1,#333333)); 232 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ff9955), to(#ff6622), color-stop(1,#333333));
236 background: -moz-linear-gradient(0% 100% 90deg,#ff6622, #ff9955); 233 background: -moz-linear-gradient(0% 100% 90deg,#ff6622, #ff9955);
237 234
238 -webkit-border-radius: 38px; 235 -webkit-border-radius: 38px;
239 -moz-border-radius: 38px; 236 -moz-border-radius: 38px;
240 border-radius: 38px; 237 border-radius: 38px;
241} 238}
242/* 239/*
243div#featureTabs div.featureIcon.storeIcon { 240div#featureTabs div.featureIcon.storeIcon {
244 background-image: url(../images/old/home/features/store.png); 241 background-image: url(../images/old/home/features/store.png);
245} 242}
246 243
247div#featureTabs div.featureIcon.protectIcon { 244div#featureTabs div.featureIcon.protectIcon {
248 background-image: url(../images/old/home/features/protect.png); 245 background-image: url(../images/old/home/features/protect.png);
249} 246}
250 247
251div#featureTabs div.featureIcon.directLoginIcon { 248div#featureTabs div.featureIcon.directLoginIcon {
252 background-image: url(../images/old/home/features/directLogin.png); 249 background-image: url(../images/old/home/features/directLogin.png);
253} 250}
254 251
255div#featureTabs div.featureIcon.shareIcon { 252div#featureTabs div.featureIcon.shareIcon {
256 background-image: url(../images/old/home/features/share.png); 253 background-image: url(../images/old/home/features/share.png);
257} 254}
258*/ 255*/
259/* 256/*
260./images/home/features/store.png 257./images/home/features/store.png
261./images/home/features/protect.png 258./images/home/features/protect.png
262./images/home/features/directLogin.png 259./images/home/features/directLogin.png
263./images/home/features/share.png 260./images/home/features/share.png
264*/ 261*/
265 262
266/* @end */ 263/* @end */
267 264
268/* @group Feature bullets */ 265/* @group Feature bullets */
269 266
270div#featurePoints { 267div#featurePoints {
271 min-width: 400px; 268 min-width: 400px;
272 padding-left: 20px; 269 padding-left: 20px;
273 padding-right: 330px; 270 padding-right: 330px;
274 padding-top: 15px; 271 padding-top: 15px;
275 padding-bottom: 20px; 272 padding-bottom: 20px;
276} 273}
277 274
278div#featurePoints table tbody tr td { 275div#featurePoints table tbody tr td {
279 width: 50%; 276 width: 50%;
280 vertical-align: top; 277 vertical-align: top;
281} 278}
282 279
283div#featurePoints table tbody tr td.separator { 280div#featurePoints table tbody tr td.separator {
284 width: 1px; 281 width: 1px;
285 border-left: 1px solid #bebebe; 282 border-left: 1px solid #bebebe;
286} 283}
287 284
288div#featurePoints div.block { 285div#featurePoints div.block {
289 padding: 10px; 286 padding: 10px;
290 color: #8e8e8e; 287 color: #8e8e8e;
291} 288}
292 289
293div#featurePoints div.block h3 { 290div#featurePoints div.block h3 {
294 font-weight: normal; 291 font-weight: normal;
295 font-size: 12pt; 292 font-size: 12pt;
296 margin: 0px; 293 margin: 0px;
297 padding: 5px 0px; 294 padding: 5px 0px;
298} 295}
299 296
300div#featurePoints div.block ul { 297div#featurePoints div.block ul {
301 margin: 0px; 298 margin: 0px;
302 margin-left: 20px; 299 margin-left: 20px;
303 padding: 0px; 300 padding: 0px;
304 list-style-position: outside; 301 list-style-position: outside;
305 list-style-image: url(../images/old/home/features/bullet.png); 302 list-style-image: url(../images/old/home/features/bullet.png);
306} 303}
307 304
308div#featurePoints div.block ul li { 305div#featurePoints div.block ul li {
309 font-size: 10pt; 306 font-size: 10pt;
310 padding: 3px 0px; 307 padding: 3px 0px;
311} 308}
312 309
313/* @end */ 310/* @end */
314 311
315 312
316 313
317/* @end */ 314/* @end */
318 315
319/* @group Login box */ 316/* @group Login box */
320 317
321div#loginBox { 318div#loginBox {
322 width: 273px; 319 width: 273px;
323 /* z-index: 40000;*/ 320 /* z-index: 40000;*/
324 z-index: 19000; 321 z-index: 19000;
325 position: relative; 322 position: relative;
326 top: -30px; 323 top: -30px;
327 right: 30px; 324 right: 30px;
328 float: right; 325 float: right;
329} 326}
330 327
331div#loginBox div.header { 328div#loginBox div.header {
332 height: 25px; 329 height: 25px;
333 width: 273px; 330 width: 273px;
334 /* background-image: url(../images/old/home/box/box_top.png);*/ 331 /* background-image: url(../images/old/home/box/box_top.png);*/
335 /* background-color: #fe965f;*/ 332 /* background-color: #fe965f;*/
336 background-color: #ff9955; 333 background-color: #ff9955;
337 334
338 -webkit-border-top-left-radius: 20px; 335 -webkit-border-top-left-radius: 20px;
339 -webkit-border-top-right-radius: 20px; 336 -webkit-border-top-right-radius: 20px;
340 -moz-border-radius-topleft: 20px; 337 -moz-border-radius-topleft: 20px;
341 -moz-border-radius-topright: 20px; 338 -moz-border-radius-topright: 20px;
342 border-top-left-radius: 20px; 339 border-top-left-radius: 20px;
343 border-top-right-radius: 20px; 340 border-top-right-radius: 20px;
344} 341}
345 342
346div#loginBox div.body { 343div#loginBox div.body {
347 background-color: #ff9955; 344 background-color: #ff9955;
348 345
349 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ff9955), to(#ff6622), color-stop(1,#333333)); 346 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ff9955), to(#ff6622), color-stop(1,#333333));
350 background: -moz-linear-gradient(0% 100% 90deg,#ff6622, #ff9955); 347 background: -moz-linear-gradient(0% 100% 90deg,#ff6622, #ff9955);
351 348
352 /*background: url(../images/old/home/box/box_body.png) repeat-x; */ 349 /*background: url(../images/old/home/box/box_body.png) repeat-x; */
353} 350}
354 351
355div#loginBox div.body h3.loading { 352div#loginBox div.body h3.loading {
356 margin: 0px; 353 margin: 0px;
357 text-align: center; 354 text-align: center;
358 padding-top: 60px; 355 padding-top: 60px;
359 color: white; 356 color: white;
360 font-size: 30pt; 357 font-size: 30pt;
361 padding-left: 20px; 358 padding-left: 20px;
362} 359}
363 360
364div#loginBox div.footer { 361div#loginBox div.footer {
365 height: 37px; 362 height: 37px;
366 width: 273px; 363 width: 273px;
367 /* background-image: url(../images/old/home/box/box_bottom.png);*/ 364 /* background-image: url(../images/old/home/box/box_bottom.png);*/
368 background-color: #ff6622; 365 background-color: #ff6622;
369 366
370 -webkit-border-bottom-left-radius: 20px; 367 -webkit-border-bottom-left-radius: 20px;
371 -webkit-border-bottom-right-radius: 20px; 368 -webkit-border-bottom-right-radius: 20px;
372 -moz-border-radius-bottomleft: 20px; 369 -moz-border-radius-bottomleft: 20px;
373 -moz-border-radius-bottomright: 20px; 370 -moz-border-radius-bottomright: 20px;
374 border-bottom-left-radius: 20px; 371 border-bottom-left-radius: 20px;
375 border-bottom-right-radius: 20px; 372 border-bottom-right-radius: 20px;
376} 373}
377 374
378/* @group Login form */ 375/* @group Login form */
379 376
380div#loginBox h4 { 377div#loginBox h4 {
381 color: white; 378 color: white;
382 font-size: 16pt; 379 font-size: 16pt;
383 font-weight: normal; 380 font-weight: normal;
384 padding-left: 20px; 381 padding-left: 20px;
385 margin: 0px; 382 margin: 0px;
386} 383}
387 384
388div#loginBox form.loginForm { 385div#loginBox form.loginForm {
389 padding: 5px 20px 0px; 386 padding: 5px 20px 0px;
390 margin-bottom: 0px; 387 margin-bottom: 0px;
391} 388}
392 389
393div#loginBox form.loginForm label { 390div#loginBox form.loginForm label {
394 color: white; 391 color: white;
395 font-size: 10pt; 392 font-size: 10pt;
396 display: block; 393 display: block;
397 padding-top: 5px; 394 padding-top: 5px;
398} 395}
399 396
400div#loginBox form.loginForm input { 397div#loginBox form.loginForm input {
401 width: 230px; 398 width: 230px;
402 font-size: 14pt; 399 font-size: 14pt;
403 border: 1px solid #bb4924; 400 border: 1px solid #bb4924;
404 color: #333366; 401 color: #333366;
405 background-color: white; 402 background-color: white;
406 padding: 2px 5px; 403 padding: 2px 5px;
407 height: 28px; 404 height: 28px;
408} 405}
diff --git a/frontend/gamma/css/clipperz/compact.css b/frontend/gamma/css/clipperz/compact.css
index 7c9252a..c6e8661 100644
--- a/frontend/gamma/css/clipperz/compact.css
+++ b/frontend/gamma/css/clipperz/compact.css
@@ -1,162 +1,159 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29/* @override https://www.example.com/css/compact.css */ 26/* @override https://www.example.com/css/compact.css */
30 27
31body.compact div#mainDiv { 28body.compact div#mainDiv {
32/* 29/*
33 width: 250px; 30 width: 250px;
34 height: 95%; 31 height: 95%;
35 border: 1px solid #333366; 32 border: 1px solid #333366;
36*/ 33*/
37 padding: 0px; 34 padding: 0px;
38} 35}
39 36
40body.compact div#compactHeader { 37body.compact div#compactHeader {
41 background-color: #333366; 38 background-color: #333366;
42} 39}
43 40
44body.compact div#compactHeader img { 41body.compact div#compactHeader img {
45 padding: 2px 20px 2px 4px; 42 padding: 2px 20px 2px 4px;
46 width: 60; 43 width: 60;
47} 44}
48 45
49body.compact div#compactHeader a { 46body.compact div#compactHeader a {
50 color: white; 47 color: white;
51 text-decoration: none; 48 text-decoration: none;
52 font-size: 10pt; 49 font-size: 10pt;
53 /*position: absolute; */ 50 /*position: absolute; */
54 right: 10px; 51 right: 10px;
55 top: 6px; 52 top: 6px;
56} 53}
57 54
58body.compact div#compactHeader a:hover { 55body.compact div#compactHeader a:hover {
59 color: #ff9400; 56 color: #ff9400;
60} 57}
61 58
62body.compact h4 { 59body.compact h4 {
63 color: #999999; 60 color: #999999;
64 text-align: center; 61 text-align: center;
65 padding: 20px; 62 padding: 20px;
66 font-weight: normal; 63 font-weight: normal;
67 font-size: 12pt; 64 font-size: 12pt;
68 font-style: italic; 65 font-style: italic;
69} 66}
70 67
71body.compact div.loginPanel form { 68body.compact div.loginPanel form {
72 padding: 10px; 69 padding: 10px;
73} 70}
74 71
75body.compact div.loginPanel dt { 72body.compact div.loginPanel dt {
76 color: #aaaaaa; 73 color: #aaaaaa;
77 font-size: 10pt; 74 font-size: 10pt;
78} 75}
79 76
80body.compact div.loginPanel input { 77body.compact div.loginPanel input {
81 width: 180px; 78 width: 180px;
82} 79}
83 80
84body.compact ul#directLogins { 81body.compact ul#directLogins {
85 background-image: none; 82 background-image: none;
86 padding: 4px 0px; 83 padding: 4px 0px;
87} 84}
88 85
89body.compact ul#directLogins li { 86body.compact ul#directLogins li {
90 width:auto; 87 width:auto;
91} 88}
92 89
93body.compact ul#directLogins li.hover { 90body.compact ul#directLogins li.hover {
94 width:auto; 91 width:auto;
95 padding-right: 0px; 92 padding-right: 0px;
96} 93}
97 94
98body.compact div.lockPanel { 95body.compact div.lockPanel {
99 color: #999999; 96 color: #999999;
100 font-size: 10pt; 97 font-size: 10pt;
101 padding: 10px; 98 padding: 10px;
102} 99}
103 100
104div#compactMiscLinks ul { 101div#compactMiscLinks ul {
105 /* text-align: center;*/ 102 /* text-align: center;*/
106 display: block; 103 display: block;
107 padding-left: 22px; 104 padding-left: 22px;
108 background-color: #ff9400; 105 background-color: #ff9400;
109} 106}
110 107
111div#compactMiscLinks ul li { 108div#compactMiscLinks ul li {
112 display: inline; 109 display: inline;
113 padding: 2px 5px; 110 padding: 2px 5px;
114} 111}
115 112
116div#compactHeader div#compactMiscLinks ul li a { 113div#compactHeader div#compactMiscLinks ul li a {
117 font-size: 9pt; 114 font-size: 9pt;
118} 115}
119 116
120div#compactHeader div#compactMiscLinks ul li a:hover { 117div#compactHeader div#compactMiscLinks ul li a:hover {
121 color: #333366; 118 color: #333366;
122} 119}
123 120
124div#lockBlock { 121div#lockBlock {
125 position: absolute; 122 position: absolute;
126 right: 10px; 123 right: 10px;
127 top: 6px; 124 top: 6px;
128} 125}
129 126
130div#lockBlock input { 127div#lockBlock input {
131 width: auto; 128 width: auto;
132 padding-bottom: 2px; 129 padding-bottom: 2px;
133} 130}
134 131
135div#lockBlock span { 132div#lockBlock span {
136 font-size: 9pt; 133 font-size: 9pt;
137 padding: 0px 5px 0px 4px; 134 padding: 0px 5px 0px 4px;
138 color: #aaaaaa; 135 color: #aaaaaa;
139} 136}
140 137
141div#lockBlock a#lock { 138div#lockBlock a#lock {
142 font-size: 9pt; 139 font-size: 9pt;
143} 140}
144 141
145/* @group Donate */ 142/* @group Donate */
146 143
147a#donateHeaderLink { 144a#donateHeaderLink {
148 font-weight: bold; 145 font-weight: bold;
149} 146}
150 147
151div#compactMiscLinks a#donateHeaderIconLink img#donateHeaderLinkIcon { 148div#compactMiscLinks a#donateHeaderIconLink img#donateHeaderLinkIcon {
152 display: inline; 149 display: inline;
153 position: absolute; 150 position: absolute;
154 top: 22px; 151 top: 22px;
155 left: 1px; 152 left: 1px;
156 width: 12px; 153 width: 12px;
157 height: 12px; 154 height: 12px;
158} 155}
159 156
160 157
161 158
162/* @end */ \ No newline at end of file 159/* @end */ \ No newline at end of file
diff --git a/frontend/gamma/css/clipperz/iPhone.css b/frontend/gamma/css/clipperz/iPhone.css
index a15f22f..ee1d795 100644
--- a/frontend/gamma/css/clipperz/iPhone.css
+++ b/frontend/gamma/css/clipperz/iPhone.css
@@ -1,408 +1,405 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29/* @override 26/* @override
30 https://www.example.com/iPHONE/css/iPhone.css 27 https://www.example.com/iPHONE/css/iPhone.css
31 https://www.example.com/DEVELOPMENT/css/iPhone.css 28 https://www.example.com/DEVELOPMENT/css/iPhone.css
32 https://www.example.com/WIZARD/css/iPhone.css 29 https://www.example.com/WIZARD/css/iPhone.css
33*/ 30*/
34 31
35/* ---------------------------------------- */ 32/* ---------------------------------------- */
36 33
37body { 34body {
38 margin: 0; 35 margin: 0;
39 font-family: Helvetica; 36 font-family: Helvetica;
40 background: #FFFFFF; 37 background: #FFFFFF;
41 color: #000000; 38 color: #000000;
42 overflow-x: hidden; 39 overflow-x: hidden;
43 -webkit-user-select: none; 40 -webkit-user-select: none;
44 -webkit-text-size-adjust: none; 41 -webkit-text-size-adjust: none;
45} 42}
46 43
47 44
48div.toolbar { 45div.toolbar {
49 box-sizing: border-box; 46 box-sizing: border-box;
50 -moz-box-sizing: border-box; 47 -moz-box-sizing: border-box;
51 -webkit-box-sizing: border-box; 48 -webkit-box-sizing: border-box;
52 border-bottom: 1px solid #2d3642; 49 border-bottom: 1px solid #2d3642;
53 border-top: 1px solid #6d84a2; 50 border-top: 1px solid #6d84a2;
54 padding: 10px; 51 padding: 10px;
55 height: 45px; 52 height: 45px;
56 /* background: url(../images/old/iPhone/toolbar.png) #6d84a2 repeat-x;*/ 53 /* background: url(../images/old/iPhone/toolbar.png) #6d84a2 repeat-x;*/
57 background: url(data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAArCAIAAAA2QHWOAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAE1JREFUCNddjDEOgEAQAgn//5qltYWFnb1GB4vdSy4WBAYStKyb9+O0FJMYyjMyMWCC35lJM71r6vF1P07/lFSfPx6ZxNLcy1HtihzpA/RWcOj0zlDhAAAAAElFTkSuQmCCCg==) #6d84a2 repeat-x; 54 background: url(data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAArCAIAAAA2QHWOAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAE1JREFUCNddjDEOgEAQAgn//5qltYWFnb1GB4vdSy4WBAYStKyb9+O0FJMYyjMyMWCC35lJM71r6vF1P07/lFSfPx6ZxNLcy1HtihzpA/RWcOj0zlDhAAAAAElFTkSuQmCCCg==) #6d84a2 repeat-x;
58} 55}
59 56
60div.toolbar h1#pageTitle { 57div.toolbar h1#pageTitle {
61 overflow: hidden; 58 overflow: hidden;
62 margin-top: 1px; 59 margin-top: 1px;
63 margin-bottom: 0px; 60 margin-bottom: 0px;
64 margin-left: auto; 61 margin-left: auto;
65 margin-right: auto; 62 margin-right: auto;
66 width: 150px; 63 width: 150px;
67 height: 25px; /* 45px*/ 64 height: 25px; /* 45px*/
68 font-size: 20px; 65 font-size: 20px;
69 width: 150px; 66 width: 150px;
70 font-weight: bold; 67 font-weight: bold;
71 text-shadow: rgba(0, 0, 0, 0.4) 0px -1px 0; 68 text-shadow: rgba(0, 0, 0, 0.4) 0px -1px 0;
72 text-align: center; 69 text-align: center;
73 text-overflow: ellipsis; 70 text-overflow: ellipsis;
74 white-space: nowrap; 71 white-space: nowrap;
75 color: #FFFFFF; 72 color: #FFFFFF;
76} 73}
77 74
78div.toolbar a.button { 75div.toolbar a.button {
79 position: absolute; 76 position: absolute;
80 overflow: hidden; 77 overflow: hidden;
81 top: 8px; 78 top: 8px;
82 right: 6px; 79 right: 6px;
83 margin: 0; 80 margin: 0;
84 border-width: 0 5px; 81 border-width: 0 5px;
85 padding: 0 3px; 82 padding: 0 3px;
86 width: auto; 83 width: auto;
87 height: 30px; 84 height: 30px;
88 line-height: 30px; 85 line-height: 30px;
89 font-family: inherit; 86 font-family: inherit;
90 font-size: 12px; 87 font-size: 12px;
91 font-weight: bold; 88 font-weight: bold;
92 color: #FFFFFF; 89 color: #FFFFFF;
93 text-shadow: rgba(0, 0, 0, 0.6) 0px -1px 0; 90 text-shadow: rgba(0, 0, 0, 0.6) 0px -1px 0;
94 text-overflow: ellipsis; 91 text-overflow: ellipsis;
95 text-decoration: none; 92 text-decoration: none;
96 white-space: nowrap; 93 white-space: nowrap;
97 background: none; 94 background: none;
98 /* -webkit-border-image: url(../images/old/iPhone/toolButton.png) 0 5 0 5;*/ 95 /* -webkit-border-image: url(../images/old/iPhone/toolButton.png) 0 5 0 5;*/
99} 96}
100 97
101div.toolbar a#backButton { 98div.toolbar a#backButton {
102 /* display: none;*/ 99 /* display: none;*/
103 left: 6px; 100 left: 6px;
104 right: auto; 101 right: auto;
105 padding: 0px; 102 padding: 0px;
106 max-width: 55px; 103 max-width: 55px;
107 border-width: 0 8px 0 14px; 104 border-width: 0 8px 0 14px;
108 /* -webkit-border-image: url(../images/old/iPhone/backButton.png) 0 8 0 14;*/ 105 /* -webkit-border-image: url(../images/old/iPhone/backButton.png) 0 8 0 14;*/
109 -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; 106 -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;
110} 107}
111 108
112/* ------------------------------------------- */ 109/* ------------------------------------------- */
113 110
114body.iPhone form.loginForm { 111body.iPhone form.loginForm {
115 min-height: 372px; 112 min-height: 372px;
116 113
117 box-sizing: border-box; 114 box-sizing: border-box;
118 -moz-box-sizing: border-box; 115 -moz-box-sizing: border-box;
119 -webkit-box-sizing: border-box; 116 -webkit-box-sizing: border-box;
120 padding: 10px; 117 padding: 10px;
121 /* background: #c8c8c8 url(../images/old/iPhone/pinstripes.png);*/ 118 /* background: #c8c8c8 url(../images/old/iPhone/pinstripes.png);*/
122 background: #c8c8c8 url(data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAABCAIAAACdaSOZAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABdJREFUeNpiPHrmCgMC/GNjYwNSAAEGADdNA3dnzPlQAAAAAElFTkSuQmCCCg==); 119 background: #c8c8c8 url(data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAABCAIAAACdaSOZAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABdJREFUeNpiPHrmCgMC/GNjYwNSAAEGADdNA3dnzPlQAAAAAElFTkSuQmCCCg==);
123} 120}
124 121
125fieldset { 122fieldset {
126 position: relative; 123 position: relative;
127 margin: 0 0 20px 0; 124 margin: 0 0 20px 0;
128 padding: 0; 125 padding: 0;
129 background: #FFFFFF; 126 background: #FFFFFF;
130 -webkit-border-radius: 10px; 127 -webkit-border-radius: 10px;
131 -moz-border-radius: 10px; 128 -moz-border-radius: 10px;
132 border: 1px solid #999999; 129 border: 1px solid #999999;
133 text-align: right; 130 text-align: right;
134 font-size: 16px; 131 font-size: 16px;
135} 132}
136 133
137.row { 134.row {
138 position: relative; 135 position: relative;
139 min-height: 42px; 136 min-height: 42px;
140 border-bottom: 1px solid #999999; 137 border-bottom: 1px solid #999999;
141 -webkit-border-radius: 0; 138 -webkit-border-radius: 0;
142 text-align: right; 139 text-align: right;
143} 140}
144 141
145fieldset > .row:last-child { 142fieldset > .row:last-child {
146 border-bottom: none !important; 143 border-bottom: none !important;
147} 144}
148 145
149 146
150.row > input:not(input[type|=radio]):not(input[type|=checkbox]), 147.row > input:not(input[type|=radio]):not(input[type|=checkbox]),
151.row > div.fieldValue { 148.row > div.fieldValue {
152 width: 100%; 149 width: 100%;
153 box-sizing: border-box; 150 box-sizing: border-box;
154 -moz-box-sizing: border-box; 151 -moz-box-sizing: border-box;
155 -webkit-box-sizing: border-box; 152 -webkit-box-sizing: border-box;
156 margin: 0; 153 margin: 0;
157 border: none; 154 border: none;
158 /* padding: 0px;*/ 155 /* padding: 0px;*/
159 padding: 0px 10px 0 112px; 156 padding: 0px 10px 0 112px;
160 height: 42px; 157 height: 42px;
161 background: none; 158 background: none;
162 font-size: 16px; 159 font-size: 16px;
163 font-weight: normal; 160 font-weight: normal;
164 161
165 color: #666a60; 162 color: #666a60;
166 -webkit-user-select: text; 163 -webkit-user-select: text;
167} 164}
168 165
169/*.row > span.fieldValue {*/ 166/*.row > span.fieldValue {*/
170.row > div.fieldValue p { 167.row > div.fieldValue p {
171/*.row > input.fieldValue {*/ 168/*.row > input.fieldValue {*/
172 margin: 0px; 169 margin: 0px;
173 text-align: left; 170 text-align: left;
174 height: 40px; 171 height: 40px;
175 vertical-align: middle; 172 vertical-align: middle;
176 line-height: 40px; 173 line-height: 40px;
177 /* padding: 0px 10px 0 112px;*/ 174 /* padding: 0px 10px 0 112px;*/
178} 175}
179 176
180/*body[orientation="landscape"] .row > span.fieldValue.password {*/ 177/*body[orientation="landscape"] .row > span.fieldValue.password {*/
181body[orientation="landscape"] .row > div.fieldValue.password { 178body[orientation="landscape"] .row > div.fieldValue.password {
182/*body[orientation="landscape"] .row > input.fieldValue.password {*/ 179/*body[orientation="landscape"] .row > input.fieldValue.password {*/
183 padding-right: 120px; 180 padding-right: 120px;
184 /* background: url(../images/old/iPhone/password_background.png) no-repeat 105px;*/ 181 /* background: url(../images/old/iPhone/password_background.png) no-repeat 105px;*/
185 background: url(data:image/png;charset=utf-8;base64,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) no-repeat 105px; 182 background: url(data:image/png;charset=utf-8;base64,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) no-repeat 105px;
186} 183}
187 184
188/*.row > span.fieldValue.password {*/ 185/*.row > span.fieldValue.password {*/
189.row > div.fieldValue.password { 186.row > div.fieldValue.password {
190/*.row > input.fieldValue.password {*/ 187/*.row > input.fieldValue.password {*/
191 color: rgba(255,255,255,0.5); 188 color: rgba(255,255,255,0.5);
192 /* background: url(../images/old/iPhone/password_background.png) no-repeat 106px;*/ 189 /* background: url(../images/old/iPhone/password_background.png) no-repeat 106px;*/
193 background: url(data:image/png;charset=utf-8;base64,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) no-repeat 106px; 190 background: url(data:image/png;charset=utf-8;base64,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) no-repeat 106px;
194} 191}
195 192
196.row > div.fieldValue.password.clear { 193.row > div.fieldValue.password.clear {
197 color: #666a60; 194 color: #666a60;
198 background: none; 195 background: none;
199} 196}
200 197
201.row > input[type|=radio], .row > input[type|=checkbox] { 198.row > input[type|=radio], .row > input[type|=checkbox] {
202 margin: 7px 7px 0 0; 199 margin: 7px 7px 0 0;
203 height: 25px; 200 height: 25px;
204 width: 25px; 201 width: 25px;
205} 202}
206 203
207 204
208.row > label { 205.row > label {
209 position: absolute; 206 position: absolute;
210 margin: 0 0 0 14px; 207 margin: 0 0 0 14px;
211 line-height: 42px; 208 line-height: 42px;
212 font-weight: bold; 209 font-weight: bold;
213 max-width: 92px; 210 max-width: 92px;
214 overflow: hidden; 211 overflow: hidden;
215 white-space: nowrap; 212 white-space: nowrap;
216} 213}
217 214
218body[orientation="landscape"] .row > label { 215body[orientation="landscape"] .row > label {
219 max-width: 150px; 216 max-width: 150px;
220} 217}
221 218
222body[orientation="landscape"] .row > input:not(input[type|=radio]):not(input[type|=checkbox]) { 219body[orientation="landscape"] .row > input:not(input[type|=radio]):not(input[type|=checkbox]) {
223 padding-left: 140px; 220 padding-left: 140px;
224} 221}
225 222
226.row > img.favicon { 223.row > img.favicon {
227 position: absolute; 224 position: absolute;
228 width: 20px; 225 width: 20px;
229 height: 20px; 226 height: 20px;
230 top: 12px; 227 top: 12px;
231 left: 11px; 228 left: 11px;
232} 229}
233 230
234.row > span { 231.row > span {
235 padding: 8px 13px; 232 padding: 8px 13px;
236 text-align: left; 233 text-align: left;
237 display: block; 234 display: block;
238 color: #666a60; 235 color: #666a60;
239 font-size: 10pt; 236 font-size: 10pt;
240} 237}
241 238
242.row.notes { 239.row.notes {
243 -webkit-user-select: text; 240 -webkit-user-select: text;
244} 241}
245 242
246/* ------------------------------------------- */ 243/* ------------------------------------------- */
247 244
248.whiteButton { 245.whiteButton {
249 margin-left: auto; 246 margin-left: auto;
250 margin-right: auto; 247 margin-right: auto;
251 width: 150px; 248 width: 150px;
252 display: block; 249 display: block;
253 border-width: 0 12px; 250 border-width: 0 12px;
254 padding: 10px; 251 padding: 10px;
255 text-align: center; 252 text-align: center;
256 font-size: 20px; 253 font-size: 20px;
257 font-weight: bold; 254 font-weight: bold;
258 text-decoration: inherit; 255 text-decoration: inherit;
259 color: inherit; 256 color: inherit;
260 257
261 /* -webkit-border-image: url(../images/old/iPhone/whiteButton.png) 0 12 0 12;*/ 258 /* -webkit-border-image: url(../images/old/iPhone/whiteButton.png) 0 12 0 12;*/
262 -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; 259 -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;
263 text-shadow: rgba(255, 255, 255, 0.7) 0 1px 0; 260 text-shadow: rgba(255, 255, 255, 0.7) 0 1px 0;
264} 261}
265 262
266/* ------------------------------------------- */ 263/* ------------------------------------------- */
267 264
268body.iPhone .loginProgressPanel { 265body.iPhone .loginProgressPanel {
269 min-height: 372px; 266 min-height: 372px;
270 267
271 box-sizing: border-box; 268 box-sizing: border-box;
272 -moz-box-sizing: border-box; 269 -moz-box-sizing: border-box;
273 -webkit-box-sizing: border-box; 270 -webkit-box-sizing: border-box;
274 padding: 10px; 271 padding: 10px;
275 /* background: #c8c8c8 url(../images/old/iPhone/pinstripes.png);*/ 272 /* background: #c8c8c8 url(../images/old/iPhone/pinstripes.png);*/
276 background: #c8c8c8 url(data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAABCAIAAACdaSOZAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABdJREFUeNpiPHrmCgMC/GNjYwNSAAEGADdNA3dnzPlQAAAAAElFTkSuQmCCCg==); 273 background: #c8c8c8 url(data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAABCAIAAACdaSOZAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABdJREFUeNpiPHrmCgMC/GNjYwNSAAEGADdNA3dnzPlQAAAAAElFTkSuQmCCCg==);
277} 274}
278 275
279body.iPhone .loadingBar { 276body.iPhone .loadingBar {
280 margin-left: auto; 277 margin-left: auto;
281 margin-right: auto; 278 margin-right: auto;
282 margin-top: 60px; 279 margin-top: 60px;
283} 280}
284 281
285div.loadingBar { 282div.loadingBar {
286 height: 22px; 283 height: 22px;
287 width: 214px; 284 width: 214px;
288 /* background: url(../images/old/loading/loadingBar.gif) no-repeat center;*/ 285 /* background: url(../images/old/loading/loadingBar.gif) no-repeat center;*/
289 background: url(data:image/gif;charset=utf-8;base64,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) no-repeat center; 286 background: url(data:image/gif;charset=utf-8;base64,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) no-repeat center;
290} 287}
291 288
292div.loadingBar div.loadingBarProgress { 289div.loadingBar div.loadingBarProgress {
293 height: 100%; 290 height: 100%;
294 width: 0%; 291 width: 0%;
295} 292}
296 293
297div.loadingBar div.loadingBarProgress div.loadingBarProgress_left { 294div.loadingBar div.loadingBarProgress div.loadingBarProgress_left {
298 height: 100%; 295 height: 100%;
299 max-width: 8px; 296 max-width: 8px;
300 /* background: url(../images/old/loading/loadingBarProgress.png) no-repeat 0;*/ 297 /* background: url(../images/old/loading/loadingBarProgress.png) no-repeat 0;*/
301 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; 298 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;
302} 299}
303 300
304div.loadingBar div.loadingBarProgress div.loadingBarProgress_right { 301div.loadingBar div.loadingBarProgress div.loadingBarProgress_right {
305 position: relative; 302 position: relative;
306 height: 100%; 303 height: 100%;
307 margin-left: 8px; 304 margin-left: 8px;
308 /* background: url(../images/old/loading/loadingBarProgress.png) no-repeat right;*/ 305 /* background: url(../images/old/loading/loadingBarProgress.png) no-repeat right;*/
309 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; 306 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;
310 top: -22px; 307 top: -22px;
311} 308}
312 309
313/* ------------------------------------------- */ 310/* ------------------------------------------- */
314 311
315body.iPhone .loginErrorPanel { 312body.iPhone .loginErrorPanel {
316 position: absolute; 313 position: absolute;
317 min-height: 372px; 314 min-height: 372px;
318 box-sizing: border-box; 315 box-sizing: border-box;
319 -moz-box-sizing: border-box; 316 -moz-box-sizing: border-box;
320 -webkit-box-sizing: border-box; 317 -webkit-box-sizing: border-box;
321 padding: 10px; 318 padding: 10px;
322 /* background: #c8c8c8 url(../images/old/iPhone/pinstripes.png);*/ 319 /* background: #c8c8c8 url(../images/old/iPhone/pinstripes.png);*/
323 background: #c8c8c8 url(data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAABCAIAAACdaSOZAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABdJREFUeNpiPHrmCgMC/GNjYwNSAAEGADdNA3dnzPlQAAAAAElFTkSuQmCCCg==); 320 background: #c8c8c8 url(data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAABCAIAAACdaSOZAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABdJREFUeNpiPHrmCgMC/GNjYwNSAAEGADdNA3dnzPlQAAAAAElFTkSuQmCCCg==);
324} 321}
325 322
326body.iPhone .loginErrorPanel h2 { 323body.iPhone .loginErrorPanel h2 {
327 text-align: center; 324 text-align: center;
328 color: red; 325 color: red;
329 margin-top: 40px; 326 margin-top: 40px;
330} 327}
331 328
332/* ------------------------------------------- */ 329/* ------------------------------------------- */
333 330
334 331
335 332
336 333
337 334
338 335
339 336
340 337
341form.cardListSearchForm { 338form.cardListSearchForm {
342 box-sizing: border-box; 339 box-sizing: border-box;
343 -moz-box-sizing: border-box; 340 -moz-box-sizing: border-box;
344 -webkit-box-sizing: border-box; 341 -webkit-box-sizing: border-box;
345 border-bottom: 1px solid #2d3642; 342 border-bottom: 1px solid #2d3642;
346 border-top: 1px solid #6d84a2; 343 border-top: 1px solid #6d84a2;
347 padding: 6px; 344 padding: 6px;
348 height: 45px; 345 height: 45px;
349 /* background: url(../images/old/iPhone/toolbar.png) #6d84a2 repeat-x;*/ 346 /* background: url(../images/old/iPhone/toolbar.png) #6d84a2 repeat-x;*/
350 background: url(data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAArCAIAAAA2QHWOAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAE1JREFUCNddjDEOgEAQAgn//5qltYWFnb1GB4vdSy4WBAYStKyb9+O0FJMYyjMyMWCC35lJM71r6vF1P07/lFSfPx6ZxNLcy1HtihzpA/RWcOj0zlDhAAAAAElFTkSuQmCCCg==) #6d84a2 repeat-x; 347 background: url(data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAArCAIAAAA2QHWOAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAE1JREFUCNddjDEOgEAQAgn//5qltYWFnb1GB4vdSy4WBAYStKyb9+O0FJMYyjMyMWCC35lJM71r6vF1P07/lFSfPx6ZxNLcy1HtihzpA/RWcOj0zlDhAAAAAElFTkSuQmCCCg==) #6d84a2 repeat-x;
351 margin: 0px; 348 margin: 0px;
352} 349}
353 350
354form.cardListSearchForm input { 351form.cardListSearchForm input {
355 margin: 7px; 352 margin: 7px;
356 -webkit-appearance: searchfield; 353 -webkit-appearance: searchfield;
357 width: 200px; 354 width: 200px;
358} 355}
359 356
360ul.cardListPanel { 357ul.cardListPanel {
361 margin: 0px; 358 margin: 0px;
362 padding: 0px; 359 padding: 0px;
363 list-style-type: none; 360 list-style-type: none;
364 min-height: 372px; 361 min-height: 372px;
365} 362}
366 363
367li.cardListItem { 364li.cardListItem {
368 height: 43px; 365 height: 43px;
369 border-bottom: 1px solid #cccccc; 366 border-bottom: 1px solid #cccccc;
370 /* background: url(../images/old/iPhone/listArrow.png) no-repeat right center;*/ 367 /* background: url(../images/old/iPhone/listArrow.png) no-repeat right center;*/
371 background: url(data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAUCAYAAAB4d5a9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAKVJREFUeNpi/P//PwOtARMDHcDwsYQFRJSXl8P4dVC6CZvizs5O8i1BsqARid9Ei+BiQ2KDLKumhSU1QNyKxG+hlkXoEQ+yqAPNogpapK5KNIvaKbUIVxKeAsTvkPg5QCxETUukgfgAkqFPgdgBzVKKLIFZoIJmwR1qBRdNLEC2BJQpV9LCAmRL/gBxAtRwqlqAXqzcgRrOQE0LQIBxtNIiBQAEGAA7xCa2yF9zEgAAAABJRU5ErkJgggo=) no-repeat right center; 368 background: url(data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAUCAYAAAB4d5a9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAKVJREFUeNpi/P//PwOtARMDHcDwsYQFRJSXl8P4dVC6CZvizs5O8i1BsqARid9Ei+BiQ2KDLKumhSU1QNyKxG+hlkXoEQ+yqAPNogpapK5KNIvaKbUIVxKeAsTvkPg5QCxETUukgfgAkqFPgdgBzVKKLIFZoIJmwR1qBRdNLEC2BJQpV9LCAmRL/gBxAtRwqlqAXqzcgRrOQE0LQIBxtNIiBQAEGAA7xCa2yF9zEgAAAABJRU5ErkJgggo=) no-repeat right center;
372 369
373} 370}
374 371
375li.cardListItem a { 372li.cardListItem a {
376 position: relative; 373 position: relative;
377 top: -22px; 374 top: -22px;
378 left: 40px; 375 left: 40px;
379 display: block; 376 display: block;
380 white-space: nowrap; 377 white-space: nowrap;
381 overflow: hidden; 378 overflow: hidden;
382} 379}
383 380
384body[orientation="portrait"] li.cardListItem a { 381body[orientation="portrait"] li.cardListItem a {
385 max-width: 250px; 382 max-width: 250px;
386} 383}
387 384
388body[orientation="landscape"] li.cardListItem a { 385body[orientation="landscape"] li.cardListItem a {
389 max-width: 400px; 386 max-width: 400px;
390} 387}
391 388
392li.cardListItem img { 389li.cardListItem img {
393 height: 20px; 390 height: 20px;
394 width: 20px; 391 width: 20px;
395 padding: 12px 10px 0px 10px; 392 padding: 12px 10px 0px 10px;
396} 393}
397 394
398li.cardListItem a { 395li.cardListItem a {
399 text-decoration: none; 396 text-decoration: none;
400 color: black; 397 color: black;
401 font-weight: bold; 398 font-weight: bold;
402 font-size: 14pt; 399 font-size: 14pt;
403 vertical-align: 3px; 400 vertical-align: 3px;
404} 401}
405 402
406 403
407div.cardDetailPanel { 404div.cardDetailPanel {
408 position: absolute; 405 position: absolute;
diff --git a/frontend/gamma/css/clipperz/ie.css b/frontend/gamma/css/clipperz/ie.css
index 5148ada..3c2d59a 100644
--- a/frontend/gamma/css/clipperz/ie.css
+++ b/frontend/gamma/css/clipperz/ie.css
@@ -1,356 +1,353 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29<!--[if IE]> 26<!--[if IE]>
30 27
31<style> 28<style>
32 29
33{ 30{
34 background-color: white; 31 background-color: white;
35} 32}
36 33
37div#logoFrame { 34div#logoFrame {
38 height: 44px; 35 height: 44px;
39} 36}
40 37
41div#logo { 38div#logo {
42 /* padding-left: 15px;*/ 39 /* padding-left: 15px;*/
43 background: url(../images/old/logo_blue.png); 40 background: url(../images/old/logo_blue.png);
44} 41}
45 42
46div.clipperzLoginForm div.loginForm form { 43div.clipperzLoginForm div.loginForm form {
47 padding-left: 20px; 44 padding-left: 20px;
48} 45}
49 46
50div.clipperzLoginForm div.registrationForm form { 47div.clipperzLoginForm div.registrationForm form {
51 padding-left: 20px; 48 padding-left: 20px;
52} 49}
53 50
54div#newRecordInnerPanel { 51div#newRecordInnerPanel {
55 width: 350px; 52 width: 350px;
56 height: 160px; 53 height: 160px;
57 background: url(../images/old/newRecordPanelBackground.png) no-repeat 0 -165px; 54 background: url(../images/old/newRecordPanelBackground.png) no-repeat 0 -165px;
58 /*background: url(data:image/png;charset=utf-8;base64,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) no-repeat 0 -165px; */ 55 /*background: url(data:image/png;charset=utf-8;base64,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) no-repeat 0 -165px; */
59} 56}
60 57
61img#donateHeaderIcon { 58img#donateHeaderIcon {
62 padding-top: 0px; 59 padding-top: 0px;
63 margin-bottom: 0px; 60 margin-bottom: 0px;
64} 61}
65 62
66/* ========================================================== */ 63/* ========================================================== */
67 64
68div#applicationVersionType { 65div#applicationVersionType {
69 position: absolute; 66 position: absolute;
70} 67}
71 68
72div#applicationVersionType.readOnly { 69div#applicationVersionType.readOnly {
73 background: url(../images/old/read-only.png) no-repeat fixed -5px -8px; 70 background: url(../images/old/read-only.png) no-repeat fixed -5px -8px;
74} 71}
75 72
76div#applicationVersionType.TEST { 73div#applicationVersionType.TEST {
77 background: url(../images/old/test-database.png) no-repeat fixed -5px -8px; 74 background: url(../images/old/test-database.png) no-repeat fixed -5px -8px;
78} 75}
79 76
80div#mainTabs { 77div#mainTabs {
81 background: #ff9400 url(../images/old/menubarSprite.gif) repeat-x; 78 background: #ff9400 url(../images/old/menubarSprite.gif) repeat-x;
82} 79}
83 80
84div#menus { 81div#menus {
85 background: url(../images/old/menubarSprite.gif) no-repeat right -26px; 82 background: url(../images/old/menubarSprite.gif) no-repeat right -26px;
86} 83}
87 84
88div#menus table { 85div#menus table {
89 background: url(../images/old/menubarSprite.gif) no-repeat 0 -52px; 86 background: url(../images/old/menubarSprite.gif) no-repeat 0 -52px;
90} 87}
91 88
92div#menus table tbody tr td div { 89div#menus table tbody tr td div {
93 background: url(../images/old/menubarSprite.gif) no-repeat right -52px; 90 background: url(../images/old/menubarSprite.gif) no-repeat right -52px;
94} 91}
95 92
96div#menus table tbody tr td div a { 93div#menus table tbody tr td div a {
97 background: url(../images/old/menubarSprite.gif) no-repeat left -26px; 94 background: url(../images/old/menubarSprite.gif) no-repeat left -26px;
98} 95}
99 96
100div#menus table tbody tr td.selectedTab { 97div#menus table tbody tr td.selectedTab {
101 background: url(../images/old/menubarSprite.gif) repeat-x right -78px; 98 background: url(../images/old/menubarSprite.gif) repeat-x right -78px;
102} 99}
103 100
104div#menus table tbody tr td.selectedTab div { 101div#menus table tbody tr td.selectedTab div {
105 background: url(../images/old/menubarSprite.gif) no-repeat right -130px; 102 background: url(../images/old/menubarSprite.gif) no-repeat right -130px;
106} 103}
107 104
108div#menus table tbody tr td.selectedTab div a { 105div#menus table tbody tr td.selectedTab div a {
109 background: url(../images/old/menubarSprite.gif) no-repeat left -104px; 106 background: url(../images/old/menubarSprite.gif) no-repeat left -104px;
110} 107}
111 108
112div.clipperzLoginForm div.loginFormHeaderBox { 109div.clipperzLoginForm div.loginFormHeaderBox {
113 background: url(../images/old/loginFormBox.png) no-repeat -3px top; 110 background: url(../images/old/loginFormBox.png) no-repeat -3px top;
114} 111}
115 112
116div.clipperzLoginForm div.loginForm { 113div.clipperzLoginForm div.loginForm {
117 background: url(../images/old/loginFormBox.png) repeat-y -408px; 114 background: url(../images/old/loginFormBox.png) repeat-y -408px;
118} 115}
119 116
120div.loginForm div.loginFormFooterBox { 117div.loginForm div.loginFormFooterBox {
121 background: url(../images/old/loginFormBox.png) no-repeat -813px bottom; 118 background: url(../images/old/loginFormBox.png) no-repeat -813px bottom;
122} 119}
123 120
124div.clipperzLoginForm div.registrationForm { 121div.clipperzLoginForm div.registrationForm {
125 background: url(../images/old/loginFormBox.png) repeat-y -408px; 122 background: url(../images/old/loginFormBox.png) repeat-y -408px;
126} 123}
127 124
128div.clipperzLoginForm form.read-only table.formLayout, div.panelform.read-only table.panelBody, div.clipperzSubPanel span.read-only, div.read-only { 125div.clipperzLoginForm form.read-only table.formLayout, div.panelform.read-only table.panelBody, div.clipperzSubPanel span.read-only, div.read-only {
129 background-image: url(../images/old/read-only_background.png); 126 background-image: url(../images/old/read-only_background.png);
130} 127}
131 128
132div.registrationForm div.loginFormFooterBox { 129div.registrationForm div.loginFormFooterBox {
133 background: url(../images/old/loginFormBox.png) no-repeat -813px bottom; 130 background: url(../images/old/loginFormBox.png) no-repeat -813px bottom;
134} 131}
135 132
136div.loginPanelSwitchLanguageBox { 133div.loginPanelSwitchLanguageBox {
137 background: url(../images/old/languageBox.png) no-repeat 19px -15px; 134 background: url(../images/old/languageBox.png) no-repeat 19px -15px;
138} 135}
139 136
140div#directLoginsBlock { 137div#directLoginsBlock {
141 background: url(../images/old/directLoginBox.png) repeat-y -262px bottom; 138 background: url(../images/old/directLoginBox.png) repeat-y -262px bottom;
142} 139}
143 140
144div#directLoginsBlock div.directLoginsBlockHeaderBox { 141div#directLoginsBlock div.directLoginsBlockHeaderBox {
145 background: url(../images/old/directLoginBox.png) no-repeat -11px -13px; 142 background: url(../images/old/directLoginBox.png) no-repeat -11px -13px;
146} 143}
147 144
148ul#directLogins { 145ul#directLogins {
149 background: url(../images/old/directLoginBox.png) no-repeat -513px bottom; 146 background: url(../images/old/directLoginBox.png) no-repeat -513px bottom;
150} 147}
151 148
152div#directLoginsDescription { 149div#directLoginsDescription {
153 background: url(../images/old/directLoginBox.png) no-repeat -513px bottom; 150 background: url(../images/old/directLoginBox.png) no-repeat -513px bottom;
154} 151}
155 152
156/* 153/*
157div#recordListFilterHeader { 154div#recordListFilterHeader {
158 background: url(../images/old/cardFiltersSprite.gif) repeat-x 0 -114px; 155 background: url(../images/old/cardFiltersSprite.gif) repeat-x 0 -114px;
159} 156}
160 157
161div#recordFiltersTableWrapper { 158div#recordFiltersTableWrapper {
162 background: url(../images/old/cardFiltersSprite.gif) no-repeat left -38px; 159 background: url(../images/old/cardFiltersSprite.gif) no-repeat left -38px;
163} 160}
164 161
165div#recordFiltersDIV table { 162div#recordFiltersDIV table {
166 background: url(../images/old/cardFiltersSprite.gif) no-repeat right -19px; 163 background: url(../images/old/cardFiltersSprite.gif) no-repeat right -19px;
167} 164}
168 165
169div#recordFiltersDIV table tbody tr td div { 166div#recordFiltersDIV table tbody tr td div {
170 background: url(../images/old/cardFiltersSprite.gif) no-repeat right -38px; 167 background: url(../images/old/cardFiltersSprite.gif) no-repeat right -38px;
171} 168}
172 169
173div#recordFiltersDIV table tbody tr td div a { 170div#recordFiltersDIV table tbody tr td div a {
174 background: url(../images/old/cardFiltersSprite.gif) no-repeat left -19px; 171 background: url(../images/old/cardFiltersSprite.gif) no-repeat left -19px;
175} 172}
176 173
177div#recordFiltersDIV table tbody tr td.selectedTab { 174div#recordFiltersDIV table tbody tr td.selectedTab {
178 background: url(../images/old/cardFiltersSprite.gif) repeat-x -57px; 175 background: url(../images/old/cardFiltersSprite.gif) repeat-x -57px;
179} 176}
180 177
181div#recordFiltersDIV table tbody tr td.selectedTab div { 178div#recordFiltersDIV table tbody tr td.selectedTab div {
182 background: url(../images/old/cardFiltersSprite.gif) no-repeat right -95px; 179 background: url(../images/old/cardFiltersSprite.gif) no-repeat right -95px;
183} 180}
184 181
185div#recordFiltersDIV table tbody tr td.selectedTab div a { 182div#recordFiltersDIV table tbody tr td.selectedTab div a {
186 background: url(../images/old/cardFiltersSprite.gif) no-repeat left -76px; 183 background: url(../images/old/cardFiltersSprite.gif) no-repeat left -76px;
187} 184}
188*/ 185*/
189 186
190div#recordFiltersSearchInnerPanel { 187div#recordFiltersSearchInnerPanel {
191 background: url(../images/old/recordFilterBackground.png) no-repeat -10px -138px; 188 background: url(../images/old/recordFilterBackground.png) no-repeat -10px -138px;
192} 189}
193 190
194table#recordListAndDetailBlockTABLE { 191table#recordListAndDetailBlockTABLE {
195 background: url(../images/old/cardBlockLowerBorder.gif) repeat-x 0 bottom; 192 background: url(../images/old/cardBlockLowerBorder.gif) repeat-x 0 bottom;
196} 193}
197 194
198div#recordListBlockHeader table.recordListBlockHeaderTABLE { 195div#recordListBlockHeader table.recordListBlockHeaderTABLE {
199 background: url(../images/old/cardsBlockRoundCorners.gif) no-repeat right -51px; 196 background: url(../images/old/cardsBlockRoundCorners.gif) no-repeat right -51px;
200} 197}
201 198
202div#recordListBlockHeader table.recordListBlockHeaderTABLE tbody tr td.recordBlockTitleTD { 199div#recordListBlockHeader table.recordListBlockHeaderTABLE tbody tr td.recordBlockTitleTD {
203 background: url(../images/old/cardsBlockRoundCorners.gif) no-repeat left 0px; 200 background: url(../images/old/cardsBlockRoundCorners.gif) no-repeat left 0px;
204} 201}
205 202
206td#cardBoxLowerLeftTD { 203td#cardBoxLowerLeftTD {
207 background: url(../images/old/cardBlockLowerRoundedCorner.gif) no-repeat left -32px; 204 background: url(../images/old/cardBlockLowerRoundedCorner.gif) no-repeat left -32px;
208} 205}
209 206
210td#cardBoxLowerRightTD { 207td#cardBoxLowerRightTD {
211 background: url(../images/old/cardBlockLowerRoundedCorner.gif) no-repeat right -82px; 208 background: url(../images/old/cardBlockLowerRoundedCorner.gif) no-repeat right -82px;
212} 209}
213 210
214div#newRecordInnerPanel { 211div#newRecordInnerPanel {
215 background: url(../images/old/newRecordPanelBackground.png) no-repeat 0 -165px; 212 background: url(../images/old/newRecordPanelBackground.png) no-repeat 0 -165px;
216} 213}
217 214
218.resizable-textarea .grippie { 215.resizable-textarea .grippie {
219 background: #eee url(../images/old/grippie.png) no-repeat center 1px; 216 background: #eee url(../images/old/grippie.png) no-repeat center 1px;
220} 217}
221 218
222div.Clipperz_recordFieldData div.passwordBackground, div.passwordEntropy { 219div.Clipperz_recordFieldData div.passwordBackground, div.passwordEntropy {
223 background: url(../images/old/entropyBackground.gif) repeat-x 0 0; 220 background: url(../images/old/entropyBackground.gif) repeat-x 0 0;
224} 221}
225 222
226div.Clipperz_recordFieldData input.scrambledField { 223div.Clipperz_recordFieldData input.scrambledField {
227 background: transparent url(../images/old/scrambledValue.png) no-repeat 0 0px; 224 background: transparent url(../images/old/scrambledValue.png) no-repeat 0 0px;
228} 225}
229 226
230div.Clipperz_recordFieldData input.scrambledField:focus { 227div.Clipperz_recordFieldData input.scrambledField:focus {
231 background: transparent url(../images/old/scrambledValue.png) no-repeat 0 -16px; 228 background: transparent url(../images/old/scrambledValue.png) no-repeat 0 -16px;
232} 229}
233 230
234div.directLoginCollapseLink { 231div.directLoginCollapseLink {
235 background: url(../images/old/directLogin/toggle.png) no-repeat; 232 background: url(../images/old/directLogin/toggle.png) no-repeat;
236} 233}
237 234
238#mb-dlg .ext-mb-progress { 235#mb-dlg .ext-mb-progress {
239 background:transparent url(../images/old/default/basic-dialog/progress2.gif) repeat-x 1px 1px; 236 background:transparent url(../images/old/default/basic-dialog/progress2.gif) repeat-x 1px 1px;
240} 237}
241 238
242.ydlg .ydlg-hd { 239.ydlg .ydlg-hd {
243 background: url(../images/old/clipperz/basic-dialog/hd-sprite.gif) repeat-x 0 -82px; 240 background: url(../images/old/clipperz/basic-dialog/hd-sprite.gif) repeat-x 0 -82px;
244} 241}
245.ydlg .ydlg-hd-left { 242.ydlg .ydlg-hd-left {
246 background: url(../images/old/clipperz/basic-dialog/hd-sprite.gif) no-repeat 0 -41px; 243 background: url(../images/old/clipperz/basic-dialog/hd-sprite.gif) no-repeat 0 -41px;
247} 244}
248.ydlg .ydlg-hd-right { 245.ydlg .ydlg-hd-right {
249 background: url(../images/old/clipperz/basic-dialog/hd-sprite.gif) no-repeat right 0; 246 background: url(../images/old/clipperz/basic-dialog/hd-sprite.gif) no-repeat right 0;
250} 247}
251 248
252.ydlg .ydlg-close { 249.ydlg .ydlg-close {
253 background-image:url(../images/old/clipperz/basic-dialog/close.gif); 250 background-image:url(../images/old/clipperz/basic-dialog/close.gif);
254} 251}
255 252
256body .ybtn-left{ 253body .ybtn-left{
257 background:url(../images/old/default/basic-dialog/btn-sprite.gif) no-repeat 0 0; 254 background:url(../images/old/default/basic-dialog/btn-sprite.gif) no-repeat 0 0;
258} 255}
259body .ybtn-right{ 256body .ybtn-right{
260 background:url(../images/old/default/basic-dialog/btn-sprite.gif) no-repeat 0 -21px; 257 background:url(../images/old/default/basic-dialog/btn-sprite.gif) no-repeat 0 -21px;
261} 258}
262body .ybtn-center{ 259body .ybtn-center{
263 background:url(../images/old/default/basic-dialog/btn-sprite.gif) repeat-x 0 -42px; 260 background:url(../images/old/default/basic-dialog/btn-sprite.gif) repeat-x 0 -42px;
264} 261}
265 262
266 263
267 264
268 265
269div.Clipperz_PasswordGenerator_button { 266div.Clipperz_PasswordGenerator_button {
270 background: url(../images/old/passwordAssistant.png) 0 22px; 267 background: url(../images/old/passwordAssistant.png) 0 22px;
271} 268}
272 269
273div.Clipperz_PasswordGenerator_button.hover { 270div.Clipperz_PasswordGenerator_button.hover {
274 background: url(../images/old/passwordAssistant.png) 0 -1px; 271 background: url(../images/old/passwordAssistant.png) 0 -1px;
275} 272}
276 273
277body ul.radioList li h4 { 274body ul.radioList li h4 {
278 cursor: auto; 275 cursor: auto;
279} 276}
280 277
281/* ========================================================== */ 278/* ========================================================== */
282 279
283</style> 280</style>
284 281
285<![endif]--> 282<![endif]-->
286 283
287 284
288 285
289<!--[if lt IE 7]> 286<!--[if lt IE 7]>
290 287
291<style> 288<style>
292 289
293div#newRecordPanel { 290div#newRecordPanel {
294 position: absolute; 291 position: absolute;
295 margin-left: 0px; 292 margin-left: 0px;
296 width: 350px; 293 width: 350px;
297 height: 160px; 294 height: 160px;
298} 295}
299 296
300div#newRecordInnerPanel { 297div#newRecordInnerPanel {
301 width: 350px; 298 width: 350px;
302 height: 160px; 299 height: 160px;
303 background: url(../images/old/newRecordPanelBackground.gif) no-repeat 0 -165px; 300 background: url(../images/old/newRecordPanelBackground.gif) no-repeat 0 -165px;
304 /*background: url(data:image/gif;charset=utf-8;base64,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) no-repeat 0 -165px; */ 301 /*background: url(data:image/gif;charset=utf-8;base64,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) no-repeat 0 -165px; */
305} 302}
306 303
307div.newRecordInnerInnerPanel { 304div.newRecordInnerInnerPanel {
308 background-color: white; 305 background-color: white;
309 padding: 0px; 306 padding: 0px;
310 margin-left: 15px; 307 margin-left: 15px;
311 margin-right: 15px; 308 margin-right: 15px;
312} 309}
313 310
314div#newRecordPanel table td.newRecordPanelLabelTD { 311div#newRecordPanel table td.newRecordPanelLabelTD {
315 padding-left: 0px; 312 padding-left: 0px;
316 padding-top: 3px; 313 padding-top: 3px;
317 font-size: 9pt; 314 font-size: 9pt;
318 width: 100px; 315 width: 100px;
319} 316}
320 317
321div#readOnlyBanner { 318div#readOnlyBanner {
322 background: url(../images/old/read-only.gif) no-repeat fixed -5px -8px; 319 background: url(../images/old/read-only.gif) no-repeat fixed -5px -8px;
323 /*background: url(data:image/gif;charset=utf-8;base64,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) no-repeat fixed -5px -8px; */ 320 /*background: url(data:image/gif;charset=utf-8;base64,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) no-repeat fixed -5px -8px; */
324} 321}
325 322
326 323
327 324
328ul#directLogins { 325ul#directLogins {
329 height: 200px; 326 height: 200px;
330} 327}
331 328
332div#recordListBlock { 329div#recordListBlock {
333 height: 200px; 330 height: 200px;
334} 331}
335 332
336div.clipperzSubPanel { 333div.clipperzSubPanel {
337 height: 200px; 334 height: 200px;
338} 335}
339 336
340 337
341 338
342div.Clipperz_recordFieldData input.scrambledField { 339div.Clipperz_recordFieldData input.scrambledField {
343 background: transparent url(../images/old/scrambledValue.gif) no-repeat 0 0px; 340 background: transparent url(../images/old/scrambledValue.gif) no-repeat 0 0px;
344 /* background: transparent url(data:image/gif;charset=utf-8;base64,R0lGODlhRwAgANUmAP///7XV/2ZmZqW/4ODg4HBwcGttcJChuLi4uHZ8hYWFhfX19bDO9YCLmZmZmaOjo4aSo6C31tbW1q2trXuEj4uarY+Pj+vr66rG68LCwpWpwnp6eszMzHF1epuwzMTd/7rY/9Pm/8ng/7/b/87j/9jp/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAACYALAAAAABHACAAAAb/QIBwSCwaj8ikcslsOp/QqHRKRV4QkmQGkbxmkVtlGGkyLSUCLtIiSKLVR7ZSTjYfLwvAW0gY9gF0eEKCewB/hkKBeXyJbQCCRGVIDgIOE5UPBQV8AhsTCmmgapSWmJqcnqKiqJ+haUJlsbFFCKACt50TeQSZuLcOHEK1vrm7vb7AfMe4yQCyskcEBbcZRw+3CotE0tTW2NpE1wLZRtBI19fk25qU1UXo4+CG7ALu6wXt5bNHHAIWAAgEPCgCSsICTYcA9PsXcCCRggcLJAQAEWEkO5KMcNhwIREcAAssCZGgIOHGjoA+hpwwsiSRlS0TZsxYpabNmzhz6tzJs6fP/wBAgwodSrSo0aNIkypdyrSp06dQo0o1iuFAhKMaDhytetVoVqRfjZZJGkGAVqMUBBwte7ZoWqRvxZqgyiAAW6ADguYNEBdD3QB+7ZrFqxdo378B9h4G+gHo2AAjQAhtIKBBhcoQDBjAK6BDhQRmQZ+lbBmzZs6eRYtG/Tn04A/PYpUQegC0L891B2Qm1sAD0NrEcCfe7as3XuK4jMOObYIE0QEGbmkoCuFWAsR6owuYTrS6gOvUrWN3HEty+OrghUI3QJm70Orox69v/1wzfaHLy4Qo6kEAhQAHCADBUKBFwIBmewHV338BDihUgQcakCBQECIoVBkigFBGY0N50DIBBoa1FQADlgEVQQITeggiXyKSWIGJKArlIowJajhXABtOpeOOPPbo449ABinkkAEEAQA7Cg==) no-repeat 0 0px;*/ 341 /* background: transparent url(data:image/gif;charset=utf-8;base64,R0lGODlhRwAgANUmAP///7XV/2ZmZqW/4ODg4HBwcGttcJChuLi4uHZ8hYWFhfX19bDO9YCLmZmZmaOjo4aSo6C31tbW1q2trXuEj4uarY+Pj+vr66rG68LCwpWpwnp6eszMzHF1epuwzMTd/7rY/9Pm/8ng/7/b/87j/9jp/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAACYALAAAAABHACAAAAb/QIBwSCwaj8ikcslsOp/QqHRKRV4QkmQGkbxmkVtlGGkyLSUCLtIiSKLVR7ZSTjYfLwvAW0gY9gF0eEKCewB/hkKBeXyJbQCCRGVIDgIOE5UPBQV8AhsTCmmgapSWmJqcnqKiqJ+haUJlsbFFCKACt50TeQSZuLcOHEK1vrm7vb7AfMe4yQCyskcEBbcZRw+3CotE0tTW2NpE1wLZRtBI19fk25qU1UXo4+CG7ALu6wXt5bNHHAIWAAgEPCgCSsICTYcA9PsXcCCRggcLJAQAEWEkO5KMcNhwIREcAAssCZGgIOHGjoA+hpwwsiSRlS0TZsxYpabNmzhz6tzJs6fP/wBAgwodSrSo0aNIkypdyrSp06dQo0o1iuFAhKMaDhytetVoVqRfjZZJGkGAVqMUBBwte7ZoWqRvxZqgyiAAW6ADguYNEBdD3QB+7ZrFqxdo378B9h4G+gHo2AAjQAhtIKBBhcoQDBjAK6BDhQRmQZ+lbBmzZs6eRYtG/Tn04A/PYpUQegC0L891B2Qm1sAD0NrEcCfe7as3XuK4jMOObYIE0QEGbmkoCuFWAsR6owuYTrS6gOvUrWN3HEty+OrghUI3QJm70Orox69v/1wzfaHLy4Qo6kEAhQAHCADBUKBFwIBmewHV338BDihUgQcakCBQECIoVBkigFBGY0N50DIBBoa1FQADlgEVQQITeggiXyKSWIGJKArlIowJajhXABtOpeOOPPbo449ABinkkAEEAQA7Cg==) no-repeat 0 0px;*/
345} 342}
346 343
347div.Clipperz_recordFieldData input.scrambledField:focus { 344div.Clipperz_recordFieldData input.scrambledField:focus {
348 background: transparent url(../images/old/scrambledValue.gif) no-repeat 0 -14px; 345 background: transparent url(../images/old/scrambledValue.gif) no-repeat 0 -14px;
349 /* background: transparent url(data:image/gif;charset=utf-8;base64,R0lGODlhRwAgANUmAP///7XV/2ZmZqW/4ODg4HBwcGttcJChuLi4uHZ8hYWFhfX19bDO9YCLmZmZmaOjo4aSo6C31tbW1q2trXuEj4uarY+Pj+vr66rG68LCwpWpwnp6eszMzHF1epuwzMTd/7rY/9Pm/8ng/7/b/87j/9jp/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAACYALAAAAABHACAAAAb/QIBwSCwaj8ikcslsOp/QqHRKRV4QkmQGkbxmkVtlGGkyLSUCLtIiSKLVR7ZSTjYfLwvAW0gY9gF0eEKCewB/hkKBeXyJbQCCRGVIDgIOE5UPBQV8AhsTCmmgapSWmJqcnqKiqJ+haUJlsbFFCKACt50TeQSZuLcOHEK1vrm7vb7AfMe4yQCyskcEBbcZRw+3CotE0tTW2NpE1wLZRtBI19fk25qU1UXo4+CG7ALu6wXt5bNHHAIWAAgEPCgCSsICTYcA9PsXcCCRggcLJAQAEWEkO5KMcNhwIREcAAssCZGgIOHGjoA+hpwwsiSRlS0TZsxYpabNmzhz6tzJs6fP/wBAgwodSrSo0aNIkypdyrSp06dQo0o1iuFAhKMaDhytetVoVqRfjZZJGkGAVqMUBBwte7ZoWqRvxZqgyiAAW6ADguYNEBdD3QB+7ZrFqxdo378B9h4G+gHo2AAjQAhtIKBBhcoQDBjAK6BDhQRmQZ+lbBmzZs6eRYtG/Tn04A/PYpUQegC0L891B2Qm1sAD0NrEcCfe7as3XuK4jMOObYIE0QEGbmkoCuFWAsR6owuYTrS6gOvUrWN3HEty+OrghUI3QJm70Orox69v/1wzfaHLy4Qo6kEAhQAHCADBUKBFwIBmewHV338BDihUgQcakCBQECIoVBkigFBGY0N50DIBBoa1FQADlgEVQQITeggiXyKSWIGJKArlIowJajhXABtOpeOOPPbo449ABinkkAEEAQA7Cg==) no-repeat 0 -14px;*/ 346 /* background: transparent url(data:image/gif;charset=utf-8;base64,R0lGODlhRwAgANUmAP///7XV/2ZmZqW/4ODg4HBwcGttcJChuLi4uHZ8hYWFhfX19bDO9YCLmZmZmaOjo4aSo6C31tbW1q2trXuEj4uarY+Pj+vr66rG68LCwpWpwnp6eszMzHF1epuwzMTd/7rY/9Pm/8ng/7/b/87j/9jp/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAACYALAAAAABHACAAAAb/QIBwSCwaj8ikcslsOp/QqHRKRV4QkmQGkbxmkVtlGGkyLSUCLtIiSKLVR7ZSTjYfLwvAW0gY9gF0eEKCewB/hkKBeXyJbQCCRGVIDgIOE5UPBQV8AhsTCmmgapSWmJqcnqKiqJ+haUJlsbFFCKACt50TeQSZuLcOHEK1vrm7vb7AfMe4yQCyskcEBbcZRw+3CotE0tTW2NpE1wLZRtBI19fk25qU1UXo4+CG7ALu6wXt5bNHHAIWAAgEPCgCSsICTYcA9PsXcCCRggcLJAQAEWEkO5KMcNhwIREcAAssCZGgIOHGjoA+hpwwsiSRlS0TZsxYpabNmzhz6tzJs6fP/wBAgwodSrSo0aNIkypdyrSp06dQo0o1iuFAhKMaDhytetVoVqRfjZZJGkGAVqMUBBwte7ZoWqRvxZqgyiAAW6ADguYNEBdD3QB+7ZrFqxdo378B9h4G+gHo2AAjQAhtIKBBhcoQDBjAK6BDhQRmQZ+lbBmzZs6eRYtG/Tn04A/PYpUQegC0L891B2Qm1sAD0NrEcCfe7as3XuK4jMOObYIE0QEGbmkoCuFWAsR6owuYTrS6gOvUrWN3HEty+OrghUI3QJm70Orox69v/1wzfaHLy4Qo6kEAhQAHCADBUKBFwIBmewHV338BDihUgQcakCBQECIoVBkigFBGY0N50DIBBoa1FQADlgEVQQITeggiXyKSWIGJKArlIowJajhXABtOpeOOPPbo449ABinkkAEEAQA7Cg==) no-repeat 0 -14px;*/
350} 347}
351 348
352 349
353 350
354</style> 351</style>
355 352
356<![endif]--> 353<![endif]-->
diff --git a/frontend/gamma/html/exitPage_template.html b/frontend/gamma/html/exitPage_template.html
index 7056320..b46f9f6 100644
--- a/frontend/gamma/html/exitPage_template.html
+++ b/frontend/gamma/html/exitPage_template.html
@@ -1,140 +1,137 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27--> 24-->
28 25
29<html> 26<html>
30<head> 27<head>
31 <title>clipperz</title> 28 <title>clipperz</title>
32 <link rel="stylesheet" type="text/css" href="./static.css" /> 29 <link rel="stylesheet" type="text/css" href="./static.css" />
33 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> 30 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
34</head> 31</head>
35<body> 32<body>
36 33
37<!-- h1>clipper<span class="logo_z">z</span></h1 --> 34<!-- h1>clipper<span class="logo_z">z</span></h1 -->
38<div class="header"> 35<div class="header">
39 <div id="logo"></div> 36 <div id="logo"></div>
40 <h5 class="clipperzPayoff">keep it to yourself!</h5> 37 <h5 class="clipperzPayoff">keep it to yourself!</h5>
41</div> 38</div>
42 39
43 40
44<div class="contentWrapper"> 41<div class="contentWrapper">
45 <div class="block1"> 42 <div class="block1">
46 <div class="languageBlock en-us"> 43 <div class="languageBlock en-us">
47 <div class="flags"></div> 44 <div class="flags"></div>
48 <div class="content"> 45 <div class="content">
49 <h3>Goodbye! Thanks for using Clipperz.</h3> 46 <h3>Goodbye! Thanks for using Clipperz.</h3>
50 47
51 <p>You just logged out from your Clipperz account. We hope to see you again soon!</p> 48 <p>You just logged out from your Clipperz account. We hope to see you again soon!</p>
52 </div> 49 </div>
53 </div> 50 </div>
54 51
55 52
56 <div class="languageBlock zh-cn"> 53 <div class="languageBlock zh-cn">
57 <div class="flags"></div> 54 <div class="flags"></div>
58 <div class="content"> 55 <div class="content">
59 <h3>下次再见!感谢您使用 Clipperz。</h3> 56 <h3>下次再见!感谢您使用 Clipperz。</h3>
60 57
61 <p>您仅仅是从您的 Clipperz 账户登出,我们希望很快再次见到您!</p> 58 <p>您仅仅是从您的 Clipperz 账户登出,我们希望很快再次见到您!</p>
62 </div> 59 </div>
63 </div> 60 </div>
64 61
65 62
66 <!-- 63 <!--
67 <div class="languageBlock fr-fr"> 64 <div class="languageBlock fr-fr">
68 <div class="flags"></div> 65 <div class="flags"></div>
69 <div class="content"> 66 <div class="content">
70 <h3></h3> 67 <h3></h3>
71 68
72 <p></p> 69 <p></p>
73 </div> 70 </div>
74 </div> 71 </div>
75 --> 72 -->
76 73
77 74
78 <div class="languageBlock it-it"> 75 <div class="languageBlock it-it">
79 <div class="flags"></div> 76 <div class="flags"></div>
80 <div class="content"> 77 <div class="content">
81 <h3>Arrivederci! Grazie per aver scelto Clipperz.</h3> 78 <h3>Arrivederci! Grazie per aver scelto Clipperz.</h3>
82 79
83 <p>Sei uscito da Clipperz. Speriamo di rivederti presto.</p> 80 <p>Sei uscito da Clipperz. Speriamo di rivederti presto.</p>
84 </div> 81 </div>
85 </div> 82 </div>
86 83
87 84
88 <div class="languageBlock ja-jp"> 85 <div class="languageBlock ja-jp">
89 <div class="flags"></div> 86 <div class="flags"></div>
90 <div class="content"> 87 <div class="content">
91 <h3>Clipperz をご利用いただきありがとうございました。</h3> 88 <h3>Clipperz をご利用いただきありがとうございました。</h3>
92 89
93 <p>Clipperz から正常にログアウトしました。またのご利用をお待ちしています。</p> 90 <p>Clipperz から正常にログアウトしました。またのご利用をお待ちしています。</p>
94 </div> 91 </div>
95 </div> 92 </div>
96 </div> 93 </div>
97 94
98 <div class="block2"> 95 <div class="block2">
99 <div class="languageBlock pt-br"> 96 <div class="languageBlock pt-br">
100 <div class="flags"></div> 97 <div class="flags"></div>
101 <div class="content"> 98 <div class="content">
102 <h3>Até logo! Obrigado por utilizar Clipperz.</h3> 99 <h3>Até logo! Obrigado por utilizar Clipperz.</h3>
103 100
104 <p>Você acaba de sair de sua conta Clipperz. Esperamos ve-lo de volta em breve!</p> 101 <p>Você acaba de sair de sua conta Clipperz. Esperamos ve-lo de volta em breve!</p>
105 </div> 102 </div>
106 </div> 103 </div>
107 104
108 105
109 <div class="languageBlock es-es"> 106 <div class="languageBlock es-es">
110 <div class="flags"></div> 107 <div class="flags"></div>
111 <div class="content"> 108 <div class="content">
112 <h3>¡Hasta luego! Gracias por usar Clipperz</h3> 109 <h3>¡Hasta luego! Gracias por usar Clipperz</h3>
113 110
114 <p>Se acaba cerrar su sesión Clipperz. ¡Esperamos verlo nuevamente pronto!</p> 111 <p>Se acaba cerrar su sesión Clipperz. ¡Esperamos verlo nuevamente pronto!</p>
115 </div> 112 </div>
116 </div> 113 </div>
117 114
118 <div class="languageBlock ru-ru"> 115 <div class="languageBlock ru-ru">
119 <div class="flags"></div> 116 <div class="flags"></div>
120 <div class="content"> 117 <div class="content">
121 <h3>До свидания! Спасибо за использование Clipperz.</h3> 118 <h3>До свидания! Спасибо за использование Clipperz.</h3>
122 119
123 <p>Вы только что вышли из своего аккаунта Clipperz. Мы надеемся увидеть Вас снова!</p> 120 <p>Вы только что вышли из своего аккаунта Clipperz. Мы надеемся увидеть Вас снова!</p>
124 </div> 121 </div>
125 </div> 122 </div>
126 123
127 <div class="languageBlock de-de"> 124 <div class="languageBlock de-de">
128 <div class="flags"></div> 125 <div class="flags"></div>
129 <div class="content"> 126 <div class="content">
130 <h3>Auf Wiedersehen! Danke, dass Sie Clipperz verwendet haben.</h3> 127 <h3>Auf Wiedersehen! Danke, dass Sie Clipperz verwendet haben.</h3>
131 128
132 <p>Sie haben sich gerade von Ihrem Clipperz-Account abgemeldet. Wir hoffen, Sie bald wieder zu sehen.</p> 129 <p>Sie haben sich gerade von Ihrem Clipperz-Account abgemeldet. Wir hoffen, Sie bald wieder zu sehen.</p>
133 </div> 130 </div>
134 </div> 131 </div>
135 132
136 </div> 133 </div>
137</div> 134</div>
138 135
139</body> 136</body>
140</html> 137</html>
diff --git a/frontend/gamma/html/mobile_template.html b/frontend/gamma/html/mobile_template.html
index adc36e9..0a1b54c 100644
--- a/frontend/gamma/html/mobile_template.html
+++ b/frontend/gamma/html/mobile_template.html
@@ -1,87 +1,84 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27--> 24-->
28 25
29<html> 26<html>
30<head> 27<head>
31 <title>@page.title@</title> 28 <title>@page.title@</title>
32 <meta http-equiv="content-type" content="text/html; charset=utf-8" /> 29 <meta http-equiv="content-type" content="text/html; charset=utf-8" />
33@copyright@ 30@copyright@
34@css@ 31@css@
35 32
36 <link rel="shortcut icon" href="./clipperz.ico" /> 33 <link rel="shortcut icon" href="./clipperz.ico" />
37 34
38 <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." /> 35 <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." />
39 <meta name="keywords" content="password manager,gestor de contraseñas,gerenciador de senhas,Kennwortmanager,passwords,security,privacy,cryptography" /> 36 <meta name="keywords" content="password manager,gestor de contraseñas,gerenciador de senhas,Kennwortmanager,passwords,security,privacy,cryptography" />
40<script> 37<script>
41 Clipperz_IEisBroken = false; 38 Clipperz_IEisBroken = false;
42 Clipperz_normalizedNewLine = '\n'; 39 Clipperz_normalizedNewLine = '\n';
43 Clipperz_dumpUrl = "/dump/"; 40 Clipperz_dumpUrl = "/dump/";
44</script> 41</script>
45 42
46<!--[if IE]><script> 43<!--[if IE]><script>
47Clipperz_IEisBroken = true; 44Clipperz_IEisBroken = true;
48Clipperz_normalizedNewLine = '\x0d\x0a'; 45Clipperz_normalizedNewLine = '\x0d\x0a';
49</script><![endif]--> 46</script><![endif]-->
50 47
51@CLIPPERZ_DEBUG_VERSION@ 48@CLIPPERZ_DEBUG_VERSION@
52 49
53</head> 50</head>
54<body> 51<body>
55<div id="mainDiv"> 52<div id="mainDiv">
56 <div id="loading"> 53 <div id="loading">
57 <a href="http://www.clipperz.com" target="_blank"><div id="logo"></div></a> 54 <a href="http://www.clipperz.com" target="_blank"><div id="logo"></div></a>
58 <h5 class="clipperzPayoff">keep it to yourself!</h5> 55 <h5 class="clipperzPayoff">keep it to yourself!</h5>
59 <h2>loading ...</h2> 56 <h2>loading ...</h2>
60 </div> 57 </div>
61 58
62@CLIPPERZ_INSTALLED_VERSION@ 59@CLIPPERZ_INSTALLED_VERSION@
63 60
64</div> 61</div>
65<div id="applicationVersionType" class="@application.version.type@"></div> 62<div id="applicationVersionType" class="@application.version.type@"></div>
66 63
67<!-- --> 64<!-- -->
68<div id="javaScriptAlert"> 65<div id="javaScriptAlert">
69 <div class="mask"></div> 66 <div class="mask"></div>
70 <div class="message"> 67 <div class="message">
71 <div class="header"></div> 68 <div class="header"></div>
72 <div class="body"> 69 <div class="body">
73 <div class="alertLogo"></div> 70 <div class="alertLogo"></div>
74 <div class="alert"> 71 <div class="alert">
75 <h1>Attention!</h1> 72 <h1>Attention!</h1>
76 <p>If you can read this message, the chances are that your browser does not properly support JavaScript? or you have disabled this functionality yourself.</p> 73 <p>If you can read this message, the chances are that your browser does not properly support JavaScript? or you have disabled this functionality yourself.</p>
77 <h3>Javascript is required to access Clipperz.</h3> 74 <h3>Javascript is required to access Clipperz.</h3>
78 <h5>Please enable scripting or upgrade your browser.</h5> 75 <h5>Please enable scripting or upgrade your browser.</h5>
79 </div> 76 </div>
80 </div> 77 </div>
81 <div class="footer"></div> 78 <div class="footer"></div>
82 </div> 79 </div>
83</div> 80</div>
84<!-- --> 81<!-- -->
85 82
86</body> 83</body>
87</html> 84</html>
diff --git a/frontend/gamma/js/Bookmarklet.js b/frontend/gamma/js/Bookmarklet.js
index a8e3e69..bcdcc46 100644
--- a/frontend/gamma/js/Bookmarklet.js
+++ b/frontend/gamma/js/Bookmarklet.js
@@ -1,408 +1,405 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29clipperz_copiedContentToClipboard = false; 26clipperz_copiedContentToClipboard = false;
30 27
31//############################################################################# 28//#############################################################################
32 29
33// Simple Set Clipboard System 30// Simple Set Clipboard System
34// Author: Joseph Huckaby 31// Author: Joseph Huckaby
35 32
36var ZeroClipboard = { 33var ZeroClipboard = {
37 34
38 version: "1.0.4", 35 version: "1.0.4",
39 clients: {}, // registered upload clients on page, indexed by id 36 clients: {}, // registered upload clients on page, indexed by id
40 //moviePath: 'ZeroClipboard.swf', // URL to movie 37 //moviePath: 'ZeroClipboard.swf', // URL to movie
41 //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==', 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==',
42 //moviePath: 'http://localhost:8000/tests/js/tests/Bookmarklet/ZeroClipboard.swf', 39 //moviePath: 'http://localhost:8000/tests/js/tests/Bookmarklet/ZeroClipboard.swf',
43 moviePath: 'http://www.clipperz.com/files/clipperz.com/bookmarklet/0.3.0/ZeroClipboard_1.0.4.swf', 40 moviePath: 'http://www.clipperz.com/files/clipperz.com/bookmarklet/0.3.0/ZeroClipboard_1.0.4.swf',
44 //moviePath: './ZeroClipboard.swf', 41 //moviePath: './ZeroClipboard.swf',
45 nextId: 1, // ID of next movie 42 nextId: 1, // ID of next movie
46 43
47 $: function(thingy) { 44 $: function(thingy) {
48 // simple DOM lookup utility function 45 // simple DOM lookup utility function
49 if (typeof(thingy) == 'string') thingy = document.getElementById(thingy); 46 if (typeof(thingy) == 'string') thingy = document.getElementById(thingy);
50 if (!thingy.addClass) { 47 if (!thingy.addClass) {
51 // extend element with a few useful methods 48 // extend element with a few useful methods
52 thingy.hide = function() { this.style.display = 'none'; }; 49 thingy.hide = function() { this.style.display = 'none'; };
53 thingy.show = function() { this.style.display = ''; }; 50 thingy.show = function() { this.style.display = ''; };
54 thingy.addClass = function(name) { this.removeClass(name); this.className += ' ' + name; }; 51 thingy.addClass = function(name) { this.removeClass(name); this.className += ' ' + name; };
55 thingy.removeClass = function(name) { 52 thingy.removeClass = function(name) {
56 this.className = this.className.replace( new RegExp("\\s*" + name + "\\s*"), " ").replace(/^\s+/, '').replace(/\s+$/, ''); 53 this.className = this.className.replace( new RegExp("\\s*" + name + "\\s*"), " ").replace(/^\s+/, '').replace(/\s+$/, '');
57 }; 54 };
58 thingy.hasClass = function(name) { 55 thingy.hasClass = function(name) {
59 return !!this.className.match( new RegExp("\\s*" + name + "\\s*") ); 56 return !!this.className.match( new RegExp("\\s*" + name + "\\s*") );
60 } 57 }
61 } 58 }
62 return thingy; 59 return thingy;
63 }, 60 },
64 61
65 setMoviePath: function(path) { 62 setMoviePath: function(path) {
66 // set path to ZeroClipboard.swf 63 // set path to ZeroClipboard.swf
67 this.moviePath = path; 64 this.moviePath = path;
68 }, 65 },
69 66
70 dispatch: function(id, eventName, args) { 67 dispatch: function(id, eventName, args) {
71 // receive event from flash movie, send to client 68 // receive event from flash movie, send to client
72 var client = this.clients[id]; 69 var client = this.clients[id];
73 if (client) { 70 if (client) {
74 client.receiveEvent(eventName, args); 71 client.receiveEvent(eventName, args);
75 } 72 }
76 }, 73 },
77 74
78 register: function(id, client) { 75 register: function(id, client) {
79 // register new client to receive events 76 // register new client to receive events
80 this.clients[id] = client; 77 this.clients[id] = client;
81 }, 78 },
82 79
83 getDOMObjectPosition: function(obj) { 80 getDOMObjectPosition: function(obj) {
84 // get absolute coordinates for dom element 81 // get absolute coordinates for dom element
85 var info = { 82 var info = {
86 left: 0, 83 left: 0,
87 top: 0, 84 top: 0,
88 width: obj.width ? obj.width : obj.offsetWidth, 85 width: obj.width ? obj.width : obj.offsetWidth,
89 height: obj.height ? obj.height : obj.offsetHeight 86 height: obj.height ? obj.height : obj.offsetHeight
90 }; 87 };
91 88
92 while (obj) { 89 while (obj) {
93 info.left += obj.offsetLeft; 90 info.left += obj.offsetLeft;
94 info.top += obj.offsetTop; 91 info.top += obj.offsetTop;
95 obj = obj.offsetParent; 92 obj = obj.offsetParent;
96 } 93 }
97 94
98 return info; 95 return info;
99 }, 96 },
100 97
101 Client: function(elem) { 98 Client: function(elem) {
102 // constructor for new simple upload client 99 // constructor for new simple upload client
103 this.handlers = {}; 100 this.handlers = {};
104 101
105 // unique ID 102 // unique ID
106 this.id = ZeroClipboard.nextId++; 103 this.id = ZeroClipboard.nextId++;
107 this.movieId = 'ZeroClipboardMovie_' + this.id; 104 this.movieId = 'ZeroClipboardMovie_' + this.id;
108 105
109 // register client with singleton to receive flash events 106 // register client with singleton to receive flash events
110 ZeroClipboard.register(this.id, this); 107 ZeroClipboard.register(this.id, this);
111 108
112 // create movie 109 // create movie
113 if (elem) this.glue(elem); 110 if (elem) this.glue(elem);
114 } 111 }
115}; 112};
116 113
117ZeroClipboard.Client.prototype = { 114ZeroClipboard.Client.prototype = {
118 115
119 id: 0, // unique ID for us 116 id: 0, // unique ID for us
120 ready: false, // whether movie is ready to receive events or not 117 ready: false, // whether movie is ready to receive events or not
121 movie: null, // reference to movie object 118 movie: null, // reference to movie object
122 clipText: '', // text to copy to clipboard 119 clipText: '', // text to copy to clipboard
123 handCursorEnabled: true, // whether to show hand cursor, or default pointer cursor 120 handCursorEnabled: true, // whether to show hand cursor, or default pointer cursor
124 cssEffects: true, // enable CSS mouse effects on dom container 121 cssEffects: true, // enable CSS mouse effects on dom container
125 handlers: null, // user event handlers 122 handlers: null, // user event handlers
126 123
127 glue: function(elem) { 124 glue: function(elem) {
128 // glue to DOM element 125 // glue to DOM element
129 // elem can be ID or actual DOM element object 126 // elem can be ID or actual DOM element object
130//console.log(">>> glue"); 127//console.log(">>> glue");
131 this.domElement = ZeroClipboard.$(elem); 128 this.domElement = ZeroClipboard.$(elem);
132 129
133 // float just above object, or zIndex 99 if dom element isn't set 130 // float just above object, or zIndex 99 if dom element isn't set
134 var zIndex = 99; 131 var zIndex = 99;
135 if (this.domElement.style.zIndex) { 132 if (this.domElement.style.zIndex) {
136 zIndex = parseInt(this.domElement.style.zIndex) + 1; 133 zIndex = parseInt(this.domElement.style.zIndex) + 1;
137 } 134 }
138 135
139 // find X/Y position of domElement 136 // find X/Y position of domElement
140 var box = ZeroClipboard.getDOMObjectPosition(this.domElement); 137 var box = ZeroClipboard.getDOMObjectPosition(this.domElement);
141 138
142 // create floating DIV above element 139 // create floating DIV above element
143 this.div = document.createElement('div'); 140 this.div = document.createElement('div');
144 var style = this.div.style; 141 var style = this.div.style;
145 style.position = 'absolute'; 142 style.position = 'absolute';
146 style.left = '' + box.left + 'px'; 143 style.left = '' + box.left + 'px';
147 style.top = '' + box.top + 'px'; 144 style.top = '' + box.top + 'px';
148 style.width = '' + box.width + 'px'; 145 style.width = '' + box.width + 'px';
149 style.height = '' + box.height + 'px'; 146 style.height = '' + box.height + 'px';
150 style.zIndex = zIndex; 147 style.zIndex = zIndex;
151 148
152 // style.backgroundColor = '#f00'; // debug 149 // style.backgroundColor = '#f00'; // debug
153 150
154 var body = document.getElementsByTagName('body')[0]; 151 var body = document.getElementsByTagName('body')[0];
155 body.appendChild(this.div); 152 body.appendChild(this.div);
156 153
157 this.div.innerHTML = this.getHTML( box.width, box.height ); 154 this.div.innerHTML = this.getHTML( box.width, box.height );
158//console.log("<<< glue"); 155//console.log("<<< glue");
159 }, 156 },
160 157
161 getHTML: function(width, height) { 158 getHTML: function(width, height) {
162 // return HTML for movie 159 // return HTML for movie
163 var html = ''; 160 var html = '';
164 var flashvars = 'id=' + this.id + 161 var flashvars = 'id=' + this.id +
165 '&width=' + width + 162 '&width=' + width +
166 '&height=' + height; 163 '&height=' + height;
167 164
168 if (navigator.userAgent.match(/MSIE/)) { 165 if (navigator.userAgent.match(/MSIE/)) {
169 // IE gets an OBJECT tag 166 // IE gets an OBJECT tag
170 var protocol = location.href.match(/^https/i) ? 'https://' : 'http://'; 167 var protocol = location.href.match(/^https/i) ? 'https://' : 'http://';
171 html += '<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="'+protocol+'download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" width="'+width+'" height="'+height+'" id="'+this.movieId+'" align="middle"><param name="allowScriptAccess" value="always" /><param name="allowFullScreen" value="false" /><param name="movie" value="'+ZeroClipboard.moviePath+'" /><param name="loop" value="false" /><param name="menu" value="false" /><param name="quality" value="best" /><param name="bgcolor" value="#ffffff" /><param name="flashvars" value="'+flashvars+'"/><param name="wmode" value="transparent"/></object>'; 168 html += '<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="'+protocol+'download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" width="'+width+'" height="'+height+'" id="'+this.movieId+'" align="middle"><param name="allowScriptAccess" value="always" /><param name="allowFullScreen" value="false" /><param name="movie" value="'+ZeroClipboard.moviePath+'" /><param name="loop" value="false" /><param name="menu" value="false" /><param name="quality" value="best" /><param name="bgcolor" value="#ffffff" /><param name="flashvars" value="'+flashvars+'"/><param name="wmode" value="transparent"/></object>';
172 } 169 }
173 else { 170 else {
174 // all other browsers get an EMBED tag 171 // all other browsers get an EMBED tag
175 html += '<embed id="'+this.movieId+'" src="'+ZeroClipboard.moviePath+'" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="'+width+'" height="'+height+'" name="'+this.movieId+'" align="middle" allowScriptAccess="always" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="'+flashvars+'" wmode="transparent" />'; 172 html += '<embed id="'+this.movieId+'" src="'+ZeroClipboard.moviePath+'" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="'+width+'" height="'+height+'" name="'+this.movieId+'" align="middle" allowScriptAccess="always" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="'+flashvars+'" wmode="transparent" />';
176 } 173 }
177 return html; 174 return html;
178 }, 175 },
179 176
180 hide: function() { 177 hide: function() {
181 // temporarily hide floater offscreen 178 // temporarily hide floater offscreen
182 if (this.div) { 179 if (this.div) {
183 this.div.style.left = '-2000px'; 180 this.div.style.left = '-2000px';
184 } 181 }
185 }, 182 },
186 183
187 show: function() { 184 show: function() {
188 // show ourselves after a call to hide() 185 // show ourselves after a call to hide()
189 this.reposition(); 186 this.reposition();
190 }, 187 },
191 188
192 destroy: function() { 189 destroy: function() {
193 // destroy control and floater 190 // destroy control and floater
194 if (this.domElement && this.div) { 191 if (this.domElement && this.div) {
195 this.hide(); 192 this.hide();
196 this.div.innerHTML = ''; 193 this.div.innerHTML = '';
197 194
198 var body = document.getElementsByTagName('body')[0]; 195 var body = document.getElementsByTagName('body')[0];
199 try { body.removeChild( this.div ); } catch(e) {;} 196 try { body.removeChild( this.div ); } catch(e) {;}
200 197
201 this.domElement = null; 198 this.domElement = null;
202 this.div = null; 199 this.div = null;
203 } 200 }
204 }, 201 },
205 202
206 reposition: function(elem) { 203 reposition: function(elem) {
207 // reposition our floating div, optionally to new container 204 // reposition our floating div, optionally to new container
208 // warning: container CANNOT change size, only position 205 // warning: container CANNOT change size, only position
209 if (elem) { 206 if (elem) {
210 this.domElement = ZeroClipboard.$(elem); 207 this.domElement = ZeroClipboard.$(elem);
211 if (!this.domElement) this.hide(); 208 if (!this.domElement) this.hide();
212 } 209 }
213 210
214 if (this.domElement && this.div) { 211 if (this.domElement && this.div) {
215 var box = ZeroClipboard.getDOMObjectPosition(this.domElement); 212 var box = ZeroClipboard.getDOMObjectPosition(this.domElement);
216 var style = this.div.style; 213 var style = this.div.style;
217 style.left = '' + box.left + 'px'; 214 style.left = '' + box.left + 'px';
218 style.top = '' + box.top + 'px'; 215 style.top = '' + box.top + 'px';
219 } 216 }
220 }, 217 },
221 218
222 setText: function(newText) { 219 setText: function(newText) {
223 // set text to be copied to clipboard 220 // set text to be copied to clipboard
224 this.clipText = newText; 221 this.clipText = newText;
225 if (this.ready) this.movie.setText(newText); 222 if (this.ready) this.movie.setText(newText);
226 }, 223 },
227 224
228 addEventListener: function(eventName, func) { 225 addEventListener: function(eventName, func) {
229 // add user event listener for event 226 // add user event listener for event
230 // event types: load, queueStart, fileStart, fileComplete, queueComplete, progress, error, cancel 227 // event types: load, queueStart, fileStart, fileComplete, queueComplete, progress, error, cancel
231 eventName = eventName.toString().toLowerCase().replace(/^on/, ''); 228 eventName = eventName.toString().toLowerCase().replace(/^on/, '');
232 if (!this.handlers[eventName]) this.handlers[eventName] = []; 229 if (!this.handlers[eventName]) this.handlers[eventName] = [];
233 this.handlers[eventName].push(func); 230 this.handlers[eventName].push(func);
234 }, 231 },
235 232
236 setHandCursor: function(enabled) { 233 setHandCursor: function(enabled) {
237 // enable hand cursor (true), or default arrow cursor (false) 234 // enable hand cursor (true), or default arrow cursor (false)
238 this.handCursorEnabled = enabled; 235 this.handCursorEnabled = enabled;
239 if (this.ready) this.movie.setHandCursor(enabled); 236 if (this.ready) this.movie.setHandCursor(enabled);
240 }, 237 },
241 238
242 setCSSEffects: function(enabled) { 239 setCSSEffects: function(enabled) {
243 // enable or disable CSS effects on DOM container 240 // enable or disable CSS effects on DOM container
244 this.cssEffects = !!enabled; 241 this.cssEffects = !!enabled;
245 }, 242 },
246 243
247 receiveEvent: function(eventName, args) { 244 receiveEvent: function(eventName, args) {
248 // receive event from flash 245 // receive event from flash
249 eventName = eventName.toString().toLowerCase().replace(/^on/, ''); 246 eventName = eventName.toString().toLowerCase().replace(/^on/, '');
250 247
251 // special behavior for certain events 248 // special behavior for certain events
252 switch (eventName) { 249 switch (eventName) {
253 case 'load': 250 case 'load':
254 // movie claims it is ready, but in IE this isn't always the case... 251 // movie claims it is ready, but in IE this isn't always the case...
255 // bug fix: Cannot extend EMBED DOM elements in Firefox, must use traditional function 252 // bug fix: Cannot extend EMBED DOM elements in Firefox, must use traditional function
256 this.movie = document.getElementById(this.movieId); 253 this.movie = document.getElementById(this.movieId);
257 if (!this.movie) { 254 if (!this.movie) {
258 var self = this; 255 var self = this;
259 setTimeout( function() { self.receiveEvent('load', null); }, 1 ); 256 setTimeout( function() { self.receiveEvent('load', null); }, 1 );
260 return; 257 return;
261 } 258 }
262 259
263 // firefox on pc needs a "kick" in order to set these in certain cases 260 // firefox on pc needs a "kick" in order to set these in certain cases
264 if (!this.ready && navigator.userAgent.match(/Firefox/) && navigator.userAgent.match(/Windows/)) { 261 if (!this.ready && navigator.userAgent.match(/Firefox/) && navigator.userAgent.match(/Windows/)) {
265 var self = this; 262 var self = this;
266 setTimeout( function() { self.receiveEvent('load', null); }, 100 ); 263 setTimeout( function() { self.receiveEvent('load', null); }, 100 );
267 this.ready = true; 264 this.ready = true;
268 return; 265 return;
269 } 266 }
270 267
271 this.ready = true; 268 this.ready = true;
272 this.movie.setText( this.clipText ); 269 this.movie.setText( this.clipText );
273 this.movie.setHandCursor( this.handCursorEnabled ); 270 this.movie.setHandCursor( this.handCursorEnabled );
274 break; 271 break;
275 272
276 case 'mouseover': 273 case 'mouseover':
277 if (this.domElement && this.cssEffects) { 274 if (this.domElement && this.cssEffects) {
278 this.domElement.addClass('hover'); 275 this.domElement.addClass('hover');
279 if (this.recoverActive) this.domElement.addClass('active'); 276 if (this.recoverActive) this.domElement.addClass('active');
280 } 277 }
281 break; 278 break;
282 279
283 case 'mouseout': 280 case 'mouseout':
284 if (this.domElement && this.cssEffects) { 281 if (this.domElement && this.cssEffects) {
285 this.recoverActive = false; 282 this.recoverActive = false;
286 if (this.domElement.hasClass('active')) { 283 if (this.domElement.hasClass('active')) {
287 this.domElement.removeClass('active'); 284 this.domElement.removeClass('active');
288 this.recoverActive = true; 285 this.recoverActive = true;
289 } 286 }
290 this.domElement.removeClass('hover'); 287 this.domElement.removeClass('hover');
291 } 288 }
292 break; 289 break;
293 290
294 case 'mousedown': 291 case 'mousedown':
295 if (this.domElement && this.cssEffects) { 292 if (this.domElement && this.cssEffects) {
296 this.domElement.addClass('active'); 293 this.domElement.addClass('active');
297 } 294 }
298 break; 295 break;
299 296
300 case 'mouseup': 297 case 'mouseup':
301 if (this.domElement && this.cssEffects) { 298 if (this.domElement && this.cssEffects) {
302 this.domElement.removeClass('active'); 299 this.domElement.removeClass('active');
303 this.recoverActive = false; 300 this.recoverActive = false;
304 } 301 }
305 break; 302 break;
306 } // switch eventName 303 } // switch eventName
307 304
308 if (this.handlers[eventName]) { 305 if (this.handlers[eventName]) {
309 for (var idx = 0, len = this.handlers[eventName].length; idx < len; idx++) { 306 for (var idx = 0, len = this.handlers[eventName].length; idx < len; idx++) {
310 var func = this.handlers[eventName][idx]; 307 var func = this.handlers[eventName][idx];
311 308
312 if (typeof(func) == 'function') { 309 if (typeof(func) == 'function') {
313 // actual function reference 310 // actual function reference
314 func(this, args); 311 func(this, args);
315 } 312 }
316 else if ((typeof(func) == 'object') && (func.length == 2)) { 313 else if ((typeof(func) == 'object') && (func.length == 2)) {
317 // PHP style object + method, i.e. [myObject, 'myMethod'] 314 // PHP style object + method, i.e. [myObject, 'myMethod']
318 func[0][ func[1] ](this, args); 315 func[0][ func[1] ](this, args);
319 } 316 }
320 else if (typeof(func) == 'string') { 317 else if (typeof(func) == 'string') {
321 // name of function 318 // name of function
322 window[func](this, args); 319 window[func](this, args);
323 } 320 }
324 } // foreach event handler defined 321 } // foreach event handler defined
325 } // user defined handler for event 322 } // user defined handler for event
326 } 323 }
327 324
328}; 325};
329 326
330//############################################################################# 327//#############################################################################
331 328
332var clip = null; 329var clip = null;
333 330
334function $(id) { return document.getElementById(id); } 331function $(id) { return document.getElementById(id); }
335 332
336function initClip() { 333function initClip() {
337//console.log(">>> initClip"); 334//console.log(">>> initClip");
338 clip = new ZeroClipboard.Client(); 335 clip = new ZeroClipboard.Client();
339 clip.setHandCursor( true ); 336 clip.setHandCursor( true );
340 337
341 //clip.addEventListener('load', my_load); 338 //clip.addEventListener('load', my_load);
342 //clip.addEventListener('mouseOver', my_mouse_over); 339 //clip.addEventListener('mouseOver', my_mouse_over);
343 clip.addEventListener('complete', my_complete); 340 clip.addEventListener('complete', my_complete);
344 341
345 //clip.glue( 'd_clip_button' ); 342 //clip.glue( 'd_clip_button' );
346//console.log("<<< initClip"); 343//console.log("<<< initClip");
347} 344}
348 345
349//function my_load(client) { 346//function my_load(client) {
350 //console.log("Flash movie loaded and ready."); 347 //console.log("Flash movie loaded and ready.");
351//} 348//}
352 349
353//function my_mouse_over(client) { 350//function my_mouse_over(client) {
354 //// we can cheat a little here -- update the text on mouse over 351 //// we can cheat a little here -- update the text on mouse over
355 //clip.setText( $('fe_text').value ); 352 //clip.setText( $('fe_text').value );
356//} 353//}
357 354
358function my_complete(client, text) { 355function my_complete(client, text) {
359 //console.log("Copied text to clipboard: ... "); 356 //console.log("Copied text to clipboard: ... ");
360 //console.log("Copied text to clipboard: " + text ); 357 //console.log("Copied text to clipboard: " + text );
361 clipperz_copiedContentToClipboard = true; 358 clipperz_copiedContentToClipboard = true;
362 showTooltip(); 359 showTooltip();
363} 360}
364 361
365//function debugstr(msg) { 362//function debugstr(msg) {
366 //var p = document.createElement('p'); 363 //var p = document.createElement('p');
367 //p.innerHTML = msg; 364 //p.innerHTML = msg;
368 //$('d_debug').appendChild(p); 365 //$('d_debug').appendChild(p);
369//} 366//}
370 367
371//############################################################################# 368//#############################################################################
372 369
373_cble = null; 370_cble = null;
374 371
375//----------------------------------------------------------------------------- 372//-----------------------------------------------------------------------------
376 373
377isLoginForm = function(aForm) { 374isLoginForm = function(aForm) {
378 var inputFields; 375 var inputFields;
379 var passwordFieldsFound; 376 var passwordFieldsFound;
380 var i,c; 377 var i,c;
381 378
382//console.log("is login form: " + aForm.name + " (" + aForm.id + ")"); 379//console.log("is login form: " + aForm.name + " (" + aForm.id + ")");
383 passwordFieldsFound = 0; 380 passwordFieldsFound = 0;
384 inputFields = aForm.elements; 381 inputFields = aForm.elements;
385 c = inputFields.length; 382 c = inputFields.length;
386 for (i=0; i<c; i++) { 383 for (i=0; i<c; i++) {
387 if (inputFields[i].type == "password") { 384 if (inputFields[i].type == "password") {
388 passwordFieldsFound ++; 385 passwordFieldsFound ++;
389 } 386 }
390 } 387 }
391//console.log("number of password fields found: " + passwordFieldsFound); 388//console.log("number of password fields found: " + passwordFieldsFound);
392 return (passwordFieldsFound == 1); 389 return (passwordFieldsFound == 1);
393}; 390};
394 391
395//----------------------------------------------------------------------------- 392//-----------------------------------------------------------------------------
396 393
397findLoginForm = function(aDocument, aLevel) { 394findLoginForm = function(aDocument, aLevel) {
398 varresult; 395 varresult;
399 vardocumentForms; 396 vardocumentForms;
400 var i,c; 397 var i,c;
401 398
402 result = null; 399 result = null;
403 400
404 try { 401 try {
405 documentForms = aDocument.getElementsByTagName('form'); 402 documentForms = aDocument.getElementsByTagName('form');
406 403
407 c = documentForms.length; 404 c = documentForms.length;
408 for (i=0; (i<c) && (result == null); i++) { 405 for (i=0; (i<c) && (result == null); i++) {
diff --git a/frontend/gamma/js/BookmarkletHash.js b/frontend/gamma/js/BookmarkletHash.js
index 2e0714c..c3039f5 100644
--- a/frontend/gamma/js/BookmarkletHash.js
+++ b/frontend/gamma/js/BookmarkletHash.js
@@ -1,47 +1,44 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29 //18f820faffcdb5e847d4c5d5c4a1de6743baa1a0 26 //18f820faffcdb5e847d4c5d5c4a1de6743baa1a0
30 //9b30434c73fb009b15fecaa904b44f9ced807577 27 //9b30434c73fb009b15fecaa904b44f9ced807577
31 //9b30434c73fb009b15fecaa904b44f9ced807577 28 //9b30434c73fb009b15fecaa904b44f9ced807577
32 varxh; 29 varxh;
33 vardocumentText; 30 vardocumentText;
34 31
35try { 32try {
36 xh=new XMLHttpRequest(); 33 xh=new XMLHttpRequest();
37} catch(e) { 34} catch(e) {
38 xh=new ActiveXObject("Msxml2.XMLHTTP"); 35 xh=new ActiveXObject("Msxml2.XMLHTTP");
39} 36}
40 37
41xh.open("GET", window.location, false); 38xh.open("GET", window.location, false);
42xh.send(null); 39xh.send(null);
43 40
44documentText = "#####" + xh.responseText + "####"; 41documentText = "#####" + xh.responseText + "####";
45//documentText = document.body.innerHTML; 42//documentText = document.body.innerHTML;
46 43
47//console.log(documentText); \ No newline at end of file 44//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 d117479..c7c7ae6 100644
--- a/frontend/gamma/js/Bookmarklet_1.js
+++ b/frontend/gamma/js/Bookmarklet_1.js
@@ -1,400 +1,397 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29_cble = null; 26_cble = null;
30 27
31//----------------------------------------------------------------------------- 28//-----------------------------------------------------------------------------
32 29
33isLoginForm = function(aForm) { 30isLoginForm = function(aForm) {
34 var inputFields; 31 var inputFields;
35 var passwordFieldsFound; 32 var passwordFieldsFound;
36 var i,c; 33 var i,c;
37 34
38//console.log("is login form: " + aForm.name + " (" + aForm.id + ")"); 35//console.log("is login form: " + aForm.name + " (" + aForm.id + ")");
39 passwordFieldsFound = 0; 36 passwordFieldsFound = 0;
40 inputFields = aForm.elements; 37 inputFields = aForm.elements;
41 c = inputFields.length; 38 c = inputFields.length;
42 for (i=0; i<c; i++) { 39 for (i=0; i<c; i++) {
43 if (inputFields[i].type == "password") { 40 if (inputFields[i].type == "password") {
44 passwordFieldsFound ++; 41 passwordFieldsFound ++;
45 } 42 }
46 } 43 }
47//console.log("number of password fields found: " + passwordFieldsFound); 44//console.log("number of password fields found: " + passwordFieldsFound);
48 return (passwordFieldsFound == 1); 45 return (passwordFieldsFound == 1);
49}; 46};
50 47
51//----------------------------------------------------------------------------- 48//-----------------------------------------------------------------------------
52 49
53findLoginForm = function(aDocument, aLevel) { 50findLoginForm = function(aDocument, aLevel) {
54 varresult; 51 varresult;
55 vardocumentForms; 52 vardocumentForms;
56 var i,c; 53 var i,c;
57 54
58 result = null; 55 result = null;
59 56
60 try { 57 try {
61 documentForms = aDocument.getElementsByTagName('form'); 58 documentForms = aDocument.getElementsByTagName('form');
62 59
63 c = documentForms.length; 60 c = documentForms.length;
64 for (i=0; (i<c) && (result == null); i++) { 61 for (i=0; (i<c) && (result == null); i++) {
65 if (isLoginForm(documentForms[i])) { 62 if (isLoginForm(documentForms[i])) {
66 result = documentForms[i]; 63 result = documentForms[i];
67 } 64 }
68 } 65 }
69 66
70 if ((result == null) && (aLevel == 0)) { 67 if ((result == null) && (aLevel == 0)) {
71 var iFrames; 68 var iFrames;
72 69
73 iFrames = aDocument.getElementsByTagName('iframe'); 70 iFrames = aDocument.getElementsByTagName('iframe');
74 c = iFrames.length; 71 c = iFrames.length;
75 for (i=0; (i<c) && (result == null); i++) { 72 for (i=0; (i<c) && (result == null); i++) {
76 result = findLoginForm(iFrames[i].contentDocument, (aLevel + 1)); 73 result = findLoginForm(iFrames[i].contentDocument, (aLevel + 1));
77 } 74 }
78 } 75 }
79 } catch (e) { 76 } catch (e) {
80 _cble = e; 77 _cble = e;
81 } 78 }
82 79
83 return result; 80 return result;
84}; 81};
85 82
86//----------------------------------------------------------------------------- 83//-----------------------------------------------------------------------------
87 84
88inputElementValues = function(anInputElement) { 85inputElementValues = function(anInputElement) {
89 varresult; 86 varresult;
90 87
91 //if ((anInputElement instanceof HTMLInputElement) && (anInputElement.getAttribute('name') != null)) { 88 //if ((anInputElement instanceof HTMLInputElement) && (anInputElement.getAttribute('name') != null)) {
92 if ((anInputElement.tagName.toLowerCase() == "input") && (anInputElement.getAttribute('name') != null)) { 89 if ((anInputElement.tagName.toLowerCase() == "input") && (anInputElement.getAttribute('name') != null)) {
93 result = {}; 90 result = {};
94 result.type = anInputElement.getAttribute('type') || "text"; 91 result.type = anInputElement.getAttribute('type') || "text";
95 result.name = anInputElement.getAttribute('name'); 92 result.name = anInputElement.getAttribute('name');
96 // result.value = anInputElement.getAttribute('value'); 93 // result.value = anInputElement.getAttribute('value');
97 result.value = anInputElement.value; 94 result.value = anInputElement.value;
98 if (anInputElement.type.toLowerCase() == 'radio') { 95 if (anInputElement.type.toLowerCase() == 'radio') {
99 result.checked = anInputElement.checked; 96 result.checked = anInputElement.checked;
100 } 97 }
101 //} else if ((anInputElement instanceof HTMLSelectElement) && (anInputElement.getAttribute('name') != null)) { 98 //} else if ((anInputElement instanceof HTMLSelectElement) && (anInputElement.getAttribute('name') != null)) {
102 } else if ((anInputElement.tagName.toLowerCase() == 'select') && (anInputElement.getAttribute('name') != null)) { 99 } else if ((anInputElement.tagName.toLowerCase() == 'select') && (anInputElement.getAttribute('name') != null)) {
103 varoptions; 100 varoptions;
104 var c,i; 101 var c,i;
105 102
106//console.log("input element values: %o", anInputElement); 103//console.log("input element values: %o", anInputElement);
107 result = {}; 104 result = {};
108 result.type = "select"; 105 result.type = "select";
109 result.name = anInputElement.getAttribute('name'); 106 result.name = anInputElement.getAttribute('name');
110 107
111 result.options = []; 108 result.options = [];
112 options = anInputElement.options; 109 options = anInputElement.options;
113 c = options.length; 110 c = options.length;
114 for (i=0; i<c; i++) { 111 for (i=0; i<c; i++) {
115 varoption; 112 varoption;
116 113
117 option = {}; 114 option = {};
118 option.selected = options[i].selected; 115 option.selected = options[i].selected;
119 option.label = options[i].label || options[i].innerHTML; 116 option.label = options[i].label || options[i].innerHTML;
120 option.value = options[i].value; 117 option.value = options[i].value;
121 result.options.push(option); 118 result.options.push(option);
122 } 119 }
123 } else { 120 } else {
124 result = null; 121 result = null;
125 } 122 }
126 123
127 return result; 124 return result;
128}; 125};
129 126
130//----------------------------------------------------------------------------- 127//-----------------------------------------------------------------------------
131 128
132formParameters = function(aLoginForm) { 129formParameters = function(aLoginForm) {
133 varresult; 130 varresult;
134 vari, c; 131 vari, c;
135 varaction; 132 varaction;
136 133
137 if (aLoginForm == null) { 134 if (aLoginForm == null) {
138 result = null; 135 result = null;
139 } else { 136 } else {
140 varradioValues; 137 varradioValues;
141 varradioValueName; 138 varradioValueName;
142 139
143 result = {}; 140 result = {};
144 radioValues = {}; 141 radioValues = {};
145 142
146 action = aLoginForm.action; 143 action = aLoginForm.action;
147 if (action.constructor != String) { 144 if (action.constructor != String) {
148 action = aLoginForm.getAttribute('action'); 145 action = aLoginForm.getAttribute('action');
149 } 146 }
150 147
151 if (/^https?\:\/\/.*/.test(action)) { 148 if (/^https?\:\/\/.*/.test(action)) {
152 action = action; 149 action = action;
153 } else if (/^\/.*/.test(action)) { 150 } else if (/^\/.*/.test(action)) {
154 action = window.location.protocol + '/' + '/' + window.location.hostname + action; 151 action = window.location.protocol + '/' + '/' + window.location.hostname + action;
155 } else { 152 } else {
156 action = window.location.href.replace(/\/[^\/]*$/, '/' + action); 153 action = window.location.href.replace(/\/[^\/]*$/, '/' + action);
157 } 154 }
158 155
159 result.attributes = {}; 156 result.attributes = {};
160 result.attributes.action = action; 157 result.attributes.action = action;
161 result.attributes.method = aLoginForm.getAttribute('method'); 158 result.attributes.method = aLoginForm.getAttribute('method');
162 159
163 result.inputs = []; 160 result.inputs = [];
164 c = aLoginForm.elements.length; 161 c = aLoginForm.elements.length;
165 for (i=0; i<c; i++) { 162 for (i=0; i<c; i++) {
166 varinputElement; 163 varinputElement;
167 varelementValues; 164 varelementValues;
168 165
169 inputElement = aLoginForm.elements[i]; 166 inputElement = aLoginForm.elements[i];
170 elementValues = inputElementValues(inputElement); 167 elementValues = inputElementValues(inputElement);
171 if (elementValues != null) { 168 if (elementValues != null) {
172 if (elementValues.type != "radio") { 169 if (elementValues.type != "radio") {
173 result.inputs.push(elementValues); 170 result.inputs.push(elementValues);
174 } else { 171 } else {
175 varradioValue; 172 varradioValue;
176 varvalues; 173 varvalues;
177 174
178 radioValue = radioValues[elementValues.name]; 175 radioValue = radioValues[elementValues.name];
179 if (radioValue == null) { 176 if (radioValue == null) {
180 radioValue = {}; 177 radioValue = {};
181 radioValue.name = elementValues.name; 178 radioValue.name = elementValues.name;
182 radioValue.type = "radio"; 179 radioValue.type = "radio";
183 radioValue.options = []; 180 radioValue.options = [];
184 181
185 radioValues[elementValues.name] = radioValue; 182 radioValues[elementValues.name] = radioValue;
186 } 183 }
187 184
188 values = {}; 185 values = {};
189 values.value = elementValues.value; 186 values.value = elementValues.value;
190 values.checked = elementValues.checked; 187 values.checked = elementValues.checked;
191 188
192 radioValue.options.push(values); 189 radioValue.options.push(values);
193 } 190 }
194 } 191 }
195 } 192 }
196 193
197 for (radioValueName in radioValues) { 194 for (radioValueName in radioValues) {
198 if (typeof(radioValues[radioValueName]) != "function") { 195 if (typeof(radioValues[radioValueName]) != "function") {
199 result.inputs.push(radioValues[radioValueName]); 196 result.inputs.push(radioValues[radioValueName]);
200 } 197 }
201 } 198 }
202 } 199 }
203 200
204 return result; 201 return result;
205}; 202};
206 203
207//----------------------------------------------------------------------------- 204//-----------------------------------------------------------------------------
208 205
209pageParameters = function() { 206pageParameters = function() {
210 var result; 207 var result;
211 208
212 result = {}; 209 result = {};
213 result['title'] = document.title; 210 result['title'] = document.title;
214//<link rel="icon" href="http://example.com/favicon.ico" type="image/x-icon"> 211//<link rel="icon" href="http://example.com/favicon.ico" type="image/x-icon">
215 212
216 return result; 213 return result;
217}; 214};
218 215
219//----------------------------------------------------------------------------- 216//-----------------------------------------------------------------------------
220 217
221reprString = function (o) { 218reprString = function (o) {
222 return ('"' + o.replace(/(["\\])/g, '\\$1') + '"' 219 return ('"' + o.replace(/(["\\])/g, '\\$1') + '"'
223 ).replace(/[\f]/g, "\\f" 220 ).replace(/[\f]/g, "\\f"
224 ).replace(/[\b]/g, "\\b" 221 ).replace(/[\b]/g, "\\b"
225 ).replace(/[\n]/g, "\\n" 222 ).replace(/[\n]/g, "\\n"
226 ).replace(/[\t]/g, "\\t" 223 ).replace(/[\t]/g, "\\t"
227 ).replace(/[\r]/g, "\\r"); 224 ).replace(/[\r]/g, "\\r");
228}; 225};
229 226
230//----------------------------------------------------------------------------- 227//-----------------------------------------------------------------------------
231 228
232serializeJSON = function (o) { 229serializeJSON = function (o) {
233 var objtype = typeof(o); 230 var objtype = typeof(o);
234 if (objtype == "number" || objtype == "boolean") { 231 if (objtype == "number" || objtype == "boolean") {
235 return o + ""; 232 return o + "";
236 } else if (o === null) { 233 } else if (o === null) {
237 return "null"; 234 return "null";
238 } 235 }
239 236
240 //var m = MochiKit.Base; 237 //var m = MochiKit.Base;
241 //var reprString = m.reprString; 238 //var reprString = m.reprString;
242 if (objtype == "string") { 239 if (objtype == "string") {
243 return reprString(o); 240 return reprString(o);
244 } 241 }
245 242
246 //recurse 243 //recurse
247 var me = arguments.callee; 244 var me = arguments.callee;
248 //array 245 //array
249 if (objtype != "function" && typeof(o.length) == "number") { 246 if (objtype != "function" && typeof(o.length) == "number") {
250 var res = []; 247 var res = [];
251 for (var i = 0; i < o.length; i++) { 248 for (var i = 0; i < o.length; i++) {
252 var val = me(o[i]); 249 var val = me(o[i]);
253 if (typeof(val) != "string") { 250 if (typeof(val) != "string") {
254 val = "undefined"; 251 val = "undefined";
255 } 252 }
256 res.push(val); 253 res.push(val);
257 } 254 }
258 return "[" + res.join(",\n") + "]"; 255 return "[" + res.join(",\n") + "]";
259 } 256 }
260 257
261 //undefined is outside of the spec 258 //undefined is outside of the spec
262 if (objtype == "undefined") { 259 if (objtype == "undefined") {
263 // throw new TypeError("undefined can not be serialized as JSON"); 260 // throw new TypeError("undefined can not be serialized as JSON");
264 throw new TypeError("error"); 261 throw new TypeError("error");
265 } 262 }
266 263
267 //generic object code path 264 //generic object code path
268 res = []; 265 res = [];
269 for (var k in o) { 266 for (var k in o) {
270 if (typeof(o[k]) != "function") { 267 if (typeof(o[k]) != "function") {
271 var useKey; 268 var useKey;
272 if (typeof(k) == "number") { 269 if (typeof(k) == "number") {
273 useKey = '"' + k + '"'; 270 useKey = '"' + k + '"';
274 } else if (typeof(k) == "string") { 271 } else if (typeof(k) == "string") {
275 useKey = reprString(k); 272 useKey = reprString(k);
276 } else { 273 } else {
277 //skip non-string or number keys 274 //skip non-string or number keys
278 continue; 275 continue;
279 } 276 }
280 277
281 val = me(o[k]); 278 val = me(o[k]);
282 if (typeof(val) != "string") { 279 if (typeof(val) != "string") {
283 //skip non-serializable values 280 //skip non-serializable values
284 continue; 281 continue;
285 } 282 }
286 res.push(useKey + ":" + " " + val); 283 res.push(useKey + ":" + " " + val);
287 } 284 }
288 } 285 }
289 286
290 return "{" + res.join(",\n") + "}"; 287 return "{" + res.join(",\n") + "}";
291}; 288};
292 289
293//----------------------------------------------------------------------------- 290//-----------------------------------------------------------------------------
294 291
295closeBookmarklet = function() { 292closeBookmarklet = function() {
296 varbookmarkletDiv; 293 varbookmarkletDiv;
297 294
298 bookmarkletDiv = document.getElementById("clipperz_bookmarklet"); 295 bookmarkletDiv = document.getElementById("clipperz_bookmarklet");
299 bookmarkletDiv.parentNode.removeChild(bookmarkletDiv); 296 bookmarkletDiv.parentNode.removeChild(bookmarkletDiv);
300}; 297};
301 298
302//----------------------------------------------------------------------------- 299//-----------------------------------------------------------------------------
303 300
304logFormParameters = function(someParameters, anException) { 301logFormParameters = function(someParameters, anException) {
305 varnewDiv; 302 varnewDiv;
306 var base_url; 303 var base_url;
307 varhelp_url; 304 varhelp_url;
308 // varbase_image_url; 305 // varbase_image_url;
309 varlogo_image_url; 306 varlogo_image_url;
310 varbackground_image_url; 307 varbackground_image_url;
311 varclose_image_url; 308 varclose_image_url;
312 varbookmarklet_textarea; 309 varbookmarklet_textarea;
313 var innerHTML; 310 var innerHTML;
314 311
315// 312//
316 //Obsolete: image -> base64 encoding done here: http://www.motobit.com/util/base64-decoder-encoder.asp 313 //Obsolete: image -> base64 encoding done here: http://www.motobit.com/util/base64-decoder-encoder.asp
317 //conversion done using the Filemark Maker application: http://www.insanelygreattees.com/news/?p=51 314 //conversion done using the Filemark Maker application: http://www.insanelygreattees.com/news/?p=51
318// 315//
319 316
320 base_url = "http://www.clipperz.com/"; 317 base_url = "http://www.clipperz.com/";
321 help_url = base_url + "help/bookmarklet"; 318 help_url = base_url + "help/bookmarklet";
322 //base_image_url = base_url + "files/clipperz.com/bookmarklet/"; 319 //base_image_url = base_url + "files/clipperz.com/bookmarklet/";
323 //logo_image_url = base_image_url + "logo.png"; 320 //logo_image_url = base_image_url + "logo.png";
324 logo_image_url = "data:image/png;charset=utf-8;base64,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"; 321 logo_image_url = "data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAAAXCAYAAABOMABkAAAACXBIWXMAAAsTAAALEwEAmpwYAAANJ2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjardd5NJRv2AfwaxbGMmbGGHsY2Xcle/YtkWzZUpKdYSYmScqSlDVLKNoo2oQWEonqR5YkyZKtyJKlFLJkmfcPqd7feZfznvNefzzneu7nj/t+7nM+3/vcAHgNdxqNggSAwCB6sK2ZIdnJ2YWM6QQM4IAXsCDi7hFCM7C2toT/uhAA852AAABoV3Cn0SjwfytcsJOzCwBCHgBIPuu9PgCQDq739gBAOkKn0QEQvgBA8vB19wRARACAfLC9rREA4iYA4HzW+woAwB1c7xsAABfq4UMHQHQDMBODPP2CADBTAMy6nl4hHgA4eQDw9AzxCATApQKAVWAg1RMA9xEApD1owXQAPAsAKDg5u5DXl7w3AWAbPwCLxZ+xI5kAZXkA0rv+jIk9AuBxB8hP/jM2awsIAEDwtIZ4q2xd30GsIQDTAIMxKwmASQdYTWMwlvMZjNVrAKg+gFqKx+Hg0I39RrQA/G/v6//8q1AIACQAQhxRiAxHRaAjmE4wR2FiWE6yGrPWsZ1mP4ON50jClRN8OdOIaVzppHPcmTyZvNl8dQJUwdxNuUKXhBvIh0XzN18Ta5U4Jlko1SZzQvaOXKdCjOJdpZ4tp7feV/mgmqRWrj6omaJVqT2qk6H7VG/CIMvwudFXkxzTerMZ8ys7myzmd+Vbvd79xvqNTZvtiv3tPR0OnY5dTt0u6L33XPv29e8fcPtw4ONBrMdjz2GvEe9RnzHfz37jAdyUZ4Ffgr5Sp2nfDn0PngmZo88d/hE6f2QhbPHoUvjPYysRK8dXI2WiOmIQJ5GxqFPoOKbTzGcw8SwJrIlsSezJ2BSOs7hUfBohnTODeI4rk5TFnc1znvcCXw5/rsBFwUubLgtdEb4qkkfOF722+bpYgXihxA2pm1K3pG/L3JG9M1lEuStfrFCiVKp8b8v9LQ+2PtxWplquVj7/KLRC/bFGpVaV9pPt1duf6jxdq4ms1Xum/9zgheE/RnXouth6k5emDWaN5k3mzWzNia8sWixfW7XiWs++sW6zeWvbTmxPf2fXYd+5p4unK7vb8b1Tj0uvQG9un2u/68C+D8Ifrnx0GzwwJDqU/+ngsMeI56jEaOGY92efcd8JmYnbk/5TAV8oXxW+Fk8HfaN+p81smbk/GzwX8oM+rzpfvhC6GLZ09OfRZa3lqpVjqxFrOmtPGQwAhBgSh/yGakbfYcpgjsD4sNizGrFtY5fCSnHw4XjxfAQ+Tm6iJJc0SYPbkmc/bwhfCn+JQLPguBCXsJqID/m86EsxhLiOxCHJe1LTMtKyFLkqBZSigVKa8uBWGZW4bV1qsuo0jTotXu2w7a90efSo+s8NxY2OGbeZCpuF7ag2X7LYYum1K9OqzRpnY2YbZldg/86BzVHf6ZDzJZf6vdP7RPbvdgs/kO9ed3Dck9tLz9vJ54TvVb9a//6ApUCuIDmqMc33UERwakg+vexwQ2jvkYmw+XDUMc4I8nH5E6qR+lEW0btj9p48EOt1ihJHPx18Jio+KuFkYnxSenJiSs7ZC6nZaWnpFzPSz2Vlns+6mX3jfPGFmzl3cksuPrn05HLdlVdX2/La89uvtV/vLRguHLsxdHPk1vTt73emi77enSmeLpksnbo3dn/wwdDDnrK28sZHtRWPHpdUXqxKfxJVHfh0b41F7fZnss+Jz5defPynqe5hfcbL4Aa7RrUmwSZGc8+rhy0Jr11axVpH3zxoO/7WpB3X3v/uaod/p0rnaldLd8b7fT0yPbO9lX0x/RYDpIGBD7c+hgxqD6GHmj6dG94/IjUyNVo5Fv155zj3eP/E9UnKlOrU2pfGr+nTe7+Jf5v6/mAmYtZsjjjX/aNgnrqguYhafLmU9nPvstjyl5Xy1ag1cwYPgwEAJxFhyHCUNqoSfZxJj6mGORpzisWUpY41ju00ewJ2J7aZIxmXjE8h7Ca0cqYS07kySBnc9tzveLJ4s/jO8+cI5Armbroo5CrUL3xF5Co5TzRvc57YNfHrEgWShVI3pG/K3JL1k52Quy1fpHBXsVipRLl0y72t91UebHuoWq5Wrl6uEaaxqFmpValdtf2JTrXuCd01vRr9WoNnhs+NXhjHmqBN6kzrzV7uaDBv3NlkkWiJtXy1q8Xq9e5W61Qbgk2b7Vu7dvt3ezodshx5HLucup3fu/TszXUVdO3b17//g9vHAx/d8w6KHhzy+OQ57DXiXegjuZ4g/hMBdyjylKn/lCKzv1Ok4qjG0aXwn8eWI1aOr55Yi2REQwzyd5JgzmDiWeIbE3Ymsidhk7EpHGfxqYQ0zt9ZwpPNe57vV5Zs+jtL8oeueVwXKxAvlLwhuZEmRfJ3FYoV/8oSlbJt5aqP1CvUH2tUalZpP9Gu3v5Ut0b3rxwxqTd9adpg1rijybzZ4lXo682tVm+s26zf2rQf75DtdOhy7I7pUep16YsbUPkQP6g6lDTsOao9ljbuN+n/hTJN/Z4w5zJ/dilx1ZbBAFg/+wAAmNUAsuQAHHIA7PIB4uQApNwAeG4CWHMA2GsCkkkYkDo0QOzU2Tg/AAEEEAJFMARnCIFUKIVFBBlhgQhD3ES8Rowh8UgzZDSyGrmC0kFFo+pRK2hRtDO6EP2DyZTpFFMJ0zSzGXMe8yiGG+OKqWbBsGiyxLJMsmqxUllr2RTYotgq2HHs0ezvsSRsEPYzhwnHSY5BnDvuOR6F98ZPEWwIWYRVznjOGaIWsYBLnauAa5rkRlrg9uMu55HjecnrzYfhu80vwX+Ef07gkqCZ4Oymq0LiQhHCCOEyEX+yKLlH9NzmzZujxPBireJpEnskBSSHpO5IG0nfkjGU5ZQdlHsgf1rBVVFFCas0pvzPlvytMSqe28xU5dW41FbURzWyNXGatVql2nnbz+mc0Y3UO6J/yIBi6Gfka+xrEmAaZEbfccw8dudZi1zLW7sqrBp391l/t8XYCdtr7LFzoDmmOBU7v3GZdeXbp7vf2y31QJX7Zw9eTzOvo95Ffnz+1gEJlLogJNWAFn3oRQgz3eJwepj4UWr4kwi24y4niiIZ0faxyFOucY/OcMUfSmhLzkxZSnVLq89QOpeTHXL+U45dbt3l4qsSeZeu8RYSbqTcwt0+eze7RKj0+n2FMuPytgr3x9+reZ8W1Rq+oNfh64sadjYntCi8bnsT2l7fQesS7G7ok+zv/pAwqDdcNOr5WWS854vDNM+3rpmcObeFqaWy5UgGH4MBAEhgA16QAT1wgsOQCRUwgMAglBFuiBREDWIWKYt0Q+Yg36HwqF2oJFQLmgO9G52J7mUiM/kxlTItMhsxn2V+j5HAHMa8YCGyeLJUsLKzurIWs6HZ9rM9ZGdj92CvwXJjadgWDlmOZI4pnCWuBM+Bp+I7CfqE65w4zlDOXqIp8R4XmSuda40UQvrC7c89wUPhmeGl887zhfMj+JMEBARuC2oK1m9y2DQuFCXML1wuYiMyQY4TlRRt2Bwkxiv2VNxDAivxTDJISkTqrXS8jKHMqmyVXIS8jvyCQo3iGSV7ZVHl6S01W9NU/LcZqwqrLqt1qD/WuKQZreWj7bhdR0dJV1SPqI82QBnMGH43mjaeNBk1nTWb3PFjJ9KCZMm7a4uV7u7d1rY2AbZH7XLt7+955dDruOJMclHaa+V6aN+F/XVuY+6sB5U9fD1zvGq8v/nK+Hn5Zwd0BAoG7aHm0j4HS4eE0htDhY6EhDWFix1LiZg44RzZEK0WUxBLPJVymngmK4EvMTdZNeV1qlfaz4zkTPWskfOXc/wv7rksc5Upb+ra84KyGxduxd3xuOtaYnpP48G2MsVHCo+lqySqpWuUn+m92FFn85LSeKg5reVq65O2gXZGp0i3To9nX+JA5cepT/wjhmNR4zcnh78KfPOeuTw3uiC9FLRcvoZgMACAGQggBIbgDKlQCm837G+4X1ePxqOd0T+YTJlyfnlfw7iyiLDEskyy2rPWsimwXWTHsUezL2CDsJ85PHHuuE94b/wUIYSwyhlP5CEWcKlzNZHcSAvcqb9NW/HP/fJsLYwQLvtl2WZd8i/HoTKGfxv+I/iX37eatVqlf+z+kfvfu/2f1PoM+vH5W/9bbWjPv93G3P5bbtLWP3KzmDfsXtLc0Hs9Y8NvEXFD8IOKDcNVJ9cVP+vZcNw43pzw6p+WrNdtb0LfCrXXd9A6S7viuht6Qvsk+wMGjD8kDOoNnf50cLhoZH60/bPIeMCE+aT0FOaLw9fC6bhvPt93zMjOss9+nXvz48F81oL9wtRi7JLhT6mfo8uRK3wrl1c5V2NXF9auMxIZDID1+xIAALAZUSnUYLKlkTH8/1Yg5fDGHEgAwHoF7bEDACIASPvRze0BgAQAWmAEVKAAFYKBDJZgBMa/nmTw+P3FD2D9LgcAwEwAuOgIAFCzeCzq3/PSvcLoAABGVNrRYD8fXzrZgEajeJGNqIG0w3SvYHmyeZCHojx5q7KyKgDAfwBYjP/gNJJdnQAAAARnQU1BAADY6/UcFKoAAAAgY0hSTQAAbZgAAHOOAADeVAAAgmQAAHjTAADDvAAAMucAABx04zkiNwAACnFJREFUeNrsnHts1FUWxz+/32/enemL0sLQ0kIfUh5ioQiCQGtFRNmCWElFWFwDEohgQNmwJVAx+pcEWERJLFZFDQ93eSgiAtsl8iyV1LYLpaWtpVBK2Q6lj5npvH6zf7QMjFOUxXUTy++bTGZy55x7z9w53zn3nHMzgtfr9aJAgYJuofo1yuXldaxZ8zEej0zv3qGsXbsQg0HL9u0F7NjxTwDS01NYsmSGstMK7j+CtLfbKSmpRpZloqN74/HIANTXN3Hy5FkkSSQmJkrZZQX3J0FEUUCrVSPLXtTqW1PFxvYhLe0hRFEiObm/sssK7k+C3AlZWRPIypqg7K6CnkmQ8vI6jhz5gZqaBjwemX79evHww4MYM2YIarX0i5NWV1+hqqoeALM5gmHDBgBQUlJNWVkNXi+MHp1MbGwUu3cfpbi4GpfLTXx8X6ZMGc3AgX395jt1qpyqqssApKWlEBxsYM+eo5SV1QKQmNiPp54aQ3R0RLf2uFweTp06y4kTZ6mvtxAcbGDo0DgefzyViIhgP9mqqnqf7QMHmklKiubs2Vr27j1Oc3M7K/+STWhHIdhugCB2vwFeGdRGiJkEolrxsp5CEJfLw7p1O9m27R+0t9vxeGQ8HhmNRkV+/n5GjnyAN998ibi47vMKQeh8/vLL46xduwNJkpg+fTwbN74CwOHDZ1i//gtEUWT+/KnU1l7l0KHvAdBoVEiSyNat37J8eTZZWRN98+7efYzPPz+IWq1iyZIZFBaWc+LE2QC93Ny5TJqU6mdTXd01cnM/5tSpszidLlwuD5IkIkkieXn7eOONFxk//kGf/J49x9iw4W8AvPbaTMrLzeTmfkR7ux2tXseSRZMJPf4qNJyH238rhK4HgAcINcPsMtCGK17WUwjyzjvbyc/fT1CQjtBQI6mpgzAYdBQXV2CxtFFYeI6lSzexdWsOJpP+jpNqNGqCgw2AgF6vvW1chcmkJyhIz969x7Ba7aSlPURUVDjl5bVcvHiVjg4na9Z8TEREKGlpwwHQ6dSYTAaMRh2ffnoQh8PFpEmphIQYKSur5upVC62tNlas+ICIiFBSUhIAaGpqZdGi9Vy4cBmNRsWgQfEkJfWnoaGJ0tJqrl69ztKl7/Hhh39m+PB4n+0mkx6tVsOZMxfYvr2gkxxaNSqpixHGEDAZQKXrSsYk8AKO64AIHhdIkuJdPYkgJSXV7NhRgNGoRxQF3n57HpMnjwKgtraR+fPfoa6ukaKi8+za9R1z507+VQvb7U4WL36WRYumAWCzOVi27H2OHy9Flr1s2fK1jyA3Icte3G6ZlSvnMGtWBgDXr7fxyisbKSurwmZz8dFHB0hJ6YxYmzfv9ZFjxoyJrF79RySp81i0adNuNm/ei9XawaZNe8jLe81vLbVaorS0Go1GxUsvPcUjjwxGlr2E946EJ/eBx9EZMgSh8xh1+EX48evOqOIGBk5TokcPgO8QfeDAaTo6nLhcbjIyUn3kAIiLi2LhwmlkZIwkM3OcX8XqXuB0uhk8OJZ58572jRkMWl599VkMBh1qtYqKiotUV1/5iZ6LUaMG+cgBEB5uYvHiZxBFEa1Www8/VHL9ehs2m4MjR4rRaFSEhZlYsOAPPnIAzJ07mZiYSFQqkeLiSl/ecTsZvV6ZnJzZ5OS8QHp6ChkZIwgyGkAXAUH9IMgMhr5QtrmLHBI4PDDoGZiwQfGunhRBzp+/hEolIcteRo16IEBwxozxzJgx/n+yqMvlZtiwAWg0/kRLSOiH2RxBVdVlXC43dXWNxMebfe+73R5GjEgMmG/w4FgiI8O4dq2ZlhYrjY3NSJKAxdKKWq3C7fbw1lufBujZbB1IkoTV2kFFxSUSEvr55WOxsX2YMuXhn/8wJX+FE6tBJYLTA3ETYdJW/BMUBb9rgng8MnZ7B6IoIIoCvXoF/8bLejGZDAGjarVEUJDeR4bWVluATHBwUMBYUJAOrVbti052uwNBEHA4XBiNOhwOFwcPFvHTWzU6nRZRhI4OJ42NzX7veTweoqMj/XKoAFTthGPLOsnhliFqKEzeBiqj4lk9iSCSJKLRqJFlkGUZi6U1QLClxUp9fVNnjmrU079/5K9YVuDGDWu35Vir1d5pmErCYAh0zhs32gLGrNYOHA5XF8lUaLVq37PT6SYiIoS1axd2fUbZp6fValCpJJxON9HRvbstNtwRlwvg8J/g5nwhMTDli84jl4Ked8RKSDBTWHgOlUqiqKiCmTPT/ATz8/fzwQf7AC+zZk1i1ao597yoWq2itLQam83hR4Iff2zgypUmJElCq5WIje3jb2yXbV6vF+FmTRmoqLiExdKCIAiYTHqiosLR6dT06hXMtWvN2O0OBgwwB5Sna2oasFhakSQxoB/ys7CUwLfZ4LJ1lnZ14fD0bggdpHhUT03Sp04di0ajQq1WUVBwhq++OukTKiqqYPfuo77k/Pa+wb1Ao1FRWXmJd9/dhdvt8VWj1q37AputA5fLTVJSf5KSov30tFoNxcWV5OV97Ru7csXChg1/x+Vy43A4efDBeCIigjEa9UycOByn001bm42NG3fR1mb36R05UsLs2W8xc+Yb5OTkIct3eanZWg/7n4P2f3cm5YIIo9+EsEFgvXLbox7cVsXDekoEGTEikdmznyAvbx8Gg47c3Hy2bStApRKpqKjDbndis3WQmfloQPn1XmA06snP38/Ro6VERYVTW9vAtWvNiKIIyLz88tRu9QwGHevX7+SbbwoJDw/mwoVLNDe3IQgiBoOa+fNv6S1YkElhYTlVVfUcOnSasrJq+vePwmq1U1l5CbvdiU6nYdmy57o9znV/tPoOLBdAowZkECT4/m0oXP2TUl0bpL0Pg+cpXtYTCAKwfHk2JpOBzz47iMXSysmT/+JmjmI06snOzmDFiudvS2RlX8fdZgvyJcFOp4vWVhuSJGG3OwIWdTicTJ06DoNByyefHKC0tMbXEe/VK5jXX8/uloQOh5Pnn3+clhYbO3cW4PHI6PUaAMzmXqxcOcfXJASIigrjvfeWsmbNJ5w+fY6amltXYDQaFVFRYSxZ8ixTpoy+5ddOF21tdkRR9OVD/umTt7NT7nTd3AXoaAiUcwIuJYL0KIKIosCiRdPIzBzHsWOlXLzYCECfPuGkpj7AkCFxfsqJidFs3ry0qyKk8VV8MjPHkZwciyAImM2B96Pcbhm9Xs2qVXPIyBhBYeE57HYnMTGRpKen3PFOldvtISQkiJycF3jyyVTOnKnE6XQzcGBfHntsBJGRoQE6cXFRbNnyOkVFFZSWVtPU1IJGoyIxMZqxY4fSu3eIn/z06Y8ydOgABEEgMjIs0AjzeJi24873sHy/Hk7oM1rxsJ5EkJuIjo4gO/uxX1QOCzMG3H0CiI83+/UvuvUfT2e0GTt2CGPHDrlrg29WodLTU0hPT7krHUkSGTMmmTFjkn9RNiGhn18/JPBsGAMJMYrn3G9JugIFCu4ygvxWcDrdWK0O3+v/Tq/jv9ZToOB3RZAnnhhFTEwkoigwYMDdN9SysiYwcmQisuwlOTlW+dYU/N8gKP9qokDBnfGfAQA9nOAwz2UemwAAAABJRU5ErkJgggo=";
325 //background_image_url = base_image_url + "background.png"; 322 //background_image_url = base_image_url + "background.png";
326 background_image_url = "data:image/png;charset=utf-8;base64,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Llccuo/bX7mtHavu9cv5eoDJDda5Pqy1sepe31SbHYj247Uj1V/nst/6md4GjwFsDetFqTkGrWO9729auKY364HqwumpX1VTtRqnqc71dtDWm7aAq2/Y+bq53o7Ucufr5noTs+7jjG2zgtVEph2n5uuZqpo6cOCOj+39yK2fn5nZ8dler39Tr9ff1+v1rtmk5weukOFwOD8cDo4NB4OfnFta+Pe33n3x8SNHDh2uUagWazVayzVqQzdeY9uMaaY9ITWxml45Zm644c4b9u05+Bcz03NfrOpNbcLzAVvKcHlx8czXjh7//pePHDn0eo2itdQ6lmvt0nFskwarvYxrh2q6quYO3vrFz+/c+dG/r15v54TPA2xxw+Fw/uTJo1964aWHH6+qszUKV3O0l41jLw8nmXg2itVMVW3/9ME//KPt26//cq/Xm5vgOYAQvV5vdnZ21xf2XPfx08feev75zrc3ZQ9rkgmrvQxsQjVTVdtu+/h9X9i1a/8/9nq9NY9/8y37655776zP3HFb7d+/p3bs0DJIs7Bwto4efbuee/aFeuzRZ+qVl4+u+f5wWIMTJ177k/995bFvVNWZGk1bZ2t1edhMW5ds3GB196xmaxSruX37fu2mGw/c+a/tDfXp6an60z/7/brv/ruq3++v/4hAnMFgUA8/9FQ9+MAjtbS0fP724XA4//Jr3/zd48d/8GqNonWmqs7V6r7WWPtZ4y4Jm2A1pyrM1Cha2z9x02//1fT07K82d5yenqoH/+GP6+7P3V6dgQsI1+v16pc+dWN9+lduricf/04NBsPm9tkd266/9o03v/eftbpv1d58rxpjmThJsJpTF2aqaq6q5vbu/eWb9u659e+qeufHqC/9+R/U3Z+7fcynARLccMPe2r17Rz3z9A/P3zY9PfuJhbMnvnHmzPH3au27hGOf4jDO+qx7GkOz2T67b89tv9U+deHmW/bXffffNc7rAsLcd/9ddfMt+1u39Kb2XX/w7qraXqvbRu1zNC95yTXJhlL77PWZqpqdm939G+073HPvnfas4EOi3+/XPffeuea27XPX/XqNVmCztTrcTNWFf5J3cc8x5mtb7x3CuX5/+hfad/rMHbeN+fBAou7vfH9q5kBVbatRsGZr7YR1ycYNVvtPcM4vCfv9qb3tO+3fv2fMhwcSdX/np3pT19dowmpOe2omrO4nuFyUcfewmssmXNNVNdPr9be37+g8K/hw6f7O9/pTzXTV7F+NHauqyZaE7T2sZsoC6Gomq+a4Ypvu3Y+D6XcOgK7uR0t1+3HRJt10735CA0BX+93Bsaerqsmmom4lncYOrGe9yeqKB6vqwkkLoGviUDUmnbAAfpaN3hG8ome6t1+ICQvYyHr/W9ZVWRIC/CybthoTLCDGJKc1AIzrii4Ju2tRAQPez0a9uGJ/Swhwsd6vGxfdFHtYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXE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"; 323 background_image_url = "data:image/png;charset=utf-8;base64,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Llccuo/bX7mtHavu9cv5eoDJDda5Pqy1sepe31SbHYj247Uj1V/nst/6md4GjwFsDetFqTkGrWO9729auKY364HqwumpX1VTtRqnqc71dtDWm7aAq2/Y+bq53o7Ucufr5noTs+7jjG2zgtVEph2n5uuZqpo6cOCOj+39yK2fn5nZ8dler39Tr9ff1+v1rtmk5weukOFwOD8cDo4NB4OfnFta+Pe33n3x8SNHDh2uUagWazVayzVqQzdeY9uMaaY9ITWxml45Zm644c4b9u05+Bcz03NfrOpNbcLzAVvKcHlx8czXjh7//pePHDn0eo2itdQ6lmvt0nFskwarvYxrh2q6quYO3vrFz+/c+dG/r15v54TPA2xxw+Fw/uTJo1964aWHH6+qszUKV3O0l41jLw8nmXg2itVMVW3/9ME//KPt26//cq/Xm5vgOYAQvV5vdnZ21xf2XPfx08feev75zrc3ZQ9rkgmrvQxsQjVTVdtu+/h9X9i1a/8/9nq9NY9/8y37655776zP3HFb7d+/p3bs0DJIs7Bwto4efbuee/aFeuzRZ+qVl4+u+f5wWIMTJ177k/995bFvVNWZGk1bZ2t1edhMW5ds3GB196xmaxSruX37fu2mGw/c+a/tDfXp6an60z/7/brv/ruq3++v/4hAnMFgUA8/9FQ9+MAjtbS0fP724XA4//Jr3/zd48d/8GqNonWmqs7V6r7WWPtZ4y4Jm2A1pyrM1Cha2z9x02//1fT07K82d5yenqoH/+GP6+7P3V6dgQsI1+v16pc+dWN9+lduricf/04NBsPm9tkd266/9o03v/eftbpv1d58rxpjmThJsJpTF2aqaq6q5vbu/eWb9u659e+qeufHqC/9+R/U3Z+7fcynARLccMPe2r17Rz3z9A/P3zY9PfuJhbMnvnHmzPH3au27hGOf4jDO+qx7GkOz2T67b89tv9U+deHmW/bXffffNc7rAsLcd/9ddfMt+1u39Kb2XX/w7qraXqvbRu1zNC95yTXJhlL77PWZqpqdm939G+073HPvnfas4EOi3+/XPffeuea27XPX/XqNVmCztTrcTNWFf5J3cc8x5mtb7x3CuX5/+hfad/rMHbeN+fBAou7vfH9q5kBVbatRsGZr7YR1ycYNVvtPcM4vCfv9qb3tO+3fv2fMhwcSdX/np3pT19dowmpOe2omrO4nuFyUcfewmssmXNNVNdPr9be37+g8K/hw6f7O9/pTzXTV7F+NHauqyZaE7T2sZsoC6Gomq+a4Ypvu3Y+D6XcOgK7uR0t1+3HRJt10735CA0BX+93Bsaerqsmmom4lncYOrGe9yeqKB6vqwkkLoGviUDUmnbAAfpaN3hG8ome6t1+ICQvYyHr/W9ZVWRIC/CybthoTLCDGJKc1AIzrii4Ju2tRAQPez0a9uGJ/Swhwsd6vGxfdFHtYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXE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";
327 //close_image_url = base_image_url + "close.png"; 324 //close_image_url = base_image_url + "close.png";
328 close_image_url = "data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAIAAAC0D9CtAAAABGdBTUEAANbY1E9YMgAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAGiSURBVHjaYvz//z8DiYAFU+jhg5cXLtx9/+4LLy+nlpa8hpYsIyMjTj03rj/u71l74fxdZEEFRfG8wkBrG224CCPcbfv2XKivWfjr1x+s7snM8U1IcoOwmeA24NEABNOnbN698yyKHqCTIBrcPU2WrKiIjHYEsh2c9BctK0tMcYeomdC37sePXyAW0G0P7r8wM8yBoFs3n/wHgwP7L/79+xfI+Pnzl6VpHkR27+7zQBGQPcie3rr5JIRh76DHxASS3bHtzN8//yCCF87fgbrt/fsvcD3Ll+4/eOASnPvg/suO1hVwLjACoHqA8QAXBfrB1k4HOaDjEl3hXF4+LqgeYMTBRZNS3CFOAtoAEUlIdGNmgQaVlrYcVA8wpoHmQUT377v469fvTRuOR4W1zZi25cf3X6DAAPuHi4vd1l4XEadHj1wtypsB0QY0Fe5pZHZOvn9svAsifoBJAxjTEDZcETLbw8s0Js4ZPe0AATCmgRH35vUn5BQAdFJSqgdQAzylMqLlBWBMHztyDRgPoHTNxwX0NNAP/PzcyGoYycg/AAEGABYVzxqE3YcJAAAAAElFTkSuQmCCCg=="; 325 close_image_url = "data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAIAAAC0D9CtAAAABGdBTUEAANbY1E9YMgAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAGiSURBVHjaYvz//z8DiYAFU+jhg5cXLtx9/+4LLy+nlpa8hpYsIyMjTj03rj/u71l74fxdZEEFRfG8wkBrG224CCPcbfv2XKivWfjr1x+s7snM8U1IcoOwmeA24NEABNOnbN698yyKHqCTIBrcPU2WrKiIjHYEsh2c9BctK0tMcYeomdC37sePXyAW0G0P7r8wM8yBoFs3n/wHgwP7L/79+xfI+Pnzl6VpHkR27+7zQBGQPcie3rr5JIRh76DHxASS3bHtzN8//yCCF87fgbrt/fsvcD3Ll+4/eOASnPvg/suO1hVwLjACoHqA8QAXBfrB1k4HOaDjEl3hXF4+LqgeYMTBRZNS3CFOAtoAEUlIdGNmgQaVlrYcVA8wpoHmQUT377v469fvTRuOR4W1zZi25cf3X6DAAPuHi4vd1l4XEadHj1wtypsB0QY0Fe5pZHZOvn9svAsifoBJAxjTEDZcETLbw8s0Js4ZPe0AATCmgRH35vUn5BQAdFJSqgdQAzylMqLlBWBMHztyDRgPoHTNxwX0NNAP/PzcyGoYycg/AAEGABYVzxqE3YcJAAAAAElFTkSuQmCCCg==";
329 326
330 //newDiv.parentNode.removeChild(newDiv); 327 //newDiv.parentNode.removeChild(newDiv);
331 newDiv = document.createElement('div'); 328 newDiv = document.createElement('div');
332 newDiv.setAttribute("id", "clipperz_bookmarklet"); 329 newDiv.setAttribute("id", "clipperz_bookmarklet");
333 //newDiv.setAttribute("style", "width:270px; height:400px; padding:20px 0px 0px 20px; margin:0px; border:0px; background-color:transparent; background-repeat:no-repeat; position:absolute; z-index:20000; top:40px; left:40px; background-image:url(" + background_image_url + ");"); 330 //newDiv.setAttribute("style", "width:270px; height:400px; padding:20px 0px 0px 20px; margin:0px; border:0px; background-color:transparent; background-repeat:no-repeat; position:absolute; z-index:20000; top:40px; left:40px; background-image:url(" + background_image_url + ");");
334 331
335 innerHTML = ""; 332 innerHTML = "";
336 innerHTML +="<style>div#ClipperzBackgroundDIV { width:290px; height:420px; padding:20px 0px 0px 20px; margin:0px; border:0px; background-color:transparent; background-repeat:no-repeat; position:absolute; z-index:20000; top:40px; left:40px; background-image:url(" + background_image_url + ") }</style>"; 333 innerHTML +="<style>div#ClipperzBackgroundDIV { width:290px; height:420px; padding:20px 0px 0px 20px; margin:0px; border:0px; background-color:transparent; background-repeat:no-repeat; position:absolute; z-index:20000; top:40px; left:40px; background-image:url(" + background_image_url + ") }</style>";
337 innerHTML +="<div style=\"border:0px; margin:0px; padding:0px; padding-left:10px;\">" + 334 innerHTML +="<div style=\"border:0px; margin:0px; padding:0px; padding-left:10px;\">" +
338 "<img style=\"padding-top:5px;\" src=\"" + logo_image_url + "\">" + 335 "<img style=\"padding-top:5px;\" src=\"" + logo_image_url + "\">" +
339 "<a href=\"javascript:closeBookmarklet();\">" + 336 "<a href=\"javascript:closeBookmarklet();\">" +
340 "<img style=\"padding-left:28px; padding-bottom:10px;\" border=0 src=\"" + close_image_url + "\">" + 337 "<img style=\"padding-left:28px; padding-bottom:10px;\" border=0 src=\"" + close_image_url + "\">" +
341 "</a>" + 338 "</a>" +
342 "</div>"; 339 "</div>";
343 340
344 if ((someParameters != null) && (anException == null)) { 341 if ((someParameters != null) && (anException == null)) {
345 innerHTML +="<div style=\"width:255px; border-top:1px dotted #336;\">" + 342 innerHTML +="<div style=\"width:255px; border-top:1px dotted #336;\">" +
346 "<div style=\"line-height:10pt; margin-right:10px; margin-top:5px; padding:5px 10px; color:#666; text-align:left; font-family:sans-serif;\">" + 343 "<div style=\"line-height:10pt; margin-right:10px; margin-top:5px; padding:5px 10px; color:#666; text-align:left; font-family:sans-serif;\">" +
347 "<p style=\"margin:0px; font-weight:bold; font-size:10pt; font-family:sans-serif;\">How to add a new card or a direct login to an existing card for this website:</p>" + 344 "<p style=\"margin:0px; font-weight:bold; font-size:10pt; font-family:sans-serif;\">How to add a new card or a direct login to an existing card for this website:</p>" +
348 "<ol style=\"padding:0px 0px 0px 20px; font-size:9pt; font-family:sans-serif;\">" + 345 "<ol style=\"padding:0px 0px 0px 20px; font-size:9pt; font-family:sans-serif;\">" +
349 "<li>Copy the content of the text area below (Ctrl-C)</li>" + 346 "<li>Copy the content of the text area below (Ctrl-C)</li>" +
350 "<li>Go to your Clipperz account</li>" + 347 "<li>Go to your Clipperz account</li>" +
351 "<li>Click \"Add new card\" or select the related card</li>" + 348 "<li>Click \"Add new card\" or select the related card</li>" +
352 "<li>Paste the direct login configuration (Ctrl-V)</li>" + 349 "<li>Paste the direct login configuration (Ctrl-V)</li>" +
353 "<li>Complete and review the details, then click \"Save\"</li>" + 350 "<li>Complete and review the details, then click \"Save\"</li>" +
354 "</ol>" + 351 "</ol>" +
355 "</div>" + 352 "</div>" +
356 "</div>"; 353 "</div>";
357 innerHTML +="<textarea id=\"bookmarklet_textarea\" style=\"border:2px solid #333366; font-family:sans-serif; font-size:8pt; color:#336; width:240px; height:135px; padding:4px; background-color:white; margin:0px 10px;\">" + 354 innerHTML +="<textarea id=\"bookmarklet_textarea\" style=\"border:2px solid #333366; font-family:sans-serif; font-size:8pt; color:#336; width:240px; height:135px; padding:4px; background-color:white; margin:0px 10px;\">" +
358 serializeJSON(someParameters) + 355 serializeJSON(someParameters) +
359 "</textarea>"; 356 "</textarea>";
360 } else if ((someParameters == null) && (anException == null)) { 357 } else if ((someParameters == null) && (anException == null)) {
361 innerHTML += "<div>No login form has been found on the page</div><div>Get some help <a href=\"#\">here</a></div>"; 358 innerHTML += "<div>No login form has been found on the page</div><div>Get some help <a href=\"#\">here</a></div>";
362 } else { 359 } else {
363 innerHTML += "<div>An error happened while processing the page</div><div>Get some help <a href=\"#\">here</a></div><div>" + anException.name + " - " + anException.message + "</div>"; 360 innerHTML += "<div>An error happened while processing the page</div><div>Get some help <a href=\"#\">here</a></div><div>" + anException.name + " - " + anException.message + "</div>";
364 } 361 }
365 362
366 //newDiv.innerHTML = "<div style='width:290px; height:420px; padding:20px 0px 0px 20px; margin:0px; border:0px; background-color:transparent; background-repeat:no-repeat; position:absolute; z-index:20000; top:40px; left:40px; background-image:url(" + background_image_url + ")'>" + innerHTML + "</div>"; 363 //newDiv.innerHTML = "<div style='width:290px; height:420px; padding:20px 0px 0px 20px; margin:0px; border:0px; background-color:transparent; background-repeat:no-repeat; position:absolute; z-index:20000; top:40px; left:40px; background-image:url(" + background_image_url + ")'>" + innerHTML + "</div>";
367 newDiv.innerHTML = "<div id=\"ClipperzBackgroundDIV\">" + innerHTML + "</div>"; 364 newDiv.innerHTML = "<div id=\"ClipperzBackgroundDIV\">" + innerHTML + "</div>";
368 365
369 document.body.appendChild(newDiv); 366 document.body.appendChild(newDiv);
370 367
371 if ((someParameters != null) && (anException == null)) { 368 if ((someParameters != null) && (anException == null)) {
372 bookmarklet_textarea = document.getElementById("bookmarklet_textarea"); 369 bookmarklet_textarea = document.getElementById("bookmarklet_textarea");
373 bookmarklet_textarea.focus(); 370 bookmarklet_textarea.focus();
374 bookmarklet_textarea.select(); 371 bookmarklet_textarea.select();
375 } 372 }
376}; 373};
377 374
378//----------------------------------------------------------------------------- 375//-----------------------------------------------------------------------------
379 376
380getLoginFormConfiguration = function() { 377getLoginFormConfiguration = function() {
381 varparameters; 378 varparameters;
382 379
383 try { 380 try {
384 parameters = {}; 381 parameters = {};
385 parameters.page = pageParameters(); 382 parameters.page = pageParameters();
386 parameters.form = formParameters(findLoginForm(document, 0)); 383 parameters.form = formParameters(findLoginForm(document, 0));
387 parameters.version = "0.2.3"; 384 parameters.version = "0.2.3";
388 logFormParameters(parameters, _cble); 385 logFormParameters(parameters, _cble);
389 } catch (e) { 386 } catch (e) {
390 //parameters = "No login form has been found" 387 //parameters = "No login form has been found"
391 logFormParameters(parameters, e); 388 logFormParameters(parameters, e);
392 } 389 }
393} 390}
394 391
395//----------------------------------------------------------------------------- 392//-----------------------------------------------------------------------------
396 393
397getLoginFormConfiguration(); 394getLoginFormConfiguration();
398 395
399 396
400 397
diff --git a/frontend/gamma/js/Bookmarklet_2.js b/frontend/gamma/js/Bookmarklet_2.js
index f9c40a9..02f7de8 100644
--- a/frontend/gamma/js/Bookmarklet_2.js
+++ b/frontend/gamma/js/Bookmarklet_2.js
@@ -1,408 +1,405 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29clipperz_copiedContentToClipboard = false; 26clipperz_copiedContentToClipboard = false;
30 27
31//############################################################################# 28//#############################################################################
32 29
33// Simple Set Clipboard System 30// Simple Set Clipboard System
34// Author: Joseph Huckaby 31// Author: Joseph Huckaby
35 32
36var ZeroClipboard = { 33var ZeroClipboard = {
37 34
38 version: "1.0.4", 35 version: "1.0.4",
39 clients: {}, // registered upload clients on page, indexed by id 36 clients: {}, // registered upload clients on page, indexed by id
40 //moviePath: 'ZeroClipboard.swf', // URL to movie 37 //moviePath: 'ZeroClipboard.swf', // URL to movie
41 //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==', 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==',
42 //moviePath: 'http://localhost:8000/tests/js/tests/Bookmarklet/ZeroClipboard.swf', 39 //moviePath: 'http://localhost:8000/tests/js/tests/Bookmarklet/ZeroClipboard.swf',
43 moviePath: 'http://www.clipperz.com/files/clipperz.com/bookmarklet/0.3.0/ZeroClipboard_1.0.4.swf', 40 moviePath: 'http://www.clipperz.com/files/clipperz.com/bookmarklet/0.3.0/ZeroClipboard_1.0.4.swf',
44 nextId: 1, // ID of next movie 41 nextId: 1, // ID of next movie
45 42
46 $: function(thingy) { 43 $: function(thingy) {
47 // simple DOM lookup utility function 44 // simple DOM lookup utility function
48 if (typeof(thingy) == 'string') thingy = document.getElementById(thingy); 45 if (typeof(thingy) == 'string') thingy = document.getElementById(thingy);
49 if (!thingy.addClass) { 46 if (!thingy.addClass) {
50 // extend element with a few useful methods 47 // extend element with a few useful methods
51 thingy.hide = function() { this.style.display = 'none'; }; 48 thingy.hide = function() { this.style.display = 'none'; };
52 thingy.show = function() { this.style.display = ''; }; 49 thingy.show = function() { this.style.display = ''; };
53 thingy.addClass = function(name) { this.removeClass(name); this.className += ' ' + name; }; 50 thingy.addClass = function(name) { this.removeClass(name); this.className += ' ' + name; };
54 thingy.removeClass = function(name) { 51 thingy.removeClass = function(name) {
55 this.className = this.className.replace( new RegExp("\\s*" + name + "\\s*"), " ").replace(/^\s+/, '').replace(/\s+$/, ''); 52 this.className = this.className.replace( new RegExp("\\s*" + name + "\\s*"), " ").replace(/^\s+/, '').replace(/\s+$/, '');
56 }; 53 };
57 thingy.hasClass = function(name) { 54 thingy.hasClass = function(name) {
58 return !!this.className.match( new RegExp("\\s*" + name + "\\s*") ); 55 return !!this.className.match( new RegExp("\\s*" + name + "\\s*") );
59 } 56 }
60 } 57 }
61 return thingy; 58 return thingy;
62 }, 59 },
63 60
64 setMoviePath: function(path) { 61 setMoviePath: function(path) {
65 // set path to ZeroClipboard.swf 62 // set path to ZeroClipboard.swf
66 this.moviePath = path; 63 this.moviePath = path;
67 }, 64 },
68 65
69 dispatch: function(id, eventName, args) { 66 dispatch: function(id, eventName, args) {
70 // receive event from flash movie, send to client 67 // receive event from flash movie, send to client
71 var client = this.clients[id]; 68 var client = this.clients[id];
72 if (client) { 69 if (client) {
73 client.receiveEvent(eventName, args); 70 client.receiveEvent(eventName, args);
74 } 71 }
75 }, 72 },
76 73
77 register: function(id, client) { 74 register: function(id, client) {
78 // register new client to receive events 75 // register new client to receive events
79 this.clients[id] = client; 76 this.clients[id] = client;
80 }, 77 },
81 78
82 getDOMObjectPosition: function(obj) { 79 getDOMObjectPosition: function(obj) {
83 // get absolute coordinates for dom element 80 // get absolute coordinates for dom element
84 var info = { 81 var info = {
85 left: 0, 82 left: 0,
86 top: 0, 83 top: 0,
87 width: obj.width ? obj.width : obj.offsetWidth, 84 width: obj.width ? obj.width : obj.offsetWidth,
88 height: obj.height ? obj.height : obj.offsetHeight 85 height: obj.height ? obj.height : obj.offsetHeight
89 }; 86 };
90 87
91 while (obj) { 88 while (obj) {
92 info.left += obj.offsetLeft; 89 info.left += obj.offsetLeft;
93 info.top += obj.offsetTop; 90 info.top += obj.offsetTop;
94 obj = obj.offsetParent; 91 obj = obj.offsetParent;
95 } 92 }
96 93
97 return info; 94 return info;
98 }, 95 },
99 96
100 Client: function(elem) { 97 Client: function(elem) {
101 // constructor for new simple upload client 98 // constructor for new simple upload client
102 this.handlers = {}; 99 this.handlers = {};
103 100
104 // unique ID 101 // unique ID
105 this.id = ZeroClipboard.nextId++; 102 this.id = ZeroClipboard.nextId++;
106 this.movieId = 'ZeroClipboardMovie_' + this.id; 103 this.movieId = 'ZeroClipboardMovie_' + this.id;
107 104
108 // register client with singleton to receive flash events 105 // register client with singleton to receive flash events
109 ZeroClipboard.register(this.id, this); 106 ZeroClipboard.register(this.id, this);
110 107
111 // create movie 108 // create movie
112 if (elem) this.glue(elem); 109 if (elem) this.glue(elem);
113 } 110 }
114}; 111};
115 112
116ZeroClipboard.Client.prototype = { 113ZeroClipboard.Client.prototype = {
117 114
118 id: 0, // unique ID for us 115 id: 0, // unique ID for us
119 ready: false, // whether movie is ready to receive events or not 116 ready: false, // whether movie is ready to receive events or not
120 movie: null, // reference to movie object 117 movie: null, // reference to movie object
121 clipText: '', // text to copy to clipboard 118 clipText: '', // text to copy to clipboard
122 handCursorEnabled: true, // whether to show hand cursor, or default pointer cursor 119 handCursorEnabled: true, // whether to show hand cursor, or default pointer cursor
123 cssEffects: true, // enable CSS mouse effects on dom container 120 cssEffects: true, // enable CSS mouse effects on dom container
124 handlers: null, // user event handlers 121 handlers: null, // user event handlers
125 122
126 glue: function(elem) { 123 glue: function(elem) {
127 // glue to DOM element 124 // glue to DOM element
128 // elem can be ID or actual DOM element object 125 // elem can be ID or actual DOM element object
129//console.log(">>> glue"); 126//console.log(">>> glue");
130 this.domElement = ZeroClipboard.$(elem); 127 this.domElement = ZeroClipboard.$(elem);
131 128
132 // float just above object, or zIndex 99 if dom element isn't set 129 // float just above object, or zIndex 99 if dom element isn't set
133 var zIndex = 99; 130 var zIndex = 99;
134 if (this.domElement.style.zIndex) { 131 if (this.domElement.style.zIndex) {
135 zIndex = parseInt(this.domElement.style.zIndex) + 1; 132 zIndex = parseInt(this.domElement.style.zIndex) + 1;
136 } 133 }
137 134
138 // find X/Y position of domElement 135 // find X/Y position of domElement
139 var box = ZeroClipboard.getDOMObjectPosition(this.domElement); 136 var box = ZeroClipboard.getDOMObjectPosition(this.domElement);
140 137
141 // create floating DIV above element 138 // create floating DIV above element
142 this.div = document.createElement('div'); 139 this.div = document.createElement('div');
143 var style = this.div.style; 140 var style = this.div.style;
144 style.position = 'absolute'; 141 style.position = 'absolute';
145 style.left = '' + box.left + 'px'; 142 style.left = '' + box.left + 'px';
146 style.top = '' + box.top + 'px'; 143 style.top = '' + box.top + 'px';
147 style.width = '' + box.width + 'px'; 144 style.width = '' + box.width + 'px';
148 style.height = '' + box.height + 'px'; 145 style.height = '' + box.height + 'px';
149 style.zIndex = zIndex; 146 style.zIndex = zIndex;
150 147
151 // style.backgroundColor = '#f00'; // debug 148 // style.backgroundColor = '#f00'; // debug
152 149
153 var body = document.getElementsByTagName('body')[0]; 150 var body = document.getElementsByTagName('body')[0];
154 body.appendChild(this.div); 151 body.appendChild(this.div);
155 152
156 this.div.innerHTML = this.getHTML( box.width, box.height ); 153 this.div.innerHTML = this.getHTML( box.width, box.height );
157//console.log("<<< glue"); 154//console.log("<<< glue");
158 }, 155 },
159 156
160 getHTML: function(width, height) { 157 getHTML: function(width, height) {
161 // return HTML for movie 158 // return HTML for movie
162 var html = ''; 159 var html = '';
163 var flashvars = 'id=' + this.id + 160 var flashvars = 'id=' + this.id +
164 '&width=' + width + 161 '&width=' + width +
165 '&height=' + height; 162 '&height=' + height;
166 163
167 if (navigator.userAgent.match(/MSIE/)) { 164 if (navigator.userAgent.match(/MSIE/)) {
168 // IE gets an OBJECT tag 165 // IE gets an OBJECT tag
169 var protocol = location.href.match(/^https/i) ? 'https://' : 'http://'; 166 var protocol = location.href.match(/^https/i) ? 'https://' : 'http://';
170 html += '<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="'+protocol+'download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" width="'+width+'" height="'+height+'" id="'+this.movieId+'" align="middle"><param name="allowScriptAccess" value="always" /><param name="allowFullScreen" value="false" /><param name="movie" value="'+ZeroClipboard.moviePath+'" /><param name="loop" value="false" /><param name="menu" value="false" /><param name="quality" value="best" /><param name="bgcolor" value="#ffffff" /><param name="flashvars" value="'+flashvars+'"/><param name="wmode" value="transparent"/></object>'; 167 html += '<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="'+protocol+'download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" width="'+width+'" height="'+height+'" id="'+this.movieId+'" align="middle"><param name="allowScriptAccess" value="always" /><param name="allowFullScreen" value="false" /><param name="movie" value="'+ZeroClipboard.moviePath+'" /><param name="loop" value="false" /><param name="menu" value="false" /><param name="quality" value="best" /><param name="bgcolor" value="#ffffff" /><param name="flashvars" value="'+flashvars+'"/><param name="wmode" value="transparent"/></object>';
171 } 168 }
172 else { 169 else {
173 // all other browsers get an EMBED tag 170 // all other browsers get an EMBED tag
174 html += '<embed id="'+this.movieId+'" src="'+ZeroClipboard.moviePath+'" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="'+width+'" height="'+height+'" name="'+this.movieId+'" align="middle" allowScriptAccess="always" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="'+flashvars+'" wmode="transparent" />'; 171 html += '<embed id="'+this.movieId+'" src="'+ZeroClipboard.moviePath+'" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="'+width+'" height="'+height+'" name="'+this.movieId+'" align="middle" allowScriptAccess="always" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="'+flashvars+'" wmode="transparent" />';
175 } 172 }
176 return html; 173 return html;
177 }, 174 },
178 175
179 hide: function() { 176 hide: function() {
180 // temporarily hide floater offscreen 177 // temporarily hide floater offscreen
181 if (this.div) { 178 if (this.div) {
182 this.div.style.left = '-2000px'; 179 this.div.style.left = '-2000px';
183 } 180 }
184 }, 181 },
185 182
186 show: function() { 183 show: function() {
187 // show ourselves after a call to hide() 184 // show ourselves after a call to hide()
188 this.reposition(); 185 this.reposition();
189 }, 186 },
190 187
191 destroy: function() { 188 destroy: function() {
192 // destroy control and floater 189 // destroy control and floater
193 if (this.domElement && this.div) { 190 if (this.domElement && this.div) {
194 this.hide(); 191 this.hide();
195 this.div.innerHTML = ''; 192 this.div.innerHTML = '';
196 193
197 var body = document.getElementsByTagName('body')[0]; 194 var body = document.getElementsByTagName('body')[0];
198 try { body.removeChild( this.div ); } catch(e) {;} 195 try { body.removeChild( this.div ); } catch(e) {;}
199 196
200 this.domElement = null; 197 this.domElement = null;
201 this.div = null; 198 this.div = null;
202 } 199 }
203 }, 200 },
204 201
205 reposition: function(elem) { 202 reposition: function(elem) {
206 // reposition our floating div, optionally to new container 203 // reposition our floating div, optionally to new container
207 // warning: container CANNOT change size, only position 204 // warning: container CANNOT change size, only position
208 if (elem) { 205 if (elem) {
209 this.domElement = ZeroClipboard.$(elem); 206 this.domElement = ZeroClipboard.$(elem);
210 if (!this.domElement) this.hide(); 207 if (!this.domElement) this.hide();
211 } 208 }
212 209
213 if (this.domElement && this.div) { 210 if (this.domElement && this.div) {
214 var box = ZeroClipboard.getDOMObjectPosition(this.domElement); 211 var box = ZeroClipboard.getDOMObjectPosition(this.domElement);
215 var style = this.div.style; 212 var style = this.div.style;
216 style.left = '' + box.left + 'px'; 213 style.left = '' + box.left + 'px';
217 style.top = '' + box.top + 'px'; 214 style.top = '' + box.top + 'px';
218 } 215 }
219 }, 216 },
220 217
221 setText: function(newText) { 218 setText: function(newText) {
222 // set text to be copied to clipboard 219 // set text to be copied to clipboard
223 this.clipText = newText; 220 this.clipText = newText;
224 if (this.ready) this.movie.setText(newText); 221 if (this.ready) this.movie.setText(newText);
225 }, 222 },
226 223
227 addEventListener: function(eventName, func) { 224 addEventListener: function(eventName, func) {
228 // add user event listener for event 225 // add user event listener for event
229 // event types: load, queueStart, fileStart, fileComplete, queueComplete, progress, error, cancel 226 // event types: load, queueStart, fileStart, fileComplete, queueComplete, progress, error, cancel
230 eventName = eventName.toString().toLowerCase().replace(/^on/, ''); 227 eventName = eventName.toString().toLowerCase().replace(/^on/, '');
231 if (!this.handlers[eventName]) this.handlers[eventName] = []; 228 if (!this.handlers[eventName]) this.handlers[eventName] = [];
232 this.handlers[eventName].push(func); 229 this.handlers[eventName].push(func);
233 }, 230 },
234 231
235 setHandCursor: function(enabled) { 232 setHandCursor: function(enabled) {
236 // enable hand cursor (true), or default arrow cursor (false) 233 // enable hand cursor (true), or default arrow cursor (false)
237 this.handCursorEnabled = enabled; 234 this.handCursorEnabled = enabled;
238 if (this.ready) this.movie.setHandCursor(enabled); 235 if (this.ready) this.movie.setHandCursor(enabled);
239 }, 236 },
240 237
241 setCSSEffects: function(enabled) { 238 setCSSEffects: function(enabled) {
242 // enable or disable CSS effects on DOM container 239 // enable or disable CSS effects on DOM container
243 this.cssEffects = !!enabled; 240 this.cssEffects = !!enabled;
244 }, 241 },
245 242
246 receiveEvent: function(eventName, args) { 243 receiveEvent: function(eventName, args) {
247 // receive event from flash 244 // receive event from flash
248 eventName = eventName.toString().toLowerCase().replace(/^on/, ''); 245 eventName = eventName.toString().toLowerCase().replace(/^on/, '');
249 246
250 // special behavior for certain events 247 // special behavior for certain events
251 switch (eventName) { 248 switch (eventName) {
252 case 'load': 249 case 'load':
253 // movie claims it is ready, but in IE this isn't always the case... 250 // movie claims it is ready, but in IE this isn't always the case...
254 // bug fix: Cannot extend EMBED DOM elements in Firefox, must use traditional function 251 // bug fix: Cannot extend EMBED DOM elements in Firefox, must use traditional function
255 this.movie = document.getElementById(this.movieId); 252 this.movie = document.getElementById(this.movieId);
256 if (!this.movie) { 253 if (!this.movie) {
257 var self = this; 254 var self = this;
258 setTimeout( function() { self.receiveEvent('load', null); }, 1 ); 255 setTimeout( function() { self.receiveEvent('load', null); }, 1 );
259 return; 256 return;
260 } 257 }
261 258
262 // firefox on pc needs a "kick" in order to set these in certain cases 259 // firefox on pc needs a "kick" in order to set these in certain cases
263 if (!this.ready && navigator.userAgent.match(/Firefox/) && navigator.userAgent.match(/Windows/)) { 260 if (!this.ready && navigator.userAgent.match(/Firefox/) && navigator.userAgent.match(/Windows/)) {
264 var self = this; 261 var self = this;
265 setTimeout( function() { self.receiveEvent('load', null); }, 100 ); 262 setTimeout( function() { self.receiveEvent('load', null); }, 100 );
266 this.ready = true; 263 this.ready = true;
267 return; 264 return;
268 } 265 }
269 266
270 this.ready = true; 267 this.ready = true;
271 this.movie.setText( this.clipText ); 268 this.movie.setText( this.clipText );
272 this.movie.setHandCursor( this.handCursorEnabled ); 269 this.movie.setHandCursor( this.handCursorEnabled );
273 break; 270 break;
274 271
275 case 'mouseover': 272 case 'mouseover':
276 if (this.domElement && this.cssEffects) { 273 if (this.domElement && this.cssEffects) {
277 this.domElement.addClass('hover'); 274 this.domElement.addClass('hover');
278 if (this.recoverActive) this.domElement.addClass('active'); 275 if (this.recoverActive) this.domElement.addClass('active');
279 } 276 }
280 break; 277 break;
281 278
282 case 'mouseout': 279 case 'mouseout':
283 if (this.domElement && this.cssEffects) { 280 if (this.domElement && this.cssEffects) {
284 this.recoverActive = false; 281 this.recoverActive = false;
285 if (this.domElement.hasClass('active')) { 282 if (this.domElement.hasClass('active')) {
286 this.domElement.removeClass('active'); 283 this.domElement.removeClass('active');
287 this.recoverActive = true; 284 this.recoverActive = true;
288 } 285 }
289 this.domElement.removeClass('hover'); 286 this.domElement.removeClass('hover');
290 } 287 }
291 break; 288 break;
292 289
293 case 'mousedown': 290 case 'mousedown':
294 if (this.domElement && this.cssEffects) { 291 if (this.domElement && this.cssEffects) {
295 this.domElement.addClass('active'); 292 this.domElement.addClass('active');
296 } 293 }
297 break; 294 break;
298 295
299 case 'mouseup': 296 case 'mouseup':
300 if (this.domElement && this.cssEffects) { 297 if (this.domElement && this.cssEffects) {
301 this.domElement.removeClass('active'); 298 this.domElement.removeClass('active');
302 this.recoverActive = false; 299 this.recoverActive = false;
303 } 300 }
304 break; 301 break;
305 } // switch eventName 302 } // switch eventName
306 303
307 if (this.handlers[eventName]) { 304 if (this.handlers[eventName]) {
308 for (var idx = 0, len = this.handlers[eventName].length; idx < len; idx++) { 305 for (var idx = 0, len = this.handlers[eventName].length; idx < len; idx++) {
309 var func = this.handlers[eventName][idx]; 306 var func = this.handlers[eventName][idx];
310 307
311 if (typeof(func) == 'function') { 308 if (typeof(func) == 'function') {
312 // actual function reference 309 // actual function reference
313 func(this, args); 310 func(this, args);
314 } 311 }
315 else if ((typeof(func) == 'object') && (func.length == 2)) { 312 else if ((typeof(func) == 'object') && (func.length == 2)) {
316 // PHP style object + method, i.e. [myObject, 'myMethod'] 313 // PHP style object + method, i.e. [myObject, 'myMethod']
317 func[0][ func[1] ](this, args); 314 func[0][ func[1] ](this, args);
318 } 315 }
319 else if (typeof(func) == 'string') { 316 else if (typeof(func) == 'string') {
320 // name of function 317 // name of function
321 window[func](this, args); 318 window[func](this, args);
322 } 319 }
323 } // foreach event handler defined 320 } // foreach event handler defined
324 } // user defined handler for event 321 } // user defined handler for event
325 } 322 }
326 323
327}; 324};
328 325
329//############################################################################# 326//#############################################################################
330 327
331var clip = null; 328var clip = null;
332 329
333function $(id) { return document.getElementById(id); } 330function $(id) { return document.getElementById(id); }
334 331
335function initClip() { 332function initClip() {
336//console.log(">>> initClip"); 333//console.log(">>> initClip");
337 clip = new ZeroClipboard.Client(); 334 clip = new ZeroClipboard.Client();
338 clip.setHandCursor( true ); 335 clip.setHandCursor( true );
339 336
340 //clip.addEventListener('load', my_load); 337 //clip.addEventListener('load', my_load);
341 //clip.addEventListener('mouseOver', my_mouse_over); 338 //clip.addEventListener('mouseOver', my_mouse_over);
342 clip.addEventListener('complete', my_complete); 339 clip.addEventListener('complete', my_complete);
343 340
344 //clip.glue( 'd_clip_button' ); 341 //clip.glue( 'd_clip_button' );
345//console.log("<<< initClip"); 342//console.log("<<< initClip");
346} 343}
347 344
348//function my_load(client) { 345//function my_load(client) {
349 //console.log("Flash movie loaded and ready."); 346 //console.log("Flash movie loaded and ready.");
350//} 347//}
351 348
352//function my_mouse_over(client) { 349//function my_mouse_over(client) {
353 //// we can cheat a little here -- update the text on mouse over 350 //// we can cheat a little here -- update the text on mouse over
354 //clip.setText( $('fe_text').value ); 351 //clip.setText( $('fe_text').value );
355//} 352//}
356 353
357function my_complete(client, text) { 354function my_complete(client, text) {
358 //console.log("Copied text to clipboard: ... "); 355 //console.log("Copied text to clipboard: ... ");
359 //console.log("Copied text to clipboard: " + text ); 356 //console.log("Copied text to clipboard: " + text );
360 clipperz_copiedContentToClipboard = true; 357 clipperz_copiedContentToClipboard = true;
361 showTooltip(); 358 showTooltip();
362} 359}
363 360
364//function debugstr(msg) { 361//function debugstr(msg) {
365 //var p = document.createElement('p'); 362 //var p = document.createElement('p');
366 //p.innerHTML = msg; 363 //p.innerHTML = msg;
367 //$('d_debug').appendChild(p); 364 //$('d_debug').appendChild(p);
368//} 365//}
369 366
370//############################################################################# 367//#############################################################################
371 368
372_cble = null; 369_cble = null;
373 370
374//----------------------------------------------------------------------------- 371//-----------------------------------------------------------------------------
375 372
376isLoginForm = function(aForm) { 373isLoginForm = function(aForm) {
377 var inputFields; 374 var inputFields;
378 var passwordFieldsFound; 375 var passwordFieldsFound;
379 var i,c; 376 var i,c;
380 377
381//console.log("is login form: " + aForm.name + " (" + aForm.id + ")"); 378//console.log("is login form: " + aForm.name + " (" + aForm.id + ")");
382 passwordFieldsFound = 0; 379 passwordFieldsFound = 0;
383 inputFields = aForm.elements; 380 inputFields = aForm.elements;
384 c = inputFields.length; 381 c = inputFields.length;
385 for (i=0; i<c; i++) { 382 for (i=0; i<c; i++) {
386 if (inputFields[i].type == "password") { 383 if (inputFields[i].type == "password") {
387 passwordFieldsFound ++; 384 passwordFieldsFound ++;
388 } 385 }
389 } 386 }
390//console.log("number of password fields found: " + passwordFieldsFound); 387//console.log("number of password fields found: " + passwordFieldsFound);
391 return (passwordFieldsFound == 1); 388 return (passwordFieldsFound == 1);
392}; 389};
393 390
394//----------------------------------------------------------------------------- 391//-----------------------------------------------------------------------------
395 392
396findLoginForm = function(aDocument, aLevel) { 393findLoginForm = function(aDocument, aLevel) {
397 varresult; 394 varresult;
398 vardocumentForms; 395 vardocumentForms;
399 var i,c; 396 var i,c;
400 397
401 result = null; 398 result = null;
402 399
403 try { 400 try {
404 documentForms = aDocument.getElementsByTagName('form'); 401 documentForms = aDocument.getElementsByTagName('form');
405 402
406 c = documentForms.length; 403 c = documentForms.length;
407 for (i=0; (i<c) && (result == null); i++) { 404 for (i=0; (i<c) && (result == null); i++) {
408 if (isLoginForm(documentForms[i])) { 405 if (isLoginForm(documentForms[i])) {
diff --git a/frontend/gamma/js/Clipperz/Async.js b/frontend/gamma/js/Clipperz/Async.js
index e80c3a2..7c9d783 100644
--- a/frontend/gamma/js/Clipperz/Async.js
+++ b/frontend/gamma/js/Clipperz/Async.js
@@ -1,408 +1,405 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29//Clipperz.Async = MochiKit.Async; 26//Clipperz.Async = MochiKit.Async;
30 27
31 28
32if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 29if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
33if (typeof(Clipperz.Async) == 'undefined') { Clipperz.Async = {}; } 30if (typeof(Clipperz.Async) == 'undefined') { Clipperz.Async = {}; }
34 31
35Clipperz.Async.VERSION = "0.1"; 32Clipperz.Async.VERSION = "0.1";
36Clipperz.Async.NAME = "Clipperz.Async"; 33Clipperz.Async.NAME = "Clipperz.Async";
37 34
38Clipperz.Async.Deferred = function(aName, args) { 35Clipperz.Async.Deferred = function(aName, args) {
39 args = args || {}; 36 args = args || {};
40 37
41 Clipperz.Async.Deferred.superclass.constructor.call(this, args.canceller); 38 Clipperz.Async.Deferred.superclass.constructor.call(this, args.canceller);
42 39
43 this._args = args; 40 this._args = args;
44 this._name = aName || "Anonymous deferred"; 41 this._name = aName || "Anonymous deferred";
45 this._count = 0; 42 this._count = 0;
46 this._shouldTrace = ((CLIPPERZ_DEFERRED_TRACING_ENABLED === true) || (args.trace === true)); 43 this._shouldTrace = ((CLIPPERZ_DEFERRED_TRACING_ENABLED === true) || (args.trace === true));
47 this._vars = null; 44 this._vars = null;
48 45
49 return this; 46 return this;
50} 47}
51 48
52//============================================================================= 49//=============================================================================
53 50
54Clipperz.Base.extend(Clipperz.Async.Deferred, MochiKit.Async.Deferred, { 51Clipperz.Base.extend(Clipperz.Async.Deferred, MochiKit.Async.Deferred, {
55 52
56 'name': function () { 53 'name': function () {
57 return this._name; 54 return this._name;
58 }, 55 },
59 56
60 'args': function () { 57 'args': function () {
61 return this._args; 58 return this._args;
62 }, 59 },
63 60
64 //----------------------------------------------------------------------------- 61 //-----------------------------------------------------------------------------
65 62
66 'callback': function (aValue) { 63 'callback': function (aValue) {
67 if (this._shouldTrace) { 64 if (this._shouldTrace) {
68 Clipperz.log("CALLBACK " + this._name, aValue); 65 Clipperz.log("CALLBACK " + this._name, aValue);
69 } 66 }
70 67
71 if (this.chained == false) { 68 if (this.chained == false) {
72 var message; 69 var message;
73 70
74 message = "ERROR [" + this._name + "]"; 71 message = "ERROR [" + this._name + "]";
75 this.addErrback(function(aResult) { 72 this.addErrback(function(aResult) {
76 if (! (aResult instanceof MochiKit.Async.CancelledError)) { 73 if (! (aResult instanceof MochiKit.Async.CancelledError)) {
77 Clipperz.log(message, aResult); 74 Clipperz.log(message, aResult);
78 } 75 }
79 return aResult; 76 return aResult;
80 }); 77 });
81 78
82 if (this._shouldTrace) { 79 if (this._shouldTrace) {
83 var resultMessage; 80 var resultMessage;
84 81
85 resultMessage = "RESULT " + this._name + " <=="; 82 resultMessage = "RESULT " + this._name + " <==";
86 // this.addCallback(function(aResult) { 83 // this.addCallback(function(aResult) {
87 Clipperz.Async.Deferred.superclass.addCallback.call(this, function(aResult) { 84 Clipperz.Async.Deferred.superclass.addCallback.call(this, function(aResult) {
88 Clipperz.log(resultMessage, aResult); 85 Clipperz.log(resultMessage, aResult);
89 86
90 return aResult; 87 return aResult;
91 }); 88 });
92 } 89 }
93 } 90 }
94 91
95 if (CLIPPERZ_DEFERRED_CALL_LOGGING_ENABLED === true) { 92 if (CLIPPERZ_DEFERRED_CALL_LOGGING_ENABLED === true) {
96 Clipperz.log("callback " + this._name, this); 93 Clipperz.log("callback " + this._name, this);
97 } 94 }
98 95
99 return Clipperz.Async.Deferred.superclass.callback.apply(this, arguments); 96 return Clipperz.Async.Deferred.superclass.callback.apply(this, arguments);
100 }, 97 },
101 98
102 //----------------------------------------------------------------------------- 99 //-----------------------------------------------------------------------------
103 100
104 'addCallback': function () { 101 'addCallback': function () {
105 var message; 102 var message;
106 103
107 if (this._shouldTrace) { 104 if (this._shouldTrace) {
108 this._count ++; 105 this._count ++;
109 message = "[" + this._count + "] " + this._name + " "; 106 message = "[" + this._count + "] " + this._name + " ";
110 // this.addBoth(function(aResult) {Clipperz.log(message + "-->", aResult); return aResult;}); 107 // this.addBoth(function(aResult) {Clipperz.log(message + "-->", aResult); return aResult;});
111 this.addCallbacks( 108 this.addCallbacks(
112 function(aResult) {Clipperz.log("-OK- " + message + "-->"/*, aResult*/); return aResult;}, 109 function(aResult) {Clipperz.log("-OK- " + message + "-->"/*, aResult*/); return aResult;},
113 function(aResult) {Clipperz.log("FAIL " + message + "-->"/*, aResult*/); return aResult;} 110 function(aResult) {Clipperz.log("FAIL " + message + "-->"/*, aResult*/); return aResult;}
114 ); 111 );
115 } 112 }
116 113
117 Clipperz.Async.Deferred.superclass.addCallback.apply(this, arguments); 114 Clipperz.Async.Deferred.superclass.addCallback.apply(this, arguments);
118 115
119 if (this._shouldTrace) { 116 if (this._shouldTrace) {
120 // this.addBoth(function(aResult) {Clipperz.log(message + "<--", aResult); return aResult;}); 117 // this.addBoth(function(aResult) {Clipperz.log(message + "<--", aResult); return aResult;});
121 this.addCallbacks( 118 this.addCallbacks(
122 function(aResult) {Clipperz.log("-OK- " + message + "<--", aResult); return aResult;}, 119 function(aResult) {Clipperz.log("-OK- " + message + "<--", aResult); return aResult;},
123 function(aResult) {Clipperz.log("FAIL " + message + "<--", aResult); return aResult;} 120 function(aResult) {Clipperz.log("FAIL " + message + "<--", aResult); return aResult;}
124 ); 121 );
125 } 122 }
126 }, 123 },
127 124
128 //============================================================================= 125 //=============================================================================
129 126
130 'addCallbackPass': function() { 127 'addCallbackPass': function() {
131 var passFunction; 128 var passFunction;
132 129
133 passFunction = MochiKit.Base.partial.apply(null, arguments); 130 passFunction = MochiKit.Base.partial.apply(null, arguments);
134 131
135 this.addCallback(function() { 132 this.addCallback(function() {
136 var result; 133 var result;
137 134
138 result = arguments[arguments.length -1]; 135 result = arguments[arguments.length -1];
139 passFunction(); 136 passFunction();
140 137
141 return result; 138 return result;
142 }); 139 });
143 }, 140 },
144 141
145 //----------------------------------------------------------------------------- 142 //-----------------------------------------------------------------------------
146 143
147 'addErrbackPass': function() { 144 'addErrbackPass': function() {
148 var passFunction; 145 var passFunction;
149 146
150 passFunction = MochiKit.Base.partial.apply(null, arguments); 147 passFunction = MochiKit.Base.partial.apply(null, arguments);
151 148
152 this.addErrback(function() { 149 this.addErrback(function() {
153 var result; 150 var result;
154 151
155 result = arguments[arguments.length -1]; 152 result = arguments[arguments.length -1];
156 passFunction(); 153 passFunction();
157 154
158 return result; 155 return result;
159 }); 156 });
160 }, 157 },
161 158
162 //----------------------------------------------------------------------------- 159 //-----------------------------------------------------------------------------
163 160
164 'addBothPass': function() { 161 'addBothPass': function() {
165 var passFunction; 162 var passFunction;
166 163
167 passFunction = MochiKit.Base.partial.apply(null, arguments); 164 passFunction = MochiKit.Base.partial.apply(null, arguments);
168 165
169 this.addBoth(function() { 166 this.addBoth(function() {
170 var result; 167 var result;
171 168
172 result = arguments[arguments.length -1]; 169 result = arguments[arguments.length -1];
173 passFunction(); 170 passFunction();
174 171
175 return result; 172 return result;
176 }); 173 });
177 }, 174 },
178 175
179 //----------------------------------------------------------------------------- 176 //-----------------------------------------------------------------------------
180 177
181 'addIf': function (aThenBlock, anElseBlock) { 178 'addIf': function (aThenBlock, anElseBlock) {
182 this.addCallback(MochiKit.Base.bind(function (aValue) { 179 this.addCallback(MochiKit.Base.bind(function (aValue) {
183 var deferredResult; 180 var deferredResult;
184 181
185 if (!MochiKit.Base.isUndefinedOrNull(aValue) && aValue) { 182 if (!MochiKit.Base.isUndefinedOrNull(aValue) && aValue) {
186 deferredResult = Clipperz.Async.callbacks(this._name + " <then>", aThenBlock, null, aValue); 183 deferredResult = Clipperz.Async.callbacks(this._name + " <then>", aThenBlock, null, aValue);
187 } else { 184 } else {
188 deferredResult = Clipperz.Async.callbacks(this._name + " <else>", anElseBlock, null, aValue); 185 deferredResult = Clipperz.Async.callbacks(this._name + " <else>", anElseBlock, null, aValue);
189 } 186 }
190 187
191 return deferredResult; 188 return deferredResult;
192 })) 189 }))
193 }, 190 },
194 191
195 //----------------------------------------------------------------------------- 192 //-----------------------------------------------------------------------------
196 193
197 'addMethod': function () { 194 'addMethod': function () {
198 this.addCallback(MochiKit.Base.method.apply(this, arguments)); 195 this.addCallback(MochiKit.Base.method.apply(this, arguments));
199 }, 196 },
200 197
201 //----------------------------------------------------------------------------- 198 //-----------------------------------------------------------------------------
202 199
203 'addMethodcaller': function () { 200 'addMethodcaller': function () {
204 this.addCallback(MochiKit.Base.methodcaller.apply(this, arguments)); 201 this.addCallback(MochiKit.Base.methodcaller.apply(this, arguments));
205 }, 202 },
206 203
207 //============================================================================= 204 //=============================================================================
208 205
209 'addLog': function (aLog) { 206 'addLog': function (aLog) {
210 if (CLIPPERZ_DEFERRED_LOGGING_ENABLED) { 207 if (CLIPPERZ_DEFERRED_LOGGING_ENABLED) {
211 this.addBothPass(function(res) {Clipperz.log(aLog + " ", res);}); 208 this.addBothPass(function(res) {Clipperz.log(aLog + " ", res);});
212 // this.addBothPass(function(res) {console.log(aLog + " ", res);}); 209 // this.addBothPass(function(res) {console.log(aLog + " ", res);});
213 } 210 }
214 }, 211 },
215 212
216 //============================================================================= 213 //=============================================================================
217 214
218 'acquireLock': function (aLock) { 215 'acquireLock': function (aLock) {
219 // this.addCallback(function (aResult) { 216 // this.addCallback(function (aResult) {
220 // return Clipperz.Async.callbacks("Clipperz.Async.acquireLock", [ 217 // return Clipperz.Async.callbacks("Clipperz.Async.acquireLock", [
221 // MochiKit.Base.method(aLock, 'acquire'), 218 // MochiKit.Base.method(aLock, 'acquire'),
222 // MochiKit.Base.partial(MochiKit.Async.succeed, aResult) 219 // MochiKit.Base.partial(MochiKit.Async.succeed, aResult)
223 // ], {trace:false}); 220 // ], {trace:false});
224 // }); 221 // });
225 222
226 this.addCallback(MochiKit.Base.method(aLock, 'acquire')); 223 this.addCallback(MochiKit.Base.method(aLock, 'acquire'));
227 }, 224 },
228 225
229 'releaseLock': function (aLock) { 226 'releaseLock': function (aLock) {
230 // this.addCallback(function (aResult) { 227 // this.addCallback(function (aResult) {
231 // return Clipperz.Async.callbacks("Clipperz.Async.release <ok>", [ 228 // return Clipperz.Async.callbacks("Clipperz.Async.release <ok>", [
232 // MochiKit.Base.method(aLock, 'release'), 229 // MochiKit.Base.method(aLock, 'release'),
233 // MochiKit.Base.partial(MochiKit.Async.succeed, aResult) 230 // MochiKit.Base.partial(MochiKit.Async.succeed, aResult)
234 // ], {trace:false}); 231 // ], {trace:false});
235 // }); 232 // });
236 // this.addErrback(function (aResult) { 233 // this.addErrback(function (aResult) {
237///console.log("releaseLock.addErrback:", aResult); 234///console.log("releaseLock.addErrback:", aResult);
238 // return Clipperz.Async.callbacks("Clipperz.Async.release <fail>", [ 235 // return Clipperz.Async.callbacks("Clipperz.Async.release <fail>", [
239 // MochiKit.Base.method(aLock, 'release'), 236 // MochiKit.Base.method(aLock, 'release'),
240 // MochiKit.Base.partial(MochiKit.Async.fail, aResult) 237 // MochiKit.Base.partial(MochiKit.Async.fail, aResult)
241 // ], {trace:false}); 238 // ], {trace:false});
242 // }); 239 // });
243 240
244 // this.addBothPass(MochiKit.Base.method(aLock, 'release')); 241 // this.addBothPass(MochiKit.Base.method(aLock, 'release'));
245 this.addCallbackPass(MochiKit.Base.method(aLock, 'release')); 242 this.addCallbackPass(MochiKit.Base.method(aLock, 'release'));
246 this.addErrback(function (anError) { 243 this.addErrback(function (anError) {
247 aLock.release(); 244 aLock.release();
248 245
249 return anError; 246 return anError;
250 }); 247 });
251 }, 248 },
252 249
253 //============================================================================= 250 //=============================================================================
254 251
255 'collectResults': function (someRequests) { 252 'collectResults': function (someRequests) {
256 this.addCallback(Clipperz.Async.collectResults(this._name + " <collect results>", someRequests, this._args)); 253 this.addCallback(Clipperz.Async.collectResults(this._name + " <collect results>", someRequests, this._args));
257 }, 254 },
258 255
259 'addCallbackList': function (aRequestList) { 256 'addCallbackList': function (aRequestList) {
260 this.addCallback(Clipperz.Async.callbacks, this._name + " <callback list>", aRequestList, this._args); 257 this.addCallback(Clipperz.Async.callbacks, this._name + " <callback list>", aRequestList, this._args);
261 }, 258 },
262 259
263 //============================================================================= 260 //=============================================================================
264 261
265 'vars': function () { 262 'vars': function () {
266 if (this._vars == null) { 263 if (this._vars == null) {
267 this._vars = {} 264 this._vars = {}
268 } 265 }
269 266
270 return this._vars; 267 return this._vars;
271 }, 268 },
272 269
273 'setValue': function (aKey) { 270 'setValue': function (aKey) {
274 this.addCallback(MochiKit.Base.bind(function (aValue) { 271 this.addCallback(MochiKit.Base.bind(function (aValue) {
275 this.vars()[aKey] = aValue; 272 this.vars()[aKey] = aValue;
276 return aValue; 273 return aValue;
277 }, this)); 274 }, this));
278 }, 275 },
279 276
280 'getValue': function (aKey) { 277 'getValue': function (aKey) {
281 this.addCallback(MochiKit.Base.bind(function () { 278 this.addCallback(MochiKit.Base.bind(function () {
282 return this.vars()[aKey]; 279 return this.vars()[aKey];
283 }, this)); 280 }, this));
284 }, 281 },
285 282
286 //============================================================================= 283 //=============================================================================
287 284
288 __syntaxFix__: "syntax fix" 285 __syntaxFix__: "syntax fix"
289}); 286});
290 287
291//############################################################################# 288//#############################################################################
292 289
293Clipperz.Async.DeferredSynchronizer = function(aName, someMethods) { 290Clipperz.Async.DeferredSynchronizer = function(aName, someMethods) {
294 this._name = aName || "Anonymous deferred Synchronizer"; 291 this._name = aName || "Anonymous deferred Synchronizer";
295 this._methods = someMethods; 292 this._methods = someMethods;
296 293
297 this._numberOfMethodsDone= 0; 294 this._numberOfMethodsDone= 0;
298 this._methodResults = []; 295 this._methodResults = [];
299 296
300 this._result = new Clipperz.Async.Deferred("Clipperz.Async.DeferredSynchronizer # " + this.name(), {trace:false}); 297 this._result = new Clipperz.Async.Deferred("Clipperz.Async.DeferredSynchronizer # " + this.name(), {trace:false});
301 this._result.addMethod(this, 'methodResults'); 298 this._result.addMethod(this, 'methodResults');
302 this._result.addCallback(function(someResults) { 299 this._result.addCallback(function(someResults) {
303 varcancels; 300 varcancels;
304 var errors; 301 var errors;
305 var result; 302 var result;
306 303
307 cancels = MochiKit.Base.filter(function(aResult) { return (aResult instanceof MochiKit.Async.CancelledError)}, someResults); 304 cancels = MochiKit.Base.filter(function(aResult) { return (aResult instanceof MochiKit.Async.CancelledError)}, someResults);
308 305
309 if (cancels.length == 0) { 306 if (cancels.length == 0) {
310 errors = MochiKit.Base.filter(function(aResult) { return (aResult instanceof Error)}, someResults); 307 errors = MochiKit.Base.filter(function(aResult) { return (aResult instanceof Error)}, someResults);
311 308
312 if (errors.length == 0) { 309 if (errors.length == 0) {
313 // result = MochiKit.Async.succeed(someResults); 310 // result = MochiKit.Async.succeed(someResults);
314 result = someResults; 311 result = someResults;
315 } else { 312 } else {
316 result = MochiKit.Async.fail(someResults); 313 result = MochiKit.Async.fail(someResults);
317 } 314 }
318 } else { 315 } else {
319 result = MochiKit.Async.fail(cancels[0]); 316 result = MochiKit.Async.fail(cancels[0]);
320 } 317 }
321 318
322 return result; 319 return result;
323 }/*, this._methodResults */); 320 }/*, this._methodResults */);
324 321
325 return this; 322 return this;
326} 323}
327 324
328MochiKit.Base.update(Clipperz.Async.DeferredSynchronizer.prototype, { 325MochiKit.Base.update(Clipperz.Async.DeferredSynchronizer.prototype, {
329 326
330 //----------------------------------------------------------------------------- 327 //-----------------------------------------------------------------------------
331 328
332 'name': function() { 329 'name': function() {
333 return this._name; 330 return this._name;
334 }, 331 },
335 332
336 //----------------------------------------------------------------------------- 333 //-----------------------------------------------------------------------------
337 334
338 'methods': function() { 335 'methods': function() {
339 return this._methods; 336 return this._methods;
340 }, 337 },
341 338
342 'methodResults': function() { 339 'methodResults': function() {
343 return this._methodResults; 340 return this._methodResults;
344 }, 341 },
345 342
346 //----------------------------------------------------------------------------- 343 //-----------------------------------------------------------------------------
347 344
348 'result': function() { 345 'result': function() {
349 return this._result; 346 return this._result;
350 }, 347 },
351 348
352 //----------------------------------------------------------------------------- 349 //-----------------------------------------------------------------------------
353 350
354 'numberOfMethodsDone':function() { 351 'numberOfMethodsDone':function() {
355 return this._numberOfMethodsDone; 352 return this._numberOfMethodsDone;
356 }, 353 },
357 354
358 'incrementNumberOfMethodsDone': function() { 355 'incrementNumberOfMethodsDone': function() {
359 this._numberOfMethodsDone ++; 356 this._numberOfMethodsDone ++;
360 }, 357 },
361 358
362 //----------------------------------------------------------------------------- 359 //-----------------------------------------------------------------------------
363 360
364 'run': function(args, aValue) { 361 'run': function(args, aValue) {
365 var deferredResults; 362 var deferredResults;
366 var i, c; 363 var i, c;
367 364
368 deferredResults = []; 365 deferredResults = [];
369 args = args || {}; 366 args = args || {};
370 367
371 c = this.methods().length; 368 c = this.methods().length;
372 for (i=0; i<c; i++) { 369 for (i=0; i<c; i++) {
373 var deferredResult; 370 var deferredResult;
374 varmethodCalls; 371 varmethodCalls;
375 var ii, cc; 372 var ii, cc;
376 373
377//console.log("TYPEOF", typeof(this.methods()[i])); 374//console.log("TYPEOF", typeof(this.methods()[i]));
378 if (typeof(this.methods()[i]) == 'function') { 375 if (typeof(this.methods()[i]) == 'function') {
379 methodCalls = [ this.methods()[i] ]; 376 methodCalls = [ this.methods()[i] ];
380 } else { 377 } else {
381 methodCalls = this.methods()[i]; 378 methodCalls = this.methods()[i];
382 } 379 }
383 380
384 cc = methodCalls.length; 381 cc = methodCalls.length;
385 deferredResult = new Clipperz.Async.Deferred("Clipperz.Async.DeferredSynchronizer.run => " + this.name() + "[" + i + "]", args); 382 deferredResult = new Clipperz.Async.Deferred("Clipperz.Async.DeferredSynchronizer.run => " + this.name() + "[" + i + "]", args);
386 for (ii=0; ii<cc; ii++) { 383 for (ii=0; ii<cc; ii++) {
387 deferredResult.addCallback(methodCalls[ii]); 384 deferredResult.addCallback(methodCalls[ii]);
388 } 385 }
389 deferredResult.addBoth(MochiKit.Base.method(this, 'handleMethodCallDone', i)); 386 deferredResult.addBoth(MochiKit.Base.method(this, 'handleMethodCallDone', i));
390 387
391 deferredResults.push(deferredResult); 388 deferredResults.push(deferredResult);
392 } 389 }
393 390
394 for (i=0; i<c; i++) { 391 for (i=0; i<c; i++) {
395 deferredResults[i].callback(aValue); 392 deferredResults[i].callback(aValue);
396 } 393 }
397 394
398 return this.result(); 395 return this.result();
399 }, 396 },
400 397
401 //----------------------------------------------------------------------------- 398 //-----------------------------------------------------------------------------
402 399
403 'handleMethodCallDone': function(anIndexValue, aResult) { 400 'handleMethodCallDone': function(anIndexValue, aResult) {
404 this.incrementNumberOfMethodsDone(); 401 this.incrementNumberOfMethodsDone();
405 this.methodResults()[anIndexValue] = aResult; 402 this.methodResults()[anIndexValue] = aResult;
406 403
407 if (this.numberOfMethodsDone() < this.methods().length) { 404 if (this.numberOfMethodsDone() < this.methods().length) {
408 //nothing to do here other than possibly log something 405 //nothing to do here other than possibly log something
diff --git a/frontend/gamma/js/Clipperz/Base.js b/frontend/gamma/js/Clipperz/Base.js
index 7f321ef..76b2c3f 100644
--- a/frontend/gamma/js/Clipperz/Base.js
+++ b/frontend/gamma/js/Clipperz/Base.js
@@ -1,408 +1,405 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
30if (typeof(Clipperz.Base) == 'undefined') { Clipperz.Base = {}; } 27if (typeof(Clipperz.Base) == 'undefined') { Clipperz.Base = {}; }
31 28
32Clipperz.Base.VERSION = "0.2"; 29Clipperz.Base.VERSION = "0.2";
33Clipperz.Base.NAME = "Clipperz.Base"; 30Clipperz.Base.NAME = "Clipperz.Base";
34 31
35MochiKit.Base.update(Clipperz.Base, { 32MochiKit.Base.update(Clipperz.Base, {
36 33
37 //------------------------------------------------------------------------- 34 //-------------------------------------------------------------------------
38 35
39 '__repr__': function () { 36 '__repr__': function () {
40 return "[" + this.NAME + " " + this.VERSION + "]"; 37 return "[" + this.NAME + " " + this.VERSION + "]";
41 }, 38 },
42 39
43 //------------------------------------------------------------------------- 40 //-------------------------------------------------------------------------
44 41
45 'toString': function () { 42 'toString': function () {
46 return this.__repr__(); 43 return this.__repr__();
47 }, 44 },
48 45
49 //------------------------------------------------------------------------- 46 //-------------------------------------------------------------------------
50 47
51 'itemgetter': function (aKeyPath) { 48 'itemgetter': function (aKeyPath) {
52 // return MochiKit.Base.compose.apply(null, [MochiKit.Base.itemgetter('key3')]); 49 // return MochiKit.Base.compose.apply(null, [MochiKit.Base.itemgetter('key3')]);
53 return MochiKit.Base.compose.apply(null, 50 return MochiKit.Base.compose.apply(null,
54 MochiKit.Base.map( 51 MochiKit.Base.map(
55 MochiKit.Base.itemgetter, 52 MochiKit.Base.itemgetter,
56 MochiKit.Iter.reversed( 53 MochiKit.Iter.reversed(
57 aKeyPath.split('.') 54 aKeyPath.split('.')
58 ) 55 )
59 ) 56 )
60 ); 57 );
61 }, 58 },
62 59
63 //------------------------------------------------------------------------- 60 //-------------------------------------------------------------------------
64 61
65 'isUrl': function (aValue) { 62 'isUrl': function (aValue) {
66 return (MochiKit.Base.urlRegExp.test(aValue)); 63 return (MochiKit.Base.urlRegExp.test(aValue));
67 }, 64 },
68 65
69 'isEmail': function (aValue) { 66 'isEmail': function (aValue) {
70 return (MochiKit.Base.emailRegExp.test(aValue)); 67 return (MochiKit.Base.emailRegExp.test(aValue));
71 }, 68 },
72 69
73 //------------------------------------------------------------------------- 70 //-------------------------------------------------------------------------
74 71
75 'caseInsensitiveCompare': function (a, b) { 72 'caseInsensitiveCompare': function (a, b) {
76 return MochiKit.Base.compare(a.toLowerCase(), b.toLowerCase()); 73 return MochiKit.Base.compare(a.toLowerCase(), b.toLowerCase());
77 }, 74 },
78 75
79 'reverseComparator': function (aComparator) { 76 'reverseComparator': function (aComparator) {
80 return MochiKit.Base.compose(function(aResult) { return -aResult; }, aComparator); 77 return MochiKit.Base.compose(function(aResult) { return -aResult; }, aComparator);
81 }, 78 },
82 79
83 //------------------------------------------------------------------------- 80 //-------------------------------------------------------------------------
84/* 81/*
85 'dependsOn': function(module, deps) { 82 'dependsOn': function(module, deps) {
86 if (!(module in Clipperz)) { 83 if (!(module in Clipperz)) {
87 MochiKit[module] = {}; 84 MochiKit[module] = {};
88 } 85 }
89 86
90 if (typeof(dojo) != 'undefined') { 87 if (typeof(dojo) != 'undefined') {
91 dojo.provide('Clipperz.' + module); 88 dojo.provide('Clipperz.' + module);
92 } 89 }
93 for (var i = 0; i < deps.length; i++) { 90 for (var i = 0; i < deps.length; i++) {
94 if (typeof(dojo) != 'undefined') { 91 if (typeof(dojo) != 'undefined') {
95 dojo.require('Clipperz.' + deps[i]); 92 dojo.require('Clipperz.' + deps[i]);
96 } 93 }
97 if (typeof(JSAN) != 'undefined') { 94 if (typeof(JSAN) != 'undefined') {
98 JSAN.use('Clipperz.' + deps[i], []); 95 JSAN.use('Clipperz.' + deps[i], []);
99 } 96 }
100 if (!(deps[i] in Clipperz)) { 97 if (!(deps[i] in Clipperz)) {
101 throw 'Clipperz.' + module + ' depends on Clipperz.' + deps[i] + '!' 98 throw 'Clipperz.' + module + ' depends on Clipperz.' + deps[i] + '!'
102 } 99 }
103 } 100 }
104 }, 101 },
105*/ 102*/
106 //------------------------------------------------------------------------- 103 //-------------------------------------------------------------------------
107 104
108 'trim': function (aValue) { 105 'trim': function (aValue) {
109 return aValue.replace(/^\s+|\s+$/g, ""); 106 return aValue.replace(/^\s+|\s+$/g, "");
110 }, 107 },
111 108
112 //------------------------------------------------------------------------- 109 //-------------------------------------------------------------------------
113 110
114 'stringToByteArray': function (aValue) { 111 'stringToByteArray': function (aValue) {
115 varresult; 112 varresult;
116 var i, c; 113 var i, c;
117 114
118 result = []; 115 result = [];
119 116
120 c = aValue.length; 117 c = aValue.length;
121 for (i=0; i<c; i++) { 118 for (i=0; i<c; i++) {
122 result[i] = aValue.charCodeAt(i); 119 result[i] = aValue.charCodeAt(i);
123 } 120 }
124 121
125 return result; 122 return result;
126 }, 123 },
127 124
128 //......................................................................... 125 //.........................................................................
129 126
130 'byteArrayToString': function (anArrayOfBytes) { 127 'byteArrayToString': function (anArrayOfBytes) {
131 varresult; 128 varresult;
132 var i, c; 129 var i, c;
133 130
134 result = ""; 131 result = "";
135 132
136 c = anArrayOfBytes.length; 133 c = anArrayOfBytes.length;
137 for (i=0; i<c; i++) { 134 for (i=0; i<c; i++) {
138 result += String.fromCharCode(anArrayOfBytes[i]); 135 result += String.fromCharCode(anArrayOfBytes[i]);
139 } 136 }
140 137
141 return result; 138 return result;
142 }, 139 },
143 140
144 //------------------------------------------------------------------------- 141 //-------------------------------------------------------------------------
145 142
146 'getValueForKeyInFormContent': function (aFormContent, aKey) { 143 'getValueForKeyInFormContent': function (aFormContent, aKey) {
147 return aFormContent[1][MochiKit.Base.find(aFormContent[0], aKey)]; 144 return aFormContent[1][MochiKit.Base.find(aFormContent[0], aKey)];
148 }, 145 },
149 146
150 //------------------------------------------------------------------------- 147 //-------------------------------------------------------------------------
151 148
152 'indexOfObjectInArray': function(anObject, anArray) { 149 'indexOfObjectInArray': function(anObject, anArray) {
153 varresult; 150 varresult;
154 vari, c; 151 vari, c;
155 152
156 result = -1; 153 result = -1;
157 154
158 c = anArray.length; 155 c = anArray.length;
159 for (i=0; ((i<c) && (result < 0)); i++) { 156 for (i=0; ((i<c) && (result < 0)); i++) {
160 if (anArray[i] === anObject) { 157 if (anArray[i] === anObject) {
161 result = i; 158 result = i;
162 } 159 }
163 } 160 }
164 161
165 return result; 162 return result;
166 }, 163 },
167 164
168 //------------------------------------------------------------------------- 165 //-------------------------------------------------------------------------
169 166
170 'removeObjectAtIndexFromArray': function(anIndex, anArray) { 167 'removeObjectAtIndexFromArray': function(anIndex, anArray) {
171 anArray.splice(anIndex, 1); 168 anArray.splice(anIndex, 1);
172 }, 169 },
173 170
174 //------------------------------------------------------------------------- 171 //-------------------------------------------------------------------------
175 172
176 'removeObjectFromArray': function(anObject, anArray) { 173 'removeObjectFromArray': function(anObject, anArray) {
177 varobjectIndex; 174 varobjectIndex;
178 175
179 objectIndex = Clipperz.Base.indexOfObjectInArray(anObject, anArray); 176 objectIndex = Clipperz.Base.indexOfObjectInArray(anObject, anArray);
180 if (objectIndex > -1) { 177 if (objectIndex > -1) {
181 Clipperz.Base.removeObjectAtIndexFromArray(objectIndex, anArray); 178 Clipperz.Base.removeObjectAtIndexFromArray(objectIndex, anArray);
182 } else { 179 } else {
183 Clipperz.log("Trying to remove an object not present in the array"); 180 Clipperz.log("Trying to remove an object not present in the array");
184 throw Clipperz.Base.exception.ObjectNotFound; 181 throw Clipperz.Base.exception.ObjectNotFound;
185 } 182 }
186 }, 183 },
187 184
188 'removeFromArray': function(anArray, anObject) { 185 'removeFromArray': function(anArray, anObject) {
189 return Clipperz.Base.removeObjectFromArray(anObject, anArray); 186 return Clipperz.Base.removeObjectFromArray(anObject, anArray);
190 }, 187 },
191 188
192 //------------------------------------------------------------------------- 189 //-------------------------------------------------------------------------
193 190
194 'splitStringAtFixedTokenSize': function(aString, aTokenSize) { 191 'splitStringAtFixedTokenSize': function(aString, aTokenSize) {
195 var result; 192 var result;
196 varstringToProcess; 193 varstringToProcess;
197 194
198 stringToProcess = aString; 195 stringToProcess = aString;
199 result = []; 196 result = [];
200 if (stringToProcess != null) { 197 if (stringToProcess != null) {
201 while (stringToProcess.length > aTokenSize) { 198 while (stringToProcess.length > aTokenSize) {
202 result.push(stringToProcess.substring(0, aTokenSize)); 199 result.push(stringToProcess.substring(0, aTokenSize));
203 stringToProcess = stringToProcess.substring(aTokenSize); 200 stringToProcess = stringToProcess.substring(aTokenSize);
204 } 201 }
205 202
206 result.push(stringToProcess); 203 result.push(stringToProcess);
207 } 204 }
208 205
209 return result; 206 return result;
210 }, 207 },
211 208
212 //------------------------------------------------------------------------- 209 //-------------------------------------------------------------------------
213 210
214 'objectType': function(anObject) { 211 'objectType': function(anObject) {
215 var result; 212 var result;
216 213
217 if (anObject == null) { 214 if (anObject == null) {
218 result = null; 215 result = null;
219 } else { 216 } else {
220 result = typeof(anObject); 217 result = typeof(anObject);
221 218
222 if (result == "object") { 219 if (result == "object") {
223 if (anObject instanceof Array) { 220 if (anObject instanceof Array) {
224 result = 'array' 221 result = 'array'
225 } else if (anObject.constructor == Boolean) { 222 } else if (anObject.constructor == Boolean) {
226 result = 'boolean' 223 result = 'boolean'
227 } else if (anObject instanceof Date) { 224 } else if (anObject instanceof Date) {
228 result = 'date' 225 result = 'date'
229 } else if (anObject instanceof Error) { 226 } else if (anObject instanceof Error) {
230 result = 'error' 227 result = 'error'
231 } else if (anObject instanceof Function) { 228 } else if (anObject instanceof Function) {
232 result = 'function' 229 result = 'function'
233 } else if (anObject.constructor == Number) { 230 } else if (anObject.constructor == Number) {
234 result = 'number' 231 result = 'number'
235 } else if (anObject.constructor == String) { 232 } else if (anObject.constructor == String) {
236 result = 'string' 233 result = 'string'
237 } else if (anObject instanceof Object) { 234 } else if (anObject instanceof Object) {
238 result = 'object' 235 result = 'object'
239 } else { 236 } else {
240 throw Clipperz.Base.exception.UnknownType; 237 throw Clipperz.Base.exception.UnknownType;
241 } 238 }
242 } 239 }
243 } 240 }
244 241
245 return result; 242 return result;
246 }, 243 },
247 244
248 //------------------------------------------------------------------------- 245 //-------------------------------------------------------------------------
249 246
250 'escapeHTML': function(aValue) { 247 'escapeHTML': function(aValue) {
251 var result; 248 var result;
252 249
253 result = aValue; 250 result = aValue;
254 result = result.replace(/</g, "&lt;"); 251 result = result.replace(/</g, "&lt;");
255 result = result.replace(/>/g, "&gt;"); 252 result = result.replace(/>/g, "&gt;");
256 253
257 return result; 254 return result;
258 }, 255 },
259 256
260 //------------------------------------------------------------------------- 257 //-------------------------------------------------------------------------
261 258
262 'deepClone': function(anObject) { 259 'deepClone': function(anObject) {
263 var result; 260 var result;
264 261
265 result = Clipperz.Base.evalJSON(Clipperz.Base.serializeJSON(anObject)); 262 result = Clipperz.Base.evalJSON(Clipperz.Base.serializeJSON(anObject));
266 263
267 return result; 264 return result;
268 }, 265 },
269 266
270 //------------------------------------------------------------------------- 267 //-------------------------------------------------------------------------
271 268
272 //'deepCompare': function (aObject, bObject) { 269 //'deepCompare': function (aObject, bObject) {
273 // return (Clipperz.Base.serializeJSON(aObject) == Clipperz.Base.serializeJSON(bObject)); 270 // return (Clipperz.Base.serializeJSON(aObject) == Clipperz.Base.serializeJSON(bObject));
274 //}, 271 //},
275 272
276 //------------------------------------------------------------------------- 273 //-------------------------------------------------------------------------
277 274
278 'evalJSON': function(aString) { 275 'evalJSON': function(aString) {
279 return JSON.parse(aString); 276 return JSON.parse(aString);
280 }, 277 },
281 278
282 'serializeJSON': function(anObject) { 279 'serializeJSON': function(anObject) {
283 return JSON.stringify(anObject); 280 return JSON.stringify(anObject);
284 }, 281 },
285 282
286 'formatJSON': function (anObject, sIndent) { 283 'formatJSON': function (anObject, sIndent) {
287 var realTypeOf = function (v) { 284 var realTypeOf = function (v) {
288 if (typeof(v) == "object") { 285 if (typeof(v) == "object") {
289 if (v === null) return "null"; 286 if (v === null) return "null";
290 if (v.constructor == (new Array).constructor) return "array"; 287 if (v.constructor == (new Array).constructor) return "array";
291 if (v.constructor == (new Date).constructor) return "date"; 288 if (v.constructor == (new Date).constructor) return "date";
292 if (v.constructor == (new RegExp).constructor) return "regex"; 289 if (v.constructor == (new RegExp).constructor) return "regex";
293 return "object"; 290 return "object";
294 } 291 }
295 return typeof(v); 292 return typeof(v);
296 }; 293 };
297 294
298 //function FormatJSON(oData, sIndent) { 295 //function FormatJSON(oData, sIndent) {
299 if (arguments.length < 2) { 296 if (arguments.length < 2) {
300 var sIndent = ""; 297 var sIndent = "";
301 } 298 }
302 // var sIndentStyle = " "; 299 // var sIndentStyle = " ";
303 var sIndentStyle = " "; 300 var sIndentStyle = " ";
304 var sDataType = realTypeOf(anObject); 301 var sDataType = realTypeOf(anObject);
305 302
306 // open object 303 // open object
307 if (sDataType == "array") { 304 if (sDataType == "array") {
308 if (anObject.length == 0) { 305 if (anObject.length == 0) {
309 return "[]"; 306 return "[]";
310 } 307 }
311 var sHTML = "["; 308 var sHTML = "[";
312 } else if (sDataType == "object") { 309 } else if (sDataType == "object") {
313 var sHTML = "{"; 310 var sHTML = "{";
314 } else { 311 } else {
315 return "{}"; 312 return "{}";
316 } 313 }
317 // } else { 314 // } else {
318 // var iCount = 0; 315 // var iCount = 0;
319 // $.each(anObject, function() { 316 // $.each(anObject, function() {
320 // iCount++; 317 // iCount++;
321 // return; 318 // return;
322 // }); 319 // });
323 // if (iCount == 0) { // object is empty 320 // if (iCount == 0) { // object is empty
324 // return "{}"; 321 // return "{}";
325 // } 322 // }
326 // var sHTML = "{"; 323 // var sHTML = "{";
327 // } 324 // }
328 325
329 // loop through items 326 // loop through items
330 var iCount = 0; 327 var iCount = 0;
331 // $.each(anObject, function(sKey, vValue) { 328 // $.each(anObject, function(sKey, vValue) {
332 MochiKit.Iter.forEach(MochiKit.Base.keys(anObject), function(sKey) { 329 MochiKit.Iter.forEach(MochiKit.Base.keys(anObject), function(sKey) {
333 var vValue = anObject[sKey]; 330 var vValue = anObject[sKey];
334 331
335 if (iCount > 0) { 332 if (iCount > 0) {
336 sHTML += ","; 333 sHTML += ",";
337 } 334 }
338 if (sDataType == "array") { 335 if (sDataType == "array") {
339 sHTML += ("\n" + sIndent + sIndentStyle); 336 sHTML += ("\n" + sIndent + sIndentStyle);
340 } else { 337 } else {
341 sHTML += ("\n" + sIndent + sIndentStyle + "\"" + sKey + "\"" + ": "); 338 sHTML += ("\n" + sIndent + sIndentStyle + "\"" + sKey + "\"" + ": ");
342 } 339 }
343 340
344 // display relevant data type 341 // display relevant data type
345 switch (realTypeOf(vValue)) { 342 switch (realTypeOf(vValue)) {
346 case "array": 343 case "array":
347 case "object": 344 case "object":
348 sHTML += Clipperz.Base.formatJSON(vValue, (sIndent + sIndentStyle)); 345 sHTML += Clipperz.Base.formatJSON(vValue, (sIndent + sIndentStyle));
349 break; 346 break;
350 case "boolean": 347 case "boolean":
351 case "number": 348 case "number":
352 sHTML += vValue.toString(); 349 sHTML += vValue.toString();
353 break; 350 break;
354 case "null": 351 case "null":
355 sHTML += "null"; 352 sHTML += "null";
356 break; 353 break;
357 case "string": 354 case "string":
358 sHTML += ("\"" + vValue + "\""); 355 sHTML += ("\"" + vValue + "\"");
359 break; 356 break;
360 default: 357 default:
361 sHTML += ("TYPEOF: " + typeof(vValue)); 358 sHTML += ("TYPEOF: " + typeof(vValue));
362 } 359 }
363 360
364 // loop 361 // loop
365 iCount++; 362 iCount++;
366 }); 363 });
367 364
368 // close object 365 // close object
369 if (sDataType == "array") { 366 if (sDataType == "array") {
370 sHTML += ("\n" + sIndent + "]"); 367 sHTML += ("\n" + sIndent + "]");
371 } else { 368 } else {
372 sHTML += ("\n" + sIndent + "}"); 369 sHTML += ("\n" + sIndent + "}");
373 } 370 }
374 371
375 // return 372 // return
376 return sHTML; 373 return sHTML;
377 }, 374 },
378 375
379 //------------------------------------------------------------------------- 376 //-------------------------------------------------------------------------
380 377
381 'mergeItems': function (anArrayOfValues) { 378 'mergeItems': function (anArrayOfValues) {
382 var result; 379 var result;
383 var i, c; 380 var i, c;
384 381
385 result = {}; 382 result = {};
386 383
387 c = anArrayOfValues.length; 384 c = anArrayOfValues.length;
388 for (i=0; i<c; i++) { 385 for (i=0; i<c; i++) {
389 result[anArrayOfValues[i][0]] = anArrayOfValues[i][1]; 386 result[anArrayOfValues[i][0]] = anArrayOfValues[i][1];
390 } 387 }
391 388
392 return result; 389 return result;
393 }, 390 },
394 391
395 //------------------------------------------------------------------------- 392 //-------------------------------------------------------------------------
396 393
397 'map': function (fn, lstObj/*, lst... */) { 394 'map': function (fn, lstObj/*, lst... */) {
398 var result; 395 var result;
399 396
400 if (MochiKit.Base.isArrayLike(lstObj)) { 397 if (MochiKit.Base.isArrayLike(lstObj)) {
401 result = MochiKit.Base.map.apply(this, arguments); 398 result = MochiKit.Base.map.apply(this, arguments);
402 } else { 399 } else {
403 varkeys; 400 varkeys;
404 var values; 401 var values;
405 var computedValues; 402 var computedValues;
406 403
407 keys = MochiKit.Base.keys(lstObj); 404 keys = MochiKit.Base.keys(lstObj);
408 values = MochiKit.Base.values(lstObj); 405 values = MochiKit.Base.values(lstObj);
diff --git a/frontend/gamma/js/Clipperz/ByteArray.js b/frontend/gamma/js/Clipperz/ByteArray.js
index 86136c8..ae586e7 100644
--- a/frontend/gamma/js/Clipperz/ByteArray.js
+++ b/frontend/gamma/js/Clipperz/ByteArray.js
@@ -1,408 +1,405 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
30 27
31//============================================================================= 28//=============================================================================
32 29
33Clipperz.ByteArray_abstract = function(args) { 30Clipperz.ByteArray_abstract = function(args) {
34 return this; 31 return this;
35} 32}
36 33
37Clipperz.ByteArray_abstract.prototype = MochiKit.Base.update(null, { 34Clipperz.ByteArray_abstract.prototype = MochiKit.Base.update(null, {
38 35
39 //------------------------------------------------------------------------- 36 //-------------------------------------------------------------------------
40 37
41 'toString': function() { 38 'toString': function() {
42 return "Clipperz.ByteArray_abstract"; 39 return "Clipperz.ByteArray_abstract";
43 }, 40 },
44 41
45 //------------------------------------------------------------------------- 42 //-------------------------------------------------------------------------
46 43
47 'equals': function(aValue) { 44 'equals': function(aValue) {
48 return (this.compare(aValue) == 0); 45 return (this.compare(aValue) == 0);
49 }, 46 },
50 47
51 //------------------------------------------------------------------------- 48 //-------------------------------------------------------------------------
52 49
53 'compare': function(aValue) { 50 'compare': function(aValue) {
54 var result; 51 var result;
55 var i; 52 var i;
56 53
57 result = MochiKit.Base.compare(this.length(), aValue.length()); 54 result = MochiKit.Base.compare(this.length(), aValue.length());
58 i = this.length(); 55 i = this.length();
59 56
60 while ((result == 0) && (i>0)) { 57 while ((result == 0) && (i>0)) {
61 i--; 58 i--;
62 result = MochiKit.Base.compare(this.byteAtIndex(i), aValue.byteAtIndex(i)); 59 result = MochiKit.Base.compare(this.byteAtIndex(i), aValue.byteAtIndex(i));
63 } 60 }
64 61
65 return result; 62 return result;
66 }, 63 },
67 64
68 //------------------------------------------------------------------------- 65 //-------------------------------------------------------------------------
69 66
70 'clone': function() { 67 'clone': function() {
71 throw Clipperz.Base.exception.AbstractMethod; 68 throw Clipperz.Base.exception.AbstractMethod;
72 }, 69 },
73 70
74 //------------------------------------------------------------------------- 71 //-------------------------------------------------------------------------
75 72
76 'newInstance': function() { 73 'newInstance': function() {
77 throw Clipperz.Base.exception.AbstractMethod; 74 throw Clipperz.Base.exception.AbstractMethod;
78 }, 75 },
79 76
80 //------------------------------------------------------------------------- 77 //-------------------------------------------------------------------------
81 78
82 'reset': function() { 79 'reset': function() {
83 throw Clipperz.Base.exception.AbstractMethod; 80 throw Clipperz.Base.exception.AbstractMethod;
84 }, 81 },
85 82
86 //------------------------------------------------------------------------- 83 //-------------------------------------------------------------------------
87 84
88 'length': function() { 85 'length': function() {
89 throw Clipperz.Base.exception.AbstractMethod; 86 throw Clipperz.Base.exception.AbstractMethod;
90 }, 87 },
91 88
92 //------------------------------------------------------------------------- 89 //-------------------------------------------------------------------------
93 90
94 'checkByteValue': function(aValue) { 91 'checkByteValue': function(aValue) {
95//Clipperz.log("aValue", aValue.toString(16)); 92//Clipperz.log("aValue", aValue.toString(16));
96//Clipperz.log("(aValue & 0xff)", (aValue & 0xff).toString(16)); 93//Clipperz.log("(aValue & 0xff)", (aValue & 0xff).toString(16));
97 94
98 if ((aValue & 0xff) != aValue) { 95 if ((aValue & 0xff) != aValue) {
99 MochiKit.Logging.logError("Clipperz.ByteArray.appendByte: the provided value (0x" + aValue.toString(16) + ") is not a byte value."); 96 MochiKit.Logging.logError("Clipperz.ByteArray.appendByte: the provided value (0x" + aValue.toString(16) + ") is not a byte value.");
100 throw Clipperz.ByteArray.exception.InvalidValue; 97 throw Clipperz.ByteArray.exception.InvalidValue;
101 } 98 }
102 }, 99 },
103 100
104 //------------------------------------------------------------------------- 101 //-------------------------------------------------------------------------
105 102
106 'xorMergeWithBlock': function(aBlock, anAllignment, paddingMode) { 103 'xorMergeWithBlock': function(aBlock, anAllignment, paddingMode) {
107 var result; 104 var result;
108 var a, b; 105 var a, b;
109 var aLength; 106 var aLength;
110 var bLength; 107 var bLength;
111 var i, c; 108 var i, c;
112 109
113 if (this.length() > aBlock.length()) { 110 if (this.length() > aBlock.length()) {
114 a = this; 111 a = this;
115 b = aBlock; 112 b = aBlock;
116 } else { 113 } else {
117 a = aBlock; 114 a = aBlock;
118 b = this; 115 b = this;
119 } 116 }
120 117
121 aLength = a.length(); 118 aLength = a.length();
122 bLength = b.length(); 119 bLength = b.length();
123 120
124 if (aLength != bLength) { 121 if (aLength != bLength) {
125 if (paddingMode == 'truncate') { 122 if (paddingMode == 'truncate') {
126 if (anAllignment == 'left') { 123 if (anAllignment == 'left') {
127 a = a.split(0, bLength); 124 a = a.split(0, bLength);
128 } else { 125 } else {
129 a = a.split(aLength - bLength); 126 a = a.split(aLength - bLength);
130 } 127 }
131 } else { 128 } else {
132 var ii, cc; 129 var ii, cc;
133 var padding; 130 var padding;
134 131
135 // padding = new Clipperz.ByteArray(); 132 // padding = new Clipperz.ByteArray();
136 padding = this.newInstance(); 133 padding = this.newInstance();
137 cc = aLength - bLength; 134 cc = aLength - bLength;
138 for (ii=0; ii<cc; ii++) { 135 for (ii=0; ii<cc; ii++) {
139 padding.appendByte(0); 136 padding.appendByte(0);
140 } 137 }
141 138
142 if (anAllignment == 'left') { 139 if (anAllignment == 'left') {
143 b = b.appendBlock(padding); 140 b = b.appendBlock(padding);
144 } else { 141 } else {
145 b = padding.appendBlock(b); 142 b = padding.appendBlock(b);
146 } 143 }
147 } 144 }
148 } 145 }
149 146
150 147
151 // result = new Clipperz.ByteArray(); 148 // result = new Clipperz.ByteArray();
152 result = this.newInstance(); 149 result = this.newInstance();
153 c = a.length(); 150 c = a.length();
154 for (i=0; i<c; i++) { 151 for (i=0; i<c; i++) {
155 result.appendByte(a.byteAtIndex(i) ^ b.byteAtIndex(i)); 152 result.appendByte(a.byteAtIndex(i) ^ b.byteAtIndex(i));
156 } 153 }
157 154
158 return result; 155 return result;
159 }, 156 },
160 157
161 //------------------------------------------------------------------------- 158 //-------------------------------------------------------------------------
162/* 159/*
163 'shiftLeft': function(aNumberOfBitsToShift) { 160 'shiftLeft': function(aNumberOfBitsToShift) {
164 var result; 161 var result;
165 162
166 result = this.clone(); //??????????? 163 result = this.clone(); //???????????
167 164
168 return result; 165 return result;
169 }, 166 },
170 */ 167 */
171 //------------------------------------------------------------------------- 168 //-------------------------------------------------------------------------
172 169
173 'appendBlock': function(aBlock) { 170 'appendBlock': function(aBlock) {
174 throw Clipperz.Base.exception.AbstractMethod; 171 throw Clipperz.Base.exception.AbstractMethod;
175 }, 172 },
176 173
177 //------------------------------------------------------------------------- 174 //-------------------------------------------------------------------------
178 175
179 'appendByte': function(aValue) { 176 'appendByte': function(aValue) {
180 throw Clipperz.Base.exception.AbstractMethod; 177 throw Clipperz.Base.exception.AbstractMethod;
181 }, 178 },
182 179
183 'appendBytes': function(args) { 180 'appendBytes': function(args) {
184 varvalues; 181 varvalues;
185 vari,c; 182 vari,c;
186 183
187 if (args.constructor == Array) { 184 if (args.constructor == Array) {
188 values = args; 185 values = args;
189 } else { 186 } else {
190 values = arguments; 187 values = arguments;
191 } 188 }
192 189
193 c = values.length; 190 c = values.length;
194 for (i=0; i<c; i++) { 191 for (i=0; i<c; i++) {
195 this.appendByte(values[i]); 192 this.appendByte(values[i]);
196 } 193 }
197 194
198 return this; 195 return this;
199 }, 196 },
200 197
201 //------------------------------------------------------------------------- 198 //-------------------------------------------------------------------------
202 199
203 'appendWord': function(aValue, isLittleEndian) { 200 'appendWord': function(aValue, isLittleEndian) {
204 var result; 201 var result;
205 var processAsLittleEndian; 202 var processAsLittleEndian;
206 203
207 processAsLittleEndian = isLittleEndian === true ? true : false; 204 processAsLittleEndian = isLittleEndian === true ? true : false;
208 205
209 if (processAsLittleEndian) { 206 if (processAsLittleEndian) {
210 result = this.appendBytes( (aValue) & 0xff, (aValue >> 8) & 0xff, (aValue >> 16) & 0xff, (aValue >> 24) & 0xff ); //little endian 207 result = this.appendBytes( (aValue) & 0xff, (aValue >> 8) & 0xff, (aValue >> 16) & 0xff, (aValue >> 24) & 0xff ); //little endian
211 } else { 208 } else {
212 result = this.appendBytes( (aValue >> 24) & 0xff, (aValue >> 16) & 0xff, (aValue >> 8) & 0xff, (aValue) & 0xff ); //big endian - DEFAULT 209 result = this.appendBytes( (aValue >> 24) & 0xff, (aValue >> 16) & 0xff, (aValue >> 8) & 0xff, (aValue) & 0xff ); //big endian - DEFAULT
213 } 210 }
214 211
215 return result; 212 return result;
216 }, 213 },
217 214
218 'appendWords': function(args) { 215 'appendWords': function(args) {
219 varvalues; 216 varvalues;
220 vari,c; 217 vari,c;
221 218
222 if (args.constructor == Array) { 219 if (args.constructor == Array) {
223 values = args; 220 values = args;
224 } else { 221 } else {
225 values = arguments; 222 values = arguments;
226 } 223 }
227 224
228 c = values.length; 225 c = values.length;
229 for (i=0; i<c; i++) { 226 for (i=0; i<c; i++) {
230 this.appendWord(values[i], false); 227 this.appendWord(values[i], false);
231 } 228 }
232 229
233 return this; 230 return this;
234 }, 231 },
235 232
236 //------------------------------------------------------------------------- 233 //-------------------------------------------------------------------------
237 234
238 'appendBigEndianWords': function(args) { 235 'appendBigEndianWords': function(args) {
239 varvalues; 236 varvalues;
240 vari,c; 237 vari,c;
241 238
242 if (args.constructor == Array) { 239 if (args.constructor == Array) {
243 values = args; 240 values = args;
244 } else { 241 } else {
245 values = arguments; 242 values = arguments;
246 } 243 }
247 244
248 c = values.length; 245 c = values.length;
249 for (i=0; i<c; i++) { 246 for (i=0; i<c; i++) {
250 this.appendWord(values[i], true); 247 this.appendWord(values[i], true);
251 } 248 }
252 249
253 return this; 250 return this;
254 }, 251 },
255 252
256 //------------------------------------------------------------------------- 253 //-------------------------------------------------------------------------
257 254
258 'appendBinaryString': function (aBinaryString) { 255 'appendBinaryString': function (aBinaryString) {
259 var i,c; 256 var i,c;
260 257
261 c = aBinaryString.length; 258 c = aBinaryString.length;
262 for (i=0; i<c; i++) { 259 for (i=0; i<c; i++) {
263 this.appendByte(aBinaryString.charCodeAt(i)); 260 this.appendByte(aBinaryString.charCodeAt(i));
264 }; 261 };
265 262
266 return this; 263 return this;
267 }, 264 },
268 265
269 //------------------------------------------------------------------------- 266 //-------------------------------------------------------------------------
270 267
271 'byteAtIndex': function(anIndex) { 268 'byteAtIndex': function(anIndex) {
272 throw Clipperz.Base.exception.AbstractMethod; 269 throw Clipperz.Base.exception.AbstractMethod;
273 }, 270 },
274 271
275 'setByteAtIndex': function(aValue, anIndex) { 272 'setByteAtIndex': function(aValue, anIndex) {
276 throw Clipperz.Base.exception.AbstractMethod; 273 throw Clipperz.Base.exception.AbstractMethod;
277 }, 274 },
278 275
279 //------------------------------------------------------------------------- 276 //-------------------------------------------------------------------------
280 277
281 'bitAtIndex': function(aBitPosition) { 278 'bitAtIndex': function(aBitPosition) {
282 var result; 279 var result;
283 varbytePosition; 280 varbytePosition;
284 var bitPositionInSelectedByte; 281 var bitPositionInSelectedByte;
285 var selectedByte; 282 var selectedByte;
286 var selectedByteMask; 283 var selectedByteMask;
287 284
288 bytePosition = this.length() - Math.ceil((aBitPosition + 1)/ 8); 285 bytePosition = this.length() - Math.ceil((aBitPosition + 1)/ 8);
289 bitPositionInSelectedByte = aBitPosition % 8; 286 bitPositionInSelectedByte = aBitPosition % 8;
290 selectedByte = this.byteAtIndex(bytePosition); 287 selectedByte = this.byteAtIndex(bytePosition);
291 288
292 if (bitPositionInSelectedByte > 0) { 289 if (bitPositionInSelectedByte > 0) {
293 selectedByteMask = (1 << bitPositionInSelectedByte); 290 selectedByteMask = (1 << bitPositionInSelectedByte);
294 } else { 291 } else {
295 selectedByteMask = 1; 292 selectedByteMask = 1;
296 } 293 }
297 result = selectedByte & selectedByteMask ? 1 : 0; 294 result = selectedByte & selectedByteMask ? 1 : 0;
298//console.log("aBitPosition: " + aBitPosition + ", length: " + this.length() + ", bytePosition: " + bytePosition + ", bitPositionInSelectedByte: " + bitPositionInSelectedByte + ", selectedByteMask: " + selectedByteMask); 295//console.log("aBitPosition: " + aBitPosition + ", length: " + this.length() + ", bytePosition: " + bytePosition + ", bitPositionInSelectedByte: " + bitPositionInSelectedByte + ", selectedByteMask: " + selectedByteMask);
299 296
300 return result; 297 return result;
301 }, 298 },
302 299
303 //------------------------------------------------------------------------- 300 //-------------------------------------------------------------------------
304 301
305 'bitBlockAtIndexWithSize': function(aBitPosition, aSize) { 302 'bitBlockAtIndexWithSize': function(aBitPosition, aSize) {
306 var result; 303 var result;
307 var bitValue; 304 var bitValue;
308 var i,c; 305 var i,c;
309 306
310 result = 0; 307 result = 0;
311 c = aSize; 308 c = aSize;
312 for (i=0; i<c; i++) { 309 for (i=0; i<c; i++) {
313 bitValue = this.bitAtIndex(aBitPosition + i); 310 bitValue = this.bitAtIndex(aBitPosition + i);
314 result = result | bitValue << i; 311 result = result | bitValue << i;
315 } 312 }
316 313
317 return result; 314 return result;
318 }, 315 },
319 316
320 //------------------------------------------------------------------------- 317 //-------------------------------------------------------------------------
321 318
322 'asString': function() { 319 'asString': function() {
323 varresult; 320 varresult;
324 varlength; 321 varlength;
325 vari; 322 vari;
326 323
327//var startTime = new Date(); 324//var startTime = new Date();
328 325
329 //# result = ""; 326 //# result = "";
330 result = []; 327 result = [];
331 328
332 i = 0; 329 i = 0;
333 length = this.length(); 330 length = this.length();
334 331
335 while (i < length) { 332 while (i < length) {
336 varcurrentCharacter; 333 varcurrentCharacter;
337 varcurrentByte; 334 varcurrentByte;
338 varunicode; 335 varunicode;
339 336
340 currentByte = this.byteAtIndex(i); 337 currentByte = this.byteAtIndex(i);
341 338
342 if ((currentByte & 0x80) == 0x00 ) { //0xxxxxxx 339 if ((currentByte & 0x80) == 0x00 ) { //0xxxxxxx
343 unicode = currentByte; 340 unicode = currentByte;
344 currentCharacter = String.fromCharCode(unicode); 341 currentCharacter = String.fromCharCode(unicode);
345 } else if ((currentByte & 0xe0) == 0xc0 ) { //110xxxxx 10xxxxxx 342 } else if ((currentByte & 0xe0) == 0xc0 ) { //110xxxxx 10xxxxxx
346 unicode = (currentByte & 0x1f) << 6; 343 unicode = (currentByte & 0x1f) << 6;
347 i++; currentByte = this.byteAtIndex(i); 344 i++; currentByte = this.byteAtIndex(i);
348 unicode = unicode | (currentByte & 0x3f); 345 unicode = unicode | (currentByte & 0x3f);
349 346
350 currentCharacter = String.fromCharCode(unicode); 347 currentCharacter = String.fromCharCode(unicode);
351 } else if ((currentByte & 0xf0) == 0xe0 ) { //1110xxxx 10xxxxxx 10xxxxxx 348 } else if ((currentByte & 0xf0) == 0xe0 ) { //1110xxxx 10xxxxxx 10xxxxxx
352 unicode = (currentByte & 0x0f) << (6+6); 349 unicode = (currentByte & 0x0f) << (6+6);
353 i++; currentByte = this.byteAtIndex(i); 350 i++; currentByte = this.byteAtIndex(i);
354 unicode = unicode | ((currentByte & 0x3f) << 6); 351 unicode = unicode | ((currentByte & 0x3f) << 6);
355 i++; currentByte = this.byteAtIndex(i); 352 i++; currentByte = this.byteAtIndex(i);
356 unicode = unicode | (currentByte & 0x3f); 353 unicode = unicode | (currentByte & 0x3f);
357 354
358 currentCharacter = String.fromCharCode(unicode); 355 currentCharacter = String.fromCharCode(unicode);
359 } else { //11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 356 } else { //11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
360 unicode = (currentByte & 0x07) << (6+6+6); 357 unicode = (currentByte & 0x07) << (6+6+6);
361 i++; currentByte = this.byteAtIndex(i); 358 i++; currentByte = this.byteAtIndex(i);
362 unicode = unicode | ((currentByte & 0x3f) << (6+6)); 359 unicode = unicode | ((currentByte & 0x3f) << (6+6));
363 i++; currentByte = this.byteAtIndex(i); 360 i++; currentByte = this.byteAtIndex(i);
364 unicode = unicode | ((currentByte & 0x3f) << 6); 361 unicode = unicode | ((currentByte & 0x3f) << 6);
365 i++; currentByte = this.byteAtIndex(i); 362 i++; currentByte = this.byteAtIndex(i);
366 unicode = unicode | (currentByte & 0x3f); 363 unicode = unicode | (currentByte & 0x3f);
367 364
368 currentCharacter = String.fromCharCode(unicode); 365 currentCharacter = String.fromCharCode(unicode);
369 } 366 }
370 367
371 // result += currentCharacter; 368 // result += currentCharacter;
372 result.push(currentCharacter); 369 result.push(currentCharacter);
373 i++; 370 i++;
374 } 371 }
375 372
376//MochiKit.Logging.logDebug("[" + (new Date() - startTime) + "] ByteArray.asString"); 373//MochiKit.Logging.logDebug("[" + (new Date() - startTime) + "] ByteArray.asString");
377 374
378 // return result; 375 // return result;
379 return result.join(""); 376 return result.join("");
380 }, 377 },
381 378
382 //------------------------------------------------------------------------- 379 //-------------------------------------------------------------------------
383 380
384 'toHexString': function() { 381 'toHexString': function() {
385 throw Clipperz.Base.exception.AbstractMethod; 382 throw Clipperz.Base.exception.AbstractMethod;
386 }, 383 },
387 384
388 //------------------------------------------------------------------------- 385 //-------------------------------------------------------------------------
389 386
390 'base64map': "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", 387 'base64map': "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
391 'base64mapIndex': "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(''), 388 'base64mapIndex': "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(''),
392 //'base64mapInvertedIndex': { 389 //'base64mapInvertedIndex': {
393 // 'A': 0, 'B': 1, 'C': 2, 'D': 3, 'E': 4, 'F': 5, 'G': 6, 'H': 7, 'I': 8, 'J': 9, 390 // 'A': 0, 'B': 1, 'C': 2, 'D': 3, 'E': 4, 'F': 5, 'G': 6, 'H': 7, 'I': 8, 'J': 9,
394 // 'K': 10, 'L': 11, 'M': 12, 'N': 13, 'O': 14, 'P': 15, 'Q': 16, 'R': 17, 'S': 18, 'T': 19, 391 // 'K': 10, 'L': 11, 'M': 12, 'N': 13, 'O': 14, 'P': 15, 'Q': 16, 'R': 17, 'S': 18, 'T': 19,
395 // 'U': 20, 'V': 21, 'W': 22, 'X': 23, 'Y': 24, 'Z': 25, 'a': 26, 'b': 27, 'c': 28, 'd': 29, 392 // 'U': 20, 'V': 21, 'W': 22, 'X': 23, 'Y': 24, 'Z': 25, 'a': 26, 'b': 27, 'c': 28, 'd': 29,
396 // 'e': 30, 'f': 31, 'g': 32, 'h': 33, 'i': 34, 'j': 35, 'k': 36, 'l': 37, 'm': 38, 'n': 39, 393 // 'e': 30, 'f': 31, 'g': 32, 'h': 33, 'i': 34, 'j': 35, 'k': 36, 'l': 37, 'm': 38, 'n': 39,
397 // 'o': 40, 'p': 41, 'q': 42, 'r': 43, 's': 44, 't': 45, 'u': 46, 'v': 47, 'w': 48, 'x': 49, 394 // 'o': 40, 'p': 41, 'q': 42, 'r': 43, 's': 44, 't': 45, 'u': 46, 'v': 47, 'w': 48, 'x': 49,
398 // 'y': 50, 'z': 51, '0': 52, '1': 53, '2': 54, '3': 55, '4': 56, '5': 57, '6': 58, '7': 59, 395 // 'y': 50, 'z': 51, '0': 52, '1': 53, '2': 54, '3': 55, '4': 56, '5': 57, '6': 58, '7': 59,
399 // '8': 60, '9': 61, '+': 62, '/': 63, 396 // '8': 60, '9': 61, '+': 62, '/': 63,
400 // "=": -1}, 397 // "=": -1},
401 398
402 //------------------------------------------------------------------------- 399 //-------------------------------------------------------------------------
403 400
404 'appendBase64String': function(aValue) { 401 'appendBase64String': function(aValue) {
405 var i; 402 var i;
406 var length; 403 var length;
407 404
408 length = aValue.length; 405 length = aValue.length;
diff --git a/frontend/gamma/js/Clipperz/CSVProcessor.js b/frontend/gamma/js/Clipperz/CSVProcessor.js
index d481ba2..0b18731 100644
--- a/frontend/gamma/js/Clipperz/CSVProcessor.js
+++ b/frontend/gamma/js/Clipperz/CSVProcessor.js
@@ -1,349 +1,346 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
30 27
31 28
32Clipperz.CSVProcessor = function(args) { 29Clipperz.CSVProcessor = function(args) {
33 args = args || {}; 30 args = args || {};
34 31
35 // this._status = undefined; 32 // this._status = undefined;
36 // this._error_input= undefined; 33 // this._error_input= undefined;
37 // this._string = undefined; 34 // this._string = undefined;
38 // this._fields = undefined; 35 // this._fields = undefined;
39 36
40 this._quoteChar = args['quoteChar'] ||"\042"; 37 this._quoteChar = args['quoteChar'] ||"\042";
41 this._eol = args['eol'] ||""; 38 this._eol = args['eol'] ||"";
42 this._escapeChar = args['escapeChar'] ||"\042"; 39 this._escapeChar = args['escapeChar'] ||"\042";
43 this._separatorChar = args['separatorChar'] ||","; 40 this._separatorChar = args['separatorChar'] ||",";
44 this._binary = args['binary'] ||false; 41 this._binary = args['binary'] ||false;
45 this._alwaysQuote = args['alwaysQuote'] ||false; 42 this._alwaysQuote = args['alwaysQuote'] ||false;
46 43
47 return this; 44 return this;
48} 45}
49 46
50//============================================================================= 47//=============================================================================
51 48
52Clipperz.CSVProcessor.prototype = MochiKit.Base.update(null, { 49Clipperz.CSVProcessor.prototype = MochiKit.Base.update(null, {
53 50
54 //------------------------------------------------------------------------- 51 //-------------------------------------------------------------------------
55 52
56 'quoteChar': function() { 53 'quoteChar': function() {
57 return this._quoteChar; 54 return this._quoteChar;
58 }, 55 },
59 56
60 //------------------------------------------------------------------------- 57 //-------------------------------------------------------------------------
61 58
62 'eol': function() { 59 'eol': function() {
63 return this._eol; 60 return this._eol;
64 }, 61 },
65 62
66 //------------------------------------------------------------------------- 63 //-------------------------------------------------------------------------
67 64
68 'escapeChar': function() { 65 'escapeChar': function() {
69 return this._escapeChar; 66 return this._escapeChar;
70 }, 67 },
71 68
72 //------------------------------------------------------------------------- 69 //-------------------------------------------------------------------------
73 70
74 'separatorChar': function() { 71 'separatorChar': function() {
75 return this._separatorChar; 72 return this._separatorChar;
76 }, 73 },
77 74
78 'setSeparatorChar': function(aValue) { 75 'setSeparatorChar': function(aValue) {
79 this._separatorChar = aValue; 76 this._separatorChar = aValue;
80 }, 77 },
81 78
82 //------------------------------------------------------------------------- 79 //-------------------------------------------------------------------------
83 80
84 'binary': function() { 81 'binary': function() {
85 return this._binary; 82 return this._binary;
86 }, 83 },
87 84
88 //------------------------------------------------------------------------- 85 //-------------------------------------------------------------------------
89 86
90 'alwaysQuote': function() { 87 'alwaysQuote': function() {
91 return this._alwaysQuote; 88 return this._alwaysQuote;
92 }, 89 },
93 90
94 //------------------------------------------------------------------------- 91 //-------------------------------------------------------------------------
95/* 92/*
96 'parse': function(aValue) { 93 'parse': function(aValue) {
97 var result; 94 var result;
98 var lines; 95 var lines;
99 var parameter; 96 var parameter;
100 97
101//MochiKit.Logging.logDebug(">>> CSVProcessor.parse"); 98//MochiKit.Logging.logDebug(">>> CSVProcessor.parse");
102 result = []; 99 result = [];
103 100
104 lines = aValue.replace(/\r?\n/g, "\n").replace(/^\n* /g, "").replace(/\n$/g, "");; 101 lines = aValue.replace(/\r?\n/g, "\n").replace(/^\n* /g, "").replace(/\n$/g, "");;
105 parameter = { 102 parameter = {
106 line: lines 103 line: lines
107 } 104 }
108 105
109 do { 106 do {
110 var fields; 107 var fields;
111 108
112 fields = this.parseLine(parameter); 109 fields = this.parseLine(parameter);
113 110
114 if (fields != null) { 111 if (fields != null) {
115 result.push(fields); 112 result.push(fields);
116 } 113 }
117 114
118 parameter.line = parameter.line.replace(/^\n* /g, "").replace(/\n$/g, ""); 115 parameter.line = parameter.line.replace(/^\n* /g, "").replace(/\n$/g, "");
119 116
120//MochiKit.Logging.logDebug("line: '" + parameter.line + "'"); 117//MochiKit.Logging.logDebug("line: '" + parameter.line + "'");
121 } while (parameter.line != ""); 118 } while (parameter.line != "");
122//MochiKit.Logging.logDebug("--- CSVProcessor.parse - result: " + Clipperz.Base.serializeJSON(result)); 119//MochiKit.Logging.logDebug("--- CSVProcessor.parse - result: " + Clipperz.Base.serializeJSON(result));
123//MochiKit.Logging.logDebug("<<< CSVProcessor.parse"); 120//MochiKit.Logging.logDebug("<<< CSVProcessor.parse");
124 121
125 return result; 122 return result;
126 }, 123 },
127*/ 124*/
128 //------------------------------------------------------------------------- 125 //-------------------------------------------------------------------------
129 126
130 'deferredParse_core': function(aContext) { 127 'deferredParse_core': function(aContext) {
131 var deferredResult; 128 var deferredResult;
132 129
133 if (aContext.line == "") { 130 if (aContext.line == "") {
134 deferredResult = MochiKit.Async.succeed(aContext.result); 131 deferredResult = MochiKit.Async.succeed(aContext.result);
135 } else { 132 } else {
136 var fields; 133 var fields;
137 134
138 fields = this.parseLine(aContext); 135 fields = this.parseLine(aContext);
139 if (fields != null) { 136 if (fields != null) {
140 aContext.result.push(fields); 137 aContext.result.push(fields);
141 } 138 }
142 139
143 aContext.line = aContext.line.replace(/^\n*/g, "").replace(/\n$/g, ""); 140 aContext.line = aContext.line.replace(/^\n*/g, "").replace(/\n$/g, "");
144 141
145 deferredResult = new Clipperz.Async.Deferred("CVSProcessor.deferredParse_core"); 142 deferredResult = new Clipperz.Async.Deferred("CVSProcessor.deferredParse_core");
146 // deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'importProcessorProgressUpdate', {status:'processing', size:aContext.size, progress:(aContext.size - aContext.line.length)}); 143 // deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'importProcessorProgressUpdate', {status:'processing', size:aContext.size, progress:(aContext.size - aContext.line.length)});
147 deferredResult.addCallbackPass(MochiKit.Signal.signal, 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)});
148 deferredResult.addCallback(MochiKit.Async.wait, 0.2); 145 deferredResult.addCallback(MochiKit.Async.wait, 0.2);
149 deferredResult.addMethod(this, 'deferredParse_core') 146 deferredResult.addMethod(this, 'deferredParse_core')
150 deferredResult.callback(aContext); 147 deferredResult.callback(aContext);
151 } 148 }
152 149
153 return deferredResult; 150 return deferredResult;
154 }, 151 },
155 152
156 //......................................................................... 153 //.........................................................................
157 154
158 'deferredParse': function(aValue) { 155 'deferredParse': function(aValue) {
159 var deferredResult; 156 var deferredResult;
160 var lines; 157 var lines;
161 var context; 158 var context;
162 159
163 lines = aValue.replace(/\r?\n/g, "\n").replace(/^\n*/g, "").replace(/\n$/g, ""); 160 lines = aValue.replace(/\r?\n/g, "\n").replace(/^\n*/g, "").replace(/\n$/g, "");
164 161
165 context = { 162 context = {
166 line: lines, 163 line: lines,
167 size: lines.length, 164 size: lines.length,
168 result: [] 165 result: []
169 } 166 }
170 167
171 deferredResult = new Clipperz.Async.Deferred("CSVProcessor.deferredParse"); 168 deferredResult = new Clipperz.Async.Deferred("CSVProcessor.deferredParse");
172 deferredResult.addMethod(this, 'deferredParse_core'); 169 deferredResult.addMethod(this, 'deferredParse_core');
173 deferredResult.callback(context); 170 deferredResult.callback(context);
174 171
175 return deferredResult; 172 return deferredResult;
176 }, 173 },
177 174
178 //------------------------------------------------------------------------- 175 //-------------------------------------------------------------------------
179 176
180 'parseLine': function(aParameter) { 177 'parseLine': function(aParameter) {
181 var result; 178 var result;
182 var palatable; 179 var palatable;
183 var line; 180 var line;
184 var processedField; 181 var processedField;
185 182
186 result = []; 183 result = [];
187 184
188 do { 185 do {
189 processedField = this.parseField(aParameter); 186 processedField = this.parseField(aParameter);
190 if (processedField != null) { 187 if (processedField != null) {
191 result.push(processedField) 188 result.push(processedField)
192 }; 189 };
193 } while (processedField != null); 190 } while (processedField != null);
194 191
195 return result; 192 return result;
196 }, 193 },
197 194
198 //------------------------------------------------------------------------- 195 //-------------------------------------------------------------------------
199 196
200 'parseField': function(aParameter) { 197 'parseField': function(aParameter) {
201 var result; 198 var result;
202 199
203 var inQuotes; 200 var inQuotes;
204 var validRegExp; 201 var validRegExp;
205 var singleQuoteBeginRegexp; 202 var singleQuoteBeginRegexp;
206 var escapedQuoteBeginRegexp; 203 var escapedQuoteBeginRegexp;
207 var singleQuoteCommaEndRegexp; 204 var singleQuoteCommaEndRegexp;
208 var singleQuoteNewLineEndRegexp; 205 var singleQuoteNewLineEndRegexp;
209 var commaBeginRegexp; 206 var commaBeginRegexp;
210 var newlineRegexp; 207 var newlineRegexp;
211 208
212 209
213 singleQuoteBeginRegexp = new RegExp("^" + '\\' + this.quoteChar()); 210 singleQuoteBeginRegexp = new RegExp("^" + '\\' + this.quoteChar());
214 escapedQuoteBeginRegexp = new RegExp("^" + '\\' + this.escapeChar() + '\\' + this.quoteChar()); 211 escapedQuoteBeginRegexp = new RegExp("^" + '\\' + this.escapeChar() + '\\' + this.quoteChar());
215 singleQuoteCommaEndRegexp= new RegExp("^" + '\\' + this.quoteChar() + '\\' + this.separatorChar()); 212 singleQuoteCommaEndRegexp= new RegExp("^" + '\\' + this.quoteChar() + '\\' + this.separatorChar());
216 singleQuoteNewLineEndRegexp= new RegExp("^" + '\\' + this.quoteChar() + "\n"); 213 singleQuoteNewLineEndRegexp= new RegExp("^" + '\\' + this.quoteChar() + "\n");
217 commaBeginRegexp = new RegExp("^" + '\\' + this.separatorChar()); 214 commaBeginRegexp = new RegExp("^" + '\\' + this.separatorChar());
218 newlineRegexp = new RegExp("^\n"); 215 newlineRegexp = new RegExp("^\n");
219 216
220 inQuotes = false; 217 inQuotes = false;
221 218
222//MochiKit.Logging.logDebug("#################################### '" + aParameter.line + "'"); 219//MochiKit.Logging.logDebug("#################################### '" + aParameter.line + "'");
223 if (aParameter.line == "") { 220 if (aParameter.line == "") {
224 if (aParameter.isThereAnEmptyFinalField == true) { 221 if (aParameter.isThereAnEmptyFinalField == true) {
225 aParameter.isThereAnEmptyFinalField = false; 222 aParameter.isThereAnEmptyFinalField = false;
226 result = ""; 223 result = "";
227 } else { 224 } else {
228 result = null; 225 result = null;
229 } 226 }
230 } else { 227 } else {
231 if (this.binary()) { 228 if (this.binary()) {
232 validRegexp = /^./; 229 validRegexp = /^./;
233 // validRegexp = /^[^\\]/; 230 // validRegexp = /^[^\\]/;
234 } else { 231 } else {
235 validRegexp = /^[\t\040-\176]/; 232 validRegexp = /^[\t\040-\176]/;
236 } 233 }
237 234
238 try { 235 try {
239 var done; 236 var done;
240 237
241 done = false; 238 done = false;
242 result = ""; 239 result = "";
243 240
244 while (!done) { 241 while (!done) {
245 if (aParameter.line.length < 1) { 242 if (aParameter.line.length < 1) {
246//MochiKit.Logging.logDebug("---> 1: '" + aParameter.line.replace(/\n/g, "\\n") + "'"); 243//MochiKit.Logging.logDebug("---> 1: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
247 if (inQuotes == true) { 244 if (inQuotes == true) {
248//MochiKit.Logging.logDebug("---> 1.1: '" + aParameter.line.replace(/\n/g, "\\n") + "'"); 245//MochiKit.Logging.logDebug("---> 1.1: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
249 throw new Error("CSV Parsing error; end of string, missing closing double-quote..."); 246 throw new Error("CSV Parsing error; end of string, missing closing double-quote...");
250 } else { 247 } else {
251//MochiKit.Logging.logDebug("---> 1.2: '" + aParameter.line.replace(/\n/g, "\\n") + "'"); 248//MochiKit.Logging.logDebug("---> 1.2: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
252 done = true; 249 done = true;
253 } 250 }
254 } else if (escapedQuoteBeginRegexp.test(aParameter.line)) { 251 } else if (escapedQuoteBeginRegexp.test(aParameter.line)) {
255//MochiKit.Logging.logDebug("---> 2.1: '" + aParameter.line.replace(/\n/g, "\\n") + "'"); 252//MochiKit.Logging.logDebug("---> 2.1: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
256 result += this.quoteChar(); 253 result += this.quoteChar();
257 aParameter.line = aParameter.line.substr(2, aParameter.line.length - 1); 254 aParameter.line = aParameter.line.substr(2, aParameter.line.length - 1);
258//MochiKit.Logging.logDebug("<--- 2.2: '" + aParameter.line.replace(/\n/g, "\\n") + "'"); 255//MochiKit.Logging.logDebug("<--- 2.2: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
259 } else if (singleQuoteBeginRegexp.test(aParameter.line)) { 256 } else if (singleQuoteBeginRegexp.test(aParameter.line)) {
260//MochiKit.Logging.logDebug("---> 3: '" + aParameter.line.replace(/\n/g, "\\n") + "'"); 257//MochiKit.Logging.logDebug("---> 3: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
261 if (inQuotes == true) { 258 if (inQuotes == true) {
262 if (aParameter.line.length == 1) { 259 if (aParameter.line.length == 1) {
263//MochiKit.Logging.logDebug("---> 3.1: '" + aParameter.line.replace(/\n/g, "\\n") + "'"); 260//MochiKit.Logging.logDebug("---> 3.1: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
264 aParameter.line = ''; 261 aParameter.line = '';
265 done = true; 262 done = true;
266 } else if (singleQuoteCommaEndRegexp.test(aParameter.line)) { 263 } else if (singleQuoteCommaEndRegexp.test(aParameter.line)) {
267//MochiKit.Logging.logDebug("---> 3.3: '" + aParameter.line.replace(/\n/g, "\\n") + "'"); 264//MochiKit.Logging.logDebug("---> 3.3: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
268 aParameter.line = aParameter.line.substr(2, aParameter.line.length - 1); 265 aParameter.line = aParameter.line.substr(2, aParameter.line.length - 1);
269 done = true; 266 done = true;
270//MochiKit.Logging.logDebug("<--- 3.3: '" + aParameter.line.replace(/\n/g, "\\n") + "'"); 267//MochiKit.Logging.logDebug("<--- 3.3: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
271 } else if (singleQuoteNewLineEndRegexp.test(aParameter.line)) { 268 } else if (singleQuoteNewLineEndRegexp.test(aParameter.line)) {
272 aParameter.line = aParameter.line.substr(1, aParameter.line.length - 1); 269 aParameter.line = aParameter.line.substr(1, aParameter.line.length - 1);
273 done = true; 270 done = true;
274 } else { 271 } else {
275 throw new Error("CSV Parsing error; double-quote, followed by undesirable character (bad character sequence)... " + aParameter.line); 272 throw new Error("CSV Parsing error; double-quote, followed by undesirable character (bad character sequence)... " + aParameter.line);
276 } 273 }
277 } else { 274 } else {
278//MochiKit.Logging.logDebug("---> 4: '" + aParameter.line.replace(/\n/g, "\\n") + "'"); 275//MochiKit.Logging.logDebug("---> 4: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
279 if (result == "") { 276 if (result == "") {
280//MochiKit.Logging.logDebug("---> 4.1: '" + aParameter.line.replace(/\n/g, "\\n") + "'"); 277//MochiKit.Logging.logDebug("---> 4.1: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
281 inQuotes = true; 278 inQuotes = true;
282 aParameter.line = aParameter.line.substr(1, aParameter.line.length - 1); 279 aParameter.line = aParameter.line.substr(1, aParameter.line.length - 1);
283//MochiKit.Logging.logDebug("<--- 4.1: '" + aParameter.line.replace(/\n/g, "\\n") + "'"); 280//MochiKit.Logging.logDebug("<--- 4.1: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
284 } else { 281 } else {
285 throw new Error("CSV Parsing error; double-quote, outside of double-quotes (bad character sequence)..."); 282 throw new Error("CSV Parsing error; double-quote, outside of double-quotes (bad character sequence)...");
286 } 283 }
287 } 284 }
288 } else if (commaBeginRegexp.test(aParameter.line)) { 285 } else if (commaBeginRegexp.test(aParameter.line)) {
289//MochiKit.Logging.logDebug("---> 5: '" + aParameter.line.replace(/\n/g, "\\n") + "'"); 286//MochiKit.Logging.logDebug("---> 5: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
290 if (inQuotes) { 287 if (inQuotes) {
291//MochiKit.Logging.logDebug("---> 5.1: '" + aParameter.line.replace(/\n/g, "\\n") + "'"); 288//MochiKit.Logging.logDebug("---> 5.1: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
292 result += aParameter.line.substr(0 ,1); 289 result += aParameter.line.substr(0 ,1);
293 aParameter.line = aParameter.line.substr(1, aParameter.line.length - 1); 290 aParameter.line = aParameter.line.substr(1, aParameter.line.length - 1);
294//MochiKit.Logging.logDebug("<--- 5.1: '" + aParameter.line.replace(/\n/g, "\\n") + "'"); 291//MochiKit.Logging.logDebug("<--- 5.1: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
295 } else { 292 } else {
296//MochiKit.Logging.logDebug("---> 5.2: '" + aParameter.line.replace(/\n/g, "\\n") + "'"); 293//MochiKit.Logging.logDebug("---> 5.2: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
297 aParameter.line = aParameter.line.substr(1, aParameter.line.length - 1); 294 aParameter.line = aParameter.line.substr(1, aParameter.line.length - 1);
298 if (newlineRegexp.test(aParameter.line) || aParameter.line == "") { 295 if (newlineRegexp.test(aParameter.line) || aParameter.line == "") {
299//MochiKit.Logging.logDebug("######"); 296//MochiKit.Logging.logDebug("######");
300 aParameter.isThereAnEmptyFinalField = true; 297 aParameter.isThereAnEmptyFinalField = true;
301 }; 298 };
302 done = true; 299 done = true;
303//MochiKit.Logging.logDebug("<--- 5.2: '" + aParameter.line.replace(/\n/g, "\\n") + "'"); 300//MochiKit.Logging.logDebug("<--- 5.2: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
304 } 301 }
305 } else if (validRegexp.test(aParameter.line)) { 302 } else if (validRegexp.test(aParameter.line)) {
306//MochiKit.Logging.logDebug("---> 6: '" + aParameter.line.replace(/\n/g, "\\n") + "'"); 303//MochiKit.Logging.logDebug("---> 6: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
307 result += aParameter.line.substr(0, 1); 304 result += aParameter.line.substr(0, 1);
308 aParameter.line = aParameter.line.substr(1, aParameter.line.length - 1); 305 aParameter.line = aParameter.line.substr(1, aParameter.line.length - 1);
309//MochiKit.Logging.logDebug("<--- 6: '" + aParameter.line.replace(/\n/g, "\\n") + "'"); 306//MochiKit.Logging.logDebug("<--- 6: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
310 } else if (newlineRegexp.test(aParameter.line)) { 307 } else if (newlineRegexp.test(aParameter.line)) {
311 if (inQuotes == true) { 308 if (inQuotes == true) {
312 result += aParameter.line.substr(0 ,1); 309 result += aParameter.line.substr(0 ,1);
313 aParameter.line = aParameter.line.substr(1, aParameter.line.length - 1); 310 aParameter.line = aParameter.line.substr(1, aParameter.line.length - 1);
314 } else { 311 } else {
315 if (result == "") { 312 if (result == "") {
316 if (aParameter.isThereAnEmptyFinalField == true) { 313 if (aParameter.isThereAnEmptyFinalField == true) {
317 aParameter.isThereAnEmptyFinalField = false; 314 aParameter.isThereAnEmptyFinalField = false;
318 } else { 315 } else {
319 result = null; 316 result = null;
320 } 317 }
321 } 318 }
322 319
323 done = true; 320 done = true;
324 } 321 }
325 } else { 322 } else {
326 throw new Error("CSV Parsing error; an undesirable character... '" + aParameter.line.substr(0,1) + "'"); 323 throw new Error("CSV Parsing error; an undesirable character... '" + aParameter.line.substr(0,1) + "'");
327 } 324 }
328 } 325 }
329 } catch(exception) { 326 } catch(exception) {
330 MochiKit.Logging.logError(exception.message); 327 MochiKit.Logging.logError(exception.message);
331 // result = null; 328 // result = null;
332 throw exception; 329 throw exception;
333 } 330 }
334 } 331 }
335 332
336//if (result != null) { 333//if (result != null) {
337 //MochiKit.Logging.logDebug("<=== result: '" + result.replace(/\n/g, "\\n") + "'"); 334 //MochiKit.Logging.logDebug("<=== result: '" + result.replace(/\n/g, "\\n") + "'");
338//} else { 335//} else {
339 //MochiKit.Logging.logDebug("<=== result: NULL"); 336 //MochiKit.Logging.logDebug("<=== result: NULL");
340//} 337//}
341 338
342 return result; 339 return result;
343 }, 340 },
344 341
345 //------------------------------------------------------------------------- 342 //-------------------------------------------------------------------------
346 __syntaxFix__: "syntax fix" 343 __syntaxFix__: "syntax fix"
347}); 344});
348 345
349 346
diff --git a/frontend/gamma/js/Clipperz/Crypto/AES.js b/frontend/gamma/js/Clipperz/Crypto/AES.js
index 36fc731..c811f1c 100644
--- a/frontend/gamma/js/Clipperz/Crypto/AES.js
+++ b/frontend/gamma/js/Clipperz/Crypto/AES.js
@@ -1,408 +1,405 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) { 26try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) {
30 throw "Clipperz.Crypto.AES depends on Clipperz.ByteArray!"; 27 throw "Clipperz.Crypto.AES depends on Clipperz.ByteArray!";
31} 28}
32 29
33 //Dependency commented to avoid a circular reference 30 //Dependency commented to avoid a circular reference
34//try { if (typeof(Clipperz.Crypto.PRNG) == 'undefined') { throw ""; }} catch (e) { 31//try { if (typeof(Clipperz.Crypto.PRNG) == 'undefined') { throw ""; }} catch (e) {
35 //throw "Clipperz.Crypto.AES depends on Clipperz.Crypto.PRNG!"; 32 //throw "Clipperz.Crypto.AES depends on Clipperz.Crypto.PRNG!";
36//} 33//}
37 34
38if (typeof(Clipperz.Crypto.AES) == 'undefined') { Clipperz.Crypto.AES = {}; } 35if (typeof(Clipperz.Crypto.AES) == 'undefined') { Clipperz.Crypto.AES = {}; }
39 36
40//############################################################################# 37//#############################################################################
41 38
42Clipperz.Crypto.AES.DeferredExecutionContext = function(args) { 39Clipperz.Crypto.AES.DeferredExecutionContext = function(args) {
43 args = args || {}; 40 args = args || {};
44 41
45 this._key = args.key; 42 this._key = args.key;
46 this._message = args.message; 43 this._message = args.message;
47 this._result = args.message.clone(); 44 this._result = args.message.clone();
48 this._nonce = args.nonce; 45 this._nonce = args.nonce;
49 this._messageLength = this._message.length(); 46 this._messageLength = this._message.length();
50 47
51 this._messageArray = this._message.arrayValues(); 48 this._messageArray = this._message.arrayValues();
52 this._resultArray = this._result.arrayValues(); 49 this._resultArray = this._result.arrayValues();
53 this._nonceArray = this._nonce.arrayValues(); 50 this._nonceArray = this._nonce.arrayValues();
54 51
55 this._executionStep = 0; 52 this._executionStep = 0;
56 53
57 // this._elaborationChunkSize = 1024; // 4096; // 16384; //4096; 54 // this._elaborationChunkSize = 1024; // 4096; // 16384; //4096;
58 this._elaborationChunks = 10; 55 this._elaborationChunks = 10;
59 this._pauseTime = 0.02; // 0.02 //0.2; 56 this._pauseTime = 0.02; // 0.02 //0.2;
60 57
61 return this; 58 return this;
62} 59}
63 60
64Clipperz.Crypto.AES.DeferredExecutionContext.prototype = MochiKit.Base.update(null, { 61Clipperz.Crypto.AES.DeferredExecutionContext.prototype = MochiKit.Base.update(null, {
65 62
66 'key': function() { 63 'key': function() {
67 return this._key; 64 return this._key;
68 }, 65 },
69 66
70 'message': function() { 67 'message': function() {
71 return this._message; 68 return this._message;
72 }, 69 },
73 70
74 'messageLength': function() { 71 'messageLength': function() {
75 return this._messageLength; 72 return this._messageLength;
76 }, 73 },
77 74
78 'result': function() { 75 'result': function() {
79 return new Clipperz.ByteArray(this.resultArray()); 76 return new Clipperz.ByteArray(this.resultArray());
80 }, 77 },
81 78
82 'nonce': function() { 79 'nonce': function() {
83 return this._nonce; 80 return this._nonce;
84 }, 81 },
85 82
86 'messageArray': function() { 83 'messageArray': function() {
87 return this._messageArray; 84 return this._messageArray;
88 }, 85 },
89 86
90 'resultArray': function() { 87 'resultArray': function() {
91 return this._resultArray; 88 return this._resultArray;
92 }, 89 },
93 90
94 'nonceArray': function() { 91 'nonceArray': function() {
95 return this._nonceArray; 92 return this._nonceArray;
96 }, 93 },
97 94
98 'elaborationChunkSize': function() { 95 'elaborationChunkSize': function() {
99 // return Clipperz.Crypto.AES.DeferredExecution.chunkSize; 96 // return Clipperz.Crypto.AES.DeferredExecution.chunkSize;
100 // return this._elaborationChunkSize; 97 // return this._elaborationChunkSize;
101 return (this._elaborationChunks * 1024); 98 return (this._elaborationChunks * 1024);
102 }, 99 },
103 100
104 'executionStep': function() { 101 'executionStep': function() {
105 return this._executionStep; 102 return this._executionStep;
106 }, 103 },
107 104
108 'setExecutionStep': function(aValue) { 105 'setExecutionStep': function(aValue) {
109 this._executionStep = aValue; 106 this._executionStep = aValue;
110 }, 107 },
111 108
112 'tuneExecutionParameters': function (anElapsedTime) { 109 'tuneExecutionParameters': function (anElapsedTime) {
113//var originalChunks = this._elaborationChunks; 110//var originalChunks = this._elaborationChunks;
114 if (anElapsedTime > 0) { 111 if (anElapsedTime > 0) {
115 this._elaborationChunks = Math.round(this._elaborationChunks * ((anElapsedTime + 1000)/(anElapsedTime * 2))); 112 this._elaborationChunks = Math.round(this._elaborationChunks * ((anElapsedTime + 1000)/(anElapsedTime * 2)));
116 } 113 }
117//Clipperz.log("tuneExecutionParameters - elapsedTime: " + anElapsedTime + /*originalChunks,*/ " chunks # " + this._elaborationChunks + " [" + this._executionStep + " / " + this._messageLength + "]"); 114//Clipperz.log("tuneExecutionParameters - elapsedTime: " + anElapsedTime + /*originalChunks,*/ " chunks # " + this._elaborationChunks + " [" + this._executionStep + " / " + this._messageLength + "]");
118 }, 115 },
119 116
120 'pause': function(aValue) { 117 'pause': function(aValue) {
121 // return MochiKit.Async.wait(Clipperz.Crypto.AES.DeferredExecution.pauseTime, aValue); 118 // return MochiKit.Async.wait(Clipperz.Crypto.AES.DeferredExecution.pauseTime, aValue);
122 return MochiKit.Async.wait(this._pauseTime, aValue); 119 return MochiKit.Async.wait(this._pauseTime, aValue);
123 }, 120 },
124 121
125 'isDone': function () { 122 'isDone': function () {
126//console.log("isDone", this.executionStep(), this.messageLength()); 123//console.log("isDone", this.executionStep(), this.messageLength());
127 return (this._executionStep >= this._messageLength); 124 return (this._executionStep >= this._messageLength);
128 }, 125 },
129 126
130 //----------------------------------------------------------------------------- 127 //-----------------------------------------------------------------------------
131 __syntaxFix__: "syntax fix" 128 __syntaxFix__: "syntax fix"
132 129
133}); 130});
134 131
135//############################################################################# 132//#############################################################################
136 133
137Clipperz.Crypto.AES.Key = function(args) { 134Clipperz.Crypto.AES.Key = function(args) {
138 args = args || {}; 135 args = args || {};
139 136
140 this._key = args.key; 137 this._key = args.key;
141 this._keySize = args.keySize || this.key().length(); 138 this._keySize = args.keySize || this.key().length();
142 139
143 if (this.keySize() == 128/8) { 140 if (this.keySize() == 128/8) {
144 this._b = 176; 141 this._b = 176;
145 this._numberOfRounds = 10; 142 this._numberOfRounds = 10;
146 } else if (this.keySize() == 256/8) { 143 } else if (this.keySize() == 256/8) {
147 this._b = 240; 144 this._b = 240;
148 this._numberOfRounds = 14; 145 this._numberOfRounds = 14;
149 } else { 146 } else {
150 MochiKit.Logging.logError("AES unsupported key size: " + (this.keySize() * 8) + " bits"); 147 MochiKit.Logging.logError("AES unsupported key size: " + (this.keySize() * 8) + " bits");
151 throw Clipperz.Crypto.AES.exception.UnsupportedKeySize; 148 throw Clipperz.Crypto.AES.exception.UnsupportedKeySize;
152 } 149 }
153 150
154 this._stretchedKey = null; 151 this._stretchedKey = null;
155 152
156 return this; 153 return this;
157} 154}
158 155
159Clipperz.Crypto.AES.Key.prototype = MochiKit.Base.update(null, { 156Clipperz.Crypto.AES.Key.prototype = MochiKit.Base.update(null, {
160 157
161 'asString': function() { 158 'asString': function() {
162 return "Clipperz.Crypto.AES.Key (" + this.key().toHexString() + ")"; 159 return "Clipperz.Crypto.AES.Key (" + this.key().toHexString() + ")";
163 }, 160 },
164 161
165 //----------------------------------------------------------------------------- 162 //-----------------------------------------------------------------------------
166 163
167 'key': function() { 164 'key': function() {
168 return this._key; 165 return this._key;
169 }, 166 },
170 167
171 'keySize': function() { 168 'keySize': function() {
172 return this._keySize; 169 return this._keySize;
173 }, 170 },
174 171
175 'b': function() { 172 'b': function() {
176 return this._b; 173 return this._b;
177 }, 174 },
178 175
179 'numberOfRounds': function() { 176 'numberOfRounds': function() {
180 return this._numberOfRounds; 177 return this._numberOfRounds;
181 }, 178 },
182 //========================================================================= 179 //=========================================================================
183 180
184 'keyScheduleCore': function(aWord, aRoundConstantsIndex) { 181 'keyScheduleCore': function(aWord, aRoundConstantsIndex) {
185 varresult; 182 varresult;
186 var sbox; 183 var sbox;
187 184
188 sbox = Clipperz.Crypto.AES.sbox(); 185 sbox = Clipperz.Crypto.AES.sbox();
189 186
190 result = [sbox[aWord[1]] ^ Clipperz.Crypto.AES.roundConstants()[aRoundConstantsIndex], 187 result = [sbox[aWord[1]] ^ Clipperz.Crypto.AES.roundConstants()[aRoundConstantsIndex],
191 sbox[aWord[2]], 188 sbox[aWord[2]],
192 sbox[aWord[3]], 189 sbox[aWord[3]],
193 sbox[aWord[0]]]; 190 sbox[aWord[0]]];
194 191
195 return result; 192 return result;
196 }, 193 },
197 194
198 //----------------------------------------------------------------------------- 195 //-----------------------------------------------------------------------------
199 196
200 'xorWithPreviousStretchValues': function(aKey, aWord, aPreviousWordIndex) { 197 'xorWithPreviousStretchValues': function(aKey, aWord, aPreviousWordIndex) {
201 varresult; 198 varresult;
202 var i,c; 199 var i,c;
203 200
204 result = []; 201 result = [];
205 c = 4; 202 c = 4;
206 for (i=0; i<c; i++) { 203 for (i=0; i<c; i++) {
207 result[i] = aWord[i] ^ aKey.byteAtIndex(aPreviousWordIndex + i); 204 result[i] = aWord[i] ^ aKey.byteAtIndex(aPreviousWordIndex + i);
208 } 205 }
209 206
210 return result; 207 return result;
211 }, 208 },
212 209
213 //----------------------------------------------------------------------------- 210 //-----------------------------------------------------------------------------
214 211
215 'sboxShakeup': function(aWord) { 212 'sboxShakeup': function(aWord) {
216 var result; 213 var result;
217 var sbox; 214 var sbox;
218 var i,c; 215 var i,c;
219 216
220 result = []; 217 result = [];
221 sbox = Clipperz.Crypto.AES.sbox(); 218 sbox = Clipperz.Crypto.AES.sbox();
222 c =4; 219 c =4;
223 for (i=0; i<c; i++) { 220 for (i=0; i<c; i++) {
224 result[i] = sbox[aWord[i]]; 221 result[i] = sbox[aWord[i]];
225 } 222 }
226 223
227 return result; 224 return result;
228 }, 225 },
229 226
230 //----------------------------------------------------------------------------- 227 //-----------------------------------------------------------------------------
231 228
232 'stretchKey': function(aKey) { 229 'stretchKey': function(aKey) {
233 varcurrentWord; 230 varcurrentWord;
234 varkeyLength; 231 varkeyLength;
235 varpreviousStretchIndex; 232 varpreviousStretchIndex;
236 var i,c; 233 var i,c;
237 234
238 keyLength = aKey.length(); 235 keyLength = aKey.length();
239 previousStretchIndex = keyLength - this.keySize(); 236 previousStretchIndex = keyLength - this.keySize();
240 237
241 currentWord = [aKey.byteAtIndex(keyLength - 4), 238 currentWord = [aKey.byteAtIndex(keyLength - 4),
242 aKey.byteAtIndex(keyLength - 3), 239 aKey.byteAtIndex(keyLength - 3),
243 aKey.byteAtIndex(keyLength - 2), 240 aKey.byteAtIndex(keyLength - 2),
244 aKey.byteAtIndex(keyLength - 1)]; 241 aKey.byteAtIndex(keyLength - 1)];
245 currentWord = this.keyScheduleCore(currentWord, keyLength / this.keySize()); 242 currentWord = this.keyScheduleCore(currentWord, keyLength / this.keySize());
246 243
247 if (this.keySize() == 256/8) { 244 if (this.keySize() == 256/8) {
248 c = 8; 245 c = 8;
249 } else if (this.keySize() == 128/8){ 246 } else if (this.keySize() == 128/8){
250 c = 4; 247 c = 4;
251 } 248 }
252 249
253 for (i=0; i<c; i++) { 250 for (i=0; i<c; i++) {
254 if (i == 4) { 251 if (i == 4) {
255 //fifth streatch word 252 //fifth streatch word
256 currentWord = this.sboxShakeup(currentWord); 253 currentWord = this.sboxShakeup(currentWord);
257 } 254 }
258 255
259 currentWord = this.xorWithPreviousStretchValues(aKey, currentWord, previousStretchIndex + (i*4)); 256 currentWord = this.xorWithPreviousStretchValues(aKey, currentWord, previousStretchIndex + (i*4));
260 aKey.appendBytes(currentWord); 257 aKey.appendBytes(currentWord);
261 } 258 }
262 259
263 return aKey; 260 return aKey;
264 }, 261 },
265 262
266 //----------------------------------------------------------------------------- 263 //-----------------------------------------------------------------------------
267 264
268 'stretchedKey': function() { 265 'stretchedKey': function() {
269 if (this._stretchedKey == null) { 266 if (this._stretchedKey == null) {
270 var stretchedKey; 267 var stretchedKey;
271 268
272 stretchedKey = this.key().clone(); 269 stretchedKey = this.key().clone();
273 270
274 while (stretchedKey.length() < this.keySize()) { 271 while (stretchedKey.length() < this.keySize()) {
275 stretchedKey.appendByte(0); 272 stretchedKey.appendByte(0);
276 } 273 }
277 274
278 while (stretchedKey.length() < this.b()) { 275 while (stretchedKey.length() < this.b()) {
279 stretchedKey = this.stretchKey(stretchedKey); 276 stretchedKey = this.stretchKey(stretchedKey);
280 } 277 }
281 278
282 this._stretchedKey = stretchedKey.split(0, this.b()); 279 this._stretchedKey = stretchedKey.split(0, this.b());
283 } 280 }
284 281
285 return this._stretchedKey; 282 return this._stretchedKey;
286 }, 283 },
287 284
288 //========================================================================= 285 //=========================================================================
289 __syntaxFix__: "syntax fix" 286 __syntaxFix__: "syntax fix"
290}); 287});
291 288
292//############################################################################# 289//#############################################################################
293 290
294Clipperz.Crypto.AES.State = function(args) { 291Clipperz.Crypto.AES.State = function(args) {
295 args = args || {}; 292 args = args || {};
296 293
297 this._data = args.block; 294 this._data = args.block;
298 this._key = args.key; 295 this._key = args.key;
299 296
300 return this; 297 return this;
301} 298}
302 299
303Clipperz.Crypto.AES.State.prototype = MochiKit.Base.update(null, { 300Clipperz.Crypto.AES.State.prototype = MochiKit.Base.update(null, {
304 301
305 'key': function() { 302 'key': function() {
306 return this._key; 303 return this._key;
307 }, 304 },
308 305
309 //----------------------------------------------------------------------------- 306 //-----------------------------------------------------------------------------
310 307
311 'data': function() { 308 'data': function() {
312 return this._data; 309 return this._data;
313 }, 310 },
314 311
315 'setData': function(aValue) { 312 'setData': function(aValue) {
316 this._data = aValue; 313 this._data = aValue;
317 }, 314 },
318 315
319 //========================================================================= 316 //=========================================================================
320 317
321 'addRoundKey': function(aRoundNumber) { 318 'addRoundKey': function(aRoundNumber) {
322 //each byte of the state is combined with the round key; each round key is derived from the cipher key using a key schedule. 319 //each byte of the state is combined with the round key; each round key is derived from the cipher key using a key schedule.
323 vardata; 320 vardata;
324 varstretchedKey; 321 varstretchedKey;
325 varfirstStretchedKeyIndex; 322 varfirstStretchedKeyIndex;
326 var i,c; 323 var i,c;
327 324
328 data = this.data(); 325 data = this.data();
329 stretchedKey = this.key().stretchedKey(); 326 stretchedKey = this.key().stretchedKey();
330 firstStretchedKeyIndex = aRoundNumber * (128/8); 327 firstStretchedKeyIndex = aRoundNumber * (128/8);
331 c = 128/8; 328 c = 128/8;
332 for (i=0; i<c; i++) { 329 for (i=0; i<c; i++) {
333 data[i] = data[i] ^ stretchedKey.byteAtIndex(firstStretchedKeyIndex + i); 330 data[i] = data[i] ^ stretchedKey.byteAtIndex(firstStretchedKeyIndex + i);
334 } 331 }
335 }, 332 },
336 333
337 //----------------------------------------------------------------------------- 334 //-----------------------------------------------------------------------------
338 335
339 'subBytes': function() { 336 'subBytes': function() {
340 // a non-linear substitution step where each byte is replaced with another according to a lookup table. 337 // a non-linear substitution step where each byte is replaced with another according to a lookup table.
341 var i,c; 338 var i,c;
342 vardata; 339 vardata;
343 var sbox; 340 var sbox;
344 341
345 data = this.data(); 342 data = this.data();
346 sbox = Clipperz.Crypto.AES.sbox(); 343 sbox = Clipperz.Crypto.AES.sbox();
347 344
348 c = 16; 345 c = 16;
349 for (i=0; i<c; i++) { 346 for (i=0; i<c; i++) {
350 data[i] = sbox[data[i]]; 347 data[i] = sbox[data[i]];
351 } 348 }
352 }, 349 },
353 350
354 //----------------------------------------------------------------------------- 351 //-----------------------------------------------------------------------------
355 352
356 'shiftRows': function() { 353 'shiftRows': function() {
357 //a transposition step where each row of the state is shifted cyclically a certain number of steps. 354 //a transposition step where each row of the state is shifted cyclically a certain number of steps.
358 varnewValue; 355 varnewValue;
359 vardata; 356 vardata;
360 varshiftMapping; 357 varshiftMapping;
361 vari,c; 358 vari,c;
362 359
363 newValue = new Array(16); 360 newValue = new Array(16);
364 data = this.data(); 361 data = this.data();
365 shiftMapping = Clipperz.Crypto.AES.shiftRowMapping(); 362 shiftMapping = Clipperz.Crypto.AES.shiftRowMapping();
366 // [0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, 1, 6, 11]; 363 // [0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, 1, 6, 11];
367 c = 16; 364 c = 16;
368 for (i=0; i<c; i++) { 365 for (i=0; i<c; i++) {
369 newValue[i] = data[shiftMapping[i]]; 366 newValue[i] = data[shiftMapping[i]];
370 } 367 }
371 for (i=0; i<c; i++) { 368 for (i=0; i<c; i++) {
372 data[i] = newValue[i]; 369 data[i] = newValue[i];
373 } 370 }
374 }, 371 },
375 372
376 //----------------------------------------------------------------------------- 373 //-----------------------------------------------------------------------------
377/* 374/*
378 'mixColumnsWithValues': function(someValues) { 375 'mixColumnsWithValues': function(someValues) {
379 varresult; 376 varresult;
380 vara; 377 vara;
381 var i,c; 378 var i,c;
382 379
383 c = 4; 380 c = 4;
384 result = []; 381 result = [];
385 a = []; 382 a = [];
386 for (i=0; i<c; i++) { 383 for (i=0; i<c; i++) {
387 a[i] = []; 384 a[i] = [];
388 a[i][1] = someValues[i] 385 a[i][1] = someValues[i]
389 if ((a[i][1] & 0x80) == 0x80) { 386 if ((a[i][1] & 0x80) == 0x80) {
390 a[i][2] = (a[i][1] << 1) ^ 0x11b; 387 a[i][2] = (a[i][1] << 1) ^ 0x11b;
391 } else { 388 } else {
392 a[i][2] = a[i][1] << 1; 389 a[i][2] = a[i][1] << 1;
393 } 390 }
394 391
395 a[i][3] = a[i][2] ^ a[i][1]; 392 a[i][3] = a[i][2] ^ a[i][1];
396 } 393 }
397 394
398 for (i=0; i<c; i++) { 395 for (i=0; i<c; i++) {
399 varx; 396 varx;
400 397
401 x = Clipperz.Crypto.AES.mixColumnsMatrix()[i]; 398 x = Clipperz.Crypto.AES.mixColumnsMatrix()[i];
402 result[i] = a[0][x[0]] ^ a[1][x[1]] ^ a[2][x[2]] ^ a[3][x[3]]; 399 result[i] = a[0][x[0]] ^ a[1][x[1]] ^ a[2][x[2]] ^ a[3][x[3]];
403 } 400 }
404 401
405 return result; 402 return result;
406 }, 403 },
407 404
408 'mixColumns': function() { 405 'mixColumns': function() {
diff --git a/frontend/gamma/js/Clipperz/Crypto/Base.js b/frontend/gamma/js/Clipperz/Crypto/Base.js
index b69dcc8..d3a8e36 100644
--- a/frontend/gamma/js/Clipperz/Crypto/Base.js
+++ b/frontend/gamma/js/Clipperz/Crypto/Base.js
@@ -1,408 +1,405 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29try { if (typeof(Clipperz.Base) == 'undefined') { throw ""; }} catch (e) { 26try { if (typeof(Clipperz.Base) == 'undefined') { throw ""; }} catch (e) {
30 throw "Clipperz.Crypto.Base depends on Clipperz.Base!"; 27 throw "Clipperz.Crypto.Base depends on Clipperz.Base!";
31} 28}
32 29
33if (typeof(Clipperz.Crypto) == 'undefined') { Clipperz.Crypto = {}; } 30if (typeof(Clipperz.Crypto) == 'undefined') { Clipperz.Crypto = {}; }
34if (typeof(Clipperz.Crypto.Base) == 'undefined') { Clipperz.Crypto.Base = {}; } 31if (typeof(Clipperz.Crypto.Base) == 'undefined') { Clipperz.Crypto.Base = {}; }
35 32
36Clipperz.Crypto.Base.VERSION = "0.1"; 33Clipperz.Crypto.Base.VERSION = "0.1";
37Clipperz.Crypto.Base.NAME = "Clipperz.Crypto.Base"; 34Clipperz.Crypto.Base.NAME = "Clipperz.Crypto.Base";
38 35
39//############################################################################# 36//#############################################################################
40 //Downloaded on March 30, 2006 from http://anmar.eu.org/projects/jssha2/files/jssha2-0.3.zip (jsSha2/sha256.js) 37 //Downloaded on March 30, 2006 from http://anmar.eu.org/projects/jssha2/files/jssha2-0.3.zip (jsSha2/sha256.js)
41//############################################################################# 38//#############################################################################
42 39
43/* A JavaScript implementation of the Secure Hash Algorithm, SHA-256 40/* A JavaScript implementation of the Secure Hash Algorithm, SHA-256
44 * Version 0.3 Copyright Angel Marin 2003-2004 - http://anmar.eu.org/ 41 * Version 0.3 Copyright Angel Marin 2003-2004 - http://anmar.eu.org/
45 * Distributed under the BSD License 42 * Distributed under the BSD License
46 * Some bits taken from Paul Johnston's SHA-1 implementation 43 * Some bits taken from Paul Johnston's SHA-1 implementation
47 */ 44 */
48var chrsz = 8; /* bits per input character. 8 - ASCII; 16 - Unicode */ 45var chrsz = 8; /* bits per input character. 8 - ASCII; 16 - Unicode */
49function safe_add (x, y) { 46function safe_add (x, y) {
50 var lsw = (x & 0xFFFF) + (y & 0xFFFF); 47 var lsw = (x & 0xFFFF) + (y & 0xFFFF);
51 var msw = (x >> 16) + (y >> 16) + (lsw >> 16); 48 var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
52 return (msw << 16) | (lsw & 0xFFFF); 49 return (msw << 16) | (lsw & 0xFFFF);
53} 50}
54function S (X, n) {return ( X >>> n ) | (X << (32 - n));} 51function S (X, n) {return ( X >>> n ) | (X << (32 - n));}
55function R (X, n) {return ( X >>> n );} 52function R (X, n) {return ( X >>> n );}
56function Ch(x, y, z) {return ((x & y) ^ ((~x) & z));} 53function Ch(x, y, z) {return ((x & y) ^ ((~x) & z));}
57function Maj(x, y, z) {return ((x & y) ^ (x & z) ^ (y & z));} 54function Maj(x, y, z) {return ((x & y) ^ (x & z) ^ (y & z));}
58function Sigma0256(x) {return (S(x, 2) ^ S(x, 13) ^ S(x, 22));} 55function Sigma0256(x) {return (S(x, 2) ^ S(x, 13) ^ S(x, 22));}
59function Sigma1256(x) {return (S(x, 6) ^ S(x, 11) ^ S(x, 25));} 56function Sigma1256(x) {return (S(x, 6) ^ S(x, 11) ^ S(x, 25));}
60function Gamma0256(x) {return (S(x, 7) ^ S(x, 18) ^ R(x, 3));} 57function Gamma0256(x) {return (S(x, 7) ^ S(x, 18) ^ R(x, 3));}
61function Gamma1256(x) {return (S(x, 17) ^ S(x, 19) ^ R(x, 10));} 58function Gamma1256(x) {return (S(x, 17) ^ S(x, 19) ^ R(x, 10));}
62function core_sha256 (m, l) { 59function core_sha256 (m, l) {
63 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); 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);
64 var HASH = new Array(0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A, 0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19); 61 var HASH = new Array(0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A, 0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19);
65 var W = new Array(64); 62 var W = new Array(64);
66 var a, b, c, d, e, f, g, h, i, j; 63 var a, b, c, d, e, f, g, h, i, j;
67 var T1, T2; 64 var T1, T2;
68 /* append padding */ 65 /* append padding */
69 m[l >> 5] |= 0x80 << (24 - l % 32); 66 m[l >> 5] |= 0x80 << (24 - l % 32);
70 m[((l + 64 >> 9) << 4) + 15] = l; 67 m[((l + 64 >> 9) << 4) + 15] = l;
71 for ( var i = 0; i<m.length; i+=16 ) { 68 for ( var i = 0; i<m.length; i+=16 ) {
72 a = HASH[0]; b = HASH[1]; c = HASH[2]; d = HASH[3]; e = HASH[4]; f = HASH[5]; g = HASH[6]; h = HASH[7]; 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];
73 for ( var j = 0; j<64; j++) { 70 for ( var j = 0; j<64; j++) {
74 if (j < 16) W[j] = m[j + i]; 71 if (j < 16) W[j] = m[j + i];
75 else W[j] = safe_add(safe_add(safe_add(Gamma1256(W[j - 2]), W[j - 7]), Gamma0256(W[j - 15])), W[j - 16]); 72 else W[j] = safe_add(safe_add(safe_add(Gamma1256(W[j - 2]), W[j - 7]), Gamma0256(W[j - 15])), W[j - 16]);
76 T1 = safe_add(safe_add(safe_add(safe_add(h, Sigma1256(e)), Ch(e, f, g)), K[j]), W[j]); 73 T1 = safe_add(safe_add(safe_add(safe_add(h, Sigma1256(e)), Ch(e, f, g)), K[j]), W[j]);
77 T2 = safe_add(Sigma0256(a), Maj(a, b, c)); 74 T2 = safe_add(Sigma0256(a), Maj(a, b, c));
78 h = g; g = f; f = e; e = safe_add(d, T1); d = c; c = b; b = a; a = safe_add(T1, T2); 75 h = g; g = f; f = e; e = safe_add(d, T1); d = c; c = b; b = a; a = safe_add(T1, T2);
79 } 76 }
80 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]); 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]);
81 } 78 }
82 return HASH; 79 return HASH;
83} 80}
84function str2binb (str) { 81function str2binb (str) {
85 var bin = Array(); 82 var bin = Array();
86 var mask = (1 << chrsz) - 1; 83 var mask = (1 << chrsz) - 1;
87 for(var i = 0; i < str.length * chrsz; i += chrsz) 84 for(var i = 0; i < str.length * chrsz; i += chrsz)
88 bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (24 - i%32); 85 bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (24 - i%32);
89 return bin; 86 return bin;
90} 87}
91function binb2hex (binarray) { 88function binb2hex (binarray) {
92 var hexcase = 0; /* hex output format. 0 - lowercase; 1 - uppercase */ 89 var hexcase = 0; /* hex output format. 0 - lowercase; 1 - uppercase */
93 var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef"; 90 var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
94 var str = ""; 91 var str = "";
95 for (var i = 0; i < binarray.length * 4; i++) { 92 for (var i = 0; i < binarray.length * 4; i++) {
96 str += hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8+4)) & 0xF) + hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8 )) & 0xF); 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);
97 } 94 }
98 return str; 95 return str;
99} 96}
100function hex_sha256(s){return binb2hex(core_sha256(str2binb(s),s.length * chrsz));} 97function hex_sha256(s){return binb2hex(core_sha256(str2binb(s),s.length * chrsz));}
101 98
102 99
103 100
104//############################################################################# 101//#############################################################################
105 //Downloaded on March 30, 2006 from http://www.fourmilab.ch/javascrypt/javascrypt.zip (entropy.js) 102 //Downloaded on March 30, 2006 from http://www.fourmilab.ch/javascrypt/javascrypt.zip (entropy.js)
106//############################################################################# 103//#############################################################################
107 104
108 // Entropy collection utilities 105 // Entropy collection utilities
109 106
110 /*Start by declaring static storage and initialise 107 /*Start by declaring static storage and initialise
111 the entropy vector from the time we come through 108 the entropy vector from the time we come through
112 here. */ 109 here. */
113 110
114 var entropyData = new Array(); // Collected entropy data 111 var entropyData = new Array(); // Collected entropy data
115 var edlen = 0; // Keyboard array data length 112 var edlen = 0; // Keyboard array data length
116 113
117 addEntropyTime(); // Start entropy collection with page load time 114 addEntropyTime(); // Start entropy collection with page load time
118 ce(); // Roll milliseconds into initial entropy 115 ce(); // Roll milliseconds into initial entropy
119 116
120 //Add a byte to the entropy vector 117 //Add a byte to the entropy vector
121 118
122 function addEntropyByte(b) { 119 function addEntropyByte(b) {
123 entropyData[edlen++] = b; 120 entropyData[edlen++] = b;
124 } 121 }
125 122
126 /*Capture entropy. When the user presses a key or performs 123 /*Capture entropy. When the user presses a key or performs
127 various other events for which we can request 124 various other events for which we can request
128 notification, add the time in 255ths of a second to the 125 notification, add the time in 255ths of a second to the
129 entropyData array. The name of the function is short 126 entropyData array. The name of the function is short
130 so it doesn't bloat the form object declarations in 127 so it doesn't bloat the form object declarations in
131 which it appears in various "onXXX" events. */ 128 which it appears in various "onXXX" events. */
132 129
133 function ce() { 130 function ce() {
134 addEntropyByte(Math.floor((((new Date).getMilliseconds()) * 255) / 999)); 131 addEntropyByte(Math.floor((((new Date).getMilliseconds()) * 255) / 999));
135 } 132 }
136 133
137 //Add a 32 bit quantity to the entropy vector 134 //Add a 32 bit quantity to the entropy vector
138 135
139 function addEntropy32(w) { 136 function addEntropy32(w) {
140 var i; 137 var i;
141 138
142 for (i = 0; i < 4; i++) { 139 for (i = 0; i < 4; i++) {
143 addEntropyByte(w & 0xFF); 140 addEntropyByte(w & 0xFF);
144 w >>= 8; 141 w >>= 8;
145 } 142 }
146 } 143 }
147 144
148 /*Add the current time and date (milliseconds since the epoch, 145 /*Add the current time and date (milliseconds since the epoch,
149 truncated to 32 bits) to the entropy vector. */ 146 truncated to 32 bits) to the entropy vector. */
150 147
151 function addEntropyTime() { 148 function addEntropyTime() {
152 addEntropy32((new Date()).getTime()); 149 addEntropy32((new Date()).getTime());
153 } 150 }
154 151
155 /* Start collection of entropy from mouse movements. The 152 /* Start collection of entropy from mouse movements. The
156 argument specifies the number of entropy items to be 153 argument specifies the number of entropy items to be
157 obtained from mouse motion, after which mouse motion 154 obtained from mouse motion, after which mouse motion
158 will be ignored. Note that you can re-enable mouse 155 will be ignored. Note that you can re-enable mouse
159 motion collection at any time if not already underway. */ 156 motion collection at any time if not already underway. */
160 157
161 var mouseMotionCollect = 0; 158 var mouseMotionCollect = 0;
162 var oldMoveHandler; // For saving and restoring mouse move handler in IE4 159 var oldMoveHandler; // For saving and restoring mouse move handler in IE4
163 160
164 function mouseMotionEntropy(maxsamp) { 161 function mouseMotionEntropy(maxsamp) {
165 if (mouseMotionCollect <= 0) { 162 if (mouseMotionCollect <= 0) {
166 mouseMotionCollect = maxsamp; 163 mouseMotionCollect = maxsamp;
167 if ((document.implementation.hasFeature("Events", "2.0")) && 164 if ((document.implementation.hasFeature("Events", "2.0")) &&
168 document.addEventListener) { 165 document.addEventListener) {
169 // Browser supports Document Object Model (DOM) 2 events 166 // Browser supports Document Object Model (DOM) 2 events
170 document.addEventListener("mousemove", mouseMoveEntropy, false); 167 document.addEventListener("mousemove", mouseMoveEntropy, false);
171 } else { 168 } else {
172 if (document.attachEvent) { 169 if (document.attachEvent) {
173 // Internet Explorer 5 and above event model 170 // Internet Explorer 5 and above event model
174 document.attachEvent("onmousemove", mouseMoveEntropy); 171 document.attachEvent("onmousemove", mouseMoveEntropy);
175 } else { 172 } else {
176 //Internet Explorer 4 event model 173 //Internet Explorer 4 event model
177 oldMoveHandler = document.onmousemove; 174 oldMoveHandler = document.onmousemove;
178 document.onmousemove = mouseMoveEntropy; 175 document.onmousemove = mouseMoveEntropy;
179 } 176 }
180 } 177 }
181//dump("Mouse enable", mouseMotionCollect); 178//dump("Mouse enable", mouseMotionCollect);
182 } 179 }
183 } 180 }
184 181
185 /*Collect entropy from mouse motion events. Note that 182 /*Collect entropy from mouse motion events. Note that
186 this is craftily coded to work with either DOM2 or Internet 183 this is craftily coded to work with either DOM2 or Internet
187 Explorer style events. Note that we don't use every successive 184 Explorer style events. Note that we don't use every successive
188 mouse movement event. Instead, we XOR the three bytes collected 185 mouse movement event. Instead, we XOR the three bytes collected
189 from the mouse and use that to determine how many subsequent 186 from the mouse and use that to determine how many subsequent
190 mouse movements we ignore before capturing the next one. */ 187 mouse movements we ignore before capturing the next one. */
191 188
192 var mouseEntropyTime = 0; // Delay counter for mouse entropy collection 189 var mouseEntropyTime = 0; // Delay counter for mouse entropy collection
193 190
194 function mouseMoveEntropy(e) { 191 function mouseMoveEntropy(e) {
195 if (!e) { 192 if (!e) {
196 e = window.event; // Internet Explorer event model 193 e = window.event; // Internet Explorer event model
197 } 194 }
198 if (mouseMotionCollect > 0) { 195 if (mouseMotionCollect > 0) {
199 if (mouseEntropyTime-- <= 0) { 196 if (mouseEntropyTime-- <= 0) {
200 addEntropyByte(e.screenX & 0xFF); 197 addEntropyByte(e.screenX & 0xFF);
201 addEntropyByte(e.screenY & 0xFF); 198 addEntropyByte(e.screenY & 0xFF);
202 ce(); 199 ce();
203 mouseMotionCollect--; 200 mouseMotionCollect--;
204 mouseEntropyTime = (entropyData[edlen - 3] ^ entropyData[edlen - 2] ^ 201 mouseEntropyTime = (entropyData[edlen - 3] ^ entropyData[edlen - 2] ^
205 entropyData[edlen - 1]) % 19; 202 entropyData[edlen - 1]) % 19;
206//dump("Mouse Move", byteArrayToHex(entropyData.slice(-3))); 203//dump("Mouse Move", byteArrayToHex(entropyData.slice(-3)));
207 } 204 }
208 if (mouseMotionCollect <= 0) { 205 if (mouseMotionCollect <= 0) {
209 if (document.removeEventListener) { 206 if (document.removeEventListener) {
210 document.removeEventListener("mousemove", mouseMoveEntropy, false); 207 document.removeEventListener("mousemove", mouseMoveEntropy, false);
211 } else if (document.detachEvent) { 208 } else if (document.detachEvent) {
212 document.detachEvent("onmousemove", mouseMoveEntropy); 209 document.detachEvent("onmousemove", mouseMoveEntropy);
213 } else { 210 } else {
214 document.onmousemove = oldMoveHandler; 211 document.onmousemove = oldMoveHandler;
215 } 212 }
216//dump("Spung!", 0); 213//dump("Spung!", 0);
217 } 214 }
218 } 215 }
219 } 216 }
220 217
221 /*Compute a 32 byte key value from the entropy vector. 218 /*Compute a 32 byte key value from the entropy vector.
222 We compute the value by taking the MD5 sum of the even 219 We compute the value by taking the MD5 sum of the even
223 and odd bytes respectively of the entropy vector, then 220 and odd bytes respectively of the entropy vector, then
224 concatenating the two MD5 sums. */ 221 concatenating the two MD5 sums. */
225 222
226 function keyFromEntropy() { 223 function keyFromEntropy() {
227 var i, k = new Array(32); 224 var i, k = new Array(32);
228 225
229 if (edlen == 0) { 226 if (edlen == 0) {
230 alert("Blooie! Entropy vector void at call to keyFromEntropy."); 227 alert("Blooie! Entropy vector void at call to keyFromEntropy.");
231 } 228 }
232//dump("Entropy bytes", edlen); 229//dump("Entropy bytes", edlen);
233 230
234 md5_init(); 231 md5_init();
235 for (i = 0; i < edlen; i += 2) { 232 for (i = 0; i < edlen; i += 2) {
236 md5_update(entropyData[i]); 233 md5_update(entropyData[i]);
237 } 234 }
238 md5_finish(); 235 md5_finish();
239 for (i = 0; i < 16; i++) { 236 for (i = 0; i < 16; i++) {
240 k[i] = digestBits[i]; 237 k[i] = digestBits[i];
241 } 238 }
242 239
243 md5_init(); 240 md5_init();
244 for (i = 1; i < edlen; i += 2) { 241 for (i = 1; i < edlen; i += 2) {
245 md5_update(entropyData[i]); 242 md5_update(entropyData[i]);
246 } 243 }
247 md5_finish(); 244 md5_finish();
248 for (i = 0; i < 16; i++) { 245 for (i = 0; i < 16; i++) {
249 k[i + 16] = digestBits[i]; 246 k[i + 16] = digestBits[i];
250 } 247 }
251 248
252//dump("keyFromEntropy", byteArrayToHex(k)); 249//dump("keyFromEntropy", byteArrayToHex(k));
253 return k; 250 return k;
254 } 251 }
255 252
256//############################################################################# 253//#############################################################################
257 //Downloaded on March 30, 2006 from http://www.fourmilab.ch/javascrypt/javascrypt.zip (aesprng.js) 254 //Downloaded on March 30, 2006 from http://www.fourmilab.ch/javascrypt/javascrypt.zip (aesprng.js)
258//############################################################################# 255//#############################################################################
259 256
260 257
261 // AES based pseudorandom number generator 258 // AES based pseudorandom number generator
262 259
263 /* Constructor. Called with an array of 32 byte (0-255) values 260 /* Constructor. Called with an array of 32 byte (0-255) values
264 containing the initial seed. */ 261 containing the initial seed. */
265 262
266 function AESprng(seed) { 263 function AESprng(seed) {
267 this.key = new Array(); 264 this.key = new Array();
268 this.key = seed; 265 this.key = seed;
269 this.itext = hexToByteArray("9F489613248148F9C27945C6AE62EECA3E3367BB14064E4E6DC67A9F28AB3BD1"); 266 this.itext = hexToByteArray("9F489613248148F9C27945C6AE62EECA3E3367BB14064E4E6DC67A9F28AB3BD1");
270 this.nbytes = 0; // Bytes left in buffer 267 this.nbytes = 0; // Bytes left in buffer
271 268
272 this.next = AESprng_next; 269 this.next = AESprng_next;
273 this.nextbits = AESprng_nextbits; 270 this.nextbits = AESprng_nextbits;
274 this.nextInt = AESprng_nextInt; 271 this.nextInt = AESprng_nextInt;
275 this.round = AESprng_round; 272 this.round = AESprng_round;
276 273
277 /* Encrypt the initial text with the seed key 274 /* Encrypt the initial text with the seed key
278 three times, feeding the output of the encryption 275 three times, feeding the output of the encryption
279 back into the key for the next round. */ 276 back into the key for the next round. */
280 277
281 bsb = blockSizeInBits; 278 bsb = blockSizeInBits;
282 blockSizeInBits = 256; 279 blockSizeInBits = 256;
283 var i, ct; 280 var i, ct;
284 for (i = 0; i < 3; i++) { 281 for (i = 0; i < 3; i++) {
285 this.key = rijndaelEncrypt(this.itext, this.key, "ECB"); 282 this.key = rijndaelEncrypt(this.itext, this.key, "ECB");
286 } 283 }
287 284
288 /* Now make between one and four additional 285 /* Now make between one and four additional
289 key-feedback rounds, with the number determined 286 key-feedback rounds, with the number determined
290 by bits from the result of the first three 287 by bits from the result of the first three
291 rounds. */ 288 rounds. */
292 289
293 var n = 1 + (this.key[3] & 2) + (this.key[9] & 1); 290 var n = 1 + (this.key[3] & 2) + (this.key[9] & 1);
294 for (i = 0; i < n; i++) { 291 for (i = 0; i < n; i++) {
295 this.key = rijndaelEncrypt(this.itext, this.key, "ECB"); 292 this.key = rijndaelEncrypt(this.itext, this.key, "ECB");
296 } 293 }
297 blockSizeInBits = bsb; 294 blockSizeInBits = bsb;
298 } 295 }
299 296
300 function AESprng_round() { 297 function AESprng_round() {
301 bsb = blockSizeInBits; 298 bsb = blockSizeInBits;
302 blockSizeInBits = 256; 299 blockSizeInBits = 256;
303 this.key = rijndaelEncrypt(this.itext, this.key, "ECB"); 300 this.key = rijndaelEncrypt(this.itext, this.key, "ECB");
304 this.nbytes = 32; 301 this.nbytes = 32;
305 blockSizeInBits = bsb; 302 blockSizeInBits = bsb;
306 } 303 }
307 304
308 //Return next byte from the generator 305 //Return next byte from the generator
309 306
310 function AESprng_next() { 307 function AESprng_next() {
311 if (this.nbytes <= 0) { 308 if (this.nbytes <= 0) {
312 this.round(); 309 this.round();
313 } 310 }
314 return(this.key[--this.nbytes]); 311 return(this.key[--this.nbytes]);
315 } 312 }
316 313
317 //Return n bit integer value (up to maximum integer size) 314 //Return n bit integer value (up to maximum integer size)
318 315
319 function AESprng_nextbits(n) { 316 function AESprng_nextbits(n) {
320 var i, w = 0, nbytes = Math.floor((n + 7) / 8); 317 var i, w = 0, nbytes = Math.floor((n + 7) / 8);
321 318
322 for (i = 0; i < nbytes; i++) { 319 for (i = 0; i < nbytes; i++) {
323 w = (w << 8) | this.next(); 320 w = (w << 8) | this.next();
324 } 321 }
325 return w & ((1 << n) - 1); 322 return w & ((1 << n) - 1);
326 } 323 }
327 324
328 // Return integer between 0 and n inclusive 325 // Return integer between 0 and n inclusive
329 326
330 function AESprng_nextInt(n) { 327 function AESprng_nextInt(n) {
331 var p = 1, nb = 0; 328 var p = 1, nb = 0;
332 329
333 // Determine smallest p, 2^p > n 330 // Determine smallest p, 2^p > n
334 // nb = log_2 p 331 // nb = log_2 p
335 332
336 while (n >= p) { 333 while (n >= p) {
337 p <<= 1; 334 p <<= 1;
338 nb++; 335 nb++;
339 } 336 }
340 p--; 337 p--;
341 338
342 /* Generate values from 0 through n by first generating 339 /* Generate values from 0 through n by first generating
343 values v from 0 to (2^p)-1, then discarding any results v > n. 340 values v from 0 to (2^p)-1, then discarding any results v > n.
344 For the rationale behind this (and why taking 341 For the rationale behind this (and why taking
345 values mod (n + 1) is biased toward smaller values, see 342 values mod (n + 1) is biased toward smaller values, see
346 Ferguson and Schneier, "Practical Cryptography", 343 Ferguson and Schneier, "Practical Cryptography",
347 ISBN 0-471-22357-3, section 10.8). */ 344 ISBN 0-471-22357-3, section 10.8). */
348 345
349 while (true) { 346 while (true) {
350 var v = this.nextbits(nb) & p; 347 var v = this.nextbits(nb) & p;
351 348
352 if (v <= n) { 349 if (v <= n) {
353 return v; 350 return v;
354 } 351 }
355 } 352 }
356 } 353 }
357 354
358//############################################################################# 355//#############################################################################
359 //Downloaded on March 30, 2006 from http://www.fourmilab.ch/javascrypt/javascrypt.zip (md5.js) 356 //Downloaded on March 30, 2006 from http://www.fourmilab.ch/javascrypt/javascrypt.zip (md5.js)
360//############################################################################# 357//#############################################################################
361 358
362/* 359/*
363 * md5.jvs 1.0b 27/06/96 360 * md5.jvs 1.0b 27/06/96
364 * 361 *
365 * Javascript implementation of the RSA Data Security, Inc. MD5 362 * Javascript implementation of the RSA Data Security, Inc. MD5
366 * Message-Digest Algorithm. 363 * Message-Digest Algorithm.
367 * 364 *
368 * Copyright (c) 1996 Henri Torgemane. All Rights Reserved. 365 * Copyright (c) 1996 Henri Torgemane. All Rights Reserved.
369 * 366 *
370 * Permission to use, copy, modify, and distribute this software 367 * Permission to use, copy, modify, and distribute this software
371 * and its documentation for any purposes and without 368 * and its documentation for any purposes and without
372 * fee is hereby granted provided that this copyright notice 369 * fee is hereby granted provided that this copyright notice
373 * appears in all copies. 370 * appears in all copies.
374 * 371 *
375 * Of course, this soft is provided "as is" without express or implied 372 * Of course, this soft is provided "as is" without express or implied
376 * warranty of any kind. 373 * warranty of any kind.
377 374
378 This version contains some trivial reformatting modifications 375 This version contains some trivial reformatting modifications
379 by John Walker. 376 by John Walker.
380 377
381 */ 378 */
382 379
383function array(n) { 380function array(n) {
384 for (i = 0; i < n; i++) { 381 for (i = 0; i < n; i++) {
385 this[i] = 0; 382 this[i] = 0;
386 } 383 }
387 this.length = n; 384 this.length = n;
388} 385}
389 386
390/* Some basic logical functions had to be rewritten because of a bug in 387/* Some basic logical functions had to be rewritten because of a bug in
391 * Javascript.. Just try to compute 0xffffffff >> 4 with it.. 388 * Javascript.. Just try to compute 0xffffffff >> 4 with it..
392 * Of course, these functions are slower than the original would be, but 389 * Of course, these functions are slower than the original would be, but
393 * at least, they work! 390 * at least, they work!
394 */ 391 */
395 392
396function integer(n) { 393function integer(n) {
397 return n % (0xffffffff + 1); 394 return n % (0xffffffff + 1);
398} 395}
399 396
400function shr(a, b) { 397function shr(a, b) {
401 a = integer(a); 398 a = integer(a);
402 b = integer(b); 399 b = integer(b);
403 if (a - 0x80000000 >= 0) { 400 if (a - 0x80000000 >= 0) {
404 a = a % 0x80000000; 401 a = a % 0x80000000;
405 a >>= b; 402 a >>= b;
406 a += 0x40000000 >> (b - 1); 403 a += 0x40000000 >> (b - 1);
407 } else { 404 } else {
408 a >>= b; 405 a >>= b;
diff --git a/frontend/gamma/js/Clipperz/Crypto/BigInt.js b/frontend/gamma/js/Clipperz/Crypto/BigInt.js
index d4d05d2..41483a3 100644
--- a/frontend/gamma/js/Clipperz/Crypto/BigInt.js
+++ b/frontend/gamma/js/Clipperz/Crypto/BigInt.js
@@ -1,408 +1,405 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
30if (typeof(Clipperz.Crypto) == 'undefined') { Clipperz.Crypto = {}; } 27if (typeof(Clipperz.Crypto) == 'undefined') { Clipperz.Crypto = {}; }
31 28
32//############################################################################# 29//#############################################################################
33 //Downloaded on March 05, 2007 from http://www.leemon.com/crypto/BigInt.js 30 //Downloaded on March 05, 2007 from http://www.leemon.com/crypto/BigInt.js
34//############################################################################# 31//#############################################################################
35 32
36 33
37//////////////////////////////////////////////////////////////////////////////////////// 34////////////////////////////////////////////////////////////////////////////////////////
38// Big Integer Library v. 5.0 35// Big Integer Library v. 5.0
39// Created 2000, last modified 2006 36// Created 2000, last modified 2006
40// Leemon Baird 37// Leemon Baird
41// www.leemon.com 38// www.leemon.com
42// 39//
43// This file is public domain. You can use it for any purpose without restriction. 40// This file is public domain. You can use it for any purpose without restriction.
44// I do not guarantee that it is correct, so use it at your own risk. If you use 41// I do not guarantee that it is correct, so use it at your own risk. If you use
45// it for something interesting, I'd appreciate hearing about it. If you find 42// it for something interesting, I'd appreciate hearing about it. If you find
46// any bugs or make any improvements, I'd appreciate hearing about those too. 43// any bugs or make any improvements, I'd appreciate hearing about those too.
47// It would also be nice if my name and address were left in the comments. 44// It would also be nice if my name and address were left in the comments.
48// But none of that is required. 45// But none of that is required.
49// 46//
50// This code defines a bigInt library for arbitrary-precision integers. 47// This code defines a bigInt library for arbitrary-precision integers.
51// A bigInt is an array of integers storing the value in chunks of bpe bits, 48// A bigInt is an array of integers storing the value in chunks of bpe bits,
52// little endian (buff[0] is the least significant word). 49// little endian (buff[0] is the least significant word).
53// Negative bigInts are stored two's complement. 50// Negative bigInts are stored two's complement.
54// Some functions assume their parameters have at least one leading zero element. 51// Some functions assume their parameters have at least one leading zero element.
55// Functions with an underscore at the end of the name have unpredictable behavior in case of overflow, 52// Functions with an underscore at the end of the name have unpredictable behavior in case of overflow,
56// so the caller must make sure overflow won't happen. 53// so the caller must make sure overflow won't happen.
57// For each function where a parameter is modified, that same 54// For each function where a parameter is modified, that same
58// variable must not be used as another argument too. 55// variable must not be used as another argument too.
59// So, you cannot square x by doing multMod_(x,x,n). 56// So, you cannot square x by doing multMod_(x,x,n).
60// You must use squareMod_(x,n) instead, or do y=dup(x); multMod_(x,y,n). 57// You must use squareMod_(x,n) instead, or do y=dup(x); multMod_(x,y,n).
61// 58//
62// These functions are designed to avoid frequent dynamic memory allocation in the inner loop. 59// These functions are designed to avoid frequent dynamic memory allocation in the inner loop.
63// For most functions, if it needs a BigInt as a local variable it will actually use 60// For most functions, if it needs a BigInt as a local variable it will actually use
64// a global, and will only allocate to it when it's not the right size. This ensures 61// a global, and will only allocate to it when it's not the right size. This ensures
65// that when a function is called repeatedly with same-sized parameters, it only allocates 62// that when a function is called repeatedly with same-sized parameters, it only allocates
66// memory on the first call. 63// memory on the first call.
67// 64//
68// Note that for cryptographic purposes, the calls to Math.random() must 65// Note that for cryptographic purposes, the calls to Math.random() must
69// be replaced with calls to a better pseudorandom number generator. 66// be replaced with calls to a better pseudorandom number generator.
70// 67//
71// In the following, "bigInt" means a bigInt with at least one leading zero element, 68// In the following, "bigInt" means a bigInt with at least one leading zero element,
72// and "integer" means a nonnegative integer less than radix. In some cases, integer 69// and "integer" means a nonnegative integer less than radix. In some cases, integer
73// can be negative. Negative bigInts are 2s complement. 70// can be negative. Negative bigInts are 2s complement.
74// 71//
75// The following functions do not modify their inputs, but dynamically allocate memory every time they are called: 72// The following functions do not modify their inputs, but dynamically allocate memory every time they are called:
76// 73//
77// function bigInt2str(x,base) //convert a bigInt into a string in a given base, from base 2 up to base 95 74// function bigInt2str(x,base) //convert a bigInt into a string in a given base, from base 2 up to base 95
78// function dup(x) //returns a copy of bigInt x 75// function dup(x) //returns a copy of bigInt x
79// function findPrimes(n) //return array of all primes less than integer n 76// function findPrimes(n) //return array of all primes less than integer n
80// function int2bigInt(t,n,m) //convert integer t to a bigInt with at least n bits and m array elements 77// function int2bigInt(t,n,m) //convert integer t to a bigInt with at least n bits and m array elements
81// function int2bigInt(s,b,n,m) //convert string s in base b 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
82// function trim(x,k) //return a copy of x with exactly k leading zero elements 79// function trim(x,k) //return a copy of x with exactly k leading zero elements
83// 80//
84// The following functions do not modify their inputs, so there is never a problem with the result being too big: 81// The following functions do not modify their inputs, so there is never a problem with the result being too big:
85// 82//
86// function bitSize(x) //returns how many bits long the bigInt x is, not counting leading zeros 83// function bitSize(x) //returns how many bits long the bigInt x is, not counting leading zeros
87// function equals(x,y) //is the bigInt x equal to the bigint y? 84// function equals(x,y) //is the bigInt x equal to the bigint y?
88// function equalsInt(x,y) //is bigint x equal to integer y? 85// function equalsInt(x,y) //is bigint x equal to integer y?
89// function greater(x,y) //is x>y? (x and y are nonnegative bigInts) 86// function greater(x,y) //is x>y? (x and y are nonnegative bigInts)
90// function greaterShift(x,y,shift)//is (x <<(shift*bpe)) > y? 87// function greaterShift(x,y,shift)//is (x <<(shift*bpe)) > y?
91// function isZero(x) //is the bigInt x equal to zero? 88// function isZero(x) //is the bigInt x equal to zero?
92// 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)? 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)?
93// function modInt(x,n) //return x mod n for bigInt x and integer n. 90// function modInt(x,n) //return x mod n for bigInt x and integer n.
94// function negative(x) //is bigInt x negative? 91// function negative(x) //is bigInt x negative?
95// 92//
96// The following functions do not modify their inputs, but allocate memory and call functions with underscores 93// The following functions do not modify their inputs, but allocate memory and call functions with underscores
97// 94//
98// function add(x,y) //return (x+y) for bigInts x and y. 95// function add(x,y) //return (x+y) for bigInts x and y.
99// function addInt(x,n) //return (x+n) where x is a bigInt and n is an integer. 96// function addInt(x,n) //return (x+n) where x is a bigInt and n is an integer.
100// function expand(x,n) //return a copy of x with at least n elements, adding leading zeros if needed 97// function expand(x,n) //return a copy of x with at least n elements, adding leading zeros if needed
101// function inverseMod(x,n) //return (x**(-1) mod n) for bigInts x and n. If no inverse exists, it returns null 98// function inverseMod(x,n) //return (x**(-1) mod n) for bigInts x and n. If no inverse exists, it returns null
102// function mod(x,n) //return a new bigInt equal to (x mod n) for bigInts x and n. 99// function mod(x,n) //return a new bigInt equal to (x mod n) for bigInts x and n.
103// function mult(x,y) //return x*y for bigInts x and y. This is faster when y<x. 100// function mult(x,y) //return x*y for bigInts x and y. This is faster when y<x.
104// function multMod(x,y,n) //return (x*y mod n) for bigInts x,y,n. For greater speed, let y<x. 101// function multMod(x,y,n) //return (x*y mod n) for bigInts x,y,n. For greater speed, let y<x.
105// 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. 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.
106// function randTruePrime(k) //return a new, random, k-bit, true prime using Maurer's algorithm. 103// function randTruePrime(k) //return a new, random, k-bit, true prime using Maurer's algorithm.
107// function sub(x,y) //return (x-y) for bigInts x and y. Negative answers will be 2s complement 104// function sub(x,y) //return (x-y) for bigInts x and y. Negative answers will be 2s complement
108// 105//
109// The following functions write a bigInt result to one of the parameters, but 106// The following functions write a bigInt result to one of the parameters, but
110// the result is never bigger than the original, so there can't be overflow problems: 107// the result is never bigger than the original, so there can't be overflow problems:
111// 108//
112// function divInt_(x,n) //do x=floor(x/n) for bigInt x and integer n, and return the remainder 109// function divInt_(x,n) //do x=floor(x/n) for bigInt x and integer n, and return the remainder
113// function GCD_(x,y) //set x to the greatest common divisor of bigInts x and y, (y is destroyed). 110// function GCD_(x,y) //set x to the greatest common divisor of bigInts x and y, (y is destroyed).
114// function halve_(x) //do x=floor(|x|/2)*sgn(x) for bigInt x in 2's complement 111// function halve_(x) //do x=floor(|x|/2)*sgn(x) for bigInt x in 2's complement
115// function mod_(x,n) //do x=x mod n for bigInts x and n. 112// function mod_(x,n) //do x=x mod n for bigInts x and n.
116// function rightShift_(x,n) //right shift bigInt x by n bits. 0 <= n < bpe. 113// function rightShift_(x,n) //right shift bigInt x by n bits. 0 <= n < bpe.
117// 114//
118// The following functions write a bigInt result to one of the parameters. The caller is responsible for 115// The following functions write a bigInt result to one of the parameters. The caller is responsible for
119// ensuring it is large enough to hold the result. 116// ensuring it is large enough to hold the result.
120// 117//
121// function addInt_(x,n) //do x=x+n where x is a bigInt and n is an integer 118// function addInt_(x,n) //do x=x+n where x is a bigInt and n is an integer
122// function add_(x,y) //do x=x+y for bigInts x and y 119// function add_(x,y) //do x=x+y for bigInts x and y
123// function addShift_(x,y,ys) //do x=x+(y<<(ys*bpe)) 120// function addShift_(x,y,ys) //do x=x+(y<<(ys*bpe))
124// function copy_(x,y) //do x=y on bigInts x and y 121// function copy_(x,y) //do x=y on bigInts x and y
125// function copyInt_(x,n) //do x=n on bigInt x and integer n 122// function copyInt_(x,n) //do x=n on bigInt x and integer n
126// function carry_(x) //do carries and borrows so each element of the bigInt x fits in bpe bits. 123// function carry_(x) //do carries and borrows so each element of the bigInt x fits in bpe bits.
127// function divide_(x,y,q,r) //divide_ x by y giving quotient q and remainder r 124// function divide_(x,y,q,r) //divide_ x by y giving quotient q and remainder r
128// 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 125// 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
129// function inverseMod_(x,n) //do x=x**(-1) mod n, for bigInts x and n. Returns 1 (0) if inverse does (doesn't) exist 126// function inverseMod_(x,n) //do x=x**(-1) mod n, for bigInts x and n. Returns 1 (0) if inverse does (doesn't) exist
130// function inverseModInt_(x,n) //return x**(-1) mod n, for integers x and n. Return 0 if there is no inverse 127// function inverseModInt_(x,n) //return x**(-1) mod n, for integers x and n. Return 0 if there is no inverse
131// function leftShift_(x,n) //left shift bigInt x by n bits. n<bpe. 128// function leftShift_(x,n) //left shift bigInt x by n bits. n<bpe.
132// function linComb_(x,y,a,b) //do x=a*x+b*y for bigInts x and y and integers a and b 129// function linComb_(x,y,a,b) //do x=a*x+b*y for bigInts x and y and integers a and b
133// function linCombShift_(x,y,b,ys) //do x=x+b*(y<<(ys*bpe)) for bigInts x and y, and integers b and ys 130// function linCombShift_(x,y,b,ys) //do x=x+b*(y<<(ys*bpe)) for bigInts x and y, and integers b and ys
134// function mont_(x,y,n,np) //Montgomery multiplication (see comments where the function is defined) 131// function mont_(x,y,n,np) //Montgomery multiplication (see comments where the function is defined)
135// function mult_(x,y) //do x=x*y for bigInts x and y. 132// function mult_(x,y) //do x=x*y for bigInts x and y.
136// function multInt_(x,n) //do x=x*n where x is a bigInt and n is an integer. 133// function multInt_(x,n) //do x=x*n where x is a bigInt and n is an integer.
137// function multMod_(x,y,n) //do x=x*y mod n for bigInts x,y,n. 134// function multMod_(x,y,n) //do x=x*y mod n for bigInts x,y,n.
138// 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. 135// 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.
139// 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. 136// 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.
140// function randTruePrime_(ans,k) //do ans = a random k-bit true random prime (not just probable prime) with 1 in the msb. 137// function randTruePrime_(ans,k) //do ans = a random k-bit true random prime (not just probable prime) with 1 in the msb.
141// function squareMod_(x,n) //do x=x*x mod n for bigInts x,n 138// function squareMod_(x,n) //do x=x*x mod n for bigInts x,n
142// function sub_(x,y) //do x=x-y for bigInts x and y. Negative answers will be 2s complement. 139// function sub_(x,y) //do x=x-y for bigInts x and y. Negative answers will be 2s complement.
143// function subShift_(x,y,ys) //do x=x-(y<<(ys*bpe)). Negative answers will be 2s complement. 140// function subShift_(x,y,ys) //do x=x-(y<<(ys*bpe)). Negative answers will be 2s complement.
144// 141//
145// The following functions are based on algorithms from the _Handbook of Applied Cryptography_ 142// The following functions are based on algorithms from the _Handbook of Applied Cryptography_
146// powMod_() = algorithm 14.94, Montgomery exponentiation 143// powMod_() = algorithm 14.94, Montgomery exponentiation
147// eGCD_,inverseMod_() = algorithm 14.61, Binary extended GCD_ 144// eGCD_,inverseMod_() = algorithm 14.61, Binary extended GCD_
148// GCD_() = algorothm 14.57, Lehmer's algorithm 145// GCD_() = algorothm 14.57, Lehmer's algorithm
149// mont_() = algorithm 14.36, Montgomery multiplication 146// mont_() = algorithm 14.36, Montgomery multiplication
150// divide_() = algorithm 14.20 Multiple-precision division 147// divide_() = algorithm 14.20 Multiple-precision division
151// squareMod_() = algorithm 14.16 Multiple-precision squaring 148// squareMod_() = algorithm 14.16 Multiple-precision squaring
152// randTruePrime_() = algorithm 4.62, Maurer's algorithm 149// randTruePrime_() = algorithm 4.62, Maurer's algorithm
153// millerRabin() = algorithm 4.24, Miller-Rabin algorithm 150// millerRabin() = algorithm 4.24, Miller-Rabin algorithm
154// 151//
155// Profiling shows: 152// Profiling shows:
156// randTruePrime_() spends: 153// randTruePrime_() spends:
157// 10% of its time in calls to powMod_() 154// 10% of its time in calls to powMod_()
158// 85% of its time in calls to millerRabin() 155// 85% of its time in calls to millerRabin()
159// millerRabin() spends: 156// millerRabin() spends:
160// 99% of its time in calls to powMod_() (always with a base of 2) 157// 99% of its time in calls to powMod_() (always with a base of 2)
161// powMod_() spends: 158// powMod_() spends:
162// 94% of its time in calls to mont_() (almost always with x==y) 159// 94% of its time in calls to mont_() (almost always with x==y)
163// 160//
164// This suggests there are several ways to speed up this library slightly: 161// This suggests there are several ways to speed up this library slightly:
165// - convert powMod_ to use a Montgomery form of k-ary window (or maybe a Montgomery form of sliding window) 162// - convert powMod_ to use a Montgomery form of k-ary window (or maybe a Montgomery form of sliding window)
166// -- this should especially focus on being fast when raising 2 to a power mod n 163// -- this should especially focus on being fast when raising 2 to a power mod n
167// - convert randTruePrime_() to use a minimum r of 1/3 instead of 1/2 with the appropriate change to the test 164// - convert randTruePrime_() to use a minimum r of 1/3 instead of 1/2 with the appropriate change to the test
168// - tune the parameters in randTruePrime_(), including c, m, and recLimit 165// - tune the parameters in randTruePrime_(), including c, m, and recLimit
169// - speed up the single loop in mont_() that takes 95% of the runtime, perhaps by reducing checking 166// - speed up the single loop in mont_() that takes 95% of the runtime, perhaps by reducing checking
170// within the loop when all the parameters are the same length. 167// within the loop when all the parameters are the same length.
171// 168//
172// There are several ideas that look like they wouldn't help much at all: 169// There are several ideas that look like they wouldn't help much at all:
173// - replacing trial division in randTruePrime_() with a sieve (that speeds up something taking almost no time anyway) 170// - replacing trial division in randTruePrime_() with a sieve (that speeds up something taking almost no time anyway)
174// - 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) 171// - 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)
175// - speeding up mont_(x,y,n,np) when x==y by doing a non-modular, non-Montgomery square 172// - speeding up mont_(x,y,n,np) when x==y by doing a non-modular, non-Montgomery square
176// followed by a Montgomery reduction. The intermediate answer will be twice as long as x, so that 173// followed by a Montgomery reduction. The intermediate answer will be twice as long as x, so that
177// method would be slower. This is unfortunate because the code currently spends almost all of its time 174// method would be slower. This is unfortunate because the code currently spends almost all of its time
178// doing mont_(x,x,...), both for randTruePrime_() and powMod_(). A faster method for Montgomery squaring 175// doing mont_(x,x,...), both for randTruePrime_() and powMod_(). A faster method for Montgomery squaring
179// would have a large impact on the speed of randTruePrime_() and powMod_(). HAC has a couple of poorly-worded 176// would have a large impact on the speed of randTruePrime_() and powMod_(). HAC has a couple of poorly-worded
180// sentences that seem to imply it's faster to do a non-modular square followed by a single 177// sentences that seem to imply it's faster to do a non-modular square followed by a single
181// Montgomery reduction, but that's obviously wrong. 178// Montgomery reduction, but that's obviously wrong.
182//////////////////////////////////////////////////////////////////////////////////////// 179////////////////////////////////////////////////////////////////////////////////////////
183 180
184//globals 181//globals
185bpe=0; //bits stored per array element 182bpe=0; //bits stored per array element
186mask=0; //AND this with an array element to chop it down to bpe bits 183mask=0; //AND this with an array element to chop it down to bpe bits
187radix=mask+1; //equals 2^bpe. A single 1 bit to the left of the last bit of mask. 184radix=mask+1; //equals 2^bpe. A single 1 bit to the left of the last bit of mask.
188 185
189//the digits for converting to different bases 186//the digits for converting to different bases
190digitsStr='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_=!@#$%^&*()[]{}|;:,.<>/?`~ \\\'\"+-'; 187digitsStr='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_=!@#$%^&*()[]{}|;:,.<>/?`~ \\\'\"+-';
191 188
192//initialize the global variables 189//initialize the global variables
193for (bpe=0; (1<<(bpe+1)) > (1<<bpe); bpe++); //bpe=number of bits in the mantissa on this platform 190for (bpe=0; (1<<(bpe+1)) > (1<<bpe); bpe++); //bpe=number of bits in the mantissa on this platform
194bpe>>=1; //bpe=number of bits in one element of the array representing the bigInt 191bpe>>=1; //bpe=number of bits in one element of the array representing the bigInt
195mask=(1<<bpe)-1; //AND the mask with an integer to get its bpe least significant bits 192mask=(1<<bpe)-1; //AND the mask with an integer to get its bpe least significant bits
196radix=mask+1; //2^bpe. a single 1 bit to the left of the first bit of mask 193radix=mask+1; //2^bpe. a single 1 bit to the left of the first bit of mask
197one=int2bigInt(1,1,1); //constant used in powMod_() 194one=int2bigInt(1,1,1); //constant used in powMod_()
198 195
199//the following global variables are scratchpad memory to 196//the following global variables are scratchpad memory to
200//reduce dynamic memory allocation in the inner loop 197//reduce dynamic memory allocation in the inner loop
201t=new Array(0); 198t=new Array(0);
202ss=t; //used in mult_() 199ss=t; //used in mult_()
203s0=t; //used in multMod_(), squareMod_() 200s0=t; //used in multMod_(), squareMod_()
204s1=t; //used in powMod_(), multMod_(), squareMod_() 201s1=t; //used in powMod_(), multMod_(), squareMod_()
205s2=t; //used in powMod_(), multMod_() 202s2=t; //used in powMod_(), multMod_()
206s3=t; //used in powMod_() 203s3=t; //used in powMod_()
207s4=t; s5=t; //used in mod_() 204s4=t; s5=t; //used in mod_()
208s6=t; //used in bigInt2str() 205s6=t; //used in bigInt2str()
209s7=t; //used in powMod_() 206s7=t; //used in powMod_()
210T=t; //used in GCD_() 207T=t; //used in GCD_()
211sa=t; //used in mont_() 208sa=t; //used in mont_()
212mr_x1=t; mr_r=t; mr_a=t; //used in millerRabin() 209mr_x1=t; mr_r=t; mr_a=t; //used in millerRabin()
213eg_v=t; eg_u=t; eg_A=t; eg_B=t; eg_C=t; eg_D=t; //used in eGCD_(), inverseMod_() 210eg_v=t; eg_u=t; eg_A=t; eg_B=t; eg_C=t; eg_D=t; //used in eGCD_(), inverseMod_()
214md_q1=t; md_q2=t; md_q3=t; md_r=t; md_r1=t; md_r2=t; md_tt=t; //used in mod_() 211md_q1=t; md_q2=t; md_q3=t; md_r=t; md_r1=t; md_r2=t; md_tt=t; //used in mod_()
215 212
216primes=t; pows=t; s_i=t; s_i2=t; s_R=t; s_rm=t; s_q=t; s_n1=t; 213primes=t; pows=t; s_i=t; s_i2=t; s_R=t; s_rm=t; s_q=t; s_n1=t;
217 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_() 214 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_()
218 215
219//////////////////////////////////////////////////////////////////////////////////////// 216////////////////////////////////////////////////////////////////////////////////////////
220 217
221//return array of all primes less than integer n 218//return array of all primes less than integer n
222function findPrimes(n) { 219function findPrimes(n) {
223 var i,s,p,ans; 220 var i,s,p,ans;
224 s=new Array(n); 221 s=new Array(n);
225 for (i=0;i<n;i++) 222 for (i=0;i<n;i++)
226 s[i]=0; 223 s[i]=0;
227 s[0]=2; 224 s[0]=2;
228 p=0; //first p elements of s are primes, the rest are a sieve 225 p=0; //first p elements of s are primes, the rest are a sieve
229 for(;s[p]<n;) { //s[p] is the pth prime 226 for(;s[p]<n;) { //s[p] is the pth prime
230 for(i=s[p]*s[p]; i<n; i+=s[p]) //mark multiples of s[p] 227 for(i=s[p]*s[p]; i<n; i+=s[p]) //mark multiples of s[p]
231 s[i]=1; 228 s[i]=1;
232 p++; 229 p++;
233 s[p]=s[p-1]+1; 230 s[p]=s[p-1]+1;
234 for(; s[p]<n && s[s[p]]; s[p]++); //find next prime (where s[p]==0) 231 for(; s[p]<n && s[s[p]]; s[p]++); //find next prime (where s[p]==0)
235 } 232 }
236 ans=new Array(p); 233 ans=new Array(p);
237 for(i=0;i<p;i++) 234 for(i=0;i<p;i++)
238 ans[i]=s[i]; 235 ans[i]=s[i];
239 return ans; 236 return ans;
240} 237}
241 238
242//does a single round of Miller-Rabin base b consider x to be a possible prime? 239//does a single round of Miller-Rabin base b consider x to be a possible prime?
243//x is a bigInt, and b is an integer 240//x is a bigInt, and b is an integer
244function millerRabin(x,b) { 241function millerRabin(x,b) {
245 var i,j,k,s; 242 var i,j,k,s;
246 243
247 if (mr_x1.length!=x.length) { 244 if (mr_x1.length!=x.length) {
248 mr_x1=dup(x); 245 mr_x1=dup(x);
249 mr_r=dup(x); 246 mr_r=dup(x);
250 mr_a=dup(x); 247 mr_a=dup(x);
251 } 248 }
252 249
253 copyInt_(mr_a,b); 250 copyInt_(mr_a,b);
254 copy_(mr_r,x); 251 copy_(mr_r,x);
255 copy_(mr_x1,x); 252 copy_(mr_x1,x);
256 253
257 addInt_(mr_r,-1); 254 addInt_(mr_r,-1);
258 addInt_(mr_x1,-1); 255 addInt_(mr_x1,-1);
259 256
260 //s=the highest power of two that divides mr_r 257 //s=the highest power of two that divides mr_r
261 k=0; 258 k=0;
262 for (i=0;i<mr_r.length;i++) 259 for (i=0;i<mr_r.length;i++)
263 for (j=1;j<mask;j<<=1) 260 for (j=1;j<mask;j<<=1)
264 if (x[i] & j) { 261 if (x[i] & j) {
265 s=(k<mr_r.length+bpe ? k : 0); 262 s=(k<mr_r.length+bpe ? k : 0);
266 i=mr_r.length; 263 i=mr_r.length;
267 j=mask; 264 j=mask;
268 } else 265 } else
269 k++; 266 k++;
270 267
271 if (s) 268 if (s)
272 rightShift_(mr_r,s); 269 rightShift_(mr_r,s);
273 270
274 powMod_(mr_a,mr_r,x); 271 powMod_(mr_a,mr_r,x);
275 272
276 if (!equalsInt(mr_a,1) && !equals(mr_a,mr_x1)) { 273 if (!equalsInt(mr_a,1) && !equals(mr_a,mr_x1)) {
277 j=1; 274 j=1;
278 while (j<=s-1 && !equals(mr_a,mr_x1)) { 275 while (j<=s-1 && !equals(mr_a,mr_x1)) {
279 squareMod_(mr_a,x); 276 squareMod_(mr_a,x);
280 if (equalsInt(mr_a,1)) { 277 if (equalsInt(mr_a,1)) {
281 return 0; 278 return 0;
282 } 279 }
283 j++; 280 j++;
284 } 281 }
285 if (!equals(mr_a,mr_x1)) { 282 if (!equals(mr_a,mr_x1)) {
286 return 0; 283 return 0;
287 } 284 }
288 } 285 }
289 return 1; 286 return 1;
290} 287}
291 288
292//returns how many bits long the bigInt is, not counting leading zeros. 289//returns how many bits long the bigInt is, not counting leading zeros.
293function bitSize(x) { 290function bitSize(x) {
294 var j,z,w; 291 var j,z,w;
295 for (j=x.length-1; (x[j]==0) && (j>0); j--); 292 for (j=x.length-1; (x[j]==0) && (j>0); j--);
296 for (z=0,w=x[j]; w; (w>>=1),z++); 293 for (z=0,w=x[j]; w; (w>>=1),z++);
297 z+=bpe*j; 294 z+=bpe*j;
298 return z; 295 return z;
299} 296}
300 297
301//return a copy of x with at least n elements, adding leading zeros if needed 298//return a copy of x with at least n elements, adding leading zeros if needed
302function expand(x,n) { 299function expand(x,n) {
303 var ans=int2bigInt(0,(x.length>n ? x.length : n)*bpe,0); 300 var ans=int2bigInt(0,(x.length>n ? x.length : n)*bpe,0);
304 copy_(ans,x); 301 copy_(ans,x);
305 return ans; 302 return ans;
306} 303}
307 304
308//return a k-bit true random prime using Maurer's algorithm. 305//return a k-bit true random prime using Maurer's algorithm.
309function randTruePrime(k) { 306function randTruePrime(k) {
310 var ans=int2bigInt(0,k,0); 307 var ans=int2bigInt(0,k,0);
311 randTruePrime_(ans,k); 308 randTruePrime_(ans,k);
312 return trim(ans,1); 309 return trim(ans,1);
313} 310}
314 311
315//return a new bigInt equal to (x mod n) for bigInts x and n. 312//return a new bigInt equal to (x mod n) for bigInts x and n.
316function mod(x,n) { 313function mod(x,n) {
317 var ans=dup(x); 314 var ans=dup(x);
318 mod_(ans,n); 315 mod_(ans,n);
319 return trim(ans,1); 316 return trim(ans,1);
320} 317}
321 318
322//return (x+n) where x is a bigInt and n is an integer. 319//return (x+n) where x is a bigInt and n is an integer.
323function addInt(x,n) { 320function addInt(x,n) {
324 var ans=expand(x,x.length+1); 321 var ans=expand(x,x.length+1);
325 addInt_(ans,n); 322 addInt_(ans,n);
326 return trim(ans,1); 323 return trim(ans,1);
327} 324}
328 325
329//return x*y for bigInts x and y. This is faster when y<x. 326//return x*y for bigInts x and y. This is faster when y<x.
330function mult(x,y) { 327function mult(x,y) {
331 var ans=expand(x,x.length+y.length); 328 var ans=expand(x,x.length+y.length);
332 mult_(ans,y); 329 mult_(ans,y);
333 return trim(ans,1); 330 return trim(ans,1);
334} 331}
335 332
336//return (x**y mod n) where x,y,n are bigInts and ** is exponentiation. 0**0=1. Faster for odd n. 333//return (x**y mod n) where x,y,n are bigInts and ** is exponentiation. 0**0=1. Faster for odd n.
337function powMod(x,y,n) { 334function powMod(x,y,n) {
338 var ans=expand(x,n.length); 335 var ans=expand(x,n.length);
339 powMod_(ans,trim(y,2),trim(n,2),0); //this should work without the trim, but doesn't 336 powMod_(ans,trim(y,2),trim(n,2),0); //this should work without the trim, but doesn't
340 return trim(ans,1); 337 return trim(ans,1);
341} 338}
342 339
343//return (x-y) for bigInts x and y. Negative answers will be 2s complement 340//return (x-y) for bigInts x and y. Negative answers will be 2s complement
344function sub(x,y) { 341function sub(x,y) {
345 var ans=expand(x,(x.length>y.length ? x.length+1 : y.length+1)); 342 var ans=expand(x,(x.length>y.length ? x.length+1 : y.length+1));
346 sub_(ans,y); 343 sub_(ans,y);
347 return trim(ans,1); 344 return trim(ans,1);
348} 345}
349 346
350//return (x+y) for bigInts x and y. 347//return (x+y) for bigInts x and y.
351function add(x,y) { 348function add(x,y) {
352 var ans=expand(x,(x.length>y.length ? x.length+1 : y.length+1)); 349 var ans=expand(x,(x.length>y.length ? x.length+1 : y.length+1));
353 add_(ans,y); 350 add_(ans,y);
354 return trim(ans,1); 351 return trim(ans,1);
355} 352}
356 353
357//return (x**(-1) mod n) for bigInts x and n. If no inverse exists, it returns null 354//return (x**(-1) mod n) for bigInts x and n. If no inverse exists, it returns null
358function inverseMod(x,n) { 355function inverseMod(x,n) {
359 var ans=expand(x,n.length); 356 var ans=expand(x,n.length);
360 var s; 357 var s;
361 s=inverseMod_(ans,n); 358 s=inverseMod_(ans,n);
362 return s ? trim(ans,1) : null; 359 return s ? trim(ans,1) : null;
363} 360}
364 361
365//return (x*y mod n) for bigInts x,y,n. For greater speed, let y<x. 362//return (x*y mod n) for bigInts x,y,n. For greater speed, let y<x.
366function multMod(x,y,n) { 363function multMod(x,y,n) {
367 var ans=expand(x,n.length); 364 var ans=expand(x,n.length);
368 multMod_(ans,y,n); 365 multMod_(ans,y,n);
369 return trim(ans,1); 366 return trim(ans,1);
370} 367}
371 368
372//generate a k-bit true random prime using Maurer's algorithm, 369//generate a k-bit true random prime using Maurer's algorithm,
373//and put it into ans. The bigInt ans must be large enough to hold it. 370//and put it into ans. The bigInt ans must be large enough to hold it.
374function randTruePrime_(ans,k) { 371function randTruePrime_(ans,k) {
375 var c,m,pm,dd,j,r,B,divisible,z,zz,recSize; 372 var c,m,pm,dd,j,r,B,divisible,z,zz,recSize;
376 373
377 if (primes.length==0) 374 if (primes.length==0)
378 primes=findPrimes(30000); //check for divisibility by primes <=30000 375 primes=findPrimes(30000); //check for divisibility by primes <=30000
379 376
380 if (pows.length==0) { 377 if (pows.length==0) {
381 pows=new Array(512); 378 pows=new Array(512);
382 for (j=0;j<512;j++) { 379 for (j=0;j<512;j++) {
383 pows[j]=Math.pow(2,j/511.-1.); 380 pows[j]=Math.pow(2,j/511.-1.);
384 } 381 }
385 } 382 }
386 383
387 //c and m should be tuned for a particular machine and value of k, to maximize speed 384 //c and m should be tuned for a particular machine and value of k, to maximize speed
388 //this was: c=primes[primes.length-1]/k/k; //check using all the small primes. (c=0.1 in HAC) 385 //this was: c=primes[primes.length-1]/k/k; //check using all the small primes. (c=0.1 in HAC)
389 c=0.1; 386 c=0.1;
390 m=20; //generate this k-bit number by first recursively generating a number that has between k/2 and k-m bits 387 m=20; //generate this k-bit number by first recursively generating a number that has between k/2 and k-m bits
391 recLimit=20; /*must be at least 2 (was 29)*/ //stop recursion when k <=recLimit 388 recLimit=20; /*must be at least 2 (was 29)*/ //stop recursion when k <=recLimit
392 389
393 if (s_i2.length!=ans.length) { 390 if (s_i2.length!=ans.length) {
394 s_i2=dup(ans); 391 s_i2=dup(ans);
395 s_R =dup(ans); 392 s_R =dup(ans);
396 s_n1=dup(ans); 393 s_n1=dup(ans);
397 s_r2=dup(ans); 394 s_r2=dup(ans);
398 s_d =dup(ans); 395 s_d =dup(ans);
399 s_x1=dup(ans); 396 s_x1=dup(ans);
400 s_x2=dup(ans); 397 s_x2=dup(ans);
401 s_b =dup(ans); 398 s_b =dup(ans);
402 s_n =dup(ans); 399 s_n =dup(ans);
403 s_i =dup(ans); 400 s_i =dup(ans);
404 s_rm=dup(ans); 401 s_rm=dup(ans);
405 s_q =dup(ans); 402 s_q =dup(ans);
406 s_a =dup(ans); 403 s_a =dup(ans);
407 s_aa=dup(ans); 404 s_aa=dup(ans);
408 } 405 }
diff --git a/frontend/gamma/js/Clipperz/Crypto/BigInt_scoped.js b/frontend/gamma/js/Clipperz/Crypto/BigInt_scoped.js
index e91e823..f91c7e9 100644
--- a/frontend/gamma/js/Clipperz/Crypto/BigInt_scoped.js
+++ b/frontend/gamma/js/Clipperz/Crypto/BigInt_scoped.js
@@ -1,408 +1,405 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
30if (typeof(Clipperz.Crypto) == 'undefined') { Clipperz.Crypto = {}; } 27if (typeof(Clipperz.Crypto) == 'undefined') { Clipperz.Crypto = {}; }
31 28
32if (typeof(Leemon) == 'undefined') { Leemon = {}; } 29if (typeof(Leemon) == 'undefined') { Leemon = {}; }
33if (typeof(Baird.Crypto) == 'undefined') { Baird.Crypto = {}; } 30if (typeof(Baird.Crypto) == 'undefined') { Baird.Crypto = {}; }
34if (typeof(Baird.Crypto.BigInt) == 'undefined') { Baird.Crypto.BigInt = {}; } 31if (typeof(Baird.Crypto.BigInt) == 'undefined') { Baird.Crypto.BigInt = {}; }
35 32
36 33
37//############################################################################# 34//#############################################################################
38 //Downloaded on March 05, 2007 from http://www.leemon.com/crypto/BigInt.js 35 //Downloaded on March 05, 2007 from http://www.leemon.com/crypto/BigInt.js
39//############################################################################# 36//#############################################################################
40 37
41//////////////////////////////////////////////////////////////////////////////////////// 38////////////////////////////////////////////////////////////////////////////////////////
42// Big Integer Library v. 5.0 39// Big Integer Library v. 5.0
43// Created 2000, last modified 2006 40// Created 2000, last modified 2006
44// Leemon Baird 41// Leemon Baird
45// www.leemon.com 42// www.leemon.com
46// 43//
47// This file is public domain. You can use it for any purpose without restriction. 44// This file is public domain. You can use it for any purpose without restriction.
48// I do not guarantee that it is correct, so use it at your own risk. If you use 45// I do not guarantee that it is correct, so use it at your own risk. If you use
49// it for something interesting, I'd appreciate hearing about it. If you find 46// it for something interesting, I'd appreciate hearing about it. If you find
50// any bugs or make any improvements, I'd appreciate hearing about those too. 47// any bugs or make any improvements, I'd appreciate hearing about those too.
51// It would also be nice if my name and address were left in the comments. 48// It would also be nice if my name and address were left in the comments.
52// But none of that is required. 49// But none of that is required.
53// 50//
54// This code defines a bigInt library for arbitrary-precision integers. 51// This code defines a bigInt library for arbitrary-precision integers.
55// A bigInt is an array of integers storing the value in chunks of bpe bits, 52// A bigInt is an array of integers storing the value in chunks of bpe bits,
56// little endian (buff[0] is the least significant word). 53// little endian (buff[0] is the least significant word).
57// Negative bigInts are stored two's complement. 54// Negative bigInts are stored two's complement.
58// Some functions assume their parameters have at least one leading zero element. 55// Some functions assume their parameters have at least one leading zero element.
59// Functions with an underscore at the end of the name have unpredictable behavior in case of overflow, 56// Functions with an underscore at the end of the name have unpredictable behavior in case of overflow,
60// so the caller must make sure overflow won't happen. 57// so the caller must make sure overflow won't happen.
61// For each function where a parameter is modified, that same 58// For each function where a parameter is modified, that same
62// variable must not be used as another argument too. 59// variable must not be used as another argument too.
63// So, you cannot square x by doing multMod_(x,x,n). 60// So, you cannot square x by doing multMod_(x,x,n).
64// You must use squareMod_(x,n) instead, or do y=dup(x); multMod_(x,y,n). 61// You must use squareMod_(x,n) instead, or do y=dup(x); multMod_(x,y,n).
65// 62//
66// These functions are designed to avoid frequent dynamic memory allocation in the inner loop. 63// These functions are designed to avoid frequent dynamic memory allocation in the inner loop.
67// For most functions, if it needs a BigInt as a local variable it will actually use 64// For most functions, if it needs a BigInt as a local variable it will actually use
68// a global, and will only allocate to it when it's not the right size. This ensures 65// a global, and will only allocate to it when it's not the right size. This ensures
69// that when a function is called repeatedly with same-sized parameters, it only allocates 66// that when a function is called repeatedly with same-sized parameters, it only allocates
70// memory on the first call. 67// memory on the first call.
71// 68//
72// Note that for cryptographic purposes, the calls to Math.random() must 69// Note that for cryptographic purposes, the calls to Math.random() must
73// be replaced with calls to a better pseudorandom number generator. 70// be replaced with calls to a better pseudorandom number generator.
74// 71//
75// In the following, "bigInt" means a bigInt with at least one leading zero element, 72// In the following, "bigInt" means a bigInt with at least one leading zero element,
76// and "integer" means a nonnegative integer less than radix. In some cases, integer 73// and "integer" means a nonnegative integer less than radix. In some cases, integer
77// can be negative. Negative bigInts are 2s complement. 74// can be negative. Negative bigInts are 2s complement.
78// 75//
79// The following functions do not modify their inputs, but dynamically allocate memory every time they are called: 76// The following functions do not modify their inputs, but dynamically allocate memory every time they are called:
80// 77//
81// function bigInt2str(x,base) //convert a bigInt into a string in a given base, from base 2 up to base 95 78// function bigInt2str(x,base) //convert a bigInt into a string in a given base, from base 2 up to base 95
82// function dup(x) //returns a copy of bigInt x 79// function dup(x) //returns a copy of bigInt x
83// function findPrimes(n) //return array of all primes less than integer n 80// function findPrimes(n) //return array of all primes less than integer n
84// function int2bigInt(t,n,m) //convert integer t to a bigInt with at least n bits and m array elements 81// function int2bigInt(t,n,m) //convert integer t to a bigInt with at least n bits and m array elements
85// function str2bigInt(s,b,n,m) //convert string s in base b 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
86// function trim(x,k) //return a copy of x with exactly k leading zero elements 83// function trim(x,k) //return a copy of x with exactly k leading zero elements
87// 84//
88// The following functions do not modify their inputs, so there is never a problem with the result being too big: 85// The following functions do not modify their inputs, so there is never a problem with the result being too big:
89// 86//
90// function bitSize(x) //returns how many bits long the bigInt x is, not counting leading zeros 87// function bitSize(x) //returns how many bits long the bigInt x is, not counting leading zeros
91// function equals(x,y) //is the bigInt x equal to the bigint y? 88// function equals(x,y) //is the bigInt x equal to the bigint y?
92// function equalsInt(x,y) //is bigint x equal to integer y? 89// function equalsInt(x,y) //is bigint x equal to integer y?
93// function greater(x,y) //is x>y? (x and y are nonnegative bigInts) 90// function greater(x,y) //is x>y? (x and y are nonnegative bigInts)
94// function greaterShift(x,y,shift)//is (x <<(shift*bpe)) > y? 91// function greaterShift(x,y,shift)//is (x <<(shift*bpe)) > y?
95// function isZero(x) //is the bigInt x equal to zero? 92// function isZero(x) //is the bigInt x equal to zero?
96// 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)? 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)?
97// function modInt(x,n) //return x mod n for bigInt x and integer n. 94// function modInt(x,n) //return x mod n for bigInt x and integer n.
98// function negative(x) //is bigInt x negative? 95// function negative(x) //is bigInt x negative?
99// 96//
100// The following functions do not modify their inputs, but allocate memory and call functions with underscores 97// The following functions do not modify their inputs, but allocate memory and call functions with underscores
101// 98//
102// function add(x,y) //return (x+y) for bigInts x and y. 99// function add(x,y) //return (x+y) for bigInts x and y.
103// function addInt(x,n) //return (x+n) where x is a bigInt and n is an integer. 100// function addInt(x,n) //return (x+n) where x is a bigInt and n is an integer.
104// function expand(x,n) //return a copy of x with at least n elements, adding leading zeros if needed 101// function expand(x,n) //return a copy of x with at least n elements, adding leading zeros if needed
105// function inverseMod(x,n) //return (x**(-1) mod n) for bigInts x and n. If no inverse exists, it returns null 102// function inverseMod(x,n) //return (x**(-1) mod n) for bigInts x and n. If no inverse exists, it returns null
106// function mod(x,n) //return a new bigInt equal to (x mod n) for bigInts x and n. 103// function mod(x,n) //return a new bigInt equal to (x mod n) for bigInts x and n.
107// function mult(x,y) //return x*y for bigInts x and y. This is faster when y<x. 104// function mult(x,y) //return x*y for bigInts x and y. This is faster when y<x.
108// function multMod(x,y,n) //return (x*y mod n) for bigInts x,y,n. For greater speed, let y<x. 105// function multMod(x,y,n) //return (x*y mod n) for bigInts x,y,n. For greater speed, let y<x.
109// 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. 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.
110// function randTruePrime(k) //return a new, random, k-bit, true prime using Maurer's algorithm. 107// function randTruePrime(k) //return a new, random, k-bit, true prime using Maurer's algorithm.
111// function sub(x,y) //return (x-y) for bigInts x and y. Negative answers will be 2s complement 108// function sub(x,y) //return (x-y) for bigInts x and y. Negative answers will be 2s complement
112// 109//
113// The following functions write a bigInt result to one of the parameters, but 110// The following functions write a bigInt result to one of the parameters, but
114// the result is never bigger than the original, so there can't be overflow problems: 111// the result is never bigger than the original, so there can't be overflow problems:
115// 112//
116// function divInt_(x,n) //do x=floor(x/n) for bigInt x and integer n, and return the remainder 113// function divInt_(x,n) //do x=floor(x/n) for bigInt x and integer n, and return the remainder
117// function GCD_(x,y) //set x to the greatest common divisor of bigInts x and y, (y is destroyed). 114// function GCD_(x,y) //set x to the greatest common divisor of bigInts x and y, (y is destroyed).
118// function halve_(x) //do x=floor(|x|/2)*sgn(x) for bigInt x in 2's complement 115// function halve_(x) //do x=floor(|x|/2)*sgn(x) for bigInt x in 2's complement
119// function mod_(x,n) //do x=x mod n for bigInts x and n. 116// function mod_(x,n) //do x=x mod n for bigInts x and n.
120// function rightShift_(x,n) //right shift bigInt x by n bits. 0 <= n < bpe. 117// function rightShift_(x,n) //right shift bigInt x by n bits. 0 <= n < bpe.
121// 118//
122// The following functions write a bigInt result to one of the parameters. The caller is responsible for 119// The following functions write a bigInt result to one of the parameters. The caller is responsible for
123// ensuring it is large enough to hold the result. 120// ensuring it is large enough to hold the result.
124// 121//
125// function addInt_(x,n) //do x=x+n where x is a bigInt and n is an integer 122// function addInt_(x,n) //do x=x+n where x is a bigInt and n is an integer
126// function add_(x,y) //do x=x+y for bigInts x and y 123// function add_(x,y) //do x=x+y for bigInts x and y
127// function addShift_(x,y,ys) //do x=x+(y<<(ys*bpe)) 124// function addShift_(x,y,ys) //do x=x+(y<<(ys*bpe))
128// function copy_(x,y) //do x=y on bigInts x and y 125// function copy_(x,y) //do x=y on bigInts x and y
129// function copyInt_(x,n) //do x=n on bigInt x and integer n 126// function copyInt_(x,n) //do x=n on bigInt x and integer n
130// function carry_(x) //do carries and borrows so each element of the bigInt x fits in bpe bits. 127// function carry_(x) //do carries and borrows so each element of the bigInt x fits in bpe bits.
131// function divide_(x,y,q,r) //divide_ x by y giving quotient q and remainder r 128// function divide_(x,y,q,r) //divide_ x by y giving quotient q and remainder r
132// 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 129// 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
133// function inverseMod_(x,n) //do x=x**(-1) mod n, for bigInts x and n. Returns 1 (0) if inverse does (doesn't) exist 130// function inverseMod_(x,n) //do x=x**(-1) mod n, for bigInts x and n. Returns 1 (0) if inverse does (doesn't) exist
134// function inverseModInt_(x,n) //return x**(-1) mod n, for integers x and n. Return 0 if there is no inverse 131// function inverseModInt_(x,n) //return x**(-1) mod n, for integers x and n. Return 0 if there is no inverse
135// function leftShift_(x,n) //left shift bigInt x by n bits. n<bpe. 132// function leftShift_(x,n) //left shift bigInt x by n bits. n<bpe.
136// function linComb_(x,y,a,b) //do x=a*x+b*y for bigInts x and y and integers a and b 133// function linComb_(x,y,a,b) //do x=a*x+b*y for bigInts x and y and integers a and b
137// function linCombShift_(x,y,b,ys) //do x=x+b*(y<<(ys*bpe)) for bigInts x and y, and integers b and ys 134// function linCombShift_(x,y,b,ys) //do x=x+b*(y<<(ys*bpe)) for bigInts x and y, and integers b and ys
138// function mont_(x,y,n,np) //Montgomery multiplication (see comments where the function is defined) 135// function mont_(x,y,n,np) //Montgomery multiplication (see comments where the function is defined)
139// function mult_(x,y) //do x=x*y for bigInts x and y. 136// function mult_(x,y) //do x=x*y for bigInts x and y.
140// function multInt_(x,n) //do x=x*n where x is a bigInt and n is an integer. 137// function multInt_(x,n) //do x=x*n where x is a bigInt and n is an integer.
141// function multMod_(x,y,n) //do x=x*y mod n for bigInts x,y,n. 138// function multMod_(x,y,n) //do x=x*y mod n for bigInts x,y,n.
142// 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. 139// 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.
143// 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. 140// 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.
144// function randTruePrime_(ans,k) //do ans = a random k-bit true random prime (not just probable prime) with 1 in the msb. 141// function randTruePrime_(ans,k) //do ans = a random k-bit true random prime (not just probable prime) with 1 in the msb.
145// function squareMod_(x,n) //do x=x*x mod n for bigInts x,n 142// function squareMod_(x,n) //do x=x*x mod n for bigInts x,n
146// function sub_(x,y) //do x=x-y for bigInts x and y. Negative answers will be 2s complement. 143// function sub_(x,y) //do x=x-y for bigInts x and y. Negative answers will be 2s complement.
147// function subShift_(x,y,ys) //do x=x-(y<<(ys*bpe)). Negative answers will be 2s complement. 144// function subShift_(x,y,ys) //do x=x-(y<<(ys*bpe)). Negative answers will be 2s complement.
148// 145//
149// The following functions are based on algorithms from the _Handbook of Applied Cryptography_ 146// The following functions are based on algorithms from the _Handbook of Applied Cryptography_
150// powMod_() = algorithm 14.94, Montgomery exponentiation 147// powMod_() = algorithm 14.94, Montgomery exponentiation
151// eGCD_,inverseMod_() = algorithm 14.61, Binary extended GCD_ 148// eGCD_,inverseMod_() = algorithm 14.61, Binary extended GCD_
152// GCD_() = algorothm 14.57, Lehmer's algorithm 149// GCD_() = algorothm 14.57, Lehmer's algorithm
153// mont_() = algorithm 14.36, Montgomery multiplication 150// mont_() = algorithm 14.36, Montgomery multiplication
154// divide_() = algorithm 14.20 Multiple-precision division 151// divide_() = algorithm 14.20 Multiple-precision division
155// squareMod_() = algorithm 14.16 Multiple-precision squaring 152// squareMod_() = algorithm 14.16 Multiple-precision squaring
156// randTruePrime_() = algorithm 4.62, Maurer's algorithm 153// randTruePrime_() = algorithm 4.62, Maurer's algorithm
157// millerRabin() = algorithm 4.24, Miller-Rabin algorithm 154// millerRabin() = algorithm 4.24, Miller-Rabin algorithm
158// 155//
159// Profiling shows: 156// Profiling shows:
160// randTruePrime_() spends: 157// randTruePrime_() spends:
161// 10% of its time in calls to powMod_() 158// 10% of its time in calls to powMod_()
162// 85% of its time in calls to millerRabin() 159// 85% of its time in calls to millerRabin()
163// millerRabin() spends: 160// millerRabin() spends:
164// 99% of its time in calls to powMod_() (always with a base of 2) 161// 99% of its time in calls to powMod_() (always with a base of 2)
165// powMod_() spends: 162// powMod_() spends:
166// 94% of its time in calls to mont_() (almost always with x==y) 163// 94% of its time in calls to mont_() (almost always with x==y)
167// 164//
168// This suggests there are several ways to speed up this library slightly: 165// This suggests there are several ways to speed up this library slightly:
169// - convert powMod_ to use a Montgomery form of k-ary window (or maybe a Montgomery form of sliding window) 166// - convert powMod_ to use a Montgomery form of k-ary window (or maybe a Montgomery form of sliding window)
170// -- this should especially focus on being fast when raising 2 to a power mod n 167// -- this should especially focus on being fast when raising 2 to a power mod n
171// - convert randTruePrime_() to use a minimum r of 1/3 instead of 1/2 with the appropriate change to the test 168// - convert randTruePrime_() to use a minimum r of 1/3 instead of 1/2 with the appropriate change to the test
172// - tune the parameters in randTruePrime_(), including c, m, and recLimit 169// - tune the parameters in randTruePrime_(), including c, m, and recLimit
173// - speed up the single loop in mont_() that takes 95% of the runtime, perhaps by reducing checking 170// - speed up the single loop in mont_() that takes 95% of the runtime, perhaps by reducing checking
174// within the loop when all the parameters are the same length. 171// within the loop when all the parameters are the same length.
175// 172//
176// There are several ideas that look like they wouldn't help much at all: 173// There are several ideas that look like they wouldn't help much at all:
177// - replacing trial division in randTruePrime_() with a sieve (that speeds up something taking almost no time anyway) 174// - replacing trial division in randTruePrime_() with a sieve (that speeds up something taking almost no time anyway)
178// - 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) 175// - 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)
179// - speeding up mont_(x,y,n,np) when x==y by doing a non-modular, non-Montgomery square 176// - speeding up mont_(x,y,n,np) when x==y by doing a non-modular, non-Montgomery square
180// followed by a Montgomery reduction. The intermediate answer will be twice as long as x, so that 177// followed by a Montgomery reduction. The intermediate answer will be twice as long as x, so that
181// method would be slower. This is unfortunate because the code currently spends almost all of its time 178// method would be slower. This is unfortunate because the code currently spends almost all of its time
182// doing mont_(x,x,...), both for randTruePrime_() and powMod_(). A faster method for Montgomery squaring 179// doing mont_(x,x,...), both for randTruePrime_() and powMod_(). A faster method for Montgomery squaring
183// would have a large impact on the speed of randTruePrime_() and powMod_(). HAC has a couple of poorly-worded 180// would have a large impact on the speed of randTruePrime_() and powMod_(). HAC has a couple of poorly-worded
184// sentences that seem to imply it's faster to do a non-modular square followed by a single 181// sentences that seem to imply it's faster to do a non-modular square followed by a single
185// Montgomery reduction, but that's obviously wrong. 182// Montgomery reduction, but that's obviously wrong.
186//////////////////////////////////////////////////////////////////////////////////////// 183////////////////////////////////////////////////////////////////////////////////////////
187 184
188// 185//
189 //The whole library has been moved into the Baird.Crypto.BigInt scope by Giulio Cesare Solaroli <giulio.cesare@clipperz.com> 186 //The whole library has been moved into the Baird.Crypto.BigInt scope by Giulio Cesare Solaroli <giulio.cesare@clipperz.com>
190// 187//
191Baird.Crypto.BigInt.VERSION = "5.0"; 188Baird.Crypto.BigInt.VERSION = "5.0";
192Baird.Crypto.BigInt.NAME = "Baird.Crypto.BigInt"; 189Baird.Crypto.BigInt.NAME = "Baird.Crypto.BigInt";
193 190
194MochiKit.Base.update(Baird.Crypto.BigInt, { 191MochiKit.Base.update(Baird.Crypto.BigInt, {
195 //globals 192 //globals
196 'bpe': 0, //bits stored per array element 193 'bpe': 0, //bits stored per array element
197 'mask': 0, //AND this with an array element to chop it down to bpe bits 194 'mask': 0, //AND this with an array element to chop it down to bpe bits
198 'radix': Baird.Crypto.BigInt.mask + 1,//equals 2^bpe. A single 1 bit to the left of the last bit of mask. 195 'radix': Baird.Crypto.BigInt.mask + 1,//equals 2^bpe. A single 1 bit to the left of the last bit of mask.
199 196
200 //the digits for converting to different bases 197 //the digits for converting to different bases
201 'digitsStr': '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_=!@#$%^&*()[]{}|;:,.<>/?`~ \\\'\"+-', 198 'digitsStr': '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_=!@#$%^&*()[]{}|;:,.<>/?`~ \\\'\"+-',
202 199
203//initialize the global variables 200//initialize the global variables
204for (bpe=0; (1<<(bpe+1)) > (1<<bpe); bpe++); //bpe=number of bits in the mantissa on this platform 201for (bpe=0; (1<<(bpe+1)) > (1<<bpe); bpe++); //bpe=number of bits in the mantissa on this platform
205bpe>>=1; //bpe=number of bits in one element of the array representing the bigInt 202bpe>>=1; //bpe=number of bits in one element of the array representing the bigInt
206mask=(1<<bpe)-1; //AND the mask with an integer to get its bpe least significant bits 203mask=(1<<bpe)-1; //AND the mask with an integer to get its bpe least significant bits
207radix=mask+1; //2^bpe. a single 1 bit to the left of the first bit of mask 204radix=mask+1; //2^bpe. a single 1 bit to the left of the first bit of mask
208one=int2bigInt(1,1,1); //constant used in powMod_() 205one=int2bigInt(1,1,1); //constant used in powMod_()
209 206
210//the following global variables are scratchpad memory to 207//the following global variables are scratchpad memory to
211//reduce dynamic memory allocation in the inner loop 208//reduce dynamic memory allocation in the inner loop
212t=new Array(0); 209t=new Array(0);
213ss=t; //used in mult_() 210ss=t; //used in mult_()
214s0=t; //used in multMod_(), squareMod_() 211s0=t; //used in multMod_(), squareMod_()
215s1=t; //used in powMod_(), multMod_(), squareMod_() 212s1=t; //used in powMod_(), multMod_(), squareMod_()
216s2=t; //used in powMod_(), multMod_() 213s2=t; //used in powMod_(), multMod_()
217s3=t; //used in powMod_() 214s3=t; //used in powMod_()
218s4=t; s5=t; //used in mod_() 215s4=t; s5=t; //used in mod_()
219s6=t; //used in bigInt2str() 216s6=t; //used in bigInt2str()
220s7=t; //used in powMod_() 217s7=t; //used in powMod_()
221T=t; //used in GCD_() 218T=t; //used in GCD_()
222sa=t; //used in mont_() 219sa=t; //used in mont_()
223mr_x1=t; mr_r=t; mr_a=t; //used in millerRabin() 220mr_x1=t; mr_r=t; mr_a=t; //used in millerRabin()
224eg_v=t; eg_u=t; eg_A=t; eg_B=t; eg_C=t; eg_D=t; //used in eGCD_(), inverseMod_() 221eg_v=t; eg_u=t; eg_A=t; eg_B=t; eg_C=t; eg_D=t; //used in eGCD_(), inverseMod_()
225md_q1=t; md_q2=t; md_q3=t; md_r=t; md_r1=t; md_r2=t; md_tt=t; //used in mod_() 222md_q1=t; md_q2=t; md_q3=t; md_r=t; md_r1=t; md_r2=t; md_tt=t; //used in mod_()
226 223
227primes=t; pows=t; s_i=t; s_i2=t; s_R=t; s_rm=t; s_q=t; s_n1=t; 224primes=t; pows=t; s_i=t; s_i2=t; s_R=t; s_rm=t; s_q=t; s_n1=t;
228 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_() 225 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_()
229 226
230//////////////////////////////////////////////////////////////////////////////////////// 227////////////////////////////////////////////////////////////////////////////////////////
231 228
232 //return array of all primes less than integer n 229 //return array of all primes less than integer n
233 'findPrimes': function(n) { 230 'findPrimes': function(n) {
234 var i,s,p,ans; 231 var i,s,p,ans;
235 s=new Array(n); 232 s=new Array(n);
236 for (i=0;i<n;i++) 233 for (i=0;i<n;i++)
237 s[i]=0; 234 s[i]=0;
238 s[0]=2; 235 s[0]=2;
239 p=0; //first p elements of s are primes, the rest are a sieve 236 p=0; //first p elements of s are primes, the rest are a sieve
240 for(;s[p]<n;) { //s[p] is the pth prime 237 for(;s[p]<n;) { //s[p] is the pth prime
241 for(i=s[p]*s[p]; i<n; i+=s[p]) //mark multiples of s[p] 238 for(i=s[p]*s[p]; i<n; i+=s[p]) //mark multiples of s[p]
242 s[i]=1; 239 s[i]=1;
243 p++; 240 p++;
244 s[p]=s[p-1]+1; 241 s[p]=s[p-1]+1;
245 for(; s[p]<n && s[s[p]]; s[p]++); //find next prime (where s[p]==0) 242 for(; s[p]<n && s[s[p]]; s[p]++); //find next prime (where s[p]==0)
246 } 243 }
247 ans=new Array(p); 244 ans=new Array(p);
248 for(i=0;i<p;i++) 245 for(i=0;i<p;i++)
249 ans[i]=s[i]; 246 ans[i]=s[i];
250 return ans; 247 return ans;
251 }, 248 },
252 249
253 //does a single round of Miller-Rabin base b consider x to be a possible prime? 250 //does a single round of Miller-Rabin base b consider x to be a possible prime?
254 //x is a bigInt, and b is an integer 251 //x is a bigInt, and b is an integer
255 'millerRabin': function(x,b) { 252 'millerRabin': function(x,b) {
256 var i,j,k,s; 253 var i,j,k,s;
257 254
258 if (mr_x1.length!=x.length) { 255 if (mr_x1.length!=x.length) {
259 mr_x1=dup(x); 256 mr_x1=dup(x);
260 mr_r=dup(x); 257 mr_r=dup(x);
261 mr_a=dup(x); 258 mr_a=dup(x);
262 } 259 }
263 260
264 copyInt_(mr_a,b); 261 copyInt_(mr_a,b);
265 copy_(mr_r,x); 262 copy_(mr_r,x);
266 copy_(mr_x1,x); 263 copy_(mr_x1,x);
267 264
268 addInt_(mr_r,-1); 265 addInt_(mr_r,-1);
269 addInt_(mr_x1,-1); 266 addInt_(mr_x1,-1);
270 267
271 //s=the highest power of two that divides mr_r 268 //s=the highest power of two that divides mr_r
272 k=0; 269 k=0;
273 for (i=0;i<mr_r.length;i++) 270 for (i=0;i<mr_r.length;i++)
274 for (j=1;j<mask;j<<=1) 271 for (j=1;j<mask;j<<=1)
275 if (x[i] & j) { 272 if (x[i] & j) {
276 s=(k<mr_r.length+bpe ? k : 0); 273 s=(k<mr_r.length+bpe ? k : 0);
277 i=mr_r.length; 274 i=mr_r.length;
278 j=mask; 275 j=mask;
279 } else 276 } else
280 k++; 277 k++;
281 278
282 if (s) 279 if (s)
283 rightShift_(mr_r,s); 280 rightShift_(mr_r,s);
284 281
285 powMod_(mr_a,mr_r,x); 282 powMod_(mr_a,mr_r,x);
286 283
287 if (!equalsInt(mr_a,1) && !equals(mr_a,mr_x1)) { 284 if (!equalsInt(mr_a,1) && !equals(mr_a,mr_x1)) {
288 j=1; 285 j=1;
289 while (j<=s-1 && !equals(mr_a,mr_x1)) { 286 while (j<=s-1 && !equals(mr_a,mr_x1)) {
290 squareMod_(mr_a,x); 287 squareMod_(mr_a,x);
291 if (equalsInt(mr_a,1)) { 288 if (equalsInt(mr_a,1)) {
292 return 0; 289 return 0;
293 } 290 }
294 j++; 291 j++;
295 } 292 }
296 if (!equals(mr_a,mr_x1)) { 293 if (!equals(mr_a,mr_x1)) {
297 return 0; 294 return 0;
298 } 295 }
299 } 296 }
300 297
301 return 1; 298 return 1;
302 }, 299 },
303 300
304 //returns how many bits long the bigInt is, not counting leading zeros. 301 //returns how many bits long the bigInt is, not counting leading zeros.
305 'bitSize': function(x) { 302 'bitSize': function(x) {
306 var j,z,w; 303 var j,z,w;
307 for (j=x.length-1; (x[j]==0) && (j>0); j--); 304 for (j=x.length-1; (x[j]==0) && (j>0); j--);
308 for (z=0,w=x[j]; w; (w>>=1),z++); 305 for (z=0,w=x[j]; w; (w>>=1),z++);
309 z+=bpe*j; 306 z+=bpe*j;
310 return z; 307 return z;
311 }, 308 },
312 309
313 //return a copy of x with at least n elements, adding leading zeros if needed 310 //return a copy of x with at least n elements, adding leading zeros if needed
314 'expand': function(x,n) { 311 'expand': function(x,n) {
315 var ans=int2bigInt(0,(x.length>n ? x.length : n)*bpe,0); 312 var ans=int2bigInt(0,(x.length>n ? x.length : n)*bpe,0);
316 copy_(ans,x); 313 copy_(ans,x);
317 return ans; 314 return ans;
318 }, 315 },
319 316
320 //return a k-bit true random prime using Maurer's algorithm. 317 //return a k-bit true random prime using Maurer's algorithm.
321 'randTruePrime': function(k) { 318 'randTruePrime': function(k) {
322 var ans=int2bigInt(0,k,0); 319 var ans=int2bigInt(0,k,0);
323 randTruePrime_(ans,k); 320 randTruePrime_(ans,k);
324 return trim(ans,1); 321 return trim(ans,1);
325 }, 322 },
326 323
327 //return a new bigInt equal to (x mod n) for bigInts x and n. 324 //return a new bigInt equal to (x mod n) for bigInts x and n.
328 'mod': function(x,n) { 325 'mod': function(x,n) {
329 var ans=dup(x); 326 var ans=dup(x);
330 mod_(ans,n); 327 mod_(ans,n);
331 return trim(ans,1); 328 return trim(ans,1);
332 }, 329 },
333 330
334 //return (x+n) where x is a bigInt and n is an integer. 331 //return (x+n) where x is a bigInt and n is an integer.
335 'addInt': function(x,n) { 332 'addInt': function(x,n) {
336 var ans=expand(x,x.length+1); 333 var ans=expand(x,x.length+1);
337 addInt_(ans,n); 334 addInt_(ans,n);
338 return trim(ans,1); 335 return trim(ans,1);
339 }, 336 },
340 337
341 //return x*y for bigInts x and y. This is faster when y<x. 338 //return x*y for bigInts x and y. This is faster when y<x.
342 'mult': function(x,y) { 339 'mult': function(x,y) {
343 var ans=expand(x,x.length+y.length); 340 var ans=expand(x,x.length+y.length);
344 mult_(ans,y); 341 mult_(ans,y);
345 return trim(ans,1); 342 return trim(ans,1);
346 }, 343 },
347 344
348 //return (x**y mod n) where x,y,n are bigInts and ** is exponentiation. 0**0=1. Faster for odd n. 345 //return (x**y mod n) where x,y,n are bigInts and ** is exponentiation. 0**0=1. Faster for odd n.
349 'powMod': function(x,y,n) { 346 'powMod': function(x,y,n) {
350 var ans=expand(x,n.length); 347 var ans=expand(x,n.length);
351 powMod_(ans,trim(y,2),trim(n,2),0); //this should work without the trim, but doesn't 348 powMod_(ans,trim(y,2),trim(n,2),0); //this should work without the trim, but doesn't
352 return trim(ans,1); 349 return trim(ans,1);
353 }, 350 },
354 351
355 //return (x-y) for bigInts x and y. Negative answers will be 2s complement 352 //return (x-y) for bigInts x and y. Negative answers will be 2s complement
356 'sub': function(x,y) { 353 'sub': function(x,y) {
357 var ans=expand(x,(x.length>y.length ? x.length+1 : y.length+1)); 354 var ans=expand(x,(x.length>y.length ? x.length+1 : y.length+1));
358 sub_(ans,y); 355 sub_(ans,y);
359 return trim(ans,1); 356 return trim(ans,1);
360 }, 357 },
361 358
362 //return (x+y) for bigInts x and y. 359 //return (x+y) for bigInts x and y.
363 'add': function(x,y) { 360 'add': function(x,y) {
364 var ans=expand(x,(x.length>y.length ? x.length+1 : y.length+1)); 361 var ans=expand(x,(x.length>y.length ? x.length+1 : y.length+1));
365 add_(ans,y); 362 add_(ans,y);
366 return trim(ans,1); 363 return trim(ans,1);
367 }, 364 },
368 365
369 //return (x**(-1) mod n) for bigInts x and n. If no inverse exists, it returns null 366 //return (x**(-1) mod n) for bigInts x and n. If no inverse exists, it returns null
370 'inverseMod': function(x,n) { 367 'inverseMod': function(x,n) {
371 var ans=expand(x,n.length); 368 var ans=expand(x,n.length);
372 var s; 369 var s;
373 s=inverseMod_(ans,n); 370 s=inverseMod_(ans,n);
374 return s ? trim(ans,1) : null; 371 return s ? trim(ans,1) : null;
375 }, 372 },
376 373
377 //return (x*y mod n) for bigInts x,y,n. For greater speed, let y<x. 374 //return (x*y mod n) for bigInts x,y,n. For greater speed, let y<x.
378 'multMod': function(x,y,n) { 375 'multMod': function(x,y,n) {
379 var ans=expand(x,n.length); 376 var ans=expand(x,n.length);
380 multMod_(ans,y,n); 377 multMod_(ans,y,n);
381 return trim(ans,1); 378 return trim(ans,1);
382 }, 379 },
383 380
384 //generate a k-bit true random prime using Maurer's algorithm, 381 //generate a k-bit true random prime using Maurer's algorithm,
385 //and put it into ans. The bigInt ans must be large enough to hold it. 382 //and put it into ans. The bigInt ans must be large enough to hold it.
386 'randTruePrime_': function(ans,k) { 383 'randTruePrime_': function(ans,k) {
387 var c,m,pm,dd,j,r,B,divisible,z,zz,recSize; 384 var c,m,pm,dd,j,r,B,divisible,z,zz,recSize;
388 385
389 if (primes.length==0) 386 if (primes.length==0)
390 primes=findPrimes(30000); //check for divisibility by primes <=30000 387 primes=findPrimes(30000); //check for divisibility by primes <=30000
391 388
392 if (pows.length==0) { 389 if (pows.length==0) {
393 pows=new Array(512); 390 pows=new Array(512);
394 for (j=0;j<512;j++) { 391 for (j=0;j<512;j++) {
395 pows[j]=Math.pow(2,j/511.-1.); 392 pows[j]=Math.pow(2,j/511.-1.);
396 } 393 }
397 } 394 }
398 395
399 //c and m should be tuned for a particular machine and value of k, to maximize speed 396 //c and m should be tuned for a particular machine and value of k, to maximize speed
400 //this was: c=primes[primes.length-1]/k/k; //check using all the small primes. (c=0.1 in HAC) 397 //this was: c=primes[primes.length-1]/k/k; //check using all the small primes. (c=0.1 in HAC)
401 c=0.1; 398 c=0.1;
402 m=20; //generate this k-bit number by first recursively generating a number that has between k/2 and k-m bits 399 m=20; //generate this k-bit number by first recursively generating a number that has between k/2 and k-m bits
403 recLimit=20; /*must be at least 2 (was 29)*/ //stop recursion when k <=recLimit 400 recLimit=20; /*must be at least 2 (was 29)*/ //stop recursion when k <=recLimit
404 401
405 if (s_i2.length!=ans.length) { 402 if (s_i2.length!=ans.length) {
406 s_i2=dup(ans); 403 s_i2=dup(ans);
407 s_R =dup(ans); 404 s_R =dup(ans);
408 s_n1=dup(ans); 405 s_n1=dup(ans);
diff --git a/frontend/gamma/js/Clipperz/Crypto/ECC/BinaryField/Curve.js b/frontend/gamma/js/Clipperz/Crypto/ECC/BinaryField/Curve.js
index 2033eb4..19f19c2 100644
--- a/frontend/gamma/js/Clipperz/Crypto/ECC/BinaryField/Curve.js
+++ b/frontend/gamma/js/Clipperz/Crypto/ECC/BinaryField/Curve.js
@@ -1,408 +1,405 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29//try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) { 26//try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) {
30 //throw "Clipperz.Crypto.ECC depends on Clipperz.ByteArray!"; 27 //throw "Clipperz.Crypto.ECC depends on Clipperz.ByteArray!";
31//} 28//}
32if (typeof(Clipperz.Crypto.ECC) == 'undefined') { Clipperz.Crypto.ECC = {}; } 29if (typeof(Clipperz.Crypto.ECC) == 'undefined') { Clipperz.Crypto.ECC = {}; }
33if (typeof(Clipperz.Crypto.ECC.BinaryField) == 'undefined') { Clipperz.Crypto.ECC.BinaryField = {}; } 30if (typeof(Clipperz.Crypto.ECC.BinaryField) == 'undefined') { Clipperz.Crypto.ECC.BinaryField = {}; }
34 31
35Clipperz.Crypto.ECC.BinaryField.Curve = function(args) { 32Clipperz.Crypto.ECC.BinaryField.Curve = function(args) {
36 args = args || {}; 33 args = args || {};
37 34
38 this._modulus = args.modulus; 35 this._modulus = args.modulus;
39 36
40 this._a = args.a; 37 this._a = args.a;
41 this._b = args.b; 38 this._b = args.b;
42 this._G = args.G; 39 this._G = args.G;
43 this._r = args.r; 40 this._r = args.r;
44 this._h = args.h; 41 this._h = args.h;
45 42
46 this._finiteField = null; 43 this._finiteField = null;
47 44
48 return this; 45 return this;
49} 46}
50 47
51Clipperz.Crypto.ECC.BinaryField.Curve.prototype = MochiKit.Base.update(null, { 48Clipperz.Crypto.ECC.BinaryField.Curve.prototype = MochiKit.Base.update(null, {
52 49
53 'asString': function() { 50 'asString': function() {
54 return "Clipperz.Crypto.ECC.BinaryField.Curve"; 51 return "Clipperz.Crypto.ECC.BinaryField.Curve";
55 }, 52 },
56 53
57 //----------------------------------------------------------------------------- 54 //-----------------------------------------------------------------------------
58 55
59 'modulus': function() { 56 'modulus': function() {
60 return this._modulus; 57 return this._modulus;
61 }, 58 },
62 59
63 'a': function() { 60 'a': function() {
64 return this._a; 61 return this._a;
65 }, 62 },
66 63
67 'b': function() { 64 'b': function() {
68 return this._b; 65 return this._b;
69 }, 66 },
70 67
71 'G': function() { 68 'G': function() {
72 return this._G; 69 return this._G;
73 }, 70 },
74 71
75 'r': function() { 72 'r': function() {
76 return this._r; 73 return this._r;
77 }, 74 },
78 75
79 'h': function() { 76 'h': function() {
80 return this._h; 77 return this._h;
81 }, 78 },
82 79
83 //----------------------------------------------------------------------------- 80 //-----------------------------------------------------------------------------
84 81
85 'finiteField': function() { 82 'finiteField': function() {
86 if (this._finiteField == null) { 83 if (this._finiteField == null) {
87 this._finiteField = new Clipperz.Crypto.ECC.BinaryField.FiniteField({modulus:this.modulus()}) 84 this._finiteField = new Clipperz.Crypto.ECC.BinaryField.FiniteField({modulus:this.modulus()})
88 } 85 }
89 86
90 return this._finiteField; 87 return this._finiteField;
91 }, 88 },
92 89
93 //----------------------------------------------------------------------------- 90 //-----------------------------------------------------------------------------
94 91
95 'negate': function(aPointA) { 92 'negate': function(aPointA) {
96 var result; 93 var result;
97 94
98 result = new Clipperz.Crypto.ECC.Point({x:aPointA.x(), y:this.finiteField().add(aPointA.y(), aPointA.x())}) 95 result = new Clipperz.Crypto.ECC.Point({x:aPointA.x(), y:this.finiteField().add(aPointA.y(), aPointA.x())})
99 96
100 return result; 97 return result;
101 }, 98 },
102 99
103 //----------------------------------------------------------------------------- 100 //-----------------------------------------------------------------------------
104 101
105 'add': function(aPointA, aPointB) { 102 'add': function(aPointA, aPointB) {
106 var result; 103 var result;
107 104
108//console.log(">>> ECC.BinaryField.Curve.add"); 105//console.log(">>> ECC.BinaryField.Curve.add");
109 if (aPointA.isZero()) { 106 if (aPointA.isZero()) {
110//console.log("--- pointA == zero"); 107//console.log("--- pointA == zero");
111 result = aPointB; 108 result = aPointB;
112 } else if (aPointB.isZero()) { 109 } else if (aPointB.isZero()) {
113//console.log("--- pointB == zero"); 110//console.log("--- pointB == zero");
114 result = aPointA; 111 result = aPointA;
115 } else if ((aPointA.x().compare(aPointB.x()) == 0) && ((aPointA.y().compare(aPointB.y()) != 0) || aPointB.x().isZero())) { 112 } else if ((aPointA.x().compare(aPointB.x()) == 0) && ((aPointA.y().compare(aPointB.y()) != 0) || aPointB.x().isZero())) {
116//console.log("compare A.x - B.x: ", aPointA.x().compare(aPointB.x())); 113//console.log("compare A.x - B.x: ", aPointA.x().compare(aPointB.x()));
117//console.log("compare A.y - B.y: ", (aPointA.y().compare(aPointB.y()) != 0)); 114//console.log("compare A.y - B.y: ", (aPointA.y().compare(aPointB.y()) != 0));
118//console.log("compare B.x.isZero(): ", aPointB.x().isZero()); 115//console.log("compare B.x.isZero(): ", aPointB.x().isZero());
119 116
120//console.log("--- result = zero"); 117//console.log("--- result = zero");
121 result = new Clipperz.Crypto.ECC.BinaryField.Point({x:Clipperz.Crypto.ECC.BinaryField.Value.O, y:Clipperz.Crypto.ECC.BinaryField.Value.O}); 118 result = new Clipperz.Crypto.ECC.BinaryField.Point({x:Clipperz.Crypto.ECC.BinaryField.Value.O, y:Clipperz.Crypto.ECC.BinaryField.Value.O});
122 } else { 119 } else {
123//console.log("--- result = ELSE"); 120//console.log("--- result = ELSE");
124 varf2m; 121 varf2m;
125 var x, y; 122 var x, y;
126 var lambda; 123 var lambda;
127 var aX, aY, bX, bY; 124 var aX, aY, bX, bY;
128 125
129 aX = aPointA.x()._value; 126 aX = aPointA.x()._value;
130 aY = aPointA.y()._value; 127 aY = aPointA.y()._value;
131 bX = aPointB.x()._value; 128 bX = aPointB.x()._value;
132 bY = aPointB.y()._value; 129 bY = aPointB.y()._value;
133 130
134 f2m = this.finiteField(); 131 f2m = this.finiteField();
135 132
136 if (aPointA.x().compare(aPointB.x()) != 0) { 133 if (aPointA.x().compare(aPointB.x()) != 0) {
137//console.log(" a.x != b.x"); 134//console.log(" a.x != b.x");
138 lambda =f2m._fastMultiply( 135 lambda =f2m._fastMultiply(
139 f2m._add(aY, bY), 136 f2m._add(aY, bY),
140 f2m._inverse(f2m._add(aX, bX)) 137 f2m._inverse(f2m._add(aX, bX))
141 ); 138 );
142 x = f2m._add(this.a()._value, f2m._square(lambda)); 139 x = f2m._add(this.a()._value, f2m._square(lambda));
143 f2m._overwriteAdd(x, lambda); 140 f2m._overwriteAdd(x, lambda);
144 f2m._overwriteAdd(x, aX); 141 f2m._overwriteAdd(x, aX);
145 f2m._overwriteAdd(x, bX); 142 f2m._overwriteAdd(x, bX);
146 } else { 143 } else {
147//console.log(" a.x == b.x"); 144//console.log(" a.x == b.x");
148 lambda = f2m._add(bX, f2m._fastMultiply(bY, f2m._inverse(bX))); 145 lambda = f2m._add(bX, f2m._fastMultiply(bY, f2m._inverse(bX)));
149//console.log(" lambda: " + lambda.asString(16)); 146//console.log(" lambda: " + lambda.asString(16));
150 x = f2m._add(this.a()._value, f2m._square(lambda)); 147 x = f2m._add(this.a()._value, f2m._square(lambda));
151//console.log(" x (step 1): " + x.asString(16)); 148//console.log(" x (step 1): " + x.asString(16));
152 f2m._overwriteAdd(x, lambda); 149 f2m._overwriteAdd(x, lambda);
153//console.log(" x (step 2): " + x.asString(16)); 150//console.log(" x (step 2): " + x.asString(16));
154 } 151 }
155 152
156 y = f2m._fastMultiply(f2m._add(bX, x), lambda); 153 y = f2m._fastMultiply(f2m._add(bX, x), lambda);
157//console.log(" y (step 1): " + y.asString(16)); 154//console.log(" y (step 1): " + y.asString(16));
158 f2m._overwriteAdd(y, x); 155 f2m._overwriteAdd(y, x);
159//console.log(" y (step 2): " + y.asString(16)); 156//console.log(" y (step 2): " + y.asString(16));
160 f2m._overwriteAdd(y, bY); 157 f2m._overwriteAdd(y, bY);
161//console.log(" y (step 3): " + y.asString(16)); 158//console.log(" y (step 3): " + y.asString(16));
162 159
163 result = new Clipperz.Crypto.ECC.BinaryField.Point({x:new Clipperz.Crypto.ECC.BinaryField.Value(x), y:new Clipperz.Crypto.ECC.BinaryField.Value(y)}) 160 result = new Clipperz.Crypto.ECC.BinaryField.Point({x:new Clipperz.Crypto.ECC.BinaryField.Value(x), y:new Clipperz.Crypto.ECC.BinaryField.Value(y)})
164 } 161 }
165//console.log("<<< ECC.BinaryField.Curve.add"); 162//console.log("<<< ECC.BinaryField.Curve.add");
166 163
167 return result; 164 return result;
168 }, 165 },
169 166
170 //----------------------------------------------------------------------------- 167 //-----------------------------------------------------------------------------
171 168
172 'addTwice': function(aPointA) { 169 'addTwice': function(aPointA) {
173 return this.add(aPointA, aPointA); 170 return this.add(aPointA, aPointA);
174 }, 171 },
175 172
176 //----------------------------------------------------------------------------- 173 //-----------------------------------------------------------------------------
177 174
178 'overwriteAdd': function(aPointA, aPointB) { 175 'overwriteAdd': function(aPointA, aPointB) {
179 if (aPointA.isZero()) { 176 if (aPointA.isZero()) {
180 // result = aPointB; 177 // result = aPointB;
181 aPointA._x._value = aPointB._x._value; 178 aPointA._x._value = aPointB._x._value;
182 aPointA._y._value = aPointB._y._value; 179 aPointA._y._value = aPointB._y._value;
183 } else if (aPointB.isZero()) { 180 } else if (aPointB.isZero()) {
184 // result = aPointA; 181 // result = aPointA;
185 } else if ((aPointA.x().compare(aPointB.x()) == 0) && ((aPointA.y().compare(aPointB.y()) != 0) || aPointB.x().isZero())) { 182 } else if ((aPointA.x().compare(aPointB.x()) == 0) && ((aPointA.y().compare(aPointB.y()) != 0) || aPointB.x().isZero())) {
186 // result = new Clipperz.Crypto.ECC.BinaryField.Point({x:Clipperz.Crypto.ECC.BinaryField.Value.O, y:Clipperz.Crypto.ECC.BinaryField.Value.O}); 183 // result = new Clipperz.Crypto.ECC.BinaryField.Point({x:Clipperz.Crypto.ECC.BinaryField.Value.O, y:Clipperz.Crypto.ECC.BinaryField.Value.O});
187 aPointA._x = Clipperz.Crypto.ECC.BinaryField.Value.O; 184 aPointA._x = Clipperz.Crypto.ECC.BinaryField.Value.O;
188 aPointA._y = Clipperz.Crypto.ECC.BinaryField.Value.O; 185 aPointA._y = Clipperz.Crypto.ECC.BinaryField.Value.O;
189 } else { 186 } else {
190 varf2m; 187 varf2m;
191 var x, y; 188 var x, y;
192 var lambda; 189 var lambda;
193 var aX, aY, bX, bY; 190 var aX, aY, bX, bY;
194 191
195 aX = aPointA.x()._value; 192 aX = aPointA.x()._value;
196 aY = aPointA.y()._value; 193 aY = aPointA.y()._value;
197 bX = aPointB.x()._value; 194 bX = aPointB.x()._value;
198 bY = aPointB.y()._value; 195 bY = aPointB.y()._value;
199 196
200 f2m = this.finiteField(); 197 f2m = this.finiteField();
201 198
202 if (aPointA.x().compare(aPointB.x()) != 0) { 199 if (aPointA.x().compare(aPointB.x()) != 0) {
203//console.log(" a.x != b.x"); 200//console.log(" a.x != b.x");
204 lambda =f2m._fastMultiply( 201 lambda =f2m._fastMultiply(
205 f2m._add(aY, bY), 202 f2m._add(aY, bY),
206 f2m._inverse(f2m._add(aX, bX)) 203 f2m._inverse(f2m._add(aX, bX))
207 ); 204 );
208 x = f2m._add(this.a()._value, f2m._square(lambda)); 205 x = f2m._add(this.a()._value, f2m._square(lambda));
209 f2m._overwriteAdd(x, lambda); 206 f2m._overwriteAdd(x, lambda);
210 f2m._overwriteAdd(x, aX); 207 f2m._overwriteAdd(x, aX);
211 f2m._overwriteAdd(x, bX); 208 f2m._overwriteAdd(x, bX);
212 } else { 209 } else {
213//console.log(" a.x == b.x"); 210//console.log(" a.x == b.x");
214 lambda = f2m._add(bX, f2m._fastMultiply(bY, f2m._inverse(bX))); 211 lambda = f2m._add(bX, f2m._fastMultiply(bY, f2m._inverse(bX)));
215//console.log(" lambda: " + lambda.asString(16)); 212//console.log(" lambda: " + lambda.asString(16));
216 x = f2m._add(this.a()._value, f2m._square(lambda)); 213 x = f2m._add(this.a()._value, f2m._square(lambda));
217//console.log(" x (step 1): " + x.asString(16)); 214//console.log(" x (step 1): " + x.asString(16));
218 f2m._overwriteAdd(x, lambda); 215 f2m._overwriteAdd(x, lambda);
219//console.log(" x (step 2): " + x.asString(16)); 216//console.log(" x (step 2): " + x.asString(16));
220 } 217 }
221 218
222 y = f2m._fastMultiply(f2m._add(bX, x), lambda); 219 y = f2m._fastMultiply(f2m._add(bX, x), lambda);
223//console.log(" y (step 1): " + y.asString(16)); 220//console.log(" y (step 1): " + y.asString(16));
224 f2m._overwriteAdd(y, x); 221 f2m._overwriteAdd(y, x);
225//console.log(" y (step 2): " + y.asString(16)); 222//console.log(" y (step 2): " + y.asString(16));
226 f2m._overwriteAdd(y, bY); 223 f2m._overwriteAdd(y, bY);
227//console.log(" y (step 3): " + y.asString(16)); 224//console.log(" y (step 3): " + y.asString(16));
228 225
229 // result = new Clipperz.Crypto.ECC.BinaryField.Point({x:new Clipperz.Crypto.ECC.BinaryField.Value(x), y:new Clipperz.Crypto.ECC.BinaryField.Value(y)}) 226 // result = new Clipperz.Crypto.ECC.BinaryField.Point({x:new Clipperz.Crypto.ECC.BinaryField.Value(x), y:new Clipperz.Crypto.ECC.BinaryField.Value(y)})
230 aPointA._x._value = x; 227 aPointA._x._value = x;
231 aPointA._y._value = y; 228 aPointA._y._value = y;
232 229
233 } 230 }
234//console.log("<<< ECC.BinaryField.Curve.add"); 231//console.log("<<< ECC.BinaryField.Curve.add");
235 232
236 return result; 233 return result;
237 }, 234 },
238 235
239 //----------------------------------------------------------------------------- 236 //-----------------------------------------------------------------------------
240 237
241 'multiply': function(aValue, aPoint) { 238 'multiply': function(aValue, aPoint) {
242 var result; 239 var result;
243 240
244//console.profile(); 241//console.profile();
245 result = new Clipperz.Crypto.ECC.BinaryField.Point({x:Clipperz.Crypto.ECC.BinaryField.Value.O, y:Clipperz.Crypto.ECC.BinaryField.Value.O}); 242 result = new Clipperz.Crypto.ECC.BinaryField.Point({x:Clipperz.Crypto.ECC.BinaryField.Value.O, y:Clipperz.Crypto.ECC.BinaryField.Value.O});
246 243
247 if (aValue.isZero() == false) { 244 if (aValue.isZero() == false) {
248 var k, Q; 245 var k, Q;
249 var i; 246 var i;
250 var countIndex; countIndex = 0; 247 var countIndex; countIndex = 0;
251 248
252 if (aValue.compare(Clipperz.Crypto.ECC.BinaryField.Value.O) > 0) { 249 if (aValue.compare(Clipperz.Crypto.ECC.BinaryField.Value.O) > 0) {
253 k = aValue; 250 k = aValue;
254 Q = aPoint; 251 Q = aPoint;
255 } else { 252 } else {
256MochiKit.Logging.logError("The Clipperz.Crypto.ECC.BinaryFields.Value does not work with negative values!!!!"); 253MochiKit.Logging.logError("The Clipperz.Crypto.ECC.BinaryFields.Value does not work with negative values!!!!");
257 k = aValue.negate(); 254 k = aValue.negate();
258 Q = this.negate(aPoint); 255 Q = this.negate(aPoint);
259 } 256 }
260 257
261//console.log("k: " + k.toString(16)); 258//console.log("k: " + k.toString(16));
262//console.log("k.bitSize: " + k.bitSize()); 259//console.log("k.bitSize: " + k.bitSize());
263 for (i=k.bitSize()-1; i>=0; i--) { 260 for (i=k.bitSize()-1; i>=0; i--) {
264 result = this.add(result, result); 261 result = this.add(result, result);
265 // this.overwriteAdd(result, result); 262 // this.overwriteAdd(result, result);
266 if (k.isBitSet(i)) { 263 if (k.isBitSet(i)) {
267 result = this.add(result, Q); 264 result = this.add(result, Q);
268 // this.overwriteAdd(result, Q); 265 // this.overwriteAdd(result, Q);
269 } 266 }
270 267
271 // if (countIndex==100) {console.log("multiply.break"); break;} else countIndex++; 268 // if (countIndex==100) {console.log("multiply.break"); break;} else countIndex++;
272 } 269 }
273 } 270 }
274//console.profileEnd(); 271//console.profileEnd();
275 272
276 return result; 273 return result;
277 }, 274 },
278 275
279 //----------------------------------------------------------------------------- 276 //-----------------------------------------------------------------------------
280 277
281 'deferredMultiply': function(aValue, aPoint) { 278 'deferredMultiply': function(aValue, aPoint) {
282 var deferredResult; 279 var deferredResult;
283 var result; 280 var result;
284 281
285MochiKit.Logging.logDebug(">>> deferredMultiply - value: " + aValue + ", point: " + aPoint); 282MochiKit.Logging.logDebug(">>> deferredMultiply - value: " + aValue + ", point: " + aPoint);
286//console.profile("ECC.Curve.multiply"); 283//console.profile("ECC.Curve.multiply");
287 deferredResult = new MochiKit.Async.Deferred(); 284 deferredResult = new MochiKit.Async.Deferred();
288//deferredResult.addCallback(function(res) {console.profile("ECC.Curve.deferredMultiply"); return res;} ); 285//deferredResult.addCallback(function(res) {console.profile("ECC.Curve.deferredMultiply"); return res;} );
289//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("# 1: " + res); return res;}); 286//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("# 1: " + res); return res;});
290 287
291 result = new Clipperz.Crypto.ECC.BinaryField.Point({x:Clipperz.Crypto.ECC.BinaryField.Value.O, y:Clipperz.Crypto.ECC.BinaryField.Value.O}); 288 result = new Clipperz.Crypto.ECC.BinaryField.Point({x:Clipperz.Crypto.ECC.BinaryField.Value.O, y:Clipperz.Crypto.ECC.BinaryField.Value.O});
292//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("# 2: " + res); return res;}); 289//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("# 2: " + res); return res;});
293 290
294 if (aValue.isZero() == false) { 291 if (aValue.isZero() == false) {
295 var k, Q; 292 var k, Q;
296 var i; 293 var i;
297 var countIndex; countIndex = 0; 294 var countIndex; countIndex = 0;
298 295
299 if (aValue.compare(Clipperz.Crypto.ECC.BinaryField.Value.O) > 0) { 296 if (aValue.compare(Clipperz.Crypto.ECC.BinaryField.Value.O) > 0) {
300 k = aValue; 297 k = aValue;
301 Q = aPoint; 298 Q = aPoint;
302 } else { 299 } else {
303MochiKit.Logging.logError("The Clipperz.Crypto.ECC.BinaryFields.Value does not work with negative values!!!!"); 300MochiKit.Logging.logError("The Clipperz.Crypto.ECC.BinaryFields.Value does not work with negative values!!!!");
304 k = aValue.negate(); 301 k = aValue.negate();
305 Q = this.negate(aPoint); 302 Q = this.negate(aPoint);
306 } 303 }
307 304
308//console.log("k: " + k.toString(16)); 305//console.log("k: " + k.toString(16));
309//console.log("k.bitSize: " + k.bitSize()); 306//console.log("k.bitSize: " + k.bitSize());
310 307
311//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("# 3: " + res); return res;}); 308//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("# 3: " + res); return res;});
312 for (i=k.bitSize()-1; i>=0; i--) { 309 for (i=k.bitSize()-1; i>=0; i--) {
313//MochiKit.Logging.logDebug("====> " + i); 310//MochiKit.Logging.logDebug("====> " + i);
314//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("# 4 > i = " + i + ": " + res); return res;}); 311//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("# 4 > i = " + i + ": " + res); return res;});
315 deferredResult.addMethod(this, "addTwice"); 312 deferredResult.addMethod(this, "addTwice");
316 //# result = this.add(result, result); 313 //# result = this.add(result, result);
317 // this.overwriteAdd(result, result); 314 // this.overwriteAdd(result, result);
318 if (k.isBitSet(i)) { 315 if (k.isBitSet(i)) {
319 deferredResult.addMethod(this, "add", Q); 316 deferredResult.addMethod(this, "add", Q);
320 //# result = this.add(result, Q); 317 //# result = this.add(result, Q);
321 // this.overwriteAdd(result, Q); 318 // this.overwriteAdd(result, Q);
322 } 319 }
323 if (i%20 == 0) {deferredResult.addCallback(MochiKit.Async.wait, 0.1);} 320 if (i%20 == 0) {deferredResult.addCallback(MochiKit.Async.wait, 0.1);}
324 321
325 // if (countIndex==100) {console.log("multiply.break"); break;} else countIndex++; 322 // if (countIndex==100) {console.log("multiply.break"); break;} else countIndex++;
326//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("# 4 < i = " + i + ": " + res); return res;}); 323//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("# 4 < i = " + i + ": " + res); return res;});
327 } 324 }
328//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("# 4: " + res); return res;}); 325//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("# 4: " + res); return res;});
329 } 326 }
330//#console.profileEnd(); 327//#console.profileEnd();
331//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("# 5: " + res); return res;}); 328//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("# 5: " + res); return res;});
332//deferredResult.addBoth(function(res) {console.profileEnd(); return res;}); 329//deferredResult.addBoth(function(res) {console.profileEnd(); return res;});
333//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("# 6: " + res); return res;}); 330//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("# 6: " + res); return res;});
334 deferredResult.callback(result); 331 deferredResult.callback(result);
335 332
336 //# return result; 333 //# return result;
337 return deferredResult; 334 return deferredResult;
338 }, 335 },
339 336
340 //----------------------------------------------------------------------------- 337 //-----------------------------------------------------------------------------
341 __syntaxFix__: "syntax fix" 338 __syntaxFix__: "syntax fix"
342}); 339});
343 340
344 341
345//############################################################################# 342//#############################################################################
346 343
347Clipperz.Crypto.ECC.StandardCurves = {}; 344Clipperz.Crypto.ECC.StandardCurves = {};
348 345
349MochiKit.Base.update(Clipperz.Crypto.ECC.StandardCurves, { 346MochiKit.Base.update(Clipperz.Crypto.ECC.StandardCurves, {
350/* 347/*
351 '_K571': null, 348 '_K571': null,
352 'K571': function() { 349 'K571': function() {
353 if (Clipperz.Crypto.ECC.StandardCurves._K571 == null) { 350 if (Clipperz.Crypto.ECC.StandardCurves._K571 == null) {
354 Clipperz.Crypto.ECC.StandardCurves._K571 = new Clipperz.Crypto.ECC.BinaryField.Curve({ 351 Clipperz.Crypto.ECC.StandardCurves._K571 = new Clipperz.Crypto.ECC.BinaryField.Curve({
355 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), 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),
356 a: new Clipperz.Crypto.ECC.BinaryField.Value('0', 16), 353 a: new Clipperz.Crypto.ECC.BinaryField.Value('0', 16),
357 b: new Clipperz.Crypto.ECC.BinaryField.Value('1', 16), 354 b: new Clipperz.Crypto.ECC.BinaryField.Value('1', 16),
358 G: new Clipperz.Crypto.ECC.BinaryField.Point({ 355 G: new Clipperz.Crypto.ECC.BinaryField.Point({
359 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), 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),
360 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) 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)
361 }), 358 }),
362 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), 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),
363 h: new Clipperz.Crypto.ECC.BinaryField.Value('4', 16) 360 h: new Clipperz.Crypto.ECC.BinaryField.Value('4', 16)
364 }); 361 });
365 } 362 }
366 363
367 return Clipperz.Crypto.ECC.StandardCurves._K571; 364 return Clipperz.Crypto.ECC.StandardCurves._K571;
368 }, 365 },
369 366
370 367
371 368
372 '_K283': null, 369 '_K283': null,
373 'K283': function() { //f(z) = z^283 + z^12 + z^7 + z^5 + 1 370 'K283': function() { //f(z) = z^283 + z^12 + z^7 + z^5 + 1
374 if (Clipperz.Crypto.ECC.StandardCurves._K283 == null) { 371 if (Clipperz.Crypto.ECC.StandardCurves._K283 == null) {
375 Clipperz.Crypto.ECC.StandardCurves._K283 = new Clipperz.Crypto.ECC.BinaryField.Curve({ 372 Clipperz.Crypto.ECC.StandardCurves._K283 = new Clipperz.Crypto.ECC.BinaryField.Curve({
376 modulus: new Clipperz.Crypto.ECC.BinaryField.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 000010a1', 16), 373 modulus: new Clipperz.Crypto.ECC.BinaryField.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 000010a1', 16),
377 a: new Clipperz.Crypto.ECC.BinaryField.Value('0', 16), 374 a: new Clipperz.Crypto.ECC.BinaryField.Value('0', 16),
378 b: new Clipperz.Crypto.ECC.BinaryField.Value('1', 16), 375 b: new Clipperz.Crypto.ECC.BinaryField.Value('1', 16),
379 G: new Clipperz.Crypto.ECC.BinaryField.Point({ 376 G: new Clipperz.Crypto.ECC.BinaryField.Point({
380 x: new Clipperz.Crypto.ECC.BinaryField.Value('0503213f 78ca4488 3f1a3b81 62f188e5 53cd265f 23c1567a 16876913 b0c2ac24 58492836', 16), 377 x: new Clipperz.Crypto.ECC.BinaryField.Value('0503213f 78ca4488 3f1a3b81 62f188e5 53cd265f 23c1567a 16876913 b0c2ac24 58492836', 16),
381 y: new Clipperz.Crypto.ECC.BinaryField.Value('01ccda38 0f1c9e31 8d90f95d 07e5426f e87e45c0 e8184698 e4596236 4e341161 77dd2259', 16) 378 y: new Clipperz.Crypto.ECC.BinaryField.Value('01ccda38 0f1c9e31 8d90f95d 07e5426f e87e45c0 e8184698 e4596236 4e341161 77dd2259', 16)
382 }), 379 }),
383 r: new Clipperz.Crypto.ECC.BinaryField.Value('01ffffff ffffffff ffffffff ffffffff ffffe9ae 2ed07577 265dff7f 94451e06 1e163c61', 16), 380 r: new Clipperz.Crypto.ECC.BinaryField.Value('01ffffff ffffffff ffffffff ffffffff ffffe9ae 2ed07577 265dff7f 94451e06 1e163c61', 16),
384 h: new Clipperz.Crypto.ECC.BinaryField.Value('4', 16) 381 h: new Clipperz.Crypto.ECC.BinaryField.Value('4', 16)
385 }); 382 });
386 } 383 }
387 384
388 return Clipperz.Crypto.ECC.StandardCurves._K283; 385 return Clipperz.Crypto.ECC.StandardCurves._K283;
389 }, 386 },
390*/ 387*/
391 //----------------------------------------------------------------------------- 388 //-----------------------------------------------------------------------------
392 389
393 '_B571': null, 390 '_B571': null,
394 'B571': function() { //f(z) = z^571 + z^10 + z^5 + z^2 + 1 391 'B571': function() { //f(z) = z^571 + z^10 + z^5 + z^2 + 1
395 if (Clipperz.Crypto.ECC.StandardCurves._B571 == null) { 392 if (Clipperz.Crypto.ECC.StandardCurves._B571 == null) {
396 Clipperz.Crypto.ECC.StandardCurves._B571 = new Clipperz.Crypto.ECC.BinaryField.Curve({ 393 Clipperz.Crypto.ECC.StandardCurves._B571 = new Clipperz.Crypto.ECC.BinaryField.Curve({
397 modulus: new Clipperz.Crypto.ECC.BinaryField.Value('80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000425', 16), 394 modulus: new Clipperz.Crypto.ECC.BinaryField.Value('80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000425', 16),
398 a: new Clipperz.Crypto.ECC.BinaryField.Value('1', 16), 395 a: new Clipperz.Crypto.ECC.BinaryField.Value('1', 16),
399 b: new Clipperz.Crypto.ECC.BinaryField.Value('02f40e7e2221f295de297117b7f3d62f5c6a97ffcb8ceff1cd6ba8ce4a9a18ad84ffabbd8efa59332be7ad6756a66e294afd185a78ff12aa520e4de739baca0c7ffeff7f2955727a', 16), 396 b: new Clipperz.Crypto.ECC.BinaryField.Value('02f40e7e2221f295de297117b7f3d62f5c6a97ffcb8ceff1cd6ba8ce4a9a18ad84ffabbd8efa59332be7ad6756a66e294afd185a78ff12aa520e4de739baca0c7ffeff7f2955727a', 16),
400 G: new Clipperz.Crypto.ECC.BinaryField.Point({ 397 G: new Clipperz.Crypto.ECC.BinaryField.Point({
401 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), 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),
402 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) 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)
403 }), 400 }),
404 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), 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),
405 h: new Clipperz.Crypto.ECC.BinaryField.Value('2', 16) 402 h: new Clipperz.Crypto.ECC.BinaryField.Value('2', 16)
406 403
407 // S: new Clipperz.Crypto.ECC.BinaryField.Value('2aa058f73a0e33ab486b0f610410c53a7f132310', 10), 404 // S: new Clipperz.Crypto.ECC.BinaryField.Value('2aa058f73a0e33ab486b0f610410c53a7f132310', 10),
408 // n: new Clipperz.Crypto.ECC.BinaryField.Value('03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe661ce18ff55987308059b186823851ec7dd9ca1161de93d5174d66e8382e9bb2fe84e47', 16) 405 // n: new Clipperz.Crypto.ECC.BinaryField.Value('03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe661ce18ff55987308059b186823851ec7dd9ca1161de93d5174d66e8382e9bb2fe84e47', 16)
diff --git a/frontend/gamma/js/Clipperz/Crypto/ECC/BinaryField/FiniteField.js b/frontend/gamma/js/Clipperz/Crypto/ECC/BinaryField/FiniteField.js
index a649c9f..56f257a 100644
--- a/frontend/gamma/js/Clipperz/Crypto/ECC/BinaryField/FiniteField.js
+++ b/frontend/gamma/js/Clipperz/Crypto/ECC/BinaryField/FiniteField.js
@@ -1,408 +1,405 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29//try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) { 26//try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) {
30 //throw "Clipperz.Crypto.ECC depends on Clipperz.ByteArray!"; 27 //throw "Clipperz.Crypto.ECC depends on Clipperz.ByteArray!";
31//} 28//}
32if (typeof(Clipperz.Crypto.ECC) == 'undefined') { Clipperz.Crypto.ECC = {}; } 29if (typeof(Clipperz.Crypto.ECC) == 'undefined') { Clipperz.Crypto.ECC = {}; }
33if (typeof(Clipperz.Crypto.ECC.BinaryField) == 'undefined') { Clipperz.Crypto.ECC.BinaryField = {}; } 30if (typeof(Clipperz.Crypto.ECC.BinaryField) == 'undefined') { Clipperz.Crypto.ECC.BinaryField = {}; }
34 31
35Clipperz.Crypto.ECC.BinaryField.FiniteField = function(args) { 32Clipperz.Crypto.ECC.BinaryField.FiniteField = function(args) {
36 args = args || {}; 33 args = args || {};
37 this._modulus = args.modulus; 34 this._modulus = args.modulus;
38 35
39 return this; 36 return this;
40} 37}
41 38
42Clipperz.Crypto.ECC.BinaryField.FiniteField.prototype = MochiKit.Base.update(null, { 39Clipperz.Crypto.ECC.BinaryField.FiniteField.prototype = MochiKit.Base.update(null, {
43 40
44 'asString': function() { 41 'asString': function() {
45 return "Clipperz.Crypto.ECC.BinaryField.FiniteField (" + this.modulus().asString() + ")"; 42 return "Clipperz.Crypto.ECC.BinaryField.FiniteField (" + this.modulus().asString() + ")";
46 }, 43 },
47 44
48 //----------------------------------------------------------------------------- 45 //-----------------------------------------------------------------------------
49 46
50 'modulus': function() { 47 'modulus': function() {
51 return this._modulus; 48 return this._modulus;
52 }, 49 },
53 50
54 //----------------------------------------------------------------------------- 51 //-----------------------------------------------------------------------------
55 52
56 '_module': function(aValue) { 53 '_module': function(aValue) {
57 varresult; 54 varresult;
58 var modulusComparison; 55 var modulusComparison;
59//console.log(">>> binaryField.finiteField.(standard)module"); 56//console.log(">>> binaryField.finiteField.(standard)module");
60 57
61 modulusComparison = Clipperz.Crypto.ECC.BinaryField.Value._compare(aValue, this.modulus()._value); 58 modulusComparison = Clipperz.Crypto.ECC.BinaryField.Value._compare(aValue, this.modulus()._value);
62 59
63 if (modulusComparison < 0) { 60 if (modulusComparison < 0) {
64 result = aValue; 61 result = aValue;
65 } else if (modulusComparison == 0) { 62 } else if (modulusComparison == 0) {
66 result = [0]; 63 result = [0];
67 } else { 64 } else {
68 var modulusBitSize; 65 var modulusBitSize;
69 var resultBitSize; 66 var resultBitSize;
70 67
71 result = aValue; 68 result = aValue;
72 69
73 modulusBitSize = this.modulus().bitSize(); 70 modulusBitSize = this.modulus().bitSize();
74 resultBitSize = Clipperz.Crypto.ECC.BinaryField.Value._bitSize(result); 71 resultBitSize = Clipperz.Crypto.ECC.BinaryField.Value._bitSize(result);
75 while (resultBitSize >= modulusBitSize) { 72 while (resultBitSize >= modulusBitSize) {
76 Clipperz.Crypto.ECC.BinaryField.Value._overwriteXor(result, Clipperz.Crypto.ECC.BinaryField.Value._shiftLeft(this.modulus()._value, resultBitSize - modulusBitSize)); 73 Clipperz.Crypto.ECC.BinaryField.Value._overwriteXor(result, Clipperz.Crypto.ECC.BinaryField.Value._shiftLeft(this.modulus()._value, resultBitSize - modulusBitSize));
77 resultBitSize = Clipperz.Crypto.ECC.BinaryField.Value._bitSize(result); 74 resultBitSize = Clipperz.Crypto.ECC.BinaryField.Value._bitSize(result);
78 } 75 }
79 } 76 }
80//console.log("<<< binaryField.finiteField.(standard)module"); 77//console.log("<<< binaryField.finiteField.(standard)module");
81 78
82 return result; 79 return result;
83 }, 80 },
84 81
85 'module': function(aValue) { 82 'module': function(aValue) {
86 return new Clipperz.Crypto.ECC.BinaryField.Value(this._module(aValue._value.slice(0))); 83 return new Clipperz.Crypto.ECC.BinaryField.Value(this._module(aValue._value.slice(0)));
87 }, 84 },
88 85
89 //----------------------------------------------------------------------------- 86 //-----------------------------------------------------------------------------
90 87
91 '_add': function(a, b) { 88 '_add': function(a, b) {
92 return Clipperz.Crypto.ECC.BinaryField.Value._xor(a, b); 89 return Clipperz.Crypto.ECC.BinaryField.Value._xor(a, b);
93 }, 90 },
94 91
95 '_overwriteAdd': function(a, b) { 92 '_overwriteAdd': function(a, b) {
96 Clipperz.Crypto.ECC.BinaryField.Value._overwriteXor(a, b); 93 Clipperz.Crypto.ECC.BinaryField.Value._overwriteXor(a, b);
97 }, 94 },
98 95
99 'add': function(a, b) { 96 'add': function(a, b) {
100 return new Clipperz.Crypto.ECC.BinaryField.Value(this._add(a._value, b._value)); 97 return new Clipperz.Crypto.ECC.BinaryField.Value(this._add(a._value, b._value));
101 }, 98 },
102 99
103 //----------------------------------------------------------------------------- 100 //-----------------------------------------------------------------------------
104 101
105 'negate': function(aValue) { 102 'negate': function(aValue) {
106 return aValue.clone(); 103 return aValue.clone();
107 }, 104 },
108 105
109 //----------------------------------------------------------------------------- 106 //-----------------------------------------------------------------------------
110 107
111 '_multiply': function(a, b) { 108 '_multiply': function(a, b) {
112 var result; 109 var result;
113 var valueToXor; 110 var valueToXor;
114 var i,c; 111 var i,c;
115 112
116 result = [0]; 113 result = [0];
117 valueToXor = b; 114 valueToXor = b;
118 c = Clipperz.Crypto.ECC.BinaryField.Value._bitSize(a); 115 c = Clipperz.Crypto.ECC.BinaryField.Value._bitSize(a);
119 for (i=0; i<c; i++) { 116 for (i=0; i<c; i++) {
120 if (Clipperz.Crypto.ECC.BinaryField.Value._isBitSet(a, i) === true) { 117 if (Clipperz.Crypto.ECC.BinaryField.Value._isBitSet(a, i) === true) {
121 Clipperz.Crypto.ECC.BinaryField.Value._overwriteXor(result, valueToXor); 118 Clipperz.Crypto.ECC.BinaryField.Value._overwriteXor(result, valueToXor);
122 } 119 }
123 valueToXor = Clipperz.Crypto.ECC.BinaryField.Value._overwriteShiftLeft(valueToXor, 1); 120 valueToXor = Clipperz.Crypto.ECC.BinaryField.Value._overwriteShiftLeft(valueToXor, 1);
124 } 121 }
125 result = this._module(result); 122 result = this._module(result);
126 123
127 return result; 124 return result;
128 }, 125 },
129 126
130 'multiply': function(a, b) { 127 'multiply': function(a, b) {
131 return new Clipperz.Crypto.ECC.BinaryField.Value(this._multiply(a._value, b._value)); 128 return new Clipperz.Crypto.ECC.BinaryField.Value(this._multiply(a._value, b._value));
132 }, 129 },
133 130
134 //----------------------------------------------------------------------------- 131 //-----------------------------------------------------------------------------
135 132
136 '_fastMultiply': function(a, b) { 133 '_fastMultiply': function(a, b) {
137 var result; 134 var result;
138 var B; 135 var B;
139 var i,c; 136 var i,c;
140 137
141 result = [0]; 138 result = [0];
142 B = b.slice(0); //Is this array copy avoidable? 139 B = b.slice(0); //Is this array copy avoidable?
143 c = 32; 140 c = 32;
144 for (i=0; i<c; i++) { 141 for (i=0; i<c; i++) {
145 var ii, cc; 142 var ii, cc;
146 143
147 cc = a.length; 144 cc = a.length;
148 for (ii=0; ii<cc; ii++) { 145 for (ii=0; ii<cc; ii++) {
149 if (((a[ii] >>> i) & 0x01) == 1) { 146 if (((a[ii] >>> i) & 0x01) == 1) {
150 Clipperz.Crypto.ECC.BinaryField.Value._overwriteXor(result, B, ii); 147 Clipperz.Crypto.ECC.BinaryField.Value._overwriteXor(result, B, ii);
151 } 148 }
152 } 149 }
153 150
154 if (i < (c-1)) { 151 if (i < (c-1)) {
155 B = Clipperz.Crypto.ECC.BinaryField.Value._overwriteShiftLeft(B, 1); 152 B = Clipperz.Crypto.ECC.BinaryField.Value._overwriteShiftLeft(B, 1);
156 } 153 }
157 } 154 }
158 result = this._module(result); 155 result = this._module(result);
159 156
160 return result; 157 return result;
161 }, 158 },
162 159
163 'fastMultiply': function(a, b) { 160 'fastMultiply': function(a, b) {
164 return new Clipperz.Crypto.ECC.BinaryField.Value(this._fastMultiply(a._value, b._value)); 161 return new Clipperz.Crypto.ECC.BinaryField.Value(this._fastMultiply(a._value, b._value));
165 }, 162 },
166 163
167 //----------------------------------------------------------------------------- 164 //-----------------------------------------------------------------------------
168 // 165 //
169 //Guide to Elliptic Curve Cryptography 166 //Guide to Elliptic Curve Cryptography
170 //Darrel Hankerson, Alfred Menezes, Scott Vanstone 167 //Darrel Hankerson, Alfred Menezes, Scott Vanstone
171 //- Pag: 49, Alorithm 2.34 168 //- Pag: 49, Alorithm 2.34
172 // 169 //
173 //----------------------------------------------------------------------------- 170 //-----------------------------------------------------------------------------
174 171
175 '_square': function(aValue) { 172 '_square': function(aValue) {
176 var result; 173 var result;
177 var value; 174 var value;
178 var c,i; 175 var c,i;
179 var precomputedValues; 176 var precomputedValues;
180 177
181 value = aValue; 178 value = aValue;
182 result = new Array(value.length * 2); 179 result = new Array(value.length * 2);
183 precomputedValues = Clipperz.Crypto.ECC.BinaryField.FiniteField.squarePrecomputedBytes; 180 precomputedValues = Clipperz.Crypto.ECC.BinaryField.FiniteField.squarePrecomputedBytes;
184 181
185 c = value.length; 182 c = value.length;
186 for (i=0; i<c; i++) { 183 for (i=0; i<c; i++) {
187 result[i*2] = precomputedValues[(value[i] & 0x000000ff)]; 184 result[i*2] = precomputedValues[(value[i] & 0x000000ff)];
188 result[i*2] |= ((precomputedValues[(value[i] & 0x0000ff00) >>> 8]) << 16); 185 result[i*2] |= ((precomputedValues[(value[i] & 0x0000ff00) >>> 8]) << 16);
189 186
190 result[i*2 + 1] = precomputedValues[(value[i] & 0x00ff0000) >>> 16]; 187 result[i*2 + 1] = precomputedValues[(value[i] & 0x00ff0000) >>> 16];
191 result[i*2 + 1] |= ((precomputedValues[(value[i] & 0xff000000) >>> 24]) << 16); 188 result[i*2 + 1] |= ((precomputedValues[(value[i] & 0xff000000) >>> 24]) << 16);
192 } 189 }
193 190
194 return this._module(result); 191 return this._module(result);
195 }, 192 },
196 193
197 'square': function(aValue) { 194 'square': function(aValue) {
198 return new Clipperz.Crypto.ECC.BinaryField.Value(this._square(aValue._value)); 195 return new Clipperz.Crypto.ECC.BinaryField.Value(this._square(aValue._value));
199 }, 196 },
200 197
201 //----------------------------------------------------------------------------- 198 //-----------------------------------------------------------------------------
202 199
203 '_inverse': function(aValue) { 200 '_inverse': function(aValue) {
204 varresult; 201 varresult;
205 var b, c; 202 var b, c;
206 var u, v; 203 var u, v;
207 204
208 // b = Clipperz.Crypto.ECC.BinaryField.Value.I._value; 205 // b = Clipperz.Crypto.ECC.BinaryField.Value.I._value;
209 b = [1]; 206 b = [1];
210 // c = Clipperz.Crypto.ECC.BinaryField.Value.O._value; 207 // c = Clipperz.Crypto.ECC.BinaryField.Value.O._value;
211 c = [0]; 208 c = [0];
212 u = this._module(aValue); 209 u = this._module(aValue);
213 v = this.modulus()._value.slice(0); 210 v = this.modulus()._value.slice(0);
214 211
215 while (Clipperz.Crypto.ECC.BinaryField.Value._bitSize(u) > 1) { 212 while (Clipperz.Crypto.ECC.BinaryField.Value._bitSize(u) > 1) {
216 varbitDifferenceSize; 213 varbitDifferenceSize;
217 214
218 bitDifferenceSize = Clipperz.Crypto.ECC.BinaryField.Value._bitSize(u) - Clipperz.Crypto.ECC.BinaryField.Value._bitSize(v); 215 bitDifferenceSize = Clipperz.Crypto.ECC.BinaryField.Value._bitSize(u) - Clipperz.Crypto.ECC.BinaryField.Value._bitSize(v);
219 if (bitDifferenceSize < 0) { 216 if (bitDifferenceSize < 0) {
220 var swap; 217 var swap;
221 218
222 swap = u; 219 swap = u;
223 u = v; 220 u = v;
224 v = swap; 221 v = swap;
225 222
226 swap = c; 223 swap = c;
227 c = b; 224 c = b;
228 b = swap; 225 b = swap;
229 226
230 bitDifferenceSize = -bitDifferenceSize; 227 bitDifferenceSize = -bitDifferenceSize;
231 } 228 }
232 229
233 u = this._add(u, Clipperz.Crypto.ECC.BinaryField.Value._shiftLeft(v, bitDifferenceSize)); 230 u = this._add(u, Clipperz.Crypto.ECC.BinaryField.Value._shiftLeft(v, bitDifferenceSize));
234 b = this._add(b, Clipperz.Crypto.ECC.BinaryField.Value._shiftLeft(c, bitDifferenceSize)); 231 b = this._add(b, Clipperz.Crypto.ECC.BinaryField.Value._shiftLeft(c, bitDifferenceSize));
235 // this._overwriteAdd(u, Clipperz.Crypto.ECC.BinaryField.Value._shiftLeft(v, bitDifferenceSize)); 232 // this._overwriteAdd(u, Clipperz.Crypto.ECC.BinaryField.Value._shiftLeft(v, bitDifferenceSize));
236 // this._overwriteAdd(b, Clipperz.Crypto.ECC.BinaryField.Value._shiftLeft(c, bitDifferenceSize)); 233 // this._overwriteAdd(b, Clipperz.Crypto.ECC.BinaryField.Value._shiftLeft(c, bitDifferenceSize));
237 } 234 }
238 235
239 result = this._module(b); 236 result = this._module(b);
240 237
241 return result; 238 return result;
242 }, 239 },
243 240
244 'inverse': function(aValue) { 241 'inverse': function(aValue) {
245 return new Clipperz.Crypto.ECC.BinaryField.Value(this._inverse(aValue._value)); 242 return new Clipperz.Crypto.ECC.BinaryField.Value(this._inverse(aValue._value));
246 }, 243 },
247 244
248 //----------------------------------------------------------------------------- 245 //-----------------------------------------------------------------------------
249 __syntaxFix__: "syntax fix" 246 __syntaxFix__: "syntax fix"
250}); 247});
251 248
252 249
253Clipperz.Crypto.ECC.BinaryField.FiniteField.squarePrecomputedBytes = [ 250Clipperz.Crypto.ECC.BinaryField.FiniteField.squarePrecomputedBytes = [
254 0x0000, // 0 = 0000 0000 -> 0000 0000 0000 0000 251 0x0000, // 0 = 0000 0000 -> 0000 0000 0000 0000
255 0x0001, // 1 = 0000 0001 -> 0000 0000 0000 0001 252 0x0001, // 1 = 0000 0001 -> 0000 0000 0000 0001
256 0x0004, // 2 = 0000 0010 -> 0000 0000 0000 0100 253 0x0004, // 2 = 0000 0010 -> 0000 0000 0000 0100
257 0x0005, // 3 = 0000 0011 -> 0000 0000 0000 0101 254 0x0005, // 3 = 0000 0011 -> 0000 0000 0000 0101
258 0x0010, // 4 = 0000 0100 -> 0000 0000 0001 0000 255 0x0010, // 4 = 0000 0100 -> 0000 0000 0001 0000
259 0x0011, // 5 = 0000 0101 -> 0000 0000 0001 0001 256 0x0011, // 5 = 0000 0101 -> 0000 0000 0001 0001
260 0x0014, // 6 = 0000 0110 -> 0000 0000 0001 0100 257 0x0014, // 6 = 0000 0110 -> 0000 0000 0001 0100
261 0x0015, // 7 = 0000 0111 -> 0000 0000 0001 0101 258 0x0015, // 7 = 0000 0111 -> 0000 0000 0001 0101
262 0x0040, // 8 = 0000 1000 -> 0000 0000 0100 0000 259 0x0040, // 8 = 0000 1000 -> 0000 0000 0100 0000
263 0x0041, // 9 = 0000 1001 -> 0000 0000 0100 0001 260 0x0041, // 9 = 0000 1001 -> 0000 0000 0100 0001
264 0x0044, // 10 = 0000 1010 -> 0000 0000 0100 0100 261 0x0044, // 10 = 0000 1010 -> 0000 0000 0100 0100
265 0x0045, // 11 = 0000 1011 -> 0000 0000 0100 0101 262 0x0045, // 11 = 0000 1011 -> 0000 0000 0100 0101
266 0x0050, // 12 = 0000 1100 -> 0000 0000 0101 0000 263 0x0050, // 12 = 0000 1100 -> 0000 0000 0101 0000
267 0x0051, // 13 = 0000 1101 -> 0000 0000 0101 0001 264 0x0051, // 13 = 0000 1101 -> 0000 0000 0101 0001
268 0x0054, // 14 = 0000 1110 -> 0000 0000 0101 0100 265 0x0054, // 14 = 0000 1110 -> 0000 0000 0101 0100
269 0x0055, // 15 = 0000 1111 -> 0000 0000 0101 0101 266 0x0055, // 15 = 0000 1111 -> 0000 0000 0101 0101
270 267
271 0x0100, // 16 = 0001 0000 -> 0000 0001 0000 0000 268 0x0100, // 16 = 0001 0000 -> 0000 0001 0000 0000
272 0x0101, // 17 = 0001 0001 -> 0000 0001 0000 0001 269 0x0101, // 17 = 0001 0001 -> 0000 0001 0000 0001
273 0x0104, // 18 = 0001 0010 -> 0000 0001 0000 0100 270 0x0104, // 18 = 0001 0010 -> 0000 0001 0000 0100
274 0x0105, // 19 = 0001 0011 -> 0000 0001 0000 0101 271 0x0105, // 19 = 0001 0011 -> 0000 0001 0000 0101
275 0x0110, // 20 = 0001 0100 -> 0000 0001 0001 0000 272 0x0110, // 20 = 0001 0100 -> 0000 0001 0001 0000
276 0x0111, // 21 = 0001 0101 -> 0000 0001 0001 0001 273 0x0111, // 21 = 0001 0101 -> 0000 0001 0001 0001
277 0x0114, // 22 = 0001 0110 -> 0000 0001 0001 0100 274 0x0114, // 22 = 0001 0110 -> 0000 0001 0001 0100
278 0x0115, // 23 = 0001 0111 -> 0000 0001 0001 0101 275 0x0115, // 23 = 0001 0111 -> 0000 0001 0001 0101
279 0x0140, // 24 = 0001 1000 -> 0000 0001 0100 0000 276 0x0140, // 24 = 0001 1000 -> 0000 0001 0100 0000
280 0x0141, // 25 = 0001 1001 -> 0000 0001 0100 0001 277 0x0141, // 25 = 0001 1001 -> 0000 0001 0100 0001
281 0x0144, // 26 = 0001 1010 -> 0000 0001 0100 0100 278 0x0144, // 26 = 0001 1010 -> 0000 0001 0100 0100
282 0x0145, // 27 = 0001 1011 -> 0000 0001 0100 0101 279 0x0145, // 27 = 0001 1011 -> 0000 0001 0100 0101
283 0x0150, // 28 = 0001 1100 -> 0000 0001 0101 0000 280 0x0150, // 28 = 0001 1100 -> 0000 0001 0101 0000
284 0x0151, // 28 = 0001 1101 -> 0000 0001 0101 0001 281 0x0151, // 28 = 0001 1101 -> 0000 0001 0101 0001
285 0x0154, // 30 = 0001 1110 -> 0000 0001 0101 0100 282 0x0154, // 30 = 0001 1110 -> 0000 0001 0101 0100
286 0x0155, // 31 = 0001 1111 -> 0000 0001 0101 0101 283 0x0155, // 31 = 0001 1111 -> 0000 0001 0101 0101
287 284
288 0x0400, // 32 = 0010 0000 -> 0000 0100 0000 0000 285 0x0400, // 32 = 0010 0000 -> 0000 0100 0000 0000
289 0x0401, // 33 = 0010 0001 -> 0000 0100 0000 0001 286 0x0401, // 33 = 0010 0001 -> 0000 0100 0000 0001
290 0x0404, // 34 = 0010 0010 -> 0000 0100 0000 0100 287 0x0404, // 34 = 0010 0010 -> 0000 0100 0000 0100
291 0x0405, // 35 = 0010 0011 -> 0000 0100 0000 0101 288 0x0405, // 35 = 0010 0011 -> 0000 0100 0000 0101
292 0x0410, // 36 = 0010 0100 -> 0000 0100 0001 0000 289 0x0410, // 36 = 0010 0100 -> 0000 0100 0001 0000
293 0x0411, // 37 = 0010 0101 -> 0000 0100 0001 0001 290 0x0411, // 37 = 0010 0101 -> 0000 0100 0001 0001
294 0x0414, // 38 = 0010 0110 -> 0000 0100 0001 0100 291 0x0414, // 38 = 0010 0110 -> 0000 0100 0001 0100
295 0x0415, // 39 = 0010 0111 -> 0000 0100 0001 0101 292 0x0415, // 39 = 0010 0111 -> 0000 0100 0001 0101
296 0x0440, // 40 = 0010 1000 -> 0000 0100 0100 0000 293 0x0440, // 40 = 0010 1000 -> 0000 0100 0100 0000
297 0x0441, // 41 = 0010 1001 -> 0000 0100 0100 0001 294 0x0441, // 41 = 0010 1001 -> 0000 0100 0100 0001
298 0x0444, // 42 = 0010 1010 -> 0000 0100 0100 0100 295 0x0444, // 42 = 0010 1010 -> 0000 0100 0100 0100
299 0x0445, // 43 = 0010 1011 -> 0000 0100 0100 0101 296 0x0445, // 43 = 0010 1011 -> 0000 0100 0100 0101
300 0x0450, // 44 = 0010 1100 -> 0000 0100 0101 0000 297 0x0450, // 44 = 0010 1100 -> 0000 0100 0101 0000
301 0x0451, // 45 = 0010 1101 -> 0000 0100 0101 0001 298 0x0451, // 45 = 0010 1101 -> 0000 0100 0101 0001
302 0x0454, // 46 = 0010 1110 -> 0000 0100 0101 0100 299 0x0454, // 46 = 0010 1110 -> 0000 0100 0101 0100
303 0x0455, // 47 = 0010 1111 -> 0000 0100 0101 0101 300 0x0455, // 47 = 0010 1111 -> 0000 0100 0101 0101
304 301
305 0x0500, // 48 = 0011 0000 -> 0000 0101 0000 0000 302 0x0500, // 48 = 0011 0000 -> 0000 0101 0000 0000
306 0x0501, // 49 = 0011 0001 -> 0000 0101 0000 0001 303 0x0501, // 49 = 0011 0001 -> 0000 0101 0000 0001
307 0x0504, // 50 = 0011 0010 -> 0000 0101 0000 0100 304 0x0504, // 50 = 0011 0010 -> 0000 0101 0000 0100
308 0x0505, // 51 = 0011 0011 -> 0000 0101 0000 0101 305 0x0505, // 51 = 0011 0011 -> 0000 0101 0000 0101
309 0x0510, // 52 = 0011 0100 -> 0000 0101 0001 0000 306 0x0510, // 52 = 0011 0100 -> 0000 0101 0001 0000
310 0x0511, // 53 = 0011 0101 -> 0000 0101 0001 0001 307 0x0511, // 53 = 0011 0101 -> 0000 0101 0001 0001
311 0x0514, // 54 = 0011 0110 -> 0000 0101 0001 0100 308 0x0514, // 54 = 0011 0110 -> 0000 0101 0001 0100
312 0x0515, // 55 = 0011 0111 -> 0000 0101 0001 0101 309 0x0515, // 55 = 0011 0111 -> 0000 0101 0001 0101
313 0x0540, // 56 = 0011 1000 -> 0000 0101 0100 0000 310 0x0540, // 56 = 0011 1000 -> 0000 0101 0100 0000
314 0x0541, // 57 = 0011 1001 -> 0000 0101 0100 0001 311 0x0541, // 57 = 0011 1001 -> 0000 0101 0100 0001
315 0x0544, // 58 = 0011 1010 -> 0000 0101 0100 0100 312 0x0544, // 58 = 0011 1010 -> 0000 0101 0100 0100
316 0x0545, // 59 = 0011 1011 -> 0000 0101 0100 0101 313 0x0545, // 59 = 0011 1011 -> 0000 0101 0100 0101
317 0x0550, // 60 = 0011 1100 -> 0000 0101 0101 0000 314 0x0550, // 60 = 0011 1100 -> 0000 0101 0101 0000
318 0x0551, // 61 = 0011 1101 -> 0000 0101 0101 0001 315 0x0551, // 61 = 0011 1101 -> 0000 0101 0101 0001
319 0x0554, // 62 = 0011 1110 -> 0000 0101 0101 0100 316 0x0554, // 62 = 0011 1110 -> 0000 0101 0101 0100
320 0x0555, // 63 = 0011 1111 -> 0000 0101 0101 0101 317 0x0555, // 63 = 0011 1111 -> 0000 0101 0101 0101
321 318
322 0x1000, // 64 = 0100 0000 -> 0001 0000 0000 0000 319 0x1000, // 64 = 0100 0000 -> 0001 0000 0000 0000
323 0x1001, // 65 = 0100 0001 -> 0001 0000 0000 0001 320 0x1001, // 65 = 0100 0001 -> 0001 0000 0000 0001
324 0x1004, // 66 = 0100 0010 -> 0001 0000 0000 0100 321 0x1004, // 66 = 0100 0010 -> 0001 0000 0000 0100
325 0x1005, // 67 = 0100 0011 -> 0001 0000 0000 0101 322 0x1005, // 67 = 0100 0011 -> 0001 0000 0000 0101
326 0x1010, // 68 = 0100 0100 -> 0001 0000 0001 0000 323 0x1010, // 68 = 0100 0100 -> 0001 0000 0001 0000
327 0x1011, // 69 = 0100 0101 -> 0001 0000 0001 0001 324 0x1011, // 69 = 0100 0101 -> 0001 0000 0001 0001
328 0x1014, // 70 = 0100 0110 -> 0001 0000 0001 0100 325 0x1014, // 70 = 0100 0110 -> 0001 0000 0001 0100
329 0x1015, // 71 = 0100 0111 -> 0001 0000 0001 0101 326 0x1015, // 71 = 0100 0111 -> 0001 0000 0001 0101
330 0x1040, // 72 = 0100 1000 -> 0001 0000 0100 0000 327 0x1040, // 72 = 0100 1000 -> 0001 0000 0100 0000
331 0x1041, // 73 = 0100 1001 -> 0001 0000 0100 0001 328 0x1041, // 73 = 0100 1001 -> 0001 0000 0100 0001
332 0x1044, // 74 = 0100 1010 -> 0001 0000 0100 0100 329 0x1044, // 74 = 0100 1010 -> 0001 0000 0100 0100
333 0x1045, // 75 = 0100 1011 -> 0001 0000 0100 0101 330 0x1045, // 75 = 0100 1011 -> 0001 0000 0100 0101
334 0x1050, // 76 = 0100 1100 -> 0001 0000 0101 0000 331 0x1050, // 76 = 0100 1100 -> 0001 0000 0101 0000
335 0x1051, // 77 = 0100 1101 -> 0001 0000 0101 0001 332 0x1051, // 77 = 0100 1101 -> 0001 0000 0101 0001
336 0x1054, // 78 = 0100 1110 -> 0001 0000 0101 0100 333 0x1054, // 78 = 0100 1110 -> 0001 0000 0101 0100
337 0x1055, // 79 = 0100 1111 -> 0001 0000 0101 0101 334 0x1055, // 79 = 0100 1111 -> 0001 0000 0101 0101
338 335
339 0x1100, // 80 = 0101 0000 -> 0001 0001 0000 0000 336 0x1100, // 80 = 0101 0000 -> 0001 0001 0000 0000
340 0x1101, // 81 = 0101 0001 -> 0001 0001 0000 0001 337 0x1101, // 81 = 0101 0001 -> 0001 0001 0000 0001
341 0x1104, // 82 = 0101 0010 -> 0001 0001 0000 0100 338 0x1104, // 82 = 0101 0010 -> 0001 0001 0000 0100
342 0x1105, // 83 = 0101 0011 -> 0001 0001 0000 0101 339 0x1105, // 83 = 0101 0011 -> 0001 0001 0000 0101
343 0x1110, // 84 = 0101 0100 -> 0001 0001 0001 0000 340 0x1110, // 84 = 0101 0100 -> 0001 0001 0001 0000
344 0x1111, // 85 = 0101 0101 -> 0001 0001 0001 0001 341 0x1111, // 85 = 0101 0101 -> 0001 0001 0001 0001
345 0x1114, // 86 = 0101 0110 -> 0001 0001 0001 0100 342 0x1114, // 86 = 0101 0110 -> 0001 0001 0001 0100
346 0x1115, // 87 = 0101 0111 -> 0001 0001 0001 0101 343 0x1115, // 87 = 0101 0111 -> 0001 0001 0001 0101
347 0x1140, // 88 = 0101 1000 -> 0001 0001 0100 0000 344 0x1140, // 88 = 0101 1000 -> 0001 0001 0100 0000
348 0x1141, // 89 = 0101 1001 -> 0001 0001 0100 0001 345 0x1141, // 89 = 0101 1001 -> 0001 0001 0100 0001
349 0x1144, // 90 = 0101 1010 -> 0001 0001 0100 0100 346 0x1144, // 90 = 0101 1010 -> 0001 0001 0100 0100
350 0x1145, // 91 = 0101 1011 -> 0001 0001 0100 0101 347 0x1145, // 91 = 0101 1011 -> 0001 0001 0100 0101
351 0x1150, // 92 = 0101 1100 -> 0001 0001 0101 0000 348 0x1150, // 92 = 0101 1100 -> 0001 0001 0101 0000
352 0x1151, // 93 = 0101 1101 -> 0001 0001 0101 0001 349 0x1151, // 93 = 0101 1101 -> 0001 0001 0101 0001
353 0x1154, // 94 = 0101 1110 -> 0001 0001 0101 0100 350 0x1154, // 94 = 0101 1110 -> 0001 0001 0101 0100
354 0x1155, // 95 = 0101 1111 -> 0001 0001 0101 0101 351 0x1155, // 95 = 0101 1111 -> 0001 0001 0101 0101
355 352
356 0x1400, // 96 = 0110 0000 -> 0001 0100 0000 0000 353 0x1400, // 96 = 0110 0000 -> 0001 0100 0000 0000
357 0x1401, // 97 = 0110 0001 -> 0001 0100 0000 0001 354 0x1401, // 97 = 0110 0001 -> 0001 0100 0000 0001
358 0x1404, // 98 = 0110 0010 -> 0001 0100 0000 0100 355 0x1404, // 98 = 0110 0010 -> 0001 0100 0000 0100
359 0x1405, // 99 = 0110 0011 -> 0001 0100 0000 0101 356 0x1405, // 99 = 0110 0011 -> 0001 0100 0000 0101
360 0x1410, //100 = 0110 0100 -> 0001 0100 0001 0000 357 0x1410, //100 = 0110 0100 -> 0001 0100 0001 0000
361 0x1411, //101 = 0110 0101 -> 0001 0100 0001 0001 358 0x1411, //101 = 0110 0101 -> 0001 0100 0001 0001
362 0x1414, //102 = 0110 0110 -> 0001 0100 0001 0100 359 0x1414, //102 = 0110 0110 -> 0001 0100 0001 0100
363 0x1415, //103 = 0110 0111 -> 0001 0100 0001 0101 360 0x1415, //103 = 0110 0111 -> 0001 0100 0001 0101
364 0x1440, //104 = 0110 1000 -> 0001 0100 0100 0000 361 0x1440, //104 = 0110 1000 -> 0001 0100 0100 0000
365 0x1441, //105 = 0110 1001 -> 0001 0100 0100 0001 362 0x1441, //105 = 0110 1001 -> 0001 0100 0100 0001
366 0x1444, //106 = 0110 1010 -> 0001 0100 0100 0100 363 0x1444, //106 = 0110 1010 -> 0001 0100 0100 0100
367 0x1445, //107 = 0110 1011 -> 0001 0100 0100 0101 364 0x1445, //107 = 0110 1011 -> 0001 0100 0100 0101
368 0x1450, //108 = 0110 1100 -> 0001 0100 0101 0000 365 0x1450, //108 = 0110 1100 -> 0001 0100 0101 0000
369 0x1451, //109 = 0110 1101 -> 0001 0100 0101 0001 366 0x1451, //109 = 0110 1101 -> 0001 0100 0101 0001
370 0x1454, //110 = 0110 1110 -> 0001 0100 0101 0100 367 0x1454, //110 = 0110 1110 -> 0001 0100 0101 0100
371 0x1455, //111 = 0110 1111 -> 0001 0100 0101 0101 368 0x1455, //111 = 0110 1111 -> 0001 0100 0101 0101
372 369
373 0x1500, //112 = 0111 0000 -> 0001 0101 0000 0000 370 0x1500, //112 = 0111 0000 -> 0001 0101 0000 0000
374 0x1501, //113 = 0111 0001 -> 0001 0101 0000 0001 371 0x1501, //113 = 0111 0001 -> 0001 0101 0000 0001
375 0x1504, //114 = 0111 0010 -> 0001 0101 0000 0100 372 0x1504, //114 = 0111 0010 -> 0001 0101 0000 0100
376 0x1505, //115 = 0111 0011 -> 0001 0101 0000 0101 373 0x1505, //115 = 0111 0011 -> 0001 0101 0000 0101
377 0x1510, //116 = 0111 0100 -> 0001 0101 0001 0000 374 0x1510, //116 = 0111 0100 -> 0001 0101 0001 0000
378 0x1511, //117 = 0111 0101 -> 0001 0101 0001 0001 375 0x1511, //117 = 0111 0101 -> 0001 0101 0001 0001
379 0x1514, //118 = 0111 0110 -> 0001 0101 0001 0100 376 0x1514, //118 = 0111 0110 -> 0001 0101 0001 0100
380 0x1515, //119 = 0111 0111 -> 0001 0101 0001 0101 377 0x1515, //119 = 0111 0111 -> 0001 0101 0001 0101
381 0x1540, //120 = 0111 1000 -> 0001 0101 0100 0000 378 0x1540, //120 = 0111 1000 -> 0001 0101 0100 0000
382 0x1541, //121 = 0111 1001 -> 0001 0101 0100 0001 379 0x1541, //121 = 0111 1001 -> 0001 0101 0100 0001
383 0x1544, //122 = 0111 1010 -> 0001 0101 0100 0100 380 0x1544, //122 = 0111 1010 -> 0001 0101 0100 0100
384 0x1545, //123 = 0111 1011 -> 0001 0101 0100 0101 381 0x1545, //123 = 0111 1011 -> 0001 0101 0100 0101
385 0x1550, //124 = 0111 1100 -> 0001 0101 0101 0000 382 0x1550, //124 = 0111 1100 -> 0001 0101 0101 0000
386 0x1551, //125 = 0111 1101 -> 0001 0101 0101 0001 383 0x1551, //125 = 0111 1101 -> 0001 0101 0101 0001
387 0x1554, //126 = 0111 1110 -> 0001 0101 0101 0100 384 0x1554, //126 = 0111 1110 -> 0001 0101 0101 0100
388 0x1555, //127 = 0111 1111 -> 0001 0101 0101 0101 385 0x1555, //127 = 0111 1111 -> 0001 0101 0101 0101
389 386
390 0x4000, //128 = 1000 0000 -> 0100 0000 0000 0000 387 0x4000, //128 = 1000 0000 -> 0100 0000 0000 0000
391 0x4001, //129 = 1000 0001 -> 0100 0000 0000 0001 388 0x4001, //129 = 1000 0001 -> 0100 0000 0000 0001
392 0x4004, //130 = 1000 0010 -> 0100 0000 0000 0100 389 0x4004, //130 = 1000 0010 -> 0100 0000 0000 0100
393 0x4005, //131 = 1000 0011 -> 0100 0000 0000 0101 390 0x4005, //131 = 1000 0011 -> 0100 0000 0000 0101
394 0x4010, //132 = 1000 0100 -> 0100 0000 0001 0000 391 0x4010, //132 = 1000 0100 -> 0100 0000 0001 0000
395 0x4011, //133 = 1000 0101 -> 0100 0000 0001 0001 392 0x4011, //133 = 1000 0101 -> 0100 0000 0001 0001
396 0x4014, //134 = 1000 0110 -> 0100 0000 0001 0100 393 0x4014, //134 = 1000 0110 -> 0100 0000 0001 0100
397 0x4015, //135 = 1000 0111 -> 0100 0000 0001 0101 394 0x4015, //135 = 1000 0111 -> 0100 0000 0001 0101
398 0x4040, //136 = 1000 1000 -> 0100 0000 0100 0000 395 0x4040, //136 = 1000 1000 -> 0100 0000 0100 0000
399 0x4041, //137 = 1000 1001 -> 0100 0000 0100 0001 396 0x4041, //137 = 1000 1001 -> 0100 0000 0100 0001
400 0x4044, //138 = 1000 1010 -> 0100 0000 0100 0100 397 0x4044, //138 = 1000 1010 -> 0100 0000 0100 0100
401 0x4045, //139 = 1000 1011 -> 0100 0000 0100 0101 398 0x4045, //139 = 1000 1011 -> 0100 0000 0100 0101
402 0x4050, //140 = 1000 1100 -> 0100 0000 0101 0000 399 0x4050, //140 = 1000 1100 -> 0100 0000 0101 0000
403 0x4051, //141 = 1000 1101 -> 0100 0000 0101 0001 400 0x4051, //141 = 1000 1101 -> 0100 0000 0101 0001
404 0x4054, //142 = 1000 1110 -> 0100 0000 0101 0100 401 0x4054, //142 = 1000 1110 -> 0100 0000 0101 0100
405 0x4055, //143 = 1000 1111 -> 0100 0000 0101 0101 402 0x4055, //143 = 1000 1111 -> 0100 0000 0101 0101
406 403
407 0x4100, //144 = 1001 0000 -> 0100 0001 0000 0000 404 0x4100, //144 = 1001 0000 -> 0100 0001 0000 0000
408 0x4101, //145 = 1001 0001 -> 0100 0001 0000 0001 405 0x4101, //145 = 1001 0001 -> 0100 0001 0000 0001
diff --git a/frontend/gamma/js/Clipperz/Crypto/ECC/BinaryField/Point.js b/frontend/gamma/js/Clipperz/Crypto/ECC/BinaryField/Point.js
index b7a5537..ffe287b 100644
--- a/frontend/gamma/js/Clipperz/Crypto/ECC/BinaryField/Point.js
+++ b/frontend/gamma/js/Clipperz/Crypto/ECC/BinaryField/Point.js
@@ -1,67 +1,64 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29//try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) { 26//try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) {
30 //throw "Clipperz.Crypto.ECC depends on Clipperz.ByteArray!"; 27 //throw "Clipperz.Crypto.ECC depends on Clipperz.ByteArray!";
31//} 28//}
32if (typeof(Clipperz.Crypto.ECC) == 'undefined') { Clipperz.Crypto.ECC = {}; } 29if (typeof(Clipperz.Crypto.ECC) == 'undefined') { Clipperz.Crypto.ECC = {}; }
33if (typeof(Clipperz.Crypto.ECC.BinaryField) == 'undefined') { Clipperz.Crypto.ECC.BinaryField = {}; } 30if (typeof(Clipperz.Crypto.ECC.BinaryField) == 'undefined') { Clipperz.Crypto.ECC.BinaryField = {}; }
34 31
35Clipperz.Crypto.ECC.BinaryField.Point = function(args) { 32Clipperz.Crypto.ECC.BinaryField.Point = function(args) {
36 args = args || {}; 33 args = args || {};
37 this._x = args.x; 34 this._x = args.x;
38 this._y = args.y; 35 this._y = args.y;
39 36
40 return this; 37 return this;
41} 38}
42 39
43Clipperz.Crypto.ECC.BinaryField.Point.prototype = MochiKit.Base.update(null, { 40Clipperz.Crypto.ECC.BinaryField.Point.prototype = MochiKit.Base.update(null, {
44 41
45 'asString': function() { 42 'asString': function() {
46 return "Clipperz.Crypto.ECC.BinaryField.Point (" + this.x() + ", " + this.y() + ")"; 43 return "Clipperz.Crypto.ECC.BinaryField.Point (" + this.x() + ", " + this.y() + ")";
47 }, 44 },
48 45
49 //----------------------------------------------------------------------------- 46 //-----------------------------------------------------------------------------
50 47
51 'x': function() { 48 'x': function() {
52 return this._x; 49 return this._x;
53 }, 50 },
54 51
55 'y': function() { 52 'y': function() {
56 return this._y; 53 return this._y;
57 }, 54 },
58 55
59 //----------------------------------------------------------------------------- 56 //-----------------------------------------------------------------------------
60 57
61 'isZero': function() { 58 'isZero': function() {
62 return (this.x().isZero() && this.y().isZero()) 59 return (this.x().isZero() && this.y().isZero())
63 }, 60 },
64 61
65 //----------------------------------------------------------------------------- 62 //-----------------------------------------------------------------------------
66 __syntaxFix__: "syntax fix" 63 __syntaxFix__: "syntax fix"
67}); 64});
diff --git a/frontend/gamma/js/Clipperz/Crypto/ECC/BinaryField/Value.js b/frontend/gamma/js/Clipperz/Crypto/ECC/BinaryField/Value.js
index 5a430d1..b705a20 100644
--- a/frontend/gamma/js/Clipperz/Crypto/ECC/BinaryField/Value.js
+++ b/frontend/gamma/js/Clipperz/Crypto/ECC/BinaryField/Value.js
@@ -1,386 +1,383 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29//try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) { 26//try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) {
30 //throw "Clipperz.Crypto.ECC depends on Clipperz.ByteArray!"; 27 //throw "Clipperz.Crypto.ECC depends on Clipperz.ByteArray!";
31//} 28//}
32if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 29if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
33if (typeof(Clipperz.Crypto) == 'undefined') { Clipperz.Crypto = {}; } 30if (typeof(Clipperz.Crypto) == 'undefined') { Clipperz.Crypto = {}; }
34if (typeof(Clipperz.Crypto.ECC) == 'undefined') { Clipperz.Crypto.ECC = {}; } 31if (typeof(Clipperz.Crypto.ECC) == 'undefined') { Clipperz.Crypto.ECC = {}; }
35if (typeof(Clipperz.Crypto.ECC.BinaryField) == 'undefined') { Clipperz.Crypto.ECC.BinaryField = {}; } 32if (typeof(Clipperz.Crypto.ECC.BinaryField) == 'undefined') { Clipperz.Crypto.ECC.BinaryField = {}; }
36 33
37Clipperz.Crypto.ECC.BinaryField.Value = function(aValue, aBase, aBitSize) { 34Clipperz.Crypto.ECC.BinaryField.Value = function(aValue, aBase, aBitSize) {
38 if (aValue.constructor == String) { 35 if (aValue.constructor == String) {
39 varvalue; 36 varvalue;
40 varstringLength; 37 varstringLength;
41 var numberOfWords; 38 var numberOfWords;
42 vari,c; 39 vari,c;
43 40
44 if (aBase != 16) { 41 if (aBase != 16) {
45 throw Clipperz.Crypto.ECC.BinaryField.Value.exception.UnsupportedBase; 42 throw Clipperz.Crypto.ECC.BinaryField.Value.exception.UnsupportedBase;
46 } 43 }
47 44
48 value = aValue.replace(/ /g, ''); 45 value = aValue.replace(/ /g, '');
49 stringLength = value.length; 46 stringLength = value.length;
50 numberOfWords = Math.ceil(stringLength / 8); 47 numberOfWords = Math.ceil(stringLength / 8);
51 this._value = new Array(numberOfWords); 48 this._value = new Array(numberOfWords);
52 49
53 c = numberOfWords; 50 c = numberOfWords;
54 for (i=0; i<c; i++) { 51 for (i=0; i<c; i++) {
55 varword; 52 varword;
56 53
57 if (i < (c-1)) { 54 if (i < (c-1)) {
58 word = parseInt(value.substr(stringLength-((i+1)*8), 8), 16); 55 word = parseInt(value.substr(stringLength-((i+1)*8), 8), 16);
59 } else { 56 } else {
60 word = parseInt(value.substr(0, stringLength-(i*8)), 16); 57 word = parseInt(value.substr(0, stringLength-(i*8)), 16);
61 } 58 }
62 59
63 this._value[i] = word; 60 this._value[i] = word;
64 } 61 }
65 } else if (aValue.constructor == Array) { 62 } else if (aValue.constructor == Array) {
66 var itemsToCopy; 63 var itemsToCopy;
67 64
68 itemsToCopy = aValue.length; 65 itemsToCopy = aValue.length;
69 while (aValue[itemsToCopy - 1] == 0) { 66 while (aValue[itemsToCopy - 1] == 0) {
70 itemsToCopy --; 67 itemsToCopy --;
71 } 68 }
72 69
73 this._value = aValue.slice(0, itemsToCopy); 70 this._value = aValue.slice(0, itemsToCopy);
74 } else if (aValue.constructor == Number) { 71 } else if (aValue.constructor == Number) {
75 this._value = [aValue]; 72 this._value = [aValue];
76 } else { 73 } else {
77 // throw Clipperz.Crypto.ECC.BinaryField.Value.exception.UnsupportedConstructorValueType; 74 // throw Clipperz.Crypto.ECC.BinaryField.Value.exception.UnsupportedConstructorValueType;
78 } 75 }
79 76
80 this._bitSize == aBitSize || null; 77 this._bitSize == aBitSize || null;
81 78
82 return this; 79 return this;
83} 80}
84 81
85Clipperz.Crypto.ECC.BinaryField.Value.prototype = MochiKit.Base.update(null, { 82Clipperz.Crypto.ECC.BinaryField.Value.prototype = MochiKit.Base.update(null, {
86 83
87 'value': function() { 84 'value': function() {
88 return this._value; 85 return this._value;
89 }, 86 },
90 87
91 //----------------------------------------------------------------------------- 88 //-----------------------------------------------------------------------------
92 89
93 'wordSize': function() { 90 'wordSize': function() {
94 return this._value.length 91 return this._value.length
95 }, 92 },
96 93
97 //----------------------------------------------------------------------------- 94 //-----------------------------------------------------------------------------
98 95
99 'clone': function() { 96 'clone': function() {
100 return new Clipperz.Crypto.ECC.BinaryField.Value(this._value.slice(0), null, this._bitSize); 97 return new Clipperz.Crypto.ECC.BinaryField.Value(this._value.slice(0), null, this._bitSize);
101 }, 98 },
102 99
103 //----------------------------------------------------------------------------- 100 //-----------------------------------------------------------------------------
104 101
105 'isZero': function() { 102 'isZero': function() {
106 return (this.compare(Clipperz.Crypto.ECC.BinaryField.Value.O) == 0); 103 return (this.compare(Clipperz.Crypto.ECC.BinaryField.Value.O) == 0);
107 }, 104 },
108 105
109 //----------------------------------------------------------------------------- 106 //-----------------------------------------------------------------------------
110 107
111 'asString': function(aBase) { 108 'asString': function(aBase) {
112 varresult; 109 varresult;
113 var i,c; 110 var i,c;
114 111
115 if (aBase != 16) { 112 if (aBase != 16) {
116 throw Clipperz.Crypto.ECC.BinaryField.Value.exception.UnsupportedBase; 113 throw Clipperz.Crypto.ECC.BinaryField.Value.exception.UnsupportedBase;
117 } 114 }
118 115
119 result = ""; 116 result = "";
120 c = this.wordSize(); 117 c = this.wordSize();
121 for (i=0; i<c; i++) { 118 for (i=0; i<c; i++) {
122 varwordAsString; 119 varwordAsString;
123 120
124 // wordAsString = ("00000000" + this.value()[i].toString(16)); 121 // wordAsString = ("00000000" + this.value()[i].toString(16));
125 wordAsString = ("00000000" + this._value[i].toString(16)); 122 wordAsString = ("00000000" + this._value[i].toString(16));
126 wordAsString = wordAsString.substring(wordAsString.length - 8); 123 wordAsString = wordAsString.substring(wordAsString.length - 8);
127 result = wordAsString + result; 124 result = wordAsString + result;
128 } 125 }
129 126
130 result = result.replace(/^(00)*/, ""); 127 result = result.replace(/^(00)*/, "");
131 128
132 if (result == "") { 129 if (result == "") {
133 result = "0"; 130 result = "0";
134 } 131 }
135 132
136 return result; 133 return result;
137 }, 134 },
138 135
139 //----------------------------------------------------------------------------- 136 //-----------------------------------------------------------------------------
140 137
141 'shiftLeft': function(aNumberOfBitsToShift) { 138 'shiftLeft': function(aNumberOfBitsToShift) {
142 //this method seems like it is never called. :-( 139 //this method seems like it is never called. :-(
143 return new Clipperz.Crypto.ECC.BinaryField.Value(Clipperz.Crypto.ECC.BinaryField.Value._shiftLeft(this._value, aNumberOfBitsToShift)); 140 return new Clipperz.Crypto.ECC.BinaryField.Value(Clipperz.Crypto.ECC.BinaryField.Value._shiftLeft(this._value, aNumberOfBitsToShift));
144 }, 141 },
145 142
146 //----------------------------------------------------------------------------- 143 //-----------------------------------------------------------------------------
147 144
148 'bitSize': function() { 145 'bitSize': function() {
149 if (this._bitSize == null) { 146 if (this._bitSize == null) {
150 this._bitSize = Clipperz.Crypto.ECC.BinaryField.Value._bitSize(this._value); 147 this._bitSize = Clipperz.Crypto.ECC.BinaryField.Value._bitSize(this._value);
151 } 148 }
152 149
153 return this._bitSize; 150 return this._bitSize;
154 }, 151 },
155 152
156 //----------------------------------------------------------------------------- 153 //-----------------------------------------------------------------------------
157 154
158 'isBitSet': function(aBitPosition) { 155 'isBitSet': function(aBitPosition) {
159 return Clipperz.Crypto.ECC.BinaryField.Value._isBitSet(this._value, aBitPosition); 156 return Clipperz.Crypto.ECC.BinaryField.Value._isBitSet(this._value, aBitPosition);
160 }, 157 },
161 158
162 //----------------------------------------------------------------------------- 159 //-----------------------------------------------------------------------------
163 160
164 'xor': function(aValue) { 161 'xor': function(aValue) {
165 return new Clipperz.Crypto.ECC.BinaryField.Value(Clipperz.Crypto.ECC.BinaryField.Value._xor(this._value, aValue._value)); 162 return new Clipperz.Crypto.ECC.BinaryField.Value(Clipperz.Crypto.ECC.BinaryField.Value._xor(this._value, aValue._value));
166 }, 163 },
167 164
168 //----------------------------------------------------------------------------- 165 //-----------------------------------------------------------------------------
169 166
170 'compare': function(aValue) { 167 'compare': function(aValue) {
171 return Clipperz.Crypto.ECC.BinaryField.Value._compare(this._value, aValue._value); 168 return Clipperz.Crypto.ECC.BinaryField.Value._compare(this._value, aValue._value);
172 }, 169 },
173 170
174 //----------------------------------------------------------------------------- 171 //-----------------------------------------------------------------------------
175 __syntaxFix__: "syntax fix" 172 __syntaxFix__: "syntax fix"
176}); 173});
177 174
178Clipperz.Crypto.ECC.BinaryField.Value.O = new Clipperz.Crypto.ECC.BinaryField.Value('0', 16); 175Clipperz.Crypto.ECC.BinaryField.Value.O = new Clipperz.Crypto.ECC.BinaryField.Value('0', 16);
179Clipperz.Crypto.ECC.BinaryField.Value.I = new Clipperz.Crypto.ECC.BinaryField.Value('1', 16); 176Clipperz.Crypto.ECC.BinaryField.Value.I = new Clipperz.Crypto.ECC.BinaryField.Value('1', 16);
180 177
181Clipperz.Crypto.ECC.BinaryField.Value._xor = function(a, b, aFirstItemOffset) { 178Clipperz.Crypto.ECC.BinaryField.Value._xor = function(a, b, aFirstItemOffset) {
182 var result; 179 var result;
183 var resultSize; 180 var resultSize;
184 var i,c; 181 var i,c;
185 var firstItemOffset; 182 var firstItemOffset;
186 183
187 firstItemOffset = aFirstItemOffset || 0; 184 firstItemOffset = aFirstItemOffset || 0;
188 resultSize = Math.max((a.length - firstItemOffset), b.length) + firstItemOffset; 185 resultSize = Math.max((a.length - firstItemOffset), b.length) + firstItemOffset;
189 186
190 result = new Array(resultSize); 187 result = new Array(resultSize);
191 188
192 c = firstItemOffset; 189 c = firstItemOffset;
193 for (i=0; i<c; i++) { 190 for (i=0; i<c; i++) {
194 result[i] = a[i]; 191 result[i] = a[i];
195 } 192 }
196 193
197 c = resultSize; 194 c = resultSize;
198 for (i=firstItemOffset; i<c; i++) { 195 for (i=firstItemOffset; i<c; i++) {
199 result[i] = (((a[i] || 0) ^ (b[i - firstItemOffset] || 0)) >>> 0); 196 result[i] = (((a[i] || 0) ^ (b[i - firstItemOffset] || 0)) >>> 0);
200 } 197 }
201 198
202 return result; 199 return result;
203}; 200};
204 201
205Clipperz.Crypto.ECC.BinaryField.Value._overwriteXor = function(a, b, aFirstItemOffset) { 202Clipperz.Crypto.ECC.BinaryField.Value._overwriteXor = function(a, b, aFirstItemOffset) {
206 var i,c; 203 var i,c;
207 var firstItemOffset; 204 var firstItemOffset;
208 205
209 firstItemOffset = aFirstItemOffset || 0; 206 firstItemOffset = aFirstItemOffset || 0;
210 207
211 c = Math.max((a.length - firstItemOffset), b.length) + firstItemOffset; 208 c = Math.max((a.length - firstItemOffset), b.length) + firstItemOffset;
212 for (i=firstItemOffset; i<c; i++) { 209 for (i=firstItemOffset; i<c; i++) {
213 a[i] = (((a[i] || 0) ^ (b[i - firstItemOffset] || 0)) >>> 0); 210 a[i] = (((a[i] || 0) ^ (b[i - firstItemOffset] || 0)) >>> 0);
214 } 211 }
215}; 212};
216 213
217Clipperz.Crypto.ECC.BinaryField.Value._shiftLeft = function(aWordArray, aNumberOfBitsToShift) { 214Clipperz.Crypto.ECC.BinaryField.Value._shiftLeft = function(aWordArray, aNumberOfBitsToShift) {
218 var numberOfWordsToShift; 215 var numberOfWordsToShift;
219 varnumberOfBitsToShift; 216 varnumberOfBitsToShift;
220 var result; 217 var result;
221 varoverflowValue; 218 varoverflowValue;
222 var nextOverflowValue; 219 var nextOverflowValue;
223 vari,c; 220 vari,c;
224 221
225 numberOfWordsToShift = Math.floor(aNumberOfBitsToShift / 32); 222 numberOfWordsToShift = Math.floor(aNumberOfBitsToShift / 32);
226 numberOfBitsToShift = aNumberOfBitsToShift % 32; 223 numberOfBitsToShift = aNumberOfBitsToShift % 32;
227 224
228 result = new Array(aWordArray.length + numberOfWordsToShift); 225 result = new Array(aWordArray.length + numberOfWordsToShift);
229 226
230 c = numberOfWordsToShift; 227 c = numberOfWordsToShift;
231 for (i=0; i<c; i++) { 228 for (i=0; i<c; i++) {
232 result[i] = 0; 229 result[i] = 0;
233 } 230 }
234 231
235 overflowValue = 0; 232 overflowValue = 0;
236 nextOverflowValue = 0; 233 nextOverflowValue = 0;
237 234
238 c = aWordArray.length; 235 c = aWordArray.length;
239 for (i=0; i<c; i++) { 236 for (i=0; i<c; i++) {
240 varvalue; 237 varvalue;
241 varresultWord; 238 varresultWord;
242 239
243 // value = this.value()[i]; 240 // value = this.value()[i];
244 value = aWordArray[i]; 241 value = aWordArray[i];
245 242
246 if (numberOfBitsToShift > 0) { 243 if (numberOfBitsToShift > 0) {
247 nextOverflowValue = (value >>> (32 - numberOfBitsToShift)); 244 nextOverflowValue = (value >>> (32 - numberOfBitsToShift));
248 value = value & (0xffffffff >>> numberOfBitsToShift); 245 value = value & (0xffffffff >>> numberOfBitsToShift);
249 resultWord = (((value << numberOfBitsToShift) | overflowValue) >>> 0); 246 resultWord = (((value << numberOfBitsToShift) | overflowValue) >>> 0);
250 } else { 247 } else {
251 resultWord = value; 248 resultWord = value;
252 } 249 }
253 250
254 result[i+numberOfWordsToShift] = resultWord; 251 result[i+numberOfWordsToShift] = resultWord;
255 overflowValue = nextOverflowValue; 252 overflowValue = nextOverflowValue;
256 } 253 }
257 254
258 if (overflowValue != 0) { 255 if (overflowValue != 0) {
259 result[aWordArray.length + numberOfWordsToShift] = overflowValue; 256 result[aWordArray.length + numberOfWordsToShift] = overflowValue;
260 } 257 }
261 258
262 return result; 259 return result;
263}; 260};
264 261
265Clipperz.Crypto.ECC.BinaryField.Value._overwriteShiftLeft = function(aWordArray, aNumberOfBitsToShift) { 262Clipperz.Crypto.ECC.BinaryField.Value._overwriteShiftLeft = function(aWordArray, aNumberOfBitsToShift) {
266 var numberOfWordsToShift; 263 var numberOfWordsToShift;
267 varnumberOfBitsToShift; 264 varnumberOfBitsToShift;
268 var result; 265 var result;
269 varoverflowValue; 266 varoverflowValue;
270 vari,c; 267 vari,c;
271 268
272 numberOfWordsToShift = Math.floor(aNumberOfBitsToShift / 32); 269 numberOfWordsToShift = Math.floor(aNumberOfBitsToShift / 32);
273 numberOfBitsToShift = aNumberOfBitsToShift % 32; 270 numberOfBitsToShift = aNumberOfBitsToShift % 32;
274 271
275 result = new Array(aWordArray.length + numberOfWordsToShift); 272 result = new Array(aWordArray.length + numberOfWordsToShift);
276 273
277 c = numberOfWordsToShift; 274 c = numberOfWordsToShift;
278 for (i=0; i<c; i++) { 275 for (i=0; i<c; i++) {
279 result[i] = 0; 276 result[i] = 0;
280 } 277 }
281 278
282 overflowValue = 0; 279 overflowValue = 0;
283 nextOverflowValue = 0; 280 nextOverflowValue = 0;
284 281
285 c = aWordArray.length; 282 c = aWordArray.length;
286 for (i=0; i<c; i++) { 283 for (i=0; i<c; i++) {
287 varvalue; 284 varvalue;
288 varresultWord; 285 varresultWord;
289 286
290 // value = this.value()[i]; 287 // value = this.value()[i];
291 value = aWordArray[i]; 288 value = aWordArray[i];
292 289
293 if (numberOfBitsToShift > 0) { 290 if (numberOfBitsToShift > 0) {
294 var nextOverflowValue; 291 var nextOverflowValue;
295 292
296 nextOverflowValue = (value >>> (32 - numberOfBitsToShift)); 293 nextOverflowValue = (value >>> (32 - numberOfBitsToShift));
297 value = value & (0xffffffff >>> numberOfBitsToShift); 294 value = value & (0xffffffff >>> numberOfBitsToShift);
298 resultWord = (((value << numberOfBitsToShift) | overflowValue) >>> 0); 295 resultWord = (((value << numberOfBitsToShift) | overflowValue) >>> 0);
299 } else { 296 } else {
300 resultWord = value; 297 resultWord = value;
301 } 298 }
302 299
303 result[i+numberOfWordsToShift] = resultWord; 300 result[i+numberOfWordsToShift] = resultWord;
304 overflowValue = nextOverflowValue; 301 overflowValue = nextOverflowValue;
305 } 302 }
306 303
307 if (overflowValue != 0) { 304 if (overflowValue != 0) {
308 result[aWordArray.length + numberOfWordsToShift] = overflowValue; 305 result[aWordArray.length + numberOfWordsToShift] = overflowValue;
309 } 306 }
310 307
311 return result; 308 return result;
312}; 309};
313 310
314Clipperz.Crypto.ECC.BinaryField.Value._bitSize = function(aWordArray) { 311Clipperz.Crypto.ECC.BinaryField.Value._bitSize = function(aWordArray) {
315 varresult; 312 varresult;
316 varnotNullElements; 313 varnotNullElements;
317 var mostValuableWord; 314 var mostValuableWord;
318 var matchingBitsInMostImportantWord; 315 var matchingBitsInMostImportantWord;
319 var mask; 316 var mask;
320 var i,c; 317 var i,c;
321 318
322 notNullElements = aWordArray.length; 319 notNullElements = aWordArray.length;
323 320
324 if ((aWordArray.length == 1) && (aWordArray[0] == 0)) { 321 if ((aWordArray.length == 1) && (aWordArray[0] == 0)) {
325 result = 0; 322 result = 0;
326 } else { 323 } else {
327 notNullElements --; 324 notNullElements --;
328 while((notNullElements > 0) && (aWordArray[notNullElements] == 0)) { 325 while((notNullElements > 0) && (aWordArray[notNullElements] == 0)) {
329 notNullElements --; 326 notNullElements --;
330 } 327 }
331 328
332 result = notNullElements * 32; 329 result = notNullElements * 32;
333 mostValuableWord = aWordArray[notNullElements]; 330 mostValuableWord = aWordArray[notNullElements];
334 331
335 matchingBits = 32; 332 matchingBits = 32;
336 mask = 0x80000000; 333 mask = 0x80000000;
337 334
338 while ((matchingBits > 0) && ((mostValuableWord & mask) == 0)) { 335 while ((matchingBits > 0) && ((mostValuableWord & mask) == 0)) {
339 matchingBits --; 336 matchingBits --;
340 mask >>>= 1; 337 mask >>>= 1;
341 } 338 }
342 339
343 result += matchingBits; 340 result += matchingBits;
344 } 341 }
345 342
346 return result; 343 return result;
347}; 344};
348 345
349Clipperz.Crypto.ECC.BinaryField.Value._isBitSet = function(aWordArray, aBitPosition) { 346Clipperz.Crypto.ECC.BinaryField.Value._isBitSet = function(aWordArray, aBitPosition) {
350 var result; 347 var result;
351 varbyteIndex; 348 varbyteIndex;
352 var bitIndexInSelectedByte; 349 var bitIndexInSelectedByte;
353 350
354 byteIndex = Math.floor(aBitPosition / 32); 351 byteIndex = Math.floor(aBitPosition / 32);
355 bitIndexInSelectedByte = aBitPosition % 32; 352 bitIndexInSelectedByte = aBitPosition % 32;
356 353
357 if (byteIndex <= aWordArray.length) { 354 if (byteIndex <= aWordArray.length) {
358 result = ((aWordArray[byteIndex] & (1 << bitIndexInSelectedByte)) != 0); 355 result = ((aWordArray[byteIndex] & (1 << bitIndexInSelectedByte)) != 0);
359 } else { 356 } else {
360 result = false; 357 result = false;
361 } 358 }
362 359
363 return result; 360 return result;
364}; 361};
365 362
366Clipperz.Crypto.ECC.BinaryField.Value._compare = function(a,b) { 363Clipperz.Crypto.ECC.BinaryField.Value._compare = function(a,b) {
367 varresult; 364 varresult;
368 var i,c; 365 var i,c;
369 366
370 result = MochiKit.Base.compare(a.length, b.length); 367 result = MochiKit.Base.compare(a.length, b.length);
371 368
372 c = a.length; 369 c = a.length;
373 for (i=0; (i<c) && (result==0); i++) { 370 for (i=0; (i<c) && (result==0); i++) {
374//console.log("compare[" + c + " - " + i + " - 1] " + this.value()[c-i-1] + ", " + aValue.value()[c-i-1]); 371//console.log("compare[" + c + " - " + i + " - 1] " + this.value()[c-i-1] + ", " + aValue.value()[c-i-1]);
375 // result = MochiKit.Base.compare(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]);
376 result = MochiKit.Base.compare(a[c-i-1], b[c-i-1]); 373 result = MochiKit.Base.compare(a[c-i-1], b[c-i-1]);
377 } 374 }
378 375
379 return result; 376 return result;
380}; 377};
381 378
382 379
383Clipperz.Crypto.ECC.BinaryField.Value['exception']= { 380Clipperz.Crypto.ECC.BinaryField.Value['exception']= {
384 'UnsupportedBase': new MochiKit.Base.NamedError("Clipperz.Crypto.ECC.BinaryField.Value.exception.UnsupportedBase"), 381 'UnsupportedBase': new MochiKit.Base.NamedError("Clipperz.Crypto.ECC.BinaryField.Value.exception.UnsupportedBase"),
385 'UnsupportedConstructorValueType':new MochiKit.Base.NamedError("Clipperz.Crypto.ECC.BinaryField.Value.exception.UnsupportedConstructorValueType") 382 'UnsupportedConstructorValueType':new MochiKit.Base.NamedError("Clipperz.Crypto.ECC.BinaryField.Value.exception.UnsupportedConstructorValueType")
386}; 383};
diff --git a/frontend/gamma/js/Clipperz/Crypto/ECC/StandardCurves.js b/frontend/gamma/js/Clipperz/Crypto/ECC/StandardCurves.js
index ae2b8fb..be197e3 100644
--- a/frontend/gamma/js/Clipperz/Crypto/ECC/StandardCurves.js
+++ b/frontend/gamma/js/Clipperz/Crypto/ECC/StandardCurves.js
@@ -1,239 +1,236 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29//try { if (typeof(Clipperz.Crypto.ECC.BinaryField.Curve) == 'undefined') { throw ""; }} catch (e) { 26//try { if (typeof(Clipperz.Crypto.ECC.BinaryField.Curve) == 'undefined') { throw ""; }} catch (e) {
30 //throw "Clipperz.Crypto.ECC depends on Clipperz.Crypto.ECC.BinaryField.Curve!"; 27 //throw "Clipperz.Crypto.ECC depends on Clipperz.Crypto.ECC.BinaryField.Curve!";
31//} 28//}
32//try { if (typeof(Clipperz.Crypto.ECC.Koblitz.Curve) == 'undefined') { throw ""; }} catch (e) { 29//try { if (typeof(Clipperz.Crypto.ECC.Koblitz.Curve) == 'undefined') { throw ""; }} catch (e) {
33 //throw "Clipperz.Crypto.ECC depends on Clipperz.Crypto.ECC.Koblitz.Curve!"; 30 //throw "Clipperz.Crypto.ECC depends on Clipperz.Crypto.ECC.Koblitz.Curve!";
34//} 31//}
35 32
36Clipperz.Crypto.ECC.StandardCurves = {}; 33Clipperz.Crypto.ECC.StandardCurves = {};
37 34
38MochiKit.Base.update(Clipperz.Crypto.ECC.StandardCurves, { 35MochiKit.Base.update(Clipperz.Crypto.ECC.StandardCurves, {
39 36
40 //============================================================================== 37 //==============================================================================
41 38
42 '_K571': null, 39 '_K571': null,
43 'K571': function() { //f(z) = z^571 + z^10 + z^5 + z^2 + 1 40 'K571': function() { //f(z) = z^571 + z^10 + z^5 + z^2 + 1
44 if ((Clipperz.Crypto.ECC.StandardCurves._K571 == null) && (typeof(Clipperz.Crypto.ECC.Koblitz.Curve) != 'undefined')) { 41 if ((Clipperz.Crypto.ECC.StandardCurves._K571 == null) && (typeof(Clipperz.Crypto.ECC.Koblitz.Curve) != 'undefined')) {
45 Clipperz.Crypto.ECC.StandardCurves._K571 = new Clipperz.Crypto.ECC.Koblitz.Curve({ 42 Clipperz.Crypto.ECC.StandardCurves._K571 = new Clipperz.Crypto.ECC.Koblitz.Curve({
46 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), 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),
47 a: new Clipperz.Crypto.ECC.Koblitz.Value('0', 16), 44 a: new Clipperz.Crypto.ECC.Koblitz.Value('0', 16),
48 b: new Clipperz.Crypto.ECC.Koblitz.Value('1', 16), 45 b: new Clipperz.Crypto.ECC.Koblitz.Value('1', 16),
49 G: new Clipperz.Crypto.ECC.Koblitz.Point({ 46 G: new Clipperz.Crypto.ECC.Koblitz.Point({
50 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), 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),
51 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) 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)
52 }), 49 }),
53 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), 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),
54 h: new Clipperz.Crypto.ECC.Koblitz.Value('4', 16), 51 h: new Clipperz.Crypto.ECC.Koblitz.Value('4', 16),
55 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) 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)
56 }); 53 });
57 } 54 }
58 55
59 return Clipperz.Crypto.ECC.StandardCurves._K571; 56 return Clipperz.Crypto.ECC.StandardCurves._K571;
60 }, 57 },
61 58
62 //----------------------------------------------------------------------------- 59 //-----------------------------------------------------------------------------
63 60
64 '_K283': null, 61 '_K283': null,
65 'K283': function() { //f(z) = z^283 + z^12 + z^7 + z^5 + 1 62 'K283': function() { //f(z) = z^283 + z^12 + z^7 + z^5 + 1
66 if ((Clipperz.Crypto.ECC.StandardCurves._K283 == null) && (typeof(Clipperz.Crypto.ECC.Koblitz.Curve) != 'undefined')) { 63 if ((Clipperz.Crypto.ECC.StandardCurves._K283 == null) && (typeof(Clipperz.Crypto.ECC.Koblitz.Curve) != 'undefined')) {
67 Clipperz.Crypto.ECC.StandardCurves._K283 = new Clipperz.Crypto.ECC.Koblitz.Curve({ 64 Clipperz.Crypto.ECC.StandardCurves._K283 = new Clipperz.Crypto.ECC.Koblitz.Curve({
68 modulus: new Clipperz.Crypto.ECC.Koblitz.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 000010a1', 16), 65 modulus: new Clipperz.Crypto.ECC.Koblitz.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 000010a1', 16),
69 a: new Clipperz.Crypto.ECC.Koblitz.Value('0', 16), 66 a: new Clipperz.Crypto.ECC.Koblitz.Value('0', 16),
70 b: new Clipperz.Crypto.ECC.Koblitz.Value('1', 16), 67 b: new Clipperz.Crypto.ECC.Koblitz.Value('1', 16),
71 G: new Clipperz.Crypto.ECC.Koblitz.Point({ 68 G: new Clipperz.Crypto.ECC.Koblitz.Point({
72 x: new Clipperz.Crypto.ECC.Koblitz.Value('0503213f 78ca4488 3f1a3b81 62f188e5 53cd265f 23c1567a 16876913 b0c2ac24 58492836', 16), 69 x: new Clipperz.Crypto.ECC.Koblitz.Value('0503213f 78ca4488 3f1a3b81 62f188e5 53cd265f 23c1567a 16876913 b0c2ac24 58492836', 16),
73 y: new Clipperz.Crypto.ECC.Koblitz.Value('01ccda38 0f1c9e31 8d90f95d 07e5426f e87e45c0 e8184698 e4596236 4e341161 77dd2259', 16) 70 y: new Clipperz.Crypto.ECC.Koblitz.Value('01ccda38 0f1c9e31 8d90f95d 07e5426f e87e45c0 e8184698 e4596236 4e341161 77dd2259', 16)
74 }), 71 }),
75 r: new Clipperz.Crypto.ECC.Koblitz.Value('01ffffff ffffffff ffffffff ffffffff ffffe9ae 2ed07577 265dff7f 94451e06 1e163c61', 16), 72 r: new Clipperz.Crypto.ECC.Koblitz.Value('01ffffff ffffffff ffffffff ffffffff ffffe9ae 2ed07577 265dff7f 94451e06 1e163c61', 16),
76 h: new Clipperz.Crypto.ECC.Koblitz.Value('4', 16), 73 h: new Clipperz.Crypto.ECC.Koblitz.Value('4', 16),
77 primeFactor: new Clipperz.Crypto.ECC.Koblitz.Value('01ffffff ffffffff ffffffff ffffffff ffffe9ae 2ed07577 265dff7f 94451e06 1e163c61', 16) 74 primeFactor: new Clipperz.Crypto.ECC.Koblitz.Value('01ffffff ffffffff ffffffff ffffffff ffffe9ae 2ed07577 265dff7f 94451e06 1e163c61', 16)
78 }); 75 });
79 } 76 }
80 77
81 return Clipperz.Crypto.ECC.StandardCurves._K283; 78 return Clipperz.Crypto.ECC.StandardCurves._K283;
82 }, 79 },
83 80
84 //============================================================================== 81 //==============================================================================
85 82
86 '_B571': null, 83 '_B571': null,
87 'B571': function() { //f(z) = z^571 + z^10 + z^5 + z^2 + 1 84 'B571': function() { //f(z) = z^571 + z^10 + z^5 + z^2 + 1
88 if ((Clipperz.Crypto.ECC.StandardCurves._B571 == null) && (typeof(Clipperz.Crypto.ECC.BinaryField.Curve) != 'undefined')) { 85 if ((Clipperz.Crypto.ECC.StandardCurves._B571 == null) && (typeof(Clipperz.Crypto.ECC.BinaryField.Curve) != 'undefined')) {
89 Clipperz.Crypto.ECC.StandardCurves._B571 = new Clipperz.Crypto.ECC.BinaryField.Curve({ 86 Clipperz.Crypto.ECC.StandardCurves._B571 = new Clipperz.Crypto.ECC.BinaryField.Curve({
90 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), 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),
91 a: new Clipperz.Crypto.ECC.BinaryField.Value('1', 16), 88 a: new Clipperz.Crypto.ECC.BinaryField.Value('1', 16),
92 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), 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),
93 G: new Clipperz.Crypto.ECC.BinaryField.Point({ 90 G: new Clipperz.Crypto.ECC.BinaryField.Point({
94 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), 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),
95 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) 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)
96 }), 93 }),
97 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), 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),
98 h: new Clipperz.Crypto.ECC.BinaryField.Value('2', 16) 95 h: new Clipperz.Crypto.ECC.BinaryField.Value('2', 16)
99 96
100 // S: new Clipperz.Crypto.ECC.BinaryField.Value('2aa058f73a0e33ab486b0f610410c53a7f132310', 10), 97 // S: new Clipperz.Crypto.ECC.BinaryField.Value('2aa058f73a0e33ab486b0f610410c53a7f132310', 10),
101 // n: new Clipperz.Crypto.ECC.BinaryField.Value('03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe661ce18ff55987308059b186823851ec7dd9ca1161de93d5174d66e8382e9bb2fe84e47', 16) 98 // n: new Clipperz.Crypto.ECC.BinaryField.Value('03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe661ce18ff55987308059b186823851ec7dd9ca1161de93d5174d66e8382e9bb2fe84e47', 16)
102 }); 99 });
103 100
104 //----------------------------------------------------------------------------- 101 //-----------------------------------------------------------------------------
105 // 102 //
106 //Guide to Elliptic Curve Cryptography 103 //Guide to Elliptic Curve Cryptography
107 //Darrel Hankerson, Alfred Menezes, Scott Vanstone 104 //Darrel Hankerson, Alfred Menezes, Scott Vanstone
108 //- Pag: 56, Alorithm 2.45 (with a typo!!!) 105 //- Pag: 56, Alorithm 2.45 (with a typo!!!)
109 // 106 //
110 //----------------------------------------------------------------------------- 107 //-----------------------------------------------------------------------------
111 // 108 //
112 // http://www.milw0rm.com/papers/136 109 // http://www.milw0rm.com/papers/136
113 // 110 //
114 // ------------------------------------------------------------------------- 111 // -------------------------------------------------------------------------
115 // Polynomial Reduction Algorithm Modulo f571 112 // Polynomial Reduction Algorithm Modulo f571
116 // ------------------------------------------------------------------------- 113 // -------------------------------------------------------------------------
117 // 114 //
118 // Input: Polynomial p(x) of degree 1140 or less, stored as 115 // Input: Polynomial p(x) of degree 1140 or less, stored as
119 // an array of 2T machinewords. 116 // an array of 2T machinewords.
120 // Output: p(x) mod f571(x) 117 // Output: p(x) mod f571(x)
121 // 118 //
122 // FOR i = T-1, ..., 0 DO 119 // FOR i = T-1, ..., 0 DO
123 // SET X := P[i+T] 120 // SET X := P[i+T]
124 // P[i] := P[i] ^ (X<<5) ^ (X<<7) ^ (X<<10) ^ (X<<15) 121 // P[i] := P[i] ^ (X<<5) ^ (X<<7) ^ (X<<10) ^ (X<<15)
125 // P[i+1] := P[i+1] ^ (X>>17) ^ (X>>22) ^ (X>>25) ^ (X>>27) 122 // P[i+1] := P[i+1] ^ (X>>17) ^ (X>>22) ^ (X>>25) ^ (X>>27)
126 // 123 //
127 // SET X := P[T-1] >> 27 124 // SET X := P[T-1] >> 27
128 // P[0] := P[0] ^ X ^ (X<<2) ^ (X<<5) ^ (X<<10) 125 // P[0] := P[0] ^ X ^ (X<<2) ^ (X<<5) ^ (X<<10)
129 // P[T-1] := P[T-1] & 0x07ffffff 126 // P[T-1] := P[T-1] & 0x07ffffff
130 // 127 //
131 // RETURN P[T-1],...,P[0] 128 // RETURN P[T-1],...,P[0]
132 // 129 //
133 // ------------------------------------------------------------------------- 130 // -------------------------------------------------------------------------
134 // 131 //
135 Clipperz.Crypto.ECC.StandardCurves._B571.finiteField().slowModule = Clipperz.Crypto.ECC.StandardCurves._B571.finiteField().module; 132 Clipperz.Crypto.ECC.StandardCurves._B571.finiteField().slowModule = Clipperz.Crypto.ECC.StandardCurves._B571.finiteField().module;
136 Clipperz.Crypto.ECC.StandardCurves._B571.finiteField().module = function(aValue) { 133 Clipperz.Crypto.ECC.StandardCurves._B571.finiteField().module = function(aValue) {
137 varresult; 134 varresult;
138 135
139 if (aValue.bitSize() > 1140) { 136 if (aValue.bitSize() > 1140) {
140 MochiKit.Logging.logWarning("ECC.StandarCurves.B571.finiteField().module: falling back to default implementation"); 137 MochiKit.Logging.logWarning("ECC.StandarCurves.B571.finiteField().module: falling back to default implementation");
141 result = Clipperz.Crypto.ECC.StandardCurves._B571.finiteField().slowModule(aValue); 138 result = Clipperz.Crypto.ECC.StandardCurves._B571.finiteField().slowModule(aValue);
142 } else { 139 } else {
143 varC, T; 140 varC, T;
144 var i; 141 var i;
145 142
146//console.log(">>> binaryField.finiteField.(improved)module"); 143//console.log(">>> binaryField.finiteField.(improved)module");
147 // C = aValue.value().slice(0); 144 // C = aValue.value().slice(0);
148 C = aValue._value.slice(0); 145 C = aValue._value.slice(0);
149 for (i=35; i>=18; i--) { 146 for (i=35; i>=18; i--) {
150 T = C[i]; 147 T = C[i];
151 C[i-18] = (((C[i-18] ^ (T<<5) ^ (T<<7) ^ (T<<10) ^ (T<<15)) & 0xffffffff) >>> 0); 148 C[i-18] = (((C[i-18] ^ (T<<5) ^ (T<<7) ^ (T<<10) ^ (T<<15)) & 0xffffffff) >>> 0);
152 C[i-17] = ((C[i-17] ^ (T>>>27) ^ (T>>>25) ^ (T>>>22) ^ (T>>>17)) >>> 0); 149 C[i-17] = ((C[i-17] ^ (T>>>27) ^ (T>>>25) ^ (T>>>22) ^ (T>>>17)) >>> 0);
153 } 150 }
154 T = (C[17] >>> 27); 151 T = (C[17] >>> 27);
155 C[0] = ((C[0] ^ T ^ ((T<<2) ^ (T<<5) ^ (T<<10)) & 0xffffffff) >>> 0); 152 C[0] = ((C[0] ^ T ^ ((T<<2) ^ (T<<5) ^ (T<<10)) & 0xffffffff) >>> 0);
156 C[17] = (C[17] & 0x07ffffff); 153 C[17] = (C[17] & 0x07ffffff);
157 154
158 for(i=18; i<=35; i++) { 155 for(i=18; i<=35; i++) {
159 C[i] = 0; 156 C[i] = 0;
160 } 157 }
161 158
162 result = new Clipperz.Crypto.ECC.BinaryField.Value(C); 159 result = new Clipperz.Crypto.ECC.BinaryField.Value(C);
163//console.log("<<< binaryField.finiteField.(improved)module"); 160//console.log("<<< binaryField.finiteField.(improved)module");
164 } 161 }
165 162
166 return result; 163 return result;
167 }; 164 };
168 } 165 }
169 166
170 return Clipperz.Crypto.ECC.StandardCurves._B571; 167 return Clipperz.Crypto.ECC.StandardCurves._B571;
171 }, 168 },
172 169
173 //----------------------------------------------------------------------------- 170 //-----------------------------------------------------------------------------
174 171
175 '_B283': null, 172 '_B283': null,
176 'B283': function() { //f(z) = z^283 + z^12 + z^7 + z^5 + 1 173 'B283': function() { //f(z) = z^283 + z^12 + z^7 + z^5 + 1
177 if ((Clipperz.Crypto.ECC.StandardCurves._B283 == null) && (typeof(Clipperz.Crypto.ECC.BinaryField.Curve) != 'undefined')) { 174 if ((Clipperz.Crypto.ECC.StandardCurves._B283 == null) && (typeof(Clipperz.Crypto.ECC.BinaryField.Curve) != 'undefined')) {
178 Clipperz.Crypto.ECC.StandardCurves._B283 = new Clipperz.Crypto.ECC.BinaryField.Curve({ 175 Clipperz.Crypto.ECC.StandardCurves._B283 = new Clipperz.Crypto.ECC.BinaryField.Curve({
179 modulus: new Clipperz.Crypto.ECC.BinaryField.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 000010a1', 16), 176 modulus: new Clipperz.Crypto.ECC.BinaryField.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 000010a1', 16),
180 a: new Clipperz.Crypto.ECC.BinaryField.Value('1', 16), 177 a: new Clipperz.Crypto.ECC.BinaryField.Value('1', 16),
181 b: new Clipperz.Crypto.ECC.BinaryField.Value('027b680a c8b8596d a5a4af8a 19a0303f ca97fd76 45309fa2 a581485a f6263e31 3b79a2f5', 16), 178 b: new Clipperz.Crypto.ECC.BinaryField.Value('027b680a c8b8596d a5a4af8a 19a0303f ca97fd76 45309fa2 a581485a f6263e31 3b79a2f5', 16),
182 G: new Clipperz.Crypto.ECC.BinaryField.Point({ 179 G: new Clipperz.Crypto.ECC.BinaryField.Point({
183 x: new Clipperz.Crypto.ECC.BinaryField.Value('05f93925 8db7dd90 e1934f8c 70b0dfec 2eed25b8 557eac9c 80e2e198 f8cdbecd 86b12053', 16), 180 x: new Clipperz.Crypto.ECC.BinaryField.Value('05f93925 8db7dd90 e1934f8c 70b0dfec 2eed25b8 557eac9c 80e2e198 f8cdbecd 86b12053', 16),
184 y: new Clipperz.Crypto.ECC.BinaryField.Value('03676854 fe24141c b98fe6d4 b20d02b4 516ff702 350eddb0 826779c8 13f0df45 be8112f4', 16) 181 y: new Clipperz.Crypto.ECC.BinaryField.Value('03676854 fe24141c b98fe6d4 b20d02b4 516ff702 350eddb0 826779c8 13f0df45 be8112f4', 16)
185 }), 182 }),
186 r: new Clipperz.Crypto.ECC.BinaryField.Value('03ffffff ffffffff ffffffff ffffffff ffffef90 399660fc 938a9016 5b042a7c efadb307', 16), 183 r: new Clipperz.Crypto.ECC.BinaryField.Value('03ffffff ffffffff ffffffff ffffffff ffffef90 399660fc 938a9016 5b042a7c efadb307', 16),
187 h: new Clipperz.Crypto.ECC.BinaryField.Value('2', 16) 184 h: new Clipperz.Crypto.ECC.BinaryField.Value('2', 16)
188 }); 185 });
189 186
190 //----------------------------------------------------------------------------- 187 //-----------------------------------------------------------------------------
191 // 188 //
192 //Guide to Elliptic Curve Cryptography 189 //Guide to Elliptic Curve Cryptography
193 //Darrel Hankerson, Alfred Menezes, Scott Vanstone 190 //Darrel Hankerson, Alfred Menezes, Scott Vanstone
194 //- Pag: 56, Alorithm 2.43 191 //- Pag: 56, Alorithm 2.43
195 // 192 //
196 //----------------------------------------------------------------------------- 193 //-----------------------------------------------------------------------------
197 Clipperz.Crypto.ECC.StandardCurves._B283.finiteField().slowModule = Clipperz.Crypto.ECC.StandardCurves._B283.finiteField().module; 194 Clipperz.Crypto.ECC.StandardCurves._B283.finiteField().slowModule = Clipperz.Crypto.ECC.StandardCurves._B283.finiteField().module;
198 Clipperz.Crypto.ECC.StandardCurves._B283.finiteField().module = function(aValue) { 195 Clipperz.Crypto.ECC.StandardCurves._B283.finiteField().module = function(aValue) {
199 varresult; 196 varresult;
200 197
201 if (aValue.bitSize() > 564) { 198 if (aValue.bitSize() > 564) {
202 MochiKit.Logging.logWarning("ECC.StandarCurves.B283.finiteField().module: falling back to default implementation"); 199 MochiKit.Logging.logWarning("ECC.StandarCurves.B283.finiteField().module: falling back to default implementation");
203 result = Clipperz.Crypto.ECC.StandardCurves._B283.finiteField().slowModule(aValue); 200 result = Clipperz.Crypto.ECC.StandardCurves._B283.finiteField().slowModule(aValue);
204 } else { 201 } else {
205 varC, T; 202 varC, T;
206 var i; 203 var i;
207 204
208//console.log(">>> binaryField.finiteField.(improved)module"); 205//console.log(">>> binaryField.finiteField.(improved)module");
209 C = aValue._value.slice(0); 206 C = aValue._value.slice(0);
210 for (i=17; i>=9; i--) { 207 for (i=17; i>=9; i--) {
211 T = C[i]; 208 T = C[i];
212 C[i-9] = (((C[i-9] ^ (T<<5) ^ (T<<10) ^ (T<<12) ^ (T<<17)) & 0xffffffff) >>> 0); 209 C[i-9] = (((C[i-9] ^ (T<<5) ^ (T<<10) ^ (T<<12) ^ (T<<17)) & 0xffffffff) >>> 0);
213 C[i-8] = ((C[i-8] ^ (T>>>27) ^ (T>>>22) ^ (T>>>20) ^ (T>>>15)) >>> 0); 210 C[i-8] = ((C[i-8] ^ (T>>>27) ^ (T>>>22) ^ (T>>>20) ^ (T>>>15)) >>> 0);
214 } 211 }
215 T = (C[8] >>> 27); 212 T = (C[8] >>> 27);
216 C[0] = ((C[0] ^ T ^ ((T<<5) ^ (T<<7) ^ (T<<12)) & 0xffffffff) >>> 0); 213 C[0] = ((C[0] ^ T ^ ((T<<5) ^ (T<<7) ^ (T<<12)) & 0xffffffff) >>> 0);
217 C[8] = (C[8] & 0x07ffffff); 214 C[8] = (C[8] & 0x07ffffff);
218 215
219 for(i=9; i<=17; i++) { 216 for(i=9; i<=17; i++) {
220 C[i] = 0; 217 C[i] = 0;
221 } 218 }
222 219
223 result = new Clipperz.Crypto.ECC.BinaryField.Value(C); 220 result = new Clipperz.Crypto.ECC.BinaryField.Value(C);
224//console.log("<<< binaryField.finiteField.(improved)module"); 221//console.log("<<< binaryField.finiteField.(improved)module");
225 } 222 }
226 223
227 return result; 224 return result;
228 }; 225 };
229 } 226 }
230 227
231 return Clipperz.Crypto.ECC.StandardCurves._B283; 228 return Clipperz.Crypto.ECC.StandardCurves._B283;
232 }, 229 },
233 230
234 //============================================================================== 231 //==============================================================================
235 __syntaxFix__: "syntax fix" 232 __syntaxFix__: "syntax fix"
236}); 233});
237 234
238 235
239 236
diff --git a/frontend/gamma/js/Clipperz/Crypto/PRNG.js b/frontend/gamma/js/Clipperz/Crypto/PRNG.js
index 266b909..adfdb16 100644
--- a/frontend/gamma/js/Clipperz/Crypto/PRNG.js
+++ b/frontend/gamma/js/Clipperz/Crypto/PRNG.js
@@ -1,408 +1,405 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) { 26try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) {
30 throw "Clipperz.Crypto.PRNG depends on Clipperz.ByteArray!"; 27 throw "Clipperz.Crypto.PRNG depends on Clipperz.ByteArray!";
31} 28}
32 29
33try { if (typeof(Clipperz.Crypto.SHA) == 'undefined') { throw ""; }} catch (e) { 30try { if (typeof(Clipperz.Crypto.SHA) == 'undefined') { throw ""; }} catch (e) {
34 throw "Clipperz.Crypto.PRNG depends on Clipperz.Crypto.SHA!"; 31 throw "Clipperz.Crypto.PRNG depends on Clipperz.Crypto.SHA!";
35} 32}
36 33
37try { if (typeof(Clipperz.Crypto.AES) == 'undefined') { throw ""; }} catch (e) { 34try { if (typeof(Clipperz.Crypto.AES) == 'undefined') { throw ""; }} catch (e) {
38 throw "Clipperz.Crypto.PRNG depends on Clipperz.Crypto.AES!"; 35 throw "Clipperz.Crypto.PRNG depends on Clipperz.Crypto.AES!";
39} 36}
40 37
41if (typeof(Clipperz.Crypto.PRNG) == 'undefined') { Clipperz.Crypto.PRNG = {}; } 38if (typeof(Clipperz.Crypto.PRNG) == 'undefined') { Clipperz.Crypto.PRNG = {}; }
42 39
43//############################################################################# 40//#############################################################################
44 41
45Clipperz.Crypto.PRNG.EntropyAccumulator = function(args) { 42Clipperz.Crypto.PRNG.EntropyAccumulator = function(args) {
46 args = args || {}; 43 args = args || {};
47 //MochiKit.Base.bindMethods(this); 44 //MochiKit.Base.bindMethods(this);
48 45
49 this._stack = new Clipperz.ByteArray(); 46 this._stack = new Clipperz.ByteArray();
50 this._maxStackLengthBeforeHashing = args.maxStackLengthBeforeHashing || 256; 47 this._maxStackLengthBeforeHashing = args.maxStackLengthBeforeHashing || 256;
51 return this; 48 return this;
52} 49}
53 50
54Clipperz.Crypto.PRNG.EntropyAccumulator.prototype = MochiKit.Base.update(null, { 51Clipperz.Crypto.PRNG.EntropyAccumulator.prototype = MochiKit.Base.update(null, {
55 52
56 'toString': function() { 53 'toString': function() {
57 return "Clipperz.Crypto.PRNG.EntropyAccumulator"; 54 return "Clipperz.Crypto.PRNG.EntropyAccumulator";
58 }, 55 },
59 56
60 //------------------------------------------------------------------------- 57 //-------------------------------------------------------------------------
61 58
62 'stack': function() { 59 'stack': function() {
63 return this._stack; 60 return this._stack;
64 }, 61 },
65 62
66 'setStack': function(aValue) { 63 'setStack': function(aValue) {
67 this._stack = aValue; 64 this._stack = aValue;
68 }, 65 },
69 66
70 'resetStack': function() { 67 'resetStack': function() {
71 this.stack().reset(); 68 this.stack().reset();
72 }, 69 },
73 70
74 'maxStackLengthBeforeHashing': function() { 71 'maxStackLengthBeforeHashing': function() {
75 return this._maxStackLengthBeforeHashing; 72 return this._maxStackLengthBeforeHashing;
76 }, 73 },
77 74
78 //------------------------------------------------------------------------- 75 //-------------------------------------------------------------------------
79 76
80 'addRandomByte': function(aValue) { 77 'addRandomByte': function(aValue) {
81 this.stack().appendByte(aValue); 78 this.stack().appendByte(aValue);
82 79
83 if (this.stack().length() > this.maxStackLengthBeforeHashing()) { 80 if (this.stack().length() > this.maxStackLengthBeforeHashing()) {
84 this.setStack(Clipperz.Crypto.SHA.sha_d256(this.stack())); 81 this.setStack(Clipperz.Crypto.SHA.sha_d256(this.stack()));
85 } 82 }
86 }, 83 },
87 84
88 //------------------------------------------------------------------------- 85 //-------------------------------------------------------------------------
89 __syntaxFix__: "syntax fix" 86 __syntaxFix__: "syntax fix"
90}); 87});
91 88
92//############################################################################# 89//#############################################################################
93 90
94Clipperz.Crypto.PRNG.RandomnessSource = function(args) { 91Clipperz.Crypto.PRNG.RandomnessSource = function(args) {
95 args = args || {}; 92 args = args || {};
96 MochiKit.Base.bindMethods(this); 93 MochiKit.Base.bindMethods(this);
97 94
98 this._generator = args.generator || null; 95 this._generator = args.generator || null;
99 this._sourceId = args.sourceId || null; 96 this._sourceId = args.sourceId || null;
100 this._boostMode = args.boostMode || false; 97 this._boostMode = args.boostMode || false;
101 98
102 this._nextPoolIndex = 0; 99 this._nextPoolIndex = 0;
103 100
104 return this; 101 return this;
105} 102}
106 103
107Clipperz.Crypto.PRNG.RandomnessSource.prototype = MochiKit.Base.update(null, { 104Clipperz.Crypto.PRNG.RandomnessSource.prototype = MochiKit.Base.update(null, {
108 105
109 'generator': function() { 106 'generator': function() {
110 return this._generator; 107 return this._generator;
111 }, 108 },
112 109
113 'setGenerator': function(aValue) { 110 'setGenerator': function(aValue) {
114 this._generator = aValue; 111 this._generator = aValue;
115 }, 112 },
116 113
117 //------------------------------------------------------------------------- 114 //-------------------------------------------------------------------------
118 115
119 'boostMode': function() { 116 'boostMode': function() {
120 return this._boostMode; 117 return this._boostMode;
121 }, 118 },
122 119
123 'setBoostMode': function(aValue) { 120 'setBoostMode': function(aValue) {
124 this._boostMode = aValue; 121 this._boostMode = aValue;
125 }, 122 },
126 123
127 //------------------------------------------------------------------------- 124 //-------------------------------------------------------------------------
128 125
129 'sourceId': function() { 126 'sourceId': function() {
130 return this._sourceId; 127 return this._sourceId;
131 }, 128 },
132 129
133 'setSourceId': function(aValue) { 130 'setSourceId': function(aValue) {
134 this._sourceId = aValue; 131 this._sourceId = aValue;
135 }, 132 },
136 133
137 //------------------------------------------------------------------------- 134 //-------------------------------------------------------------------------
138 135
139 'nextPoolIndex': function() { 136 'nextPoolIndex': function() {
140 return this._nextPoolIndex; 137 return this._nextPoolIndex;
141 }, 138 },
142 139
143 'incrementNextPoolIndex': function() { 140 'incrementNextPoolIndex': function() {
144 this._nextPoolIndex = ((this._nextPoolIndex + 1) % this.generator().numberOfEntropyAccumulators()); 141 this._nextPoolIndex = ((this._nextPoolIndex + 1) % this.generator().numberOfEntropyAccumulators());
145 }, 142 },
146 143
147 //------------------------------------------------------------------------- 144 //-------------------------------------------------------------------------
148 145
149 'updateGeneratorWithValue': function(aRandomValue) { 146 'updateGeneratorWithValue': function(aRandomValue) {
150 if (this.generator() != null) { 147 if (this.generator() != null) {
151 this.generator().addRandomByte(this.sourceId(), this.nextPoolIndex(), aRandomValue); 148 this.generator().addRandomByte(this.sourceId(), this.nextPoolIndex(), aRandomValue);
152 this.incrementNextPoolIndex(); 149 this.incrementNextPoolIndex();
153 } 150 }
154 }, 151 },
155 152
156 //------------------------------------------------------------------------- 153 //-------------------------------------------------------------------------
157 __syntaxFix__: "syntax fix" 154 __syntaxFix__: "syntax fix"
158}); 155});
159 156
160//############################################################################# 157//#############################################################################
161 158
162Clipperz.Crypto.PRNG.TimeRandomnessSource = function(args) { 159Clipperz.Crypto.PRNG.TimeRandomnessSource = function(args) {
163 args = args || {}; 160 args = args || {};
164 //MochiKit.Base.bindMethods(this); 161 //MochiKit.Base.bindMethods(this);
165 162
166 this._intervalTime = args.intervalTime || 1000; 163 this._intervalTime = args.intervalTime || 1000;
167 164
168 Clipperz.Crypto.PRNG.RandomnessSource.call(this, args); 165 Clipperz.Crypto.PRNG.RandomnessSource.call(this, args);
169 166
170 this.collectEntropy(); 167 this.collectEntropy();
171 return this; 168 return this;
172} 169}
173 170
174Clipperz.Crypto.PRNG.TimeRandomnessSource.prototype = MochiKit.Base.update(new Clipperz.Crypto.PRNG.RandomnessSource, { 171Clipperz.Crypto.PRNG.TimeRandomnessSource.prototype = MochiKit.Base.update(new Clipperz.Crypto.PRNG.RandomnessSource, {
175 172
176 'intervalTime': function() { 173 'intervalTime': function() {
177 return this._intervalTime; 174 return this._intervalTime;
178 }, 175 },
179 176
180 //------------------------------------------------------------------------- 177 //-------------------------------------------------------------------------
181 178
182 'collectEntropy': function() { 179 'collectEntropy': function() {
183 varnow; 180 varnow;
184 varentropyByte; 181 varentropyByte;
185 var intervalTime; 182 var intervalTime;
186 now = new Date(); 183 now = new Date();
187 entropyByte = (now.getTime() & 0xff); 184 entropyByte = (now.getTime() & 0xff);
188 185
189 intervalTime = this.intervalTime(); 186 intervalTime = this.intervalTime();
190 if (this.boostMode() == true) { 187 if (this.boostMode() == true) {
191 intervalTime = intervalTime / 9; 188 intervalTime = intervalTime / 9;
192 } 189 }
193 190
194 this.updateGeneratorWithValue(entropyByte); 191 this.updateGeneratorWithValue(entropyByte);
195 setTimeout(this.collectEntropy, intervalTime); 192 setTimeout(this.collectEntropy, intervalTime);
196 }, 193 },
197 194
198 //------------------------------------------------------------------------- 195 //-------------------------------------------------------------------------
199 196
200 'numberOfRandomBits': function() { 197 'numberOfRandomBits': function() {
201 return 5; 198 return 5;
202 }, 199 },
203 200
204 //------------------------------------------------------------------------- 201 //-------------------------------------------------------------------------
205 202
206 'pollingFrequency': function() { 203 'pollingFrequency': function() {
207 return 10; 204 return 10;
208 }, 205 },
209 206
210 //------------------------------------------------------------------------- 207 //-------------------------------------------------------------------------
211 __syntaxFix__: "syntax fix" 208 __syntaxFix__: "syntax fix"
212}); 209});
213 210
214//***************************************************************************** 211//*****************************************************************************
215 212
216Clipperz.Crypto.PRNG.MouseRandomnessSource = function(args) { 213Clipperz.Crypto.PRNG.MouseRandomnessSource = function(args) {
217 args = args || {}; 214 args = args || {};
218 215
219 Clipperz.Crypto.PRNG.RandomnessSource.call(this, args); 216 Clipperz.Crypto.PRNG.RandomnessSource.call(this, args);
220 217
221 this._numberOfBitsToCollectAtEachEvent = 4; 218 this._numberOfBitsToCollectAtEachEvent = 4;
222 this._randomBitsCollector = 0; 219 this._randomBitsCollector = 0;
223 this._numberOfRandomBitsCollected = 0; 220 this._numberOfRandomBitsCollected = 0;
224 221
225 MochiKit.Signal.connect(document, 'onmousemove', this, 'collectEntropy'); 222 MochiKit.Signal.connect(document, 'onmousemove', this, 'collectEntropy');
226 223
227 return this; 224 return this;
228} 225}
229 226
230Clipperz.Crypto.PRNG.MouseRandomnessSource.prototype = MochiKit.Base.update(new Clipperz.Crypto.PRNG.RandomnessSource, { 227Clipperz.Crypto.PRNG.MouseRandomnessSource.prototype = MochiKit.Base.update(new Clipperz.Crypto.PRNG.RandomnessSource, {
231 228
232 //------------------------------------------------------------------------- 229 //-------------------------------------------------------------------------
233 230
234 'numberOfBitsToCollectAtEachEvent': function() { 231 'numberOfBitsToCollectAtEachEvent': function() {
235 return this._numberOfBitsToCollectAtEachEvent; 232 return this._numberOfBitsToCollectAtEachEvent;
236 }, 233 },
237 234
238 //------------------------------------------------------------------------- 235 //-------------------------------------------------------------------------
239 236
240 'randomBitsCollector': function() { 237 'randomBitsCollector': function() {
241 return this._randomBitsCollector; 238 return this._randomBitsCollector;
242 }, 239 },
243 240
244 'setRandomBitsCollector': function(aValue) { 241 'setRandomBitsCollector': function(aValue) {
245 this._randomBitsCollector = aValue; 242 this._randomBitsCollector = aValue;
246 }, 243 },
247 244
248 'appendRandomBitsToRandomBitsCollector': function(aValue) { 245 'appendRandomBitsToRandomBitsCollector': function(aValue) {
249 var collectedBits; 246 var collectedBits;
250 var numberOfRandomBitsCollected; 247 var numberOfRandomBitsCollected;
251 248
252 numberOfRandomBitsCollected = this.numberOfRandomBitsCollected(); 249 numberOfRandomBitsCollected = this.numberOfRandomBitsCollected();
253 collectetBits = this.randomBitsCollector() | (aValue << numberOfRandomBitsCollected); 250 collectetBits = this.randomBitsCollector() | (aValue << numberOfRandomBitsCollected);
254 this.setRandomBitsCollector(collectetBits); 251 this.setRandomBitsCollector(collectetBits);
255 numberOfRandomBitsCollected += this.numberOfBitsToCollectAtEachEvent(); 252 numberOfRandomBitsCollected += this.numberOfBitsToCollectAtEachEvent();
256 253
257 if (numberOfRandomBitsCollected == 8) { 254 if (numberOfRandomBitsCollected == 8) {
258 this.updateGeneratorWithValue(collectetBits); 255 this.updateGeneratorWithValue(collectetBits);
259 numberOfRandomBitsCollected = 0; 256 numberOfRandomBitsCollected = 0;
260 this.setRandomBitsCollector(0); 257 this.setRandomBitsCollector(0);
261 } 258 }
262 259
263 this.setNumberOfRandomBitsCollected(numberOfRandomBitsCollected) 260 this.setNumberOfRandomBitsCollected(numberOfRandomBitsCollected)
264 }, 261 },
265 262
266 //------------------------------------------------------------------------- 263 //-------------------------------------------------------------------------
267 264
268 'numberOfRandomBitsCollected': function() { 265 'numberOfRandomBitsCollected': function() {
269 return this._numberOfRandomBitsCollected; 266 return this._numberOfRandomBitsCollected;
270 }, 267 },
271 268
272 'setNumberOfRandomBitsCollected': function(aValue) { 269 'setNumberOfRandomBitsCollected': function(aValue) {
273 this._numberOfRandomBitsCollected = aValue; 270 this._numberOfRandomBitsCollected = aValue;
274 }, 271 },
275 272
276 //------------------------------------------------------------------------- 273 //-------------------------------------------------------------------------
277 274
278 'collectEntropy': function(anEvent) { 275 'collectEntropy': function(anEvent) {
279 var mouseLocation; 276 var mouseLocation;
280 var randomBit; 277 var randomBit;
281 var mask; 278 var mask;
282 279
283 mask = 0xffffffff >>> (32 - this.numberOfBitsToCollectAtEachEvent()); 280 mask = 0xffffffff >>> (32 - this.numberOfBitsToCollectAtEachEvent());
284 281
285 mouseLocation = anEvent.mouse().client; 282 mouseLocation = anEvent.mouse().client;
286 randomBit = ((mouseLocation.x ^ mouseLocation.y) & mask); 283 randomBit = ((mouseLocation.x ^ mouseLocation.y) & mask);
287 this.appendRandomBitsToRandomBitsCollector(randomBit) 284 this.appendRandomBitsToRandomBitsCollector(randomBit)
288 }, 285 },
289 286
290 //------------------------------------------------------------------------- 287 //-------------------------------------------------------------------------
291 288
292 'numberOfRandomBits': function() { 289 'numberOfRandomBits': function() {
293 return 1; 290 return 1;
294 }, 291 },
295 292
296 //------------------------------------------------------------------------- 293 //-------------------------------------------------------------------------
297 294
298 'pollingFrequency': function() { 295 'pollingFrequency': function() {
299 return 10; 296 return 10;
300 }, 297 },
301 298
302 //------------------------------------------------------------------------- 299 //-------------------------------------------------------------------------
303 __syntaxFix__: "syntax fix" 300 __syntaxFix__: "syntax fix"
304}); 301});
305 302
306//***************************************************************************** 303//*****************************************************************************
307 304
308Clipperz.Crypto.PRNG.KeyboardRandomnessSource = function(args) { 305Clipperz.Crypto.PRNG.KeyboardRandomnessSource = function(args) {
309 args = args || {}; 306 args = args || {};
310 Clipperz.Crypto.PRNG.RandomnessSource.call(this, args); 307 Clipperz.Crypto.PRNG.RandomnessSource.call(this, args);
311 308
312 this._randomBitsCollector = 0; 309 this._randomBitsCollector = 0;
313 this._numberOfRandomBitsCollected = 0; 310 this._numberOfRandomBitsCollected = 0;
314 311
315 MochiKit.Signal.connect(document, 'onkeypress', this, 'collectEntropy'); 312 MochiKit.Signal.connect(document, 'onkeypress', this, 'collectEntropy');
316 313
317 return this; 314 return this;
318} 315}
319 316
320Clipperz.Crypto.PRNG.KeyboardRandomnessSource.prototype = MochiKit.Base.update(new Clipperz.Crypto.PRNG.RandomnessSource, { 317Clipperz.Crypto.PRNG.KeyboardRandomnessSource.prototype = MochiKit.Base.update(new Clipperz.Crypto.PRNG.RandomnessSource, {
321 318
322 //------------------------------------------------------------------------- 319 //-------------------------------------------------------------------------
323 320
324 'randomBitsCollector': function() { 321 'randomBitsCollector': function() {
325 return this._randomBitsCollector; 322 return this._randomBitsCollector;
326 }, 323 },
327 324
328 'setRandomBitsCollector': function(aValue) { 325 'setRandomBitsCollector': function(aValue) {
329 this._randomBitsCollector = aValue; 326 this._randomBitsCollector = aValue;
330 }, 327 },
331 328
332 'appendRandomBitToRandomBitsCollector': function(aValue) { 329 'appendRandomBitToRandomBitsCollector': function(aValue) {
333 var collectedBits; 330 var collectedBits;
334 var numberOfRandomBitsCollected; 331 var numberOfRandomBitsCollected;
335 332
336 numberOfRandomBitsCollected = this.numberOfRandomBitsCollected(); 333 numberOfRandomBitsCollected = this.numberOfRandomBitsCollected();
337 collectetBits = this.randomBitsCollector() | (aValue << numberOfRandomBitsCollected); 334 collectetBits = this.randomBitsCollector() | (aValue << numberOfRandomBitsCollected);
338 this.setRandomBitsCollector(collectetBits); 335 this.setRandomBitsCollector(collectetBits);
339 numberOfRandomBitsCollected ++; 336 numberOfRandomBitsCollected ++;
340 337
341 if (numberOfRandomBitsCollected == 8) { 338 if (numberOfRandomBitsCollected == 8) {
342 this.updateGeneratorWithValue(collectetBits); 339 this.updateGeneratorWithValue(collectetBits);
343 numberOfRandomBitsCollected = 0; 340 numberOfRandomBitsCollected = 0;
344 this.setRandomBitsCollector(0); 341 this.setRandomBitsCollector(0);
345 } 342 }
346 343
347 this.setNumberOfRandomBitsCollected(numberOfRandomBitsCollected) 344 this.setNumberOfRandomBitsCollected(numberOfRandomBitsCollected)
348 }, 345 },
349 346
350 //------------------------------------------------------------------------- 347 //-------------------------------------------------------------------------
351 348
352 'numberOfRandomBitsCollected': function() { 349 'numberOfRandomBitsCollected': function() {
353 return this._numberOfRandomBitsCollected; 350 return this._numberOfRandomBitsCollected;
354 }, 351 },
355 352
356 'setNumberOfRandomBitsCollected': function(aValue) { 353 'setNumberOfRandomBitsCollected': function(aValue) {
357 this._numberOfRandomBitsCollected = aValue; 354 this._numberOfRandomBitsCollected = aValue;
358 }, 355 },
359 356
360 //------------------------------------------------------------------------- 357 //-------------------------------------------------------------------------
361 358
362 'collectEntropy': function(anEvent) { 359 'collectEntropy': function(anEvent) {
363/* 360/*
364 var mouseLocation; 361 var mouseLocation;
365 var randomBit; 362 var randomBit;
366 363
367 mouseLocation = anEvent.mouse().client; 364 mouseLocation = anEvent.mouse().client;
368 365
369 randomBit = ((mouseLocation.x ^ mouseLocation.y) & 0x1); 366 randomBit = ((mouseLocation.x ^ mouseLocation.y) & 0x1);
370 this.appendRandomBitToRandomBitsCollector(randomBit); 367 this.appendRandomBitToRandomBitsCollector(randomBit);
371*/ 368*/
372 }, 369 },
373 370
374 //------------------------------------------------------------------------- 371 //-------------------------------------------------------------------------
375 372
376 'numberOfRandomBits': function() { 373 'numberOfRandomBits': function() {
377 return 1; 374 return 1;
378 }, 375 },
379 376
380 //------------------------------------------------------------------------- 377 //-------------------------------------------------------------------------
381 378
382 'pollingFrequency': function() { 379 'pollingFrequency': function() {
383 return 10; 380 return 10;
384 }, 381 },
385 382
386 //------------------------------------------------------------------------- 383 //-------------------------------------------------------------------------
387 __syntaxFix__: "syntax fix" 384 __syntaxFix__: "syntax fix"
388}); 385});
389 386
390//############################################################################# 387//#############################################################################
391 388
392Clipperz.Crypto.PRNG.Fortuna = function(args) { 389Clipperz.Crypto.PRNG.Fortuna = function(args) {
393 vari,c; 390 vari,c;
394 391
395 args = args || {}; 392 args = args || {};
396 393
397 this._key = args.seed || null; 394 this._key = args.seed || null;
398 if (this._key == null) { 395 if (this._key == null) {
399 this._counter = 0; 396 this._counter = 0;
400 this._key = new Clipperz.ByteArray(); 397 this._key = new Clipperz.ByteArray();
401 } else { 398 } else {
402 this._counter = 1; 399 this._counter = 1;
403 } 400 }
404 401
405 this._aesKey = null; 402 this._aesKey = null;
406 403
407 this._firstPoolReseedLevel = args.firstPoolReseedLevel || 32 || 64; 404 this._firstPoolReseedLevel = args.firstPoolReseedLevel || 32 || 64;
408 this._numberOfEntropyAccumulators = args.numberOfEntropyAccumulators || 32; 405 this._numberOfEntropyAccumulators = args.numberOfEntropyAccumulators || 32;
diff --git a/frontend/gamma/js/Clipperz/Crypto/RSA.js b/frontend/gamma/js/Clipperz/Crypto/RSA.js
index 4dad8f7..6844dba 100644
--- a/frontend/gamma/js/Clipperz/Crypto/RSA.js
+++ b/frontend/gamma/js/Clipperz/Crypto/RSA.js
@@ -1,151 +1,148 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29try { if (typeof(Clipperz.Crypto.BigInt) == 'undefined') { throw ""; }} catch (e) { 26try { if (typeof(Clipperz.Crypto.BigInt) == 'undefined') { throw ""; }} catch (e) {
30 throw "Clipperz.Crypto.RSA depends on Clipperz.Crypto.BigInt!"; 27 throw "Clipperz.Crypto.RSA depends on Clipperz.Crypto.BigInt!";
31} 28}
32 29
33if (typeof(Clipperz.Crypto.RSA) == 'undefined') { Clipperz.Crypto.RSA = {}; } 30if (typeof(Clipperz.Crypto.RSA) == 'undefined') { Clipperz.Crypto.RSA = {}; }
34 31
35Clipperz.Crypto.RSA.VERSION = "0.1"; 32Clipperz.Crypto.RSA.VERSION = "0.1";
36Clipperz.Crypto.RSA.NAME = "Clipperz.RSA"; 33Clipperz.Crypto.RSA.NAME = "Clipperz.RSA";
37 34
38//############################################################################# 35//#############################################################################
39 36
40MochiKit.Base.update(Clipperz.Crypto.RSA, { 37MochiKit.Base.update(Clipperz.Crypto.RSA, {
41 38
42 //------------------------------------------------------------------------- 39 //-------------------------------------------------------------------------
43 40
44 'publicKeyWithValues': function (e, d, n) { 41 'publicKeyWithValues': function (e, d, n) {
45 varresult; 42 varresult;
46 43
47 result = {}; 44 result = {};
48 45
49 if (e.isBigInt) { 46 if (e.isBigInt) {
50 result.e = e; 47 result.e = e;
51 } else { 48 } else {
52 result.e = new Clipperz.Crypto.BigInt(e, 16); 49 result.e = new Clipperz.Crypto.BigInt(e, 16);
53 } 50 }
54 51
55 if (d.isBigInt) { 52 if (d.isBigInt) {
56 result.d = d; 53 result.d = d;
57 } else { 54 } else {
58 result.d = new Clipperz.Crypto.BigInt(d, 16); 55 result.d = new Clipperz.Crypto.BigInt(d, 16);
59 } 56 }
60 57
61 if (n.isBigInt) { 58 if (n.isBigInt) {
62 result.n = n; 59 result.n = n;
63 } else { 60 } else {
64 result.n = new Clipperz.Crypto.BigInt(n, 16); 61 result.n = new Clipperz.Crypto.BigInt(n, 16);
65 } 62 }
66 63
67 return result; 64 return result;
68 }, 65 },
69 66
70 'privateKeyWithValues': function(e, d, n) { 67 'privateKeyWithValues': function(e, d, n) {
71 return Clipperz.Crypto.RSA.publicKeyWithValues(e, d, n); 68 return Clipperz.Crypto.RSA.publicKeyWithValues(e, d, n);
72 }, 69 },
73 70
74 //----------------------------------------------------------------------------- 71 //-----------------------------------------------------------------------------
75 72
76 'encryptUsingPublicKey': function (aKey, aMessage) { 73 'encryptUsingPublicKey': function (aKey, aMessage) {
77 varmessageValue; 74 varmessageValue;
78 varresult; 75 varresult;
79 76
80 messageValue = new Clipperz.Crypto.BigInt(aMessage, 16); 77 messageValue = new Clipperz.Crypto.BigInt(aMessage, 16);
81 result = messageValue.powerModule(aKey.e, aKey.n); 78 result = messageValue.powerModule(aKey.e, aKey.n);
82 79
83 return result.asString(16); 80 return result.asString(16);
84 }, 81 },
85 82
86 //............................................................................. 83 //.............................................................................
87 84
88 'decryptUsingPublicKey': function (aKey, aMessage) { 85 'decryptUsingPublicKey': function (aKey, aMessage) {
89 return Clipperz.Crypto.RSA.encryptUsingPublicKey(aKey, aMessage); 86 return Clipperz.Crypto.RSA.encryptUsingPublicKey(aKey, aMessage);
90 }, 87 },
91 88
92 //----------------------------------------------------------------------------- 89 //-----------------------------------------------------------------------------
93 90
94 'encryptUsingPrivateKey': function (aKey, aMessage) { 91 'encryptUsingPrivateKey': function (aKey, aMessage) {
95 varmessageValue; 92 varmessageValue;
96 varresult; 93 varresult;
97 94
98 messageValue = new Clipperz.Crypto.BigInt(aMessage, 16); 95 messageValue = new Clipperz.Crypto.BigInt(aMessage, 16);
99 result = messageValue.powerModule(aKey.d, aKey.n); 96 result = messageValue.powerModule(aKey.d, aKey.n);
100 97
101 return result.asString(16); 98 return result.asString(16);
102 }, 99 },
103 100
104 //............................................................................. 101 //.............................................................................
105 102
106 'decryptUsingPrivateKey': function (aKey, aMessage) { 103 'decryptUsingPrivateKey': function (aKey, aMessage) {
107 return Clipperz.Crypto.RSA.encryptUsingPrivateKey(aKey, aMessage); 104 return Clipperz.Crypto.RSA.encryptUsingPrivateKey(aKey, aMessage);
108 }, 105 },
109 106
110 //----------------------------------------------------------------------------- 107 //-----------------------------------------------------------------------------
111 108
112 'generatePublicKey': function(aNumberOfBits) { 109 'generatePublicKey': function(aNumberOfBits) {
113 varresult; 110 varresult;
114 vare; 111 vare;
115 vard; 112 vard;
116 varn; 113 varn;
117 114
118 e = new Clipperz.Crypto.BigInt("10001", 16); 115 e = new Clipperz.Crypto.BigInt("10001", 16);
119 116
120 { 117 {
121 var p, q; 118 var p, q;
122 varphi; 119 varphi;
123 120
124 do { 121 do {
125 p = Clipperz.Crypto.BigInt.randomPrime(aNumberOfBits); 122 p = Clipperz.Crypto.BigInt.randomPrime(aNumberOfBits);
126 } while (p.module(e).equals(1)); 123 } while (p.module(e).equals(1));
127 124
128 do { 125 do {
129 q = Clipperz.Crypto.BigInt.randomPrime(aNumberOfBits); 126 q = Clipperz.Crypto.BigInt.randomPrime(aNumberOfBits);
130 } while ((q.equals(p)) || (q.module(e).equals(1))); 127 } while ((q.equals(p)) || (q.module(e).equals(1)));
131 128
132 n = p.multiply(q); 129 n = p.multiply(q);
133 phi = (p.subtract(1).multiply(q.subtract(1))); 130 phi = (p.subtract(1).multiply(q.subtract(1)));
134 d = e.powerModule(-1, phi); 131 d = e.powerModule(-1, phi);
135 } 132 }
136 133
137 result = Clipperz.Crypto.RSA.publicKeyWithValues(e, d, n); 134 result = Clipperz.Crypto.RSA.publicKeyWithValues(e, d, n);
138 135
139 return result; 136 return result;
140 }, 137 },
141 138
142 //------------------------------------------------------------------------- 139 //-------------------------------------------------------------------------
143 140
144 __syntaxFix__: "syntax fix" 141 __syntaxFix__: "syntax fix"
145 142
146 //------------------------------------------------------------------------- 143 //-------------------------------------------------------------------------
147 144
148}); 145});
149 146
150//############################################################################# 147//#############################################################################
151 148
diff --git a/frontend/gamma/js/Clipperz/Crypto/SHA.js b/frontend/gamma/js/Clipperz/Crypto/SHA.js
index 3cf8559..b07fa85 100644
--- a/frontend/gamma/js/Clipperz/Crypto/SHA.js
+++ b/frontend/gamma/js/Clipperz/Crypto/SHA.js
@@ -1,301 +1,298 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) { 26try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) {
30 throw "Clipperz.Crypto.PRNG depends on Clipperz.ByteArray!"; 27 throw "Clipperz.Crypto.PRNG depends on Clipperz.ByteArray!";
31} 28}
32 29
33if (typeof(Clipperz.Crypto) == 'undefined') { Clipperz.Crypto = {}; } 30if (typeof(Clipperz.Crypto) == 'undefined') { Clipperz.Crypto = {}; }
34if (typeof(Clipperz.Crypto.SHA) == 'undefined') { Clipperz.Crypto.SHA = {}; } 31if (typeof(Clipperz.Crypto.SHA) == 'undefined') { Clipperz.Crypto.SHA = {}; }
35 32
36Clipperz.Crypto.SHA.VERSION = "0.3"; 33Clipperz.Crypto.SHA.VERSION = "0.3";
37Clipperz.Crypto.SHA.NAME = "Clipperz.Crypto.SHA"; 34Clipperz.Crypto.SHA.NAME = "Clipperz.Crypto.SHA";
38 35
39MochiKit.Base.update(Clipperz.Crypto.SHA, { 36MochiKit.Base.update(Clipperz.Crypto.SHA, {
40 37
41 '__repr__': function () { 38 '__repr__': function () {
42 return "[" + this.NAME + " " + this.VERSION + "]"; 39 return "[" + this.NAME + " " + this.VERSION + "]";
43 }, 40 },
44 41
45 'toString': function () { 42 'toString': function () {
46 return this.__repr__(); 43 return this.__repr__();
47 }, 44 },
48 45
49 //----------------------------------------------------------------------------- 46 //-----------------------------------------------------------------------------
50 47
51 'rotateRight': function(aValue, aNumberOfBits) { 48 'rotateRight': function(aValue, aNumberOfBits) {
52//Clipperz.Profile.start("Clipperz.Crypto.SHA.rotateRight"); 49//Clipperz.Profile.start("Clipperz.Crypto.SHA.rotateRight");
53 var result; 50 var result;
54 51
55 result = (aValue >>> aNumberOfBits) | (aValue << (32 - aNumberOfBits)); 52 result = (aValue >>> aNumberOfBits) | (aValue << (32 - aNumberOfBits));
56 53
57//Clipperz.Profile.stop("Clipperz.Crypto.SHA.rotateRight"); 54//Clipperz.Profile.stop("Clipperz.Crypto.SHA.rotateRight");
58 return result; 55 return result;
59 }, 56 },
60 57
61 'shiftRight': function(aValue, aNumberOfBits) { 58 'shiftRight': function(aValue, aNumberOfBits) {
62//Clipperz.Profile.start("Clipperz.Crypto.SHA.shiftRight"); 59//Clipperz.Profile.start("Clipperz.Crypto.SHA.shiftRight");
63 var result; 60 var result;
64 61
65 result = aValue >>> aNumberOfBits; 62 result = aValue >>> aNumberOfBits;
66 63
67//Clipperz.Profile.stop("Clipperz.Crypto.SHA.shiftRight"); 64//Clipperz.Profile.stop("Clipperz.Crypto.SHA.shiftRight");
68 return result; 65 return result;
69 }, 66 },
70 67
71 //----------------------------------------------------------------------------- 68 //-----------------------------------------------------------------------------
72 69
73 'safeAdd': function() { 70 'safeAdd': function() {
74//Clipperz.Profile.start("Clipperz.Crypto.SHA.safeAdd"); 71//Clipperz.Profile.start("Clipperz.Crypto.SHA.safeAdd");
75 varresult; 72 varresult;
76 vari, c; 73 vari, c;
77 74
78 result = arguments[0]; 75 result = arguments[0];
79 c = arguments.length; 76 c = arguments.length;
80 for (i=1; i<c; i++) { 77 for (i=1; i<c; i++) {
81 varlowerBytesSum; 78 varlowerBytesSum;
82 79
83 lowerBytesSum = (result & 0xffff) + (arguments[i] & 0xffff); 80 lowerBytesSum = (result & 0xffff) + (arguments[i] & 0xffff);
84 result = (((result >> 16) + (arguments[i] >> 16) + (lowerBytesSum >> 16)) << 16) | (lowerBytesSum & 0xffff); 81 result = (((result >> 16) + (arguments[i] >> 16) + (lowerBytesSum >> 16)) << 16) | (lowerBytesSum & 0xffff);
85 } 82 }
86 83
87//Clipperz.Profile.stop("Clipperz.Crypto.SHA.safeAdd"); 84//Clipperz.Profile.stop("Clipperz.Crypto.SHA.safeAdd");
88 return result; 85 return result;
89 }, 86 },
90 87
91 //----------------------------------------------------------------------------- 88 //-----------------------------------------------------------------------------
92 89
93 'sha256_array': function(aValue) { 90 'sha256_array': function(aValue) {
94//Clipperz.Profile.start("Clipperz.Crypto.SHA.sha256_array"); 91//Clipperz.Profile.start("Clipperz.Crypto.SHA.sha256_array");
95 varresult; 92 varresult;
96 varmessage; 93 varmessage;
97 var h0, h1, h2, h3, h4, h5, h6, h7; 94 var h0, h1, h2, h3, h4, h5, h6, h7;
98 vark; 95 vark;
99 varmessageLength; 96 varmessageLength;
100 varmessageLengthInBits; 97 varmessageLengthInBits;
101 var_i, _c; 98 var_i, _c;
102 var charBits; 99 var charBits;
103 var rotateRight; 100 var rotateRight;
104 var shiftRight; 101 var shiftRight;
105 var safeAdd; 102 var safeAdd;
106 varbytesPerBlock; 103 varbytesPerBlock;
107 var currentMessageIndex; 104 var currentMessageIndex;
108 105
109 bytesPerBlock = 512/8; 106 bytesPerBlock = 512/8;
110 rotateRight = Clipperz.Crypto.SHA.rotateRight; 107 rotateRight = Clipperz.Crypto.SHA.rotateRight;
111 shiftRight = Clipperz.Crypto.SHA.shiftRight; 108 shiftRight = Clipperz.Crypto.SHA.shiftRight;
112 safeAdd = Clipperz.Crypto.SHA.safeAdd; 109 safeAdd = Clipperz.Crypto.SHA.safeAdd;
113 110
114 charBits = 8; 111 charBits = 8;
115 112
116 h0 = 0x6a09e667; 113 h0 = 0x6a09e667;
117 h1 = 0xbb67ae85; 114 h1 = 0xbb67ae85;
118 h2 = 0x3c6ef372; 115 h2 = 0x3c6ef372;
119 h3 = 0xa54ff53a; 116 h3 = 0xa54ff53a;
120 h4 = 0x510e527f; 117 h4 = 0x510e527f;
121 h5 = 0x9b05688c; 118 h5 = 0x9b05688c;
122 h6 = 0x1f83d9ab; 119 h6 = 0x1f83d9ab;
123 h7 = 0x5be0cd19; 120 h7 = 0x5be0cd19;
124 121
125 k = [0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 122 k = [0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
126 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 123 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
127 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 124 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
128 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 125 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
129 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 126 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
130 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 127 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
131 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, 128 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
132 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2]; 129 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2];
133 130
134 message = aValue; 131 message = aValue;
135 messageLength = message.length; 132 messageLength = message.length;
136 133
137 //Pre-processing: 134 //Pre-processing:
138 message.push(0x80); //append a single "1" bit to message 135 message.push(0x80); //append a single "1" bit to message
139 136
140 _c = (512 - (((messageLength + 1) * charBits) % 512) - 64) / charBits; 137 _c = (512 - (((messageLength + 1) * charBits) % 512) - 64) / charBits;
141 if (_c < 0) { 138 if (_c < 0) {
142 _c = _c + (512 / charBits); 139 _c = _c + (512 / charBits);
143 } 140 }
144 141
145 for (_i=0; _i<_c; _i++) { 142 for (_i=0; _i<_c; _i++) {
146 message.push(0x00); //append "0" bits until message length ≡ 448 ≡ -64 (mod 512) 143 message.push(0x00); //append "0" bits until message length ≡ 448 ≡ -64 (mod 512)
147 } 144 }
148 145
149 messageLengthInBits = messageLength * charBits; 146 messageLengthInBits = messageLength * charBits;
150 message.push(0x00); //the 4 most high byte are alway 0 as message length is represented with a 32bit value; 147 message.push(0x00); //the 4 most high byte are alway 0 as message length is represented with a 32bit value;
151 message.push(0x00); 148 message.push(0x00);
152 message.push(0x00); 149 message.push(0x00);
153 message.push(0x00); 150 message.push(0x00);
154 message.push((messageLengthInBits >> 24)& 0xff); 151 message.push((messageLengthInBits >> 24)& 0xff);
155 message.push((messageLengthInBits >> 16)& 0xff); 152 message.push((messageLengthInBits >> 16)& 0xff);
156 message.push((messageLengthInBits >> 8) & 0xff); 153 message.push((messageLengthInBits >> 8) & 0xff);
157 message.push( messageLengthInBits & 0xff); 154 message.push( messageLengthInBits & 0xff);
158 155
159 currentMessageIndex = 0; 156 currentMessageIndex = 0;
160 while(currentMessageIndex < message.length) { 157 while(currentMessageIndex < message.length) {
161 varw; 158 varw;
162 vara, b, c, d, e, f, g, h; 159 vara, b, c, d, e, f, g, h;
163 160
164 w = Array(64); 161 w = Array(64);
165 162
166 _c = 16; 163 _c = 16;
167 for (_i=0; _i<_c; _i++) { 164 for (_i=0; _i<_c; _i++) {
168 var _j; 165 var _j;
169 166
170 _j = currentMessageIndex + _i*4; 167 _j = currentMessageIndex + _i*4;
171 w[_i] = (message[_j] << 24) | (message[_j + 1] << 16) | (message[_j + 2] << 8) | (message[_j + 3] << 0); 168 w[_i] = (message[_j] << 24) | (message[_j + 1] << 16) | (message[_j + 2] << 8) | (message[_j + 3] << 0);
172 } 169 }
173 170
174 _c = 64; 171 _c = 64;
175 for (_i=16; _i<_c; _i++) { 172 for (_i=16; _i<_c; _i++) {
176 vars0, s1; 173 vars0, s1;
177 174
178 s0 = (rotateRight(w[_i-15], 7)) ^ (rotateRight(w[_i-15], 18)) ^ (shiftRight(w[_i-15], 3)); 175 s0 = (rotateRight(w[_i-15], 7)) ^ (rotateRight(w[_i-15], 18)) ^ (shiftRight(w[_i-15], 3));
179 s1 = (rotateRight(w[_i-2], 17)) ^ (rotateRight(w[_i-2], 19)) ^ (shiftRight(w[_i-2], 10)); 176 s1 = (rotateRight(w[_i-2], 17)) ^ (rotateRight(w[_i-2], 19)) ^ (shiftRight(w[_i-2], 10));
180 w[_i] = safeAdd(w[_i-16], s0, w[_i-7], s1); 177 w[_i] = safeAdd(w[_i-16], s0, w[_i-7], s1);
181 } 178 }
182 179
183 a=h0; b=h1; c=h2; d=h3; e=h4; f=h5; g=h6; h=h7; 180 a=h0; b=h1; c=h2; d=h3; e=h4; f=h5; g=h6; h=h7;
184 181
185 _c = 64; 182 _c = 64;
186 for (_i=0; _i<_c; _i++) { 183 for (_i=0; _i<_c; _i++) {
187 var s0, s1, ch, maj, t1, t2; 184 var s0, s1, ch, maj, t1, t2;
188 185
189 s0 = (rotateRight(a, 2)) ^ (rotateRight(a, 13)) ^ (rotateRight(a, 22)); 186 s0 = (rotateRight(a, 2)) ^ (rotateRight(a, 13)) ^ (rotateRight(a, 22));
190 maj = (a & b) ^ (a & c) ^ (b & c); 187 maj = (a & b) ^ (a & c) ^ (b & c);
191 t2 = safeAdd(s0, maj); 188 t2 = safeAdd(s0, maj);
192 s1 = (rotateRight(e, 6)) ^ (rotateRight(e, 11)) ^ (rotateRight(e, 25)); 189 s1 = (rotateRight(e, 6)) ^ (rotateRight(e, 11)) ^ (rotateRight(e, 25));
193 ch = (e & f) ^ ((~e) & g); 190 ch = (e & f) ^ ((~e) & g);
194 t1 = safeAdd(h, s1, ch, k[_i], w[_i]); 191 t1 = safeAdd(h, s1, ch, k[_i], w[_i]);
195 192
196 h = g; 193 h = g;
197 g = f; 194 g = f;
198 f = e; 195 f = e;
199 e = safeAdd(d, t1); 196 e = safeAdd(d, t1);
200 d = c; 197 d = c;
201 c = b; 198 c = b;
202 b = a; 199 b = a;
203 a = safeAdd(t1, t2); 200 a = safeAdd(t1, t2);
204 } 201 }
205 202
206 h0 = safeAdd(h0, a); 203 h0 = safeAdd(h0, a);
207 h1 = safeAdd(h1, b); 204 h1 = safeAdd(h1, b);
208 h2 = safeAdd(h2, c); 205 h2 = safeAdd(h2, c);
209 h3 = safeAdd(h3, d); 206 h3 = safeAdd(h3, d);
210 h4 = safeAdd(h4, e); 207 h4 = safeAdd(h4, e);
211 h5 = safeAdd(h5, f); 208 h5 = safeAdd(h5, f);
212 h6 = safeAdd(h6, g); 209 h6 = safeAdd(h6, g);
213 h7 = safeAdd(h7, h); 210 h7 = safeAdd(h7, h);
214 211
215 currentMessageIndex += bytesPerBlock; 212 currentMessageIndex += bytesPerBlock;
216 } 213 }
217 214
218 result = new Array(256/8); 215 result = new Array(256/8);
219 result[0] = (h0 >> 24)& 0xff; 216 result[0] = (h0 >> 24)& 0xff;
220 result[1] = (h0 >> 16)& 0xff; 217 result[1] = (h0 >> 16)& 0xff;
221 result[2] = (h0 >> 8)& 0xff; 218 result[2] = (h0 >> 8)& 0xff;
222 result[3] = h0 & 0xff; 219 result[3] = h0 & 0xff;
223 220
224 result[4] = (h1 >> 24)& 0xff; 221 result[4] = (h1 >> 24)& 0xff;
225 result[5] = (h1 >> 16)& 0xff; 222 result[5] = (h1 >> 16)& 0xff;
226 result[6] = (h1 >> 8)& 0xff; 223 result[6] = (h1 >> 8)& 0xff;
227 result[7] = h1 & 0xff; 224 result[7] = h1 & 0xff;
228 225
229 result[8] = (h2 >> 24)& 0xff; 226 result[8] = (h2 >> 24)& 0xff;
230 result[9] = (h2 >> 16)& 0xff; 227 result[9] = (h2 >> 16)& 0xff;
231 result[10] = (h2 >> 8)& 0xff; 228 result[10] = (h2 >> 8)& 0xff;
232 result[11] = h2 & 0xff; 229 result[11] = h2 & 0xff;
233 230
234 result[12] = (h3 >> 24)& 0xff; 231 result[12] = (h3 >> 24)& 0xff;
235 result[13] = (h3 >> 16)& 0xff; 232 result[13] = (h3 >> 16)& 0xff;
236 result[14] = (h3 >> 8)& 0xff; 233 result[14] = (h3 >> 8)& 0xff;
237 result[15] = h3 & 0xff; 234 result[15] = h3 & 0xff;
238 235
239 result[16] = (h4 >> 24)& 0xff; 236 result[16] = (h4 >> 24)& 0xff;
240 result[17] = (h4 >> 16)& 0xff; 237 result[17] = (h4 >> 16)& 0xff;
241 result[18] = (h4 >> 8)& 0xff; 238 result[18] = (h4 >> 8)& 0xff;
242 result[19] = h4 & 0xff; 239 result[19] = h4 & 0xff;
243 240
244 result[20] = (h5 >> 24)& 0xff; 241 result[20] = (h5 >> 24)& 0xff;
245 result[21] = (h5 >> 16)& 0xff; 242 result[21] = (h5 >> 16)& 0xff;
246 result[22] = (h5 >> 8)& 0xff; 243 result[22] = (h5 >> 8)& 0xff;
247 result[23] = h5 & 0xff; 244 result[23] = h5 & 0xff;
248 245
249 result[24] = (h6 >> 24)& 0xff; 246 result[24] = (h6 >> 24)& 0xff;
250 result[25] = (h6 >> 16)& 0xff; 247 result[25] = (h6 >> 16)& 0xff;
251 result[26] = (h6 >> 8)& 0xff; 248 result[26] = (h6 >> 8)& 0xff;
252 result[27] = h6 & 0xff; 249 result[27] = h6 & 0xff;
253 250
254 result[28] = (h7 >> 24)& 0xff; 251 result[28] = (h7 >> 24)& 0xff;
255 result[29] = (h7 >> 16)& 0xff; 252 result[29] = (h7 >> 16)& 0xff;
256 result[30] = (h7 >> 8)& 0xff; 253 result[30] = (h7 >> 8)& 0xff;
257 result[31] = h7 & 0xff; 254 result[31] = h7 & 0xff;
258 255
259//Clipperz.Profile.stop("Clipperz.Crypto.SHA.sha256_array"); 256//Clipperz.Profile.stop("Clipperz.Crypto.SHA.sha256_array");
260 return result; 257 return result;
261 }, 258 },
262 259
263 //----------------------------------------------------------------------------- 260 //-----------------------------------------------------------------------------
264 261
265 'sha256': function(aValue) { 262 'sha256': function(aValue) {
266//Clipperz.Profile.start("Clipperz.Crypto.SHA.sha256"); 263//Clipperz.Profile.start("Clipperz.Crypto.SHA.sha256");
267 var result; 264 var result;
268 var resultArray; 265 var resultArray;
269 varvalueArray; 266 varvalueArray;
270 267
271 valueArray = aValue.arrayValues(); 268 valueArray = aValue.arrayValues();
272 resultArray = Clipperz.Crypto.SHA.sha256_array(valueArray); 269 resultArray = Clipperz.Crypto.SHA.sha256_array(valueArray);
273 270
274 result = new Clipperz.ByteArray(resultArray); 271 result = new Clipperz.ByteArray(resultArray);
275 272
276//Clipperz.Profile.stop("Clipperz.Crypto.SHA.sha256"); 273//Clipperz.Profile.stop("Clipperz.Crypto.SHA.sha256");
277 return result; 274 return result;
278 }, 275 },
279 276
280 //----------------------------------------------------------------------------- 277 //-----------------------------------------------------------------------------
281 278
282 'sha_d256': function(aValue) { 279 'sha_d256': function(aValue) {
283//Clipperz.Profile.start("Clipperz.Crypto.SHA.sha_d256"); 280//Clipperz.Profile.start("Clipperz.Crypto.SHA.sha_d256");
284 var result; 281 var result;
285 var resultArray; 282 var resultArray;
286 varvalueArray; 283 varvalueArray;
287 284
288 valueArray = aValue.arrayValues(); 285 valueArray = aValue.arrayValues();
289 resultArray = Clipperz.Crypto.SHA.sha256_array(valueArray); 286 resultArray = Clipperz.Crypto.SHA.sha256_array(valueArray);
290 resultArray = Clipperz.Crypto.SHA.sha256_array(resultArray); 287 resultArray = Clipperz.Crypto.SHA.sha256_array(resultArray);
291 288
292 result = new Clipperz.ByteArray(resultArray); 289 result = new Clipperz.ByteArray(resultArray);
293 290
294//Clipperz.Profile.stop("Clipperz.Crypto.SHA.sha256"); 291//Clipperz.Profile.stop("Clipperz.Crypto.SHA.sha256");
295 return result; 292 return result;
296 }, 293 },
297 294
298 //----------------------------------------------------------------------------- 295 //-----------------------------------------------------------------------------
299 __syntaxFix__: "syntax fix" 296 __syntaxFix__: "syntax fix"
300 297
301}); 298});
diff --git a/frontend/gamma/js/Clipperz/Crypto/SRP.js b/frontend/gamma/js/Clipperz/Crypto/SRP.js
index 0eef6ec..3b25275 100644
--- a/frontend/gamma/js/Clipperz/Crypto/SRP.js
+++ b/frontend/gamma/js/Clipperz/Crypto/SRP.js
@@ -1,331 +1,328 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) { 26try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) {
30 throw "Clipperz.Crypto.PRNG depends on Clipperz.ByteArray!"; 27 throw "Clipperz.Crypto.PRNG depends on Clipperz.ByteArray!";
31} 28}
32 29
33try { if (typeof(Clipperz.Crypto.BigInt) == 'undefined') { throw ""; }} catch (e) { 30try { if (typeof(Clipperz.Crypto.BigInt) == 'undefined') { throw ""; }} catch (e) {
34 throw "Clipperz.Crypto.SRP depends on Clipperz.Crypto.BigInt!"; 31 throw "Clipperz.Crypto.SRP depends on Clipperz.Crypto.BigInt!";
35} 32}
36 33
37try { if (typeof(Clipperz.Crypto.PRNG) == 'undefined') { throw ""; }} catch (e) { 34try { if (typeof(Clipperz.Crypto.PRNG) == 'undefined') { throw ""; }} catch (e) {
38 throw "Clipperz.Crypto.SRP depends on Clipperz.Crypto.PRNG!"; 35 throw "Clipperz.Crypto.SRP depends on Clipperz.Crypto.PRNG!";
39} 36}
40 37
41if (typeof(Clipperz.Crypto.SRP) == 'undefined') { Clipperz.Crypto.SRP = {}; } 38if (typeof(Clipperz.Crypto.SRP) == 'undefined') { Clipperz.Crypto.SRP = {}; }
42 39
43Clipperz.Crypto.SRP.VERSION = "0.1"; 40Clipperz.Crypto.SRP.VERSION = "0.1";
44Clipperz.Crypto.SRP.NAME = "Clipperz.Crypto.SRP"; 41Clipperz.Crypto.SRP.NAME = "Clipperz.Crypto.SRP";
45 42
46//############################################################################# 43//#############################################################################
47 44
48MochiKit.Base.update(Clipperz.Crypto.SRP, { 45MochiKit.Base.update(Clipperz.Crypto.SRP, {
49 46
50 '_n': null, 47 '_n': null,
51 '_g': null, 48 '_g': null,
52 //------------------------------------------------------------------------- 49 //-------------------------------------------------------------------------
53 50
54 'n': function() { 51 'n': function() {
55 if (Clipperz.Crypto.SRP._n == null) { 52 if (Clipperz.Crypto.SRP._n == null) {
56 Clipperz.Crypto.SRP._n = new Clipperz.Crypto.BigInt("115b8b692e0e045692cf280b436735c77a5a9e8a9e7ed56c965f87db5b2a2ece3", 16); 53 Clipperz.Crypto.SRP._n = new Clipperz.Crypto.BigInt("115b8b692e0e045692cf280b436735c77a5a9e8a9e7ed56c965f87db5b2a2ece3", 16);
57 } 54 }
58 55
59 return Clipperz.Crypto.SRP._n; 56 return Clipperz.Crypto.SRP._n;
60 }, 57 },
61 58
62 //------------------------------------------------------------------------- 59 //-------------------------------------------------------------------------
63 60
64 'g': function() { 61 'g': function() {
65 if (Clipperz.Crypto.SRP._g == null) { 62 if (Clipperz.Crypto.SRP._g == null) {
66 Clipperz.Crypto.SRP._g = new Clipperz.Crypto.BigInt(2); //eventually 5 (as suggested on the Diffi-Helmann documentation) 63 Clipperz.Crypto.SRP._g = new Clipperz.Crypto.BigInt(2); //eventually 5 (as suggested on the Diffi-Helmann documentation)
67 } 64 }
68 65
69 return Clipperz.Crypto.SRP._g; 66 return Clipperz.Crypto.SRP._g;
70 }, 67 },
71 68
72 //----------------------------------------------------------------------------- 69 //-----------------------------------------------------------------------------
73 70
74 'exception': { 71 'exception': {
75 'InvalidValue': new MochiKit.Base.NamedError("Clipperz.Crypto.SRP.exception.InvalidValue") 72 'InvalidValue': new MochiKit.Base.NamedError("Clipperz.Crypto.SRP.exception.InvalidValue")
76 }, 73 },
77 74
78 //------------------------------------------------------------------------- 75 //-------------------------------------------------------------------------
79 __syntaxFix__: "syntax fix" 76 __syntaxFix__: "syntax fix"
80 77
81}); 78});
82 79
83//############################################################################# 80//#############################################################################
84// 81//
85 // S R P C o n n e c t i o n version 1.0 82 // S R P C o n n e c t i o n version 1.0
86// 83//
87//============================================================================= 84//=============================================================================
88Clipperz.Crypto.SRP.Connection = function (args) { 85Clipperz.Crypto.SRP.Connection = function (args) {
89 args = args || {}; 86 args = args || {};
90 87
91 this._C = args.C; 88 this._C = args.C;
92 this._P = args.P; 89 this._P = args.P;
93 this.hash = args.hash; 90 this.hash = args.hash;
94 91
95 this._a = null; 92 this._a = null;
96 this._A = null; 93 this._A = null;
97 94
98 this._s = null; 95 this._s = null;
99 this._B = null; 96 this._B = null;
100 97
101 this._x = null; 98 this._x = null;
102 99
103 this._u = null; 100 this._u = null;
104 this._K = null; 101 this._K = null;
105 this._M1 = null; 102 this._M1 = null;
106 this._M2 = null; 103 this._M2 = null;
107 104
108 this._sessionKey = null; 105 this._sessionKey = null;
109 106
110 return this; 107 return this;
111} 108}
112 109
113Clipperz.Crypto.SRP.Connection.prototype = MochiKit.Base.update(null, { 110Clipperz.Crypto.SRP.Connection.prototype = MochiKit.Base.update(null, {
114 111
115 'toString': function () { 112 'toString': function () {
116 return "Clipperz.Crypto.SRP.Connection (username: " + this.username() + "). Status: " + this.statusDescription(); 113 return "Clipperz.Crypto.SRP.Connection (username: " + this.username() + "). Status: " + this.statusDescription();
117 }, 114 },
118 115
119 //------------------------------------------------------------------------- 116 //-------------------------------------------------------------------------
120 117
121 'C': function () { 118 'C': function () {
122 return this._C; 119 return this._C;
123 }, 120 },
124 121
125 //------------------------------------------------------------------------- 122 //-------------------------------------------------------------------------
126 123
127 'P': function () { 124 'P': function () {
128 return this._P; 125 return this._P;
129 }, 126 },
130 127
131 //------------------------------------------------------------------------- 128 //-------------------------------------------------------------------------
132 129
133 'a': function () { 130 'a': function () {
134 if (this._a == null) { 131 if (this._a == null) {
135 this._a = new Clipperz.Crypto.BigInt(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2), 16); 132 this._a = new Clipperz.Crypto.BigInt(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2), 16);
136 // this._a = new Clipperz.Crypto.BigInt("37532428169486597638072888476611365392249575518156687476805936694442691012367", 10); 133 // this._a = new Clipperz.Crypto.BigInt("37532428169486597638072888476611365392249575518156687476805936694442691012367", 10);
137//MochiKit.Logging.logDebug("SRP a: " + this._a); 134//MochiKit.Logging.logDebug("SRP a: " + this._a);
138 } 135 }
139 136
140 return this._a; 137 return this._a;
141 }, 138 },
142 139
143 //------------------------------------------------------------------------- 140 //-------------------------------------------------------------------------
144 141
145 'A': function () { 142 'A': function () {
146 if (this._A == null) { 143 if (this._A == null) {
147 //Warning: this value should be strictly greater than zero: how should we perform this check? 144 //Warning: this value should be strictly greater than zero: how should we perform this check?
148 this._A = Clipperz.Crypto.SRP.g().powerModule(this.a(), Clipperz.Crypto.SRP.n()); 145 this._A = Clipperz.Crypto.SRP.g().powerModule(this.a(), Clipperz.Crypto.SRP.n());
149 146
150 if (this._A.equals(0)) { 147 if (this._A.equals(0)) {
151MochiKit.Logging.logError("Clipperz.Crypto.SRP.Connection: trying to set 'A' to 0."); 148MochiKit.Logging.logError("Clipperz.Crypto.SRP.Connection: trying to set 'A' to 0.");
152 throw Clipperz.Crypto.SRP.exception.InvalidValue; 149 throw Clipperz.Crypto.SRP.exception.InvalidValue;
153 } 150 }
154//MochiKit.Logging.logDebug("SRP A: " + this._A); 151//MochiKit.Logging.logDebug("SRP A: " + this._A);
155 } 152 }
156 153
157 return this._A; 154 return this._A;
158 }, 155 },
159 156
160 //------------------------------------------------------------------------- 157 //-------------------------------------------------------------------------
161 158
162 's': function () { 159 's': function () {
163 return this._s; 160 return this._s;
164//MochiKit.Logging.logDebug("SRP s: " + this._S); 161//MochiKit.Logging.logDebug("SRP s: " + this._S);
165 }, 162 },
166 163
167 'set_s': function(aValue) { 164 'set_s': function(aValue) {
168 this._s = aValue; 165 this._s = aValue;
169 }, 166 },
170 167
171 //------------------------------------------------------------------------- 168 //-------------------------------------------------------------------------
172 169
173 'B': function () { 170 'B': function () {
174 return this._B; 171 return this._B;
175 }, 172 },
176 173
177 'set_B': function(aValue) { 174 'set_B': function(aValue) {
178 //Warning: this value should be strictly greater than zero: how should we perform this check? 175 //Warning: this value should be strictly greater than zero: how should we perform this check?
179 if (! aValue.equals(0)) { 176 if (! aValue.equals(0)) {
180 this._B = aValue; 177 this._B = aValue;
181//MochiKit.Logging.logDebug("SRP B: " + this._B); 178//MochiKit.Logging.logDebug("SRP B: " + this._B);
182 } else { 179 } else {
183MochiKit.Logging.logError("Clipperz.Crypto.SRP.Connection: trying to set 'B' to 0."); 180MochiKit.Logging.logError("Clipperz.Crypto.SRP.Connection: trying to set 'B' to 0.");
184 throw Clipperz.Crypto.SRP.exception.InvalidValue; 181 throw Clipperz.Crypto.SRP.exception.InvalidValue;
185 } 182 }
186 }, 183 },
187 184
188 //------------------------------------------------------------------------- 185 //-------------------------------------------------------------------------
189 186
190 'x': function () { 187 'x': function () {
191 if (this._x == null) { 188 if (this._x == null) {
192 this._x = new Clipperz.Crypto.BigInt(this.stringHash(this.s().asString(16, 64) + this.P()), 16); 189 this._x = new Clipperz.Crypto.BigInt(this.stringHash(this.s().asString(16, 64) + this.P()), 16);
193//MochiKit.Logging.logDebug("SRP x: " + this._x); 190//MochiKit.Logging.logDebug("SRP x: " + this._x);
194 } 191 }
195 192
196 return this._x; 193 return this._x;
197 }, 194 },
198 195
199 //------------------------------------------------------------------------- 196 //-------------------------------------------------------------------------
200 197
201 'u': function () { 198 'u': function () {
202 if (this._u == null) { 199 if (this._u == null) {
203 this._u = new Clipperz.Crypto.BigInt(this.stringHash(this.B().asString()), 16); 200 this._u = new Clipperz.Crypto.BigInt(this.stringHash(this.B().asString()), 16);
204//MochiKit.Logging.logDebug("SRP u: " + this._u); 201//MochiKit.Logging.logDebug("SRP u: " + this._u);
205 } 202 }
206 203
207 return this._u; 204 return this._u;
208 }, 205 },
209 206
210 //------------------------------------------------------------------------- 207 //-------------------------------------------------------------------------
211 208
212 'S': function () { 209 'S': function () {
213 if (this._S == null) { 210 if (this._S == null) {
214 var bigint; 211 var bigint;
215 varsrp; 212 varsrp;
216 213
217 bigint = Clipperz.Crypto.BigInt; 214 bigint = Clipperz.Crypto.BigInt;
218 srp = Clipperz.Crypto.SRP; 215 srp = Clipperz.Crypto.SRP;
219 216
220 this._S =bigint.powerModule( 217 this._S =bigint.powerModule(
221 bigint.subtract(this.B(), bigint.powerModule(srp.g(), this.x(), srp.n())), 218 bigint.subtract(this.B(), bigint.powerModule(srp.g(), this.x(), srp.n())),
222 bigint.add(this.a(), bigint.multiply(this.u(), this.x())), 219 bigint.add(this.a(), bigint.multiply(this.u(), this.x())),
223 srp.n() 220 srp.n()
224 ) 221 )
225//MochiKit.Logging.logDebug("SRP S: " + this._S); 222//MochiKit.Logging.logDebug("SRP S: " + this._S);
226 } 223 }
227 224
228 return this._S; 225 return this._S;
229 }, 226 },
230 227
231 //------------------------------------------------------------------------- 228 //-------------------------------------------------------------------------
232 229
233 'K': function () { 230 'K': function () {
234 if (this._K == null) { 231 if (this._K == null) {
235 this._K = this.stringHash(this.S().asString()); 232 this._K = this.stringHash(this.S().asString());
236//MochiKit.Logging.logDebug("SRP K: " + this._K); 233//MochiKit.Logging.logDebug("SRP K: " + this._K);
237 } 234 }
238 235
239 return this._K; 236 return this._K;
240 }, 237 },
241 238
242 //------------------------------------------------------------------------- 239 //-------------------------------------------------------------------------
243 240
244 'M1': function () { 241 'M1': function () {
245 if (this._M1 == null) { 242 if (this._M1 == null) {
246 this._M1 = this.stringHash(this.A().asString(10) + this.B().asString(10) + this.K()); 243 this._M1 = this.stringHash(this.A().asString(10) + this.B().asString(10) + this.K());
247//MochiKit.Logging.logDebug("SRP M1: " + this._M1); 244//MochiKit.Logging.logDebug("SRP M1: " + this._M1);
248 } 245 }
249 246
250 return this._M1; 247 return this._M1;
251 }, 248 },
252 249
253 //------------------------------------------------------------------------- 250 //-------------------------------------------------------------------------
254 251
255 'M2': function () { 252 'M2': function () {
256 if (this._M2 == null) { 253 if (this._M2 == null) {
257 this._M2 = this.stringHash(this.A().asString(10) + this.M1() + this.K()); 254 this._M2 = this.stringHash(this.A().asString(10) + this.M1() + this.K());
258//MochiKit.Logging.logDebug("SRP M2: " + this._M2); 255//MochiKit.Logging.logDebug("SRP M2: " + this._M2);
259 } 256 }
260 257
261 return this._M2; 258 return this._M2;
262 }, 259 },
263 260
264 //========================================================================= 261 //=========================================================================
265 262
266 'serverSideCredentialsWithSalt': function(aSalt) { 263 'serverSideCredentialsWithSalt': function(aSalt) {
267 var result; 264 var result;
268 var s, x, v; 265 var s, x, v;
269 266
270 s = aSalt; 267 s = aSalt;
271 x = this.stringHash(s + this.P()); 268 x = this.stringHash(s + this.P());
272 v = Clipperz.Crypto.SRP.g().powerModule(new Clipperz.Crypto.BigInt(x, 16), Clipperz.Crypto.SRP.n()); 269 v = Clipperz.Crypto.SRP.g().powerModule(new Clipperz.Crypto.BigInt(x, 16), Clipperz.Crypto.SRP.n());
273 270
274 result = {}; 271 result = {};
275 result['C'] = this.C(); 272 result['C'] = this.C();
276 result['s'] = s; 273 result['s'] = s;
277 result['v'] = v.asString(16); 274 result['v'] = v.asString(16);
278 275
279 return result; 276 return result;
280 }, 277 },
281 278
282 'serverSideCredentials': function() { 279 'serverSideCredentials': function() {
283 var result; 280 var result;
284 var s; 281 var s;
285 282
286 s = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2); 283 s = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2);
287 284
288 result = this.serverSideCredentialsWithSalt(s); 285 result = this.serverSideCredentialsWithSalt(s);
289 286
290 return result; 287 return result;
291 }, 288 },
292 289
293 //========================================================================= 290 //=========================================================================
294/* 291/*
295 'computeServerSide_S': function(b) { 292 'computeServerSide_S': function(b) {
296 var result; 293 var result;
297 var v; 294 var v;
298 var bigint; 295 var bigint;
299 varsrp; 296 varsrp;
300 297
301 bigint = Clipperz.Crypto.BigInt; 298 bigint = Clipperz.Crypto.BigInt;
302 srp = Clipperz.Crypto.SRP; 299 srp = Clipperz.Crypto.SRP;
303 300
304 v = new Clipperz.Crypto.BigInt(srpConnection.serverSideCredentialsWithSalt(this.s().asString(16, 64)).v, 16); 301 v = new Clipperz.Crypto.BigInt(srpConnection.serverSideCredentialsWithSalt(this.s().asString(16, 64)).v, 16);
305 // _S = (this.A().multiply(this.v().modPow(this.u(), this.n()))).modPow(this.b(), this.n()); 302 // _S = (this.A().multiply(this.v().modPow(this.u(), this.n()))).modPow(this.b(), this.n());
306 result = bigint.powerModule( 303 result = bigint.powerModule(
307 bigint.multiply( 304 bigint.multiply(
308 this.A(), 305 this.A(),
309 bigint.powerModule(v, this.u(), srp.n()) 306 bigint.powerModule(v, this.u(), srp.n())
310 ), new Clipperz.Crypto.BigInt(b, 10), srp.n() 307 ), new Clipperz.Crypto.BigInt(b, 10), srp.n()
311 ); 308 );
312 309
313 return result; 310 return result;
314 }, 311 },
315*/ 312*/
316 //========================================================================= 313 //=========================================================================
317 314
318 'stringHash': function(aValue) { 315 'stringHash': function(aValue) {
319 varresult; 316 varresult;
320 317
321 result = this.hash(new Clipperz.ByteArray(aValue)).toHexString().substring(2); 318 result = this.hash(new Clipperz.ByteArray(aValue)).toHexString().substring(2);
322 319
323 return result; 320 return result;
324 }, 321 },
325 322
326 //========================================================================= 323 //=========================================================================
327 __syntaxFix__: "syntax fix" 324 __syntaxFix__: "syntax fix"
328 325
329}); 326});
330 327
331//############################################################################# 328//#############################################################################
diff --git a/frontend/gamma/js/Clipperz/DOM.js b/frontend/gamma/js/Clipperz/DOM.js
index 40720d8..8f24653 100644
--- a/frontend/gamma/js/Clipperz/DOM.js
+++ b/frontend/gamma/js/Clipperz/DOM.js
@@ -1,139 +1,136 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
30if (typeof(Clipperz.DOM) == 'undefined') { Clipperz.DOM = {}; } 27if (typeof(Clipperz.DOM) == 'undefined') { Clipperz.DOM = {}; }
31 28
32Clipperz.DOM.VERSION = "0.1"; 29Clipperz.DOM.VERSION = "0.1";
33Clipperz.DOM.NAME = "Clipperz.DOM"; 30Clipperz.DOM.NAME = "Clipperz.DOM";
34 31
35MochiKit.Base.update(Clipperz.DOM, { 32MochiKit.Base.update(Clipperz.DOM, {
36 33
37 //------------------------------------------------------------------------- 34 //-------------------------------------------------------------------------
38 35
39 '__repr__': function () { 36 '__repr__': function () {
40 return "[" + this.NAME + " " + this.VERSION + "]"; 37 return "[" + this.NAME + " " + this.VERSION + "]";
41 }, 38 },
42 39
43 //------------------------------------------------------------------------- 40 //-------------------------------------------------------------------------
44 41
45 'toString': function () { 42 'toString': function () {
46 return this.__repr__(); 43 return this.__repr__();
47 }, 44 },
48 45
49 //------------------------------------------------------------------------- 46 //-------------------------------------------------------------------------
50 47
51 'selectOptionMatchingValue': function (aSelectElement, aValue, shouldUseCaseInsensitiveTest) { 48 'selectOptionMatchingValue': function (aSelectElement, aValue, shouldUseCaseInsensitiveTest) {
52 var selectedOptionIndex; 49 var selectedOptionIndex;
53 var i, c; 50 var i, c;
54 51
55 selectedOptionIndex = -1; 52 selectedOptionIndex = -1;
56 53
57 c = aSelectElement.options.length; 54 c = aSelectElement.options.length;
58 for (i=0; (i<c) && (selectedOptionIndex == -1); i++) { 55 for (i=0; (i<c) && (selectedOptionIndex == -1); i++) {
59 if (shouldUseCaseInsensitiveTest == true) { 56 if (shouldUseCaseInsensitiveTest == true) {
60 if (aSelectElement.options[i].value.toLowerCase() == aValue.toLowerCase()) { 57 if (aSelectElement.options[i].value.toLowerCase() == aValue.toLowerCase()) {
61 selectedOptionIndex = i; 58 selectedOptionIndex = i;
62 } 59 }
63 } else { 60 } else {
64 if (aSelectElement.options[i].value == aValue) { 61 if (aSelectElement.options[i].value == aValue) {
65 selectedOptionIndex = i; 62 selectedOptionIndex = i;
66 } 63 }
67 } 64 }
68 } 65 }
69 66
70 if (selectedOptionIndex != -1) { 67 if (selectedOptionIndex != -1) {
71 aSelectElement.selectedIndex = selectedOptionIndex; 68 aSelectElement.selectedIndex = selectedOptionIndex;
72 } 69 }
73 }, 70 },
74 71
75 //------------------------------------------------------------------------- 72 //-------------------------------------------------------------------------
76 73
77 'setFormContents': function(aNode, someValues) { 74 'setFormContents': function(aNode, someValues) {
78 var node; 75 var node;
79 var values; 76 var values;
80 var i, c; 77 var i, c;
81 78
82 values = {}; 79 values = {};
83 c = someValues[0].length; 80 c = someValues[0].length;
84 for (i=0; i<c; i++) { 81 for (i=0; i<c; i++) {
85 values[someValues[0][i]] = someValues[1][i]; 82 values[someValues[0][i]] = someValues[1][i];
86 } 83 }
87 84
88 // var m = MochiKit.Base; 85 // var m = MochiKit.Base;
89 // var self = MochiKit.DOM; 86 // var self = MochiKit.DOM;
90 if (typeof(aNode) == "undefined" || aNode === null) { 87 if (typeof(aNode) == "undefined" || aNode === null) {
91 node = MochiKit.DOM._document.body; 88 node = MochiKit.DOM._document.body;
92 } else { 89 } else {
93 node = MochiKit.DOM.getElement(aNode); 90 node = MochiKit.DOM.getElement(aNode);
94 } 91 }
95 92
96 MochiKit.Base.nodeWalk(node, function(aNode) { 93 MochiKit.Base.nodeWalk(node, function(aNode) {
97 var result; 94 var result;
98 var name; 95 var name;
99 96
100 result = null; 97 result = null;
101 name = aNode.name; 98 name = aNode.name;
102 if (MochiKit.Base.isNotEmpty(name) && (typeof(values[name]) != 'undefined')) { 99 if (MochiKit.Base.isNotEmpty(name) && (typeof(values[name]) != 'undefined')) {
103 var tagName; 100 var tagName;
104 101
105 tagName = aNode.tagName.toUpperCase(); 102 tagName = aNode.tagName.toUpperCase();
106 if (tagName === "INPUT" && (aNode.type == "radio" || aNode.type == "checkbox")) { 103 if (tagName === "INPUT" && (aNode.type == "radio" || aNode.type == "checkbox")) {
107 aNode.checked = values[name]; 104 aNode.checked = values[name];
108 } else if (tagName === "SELECT") { 105 } else if (tagName === "SELECT") {
109 if (aNode.type == "select-one") { 106 if (aNode.type == "select-one") {
110 Clipperz.DOM.selectOptionMatchingValue(aNode, values[name]); 107 Clipperz.DOM.selectOptionMatchingValue(aNode, values[name]);
111 } else { //aNode.type == "select-multiple" 108 } else { //aNode.type == "select-multiple"
112MochiKit.Logging.logWarning("### unhandled Select.type = 'select-multiple' condition"); 109MochiKit.Logging.logWarning("### unhandled Select.type = 'select-multiple' condition");
113 } 110 }
114 } else if (tagName === "FORM" || tagName === "P" || tagName === "SPAN" || tagName === "DIV") { 111 } else if (tagName === "FORM" || tagName === "P" || tagName === "SPAN" || tagName === "DIV") {
115 result = aNode.childNodes; 112 result = aNode.childNodes;
116 } else { 113 } else {
117 aNode.value = values[name] 114 aNode.value = values[name]
118 } 115 }
119 } else { 116 } else {
120 result = aNode.childNodes; 117 result = aNode.childNodes;
121 } 118 }
122 119
123 return result; 120 return result;
124 }); 121 });
125 }, 122 },
126 123
127 //------------------------------------------------------------------------- 124 //-------------------------------------------------------------------------
128 125
129 'get': MochiKit.DOM.getElement, 126 'get': MochiKit.DOM.getElement,
130 127
131 //------------------------------------------------------------------------- 128 //-------------------------------------------------------------------------
132 129
133 'Helper': Clipperz.YUI.DomHelper, 130 'Helper': Clipperz.YUI.DomHelper,
134 131
135 //------------------------------------------------------------------------- 132 //-------------------------------------------------------------------------
136 __syntaxFix__: "syntax fix" 133 __syntaxFix__: "syntax fix"
137 134
138}); 135});
139 136
diff --git a/frontend/gamma/js/Clipperz/Date.js b/frontend/gamma/js/Clipperz/Date.js
index 4103b88..020d77b 100644
--- a/frontend/gamma/js/Clipperz/Date.js
+++ b/frontend/gamma/js/Clipperz/Date.js
@@ -1,305 +1,302 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
30if (typeof(Clipperz.Date) == 'undefined') { Clipperz.Date = {}; } 27if (typeof(Clipperz.Date) == 'undefined') { Clipperz.Date = {}; }
31 28
32Clipperz.Date.VERSION = "0.1"; 29Clipperz.Date.VERSION = "0.1";
33Clipperz.Date.NAME = "Clipperz.Date"; 30Clipperz.Date.NAME = "Clipperz.Date";
34 31
35MochiKit.Base.update(Clipperz.Date, { 32MochiKit.Base.update(Clipperz.Date, {
36 33
37 //------------------------------------------------------------------------- 34 //-------------------------------------------------------------------------
38 35
39 '__repr__': function () { 36 '__repr__': function () {
40 return "[" + this.NAME + " " + this.VERSION + "]"; 37 return "[" + this.NAME + " " + this.VERSION + "]";
41 }, 38 },
42 39
43 //------------------------------------------------------------------------- 40 //-------------------------------------------------------------------------
44 41
45 'toString': function () { 42 'toString': function () {
46 return this.__repr__(); 43 return this.__repr__();
47 }, 44 },
48 45
49 //------------------------------------------------------------------------- 46 //-------------------------------------------------------------------------
50 47
51 'daysInMonth': [31,28,31,30,31,30,31,31,30,31,30,31], 48 'daysInMonth': [31,28,31,30,31,30,31,31,30,31,30,31],
52 49
53 //------------------------------------------------------------------------- 50 //-------------------------------------------------------------------------
54 51
55 'englishOrdinalDaySuffixForDate': function(aDate) { 52 'englishOrdinalDaySuffixForDate': function(aDate) {
56 var result; 53 var result;
57 54
58 switch (aDate.getDate()) { 55 switch (aDate.getDate()) {
59 case 1: 56 case 1:
60 case 21: 57 case 21:
61 case 31: 58 case 31:
62 result = "st"; 59 result = "st";
63 break; 60 break;
64 case 2: 61 case 2:
65 case 22: 62 case 22:
66 result = "nd"; 63 result = "nd";
67 break; 64 break;
68 case 3: 65 case 3:
69 case 23: 66 case 23:
70 result = "rd"; 67 result = "rd";
71 break; 68 break;
72 default: 69 default:
73 result = "th"; 70 result = "th";
74 break; 71 break;
75 } 72 }
76 73
77 return result; 74 return result;
78 }, 75 },
79 76
80 //------------------------------------------------------------------------- 77 //-------------------------------------------------------------------------
81 78
82 'isLeapYear': function(aDate) { 79 'isLeapYear': function(aDate) {
83 var year; 80 var year;
84 var result; 81 var result;
85 82
86 year = aDate.getFullYear(); 83 year = aDate.getFullYear();
87 result = ((year & 0x03) == 0 && (year % 100 || (year % 400 == 0 && year))); 84 result = ((year & 0x03) == 0 && (year % 100 || (year % 400 == 0 && year)));
88 85
89 return result; 86 return result;
90 }, 87 },
91 88
92 //------------------------------------------------------------------------- 89 //-------------------------------------------------------------------------
93 90
94 'getDaysInMonth': function(aDate) { 91 'getDaysInMonth': function(aDate) {
95 var result; 92 var result;
96 93
97 if (aDate.getMonth() == 1) { 94 if (aDate.getMonth() == 1) {
98 Clipperz.Date.isLeapYear(aDate) 95 Clipperz.Date.isLeapYear(aDate)
99 result += Clipperz.Date.isLeapYear(aDate) ? 29 : 28; 96 result += Clipperz.Date.isLeapYear(aDate) ? 29 : 28;
100 } else { 97 } else {
101 result = Clipperz.Date.daysInMonth[aDate.getMonth()]; 98 result = Clipperz.Date.daysInMonth[aDate.getMonth()];
102 } 99 }
103 100
104 return result; 101 return result;
105 }, 102 },
106 103
107 //------------------------------------------------------------------------- 104 //-------------------------------------------------------------------------
108 105
109 'getTimezone': function(aDate) { 106 'getTimezone': function(aDate) {
110 var result; 107 var result;
111 108
112 result = aDate.toString(); 109 result = aDate.toString();
113 result = result.replace(/([A-Z]{3}) [0-9]{4}/, '$1'); 110 result = result.replace(/([A-Z]{3}) [0-9]{4}/, '$1');
114 result = result.replace(/^.*?\(([A-Z])[a-z]+ ([A-Z])[a-z]+ ([A-Z])[a-z]+\)$/, "$1$2$3"); 111 result = result.replace(/^.*?\(([A-Z])[a-z]+ ([A-Z])[a-z]+ ([A-Z])[a-z]+\)$/, "$1$2$3");
115 112
116 return result; 113 return result;
117 }, 114 },
118 115
119 'getGMTOffset': function(aDate) { 116 'getGMTOffset': function(aDate) {
120 return (aDate.getTimezoneOffset() > 0 ? "-" : "+")+ MochiKit.Format.numberFormatter('00')(Math.floor(this.getTimezoneOffset() / 60)) 117 return (aDate.getTimezoneOffset() > 0 ? "-" : "+")+ MochiKit.Format.numberFormatter('00')(Math.floor(this.getTimezoneOffset() / 60))
121 + MochiKit.Format.numberFormatter('00')(this.getTimezoneOffset() % 60); 118 + MochiKit.Format.numberFormatter('00')(this.getTimezoneOffset() % 60);
122 }, 119 },
123 120
124 //------------------------------------------------------------------------- 121 //-------------------------------------------------------------------------
125 122
126 'dayOfYear': function(aDate) { 123 'dayOfYear': function(aDate) {
127 var result; 124 var result;
128 var i,c; 125 var i,c;
129 126
130 result = 0; 127 result = 0;
131 c = aDate.getMonth(); 128 c = aDate.getMonth();
132 for (i=0; i<c; i++) { 129 for (i=0; i<c; i++) {
133 if (i == 1) { 130 if (i == 1) {
134 result += Clipperz.Date.isLeapYear(aDate) ? 29 : 28; 131 result += Clipperz.Date.isLeapYear(aDate) ? 29 : 28;
135 } else { 132 } else {
136 result += Clipperz.Date.daysInMonth[i]; 133 result += Clipperz.Date.daysInMonth[i];
137 } 134 }
138 } 135 }
139 return num + this.getDate() - 1; 136 return num + this.getDate() - 1;
140 }, 137 },
141 138
142 //------------------------------------------------------------------------- 139 //-------------------------------------------------------------------------
143 140
144 'getPHPLikeFormatCode': function(aCharacter) { 141 'getPHPLikeFormatCode': function(aCharacter) {
145 var result; 142 var result;
146 143
147 switch (aCharacter) { 144 switch (aCharacter) {
148 case "d": 145 case "d":
149 result = " + MochiKit.Format.numberFormatter('00')(aDate.getDate())"; 146 result = " + MochiKit.Format.numberFormatter('00')(aDate.getDate())";
150 break; 147 break;
151 case "D": 148 case "D":
152 result = " + aLocale['shortDays'][aDate.getDay()]"; 149 result = " + aLocale['shortDays'][aDate.getDay()]";
153 break; 150 break;
154 case "j": 151 case "j":
155 result = " + aDate.getDate()"; 152 result = " + aDate.getDate()";
156 break; 153 break;
157 case "l": 154 case "l":
158 result = " + aLocale['days'][aDate.getDay()]"; 155 result = " + aLocale['days'][aDate.getDay()]";
159 break; 156 break;
160 case "S": 157 case "S":
161 result = " + Clipperz.Date.englishOrdinalDaySuffixForDate(aDate)"; 158 result = " + Clipperz.Date.englishOrdinalDaySuffixForDate(aDate)";
162 break; 159 break;
163 case "w": 160 case "w":
164 result = " + aDate.getDay()"; 161 result = " + aDate.getDay()";
165 break; 162 break;
166 case "z": 163 case "z":
167 result = " + aDate.getDayOfYear()"; 164 result = " + aDate.getDayOfYear()";
168 break; 165 break;
169 case "W": 166 case "W":
170 result = " + aDate.getWeekOfYear()"; 167 result = " + aDate.getWeekOfYear()";
171 break; 168 break;
172 case "F": 169 case "F":
173 result = " + aLocale['months'][aDate.getMonth()]"; 170 result = " + aLocale['months'][aDate.getMonth()]";
174 break; 171 break;
175 case "m": 172 case "m":
176 result = " + MochiKit.Format.numberFormatter('00')(aDate.getMonth() + 1)"; 173 result = " + MochiKit.Format.numberFormatter('00')(aDate.getMonth() + 1)";
177 break; 174 break;
178 case "M": 175 case "M":
179 result = " + aLocale['shortMonths'][aDate.getMonth()]"; 176 result = " + aLocale['shortMonths'][aDate.getMonth()]";
180 break; 177 break;
181 case "n": 178 case "n":
182 result = " + (aDate.getMonth() + 1)"; 179 result = " + (aDate.getMonth() + 1)";
183 break; 180 break;
184 case "t": 181 case "t":
185 result = " + Clipperz.Date.getDaysInMonth(aDate)"; 182 result = " + Clipperz.Date.getDaysInMonth(aDate)";
186 break; 183 break;
187 case "L": 184 case "L":
188 result = " + (Clipperz.Date.isLeapYear(aDate) ? 1 : 0)"; 185 result = " + (Clipperz.Date.isLeapYear(aDate) ? 1 : 0)";
189 break; 186 break;
190 case "Y": 187 case "Y":
191 result = " + aDate.getFullYear()"; 188 result = " + aDate.getFullYear()";
192 break; 189 break;
193 case "y": 190 case "y":
194 result = " + ('' + aDate.getFullYear()).substring(2, 4)"; 191 result = " + ('' + aDate.getFullYear()).substring(2, 4)";
195 break; 192 break;
196 case "a": 193 case "a":
197 result = " + (aDate.getHours() < 12 ? aLocale['amDesignation'] : aLocale['pmDesignation'])"; 194 result = " + (aDate.getHours() < 12 ? aLocale['amDesignation'] : aLocale['pmDesignation'])";
198 break; 195 break;
199 case "A": 196 case "A":
200 result = " + (aDate.getHours() < 12 ? aLocale['amDesignation'].toUpperCase() : aLocale['pmDesignation'].toUpperCase())"; 197 result = " + (aDate.getHours() < 12 ? aLocale['amDesignation'].toUpperCase() : aLocale['pmDesignation'].toUpperCase())";
201 break; 198 break;
202 case "g": 199 case "g":
203 result = " + ((aDate.getHours() %12) ? aDate.getHours() % 12 : 12)"; 200 result = " + ((aDate.getHours() %12) ? aDate.getHours() % 12 : 12)";
204 break; 201 break;
205 case "G": 202 case "G":
206 result = " + aDate.getHours()"; 203 result = " + aDate.getHours()";
207 break; 204 break;
208 case "h": 205 case "h":
209 result = " + MochiKit.Format.numberFormatter('00')((aDate.getHours() %12) ? aDate.getHours() % 12 : 12)"; 206 result = " + MochiKit.Format.numberFormatter('00')((aDate.getHours() %12) ? aDate.getHours() % 12 : 12)";
210 break; 207 break;
211 case "H": 208 case "H":
212 result = " + MochiKit.Format.numberFormatter('00')(aDate.getHours())"; 209 result = " + MochiKit.Format.numberFormatter('00')(aDate.getHours())";
213 break; 210 break;
214 case "i": 211 case "i":
215 result = " + MochiKit.Format.numberFormatter('00')(aDate.getMinutes())"; 212 result = " + MochiKit.Format.numberFormatter('00')(aDate.getMinutes())";
216 break; 213 break;
217 case "s": 214 case "s":
218 result = " + MochiKit.Format.numberFormatter('00')(aDate.getSeconds())"; 215 result = " + MochiKit.Format.numberFormatter('00')(aDate.getSeconds())";
219 break; 216 break;
220 case "O": 217 case "O":
221 result = " + aDate.getGMTOffset()"; 218 result = " + aDate.getGMTOffset()";
222 break; 219 break;
223 case "T": 220 case "T":
224 result = " + Clipperz.Date.getTimezone(aDate)"; 221 result = " + Clipperz.Date.getTimezone(aDate)";
225 break; 222 break;
226 case "Z": 223 case "Z":
227 result = " + ( + aDate.getTimezoneOffset() * -60)"; 224 result = " + ( + aDate.getTimezoneOffset() * -60)";
228 break; 225 break;
229 default: 226 default:
230 result = " + '" + aCharacter + "'"; 227 result = " + '" + aCharacter + "'";
231 break; 228 break;
232 }; 229 };
233 230
234 return result; 231 return result;
235 }, 232 },
236 233
237 //========================================================================= 234 //=========================================================================
238 235
239 'formatDateWithPHPLikeTemplateAndLocale': function(aDate, aFormat, aLocale) { 236 'formatDateWithPHPLikeTemplateAndLocale': function(aDate, aFormat, aLocale) {
240 var result; 237 var result;
241 var formatterCode; 238 var formatterCode;
242 var formatter; 239 var formatter;
243 var i,c; 240 var i,c;
244 241
245//MochiKit.Logging.logDebug(">>> Clipperz.Date.formatDateWithPHPLikeTemplateAndLocale"); 242//MochiKit.Logging.logDebug(">>> Clipperz.Date.formatDateWithPHPLikeTemplateAndLocale");
246 formatterCode = "Clipperz.Date.__scratchFormatter = function(aDate, aLocale){return ''"; 243 formatterCode = "Clipperz.Date.__scratchFormatter = function(aDate, aLocale){return ''";
247 244
248 c = aFormat.length; 245 c = aFormat.length;
249 i = 0; 246 i = 0;
250 247
251 while (i<c) { 248 while (i<c) {
252 var character; 249 var character;
253 250
254 character = aFormat.charAt(i); 251 character = aFormat.charAt(i);
255 if (character == "\\") { 252 if (character == "\\") {
256 i++; 253 i++;
257 character = aFormat.charAt(i); 254 character = aFormat.charAt(i);
258 formatterCode += " + '" + character + "'" 255 formatterCode += " + '" + character + "'"
259 } else { 256 } else {
260 formatterCode += Clipperz.Date.getPHPLikeFormatCode(character); 257 formatterCode += Clipperz.Date.getPHPLikeFormatCode(character);
261 } 258 }
262 259
263 i++; 260 i++;
264 } 261 }
265 262
266 formatterCode += ";}"; 263 formatterCode += ";}";
267//MochiKit.Logging.logDebug("--- Clipperz.Date.formatDateWithPHPLikeTemplateAndLocale - formatterCode: " + formatterCode); 264//MochiKit.Logging.logDebug("--- Clipperz.Date.formatDateWithPHPLikeTemplateAndLocale - formatterCode: " + formatterCode);
268 eval(formatterCode); 265 eval(formatterCode);
269 266
270 result = Clipperz.Date.__scratchFormatter.call(this, aDate, aLocale); 267 result = Clipperz.Date.__scratchFormatter.call(this, aDate, aLocale);
271 delete Clipperz.Date.__scratchFormatter; 268 delete Clipperz.Date.__scratchFormatter;
272//MochiKit.Logging.logDebug("<<< Clipperz.Date.formatDateWithPHPLikeTemplateAndLocale"); 269//MochiKit.Logging.logDebug("<<< Clipperz.Date.formatDateWithPHPLikeTemplateAndLocale");
273 270
274 return result; 271 return result;
275 }, 272 },
276 273
277 //------------------------------------------------------------------------- 274 //-------------------------------------------------------------------------
278 275
279 'parseDateWithPHPLikeTemplateAndLocale': function(aString, aFormat, aLocale) { 276 'parseDateWithPHPLikeTemplateAndLocale': function(aString, aFormat, aLocale) {
280 return new Date(); 277 return new Date();
281 }, 278 },
282 279
283 //========================================================================= 280 //=========================================================================
284 281
285 'formatDateWithUTCFormatAndLocale': function(aDate, aLocale) { 282 'formatDateWithUTCFormatAndLocale': function(aDate, aLocale) {
286 // return Clipperz.Date.formatWithJavaLikeTemplateAndLocale(aDate, "EEE, dd MMMM yyyy HH:mm:ss zzz", aLocale); 283 // return Clipperz.Date.formatWithJavaLikeTemplateAndLocale(aDate, "EEE, dd MMMM yyyy HH:mm:ss zzz", aLocale);
287 return aDate.toString(); 284 return aDate.toString();
288 }, 285 },
289 286
290 'parseDateWithUTCFormatAndLocale': function(aValue, aLocale) { 287 'parseDateWithUTCFormatAndLocale': function(aValue, aLocale) {
291 return new Date(Date.parse(aValue)); 288 return new Date(Date.parse(aValue));
292 }, 289 },
293 290
294 //========================================================================= 291 //=========================================================================
295 292
296 'exception': { 293 'exception': {
297 // 'AbstractMethod': new MochiKit.Base.NamedError("Clipperz.Base.exception.AbstractMethod"), 294 // 'AbstractMethod': new MochiKit.Base.NamedError("Clipperz.Base.exception.AbstractMethod"),
298 // 'UnknownType': new MochiKit.Base.NamedError("Clipperz.Base.exception.UnknownType") 295 // 'UnknownType': new MochiKit.Base.NamedError("Clipperz.Base.exception.UnknownType")
299 }, 296 },
300 297
301 //------------------------------------------------------------------------- 298 //-------------------------------------------------------------------------
302 __syntaxFix__: "syntax fix" 299 __syntaxFix__: "syntax fix"
303 300
304}); 301});
305 302
diff --git a/frontend/gamma/js/Clipperz/KeePassExportProcessor.js b/frontend/gamma/js/Clipperz/KeePassExportProcessor.js
index 06ab5a8..a3c10c8 100644
--- a/frontend/gamma/js/Clipperz/KeePassExportProcessor.js
+++ b/frontend/gamma/js/Clipperz/KeePassExportProcessor.js
@@ -1,196 +1,193 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
30 27
31 28
32Clipperz.KeePassExportProcessor = function(args) { 29Clipperz.KeePassExportProcessor = function(args) {
33 args = args || {}; 30 args = args || {};
34 31
35 return this; 32 return this;
36} 33}
37 34
38//============================================================================= 35//=============================================================================
39 36
40Clipperz.KeePassExportProcessor.prototype = MochiKit.Base.update(null, { 37Clipperz.KeePassExportProcessor.prototype = MochiKit.Base.update(null, {
41 38
42 //------------------------------------------------------------------------- 39 //-------------------------------------------------------------------------
43 40
44 'deferredParse_core': function(aContext) { 41 'deferredParse_core': function(aContext) {
45 var deferredResult; 42 var deferredResult;
46 43
47 if (aContext.line == "") { 44 if (aContext.line == "") {
48 deferredResult = MochiKit.Async.succeed(aContext.result); 45 deferredResult = MochiKit.Async.succeed(aContext.result);
49 } else { 46 } else {
50 var record; 47 var record;
51 48
52 record = this.parseRecord(aContext); 49 record = this.parseRecord(aContext);
53 if (record != null) { 50 if (record != null) {
54 aContext.result.push(record); 51 aContext.result.push(record);
55 } 52 }
56 53
57 aContext.line = aContext.line.replace(/^\n*/g, "").replace(/\n$/g, ""); 54 aContext.line = aContext.line.replace(/^\n*/g, "").replace(/\n$/g, "");
58 55
59 deferredResult = new Clipperz.Async.Deferred("KeePassExportProcessor.deferredParse_core"); 56 deferredResult = new Clipperz.Async.Deferred("KeePassExportProcessor.deferredParse_core");
60 deferredResult.addCallbackPass(MochiKit.Signal.signal, this, 'importProcessorProgressUpdate', {status:'processing', size:aContext.size, progress:(aContext.size - aContext.line.length)}); 57 deferredResult.addCallbackPass(MochiKit.Signal.signal, this, 'importProcessorProgressUpdate', {status:'processing', size:aContext.size, progress:(aContext.size - aContext.line.length)});
61 deferredResult.addCallback(MochiKit.Async.wait, 0.2); 58 deferredResult.addCallback(MochiKit.Async.wait, 0.2);
62 deferredResult.addMethod(this, 'deferredParse_core'); 59 deferredResult.addMethod(this, 'deferredParse_core');
63 deferredResult.callback(aContext); 60 deferredResult.callback(aContext);
64 } 61 }
65 62
66 return deferredResult; 63 return deferredResult;
67 }, 64 },
68 65
69 //......................................................................... 66 //.........................................................................
70 67
71 'deferredParse': function(aValue) { 68 'deferredParse': function(aValue) {
72 var deferredResult; 69 var deferredResult;
73 var lines; 70 var lines;
74 var context; 71 var context;
75 72
76 lines = aValue.replace(/\r?\n/g, "\n"); 73 lines = aValue.replace(/\r?\n/g, "\n");
77 context = { 74 context = {
78 line: lines, 75 line: lines,
79 size: lines.length, 76 size: lines.length,
80 result: [] 77 result: []
81 } 78 }
82 79
83 deferredResult = new Clipperz.Async.Deferred("KeePassExportProcessor.deferredResult"); 80 deferredResult = new Clipperz.Async.Deferred("KeePassExportProcessor.deferredResult");
84 deferredResult.addMethod(this, 'deferredParse_core'); 81 deferredResult.addMethod(this, 'deferredParse_core');
85 deferredResult.callback(context); 82 deferredResult.callback(context);
86 83
87 return deferredResult; 84 return deferredResult;
88 }, 85 },
89 86
90 //------------------------------------------------------------------------- 87 //-------------------------------------------------------------------------
91 88
92 'parseRecord': function(aContext) { 89 'parseRecord': function(aContext) {
93 var result; 90 var result;
94 var recordLabelRegexp; 91 var recordLabelRegexp;
95 varfieldLabelRegexp; 92 varfieldLabelRegexp;
96 var fieldValueRegexp; 93 var fieldValueRegexp;
97 var fullLineRegexp; 94 var fullLineRegexp;
98/* 95/*
99[Record name] 96[Record name]
100Group Tree: 97Group Tree:
101UserName: 98UserName:
102URL: 99URL:
103Password: 100Password:
104Notes: test 101Notes: test
105UUID: 525f62430079bae48b79ed2961924b05 102UUID: 525f62430079bae48b79ed2961924b05
106Icon: 0 103Icon: 0
107Creation Time: 2007-06-26 17:56:03 104Creation Time: 2007-06-26 17:56:03
108Last Access: 2007-10-25 16:23:51 105Last Access: 2007-10-25 16:23:51
109Last Modification: 2007-10-25 16:23:51 106Last Modification: 2007-10-25 16:23:51
110Expires: 2999-12-28 23:59:59 107Expires: 2999-12-28 23:59:59
111 108
112 [Record name] ==> Title 109 [Record name] ==> Title
113 Group: General ==> Group 110 Group: General ==> Group
114 Group Tree: ==> Group Tree 111 Group Tree: ==> Group Tree
115 UserName: ==> UserName 112 UserName: ==> UserName
116 URL: ==>URL 113 URL: ==>URL
117 Password: ==>Password 114 Password: ==>Password
118 Notes: test ==>Notes 115 Notes: test ==>Notes
119 UUID: 525f62430079bae48b79ed2961924b05 ==>UUID 116 UUID: 525f62430079bae48b79ed2961924b05 ==>UUID
120 Icon: 0 ==>Icon 117 Icon: 0 ==>Icon
121 Creation Time: 2007-06-26 17:56:03 ==>Creation Time 118 Creation Time: 2007-06-26 17:56:03 ==>Creation Time
122 Last Access: 2007-10-25 16:23:51 ==>Last Access 119 Last Access: 2007-10-25 16:23:51 ==>Last Access
123 Last Modification: 2007-10-25 16:23:51 ==>Last Modification 120 Last Modification: 2007-10-25 16:23:51 ==>Last Modification
124 Expires: 2999-12-28 23:59:59 ==> Expires 121 Expires: 2999-12-28 23:59:59 ==> Expires
125 Attachment Description: ==> Attachment Description 122 Attachment Description: ==> Attachment Description
126 Attachment: ==> Attachment 123 Attachment: ==> Attachment
127*/ 124*/
128 // recordLabelRegexp = new RegExp("(^\\[(.*)\\]\\n|^Title:\s*(.*)\\n)"); 125 // recordLabelRegexp = new RegExp("(^\\[(.*)\\]\\n|^Title:\s*(.*)\\n)");
129 recordLabelRegexp = new RegExp("^\\[(.*)\\]\\n|^Title:\s*(.*)\\n"); 126 recordLabelRegexp = new RegExp("^\\[(.*)\\]\\n|^Title:\s*(.*)\\n");
130 fieldLabelRegexp = new RegExp("^\s?(Group|Group Tree|Username|UserName|User Name|Url|URL|Password|Notes|Comment|UUID|Icon|Creation Time|Last Access|Last Modification|Expires|Attachment Description|Attachment|Valid until): "); 127 fieldLabelRegexp = new RegExp("^\s?(Group|Group Tree|Username|UserName|User Name|Url|URL|Password|Notes|Comment|UUID|Icon|Creation Time|Last Access|Last Modification|Expires|Attachment Description|Attachment|Valid until): ");
131 fieldValueRegexp = new RegExp("(.*)(\\n|$)"); 128 fieldValueRegexp = new RegExp("(.*)(\\n|$)");
132 fullLineRegexp = new RegExp("^(.*\\n)"); 129 fullLineRegexp = new RegExp("^(.*\\n)");
133 130
134 if (recordLabelRegexp.test(aContext.line) == true) { 131 if (recordLabelRegexp.test(aContext.line) == true) {
135 var line; 132 var line;
136 133
137 line = aContext.line; 134 line = aContext.line;
138 135
139 result = {}; 136 result = {};
140 result['Title'] = line.match(recordLabelRegexp)[1]; 137 result['Title'] = line.match(recordLabelRegexp)[1];
141 line = line.replace(/^.*\n/, ""); 138 line = line.replace(/^.*\n/, "");
142 while (fieldLabelRegexp.test(line) == true) { 139 while (fieldLabelRegexp.test(line) == true) {
143 var fieldName; 140 var fieldName;
144 var fieldValue; 141 var fieldValue;
145 142
146 fieldName = RegExp.$1; 143 fieldName = RegExp.$1;
147 line = RegExp.rightContext; 144 line = RegExp.rightContext;
148 145
149 fieldValue = line.match(fieldValueRegexp)[1]; 146 fieldValue = line.match(fieldValueRegexp)[1];
150 line = RegExp.rightContext; 147 line = RegExp.rightContext;
151 148
152 if (fieldName == 'Notes') { 149 if (fieldName == 'Notes') {
153 var isMultiline; 150 var isMultiline;
154 151
155 isMultiline = false; 152 isMultiline = false;
156 153
157 if ((line != "") && (fieldLabelRegexp.test(line) == false) && (recordLabelRegexp.test(line) == false)) { 154 if ((line != "") && (fieldLabelRegexp.test(line) == false) && (recordLabelRegexp.test(line) == false)) {
158 fieldValue += '\n'; 155 fieldValue += '\n';
159 } 156 }
160 157
161 while ((line != "") && (fieldLabelRegexp.test(line) == false) && (recordLabelRegexp.test(line) == false)) { 158 while ((line != "") && (fieldLabelRegexp.test(line) == false) && (recordLabelRegexp.test(line) == false)) {
162 var newLineValue; 159 var newLineValue;
163 160
164 newLineValue = line.match(fullLineRegexp)[1]; 161 newLineValue = line.match(fullLineRegexp)[1];
165 if (newLineValue != "\n") { 162 if (newLineValue != "\n") {
166 isMultiline = true; 163 isMultiline = true;
167 } 164 }
168 fieldValue += newLineValue; 165 fieldValue += newLineValue;
169 line = RegExp.rightContext; 166 line = RegExp.rightContext;
170 } 167 }
171 168
172 if (isMultiline) { 169 if (isMultiline) {
173 fieldValue = fieldValue.replace(/\n$/g, ""); 170 fieldValue = fieldValue.replace(/\n$/g, "");
174 } else { 171 } else {
175 fieldValue = fieldValue.replace(/\n\n$/g, ""); 172 fieldValue = fieldValue.replace(/\n\n$/g, "");
176 } 173 }
177 174
178 line = line.replace(/^\n/, ''); 175 line = line.replace(/^\n/, '');
179 } 176 }
180 177
181 result[fieldName] = fieldValue; 178 result[fieldName] = fieldValue;
182 } 179 }
183 } else { 180 } else {
184 result = null; 181 result = null;
185 } 182 }
186 183
187 aContext.line = line; 184 aContext.line = line;
188 185
189 return result; 186 return result;
190 }, 187 },
191 188
192 //------------------------------------------------------------------------- 189 //-------------------------------------------------------------------------
193 __syntaxFix__: "syntax fix" 190 __syntaxFix__: "syntax fix"
194}); 191});
195 192
196 193
diff --git a/frontend/gamma/js/Clipperz/KeyValueObjectStore.js b/frontend/gamma/js/Clipperz/KeyValueObjectStore.js
index 04beb85..36cda88 100644
--- a/frontend/gamma/js/Clipperz/KeyValueObjectStore.js
+++ b/frontend/gamma/js/Clipperz/KeyValueObjectStore.js
@@ -1,176 +1,173 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
30 27
31//############################################################################# 28//#############################################################################
32 29
33Clipperz.KeyValueObjectStore = function(args) { 30Clipperz.KeyValueObjectStore = function(args) {
34 args = args || {}; 31 args = args || {};
35 32
36 //this._name = args['name'] || "unnamed KeyValueObjectStore"; 33 //this._name = args['name'] || "unnamed KeyValueObjectStore";
37 this._values = args['values'] || {}; 34 this._values = args['values'] || {};
38 //this._referenceObjectStore = null; 35 //this._referenceObjectStore = null;
39//console.log("new KeyValueObjectStore", args, this._values); 36//console.log("new KeyValueObjectStore", args, this._values);
40 37
41 return this; 38 return this;
42} 39}
43 40
44Clipperz.KeyValueObjectStore.prototype = MochiKit.Base.update(null, { 41Clipperz.KeyValueObjectStore.prototype = MochiKit.Base.update(null, {
45 42
46 'values': function() { 43 'values': function() {
47 return this._values; 44 return this._values;
48 }, 45 },
49 46
50 'initWithValues': function (someValues) { 47 'initWithValues': function (someValues) {
51 this._values = Clipperz.Base.deepClone(someValues) || {}; 48 this._values = Clipperz.Base.deepClone(someValues) || {};
52 return this; 49 return this;
53 }, 50 },
54 51
55 'setValues': function (someValues) { 52 'setValues': function (someValues) {
56//console.log("KeyValueObjectStore.setValues", someValues); 53//console.log("KeyValueObjectStore.setValues", someValues);
57 this._values = someValues; 54 this._values = someValues;
58 return this; 55 return this;
59 }, 56 },
60 57
61 //'initWithObjectStore': function (anObjectStore) { 58 //'initWithObjectStore': function (anObjectStore) {
62 // this._referenceObjectStore = anObjectStore; 59 // this._referenceObjectStore = anObjectStore;
63 //}, 60 //},
64 61
65 'removeAllData': function () { 62 'removeAllData': function () {
66 this._values = {}; 63 this._values = {};
67 }, 64 },
68 65
69 //------------------------------------------------------------------------- 66 //-------------------------------------------------------------------------
70 67
71 'getValue': function(aKeyPath) { 68 'getValue': function(aKeyPath) {
72 var result; 69 var result;
73 var keys; 70 var keys;
74 var i,c; 71 var i,c;
75 72
76 result = this.values(); 73 result = this.values();
77 74
78 keys = (aKeyPath + '').split('.'); 75 keys = (aKeyPath + '').split('.');
79 c = keys.length; 76 c = keys.length;
80 i = 0; 77 i = 0;
81 78
82 while ((i<c) && (result != null)) { 79 while ((i<c) && (result != null)) {
83 if (typeof result[keys[i]] != 'undefined') { 80 if (typeof result[keys[i]] != 'undefined') {
84 result = result[keys[i]]; 81 result = result[keys[i]];
85 } else { 82 } else {
86 result = null; 83 result = null;
87 } 84 }
88 85
89 i++; 86 i++;
90 } 87 }
91 88
92 return result; 89 return result;
93 }, 90 },
94 91
95 //------------------------------------------------------------------------- 92 //-------------------------------------------------------------------------
96 93
97 'setValue': function(aKeyPath, aValue) { 94 'setValue': function(aKeyPath, aValue) {
98 var targetObject; 95 var targetObject;
99 var keys; 96 var keys;
100 var i,c; 97 var i,c;
101 98
102//console.log(">>> KeyValueObjectStore.setValue", this, this.values(), aKeyPath, aValue); 99//console.log(">>> KeyValueObjectStore.setValue", this, this.values(), aKeyPath, aValue);
103 targetObject = this.values(); 100 targetObject = this.values();
104 keys = (aKeyPath + '').split('.'); 101 keys = (aKeyPath + '').split('.');
105 c = keys.length - 1; 102 c = keys.length - 1;
106 for (i=0; i<c; i++) { 103 for (i=0; i<c; i++) {
107//console.log("--- KeyValueObjectStore.setValue", i, targetObject, keys[i]); 104//console.log("--- KeyValueObjectStore.setValue", i, targetObject, keys[i]);
108 if (typeof targetObject[keys[i]] == 'undefined') { 105 if (typeof targetObject[keys[i]] == 'undefined') {
109 targetObject[keys[i]] = {} 106 targetObject[keys[i]] = {}
110 } 107 }
111 108
112 targetObject = targetObject[keys[i]]; 109 targetObject = targetObject[keys[i]];
113 } 110 }
114 111
115 targetObject[keys[c]] = aValue; 112 targetObject[keys[c]] = aValue;
116//console.log("<<< KeyValueObjectStore.setValue"); 113//console.log("<<< KeyValueObjectStore.setValue");
117 114
118 return aValue; 115 return aValue;
119 }, 116 },
120 117
121 //------------------------------------------------------------------------- 118 //-------------------------------------------------------------------------
122 119
123 'removeValue': function (aKeyPath) { 120 'removeValue': function (aKeyPath) {
124 // this.setValue(aKeyPath, null); 121 // this.setValue(aKeyPath, null);
125 122
126 var targetObject; 123 var targetObject;
127 var keys; 124 var keys;
128 var i,c; 125 var i,c;
129 126
130 targetObject = this.values(); 127 targetObject = this.values();
131 keys = ('' + aKeyPath).split('.'); 128 keys = ('' + aKeyPath).split('.');
132 c = keys.length - 1; 129 c = keys.length - 1;
133 for (i=0; i<c; i++) { 130 for (i=0; i<c; i++) {
134 if (typeof targetObject[keys[i]] == 'undefined') { 131 if (typeof targetObject[keys[i]] == 'undefined') {
135 targetObject[keys[i]] = {} 132 targetObject[keys[i]] = {}
136 } 133 }
137 134
138 targetObject = targetObject[keys[i]]; 135 targetObject = targetObject[keys[i]];
139 } 136 }
140 137
141 delete targetObject[keys[c]]; 138 delete targetObject[keys[c]];
142 }, 139 },
143 140
144 //------------------------------------------------------------------------- 141 //-------------------------------------------------------------------------
145 142
146 'deferredGetOrSet': function(aKeyPath, aGetterFunction) { 143 'deferredGetOrSet': function(aKeyPath, aGetterFunction) {
147 var deferredResult; 144 var deferredResult;
148 145
149 if (this.getValue(aKeyPath) != null) { 146 if (this.getValue(aKeyPath) != null) {
150 deferredResult = MochiKit.Async.succeed(this.getValue(aKeyPath)); 147 deferredResult = MochiKit.Async.succeed(this.getValue(aKeyPath));
151 } else { 148 } else {
152 deferredResult = new Clipperz.Async.Deferred("KeyValueObjectStore.deferredGetOrSet [" + aKeyPath + "]", {trace:false}); 149 deferredResult = new Clipperz.Async.Deferred("KeyValueObjectStore.deferredGetOrSet [" + aKeyPath + "]", {trace:false});
153 150
154 deferredResult.addCallback(aGetterFunction); 151 deferredResult.addCallback(aGetterFunction);
155 deferredResult.addMethod(this, 'setValue', aKeyPath); 152 deferredResult.addMethod(this, 'setValue', aKeyPath);
156 deferredResult.callback(); 153 deferredResult.callback();
157 } 154 }
158 155
159 return deferredResult; 156 return deferredResult;
160 }, 157 },
161 158
162 //------------------------------------------------------------------------- 159 //-------------------------------------------------------------------------
163 160
164 'isEmpty': function () { 161 'isEmpty': function () {
165 return (MochiKit.Base.keys(this.values()).length == 0) 162 return (MochiKit.Base.keys(this.values()).length == 0)
166 }, 163 },
167 164
168 //------------------------------------------------------------------------- 165 //-------------------------------------------------------------------------
169/* 166/*
170 'dumpData': function () { 167 'dumpData': function () {
171 return Clipperz.Base.serializeJSON(this.values()); 168 return Clipperz.Base.serializeJSON(this.values());
172 }, 169 },
173*/ 170*/
174 //------------------------------------------------------------------------- 171 //-------------------------------------------------------------------------
175 __syntaxFix__: "syntax fix" 172 __syntaxFix__: "syntax fix"
176}); 173});
diff --git a/frontend/gamma/js/Clipperz/Logging.js b/frontend/gamma/js/Clipperz/Logging.js
index d6c107e..77a0896 100644
--- a/frontend/gamma/js/Clipperz/Logging.js
+++ b/frontend/gamma/js/Clipperz/Logging.js
@@ -1,42 +1,39 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz'); 26Clipperz.Base.module('Clipperz');
30 27
31if (typeof console == 'undefined') { 28if (typeof console == 'undefined') {
32 Clipperz.log = MochiKit.Logging.logDebug; 29 Clipperz.log = MochiKit.Logging.logDebug;
33// Safari/WebKit 4 30// Safari/WebKit 4
34} else if (navigator.userAgent.match(/WebKit/)) { 31} else if (navigator.userAgent.match(/WebKit/)) {
35 //Clipperz.log = console.log; 32 //Clipperz.log = console.log;
36 Clipperz.log = MochiKit.Logging.logDebug; 33 Clipperz.log = MochiKit.Logging.logDebug;
37} else if (navigator.userAgent.match(/Gecko/)) { 34} else if (navigator.userAgent.match(/Gecko/)) {
38 Clipperz.log = function () { 35 Clipperz.log = function () {
39 // firebug 1.3 bug see http://code.google.com/p/fbug/issues/detail?id=1347 36 // firebug 1.3 bug see http://code.google.com/p/fbug/issues/detail?id=1347
40 console.log.apply(window._firebug, arguments); 37 console.log.apply(window._firebug, arguments);
41 }; 38 };
42} \ No newline at end of file 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 789d6b8..897beed 100644
--- a/frontend/gamma/js/Clipperz/PM/BookmarkletProcessor.js
+++ b/frontend/gamma/js/Clipperz/PM/BookmarkletProcessor.js
@@ -1,196 +1,193 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29/* 26/*
30if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 27if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
31if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } 28if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
32 29
33Clipperz.PM.BookmarkletProcessor = function(aConfiguration) { 30Clipperz.PM.BookmarkletProcessor = function(aConfiguration) {
34 this._configuration = aConfiguration; 31 this._configuration = aConfiguration;
35 32
36 this._editableFields = null; 33 this._editableFields = null;
37 this._favicon = null; 34 this._favicon = null;
38 35
39 return this; 36 return this;
40} 37}
41 38
42Clipperz.PM.BookmarkletProcessor.prototype = MochiKit.Base.update(null, { 39Clipperz.PM.BookmarkletProcessor.prototype = MochiKit.Base.update(null, {
43 40
44 'toString': function() { 41 'toString': function() {
45 return "Clipperz.PM.BookmarkletProcessor"; 42 return "Clipperz.PM.BookmarkletProcessor";
46 }, 43 },
47 44
48 //------------------------------------------------------------------------- 45 //-------------------------------------------------------------------------
49 46
50 'configuration': function() { 47 'configuration': function() {
51 return this._configuration; 48 return this._configuration;
52 }, 49 },
53 50
54 //------------------------------------------------------------------------- 51 //-------------------------------------------------------------------------
55 52
56 'pageTitle': function() { 53 'pageTitle': function() {
57 return this.configuration().page.title; 54 return this.configuration().page.title;
58 }, 55 },
59 56
60 //------------------------------------------------------------------------- 57 //-------------------------------------------------------------------------
61 58
62 'fields': function() { 59 'fields': function() {
63 return this.configuration().form.inputs; 60 return this.configuration().form.inputs;
64 }, 61 },
65 62
66 //------------------------------------------------------------------------- 63 //-------------------------------------------------------------------------
67 64
68 'editableFields': function() { 65 'editableFields': function() {
69 if (this._editableFields == null) { 66 if (this._editableFields == null) {
70 this._editableFields = MochiKit.Base.filter(function(aField) { 67 this._editableFields = MochiKit.Base.filter(function(aField) {
71 var result; 68 var result;
72 var type; 69 var type;
73 70
74 type = aField['type'].toLowerCase(); 71 type = aField['type'].toLowerCase();
75 result = ((type != 'hidden') && (type != 'submit') && (type != 'checkbox') && (type != 'radio') && (type != 'select')); 72 result = ((type != 'hidden') && (type != 'submit') && (type != 'checkbox') && (type != 'radio') && (type != 'select'));
76 73
77 return result; 74 return result;
78 }, this.fields()) 75 }, this.fields())
79 } 76 }
80 77
81 return this._editableFields; 78 return this._editableFields;
82 }, 79 },
83 80
84 //------------------------------------------------------------------------- 81 //-------------------------------------------------------------------------
85 82
86 'hostname': function() { 83 'hostname': function() {
87 if (this._hostname == null) { 84 if (this._hostname == null) {
88 var actionUrl; 85 var actionUrl;
89 86
90 actionUrl = this.configuration()['form']['attributes']['action']; 87 actionUrl = this.configuration()['form']['attributes']['action'];
91 this._hostname = actionUrl.replace(/ ^ h t t p s ? : \ / \ / ( [ ^ \ / ] * ) \ / . * /, '$1'); 88 this._hostname = actionUrl.replace(/ ^ h t t p s ? : \ / \ / ( [ ^ \ / ] * ) \ / . * /, '$1');
92 } 89 }
93 90
94 return this._hostname; 91 return this._hostname;
95 }, 92 },
96 93
97 'favicon': function() { 94 'favicon': function() {
98 if (this._favicon == null) { 95 if (this._favicon == null) {
99 this._favicon = "http://" + this.hostname() + "/favicon.ico"; 96 this._favicon = "http://" + this.hostname() + "/favicon.ico";
100 } 97 }
101 98
102 return this._favicon; 99 return this._favicon;
103 }, 100 },
104 101
105 //------------------------------------------------------------------------- 102 //-------------------------------------------------------------------------
106 __syntaxFix__: "syntax fix" 103 __syntaxFix__: "syntax fix"
107}); 104});
108 105
109//############################################################################# 106//#############################################################################
110/ * 107/ *
111Clipperz.PM.BookmarkletProcessor.createRecordFromBookmarkletConfiguration = function(anUser, aConfiguration) { 108Clipperz.PM.BookmarkletProcessor.createRecordFromBookmarkletConfiguration = function(anUser, aConfiguration) {
112 var processor; 109 var processor;
113 var record; 110 var record;
114 var recordVersion; 111 var recordVersion;
115 var directLogin; 112 var directLogin;
116 var bindings; 113 var bindings;
117 var i,c; 114 var i,c;
118 115
119 processor = new Clipperz.PM.BookmarkletProcessor(aConfiguration); 116 processor = new Clipperz.PM.BookmarkletProcessor(aConfiguration);
120 117
121 record = new Clipperz.PM.DataModel.Record({ 118 record = new Clipperz.PM.DataModel.Record({
122 'label':processor.pageTitle(), 119 'label':processor.pageTitle(),
123 'notes':"", 120 'notes':"",
124 'user': anUser 121 'user': anUser
125 }); 122 });
126 recordVersion = new Clipperz.PM.DataModel.Record.Version(record, {}) 123 recordVersion = new Clipperz.PM.DataModel.Record.Version(record, {})
127 record.setCurrentVersion(recordVersion); 124 record.setCurrentVersion(recordVersion);
128 125
129 bindings = {}; 126 bindings = {};
130 127
131 c = processor.editableFields().length; 128 c = processor.editableFields().length;
132 for (i=0; i<c; i++) { 129 for (i=0; i<c; i++) {
133 var formField; 130 var formField;
134 var recordField; 131 var recordField;
135 132
136 formField = processor.editableFields()[i]; 133 formField = processor.editableFields()[i];
137 recordField = new Clipperz.PM.DataModel.RecordField({ 134 recordField = new Clipperz.PM.DataModel.RecordField({
138 'label':formField['name'], 135 'label':formField['name'],
139 'value':formField['value'], 136 'value':formField['value'],
140 'type': Clipperz.PM.Strings.inputTypeToRecordFieldType[formField['type']], 137 'type': Clipperz.PM.Strings.inputTypeToRecordFieldType[formField['type']],
141 'hidden': false, 138 'hidden': false,
142 'recordVersion':recordVersion 139 'recordVersion':recordVersion
143 }); 140 });
144 recordVersion.addField(recordField); 141 recordVersion.addField(recordField);
145 142
146 bindings[formField['name']] = recordField.key(); 143 bindings[formField['name']] = recordField.key();
147 } 144 }
148 145
149 directLogin = new Clipperz.PM.DataModel.DirectLogin({ 146 directLogin = new Clipperz.PM.DataModel.DirectLogin({
150 'record': record, 147 'record': record,
151 'label': processor.pageTitle(), 148 'label': processor.pageTitle(),
152 'favicon': processor.favicon(), 149 'favicon': processor.favicon(),
153 'formData': processor.configuration()['form'], 150 'formData': processor.configuration()['form'],
154 'bindingData':bindings, 151 'bindingData':bindings,
155 'bookmarkletVersion':'0.2' 152 'bookmarkletVersion':'0.2'
156 }); 153 });
157 record.addDirectLogin(directLogin); 154 record.addDirectLogin(directLogin);
158 155
159 anUser.addRecord(record); 156 anUser.addRecord(record);
160 157
161 return record; 158 return record;
162}; 159};
163* / 160* /
164//----------------------------------------------------------------------------- 161//-----------------------------------------------------------------------------
165 162
166Clipperz.PM.BookmarkletProcessor.sanitizeBookmarkletConfiguration = function(aConfiguration) { 163Clipperz.PM.BookmarkletProcessor.sanitizeBookmarkletConfiguration = function(aConfiguration) {
167 var result; 164 var result;
168 165
169 //throw "XSS Bookmarklet attempt"; 166 //throw "XSS Bookmarklet attempt";
170 167
171 result = aConfiguration; 168 result = aConfiguration;
172 169
173 return result; 170 return result;
174}; 171};
175 172
176//----------------------------------------------------------------------------- 173//-----------------------------------------------------------------------------
177 174
178Clipperz.PM.BookmarkletProcessor.checkBookmarkletConfiguration = function(aConfiguration) { 175Clipperz.PM.BookmarkletProcessor.checkBookmarkletConfiguration = function(aConfiguration) {
179 var result; 176 var result;
180 177
181 try { 178 try {
182 result = Clipperz.Base.evalJSON(aConfiguration); 179 result = Clipperz.Base.evalJSON(aConfiguration);
183 result = Clipperz.PM.BookmarkletProcessor.sanitizeBookmarkletConfiguration(result); 180 result = Clipperz.PM.BookmarkletProcessor.sanitizeBookmarkletConfiguration(result);
184 181
185 if (result['version'] != '0.2.3') { 182 if (result['version'] != '0.2.3') {
186 throw "WrongBookmarkletVersion"; 183 throw "WrongBookmarkletVersion";
187 } 184 }
188 } catch (exception) { 185 } catch (exception) {
189 throw exception; 186 throw exception;
190 } 187 }
191 188
192 return result; 189 return result;
193}; 190};
194 191
195//----------------------------------------------------------------------------- 192//-----------------------------------------------------------------------------
196*/ \ No newline at end of file 193*/ \ No newline at end of file
diff --git a/frontend/gamma/js/Clipperz/PM/Connection.js b/frontend/gamma/js/Clipperz/PM/Connection.js
index 6e58c60..b4e8aaa 100644
--- a/frontend/gamma/js/Clipperz/PM/Connection.js
+++ b/frontend/gamma/js/Clipperz/PM/Connection.js
@@ -1,408 +1,405 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
30if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } 27if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
31 28
32//----------------------------------------------------------------------------- 29//-----------------------------------------------------------------------------
33// 30//
34 // Abstract C O N N E C T I O N class 31 // Abstract C O N N E C T I O N class
35// 32//
36//----------------------------------------------------------------------------- 33//-----------------------------------------------------------------------------
37 34
38Clipperz.PM.Connection = function (args) { 35Clipperz.PM.Connection = function (args) {
39 args = args || {}; 36 args = args || {};
40 37
41 this._proxy = args.proxy || Clipperz.PM.Proxy.defaultProxy; 38 this._proxy = args.proxy || Clipperz.PM.Proxy.defaultProxy;
42 this._getCredentialsFunction = args.getCredentialsFunction; 39 this._getCredentialsFunction = args.getCredentialsFunction;
43 40
44 this._clipperz_pm_crypto_version = null; 41 this._clipperz_pm_crypto_version = null;
45 this._connectionId = null; 42 this._connectionId = null;
46 this._sharedSecret = null; 43 this._sharedSecret = null;
47 44
48 return this; 45 return this;
49} 46}
50 47
51Clipperz.PM.Connection.prototype = MochiKit.Base.update(null, { 48Clipperz.PM.Connection.prototype = MochiKit.Base.update(null, {
52 49
53 'toString': function() { 50 'toString': function() {
54 return "Connection [" + this.version() + "]"; 51 return "Connection [" + this.version() + "]";
55 }, 52 },
56 53
57 //========================================================================= 54 //=========================================================================
58 55
59 'version': function() { 56 'version': function() {
60 throw Clipperz.Base.exception.AbstractMethod; 57 throw Clipperz.Base.exception.AbstractMethod;
61 }, 58 },
62 59
63 'clipperz_pm_crypto_version': function() { 60 'clipperz_pm_crypto_version': function() {
64 if (this._clipperz_pm_crypto_version == null) { 61 if (this._clipperz_pm_crypto_version == null) {
65 var connectionVersions; 62 var connectionVersions;
66 varversions; 63 varversions;
67 varversion; 64 varversion;
68 var i, c; 65 var i, c;
69 66
70 version = null; 67 version = null;
71 connectionVersions = Clipperz.PM.Connection.communicationProtocol.versions; 68 connectionVersions = Clipperz.PM.Connection.communicationProtocol.versions;
72 versions = MochiKit.Base.keys(connectionVersions); 69 versions = MochiKit.Base.keys(connectionVersions);
73 c = versions.length; 70 c = versions.length;
74 for (i=0; i<c; i++) { 71 for (i=0; i<c; i++) {
75 if (! (versions[i] == 'current')) { 72 if (! (versions[i] == 'current')) {
76 if (this instanceof connectionVersions[versions[i]]) { 73 if (this instanceof connectionVersions[versions[i]]) {
77 version = versions[i]; 74 version = versions[i];
78 }; 75 };
79 } 76 }
80 } 77 }
81 78
82 this._clipperz_pm_crypto_version = version; 79 this._clipperz_pm_crypto_version = version;
83 } 80 }
84 81
85 return this._clipperz_pm_crypto_version; 82 return this._clipperz_pm_crypto_version;
86 }, 83 },
87 84
88 //------------------------------------------------------------------------- 85 //-------------------------------------------------------------------------
89 86
90 'defaultErrorHandler': function(anErrorString, anException) { 87 'defaultErrorHandler': function(anErrorString, anException) {
91MochiKit.Logging.logError("### Connection.defaultErrorHandler: " + anErrorString + " (" + anException + ")"); 88MochiKit.Logging.logError("### Connection.defaultErrorHandler: " + anErrorString + " (" + anException + ")");
92 }, 89 },
93 90
94 //------------------------------------------------------------------------- 91 //-------------------------------------------------------------------------
95 92
96 'getCredentialsFunction': function () { 93 'getCredentialsFunction': function () {
97 return this._getCredentialsFunction; 94 return this._getCredentialsFunction;
98 }, 95 },
99 96
100 'normalizedCredentials': function(someValues) { 97 'normalizedCredentials': function(someValues) {
101 throw Clipperz.Base.exception.AbstractMethod; 98 throw Clipperz.Base.exception.AbstractMethod;
102 }, 99 },
103 100
104 //========================================================================= 101 //=========================================================================
105 102
106 'proxy': function () { 103 'proxy': function () {
107 return this._proxy; 104 return this._proxy;
108 }, 105 },
109 106
110 //========================================================================= 107 //=========================================================================
111 108
112 'register': function () { 109 'register': function () {
113 throw Clipperz.Base.exception.AbstractMethod; 110 throw Clipperz.Base.exception.AbstractMethod;
114 }, 111 },
115 112
116 'login': function() { 113 'login': function() {
117 throw Clipperz.Base.exception.AbstractMethod; 114 throw Clipperz.Base.exception.AbstractMethod;
118 }, 115 },
119 116
120 //------------------------------------------------------------------------- 117 //-------------------------------------------------------------------------
121 118
122 'message': function(someArguments, aCallback) { 119 'message': function(someArguments, aCallback) {
123 throw Clipperz.Base.exception.AbstractMethod; 120 throw Clipperz.Base.exception.AbstractMethod;
124 }, 121 },
125 122
126 //------------------------------------------------------------------------- 123 //-------------------------------------------------------------------------
127 124
128 'serverSideUserCredentials': function() { 125 'serverSideUserCredentials': function() {
129 throw Clipperz.Base.exception.AbstractMethod; 126 throw Clipperz.Base.exception.AbstractMethod;
130 }, 127 },
131 128
132 //========================================================================= 129 //=========================================================================
133 130
134 'sharedSecret': function () { 131 'sharedSecret': function () {
135 return this._sharedSecret; 132 return this._sharedSecret;
136 }, 133 },
137 134
138 'setSharedSecret': function (aValue) { 135 'setSharedSecret': function (aValue) {
139 this._sharedSecret = aValue; 136 this._sharedSecret = aValue;
140 }, 137 },
141 138
142 //------------------------------------------------------------------------- 139 //-------------------------------------------------------------------------
143 140
144 'connectionId': function() { 141 'connectionId': function() {
145 return this._connectionId; 142 return this._connectionId;
146 }, 143 },
147 144
148 'setConnectionId': function(aValue) { 145 'setConnectionId': function(aValue) {
149 this._connectionId = aValue; 146 this._connectionId = aValue;
150 }, 147 },
151 148
152 //========================================================================= 149 //=========================================================================
153/* 150/*
154 //TODO: ????? 151 //TODO: ?????
155 'oneTimePassword': function() { 152 'oneTimePassword': function() {
156 return this._oneTimePassword; 153 return this._oneTimePassword;
157 }, 154 },
158 155
159 'setOneTimePassword': function(aValue) { 156 'setOneTimePassword': function(aValue) {
160 this._oneTimePassword = aValue; 157 this._oneTimePassword = aValue;
161 }, 158 },
162*/ 159*/
163 //========================================================================= 160 //=========================================================================
164 161
165 'reset': function() { 162 'reset': function() {
166 this.setSharedSecret(null); 163 this.setSharedSecret(null);
167 this.setConnectionId(null); 164 this.setConnectionId(null);
168 }, 165 },
169 166
170 //========================================================================= 167 //=========================================================================
171 __syntaxFix__: "syntax fix" 168 __syntaxFix__: "syntax fix"
172 169
173} 170}
174); 171);
175 172
176 173
177if (typeof(Clipperz.PM.Connection.SRP) == 'undefined') { Clipperz.PM.Connection.SRP = {}; } 174if (typeof(Clipperz.PM.Connection.SRP) == 'undefined') { Clipperz.PM.Connection.SRP = {}; }
178//----------------------------------------------------------------------------- 175//-----------------------------------------------------------------------------
179// 176//
180 // S R P [ 1 . 0 ] C O N N E C T I O N class 177 // S R P [ 1 . 0 ] C O N N E C T I O N class
181// 178//
182//----------------------------------------------------------------------------- 179//-----------------------------------------------------------------------------
183 180
184Clipperz.PM.Connection.SRP['1.0'] = function (args) { 181Clipperz.PM.Connection.SRP['1.0'] = function (args) {
185 Clipperz.PM.Connection.call(this, args); 182 Clipperz.PM.Connection.call(this, args);
186 183
187 return this; 184 return this;
188} 185}
189 186
190Clipperz.PM.Connection.SRP['1.0'].prototype = MochiKit.Base.update(new Clipperz.PM.Connection(), { 187Clipperz.PM.Connection.SRP['1.0'].prototype = MochiKit.Base.update(new Clipperz.PM.Connection(), {
191 188
192 'version': function() { 189 'version': function() {
193 return '1.0'; 190 return '1.0';
194 }, 191 },
195 192
196 //========================================================================= 193 //=========================================================================
197 194
198 'register': function (someUserData) { 195 'register': function (someUserData) {
199 vardeferredResult; 196 vardeferredResult;
200 var cryptoVersion; 197 var cryptoVersion;
201 var srpConnection; 198 var srpConnection;
202 199
203 cryptoVersion = this.clipperz_pm_crypto_version(); 200 cryptoVersion = this.clipperz_pm_crypto_version();
204 201
205 deferredResult = new Clipperz.Async.Deferred("Connection.registerWithVersion", {trace:false}); 202 deferredResult = new Clipperz.Async.Deferred("Connection.registerWithVersion", {trace:false});
206 deferredResult.collectResults({ 203 deferredResult.collectResults({
207 'credentials': [ 204 'credentials': [
208 this.getCredentialsFunction(), 205 this.getCredentialsFunction(),
209 MochiKit.Base.method(this, 'normalizedCredentials'), 206 MochiKit.Base.method(this, 'normalizedCredentials'),
210 MochiKit.Base.bind(function(someCredentials) { 207 MochiKit.Base.bind(function(someCredentials) {
211 var srpConnection; 208 var srpConnection;
212 var result; 209 var result;
213 210
214 srpConnection = new Clipperz.Crypto.SRP.Connection({ C:someCredentials['username'], P:someCredentials['password'], hash:this.hash() }); 211 srpConnection = new Clipperz.Crypto.SRP.Connection({ C:someCredentials['username'], P:someCredentials['password'], hash:this.hash() });
215 result = srpConnection.serverSideCredentials(); 212 result = srpConnection.serverSideCredentials();
216 result['version'] = Clipperz.PM.Connection.communicationProtocol.currentVersion; 213 result['version'] = Clipperz.PM.Connection.communicationProtocol.currentVersion;
217 214
218 return result; 215 return result;
219 }, this) 216 }, this)
220 ], 217 ],
221 'user': MochiKit.Base.partial(MochiKit.Async.succeed, someUserData), 218 'user': MochiKit.Base.partial(MochiKit.Async.succeed, someUserData),
222 'version':MochiKit.Base.partial(MochiKit.Async.succeed, Clipperz.PM.Connection.communicationProtocol.currentVersion), 219 'version':MochiKit.Base.partial(MochiKit.Async.succeed, Clipperz.PM.Connection.communicationProtocol.currentVersion),
223 'message':MochiKit.Base.partial(MochiKit.Async.succeed, 'completeRegistration') 220 'message':MochiKit.Base.partial(MochiKit.Async.succeed, 'completeRegistration')
224 }); 221 });
225 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress'); 222 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
226 deferredResult.addMethod(this.proxy(), 'registration'); 223 deferredResult.addMethod(this.proxy(), 'registration');
227 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress'); 224 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
228 225
229 deferredResult.callback(); 226 deferredResult.callback();
230 227
231 return deferredResult; 228 return deferredResult;
232 }, 229 },
233 230
234 //------------------------------------------------------------------------- 231 //-------------------------------------------------------------------------
235 232
236 'updateCredentials': function (aUsername, aPassphrase, someUserData) { 233 'updateCredentials': function (aUsername, aPassphrase, someUserData) {
237 vardeferredResult; 234 vardeferredResult;
238 235
239 deferredResult = new Clipperz.Async.Deferred("Connection.updateCredentials", {trace:false}); 236 deferredResult = new Clipperz.Async.Deferred("Connection.updateCredentials", {trace:false});
240 deferredResult.collectResults({ 237 deferredResult.collectResults({
241 'credentials': [ 238 'credentials': [
242 MochiKit.Base.method(this, 'normalizedCredentials', {username:aUsername, password:aPassphrase}), 239 MochiKit.Base.method(this, 'normalizedCredentials', {username:aUsername, password:aPassphrase}),
243 MochiKit.Base.bind(function(someCredentials) { 240 MochiKit.Base.bind(function(someCredentials) {
244 var srpConnection; 241 var srpConnection;
245 var result; 242 var result;
246 243
247 srpConnection = new Clipperz.Crypto.SRP.Connection({ C:someCredentials['username'], P:someCredentials['password'], hash:this.hash() }); 244 srpConnection = new Clipperz.Crypto.SRP.Connection({ C:someCredentials['username'], P:someCredentials['password'], hash:this.hash() });
248 result = srpConnection.serverSideCredentials(); 245 result = srpConnection.serverSideCredentials();
249 result['version'] = Clipperz.PM.Connection.communicationProtocol.currentVersion; 246 result['version'] = Clipperz.PM.Connection.communicationProtocol.currentVersion;
250 247
251 return result; 248 return result;
252 }, this) 249 }, this)
253 ], 250 ],
254 'user': MochiKit.Base.partial(MochiKit.Async.succeed, someUserData) 251 'user': MochiKit.Base.partial(MochiKit.Async.succeed, someUserData)
255 }); 252 });
256 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress'); 253 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
257 deferredResult.addMethod(this, 'message', 'upgradeUserCredentials'); 254 deferredResult.addMethod(this, 'message', 'upgradeUserCredentials');
258 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress'); 255 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
259 deferredResult.callback(); 256 deferredResult.callback();
260 257
261 return deferredResult; 258 return deferredResult;
262 259
263 }, 260 },
264 261
265 //========================================================================= 262 //=========================================================================
266 263
267 'redeemOneTimePassword': function (someParameters) { 264 'redeemOneTimePassword': function (someParameters) {
268//console.log("Connections.redeemOneTimePassword", someParameters['username'], someParameters['password']); 265//console.log("Connections.redeemOneTimePassword", someParameters['username'], someParameters['password']);
269/* 266/*
270 //========================================================================= 267 //=========================================================================
271 //LOGIN WITH PASSPHRASE, extracted from the TRUNK version (LoginPanel.js) 268 //LOGIN WITH PASSPHRASE, extracted from the TRUNK version (LoginPanel.js)
272 deferredResult.addCallback(function(anUsername, aOneTimePassword) { 269 deferredResult.addCallback(function(anUsername, aOneTimePassword) {
273 var args; 270 var args;
274 271
275 args = { 272 args = {
276 'message': 'oneTimePassword', 273 'message': 'oneTimePassword',
277 'version': Clipperz.PM.Crypto.communicationProtocol.currentVersion, 274 'version': Clipperz.PM.Crypto.communicationProtocol.currentVersion,
278 'parameters': { 275 'parameters': {
279 'oneTimePasswordKey': Clipperz.PM.DataModel.OneTimePassword.computeKeyWithUsernameAndPassword(anUsername, aOneTimePassword), 276 'oneTimePasswordKey': Clipperz.PM.DataModel.OneTimePassword.computeKeyWithUsernameAndPassword(anUsername, aOneTimePassword),
280 'oneTimePasswordKeyChecksum': Clipperz.PM.DataModel.OneTimePassword.computeKeyChecksumWithUsernameAndPassword(anUsername, aOneTimePassword) 277 'oneTimePasswordKeyChecksum': Clipperz.PM.DataModel.OneTimePassword.computeKeyChecksumWithUsernameAndPassword(anUsername, aOneTimePassword)
281 } 278 }
282 } 279 }
283 280
284 return args; 281 return args;
285 }, anUsername, oneTimePassword); 282 }, anUsername, oneTimePassword);
286 deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'OTP_login_loadingOTP'); 283 deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'OTP_login_loadingOTP');
287 deferredResult.addCallback(MochiKit.Base.method(Clipperz.PM.Proxy.defaultProxy, 'handshake')); 284 deferredResult.addCallback(MochiKit.Base.method(Clipperz.PM.Proxy.defaultProxy, 'handshake'));
288 deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'OTP_login_extractingPassphrase'); 285 deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'OTP_login_extractingPassphrase');
289 deferredResult.addCallback(function(aResult) { 286 deferredResult.addCallback(function(aResult) {
290 return Clipperz.PM.Crypto.deferredDecrypt(oneTimePassword, aResult['data'], aResult['version']); 287 return Clipperz.PM.Crypto.deferredDecrypt(oneTimePassword, aResult['data'], aResult['version']);
291 }); 288 });
292 deferredResult.addCallback(function(aResult) { 289 deferredResult.addCallback(function(aResult) {
293 return (new Clipperz.ByteArray().appendBase64String(aResult['passphrase'])).asString(); 290 return (new Clipperz.ByteArray().appendBase64String(aResult['passphrase'])).asString();
294 }); 291 });
295 deferredResult.addMethod(this, 'doLoginWithUsernameAndPassphrase', anUsername), 292 deferredResult.addMethod(this, 'doLoginWithUsernameAndPassphrase', anUsername),
296*/ 293*/
297 var args; 294 var args;
298 var normalizedOTP; 295 var normalizedOTP;
299 296
300 normalizedOTP = Clipperz.PM.DataModel.OneTimePassword.normalizedOneTimePassword(someParameters['password']); 297 normalizedOTP = Clipperz.PM.DataModel.OneTimePassword.normalizedOneTimePassword(someParameters['password']);
301 298
302 args = { 299 args = {
303 'message': 'oneTimePassword', 300 'message': 'oneTimePassword',
304 'version': Clipperz.PM.Connection.communicationProtocol.currentVersion, 301 'version': Clipperz.PM.Connection.communicationProtocol.currentVersion,
305 'parameters': { 302 'parameters': {
306 'oneTimePasswordKey': Clipperz.PM.DataModel.OneTimePassword.computeKeyWithUsernameAndPassword(someParameters['username'], normalizedOTP), 303 'oneTimePasswordKey': Clipperz.PM.DataModel.OneTimePassword.computeKeyWithUsernameAndPassword(someParameters['username'], normalizedOTP),
307 'oneTimePasswordKeyChecksum':Clipperz.PM.DataModel.OneTimePassword.computeKeyChecksumWithUsernameAndPassword(someParameters['username'], normalizedOTP) 304 'oneTimePasswordKeyChecksum':Clipperz.PM.DataModel.OneTimePassword.computeKeyChecksumWithUsernameAndPassword(someParameters['username'], normalizedOTP)
308 } 305 }
309 } 306 }
310 307
311 return Clipperz.Async.callbacks("Connction.redeemOTP", [ 308 return Clipperz.Async.callbacks("Connction.redeemOTP", [
312 MochiKit.Base.method(this.proxy(), 'handshake', args), 309 MochiKit.Base.method(this.proxy(), 'handshake', args),
313 function(aResult) { 310 function(aResult) {
314 return Clipperz.PM.Crypto.deferredDecrypt({ 311 return Clipperz.PM.Crypto.deferredDecrypt({
315 value:aResult['data'], 312 value:aResult['data'],
316 key:normalizedOTP, 313 key:normalizedOTP,
317 version:aResult['version'] 314 version:aResult['version']
318 }); 315 });
319 }, 316 },
320 function(aResult) { 317 function(aResult) {
321 return (new Clipperz.ByteArray().appendBase64String(aResult['passphrase'])).asString(); 318 return (new Clipperz.ByteArray().appendBase64String(aResult['passphrase'])).asString();
322 } 319 }
323 ], {trace:false}) 320 ], {trace:false})
324 }, 321 },
325 322
326 'login': function(/*anUsername, aPassphrase*/) { 323 'login': function(/*anUsername, aPassphrase*/) {
327 vardeferredResult; 324 vardeferredResult;
328 var cryptoVersion; 325 var cryptoVersion;
329 var srpConnection; 326 var srpConnection;
330 327
331 cryptoVersion = this.clipperz_pm_crypto_version(); 328 cryptoVersion = this.clipperz_pm_crypto_version();
332 329
333 deferredResult = new Clipperz.Async.Deferred("Connection.login", {trace:false}); 330 deferredResult = new Clipperz.Async.Deferred("Connection.login", {trace:false});
334 deferredResult.addCallback(this.getCredentialsFunction()); 331 deferredResult.addCallback(this.getCredentialsFunction());
335 deferredResult.addMethod(this, 'normalizedCredentials'); 332 deferredResult.addMethod(this, 'normalizedCredentials');
336 // deferredResult.addCallbackPass(MochiKit.Signal.signal, this, 'updatedProgressState', 'connection_sendingCredentials'); 333 // deferredResult.addCallbackPass(MochiKit.Signal.signal, this, 'updatedProgressState', 'connection_sendingCredentials');
337 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress'); 334 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
338 deferredResult.addCallback(MochiKit.Base.bind(function(someCredentials) { 335 deferredResult.addCallback(MochiKit.Base.bind(function(someCredentials) {
339 srpConnection = new Clipperz.Crypto.SRP.Connection({ C:someCredentials['username'], P:someCredentials['password'], hash:this.hash() }); 336 srpConnection = new Clipperz.Crypto.SRP.Connection({ C:someCredentials['username'], P:someCredentials['password'], hash:this.hash() });
340 }, this)); 337 }, this));
341 deferredResult.addCallback(function() { 338 deferredResult.addCallback(function() {
342 var result; 339 var result;
343 340
344 result = { 341 result = {
345 message: 'connect', 342 message: 'connect',
346 version: cryptoVersion, 343 version: cryptoVersion,
347 parameters: { 344 parameters: {
348 C: srpConnection.C(), 345 C: srpConnection.C(),
349 A: srpConnection.A().asString(16) 346 A: srpConnection.A().asString(16)
350 // reconnecting: this.connectionId() 347 // reconnecting: this.connectionId()
351 } 348 }
352 }; 349 };
353 350
354 // TODO: ????? 351 // TODO: ?????
355 // if (isReconnecting == true) { 352 // if (isReconnecting == true) {
356 // args.parameters['reconnecting'] = aConnection.connectionId(); 353 // args.parameters['reconnecting'] = aConnection.connectionId();
357 // } 354 // }
358 355
359 return result; 356 return result;
360 }); 357 });
361 deferredResult.addMethod(this.proxy(), 'handshake'); 358 deferredResult.addMethod(this.proxy(), 'handshake');
362 // deferredResult.addCallbackPass(MochiKit.Signal.signal, this, 'updatedProgressState', 'connection_credentialVerification'); 359 // deferredResult.addCallbackPass(MochiKit.Signal.signal, this, 'updatedProgressState', 'connection_credentialVerification');
363 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress'); 360 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
364 deferredResult.addCallback(function(someParameters) { 361 deferredResult.addCallback(function(someParameters) {
365 var result; 362 var result;
366 363
367 srpConnection.set_s(new Clipperz.Crypto.BigInt(someParameters['s'], 16)); 364 srpConnection.set_s(new Clipperz.Crypto.BigInt(someParameters['s'], 16));
368 srpConnection.set_B(new Clipperz.Crypto.BigInt(someParameters['B'], 16)); 365 srpConnection.set_B(new Clipperz.Crypto.BigInt(someParameters['B'], 16));
369 366
370 //TODO: ????? 367 //TODO: ?????
371 // if (typeof(someParameters['oneTimePassword']) != 'undefined') { 368 // if (typeof(someParameters['oneTimePassword']) != 'undefined') {
372 // this.setOneTimePassword(someParameters['oneTimePassword']); 369 // this.setOneTimePassword(someParameters['oneTimePassword']);
373 // } 370 // }
374 371
375 result = { 372 result = {
376 message: 'credentialCheck', 373 message: 'credentialCheck',
377 version: cryptoVersion, 374 version: cryptoVersion,
378 parameters: { 375 parameters: {
379 M1: srpConnection.M1() 376 M1: srpConnection.M1()
380 } 377 }
381 }; 378 };
382 379
383 return result; 380 return result;
384 }); 381 });
385 deferredResult.addMethod(this.proxy(), 'handshake'); 382 deferredResult.addMethod(this.proxy(), 'handshake');
386 deferredResult.addCallback(function(someParameters) { 383 deferredResult.addCallback(function(someParameters) {
387 var result; 384 var result;
388 385
389 if (someParameters['M2'] == srpConnection.M2()) { 386 if (someParameters['M2'] == srpConnection.M2()) {
390 result = MochiKit.Async.succeed(someParameters); 387 result = MochiKit.Async.succeed(someParameters);
391 } else { 388 } else {
392 result = MochiKit.Async.fail(Clipperz.PM.Connection.exception.WrongChecksum); 389 result = MochiKit.Async.fail(Clipperz.PM.Connection.exception.WrongChecksum);
393 } 390 }
394 391
395 return result; 392 return result;
396 }); 393 });
397 deferredResult.addCallback(MochiKit.Base.bind(function(someParameters) { 394 deferredResult.addCallback(MochiKit.Base.bind(function(someParameters) {
398 this.setConnectionId(someParameters['connectionId']); 395 this.setConnectionId(someParameters['connectionId']);
399 this.setSharedSecret(srpConnection.K()); 396 this.setSharedSecret(srpConnection.K());
400 397
401 // TODO: ????? 398 // TODO: ?????
402 // if (this.oneTimePassword() != null) { 399 // if (this.oneTimePassword() != null) {
403 /// ?? result = this.user().oneTimePasswordManager().archiveOneTimePassword(this.oneTimePassword())); 400 /// ?? result = this.user().oneTimePasswordManager().archiveOneTimePassword(this.oneTimePassword()));
404 // } 401 // }
405 return someParameters; 402 return someParameters;
406 }, this)); 403 }, this));
407 // deferredResult.addCallbackPass(MochiKit.Signal.signal, this, 'updatedProgressState', 'connection_loggedIn'); 404 // deferredResult.addCallbackPass(MochiKit.Signal.signal, this, 'updatedProgressState', 'connection_loggedIn');
408 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress'); 405 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
diff --git a/frontend/gamma/js/Clipperz/PM/Crypto.js b/frontend/gamma/js/Clipperz/PM/Crypto.js
index bfafbea..31fe349 100644
--- a/frontend/gamma/js/Clipperz/PM/Crypto.js
+++ b/frontend/gamma/js/Clipperz/PM/Crypto.js
@@ -1,408 +1,405 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
30if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } 27if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
31if (typeof(Clipperz.PM.Crypto) == 'undefined') { Clipperz.PM.Crypto = {}; } 28if (typeof(Clipperz.PM.Crypto) == 'undefined') { Clipperz.PM.Crypto = {}; }
32 29
33Clipperz.PM.Crypto.VERSION = "0.2"; 30Clipperz.PM.Crypto.VERSION = "0.2";
34Clipperz.PM.Crypto.NAME = "Clipperz.PM.Crypto"; 31Clipperz.PM.Crypto.NAME = "Clipperz.PM.Crypto";
35 32
36Clipperz.PM.Crypto.encryptingFunctions = {}; 33Clipperz.PM.Crypto.encryptingFunctions = {};
37 34
38MochiKit.Base.update(Clipperz.PM.Crypto, { 35MochiKit.Base.update(Clipperz.PM.Crypto, {
39 36
40 '__repr__': function () { 37 '__repr__': function () {
41 return "[" + this.NAME + " " + this.VERSION + "]"; 38 return "[" + this.NAME + " " + this.VERSION + "]";
42 }, 39 },
43 40
44 //------------------------------------------------------------------------- 41 //-------------------------------------------------------------------------
45 42
46 'toString': function () { 43 'toString': function () {
47 return this.__repr__(); 44 return this.__repr__();
48 }, 45 },
49 46
50 //------------------------------------------------------------------------- 47 //-------------------------------------------------------------------------
51/* 48/*
52 'communicationProtocol': { 49 'communicationProtocol': {
53 'currentVersion': '0.2', 50 'currentVersion': '0.2',
54 'versions': { 51 'versions': {
55 '0.1': Clipperz.PM.Connection.SRP['1.0'],//Clipperz.Crypto.SRP.versions['1.0'].Connection, 52 '0.1': Clipperz.PM.Connection.SRP['1.0'],//Clipperz.Crypto.SRP.versions['1.0'].Connection,
56 '0.2': Clipperz.PM.Connection.SRP['1.1']//Clipperz.Crypto.SRP.versions['1.1'].Connection 53 '0.2': Clipperz.PM.Connection.SRP['1.1']//Clipperz.Crypto.SRP.versions['1.1'].Connection
57 }, 54 },
58 'fallbackVersions': { 55 'fallbackVersions': {
59 'current':'0.1', 56 'current':'0.1',
60 '0.2': '0.1', 57 '0.2': '0.1',
61 '0.1': null 58 '0.1': null
62 } 59 }
63 }, 60 },
64*/ 61*/
65 //------------------------------------------------------------------------- 62 //-------------------------------------------------------------------------
66 63
67 'encryptingFunctions': { 64 'encryptingFunctions': {
68 'currentVersion': '0.3', 65 'currentVersion': '0.3',
69 'versions': { 66 'versions': {
70 67
71 //##################################################################### 68 //#####################################################################
72 69
73 '0.1': { 70 '0.1': {
74 'encrypt': function(aKey, aValue) { 71 'encrypt': function(aKey, aValue) {
75 return Clipperz.Crypto.Base.encryptUsingSecretKey(aKey, Clipperz.Base.serializeJSON(aValue)); 72 return Clipperz.Crypto.Base.encryptUsingSecretKey(aKey, Clipperz.Base.serializeJSON(aValue));
76 }, 73 },
77 74
78 'deferredEncrypt': function(aKey, aValue) { 75 'deferredEncrypt': function(aKey, aValue) {
79 var deferredResult; 76 var deferredResult;
80 77
81 deferredResult = new Clipperz.Async.Deferred("Crypto[0.1].deferredEncrypt"); 78 deferredResult = new Clipperz.Async.Deferred("Crypto[0.1].deferredEncrypt");
82 deferredResult.addCallback(Clipperz.PM.Crypto.encryptingFunctions.versions['0.1'].encrypt, aKey, aValue); 79 deferredResult.addCallback(Clipperz.PM.Crypto.encryptingFunctions.versions['0.1'].encrypt, aKey, aValue);
83 deferredResult.callback(); 80 deferredResult.callback();
84 81
85 return deferredResult; 82 return deferredResult;
86 }, 83 },
87 84
88 'decrypt': function(aKey, aValue) { 85 'decrypt': function(aKey, aValue) {
89 var result; 86 var result;
90 87
91 if (aValue != null) { 88 if (aValue != null) {
92 result = Clipperz.Base.evalJSON(Clipperz.Crypto.Base.decryptUsingSecretKey(aKey, aValue)); 89 result = Clipperz.Base.evalJSON(Clipperz.Crypto.Base.decryptUsingSecretKey(aKey, aValue));
93 } else { 90 } else {
94 result = null; 91 result = null;
95 } 92 }
96 93
97 return result; 94 return result;
98 }, 95 },
99 96
100 'deferredDecrypt': function(aKey, aValue) { 97 'deferredDecrypt': function(aKey, aValue) {
101 var deferredResult; 98 var deferredResult;
102 99
103 deferredResult = new Clipperz.Async.Deferred("Crypto.[0.1].deferredDecrypt"); 100 deferredResult = new Clipperz.Async.Deferred("Crypto.[0.1].deferredDecrypt");
104 deferredResult.addCallback(Clipperz.PM.Crypto.encryptingFunctions.versions['0.1'].decrypt, aKey, aValue); 101 deferredResult.addCallback(Clipperz.PM.Crypto.encryptingFunctions.versions['0.1'].decrypt, aKey, aValue);
105 deferredResult.callback(); 102 deferredResult.callback();
106 103
107 return deferredResult; 104 return deferredResult;
108 }, 105 },
109 106
110 'hash': function(aValue) { 107 'hash': function(aValue) {
111 var result; 108 var result;
112 var strngResult; 109 var strngResult;
113 110
114 stringResult = Clipperz.Crypto.Base.computeHashValue(aValue.asString()); //!!!!!!! 111 stringResult = Clipperz.Crypto.Base.computeHashValue(aValue.asString()); //!!!!!!!
115 result = new Clipperz.ByteArray("0x" + stringResult); 112 result = new Clipperz.ByteArray("0x" + stringResult);
116 113
117 return result; 114 return result;
118 }, 115 },
119 116
120 'deriveKey': function(aStringValue) { 117 'deriveKey': function(aStringValue) {
121 return Clipperz.Crypto.Base.computeHashValue(aStringValue); 118 return Clipperz.Crypto.Base.computeHashValue(aStringValue);
122 } 119 }
123 }, 120 },
124 121
125 //##################################################################### 122 //#####################################################################
126 123
127 '0.2': { 124 '0.2': {
128 'encrypt': function(aKey, aValue, aNonce) { 125 'encrypt': function(aKey, aValue, aNonce) {
129 var result; 126 var result;
130 varkey, value; 127 varkey, value;
131 var dataToEncrypt; 128 var dataToEncrypt;
132 var encryptedData; 129 var encryptedData;
133 130
134 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey)); 131 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
135 value = new Clipperz.ByteArray(Clipperz.Base.serializeJSON(aValue)); 132 value = new Clipperz.ByteArray(Clipperz.Base.serializeJSON(aValue));
136 dataToEncrypt = Clipperz.Crypto.SHA.sha_d256(value).appendBlock(value); 133 dataToEncrypt = Clipperz.Crypto.SHA.sha_d256(value).appendBlock(value);
137 encryptedData = Clipperz.Crypto.AES.encrypt(key, dataToEncrypt, aNonce); 134 encryptedData = Clipperz.Crypto.AES.encrypt(key, dataToEncrypt, aNonce);
138 result = encryptedData.toBase64String(); 135 result = encryptedData.toBase64String();
139 136
140 return result; 137 return result;
141 }, 138 },
142 139
143 'deferredEncrypt': function(aKey, aValue, aNonce) { 140 'deferredEncrypt': function(aKey, aValue, aNonce) {
144 var deferredResult; 141 var deferredResult;
145 varkey, value; 142 varkey, value;
146 var dataToEncrypt; 143 var dataToEncrypt;
147 // var encryptedData; 144 // var encryptedData;
148 145
149 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey)); 146 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
150 value = new Clipperz.ByteArray(Clipperz.Base.serializeJSON(aValue)); 147 value = new Clipperz.ByteArray(Clipperz.Base.serializeJSON(aValue));
151 dataToEncrypt = Clipperz.Crypto.SHA.sha_d256(value).appendBlock(value); 148 dataToEncrypt = Clipperz.Crypto.SHA.sha_d256(value).appendBlock(value);
152 149
153 deferredResult = new Clipperz.Async.Deferred("Crypto[0.2].deferredEncrypt") 150 deferredResult = new Clipperz.Async.Deferred("Crypto[0.2].deferredEncrypt")
154 deferredResult.addCallback(Clipperz.Crypto.AES.deferredEncrypt, key, dataToEncrypt, aNonce); 151 deferredResult.addCallback(Clipperz.Crypto.AES.deferredEncrypt, key, dataToEncrypt, aNonce);
155 deferredResult.addCallback(function(aResult) { 152 deferredResult.addCallback(function(aResult) {
156 return aResult.toBase64String(); 153 return aResult.toBase64String();
157 }) 154 })
158 deferredResult.callback(); 155 deferredResult.callback();
159 156
160 return deferredResult; 157 return deferredResult;
161 }, 158 },
162 159
163 'decrypt': function(aKey, aValue) { 160 'decrypt': function(aKey, aValue) {
164 var result; 161 var result;
165 162
166 if (aValue != null) { 163 if (aValue != null) {
167 var key, value; 164 var key, value;
168 var decryptedData; 165 var decryptedData;
169 var decryptedValue; 166 var decryptedValue;
170 167
171 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey)); 168 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
172 value = new Clipperz.ByteArray().appendBase64String(aValue); 169 value = new Clipperz.ByteArray().appendBase64String(aValue);
173 170
174 decryptedData = Clipperz.Crypto.AES.decrypt(key, value); 171 decryptedData = Clipperz.Crypto.AES.decrypt(key, value);
175 decryptedValue = decryptedData.split((256/8)); 172 decryptedValue = decryptedData.split((256/8));
176 173
177 try { 174 try {
178 result = Clipperz.Base.evalJSON(decryptedValue.asString()); 175 result = Clipperz.Base.evalJSON(decryptedValue.asString());
179 } catch (exception) { 176 } catch (exception) {
180 MochiKit.Logging.logError("Error while decrypting data [1]"); 177 MochiKit.Logging.logError("Error while decrypting data [1]");
181 throw Clipperz.Crypto.Base.exception.CorruptedMessage; 178 throw Clipperz.Crypto.Base.exception.CorruptedMessage;
182 } 179 }
183 } else { 180 } else {
184 result = null; 181 result = null;
185 } 182 }
186 183
187 return result; 184 return result;
188 }, 185 },
189 186
190 'deferredDecrypt': function(aKey, aValue) { 187 'deferredDecrypt': function(aKey, aValue) {
191 var result; 188 var result;
192 189
193 if (aValue != null) { 190 if (aValue != null) {
194 var deferredResult; 191 var deferredResult;
195 var key, value; 192 var key, value;
196 // var decryptedData; 193 // var decryptedData;
197 194
198 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey)); 195 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
199 value = new Clipperz.ByteArray().appendBase64String(aValue); 196 value = new Clipperz.ByteArray().appendBase64String(aValue);
200 197
201 deferredResult = new Clipperz.Async.Deferred("Crypto.[0.2].deferredDecrypt"); 198 deferredResult = new Clipperz.Async.Deferred("Crypto.[0.2].deferredDecrypt");
202 deferredResult.addCallback(Clipperz.Crypto.AES.deferredDecrypt, key, value); 199 deferredResult.addCallback(Clipperz.Crypto.AES.deferredDecrypt, key, value);
203 deferredResult.addCallback(function(aResult) { 200 deferredResult.addCallback(function(aResult) {
204 var result; 201 var result;
205 var decryptedData; 202 var decryptedData;
206 203
207 decryptedData = aResult.split((256/8)); 204 decryptedData = aResult.split((256/8));
208 205
209 try { 206 try {
210 result = Clipperz.Base.evalJSON(decryptedData.asString()); 207 result = Clipperz.Base.evalJSON(decryptedData.asString());
211 } catch (exception) { 208 } catch (exception) {
212 MochiKit.Logging.logError("Error while decrypting data [2]"); 209 MochiKit.Logging.logError("Error while decrypting data [2]");
213 throw Clipperz.Crypto.Base.exception.CorruptedMessage; 210 throw Clipperz.Crypto.Base.exception.CorruptedMessage;
214 } 211 }
215 212
216 return result; 213 return result;
217 }) 214 })
218 deferredResult.callback(); 215 deferredResult.callback();
219 216
220 result = deferredResult; 217 result = deferredResult;
221 } else { 218 } else {
222 result = MochiKit.Async.succeed(null); 219 result = MochiKit.Async.succeed(null);
223 } 220 }
224 221
225 return result; 222 return result;
226 }, 223 },
227 224
228 'hash': Clipperz.Crypto.SHA.sha_d256, 225 'hash': Clipperz.Crypto.SHA.sha_d256,
229 226
230 'deriveKey': function(aStringValue) { 227 'deriveKey': function(aStringValue) {
231 varbyteData; 228 varbyteData;
232 var result; 229 var result;
233 230
234 byteData = new Clipperz.ByteArray(aStringValue); 231 byteData = new Clipperz.ByteArray(aStringValue);
235 result = Clipperz.Crypto.SHA.sha_d256(byteData); 232 result = Clipperz.Crypto.SHA.sha_d256(byteData);
236 233
237 return result; 234 return result;
238 } 235 }
239 }, 236 },
240 237
241 //##################################################################### 238 //#####################################################################
242 239
243 '0.3': { 240 '0.3': {
244 'encrypt': function(aKey, aValue, aNonce) { 241 'encrypt': function(aKey, aValue, aNonce) {
245 var result; 242 var result;
246 varkey, value; 243 varkey, value;
247 var data; 244 var data;
248 var dataToEncrypt; 245 var dataToEncrypt;
249 var encryptedData; 246 var encryptedData;
250 247
251 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey)); 248 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
252 value = Clipperz.Base.serializeJSON(aValue); 249 value = Clipperz.Base.serializeJSON(aValue);
253 data = new Clipperz.ByteArray(value); 250 data = new Clipperz.ByteArray(value);
254 encryptedData = Clipperz.Crypto.AES.encrypt(key, data, aNonce); 251 encryptedData = Clipperz.Crypto.AES.encrypt(key, data, aNonce);
255 result = encryptedData.toBase64String(); 252 result = encryptedData.toBase64String();
256 253
257 return result; 254 return result;
258 }, 255 },
259 256
260 'deferredEncrypt': function(aKey, aValue, aNonce) { 257 'deferredEncrypt': function(aKey, aValue, aNonce) {
261 var deferredResult; 258 var deferredResult;
262 varkey, value; 259 varkey, value;
263 var data; 260 var data;
264 var dataToEncrypt; 261 var dataToEncrypt;
265 var encryptedData; 262 var encryptedData;
266 263
267 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey)); 264 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
268 value = Clipperz.Base.serializeJSON(aValue); 265 value = Clipperz.Base.serializeJSON(aValue);
269 data = new Clipperz.ByteArray(value); 266 data = new Clipperz.ByteArray(value);
270 267
271 deferredResult = new Clipperz.Async.Deferred("Crypto[0.3].deferredEncrypt") 268 deferredResult = new Clipperz.Async.Deferred("Crypto[0.3].deferredEncrypt")
272 deferredResult.addCallback(Clipperz.Crypto.AES.deferredEncrypt, key, data, aNonce); 269 deferredResult.addCallback(Clipperz.Crypto.AES.deferredEncrypt, key, data, aNonce);
273 deferredResult.addCallback(function(aResult) { 270 deferredResult.addCallback(function(aResult) {
274 return aResult.toBase64String(); 271 return aResult.toBase64String();
275 }) 272 })
276 deferredResult.callback(); 273 deferredResult.callback();
277 274
278 return deferredResult; 275 return deferredResult;
279 }, 276 },
280 277
281 'decrypt': function(aKey, aValue) { 278 'decrypt': function(aKey, aValue) {
282 var result; 279 var result;
283 280
284 if (aValue != null) { 281 if (aValue != null) {
285 var key, value; 282 var key, value;
286 var decryptedData; 283 var decryptedData;
287 284
288 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey)); 285 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
289 value = new Clipperz.ByteArray().appendBase64String(aValue); 286 value = new Clipperz.ByteArray().appendBase64String(aValue);
290 287
291 decryptedData = Clipperz.Crypto.AES.decrypt(key, value); 288 decryptedData = Clipperz.Crypto.AES.decrypt(key, value);
292 289
293 value = decryptedData.asString(); 290 value = decryptedData.asString();
294 try { 291 try {
295 result = Clipperz.Base.evalJSON(value); 292 result = Clipperz.Base.evalJSON(value);
296 } catch (exception) { 293 } catch (exception) {
297 MochiKit.Logging.logError("Error while decrypting data [3]"); 294 MochiKit.Logging.logError("Error while decrypting data [3]");
298 throw Clipperz.Crypto.Base.exception.CorruptedMessage; 295 throw Clipperz.Crypto.Base.exception.CorruptedMessage;
299 } 296 }
300 } else { 297 } else {
301 result = null; 298 result = null;
302 } 299 }
303 300
304 return result; 301 return result;
305 }, 302 },
306 303
307 'deferredDecrypt': function(aKey, aValue) { 304 'deferredDecrypt': function(aKey, aValue) {
308 var deferredResult; 305 var deferredResult;
309 306
310 deferredResult = new Clipperz.Async.Deferred("Crypto[0.3].deferredDecrypt", {trace: false}); 307 deferredResult = new Clipperz.Async.Deferred("Crypto[0.3].deferredDecrypt", {trace: false});
311 // now = new Date; 308 // now = new Date;
312 309
313 if (aValue != null) { 310 if (aValue != null) {
314 var key, value; 311 var key, value;
315 // var decryptedData; 312 // var decryptedData;
316 313
317 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey)); 314 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
318 value = new Clipperz.ByteArray().appendBase64String(aValue); 315 value = new Clipperz.ByteArray().appendBase64String(aValue);
319 316
320 deferredResult.addCallback(Clipperz.Crypto.AES.deferredDecrypt, key, value); 317 deferredResult.addCallback(Clipperz.Crypto.AES.deferredDecrypt, key, value);
321 deferredResult.addCallback(MochiKit.Async.wait, 0.1); 318 deferredResult.addCallback(MochiKit.Async.wait, 0.1);
322 deferredResult.addCallback(function(aResult) { 319 deferredResult.addCallback(function(aResult) {
323 return aResult.asString(); 320 return aResult.asString();
324 }); 321 });
325 deferredResult.addCallback(MochiKit.Async.wait, 0.1); 322 deferredResult.addCallback(MochiKit.Async.wait, 0.1);
326 deferredResult.addCallback(Clipperz.Base.evalJSON); 323 deferredResult.addCallback(Clipperz.Base.evalJSON);
327 deferredResult.addErrback(function(anError) { 324 deferredResult.addErrback(function(anError) {
328 MochiKit.Logging.logError("Error while decrypting data [4]"); 325 MochiKit.Logging.logError("Error while decrypting data [4]");
329 throw Clipperz.Crypto.Base.exception.CorruptedMessage; 326 throw Clipperz.Crypto.Base.exception.CorruptedMessage;
330 }) 327 })
331 } else { 328 } else {
332 deferredResult.addCallback(function() { 329 deferredResult.addCallback(function() {
333 return null; 330 return null;
334 }); 331 });
335 } 332 }
336 deferredResult.callback(); 333 deferredResult.callback();
337 334
338 return deferredResult; 335 return deferredResult;
339 }, 336 },
340 337
341 'hash': Clipperz.Crypto.SHA.sha_d256, 338 'hash': Clipperz.Crypto.SHA.sha_d256,
342 339
343 'deriveKey': function(aStringValue) { 340 'deriveKey': function(aStringValue) {
344 varbyteData; 341 varbyteData;
345 var result; 342 var result;
346 343
347 byteData = new Clipperz.ByteArray(aStringValue); 344 byteData = new Clipperz.ByteArray(aStringValue);
348 result = Clipperz.Crypto.SHA.sha_d256(byteData); 345 result = Clipperz.Crypto.SHA.sha_d256(byteData);
349 346
350 return result; 347 return result;
351 } 348 }
352 349
353 }, 350 },
354 351
355 //##################################################################### 352 //#####################################################################
356/* 353/*
357 '0.4': { 354 '0.4': {
358 'encrypt': function(aKey, aValue, aNonce) { 355 'encrypt': function(aKey, aValue, aNonce) {
359 var result; 356 var result;
360 varkey, value; 357 varkey, value;
361 var data; 358 var data;
362 var dataToEncrypt; 359 var dataToEncrypt;
363 var encryptedData; 360 var encryptedData;
364 361
365//MochiKit.Logging.logDebug(">>> [" + (new Date()).valueOf() + "] Clipperz.PM.Crypto.versions[0.3].encrypt"); 362//MochiKit.Logging.logDebug(">>> [" + (new Date()).valueOf() + "] Clipperz.PM.Crypto.versions[0.3].encrypt");
366 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey)); 363 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
367//MochiKit.Logging.logDebug("--- [" + (new Date()).valueOf() + "] Clipperz.PM.Crypto.versions[0.3].encrypt - 1"); 364//MochiKit.Logging.logDebug("--- [" + (new Date()).valueOf() + "] Clipperz.PM.Crypto.versions[0.3].encrypt - 1");
368 value = Clipperz.Base.serializeJSON(aValue); 365 value = Clipperz.Base.serializeJSON(aValue);
369//MochiKit.Logging.logDebug("--- [" + (new Date()).valueOf() + "] Clipperz.PM.Crypto.versions[0.3].encrypt - 2"); 366//MochiKit.Logging.logDebug("--- [" + (new Date()).valueOf() + "] Clipperz.PM.Crypto.versions[0.3].encrypt - 2");
370/ * 367/ *
371//MochiKit.Logging.logDebug("--> encrypt.fullSize: " + value.length); 368//MochiKit.Logging.logDebug("--> encrypt.fullSize: " + value.length);
372 value = value.replace(/":{"label":"/g, '":{l:"'); 369 value = value.replace(/":{"label":"/g, '":{l:"');
373 value = value.replace(/":{"key":"/g, '":{k:"'); 370 value = value.replace(/":{"key":"/g, '":{k:"');
374 value = value.replace(/":{"notes":"/g, '":{n:"'); 371 value = value.replace(/":{"notes":"/g, '":{n:"');
375 value = value.replace(/":{"record":"/g, '":{r:"'); 372 value = value.replace(/":{"record":"/g, '":{r:"');
376 value = value.replace(/", "label":"/g, '",l:"'); 373 value = value.replace(/", "label":"/g, '",l:"');
377 value = value.replace(/", "favicon":"/g,'",f:"'); 374 value = value.replace(/", "favicon":"/g,'",f:"');
378//MochiKit.Logging.logDebug("<-- encrypt.compressed: " + value.length); 375//MochiKit.Logging.logDebug("<-- encrypt.compressed: " + value.length);
379* / 376* /
380 data = new Clipperz.ByteArray(value); 377 data = new Clipperz.ByteArray(value);
381//MochiKit.Logging.logDebug("--- [" + (new Date()).valueOf() + "] Clipperz.PM.Crypto.versions[0.3].encrypt - 3"); 378//MochiKit.Logging.logDebug("--- [" + (new Date()).valueOf() + "] Clipperz.PM.Crypto.versions[0.3].encrypt - 3");
382 encryptedData = Clipperz.Crypto.AES.encrypt(key, data, aNonce); 379 encryptedData = Clipperz.Crypto.AES.encrypt(key, data, aNonce);
383//MochiKit.Logging.logDebug("--- [" + (new Date()).valueOf() + "] Clipperz.PM.Crypto.versions[0.3].encrypt - 4"); 380//MochiKit.Logging.logDebug("--- [" + (new Date()).valueOf() + "] Clipperz.PM.Crypto.versions[0.3].encrypt - 4");
384 result = encryptedData.toBase64String(); 381 result = encryptedData.toBase64String();
385//MochiKit.Logging.logDebug("<<< [" + (new Date()).valueOf() + "] Clipperz.PM.Crypto.versions[0.3].encrypt"); 382//MochiKit.Logging.logDebug("<<< [" + (new Date()).valueOf() + "] Clipperz.PM.Crypto.versions[0.3].encrypt");
386 383
387 return result; 384 return result;
388 }, 385 },
389 386
390 'decrypt': function(aKey, aValue) { 387 'decrypt': function(aKey, aValue) {
391 var result; 388 var result;
392 389
393 if (aValue != null) { 390 if (aValue != null) {
394 var key, value; 391 var key, value;
395 var decryptedData; 392 var decryptedData;
396 393
397 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey)); 394 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
398 value = new Clipperz.ByteArray().appendBase64String(aValue); 395 value = new Clipperz.ByteArray().appendBase64String(aValue);
399 396
400 decryptedData = Clipperz.Crypto.AES.decrypt(key, value); 397 decryptedData = Clipperz.Crypto.AES.decrypt(key, value);
401 398
402 value = decryptedData.asString(); 399 value = decryptedData.asString();
403/ * 400/ *
404 value = value.replace(/":{l:"/g,'":{"label":"'); 401 value = value.replace(/":{l:"/g,'":{"label":"');
405 value = value.replace(/":{k:"/g,'":{"key":"'); 402 value = value.replace(/":{k:"/g,'":{"key":"');
406 value = value.replace(/":{n:"/g,'":{"notes":"'); 403 value = value.replace(/":{n:"/g,'":{"notes":"');
407 value = value.replace(/":{r:"/g,'":{"record":"'); 404 value = value.replace(/":{r:"/g,'":{"record":"');
408 value = value.replace(/",l:"/g, '", "label":"'); 405 value = value.replace(/",l:"/g, '", "label":"');
diff --git a/frontend/gamma/js/Clipperz/PM/DataModel/DirectLogin.js b/frontend/gamma/js/Clipperz/PM/DataModel/DirectLogin.js
index 1d38509..8f8696d 100644
--- a/frontend/gamma/js/Clipperz/PM/DataModel/DirectLogin.js
+++ b/frontend/gamma/js/Clipperz/PM/DataModel/DirectLogin.js
@@ -1,408 +1,405 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.PM.DataModel'); 26Clipperz.Base.module('Clipperz.PM.DataModel');
30 27
31Clipperz.PM.DataModel.DirectLogin = function(args) { 28Clipperz.PM.DataModel.DirectLogin = function(args) {
32 args = args || {}; 29 args = args || {};
33 30
34 Clipperz.PM.DataModel.DirectLogin.superclass.constructor.apply(this, arguments); 31 Clipperz.PM.DataModel.DirectLogin.superclass.constructor.apply(this, arguments);
35 32
36 this._reference =args.reference 33 this._reference =args.reference
37 ||Clipperz.PM.Crypto.randomKey(); 34 ||Clipperz.PM.Crypto.randomKey();
38 this._record =args.record 35 this._record =args.record
39 ||Clipperz.Base.exception.raise('MandatoryParameter'); 36 ||Clipperz.Base.exception.raise('MandatoryParameter');
40 37
41 this._retrieveIndexDataFunction = args.retrieveIndexDataFunction 38 this._retrieveIndexDataFunction = args.retrieveIndexDataFunction
42 ||this.record().retrieveDirectLoginIndexDataFunction() 39 ||this.record().retrieveDirectLoginIndexDataFunction()
43 ||Clipperz.Base.exception.raise('MandatoryParameter'); 40 ||Clipperz.Base.exception.raise('MandatoryParameter');
44 this._setIndexDataFunction = args.setIndexDataFunction 41 this._setIndexDataFunction = args.setIndexDataFunction
45 ||this.record().setDirectLoginIndexDataFunction() 42 ||this.record().setDirectLoginIndexDataFunction()
46 ||Clipperz.Base.exception.raise('MandatoryParameter'); 43 ||Clipperz.Base.exception.raise('MandatoryParameter');
47 this._removeIndexDataFunction =args.removeIndexDataFunction 44 this._removeIndexDataFunction =args.removeIndexDataFunction
48 ||this.record().removeDirectLoginIndexDataFunction() 45 ||this.record().removeDirectLoginIndexDataFunction()
49 ||Clipperz.Base.exception.raise('MandatoryParameter'); 46 ||Clipperz.Base.exception.raise('MandatoryParameter');
50 47
51 this._inputs = null; 48 this._inputs = null;
52 this._bindings = null; 49 this._bindings = null;
53 this._formValues = null; 50 this._formValues = null;
54 51
55 // this._inputsDeferredLock = new MochiKit.Async.DeferredLock(); 52 // this._inputsDeferredLock = new MochiKit.Async.DeferredLock();
56 // this._bindingsDeferredLock = new MochiKit.Async.DeferredLock(); 53 // this._bindingsDeferredLock = new MochiKit.Async.DeferredLock();
57 // this._formValuesDeferredLock = new MochiKit.Async.DeferredLock(); 54 // this._formValuesDeferredLock = new MochiKit.Async.DeferredLock();
58 55
59 this._transientState = null; 56 this._transientState = null;
60 57
61 this._isBrandNew = MochiKit.Base.isUndefinedOrNull(args.reference); 58 this._isBrandNew = MochiKit.Base.isUndefinedOrNull(args.reference);
62 59
63 this.record().addDirectLogin(this); 60 this.record().addDirectLogin(this);
64 61
65 return this; 62 return this;
66} 63}
67 64
68Clipperz.Base.extend(Clipperz.PM.DataModel.DirectLogin, Object, { 65Clipperz.Base.extend(Clipperz.PM.DataModel.DirectLogin, Object, {
69 66
70 'toString': function() { 67 'toString': function() {
71 return "DirectLogin (" + this.reference() + ")"; 68 return "DirectLogin (" + this.reference() + ")";
72 }, 69 },
73 70
74 //========================================================================= 71 //=========================================================================
75 72
76 'reference': function () { 73 'reference': function () {
77 return this._reference; 74 return this._reference;
78 }, 75 },
79 76
80 //------------------------------------------------------------------------- 77 //-------------------------------------------------------------------------
81 78
82 'record': function () { 79 'record': function () {
83 return this._record; 80 return this._record;
84 }, 81 },
85 82
86 //========================================================================= 83 //=========================================================================
87 84
88 'isBrandNew': function () { 85 'isBrandNew': function () {
89 return this._isBrandNew; 86 return this._isBrandNew;
90 }, 87 },
91 88
92 //========================================================================= 89 //=========================================================================
93 90
94 'removeIndexDataFunction': function () { 91 'removeIndexDataFunction': function () {
95 return this._removeIndexDataFunction; 92 return this._removeIndexDataFunction;
96 }, 93 },
97 94
98 'remove': function () { 95 'remove': function () {
99 return Clipperz.Async.callbacks("DirectLogin.remove", [ 96 return Clipperz.Async.callbacks("DirectLogin.remove", [
100 MochiKit.Base.partial(this.removeIndexDataFunction(), this.reference()), 97 MochiKit.Base.partial(this.removeIndexDataFunction(), this.reference()),
101 MochiKit.Base.method(this.record(), 'removeDirectLogin', this) 98 MochiKit.Base.method(this.record(), 'removeDirectLogin', this)
102 ], {trace:false}); 99 ], {trace:false});
103 }, 100 },
104 101
105 //========================================================================= 102 //=========================================================================
106 /* 103 /*
107 'inputsDeferredLock': function () { 104 'inputsDeferredLock': function () {
108 return this._inputsDeferredLock; 105 return this._inputsDeferredLock;
109 }, 106 },
110 107
111 'bindingsDeferredLock': function () { 108 'bindingsDeferredLock': function () {
112 return this._bindingsDeferredLock; 109 return this._bindingsDeferredLock;
113 }, 110 },
114 111
115 'formValuesDeferredLock': function () { 112 'formValuesDeferredLock': function () {
116 return this._formValuesDeferredLock; 113 return this._formValuesDeferredLock;
117 }, 114 },
118*/ 115*/
119 //========================================================================= 116 //=========================================================================
120 117
121 'label': function () { 118 'label': function () {
122 return this.getIndexDataForKey('label'); 119 return this.getIndexDataForKey('label');
123 }, 120 },
124 121
125 'setLabelKeepingBackwardCompatibilityWithBeta': function (aValue) { 122 'setLabelKeepingBackwardCompatibilityWithBeta': function (aValue) {
126 return Clipperz.Async.callbacks("DirectLogin.setLabelKeepingBackwardCompatibilityWithBeta", [ 123 return Clipperz.Async.callbacks("DirectLogin.setLabelKeepingBackwardCompatibilityWithBeta", [
127 MochiKit.Base.method(this, 'setIndexDataForKey', 'label', aValue), 124 MochiKit.Base.method(this, 'setIndexDataForKey', 'label', aValue),
128 MochiKit.Base.method(this, 'setValue', 'label', aValue) 125 MochiKit.Base.method(this, 'setValue', 'label', aValue)
129 ], {trace:false}); 126 ], {trace:false});
130 }, 127 },
131 128
132 'setLabel': function (aValue) { 129 'setLabel': function (aValue) {
133 return this.setLabelKeepingBackwardCompatibilityWithBeta(aValue); 130 return this.setLabelKeepingBackwardCompatibilityWithBeta(aValue);
134 // return this.setIndexDataForKey('label', aValue); 131 // return this.setIndexDataForKey('label', aValue);
135 }, 132 },
136 133
137 //========================================================================= 134 //=========================================================================
138 135
139 'favicon': function () { 136 'favicon': function () {
140 return this.getIndexDataForKey('favicon'); 137 return this.getIndexDataForKey('favicon');
141 }, 138 },
142 139
143 'setFavicon': function (aValue) { 140 'setFavicon': function (aValue) {
144 return this.setIndexDataForKey('favicon', aValue); 141 return this.setIndexDataForKey('favicon', aValue);
145 }, 142 },
146 143
147 'faviconUrlWithBookmarkletConfiguration': function (aBookmarkletConfiguration) { 144 'faviconUrlWithBookmarkletConfiguration': function (aBookmarkletConfiguration) {
148 varresult; 145 varresult;
149 146
150 if (! MochiKit.Base.isUndefinedOrNull(aBookmarkletConfiguration['page']['favicon'])) { 147 if (! MochiKit.Base.isUndefinedOrNull(aBookmarkletConfiguration['page']['favicon'])) {
151 result = aBookmarkletConfiguration['page']['favicon']; 148 result = aBookmarkletConfiguration['page']['favicon'];
152 } else if (! MochiKit.Base.isUndefinedOrNull(aBookmarkletConfiguration['form']['attributes']['action'])) { 149 } else if (! MochiKit.Base.isUndefinedOrNull(aBookmarkletConfiguration['form']['attributes']['action'])) {
153 var actionUrl; 150 var actionUrl;
154 var hostname; 151 var hostname;
155 152
156 actionUrl = aBookmarkletConfiguration['form']['attributes']['action']; 153 actionUrl = aBookmarkletConfiguration['form']['attributes']['action'];
157 hostname = actionUrl.replace(/^https?:\/\/([^\/]*)\/.*/, '$1'); 154 hostname = actionUrl.replace(/^https?:\/\/([^\/]*)\/.*/, '$1');
158 result = "http://" + hostname + "/favicon.ico"; 155 result = "http://" + hostname + "/favicon.ico";
159 } else { 156 } else {
160 result = null; 157 result = null;
161 } 158 }
162 159
163 160
164 return result; 161 return result;
165 }, 162 },
166 163
167 //------------------------------------------------------------------------- 164 //-------------------------------------------------------------------------
168/* 165/*
169 'faviconData': function () { 166 'faviconData': function () {
170 var regexp = new RegExp('^data\:\/\/.*', 'i'); 167 var regexp = new RegExp('^data\:\/\/.*', 'i');
171 168
172 return Clipperz.Async.callbacks("DirectLogin.favicon", [ 169 return Clipperz.Async.callbacks("DirectLogin.favicon", [
173 MochiKit.Base.method(this, 'getIndexDataForKey', 'favicon'), 170 MochiKit.Base.method(this, 'getIndexDataForKey', 'favicon'),
174 MochiKit.Base.method(regexp, 'test'), 171 MochiKit.Base.method(regexp, 'test'),
175 Clipperz.Async.deferredIf("is data URL", [ 172 Clipperz.Async.deferredIf("is data URL", [
176 MochiKit.Base.method(this, 'getIndexDataForKey', 'favicon') 173 MochiKit.Base.method(this, 'getIndexDataForKey', 'favicon')
177 ], [ 174 ], [
178 MochiKit.Base.method(this, 'transientState'), 175 MochiKit.Base.method(this, 'transientState'),
179 MochiKit.Base.itemgetter('faviconData'), 176 MochiKit.Base.itemgetter('faviconData'),
180 Clipperz.Async.deferredIf('has a chaced value for the favicon data', [ 177 Clipperz.Async.deferredIf('has a chaced value for the favicon data', [
181 MochiKit.Base.operator.identity 178 MochiKit.Base.operator.identity
182 ], [ 179 ], [
183 MochiKit.Base.method(this, 'getIndexDataForKey', 'favicon'), 180 MochiKit.Base.method(this, 'getIndexDataForKey', 'favicon'),
184 MochiKit.Base.method(this, 'loadFaviconDataFromURL') 181 MochiKit.Base.method(this, 'loadFaviconDataFromURL')
185 ]) 182 ])
186 183
187 ]) 184 ])
188 ], {trace:false}); 185 ], {trace:false});
189 }, 186 },
190 187
191 //------------------------------------------------------------------------- 188 //-------------------------------------------------------------------------
192 189
193 'loadFaviconDataFromURL': function (anURL) { 190 'loadFaviconDataFromURL': function (anURL) {
194 var deferredResult; 191 var deferredResult;
195 var image; 192 var image;
196 193
197 deferredResult = new Clipperz.Async.Deferred("DirectLogin.loadFaviconDataFromURL", {trace:false}); 194 deferredResult = new Clipperz.Async.Deferred("DirectLogin.loadFaviconDataFromURL", {trace:false});
198 deferredResult.addCallback(function (anEvent) { 195 deferredResult.addCallback(function (anEvent) {
199 var image = anEvent.src(); 196 var image = anEvent.src();
200 var canvas = document.createElement("canvas"); 197 var canvas = document.createElement("canvas");
201 var result; 198 var result;
202 199
203 canvas.width = image.width; 200 canvas.width = image.width;
204 canvas.height = image.height; 201 canvas.height = image.height;
205 202
206 var ctx = canvas.getContext("2d"); 203 var ctx = canvas.getContext("2d");
207 ctx.drawImage(image, 0, 0); 204 ctx.drawImage(image, 0, 0);
208 205
209 result = canvas.toDataURL(/*"image/png"* /); 206 result = canvas.toDataURL(/*"image/png"* /);
210 207
211 return result; 208 return result;
212 }); 209 });
213 deferredResult.addErrback(MochiKit.Async.succeed, Clipperz.PM.Strings.getValue('defaultFaviconUrl')); 210 deferredResult.addErrback(MochiKit.Async.succeed, Clipperz.PM.Strings.getValue('defaultFaviconUrl'));
214 deferredResult.addBoth(MochiKit.Base.bind(function (aDataUrl) { 211 deferredResult.addBoth(MochiKit.Base.bind(function (aDataUrl) {
215 this.transientState()['faviconData'] = aDataUrl; 212 this.transientState()['faviconData'] = aDataUrl;
216 213
217 return aDataUrl; 214 return aDataUrl;
218 }, this)); 215 }, this));
219 216
220 image = new Image(); 217 image = new Image();
221 MochiKit.Signal.connect(image, 'onload', MochiKit.Base.method(deferredResult, 'callback')); 218 MochiKit.Signal.connect(image, 'onload', MochiKit.Base.method(deferredResult, 'callback'));
222 MochiKit.Signal.connect(image, 'onerror', MochiKit.Base.method(deferredResult, 'errback')); 219 MochiKit.Signal.connect(image, 'onerror', MochiKit.Base.method(deferredResult, 'errback'));
223 MochiKit.Signal.connect(image, 'onabort', MochiKit.Base.method(deferredResult, 'errback')); 220 MochiKit.Signal.connect(image, 'onabort', MochiKit.Base.method(deferredResult, 'errback'));
224 221
225 image.src = anURL; 222 image.src = anURL;
226 223
227 return deferredResult; 224 return deferredResult;
228 }, 225 },
229*/ 226*/
230 227
231 //========================================================================= 228 //=========================================================================
232 229
233 'type': function () { 230 'type': function () {
234 return this.getValue('formData.attributes.type') 231 return this.getValue('formData.attributes.type')
235 }, 232 },
236 233
237 //========================================================================= 234 //=========================================================================
238 235
239 'serializedData': function () { 236 'serializedData': function () {
240 return Clipperz.Async.collectResults("DirectLogin.serializedData", { 237 return Clipperz.Async.collectResults("DirectLogin.serializedData", {
241 'bookmarkletVersion': MochiKit.Base.method(this, 'getValue', 'bookmarkletVersion'), 238 'bookmarkletVersion': MochiKit.Base.method(this, 'getValue', 'bookmarkletVersion'),
242 'formData': MochiKit.Base.method(this, 'getValue', 'formData'), 239 'formData': MochiKit.Base.method(this, 'getValue', 'formData'),
243 'formValues': MochiKit.Base.method(this, 'getValue', 'formValues'), 240 'formValues': MochiKit.Base.method(this, 'getValue', 'formValues'),
244 'bindingData': [ 241 'bindingData': [
245 MochiKit.Base.method(this, 'bindings'), 242 MochiKit.Base.method(this, 'bindings'),
246 function (someBindings) { 243 function (someBindings) {
247 var result; 244 var result;
248 var bindingKey; 245 var bindingKey;
249 246
250 result = {} 247 result = {}
251 for (bindingKey in someBindings) { 248 for (bindingKey in someBindings) {
252 result[bindingKey] = someBindings[bindingKey].serializedData(); 249 result[bindingKey] = someBindings[bindingKey].serializedData();
253 } 250 }
254 251
255 return result; 252 return result;
256 } 253 }
257 ] 254 ]
258 }, {trace:false})() 255 }, {trace:false})()
259 }, 256 },
260 257
261 //========================================================================= 258 //=========================================================================
262/* 259/*
263 'fixFormDataFromBookmarkletVersion_0_1': function(aValue) { 260 'fixFormDataFromBookmarkletVersion_0_1': function(aValue) {
264//{"type":"radio", "name":"action", "value":"new-user", "checked":false }, { "type":"radio", "name":"action", "value":"sign-in", "checked":true } 261//{"type":"radio", "name":"action", "value":"new-user", "checked":false }, { "type":"radio", "name":"action", "value":"sign-in", "checked":true }
265 // || 262 // ||
266 // \ / 263 // \ /
267 // \/ 264 // \/
268//{"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}]} 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}]}
269 var result; 266 var result;
270 var inputs; 267 var inputs;
271 var updatedInputs; 268 var updatedInputs;
272 var radios; 269 var radios;
273 270
274 result = aValue; 271 result = aValue;
275 inputs = aValue['inputs']; 272 inputs = aValue['inputs'];
276 273
277 updatedInputs = MochiKit.Base.filter(function(anInput) { 274 updatedInputs = MochiKit.Base.filter(function(anInput) {
278 varresult; 275 varresult;
279 var type; 276 var type;
280 277
281 type = anInput['type'] || 'text'; 278 type = anInput['type'] || 'text';
282 result = type.toLowerCase() != 'radio'; 279 result = type.toLowerCase() != 'radio';
283 280
284 return result; 281 return result;
285 }, inputs); 282 }, inputs);
286 radios = MochiKit.Base.filter(function(anInput) { 283 radios = MochiKit.Base.filter(function(anInput) {
287 varresult; 284 varresult;
288 var type; 285 var type;
289 286
290 type = anInput['type'] || 'text'; 287 type = anInput['type'] || 'text';
291 result = type.toLowerCase() == 'radio'; 288 result = type.toLowerCase() == 'radio';
292 289
293 return result; 290 return result;
294 }, inputs); 291 }, inputs);
295 292
296 if (radios.length > 0) { 293 if (radios.length > 0) {
297 var updatedRadios; 294 var updatedRadios;
298 295
299 updatedRadios = {}; 296 updatedRadios = {};
300 MochiKit.Iter.forEach(radios, MochiKit.Base.bind(function(aRadio) { 297 MochiKit.Iter.forEach(radios, MochiKit.Base.bind(function(aRadio) {
301 varradioConfiguration; 298 varradioConfiguration;
302 299
303 radioConfiguration = updatedRadios[aRadio['name']]; 300 radioConfiguration = updatedRadios[aRadio['name']];
304 if (radioConfiguration == null) { 301 if (radioConfiguration == null) {
305 radioConfiguration = {type:'radio', name:aRadio['name'], options:[]}; 302 radioConfiguration = {type:'radio', name:aRadio['name'], options:[]};
306 updatedRadios[aRadio['name']] = radioConfiguration; 303 updatedRadios[aRadio['name']] = radioConfiguration;
307 } 304 }
308 305
309 //TODO: remove the value: field and replace it with element.dom.value = <some value> 306 //TODO: remove the value: field and replace it with element.dom.value = <some value>
310 radioConfiguration.options.push({value:aRadio['value'], checked:aRadio['checked']}); 307 radioConfiguration.options.push({value:aRadio['value'], checked:aRadio['checked']});
311 308
312 //TODO: shoud remove the 'formValues' call, as it is now deferred 309 //TODO: shoud remove the 'formValues' call, as it is now deferred
313 // if ((aRadio['checked'] == true) && (this.formValues()[aRadio['name']] == null)) { 310 // if ((aRadio['checked'] == true) && (this.formValues()[aRadio['name']] == null)) {
314 // this.formValues()[aRadio['name']] = aRadio['value']; 311 // this.formValues()[aRadio['name']] = aRadio['value'];
315 // } 312 // }
316 }, this)) 313 }, this))
317 314
318 updatedInputs = MochiKit.Base.concat(updatedInputs, MochiKit.Base.values(updatedRadios)); 315 updatedInputs = MochiKit.Base.concat(updatedInputs, MochiKit.Base.values(updatedRadios));
319 } 316 }
320 317
321 delete result.inputs; 318 delete result.inputs;
322 result.inputs = updatedInputs; 319 result.inputs = updatedInputs;
323 320
324 return result; 321 return result;
325 }, 322 },
326 323
327 '_fixConfiguration': function (aConfiguration) { 324 '_fixConfiguration': function (aConfiguration) {
328 var fixedConfiguration; 325 var fixedConfiguration;
329 // var inputs; 326 // var inputs;
330 // var bindings; 327 // var bindings;
331 // var i,c; 328 // var i,c;
332 329
333 fixedConfiguration = Clipperz.Base.deepClone(aConfiguration); 330 fixedConfiguration = Clipperz.Base.deepClone(aConfiguration);
334 331
335//console.log("PROCESS CONFIGURATION", aConfiguration); 332//console.log("PROCESS CONFIGURATION", aConfiguration);
336 switch (aConfiguration['bookmarkletVersion']) { 333 switch (aConfiguration['bookmarkletVersion']) {
337 case '0.1': 334 case '0.1':
338 fixedConfiguration['formData'] = this.fixFormDataFromBookmarkletVersion_0_1(aConfiguration['formData']); 335 fixedConfiguration['formData'] = this.fixFormDataFromBookmarkletVersion_0_1(aConfiguration['formData']);
339 break; 336 break;
340 case '0.2': 337 case '0.2':
341 fixedConfiguration['formData'] = aConfiguration['formData']; 338 fixedConfiguration['formData'] = aConfiguration['formData'];
342 break; 339 break;
343 } 340 }
344 341
345 / * 342 / *
346 aConfiguration['_inputs'] = []; 343 aConfiguration['_inputs'] = [];
347 c = formData['inputs'].length; 344 c = formData['inputs'].length;
348 for (i=0; i<c; i++) { 345 for (i=0; i<c; i++) {
349 aConfiguration['_inputs'].push(new Clipperz.PM.DataModel.DirectLoginInput(formData['inputs'][i])); 346 aConfiguration['_inputs'].push(new Clipperz.PM.DataModel.DirectLoginInput(formData['inputs'][i]));
350 } 347 }
351* / 348* /
352/ * 349/ *
353 aConfiguration['_bindings'] = {}; 350 aConfiguration['_bindings'] = {};
354 if (aConfiguration['legacyBindingData'] == null) { 351 if (aConfiguration['legacyBindingData'] == null) {
355 if (aConfiguration['bindingData'] != null) { 352 if (aConfiguration['bindingData'] != null) {
356 var bindingKey; 353 var bindingKey;
357 354
358 for (bindingKey in aConfiguration['bindingData']) { 355 for (bindingKey in aConfiguration['bindingData']) {
359 var newBinding; 356 var newBinding;
360 357
361 newBinding = new Clipperz.PM.DataModel.DirectLoginBinding(bindingKey, {fieldKey:aConfiguration['bindingData'][bindingKey]}); 358 newBinding = new Clipperz.PM.DataModel.DirectLoginBinding(bindingKey, {fieldKey:aConfiguration['bindingData'][bindingKey]});
362 aConfiguration['_bindings'][newBinding.key()] = newBinding; 359 aConfiguration['_bindings'][newBinding.key()] = newBinding;
363 } 360 }
364 } else { 361 } else {
365 var editableFields; 362 var editableFields;
366 363
367 editableFields = MochiKit.Base.filter(function(aField) { 364 editableFields = MochiKit.Base.filter(function(aField) {
368 var result; 365 var result;
369 var type; 366 var type;
370 367
371 type = aField['type'].toLowerCase(); 368 type = aField['type'].toLowerCase();
372 result = ((type != 'hidden') && (type != 'submit') && (type != 'checkbox') && (type != 'radio') && (type != 'select')); 369 result = ((type != 'hidden') && (type != 'submit') && (type != 'checkbox') && (type != 'radio') && (type != 'select'));
373 370
374 return result; 371 return result;
375 }, aConfiguration['_inputs']); 372 }, aConfiguration['_inputs']);
376 373
377 MochiKit.Iter.forEach(editableFields, MochiKit.Base.bind(function(anEditableField) { 374 MochiKit.Iter.forEach(editableFields, MochiKit.Base.bind(function(anEditableField) {
378 var newBinding; 375 var newBinding;
379 376
380 newBinding = new Clipperz.PM.DataModel.DirectLoginBinding(anEditableField['name']); 377 newBinding = new Clipperz.PM.DataModel.DirectLoginBinding(anEditableField['name']);
381 aConfiguration['_bindings'][newBinding.key()] = newBinding; 378 aConfiguration['_bindings'][newBinding.key()] = newBinding;
382 }, this)); 379 }, this));
383 } 380 }
384 381
385 } else { 382 } else {
386 var bindingKey; 383 var bindingKey;
387 384
388 for (bindingKey in aConfiguration['legacyBindingData']) { 385 for (bindingKey in aConfiguration['legacyBindingData']) {
389 var newBinding; 386 var newBinding;
390 387
391 newBinding = new Clipperz.PM.DataModel.DirectLoginBinding(bindingKey, {fieldName:aConfiguration['legacyBindingData'][bindingKey]}); 388 newBinding = new Clipperz.PM.DataModel.DirectLoginBinding(bindingKey, {fieldName:aConfiguration['legacyBindingData'][bindingKey]});
392 aConfiguration['_bindings'][newBinding.key()] = newBinding; 389 aConfiguration['_bindings'][newBinding.key()] = newBinding;
393 } 390 }
394 } 391 }
395* / 392* /
396 393
397 return fixedConfiguration; 394 return fixedConfiguration;
398 }, 395 },
399 396
400 //------------------------------------------------------------------------- 397 //-------------------------------------------------------------------------
401 398
402 'getObjectDataStore': function () { 399 'getObjectDataStore': function () {
403 var deferredResult; 400 var deferredResult;
404 401
405 deferredResult = new Clipperz.Async.Deferred("DirectLogin.getObjectDataStore", {trace:false}); 402 deferredResult = new Clipperz.Async.Deferred("DirectLogin.getObjectDataStore", {trace:false});
406 deferredResult.acquireLock(this.objectDataStoreDeferredLock()); 403 deferredResult.acquireLock(this.objectDataStoreDeferredLock());
407 deferredResult.addCallback(MochiKit.Base.bind(function () { 404 deferredResult.addCallback(MochiKit.Base.bind(function () {
408 var innerDeferredResult; 405 var innerDeferredResult;
diff --git a/frontend/gamma/js/Clipperz/PM/DataModel/DirectLoginBinding.js b/frontend/gamma/js/Clipperz/PM/DataModel/DirectLoginBinding.js
index fd55c63..4377853 100644
--- a/frontend/gamma/js/Clipperz/PM/DataModel/DirectLoginBinding.js
+++ b/frontend/gamma/js/Clipperz/PM/DataModel/DirectLoginBinding.js
@@ -1,125 +1,122 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
30if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } 27if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
31if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; } 28if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; }
32 29
33 30
34//############################################################################# 31//#############################################################################
35 32
36Clipperz.PM.DataModel.DirectLoginBinding = function(aDirectLogin, args) { 33Clipperz.PM.DataModel.DirectLoginBinding = function(aDirectLogin, args) {
37 args = args || {}; 34 args = args || {};
38 35
39 this._directLogin = aDirectLogin|| Clipperz.Base.exception.raise('MandatoryParameter'); 36 this._directLogin = aDirectLogin|| Clipperz.Base.exception.raise('MandatoryParameter');
40 37
41 this._key = args.key|| Clipperz.Base.exception.raise('MandatoryParameter'); 38 this._key = args.key|| Clipperz.Base.exception.raise('MandatoryParameter');
42 this._fieldKey = args.field || /* this.directLogin().fieldWithName(args.fieldName).reference() || */null; 39 this._fieldKey = args.field || /* this.directLogin().fieldWithName(args.fieldName).reference() || */null;
43 40
44 return this; 41 return this;
45} 42}
46 43
47Clipperz.PM.DataModel.DirectLoginBinding.prototype = MochiKit.Base.update(null, { 44Clipperz.PM.DataModel.DirectLoginBinding.prototype = MochiKit.Base.update(null, {
48 45
49 'toString': function() { 46 'toString': function() {
50 return "DirectLoginBinding (" + this.key() + ", " + this.fieldKey() + ")"; 47 return "DirectLoginBinding (" + this.key() + ", " + this.fieldKey() + ")";
51 }, 48 },
52 49
53 //------------------------------------------------------------------------- 50 //-------------------------------------------------------------------------
54 51
55 'directLogin': function () { 52 'directLogin': function () {
56 return this._directLogin; 53 return this._directLogin;
57 }, 54 },
58 55
59 //------------------------------------------------------------------------- 56 //-------------------------------------------------------------------------
60 57
61 'key': function() { 58 'key': function() {
62 return this._key; 59 return this._key;
63 }, 60 },
64 61
65 //------------------------------------------------------------------------- 62 //-------------------------------------------------------------------------
66 63
67 'fieldKey': function() { 64 'fieldKey': function() {
68 return this._fieldKey; 65 return this._fieldKey;
69 }, 66 },
70 67
71 'setFieldKey': function(aValue) { 68 'setFieldKey': function(aValue) {
72 this._fieldKey = aValue; 69 this._fieldKey = aValue;
73 70
74 return this.directLogin().setValue('bindingData' + '.' + this.key(), aValue); 71 return this.directLogin().setValue('bindingData' + '.' + this.key(), aValue);
75 }, 72 },
76 73
77 //'fieldName': function() { 74 //'fieldName': function() {
78 // return this._fieldName; 75 // return this._fieldName;
79 //}, 76 //},
80 77
81 //------------------------------------------------------------------------- 78 //-------------------------------------------------------------------------
82 79
83 'field': function() { 80 'field': function() {
84 var deferredResult; 81 var deferredResult;
85 82
86 if (this.fieldKey() != null) { 83 if (this.fieldKey() != null) {
87 deferredResult = Clipperz.Async.callbacks("DirectLoginBinding.field [1]", [ 84 deferredResult = Clipperz.Async.callbacks("DirectLoginBinding.field [1]", [
88 MochiKit.Base.method(this.directLogin().record(), 'fields'), 85 MochiKit.Base.method(this.directLogin().record(), 'fields'),
89 MochiKit.Base.itemgetter(this.fieldKey()) 86 MochiKit.Base.itemgetter(this.fieldKey())
90 ], {trace:false}); 87 ], {trace:false});
91 // } else if (this.fieldName() != null) { 88 // } else if (this.fieldName() != null) {
92 // WTF = TODO; 89 // WTF = TODO;
93 // result = this.directLogin().record().fieldWithName(this.fieldName()); 90 // result = this.directLogin().record().fieldWithName(this.fieldName());
94 // 91 //
95 // this.setFieldKey(result.key()); 92 // this.setFieldKey(result.key());
96 } else { 93 } else {
97 deferredResult = MochiKit.Async.succeed(null); 94 deferredResult = MochiKit.Async.succeed(null);
98 } 95 }
99 96
100 return deferredResult; 97 return deferredResult;
101 }, 98 },
102 99
103 'setField': function (aField) { 100 'setField': function (aField) {
104 this.setFieldKey(aField.reference()); 101 this.setFieldKey(aField.reference());
105 }, 102 },
106 103
107 //------------------------------------------------------------------------- 104 //-------------------------------------------------------------------------
108/* 105/*
109 'fieldValue': function () { 106 'fieldValue': function () {
110 return Clipperz.Async.callbacks("DirectLoginBinding.fieldValue", [ 107 return Clipperz.Async.callbacks("DirectLoginBinding.fieldValue", [
111 MochiKit.Base.method('field'), 108 MochiKit.Base.method('field'),
112 MochiKit.Base.methodcaller('value') 109 MochiKit.Base.methodcaller('value')
113 ], {trace:false}); 110 ], {trace:false});
114 }, 111 },
115*/ 112*/
116 //------------------------------------------------------------------------- 113 //-------------------------------------------------------------------------
117 114
118 'serializedData': function() { 115 'serializedData': function() {
119 return this.fieldKey(); 116 return this.fieldKey();
120 }, 117 },
121 118
122 //------------------------------------------------------------------------- 119 //-------------------------------------------------------------------------
123 __syntaxFix__: "syntax fix" 120 __syntaxFix__: "syntax fix"
124}); 121});
125 122
diff --git a/frontend/gamma/js/Clipperz/PM/DataModel/DirectLoginFormValue.js b/frontend/gamma/js/Clipperz/PM/DataModel/DirectLoginFormValue.js
index 939ab4b..a461197 100644
--- a/frontend/gamma/js/Clipperz/PM/DataModel/DirectLoginFormValue.js
+++ b/frontend/gamma/js/Clipperz/PM/DataModel/DirectLoginFormValue.js
@@ -1,107 +1,104 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
30if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } 27if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
31if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; } 28if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; }
32 29
33 30
34//############################################################################# 31//#############################################################################
35 32
36Clipperz.PM.DataModel.DirectLoginFormValue = function(aDirectLogin, args) { 33Clipperz.PM.DataModel.DirectLoginFormValue = function(aDirectLogin, args) {
37 args = args || {}; 34 args = args || {};
38 35
39 this._directLogin = aDirectLogin|| Clipperz.Base.exception.raise('MandatoryParameter'); 36 this._directLogin = aDirectLogin|| Clipperz.Base.exception.raise('MandatoryParameter');
40 37
41 this._key = args.key || Clipperz.Base.exception.raise('MandatoryParameter'); 38 this._key = args.key || Clipperz.Base.exception.raise('MandatoryParameter');
42 this._fieldOptions = args.fieldOptions|| Clipperz.Base.exception.raise('MandatoryParameter'); 39 this._fieldOptions = args.fieldOptions|| Clipperz.Base.exception.raise('MandatoryParameter');
43 this._value = args.value || null; 40 this._value = args.value || null;
44 41
45 return this; 42 return this;
46} 43}
47 44
48Clipperz.PM.DataModel.DirectLoginFormValue.prototype = MochiKit.Base.update(null, { 45Clipperz.PM.DataModel.DirectLoginFormValue.prototype = MochiKit.Base.update(null, {
49 46
50 'toString': function() { 47 'toString': function() {
51 return "DirectLoginFormValue (" + this.key() + ", " + this.value() + ")"; 48 return "DirectLoginFormValue (" + this.key() + ", " + this.value() + ")";
52 }, 49 },
53 50
54 //------------------------------------------------------------------------- 51 //-------------------------------------------------------------------------
55 52
56 'directLogin': function () { 53 'directLogin': function () {
57 return this._directLogin; 54 return this._directLogin;
58 }, 55 },
59 56
60 //------------------------------------------------------------------------- 57 //-------------------------------------------------------------------------
61 58
62 'key': function() { 59 'key': function() {
63 return this._key; 60 return this._key;
64 }, 61 },
65 62
66 //------------------------------------------------------------------------- 63 //-------------------------------------------------------------------------
67 64
68 'fieldOptions': function() { 65 'fieldOptions': function() {
69 return this._fieldOptions; 66 return this._fieldOptions;
70 }, 67 },
71 68
72 //------------------------------------------------------------------------- 69 //-------------------------------------------------------------------------
73 70
74 'type': function () { 71 'type': function () {
75 return this.fieldOptions()['type']; 72 return this.fieldOptions()['type'];
76 }, 73 },
77 74
78 //------------------------------------------------------------------------- 75 //-------------------------------------------------------------------------
79 76
80 'value': function() { 77 'value': function() {
81 varresult; 78 varresult;
82 79
83 result = this._value; 80 result = this._value;
84 81
85 // if ((result == null) && (this.type() == 'checkbox')) { 82 // if ((result == null) && (this.type() == 'checkbox')) {
86 // result = false; 83 // result = false;
87 // }; 84 // };
88 85
89 return result; 86 return result;
90 }, 87 },
91 88
92 'setValue': function (aValue) { 89 'setValue': function (aValue) {
93//console.log("DirectLoginFormValue.setValue", aValue); 90//console.log("DirectLoginFormValue.setValue", aValue);
94 this._value = aValue; 91 this._value = aValue;
95 return this.directLogin().setValue('formValues' + '.' + this.key(), aValue); 92 return this.directLogin().setValue('formValues' + '.' + this.key(), aValue);
96 }, 93 },
97 94
98 //------------------------------------------------------------------------- 95 //-------------------------------------------------------------------------
99/* 96/*
100 'serializedData': function() { 97 'serializedData': function() {
101 return this.value(); 98 return this.value();
102 }, 99 },
103*/ 100*/
104 //------------------------------------------------------------------------- 101 //-------------------------------------------------------------------------
105 __syntaxFix__: "syntax fix" 102 __syntaxFix__: "syntax fix"
106}); 103});
107 104
diff --git a/frontend/gamma/js/Clipperz/PM/DataModel/DirectLoginInput.js b/frontend/gamma/js/Clipperz/PM/DataModel/DirectLoginInput.js
index 673d5ee..8188389 100644
--- a/frontend/gamma/js/Clipperz/PM/DataModel/DirectLoginInput.js
+++ b/frontend/gamma/js/Clipperz/PM/DataModel/DirectLoginInput.js
@@ -1,203 +1,200 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
30if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } 27if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
31if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; } 28if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; }
32 29
33//############################################################################# 30//#############################################################################
34 31
35Clipperz.PM.DataModel.DirectLoginInput = function(args) { 32Clipperz.PM.DataModel.DirectLoginInput = function(args) {
36 this._args = args; 33 this._args = args;
37 34
38 return this; 35 return this;
39} 36}
40 37
41Clipperz.PM.DataModel.DirectLoginInput.prototype = MochiKit.Base.update(null, { 38Clipperz.PM.DataModel.DirectLoginInput.prototype = MochiKit.Base.update(null, {
42 39
43 'args': function() { 40 'args': function() {
44 return this._args; 41 return this._args;
45 }, 42 },
46 43
47 //------------------------------------------------------------------------- 44 //-------------------------------------------------------------------------
48 45
49 'name': function() { 46 'name': function() {
50 return this.args()['name']; 47 return this.args()['name'];
51 }, 48 },
52 49
53 //------------------------------------------------------------------------- 50 //-------------------------------------------------------------------------
54 51
55 'type': function() { 52 'type': function() {
56 var result; 53 var result;
57 54
58 result = this.args()['type']; 55 result = this.args()['type'];
59 56
60 if (result != null) { 57 if (result != null) {
61 result = result.toLowerCase(); 58 result = result.toLowerCase();
62 } 59 }
63 return result; 60 return result;
64 }, 61 },
65 62
66 //------------------------------------------------------------------------- 63 //-------------------------------------------------------------------------
67 64
68 'options': function() { 65 'options': function() {
69 return this.args()['options']; 66 return this.args()['options'];
70 }, 67 },
71 68
72 //------------------------------------------------------------------------- 69 //-------------------------------------------------------------------------
73 70
74 'value': function() { 71 'value': function() {
75 return this.args()['value']; 72 return this.args()['value'];
76 }, 73 },
77 74
78 //------------------------------------------------------------------------- 75 //-------------------------------------------------------------------------
79 /* 76 /*
80 'formConfiguration': function(someFormValues, someBindings, someFields) { 77 'formConfiguration': function(someFormValues, someBindings, someFields) {
81 var result; 78 var result;
82//console.log("### DirectLoginInput.formConfiguration", someFields); 79//console.log("### DirectLoginInput.formConfiguration", someFields);
83 if (this.shouldSetValue()) { 80 if (this.shouldSetValue()) {
84 switch (this.type()) { 81 switch (this.type()) {
85 case 'select': 82 case 'select':
86 var currentValue; 83 var currentValue;
87 var options; 84 var options;
88 85
89 // currentValue = this.directLogin()._configuration['formValues'][this.name()]; 86 // currentValue = this.directLogin()._configuration['formValues'][this.name()];
90 currentValue = someFormValues[this.name()]; 87 currentValue = someFormValues[this.name()];
91 options = this.args()['options']; 88 options = this.args()['options'];
92 89
93 result = MochiKit.DOM.SELECT({name:this.name()}, 90 result = MochiKit.DOM.SELECT({name:this.name()},
94 MochiKit.Base.map(function(anOption) { 91 MochiKit.Base.map(function(anOption) {
95 var options; 92 var options;
96 93
97 options = {value:anOption['value']}; 94 options = {value:anOption['value']};
98 if (currentValue == anOption['value']) { 95 if (currentValue == anOption['value']) {
99 options.selected = true; 96 options.selected = true;
100 } 97 }
101 98
102 return MochiKit.DOM.OPTION(options, anOption['label']) 99 return MochiKit.DOM.OPTION(options, anOption['label'])
103 }, options) 100 }, options)
104 ) 101 )
105 break; 102 break;
106 case 'checkbox': 103 case 'checkbox':
107 var options; 104 var options;
108 105
109 options = {type:'checkbox', name: this.name()}; 106 options = {type:'checkbox', name: this.name()};
110 // if (this.directLogin()._configuration['formValues'][this.name()] == true) { 107 // if (this.directLogin()._configuration['formValues'][this.name()] == true) {
111 if (someFormValues[this.name()] == true) { 108 if (someFormValues[this.name()] == true) {
112 options['checked'] = true; 109 options['checked'] = true;
113 }; 110 };
114 111
115 result = MochiKit.DOM.INPUT(options, null); 112 result = MochiKit.DOM.INPUT(options, null);
116 break; 113 break;
117 case 'radio': 114 case 'radio':
118 var currentName; 115 var currentName;
119 var currentValue; 116 var currentValue;
120 var options; 117 var options;
121 118
122 currentName = this.name(); 119 currentName = this.name();
123 // currentValue = this.directLogin()._configuration['formValues'][this.name()]; 120 // currentValue = this.directLogin()._configuration['formValues'][this.name()];
124 currentValue = someFormValues[this.name()]; 121 currentValue = someFormValues[this.name()];
125 options = this.args()['options']; 122 options = this.args()['options'];
126 123
127 result = MochiKit.DOM.DIV(null, 124 result = MochiKit.DOM.DIV(null,
128 MochiKit.Base.map(function(anOption) { 125 MochiKit.Base.map(function(anOption) {
129 var options; 126 var options;
130 var isChecked; 127 var isChecked;
131 var inputNode; 128 var inputNode;
132 var divNode; 129 var divNode;
133 130
134 options = {type:'radio', name:currentName, value:anOption['value']} 131 options = {type:'radio', name:currentName, value:anOption['value']}
135 isChecked = (currentValue == anOption['value']); 132 isChecked = (currentValue == anOption['value']);
136 if (isChecked) { 133 if (isChecked) {
137 options.checked = true; 134 options.checked = true;
138 } 135 }
139 136
140 if (Clipperz_IEisBroken == true) { 137 if (Clipperz_IEisBroken == true) {
141 var checkedValue; 138 var checkedValue;
142 139
143 checkedValue = (isChecked ? " CHECKED" : ""); 140 checkedValue = (isChecked ? " CHECKED" : "");
144 inputNode = MochiKit.DOM.currentDocument().createElement("<INPUT TYPE='RADIO' NAME='" + currentName + "' VALUE='" + anOption['value'] + "'" + checkedValue + ">"); 141 inputNode = MochiKit.DOM.currentDocument().createElement("<INPUT TYPE='RADIO' NAME='" + currentName + "' VALUE='" + anOption['value'] + "'" + checkedValue + ">");
145 } else { 142 } else {
146 inputNode = MochiKit.DOM.INPUT(options, anOption['value']); 143 inputNode = MochiKit.DOM.INPUT(options, anOption['value']);
147 } 144 }
148 divNode = MochiKit.DOM.DIV(null, inputNode); 145 divNode = MochiKit.DOM.DIV(null, inputNode);
149 146
150 return divNode; 147 return divNode;
151 }, options) 148 }, options)
152 ); 149 );
153 break; 150 break;
154 } 151 }
155 } else { 152 } else {
156 var binding; 153 var binding;
157 // binding = this.directLogin().bindings()[this.name()]; 154 // binding = this.directLogin().bindings()[this.name()];
158 binding = someBindings[this.name()]; 155 binding = someBindings[this.name()];
159 156
160//console.log("### binding", binding); 157//console.log("### binding", binding);
161//if (binding != null) { 158//if (binding != null) {
162 ///console.log(" binding.field()", binding.field()); 159 ///console.log(" binding.field()", binding.field());
163 ///console.log(" binding.field().value()", binding.field().value()); 160 ///console.log(" binding.field().value()", binding.field().value());
164 //console.log(" someFields[binding.fieldKey()].value()", someFields[binding.fieldKey()].value()); 161 //console.log(" someFields[binding.fieldKey()].value()", someFields[binding.fieldKey()].value());
165//} 162//}
166 result = MochiKit.DOM.INPUT({ 163 result = MochiKit.DOM.INPUT({
167 type:((this.type() != 'password') ? this.type() : 'text'), 164 type:((this.type() != 'password') ? this.type() : 'text'),
168 name:this.name(), 165 name:this.name(),
169 // value:((binding != null)? binding.field().value() : this.value()) 166 // value:((binding != null)? binding.field().value() : this.value())
170 value:((binding != null)? someFields[binding.fieldKey()]['value'] : this.value()) 167 value:((binding != null)? someFields[binding.fieldKey()]['value'] : this.value())
171 // value:((binding != null)? someFields[binding.fieldKey()].value() : this.value()) 168 // value:((binding != null)? someFields[binding.fieldKey()].value() : this.value())
172 }, null); 169 }, null);
173 } 170 }
174 171
175 return result; 172 return result;
176 }, 173 },
177 */ 174 */
178 //------------------------------------------------------------------------- 175 //-------------------------------------------------------------------------
179 176
180 'needsFormValue': function() { 177 'needsFormValue': function() {
181 var type; 178 var type;
182 var result; 179 var result;
183 180
184 type = this.type(); 181 type = this.type();
185 result = ((type == 'checkbox') || (type == 'radio') || (type == 'select')); 182 result = ((type == 'checkbox') || (type == 'radio') || (type == 'select'));
186 183
187 return result; 184 return result;
188 }, 185 },
189 186
190 'needsBinding': function() { 187 'needsBinding': function() {
191 var type; 188 var type;
192 var result; 189 var result;
193 190
194 type = this.type(); 191 type = this.type();
195 result = ((type == 'text') || (type == 'password')); 192 result = ((type == 'text') || (type == 'password'));
196 193
197 return result; 194 return result;
198 }, 195 },
199 196
200 //------------------------------------------------------------------------- 197 //-------------------------------------------------------------------------
201 __syntaxFix__: "syntax fix" 198 __syntaxFix__: "syntax fix"
202}); 199});
203 200
diff --git a/frontend/gamma/js/Clipperz/PM/DataModel/EncryptedRemoteObject.js b/frontend/gamma/js/Clipperz/PM/DataModel/EncryptedRemoteObject.js
index 3408b08..cdeec8b 100644
--- a/frontend/gamma/js/Clipperz/PM/DataModel/EncryptedRemoteObject.js
+++ b/frontend/gamma/js/Clipperz/PM/DataModel/EncryptedRemoteObject.js
@@ -1,408 +1,405 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29try { if (typeof(Clipperz.KeyValueObjectStore) == 'undefined') { throw ""; }} catch (e) { 26try { if (typeof(Clipperz.KeyValueObjectStore) == 'undefined') { throw ""; }} catch (e) {
30 throw "Clipperz.PM.DataModel.EncryptedRemoteObject depends on Clipperz.KeyValueObjectStore!"; 27 throw "Clipperz.PM.DataModel.EncryptedRemoteObject depends on Clipperz.KeyValueObjectStore!";
31} 28}
32 29
33if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } 30if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
34if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; } 31if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; }
35 32
36Clipperz.PM.DataModel.EncryptedRemoteObject = function(args) { 33Clipperz.PM.DataModel.EncryptedRemoteObject = function(args) {
37 args = args || {}; 34 args = args || {};
38 35
39 this._name = args.name || null; 36 this._name = args.name || null;
40 this._reference = args.reference || Clipperz.PM.Crypto.randomKey(); 37 this._reference = args.reference || Clipperz.PM.Crypto.randomKey();
41 this._isBrandNew = ((args.reference == null) && (args.remoteData == null)); 38 this._isBrandNew = ((args.reference == null) && (args.remoteData == null));
42 39
43 if ((this._isBrandNew == false) && (args['retrieveKeyFunction'] == null)) { 40 if ((this._isBrandNew == false) && (args['retrieveKeyFunction'] == null)) {
44 Clipperz.Base.exception.raise('MandatoryParameter'); 41 Clipperz.Base.exception.raise('MandatoryParameter');
45 } else { 42 } else {
46 this._retrieveKeyFunction = args['retrieveKeyFunction']; 43 this._retrieveKeyFunction = args['retrieveKeyFunction'];
47 } 44 }
48 45
49 this._retrieveRemoteDataFunction = args.retrieveRemoteDataFunction|| null; 46 this._retrieveRemoteDataFunction = args.retrieveRemoteDataFunction|| null;
50 this._remoteData = args.remoteData || null; 47 this._remoteData = args.remoteData || null;
51 // this._remoteData = args.remoteData ? Clipperz.Base.deepClone(args.remoteData) : null; 48 // this._remoteData = args.remoteData ? Clipperz.Base.deepClone(args.remoteData) : null;
52 if ((!this._isBrandNew) && ((this._retrieveRemoteDataFunction == null) && (this._remoteData == null))) { 49 if ((!this._isBrandNew) && ((this._retrieveRemoteDataFunction == null) && (this._remoteData == null))) {
53 Clipperz.Base.exception.raise('MandatoryParameter'); 50 Clipperz.Base.exception.raise('MandatoryParameter');
54 } 51 }
55 52
56 53
57 this._encryptedDataKeypath = args.encryptedDataKeypath || 'data'; //Clipperz.Base.exception.raise('MandatoryParameter'); 54 this._encryptedDataKeypath = args.encryptedDataKeypath || 'data'; //Clipperz.Base.exception.raise('MandatoryParameter');
58 this._encryptedVersionKeypath = args.encryptedVersionKeypath || 'version';//Clipperz.Base.exception.raise('MandatoryParameter'); 55 this._encryptedVersionKeypath = args.encryptedVersionKeypath || 'version';//Clipperz.Base.exception.raise('MandatoryParameter');
59 56
60 57
61 this._transientState = null; 58 this._transientState = null;
62 this._deferredLocks = {}; 59 this._deferredLocks = {};
63 60
64 if (this._isBrandNew == true) { 61 if (this._isBrandNew == true) {
65 this._objectDataStore = new Clipperz.KeyValueObjectStore(/*{'name':'EncryptedRemoteObject.objectDataStore [1]'}*/); 62 this._objectDataStore = new Clipperz.KeyValueObjectStore(/*{'name':'EncryptedRemoteObject.objectDataStore [1]'}*/);
66 } else { 63 } else {
67 this._objectDataStore = null; 64 this._objectDataStore = null;
68 } 65 }
69 66
70 return this; 67 return this;
71} 68}
72 69
73// 70//
74 // Basic data workflow 71 // Basic data workflow
75 //======================= 72 //=======================
76// 73//
77 //getRemoteData 74 //getRemoteData
78 // unpackRemoteData 75 // unpackRemoteData
79 // getDecryptData [encryptedDataKeypath, encryptedVersionKeypath] 76 // getDecryptData [encryptedDataKeypath, encryptedVersionKeypath]
80 // unpackData 77 // unpackData
81 // 78 //
82 // 79 //
83 // ?? packData 80 // ?? packData
84 // ?? encryptDataWithKey 81 // ?? encryptDataWithKey
85 // ??packRemoteData [encryptedDataKeypath (?), encryptedVersionKeypath (?)] 82 // ??packRemoteData [encryptedDataKeypath (?), encryptedVersionKeypath (?)]
86// 83//
87 84
88Clipperz.PM.DataModel.EncryptedRemoteObject.prototype = MochiKit.Base.update(null, { 85Clipperz.PM.DataModel.EncryptedRemoteObject.prototype = MochiKit.Base.update(null, {
89 86
90 'toString': function () { 87 'toString': function () {
91 return "Clipperz.PM.DataModel.EncryptedRemoteObject" + (this.name() != null ? " - " + this.name() : ""); 88 return "Clipperz.PM.DataModel.EncryptedRemoteObject" + (this.name() != null ? " - " + this.name() : "");
92 }, 89 },
93 90
94 //------------------------------------------------------------------------- 91 //-------------------------------------------------------------------------
95 92
96 'name': function () { 93 'name': function () {
97 return this._name; 94 return this._name;
98 }, 95 },
99 96
100 //------------------------------------------------------------------------- 97 //-------------------------------------------------------------------------
101 98
102 'reference': function () { 99 'reference': function () {
103 return this._reference; 100 return this._reference;
104 }, 101 },
105 102
106 'setReference': function (aValue) { 103 'setReference': function (aValue) {
107 this._reference = aValue; 104 this._reference = aValue;
108 105
109 return this._reference; 106 return this._reference;
110 }, 107 },
111 108
112 //------------------------------------------------------------------------- 109 //-------------------------------------------------------------------------
113 110
114 'transientState': function () { 111 'transientState': function () {
115 if (this._transientState == null) { 112 if (this._transientState == null) {
116 this._transientState = new Clipperz.KeyValueObjectStore(/*{'name':'EncryptedRemoteObject.transientState [2]'}*/); 113 this._transientState = new Clipperz.KeyValueObjectStore(/*{'name':'EncryptedRemoteObject.transientState [2]'}*/);
117 } 114 }
118 115
119 return this._transientState; 116 return this._transientState;
120 }, 117 },
121 118
122 'resetTransientState': function (isCommitting) { 119 'resetTransientState': function (isCommitting) {
123 if (this._transientState != null) { 120 if (this._transientState != null) {
124 this._transientState.removeAllData(); 121 this._transientState.removeAllData();
125 } 122 }
126 123
127 this._transientState = null; 124 this._transientState = null;
128 }, 125 },
129 126
130 //------------------------------------------------------------------------- 127 //-------------------------------------------------------------------------
131 128
132 'isBrandNew': function () { 129 'isBrandNew': function () {
133 return this._isBrandNew; 130 return this._isBrandNew;
134 }, 131 },
135 132
136 //------------------------------------------------------------------------- 133 //-------------------------------------------------------------------------
137 134
138 'getKey': function () { 135 'getKey': function () {
139 var deferredResult; 136 var deferredResult;
140 var deferredLock; 137 var deferredLock;
141 138
142 deferredLock = this.getDeferredLockForKey('key'); 139 deferredLock = this.getDeferredLockForKey('key');
143 140
144 deferredResult = new Clipperz.Async.Deferred("EncryptedRemoteObject.getKey", {trace:false}); 141 deferredResult = new Clipperz.Async.Deferred("EncryptedRemoteObject.getKey", {trace:false});
145 deferredResult.acquireLock(deferredLock); 142 deferredResult.acquireLock(deferredLock);
146 deferredResult.addMethod( 143 deferredResult.addMethod(
147 this.decryptedDataStore(), 144 this.decryptedDataStore(),
148 'deferredGetOrSet', 145 'deferredGetOrSet',
149 'decryptionKey', 146 'decryptionKey',
150 MochiKit.Base.partial(this.retrieveKeyFunction(), this.reference()) 147 MochiKit.Base.partial(this.retrieveKeyFunction(), this.reference())
151 ); 148 );
152 deferredResult.releaseLock(deferredLock); 149 deferredResult.releaseLock(deferredLock);
153 deferredResult.callback(); 150 deferredResult.callback();
154 151
155 return deferredResult; 152 return deferredResult;
156 }, 153 },
157 154
158 // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155 // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
159 156
160 'retrieveKeyFunction': function () { 157 'retrieveKeyFunction': function () {
161 return this._retrieveKeyFunction; 158 return this._retrieveKeyFunction;
162 }, 159 },
163 160
164 'setRetrieveKeyFunction': function (aFunction) { 161 'setRetrieveKeyFunction': function (aFunction) {
165 this._retrieveKeyFunction = aFunction; 162 this._retrieveKeyFunction = aFunction;
166 }, 163 },
167 164
168 //------------------------------------------------------------------------- 165 //-------------------------------------------------------------------------
169 166
170 'hasLoadedRemoteData': function () { 167 'hasLoadedRemoteData': function () {
171 return (this._remoteData != null); 168 return (this._remoteData != null);
172 }, 169 },
173 170
174 'getRemoteData': function () { 171 'getRemoteData': function () {
175 var deferredResult; 172 var deferredResult;
176 vardeferredLock; 173 vardeferredLock;
177 174
178 deferredLock = this.getDeferredLockForKey('remoteData'); 175 deferredLock = this.getDeferredLockForKey('remoteData');
179 176
180 deferredResult = new Clipperz.Async.Deferred("EncryptedRemoteObjects.getRemoteData", {trace:false}); 177 deferredResult = new Clipperz.Async.Deferred("EncryptedRemoteObjects.getRemoteData", {trace:false});
181 deferredResult.acquireLock(deferredLock); 178 deferredResult.acquireLock(deferredLock);
182 deferredResult.addCallback(MochiKit.Base.bind(function () { 179 deferredResult.addCallback(MochiKit.Base.bind(function () {
183 var innerDeferredResult; 180 var innerDeferredResult;
184 181
185 if (this._remoteData != null) { 182 if (this._remoteData != null) {
186 innerDeferredResult = MochiKit.Async.succeed(this._remoteData); 183 innerDeferredResult = MochiKit.Async.succeed(this._remoteData);
187 } else { 184 } else {
188 innerDeferredResult = Clipperz.Async.callbacks("EncryptedRemoteObjects.getRemoteData <inner deferred>", [ 185 innerDeferredResult = Clipperz.Async.callbacks("EncryptedRemoteObjects.getRemoteData <inner deferred>", [
189 MochiKit.Base.partial(this.retrieveRemoteDataFunction(), this.reference()), 186 MochiKit.Base.partial(this.retrieveRemoteDataFunction(), this.reference()),
190 MochiKit.Base.method(this, 'unpackRemoteData'), 187 MochiKit.Base.method(this, 'unpackRemoteData'),
191 MochiKit.Base.bind(function (someData) { 188 MochiKit.Base.bind(function (someData) {
192 this._remoteData = someData; 189 this._remoteData = someData;
193 return this._remoteData; 190 return this._remoteData;
194 }, this) 191 }, this)
195 ], {trace:false}); 192 ], {trace:false});
196 } 193 }
197 194
198 return innerDeferredResult; 195 return innerDeferredResult;
199 }, this)) 196 }, this))
200 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress'); 197 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
201 deferredResult.releaseLock(deferredLock); 198 deferredResult.releaseLock(deferredLock);
202 199
203 deferredResult.callback(); 200 deferredResult.callback();
204 201
205 return deferredResult; 202 return deferredResult;
206 }, 203 },
207 204
208 //------------------------------------------------------------------------- 205 //-------------------------------------------------------------------------
209 206
210 'unpackRemoteData': function (someData) { 207 'unpackRemoteData': function (someData) {
211 return MochiKit.Async.succeed(someData); 208 return MochiKit.Async.succeed(someData);
212 }, 209 },
213 210
214 //......................................................................... 211 //.........................................................................
215 212
216 'packRemoteData': function (someData) { 213 'packRemoteData': function (someData) {
217 var result; 214 var result;
218 215
219 result = { 216 result = {
220 'reference':this.reference(), 217 'reference':this.reference(),
221 'data': someData, 218 'data': someData,
222 'version': Clipperz.PM.Crypto.encryptingFunctions.currentVersion 219 'version': Clipperz.PM.Crypto.encryptingFunctions.currentVersion
223 }; 220 };
224 221
225 return MochiKit.Async.succeed(result); 222 return MochiKit.Async.succeed(result);
226 }, 223 },
227 224
228 //------------------------------------------------------------------------- 225 //-------------------------------------------------------------------------
229 226
230 'retrieveRemoteDataFunction': function () { 227 'retrieveRemoteDataFunction': function () {
231 return this._retrieveRemoteDataFunction; 228 return this._retrieveRemoteDataFunction;
232 }, 229 },
233 230
234 'setRetrieveRemoteDataFunction': function (aFunction) { 231 'setRetrieveRemoteDataFunction': function (aFunction) {
235 this._retrieveRemoteDataFunction = aFunction; 232 this._retrieveRemoteDataFunction = aFunction;
236 }, 233 },
237 234
238 //------------------------------------------------------------------------- 235 //-------------------------------------------------------------------------
239 236
240 'decryptedDataStore': function () { 237 'decryptedDataStore': function () {
241 if (this._decryptedDataStore == null) { 238 if (this._decryptedDataStore == null) {
242 this._decryptedDataStore = new Clipperz.KeyValueObjectStore(/*{'name':'EncryptedRemoteObject.decryptedDataStore [3]'}*/); 239 this._decryptedDataStore = new Clipperz.KeyValueObjectStore(/*{'name':'EncryptedRemoteObject.decryptedDataStore [3]'}*/);
243 }; 240 };
244 241
245 return this._decryptedDataStore; 242 return this._decryptedDataStore;
246 }, 243 },
247 244
248 //......................................................................... 245 //.........................................................................
249 246
250 'getDecryptedData': function () { 247 'getDecryptedData': function () {
251 var deferredResult; 248 var deferredResult;
252 var deferredLock; 249 var deferredLock;
253 250
254 deferredLock = this.getDeferredLockForKey('decryptedData'); 251 deferredLock = this.getDeferredLockForKey('decryptedData');
255 252
256 deferredResult = new Clipperz.Async.Deferred("EncryptedRemoteObject.getDecryptedData", {trace:false}); 253 deferredResult = new Clipperz.Async.Deferred("EncryptedRemoteObject.getDecryptedData", {trace:false});
257 deferredResult.acquireLock(deferredLock); 254 deferredResult.acquireLock(deferredLock);
258 deferredResult.addMethod(this, 'decryptedDataStore'); 255 deferredResult.addMethod(this, 'decryptedDataStore');
259 deferredResult.addCallback(MochiKit.Base.methodcaller('deferredGetOrSet', 'decryptedData', MochiKit.Base.bind(function () { 256 deferredResult.addCallback(MochiKit.Base.methodcaller('deferredGetOrSet', 'decryptedData', MochiKit.Base.bind(function () {
260 varinnerDeferredResult; 257 varinnerDeferredResult;
261 258
262 innerDeferredResult = new Clipperz.Async.Deferred("EncryptedRemoteObject.getDecryptedData <inner deferred>", {trace:false}); 259 innerDeferredResult = new Clipperz.Async.Deferred("EncryptedRemoteObject.getDecryptedData <inner deferred>", {trace:false});
263 260
264 innerDeferredResult.addMethod(this, 'getRemoteData'); 261 innerDeferredResult.addMethod(this, 'getRemoteData');
265 innerDeferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress'); 262 innerDeferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
266 innerDeferredResult.collectResults({ 263 innerDeferredResult.collectResults({
267 'key': MochiKit.Base.method(this, 'getKey'), 264 'key': MochiKit.Base.method(this, 'getKey'),
268 'value':MochiKit.Base.itemgetter(this._encryptedDataKeypath), 265 'value':MochiKit.Base.itemgetter(this._encryptedDataKeypath),
269 'version':MochiKit.Base.itemgetter(this._encryptedVersionKeypath) 266 'version':MochiKit.Base.itemgetter(this._encryptedVersionKeypath)
270 }); 267 });
271 268
272 innerDeferredResult.addCallback(Clipperz.PM.Crypto.deferredDecrypt); 269 innerDeferredResult.addCallback(Clipperz.PM.Crypto.deferredDecrypt);
273 innerDeferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress'); 270 innerDeferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
274 innerDeferredResult.addMethod(this, 'unpackData'); 271 innerDeferredResult.addMethod(this, 'unpackData');
275 innerDeferredResult.callback(); 272 innerDeferredResult.callback();
276 273
277 return innerDeferredResult; 274 return innerDeferredResult;
278 }, this))); 275 }, this)));
279 deferredResult.releaseLock(deferredLock); 276 deferredResult.releaseLock(deferredLock);
280 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress'); 277 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
281 deferredResult.callback(); 278 deferredResult.callback();
282 279
283 return deferredResult; 280 return deferredResult;
284 }, 281 },
285 282
286 //------------------------------------------------------------------------- 283 //-------------------------------------------------------------------------
287 284
288 'setValue': function(aKey, aValue) { 285 'setValue': function(aKey, aValue) {
289 var deferredResult; 286 var deferredResult;
290 287
291 deferredResult = new Clipperz.Async.Deferred("EncryptedRemoteObject.setValue", {trace:false}); 288 deferredResult = new Clipperz.Async.Deferred("EncryptedRemoteObject.setValue", {trace:false});
292 deferredResult.addMethod(this, '_getObjectDataStore'); 289 deferredResult.addMethod(this, '_getObjectDataStore');
293 deferredResult.addCallback(MochiKit.Base.methodcaller('setValue', aKey, aValue)); 290 deferredResult.addCallback(MochiKit.Base.methodcaller('setValue', aKey, aValue));
294 deferredResult.callback(); 291 deferredResult.callback();
295 292
296 return deferredResult; 293 return deferredResult;
297 }, 294 },
298 295
299 //......................................................................... 296 //.........................................................................
300 297
301 'getValue': function (aKey) { 298 'getValue': function (aKey) {
302 return Clipperz.Async.callbacks("EncryptedRemoteObject.getValue", [ 299 return Clipperz.Async.callbacks("EncryptedRemoteObject.getValue", [
303 MochiKit.Base.method(this, '_getObjectDataStore'), 300 MochiKit.Base.method(this, '_getObjectDataStore'),
304 MochiKit.Base.methodcaller('getValue', aKey) 301 MochiKit.Base.methodcaller('getValue', aKey)
305 ], {trace:false}); 302 ], {trace:false});
306 }, 303 },
307 304
308 //......................................................................... 305 //.........................................................................
309 306
310 'removeValue': function (aKey) { 307 'removeValue': function (aKey) {
311 return Clipperz.Async.callbacks("EncryptedRemoteObject.removeValue", [ 308 return Clipperz.Async.callbacks("EncryptedRemoteObject.removeValue", [
312 MochiKit.Base.method(this, '_getObjectDataStore'), 309 MochiKit.Base.method(this, '_getObjectDataStore'),
313 MochiKit.Base.methodcaller('removeValue', aKey) 310 MochiKit.Base.methodcaller('removeValue', aKey)
314 ], {trace:false}); 311 ], {trace:false});
315 }, 312 },
316 313
317 //......................................................................... 314 //.........................................................................
318 315
319 'values': function () { 316 'values': function () {
320 return Clipperz.Async.callbacks("EncryptedRemoteObject.values", [ 317 return Clipperz.Async.callbacks("EncryptedRemoteObject.values", [
321 MochiKit.Base.method(this, '_getObjectDataStore'), 318 MochiKit.Base.method(this, '_getObjectDataStore'),
322 MochiKit.Base.methodcaller('values') 319 MochiKit.Base.methodcaller('values')
323 ], {trace:false}); 320 ], {trace:false});
324 }, 321 },
325 322
326 'setValues': function (someValues) { 323 'setValues': function (someValues) {
327 return Clipperz.Async.callbacks("EncryptedRemoteObject.values", [ 324 return Clipperz.Async.callbacks("EncryptedRemoteObject.values", [
328 MochiKit.Base.method(this, '_getObjectDataStore'), 325 MochiKit.Base.method(this, '_getObjectDataStore'),
329 MochiKit.Base.methodcaller('setValues', someValues) 326 MochiKit.Base.methodcaller('setValues', someValues)
330 ], {trace:false}); 327 ], {trace:false});
331 }, 328 },
332 329
333 //......................................................................... 330 //.........................................................................
334 331
335 '_getObjectDataStore': function () { 332 '_getObjectDataStore': function () {
336 var deferredResult; 333 var deferredResult;
337 var deferredLock; 334 var deferredLock;
338 335
339 deferredLock = this.getDeferredLockForKey('objectDataStore'); 336 deferredLock = this.getDeferredLockForKey('objectDataStore');
340 337
341 deferredResult = new Clipperz.Async.Deferred("EncryptedRemoteObject._getObjectDataStore", {trace:false}); 338 deferredResult = new Clipperz.Async.Deferred("EncryptedRemoteObject._getObjectDataStore", {trace:false});
342 deferredResult.acquireLock(deferredLock); 339 deferredResult.acquireLock(deferredLock);
343 deferredResult.addCallback(MochiKit.Base.bind(function () { 340 deferredResult.addCallback(MochiKit.Base.bind(function () {
344 var innerDeferredResult; 341 var innerDeferredResult;
345 342
346 if (this._objectDataStore == null) { 343 if (this._objectDataStore == null) {
347 this._objectDataStore = new Clipperz.KeyValueObjectStore(/*{'name':'EncryptedRemoteObject.objectDataStore [4]'}*/); 344 this._objectDataStore = new Clipperz.KeyValueObjectStore(/*{'name':'EncryptedRemoteObject.objectDataStore [4]'}*/);
348 345
349 innerDeferredResult = new Clipperz.Async.Deferred("EncryptedRemoteObject._getObjectDataStore <inner deferred>", {trace:false}); 346 innerDeferredResult = new Clipperz.Async.Deferred("EncryptedRemoteObject._getObjectDataStore <inner deferred>", {trace:false});
350 innerDeferredResult.addMethod(this, 'getDecryptedData'); 347 innerDeferredResult.addMethod(this, 'getDecryptedData');
351 innerDeferredResult.addMethod(this._objectDataStore, 'initWithValues'); 348 innerDeferredResult.addMethod(this._objectDataStore, 'initWithValues');
352 innerDeferredResult.callback(); 349 innerDeferredResult.callback();
353 } else { 350 } else {
354 innerDeferredResult = MochiKit.Async.succeed(this._objectDataStore); 351 innerDeferredResult = MochiKit.Async.succeed(this._objectDataStore);
355 } 352 }
356 353
357 return innerDeferredResult; 354 return innerDeferredResult;
358 }, this)); 355 }, this));
359 deferredResult.releaseLock(deferredLock); 356 deferredResult.releaseLock(deferredLock);
360 deferredResult.callback(); 357 deferredResult.callback();
361 358
362 return deferredResult; 359 return deferredResult;
363 }, 360 },
364 361
365 'hasInitiatedObjectDataStore': function () { 362 'hasInitiatedObjectDataStore': function () {
366 return (this._objectDataStore != null); 363 return (this._objectDataStore != null);
367 }, 364 },
368 365
369 //------------------------------------------------------------------------- 366 //-------------------------------------------------------------------------
370 367
371 'getDeferredLockForKey': function (aKey) { 368 'getDeferredLockForKey': function (aKey) {
372 var result; 369 var result;
373 370
374 result = this._deferredLocks[aKey]; 371 result = this._deferredLocks[aKey];
375 372
376 if (typeof(result) == 'undefined') { 373 if (typeof(result) == 'undefined') {
377 result = new MochiKit.Async.DeferredLock(); 374 result = new MochiKit.Async.DeferredLock();
378 this._deferredLocks[aKey] = result; 375 this._deferredLocks[aKey] = result;
379 } 376 }
380 377
381 return result; 378 return result;
382 }, 379 },
383 380
384 //------------------------------------------------------------------------- 381 //-------------------------------------------------------------------------
385 382
386 'unpackData': function (someData) { //++ 383 'unpackData': function (someData) { //++
387 return someData; 384 return someData;
388 }, 385 },
389 386
390 'packData': function (someData) { //++ 387 'packData': function (someData) { //++
391 return someData; 388 return someData;
392 }, 389 },
393 390
394 //------------------------------------------------------------------------- 391 //-------------------------------------------------------------------------
395 392
396 'hasPendingChanges': function () { 393 'hasPendingChanges': function () {
397 var deferredResult; 394 var deferredResult;
398 var tempObj = this; 395 var tempObj = this;
399 396
400 if (this.isBrandNew()) { 397 if (this.isBrandNew()) {
401 // deferredResult = MochiKit.Async.succeed(true); 398 // deferredResult = MochiKit.Async.succeed(true);
402 deferredResult = this.hasPendingChangesWhenBrandNew(); 399 deferredResult = this.hasPendingChangesWhenBrandNew();
403 } else if (this.hasInitiatedObjectDataStore()) { 400 } else if (this.hasInitiatedObjectDataStore()) {
404 deferredResult = new Clipperz.Async.Deferred("EncryptedRemoteObject.hasPendingChanges", {trace:false}); 401 deferredResult = new Clipperz.Async.Deferred("EncryptedRemoteObject.hasPendingChanges", {trace:false});
405 deferredResult.collectResults({ 402 deferredResult.collectResults({
406 'decryptedData': [ 403 'decryptedData': [
407 MochiKit.Base.method(this, 'getDecryptedData'), 404 MochiKit.Base.method(this, 'getDecryptedData'),
408 Clipperz.Base.serializeJSON 405 Clipperz.Base.serializeJSON
diff --git a/frontend/gamma/js/Clipperz/PM/DataModel/OneTimePassword.js b/frontend/gamma/js/Clipperz/PM/DataModel/OneTimePassword.js
index 9f1c197..834e21b 100644
--- a/frontend/gamma/js/Clipperz/PM/DataModel/OneTimePassword.js
+++ b/frontend/gamma/js/Clipperz/PM/DataModel/OneTimePassword.js
@@ -1,357 +1,354 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
30if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } 27if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
31if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; } 28if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; }
32 29
33 30
34//############################################################################# 31//#############################################################################
35 32
36Clipperz.PM.DataModel.OneTimePassword = function(args) { 33Clipperz.PM.DataModel.OneTimePassword = function(args) {
37 args = args || {}; 34 args = args || {};
38 35
39 //this._user = args['user']; 36 //this._user = args['user'];
40 this._reference = args['reference']|| Clipperz.PM.Crypto.randomKey(); 37 this._reference = args['reference']|| Clipperz.PM.Crypto.randomKey();
41 this._password = args['password']; 38 this._password = args['password'];
42 this._passwordValue = Clipperz.PM.DataModel.OneTimePassword.normalizedOneTimePassword(args['password']); 39 this._passwordValue = Clipperz.PM.DataModel.OneTimePassword.normalizedOneTimePassword(args['password']);
43 this._creationDate = args['created'] ? Clipperz.PM.Date.parseDateWithUTCFormat(args['created']) : new Date(); 40 this._creationDate = args['created'] ? Clipperz.PM.Date.parseDateWithUTCFormat(args['created']) : new Date();
44 this._usageDate = args['used'] ? Clipperz.PM.Date.parseDateWithUTCFormat(args['used']) : null; 41 this._usageDate = args['used'] ? Clipperz.PM.Date.parseDateWithUTCFormat(args['used']) : null;
45 42
46 this._status = args['status'] || 'ACTIVE'; //'REQUESTED', 'USED', 'DISABLED' 43 this._status = args['status'] || 'ACTIVE'; //'REQUESTED', 'USED', 'DISABLED'
47 this._connectionInfo= null; 44 this._connectionInfo= null;
48 45
49 this._key = null; 46 this._key = null;
50 this._keyChecksum= null; 47 this._keyChecksum= null;
51 48
52 return this; 49 return this;
53} 50}
54 51
55Clipperz.PM.DataModel.OneTimePassword.prototype = MochiKit.Base.update(null, { 52Clipperz.PM.DataModel.OneTimePassword.prototype = MochiKit.Base.update(null, {
56 53
57 'toString': function() { 54 'toString': function() {
58 return "Clipperz.PM.DataModel.OneTimePassword"; 55 return "Clipperz.PM.DataModel.OneTimePassword";
59 }, 56 },
60/* 57/*
61 //------------------------------------------------------------------------- 58 //-------------------------------------------------------------------------
62 59
63 'user': function() { 60 'user': function() {
64 return this._user; 61 return this._user;
65 }, 62 },
66 63
67 //------------------------------------------------------------------------- 64 //-------------------------------------------------------------------------
68 65
69 'password': function() { 66 'password': function() {
70 return this._password; 67 return this._password;
71 }, 68 },
72 69
73 //------------------------------------------------------------------------- 70 //-------------------------------------------------------------------------
74 71
75 'passwordValue': function() { 72 'passwordValue': function() {
76 return this._passwordValue; 73 return this._passwordValue;
77 }, 74 },
78 75
79 //------------------------------------------------------------------------- 76 //-------------------------------------------------------------------------
80 77
81 'creationDate': function() { 78 'creationDate': function() {
82 return this._creationDate; 79 return this._creationDate;
83 }, 80 },
84 81
85 //------------------------------------------------------------------------- 82 //-------------------------------------------------------------------------
86 83
87 'reference': function() { 84 'reference': function() {
88 return this._reference; 85 return this._reference;
89 }, 86 },
90 87
91 //------------------------------------------------------------------------- 88 //-------------------------------------------------------------------------
92 89
93 'key': function() { 90 'key': function() {
94 if (this._key == null) { 91 if (this._key == null) {
95 this._key = Clipperz.PM.DataModel.OneTimePassword.computeKeyWithUsernameAndPassword(this.user().username(), this.passwordValue()); 92 this._key = Clipperz.PM.DataModel.OneTimePassword.computeKeyWithUsernameAndPassword(this.user().username(), this.passwordValue());
96 } 93 }
97 94
98 return this._key; 95 return this._key;
99 }, 96 },
100 97
101 //------------------------------------------------------------------------- 98 //-------------------------------------------------------------------------
102 99
103 'keyChecksum': function() { 100 'keyChecksum': function() {
104 if (this._keyChecksum == null) { 101 if (this._keyChecksum == null) {
105 this._keyChecksum = Clipperz.PM.DataModel.OneTimePassword.computeKeyChecksumWithUsernameAndPassword(this.user().username(), this.passwordValue()); 102 this._keyChecksum = Clipperz.PM.DataModel.OneTimePassword.computeKeyChecksumWithUsernameAndPassword(this.user().username(), this.passwordValue());
106 } 103 }
107 104
108 return this._keyChecksum; 105 return this._keyChecksum;
109 }, 106 },
110*/ 107*/
111 //------------------------------------------------------------------------- 108 //-------------------------------------------------------------------------
112 109
113 'status': function() { 110 'status': function() {
114 return this._status; 111 return this._status;
115 }, 112 },
116 113
117 'setStatus': function(aValue) { 114 'setStatus': function(aValue) {
118 this._status = aValue; 115 this._status = aValue;
119 }, 116 },
120 117
121 //------------------------------------------------------------------------- 118 //-------------------------------------------------------------------------
122/* 119/*
123 'serializedData': function() { 120 'serializedData': function() {
124 var result; 121 var result;
125 122
126 result = { 123 result = {
127 'password': this.password(), 124 'password': this.password(),
128 'created': this.creationDate() ? Clipperz.PM.Date.formatDateWithUTCFormat(this.creationDate()) : null, 125 'created': this.creationDate() ? Clipperz.PM.Date.formatDateWithUTCFormat(this.creationDate()) : null,
129 'used': this.usageDate() ? Clipperz.PM.Date.formatDateWithUTCFormat(this.usageDate()) : null, 126 'used': this.usageDate() ? Clipperz.PM.Date.formatDateWithUTCFormat(this.usageDate()) : null,
130 'status': this.status() 127 'status': this.status()
131 }; 128 };
132 129
133 return result; 130 return result;
134 }, 131 },
135 132
136 //------------------------------------------------------------------------- 133 //-------------------------------------------------------------------------
137 134
138 'packedPassphrase': function() { 135 'packedPassphrase': function() {
139 var result; 136 var result;
140 var packedPassphrase; 137 var packedPassphrase;
141 var encodedPassphrase; 138 var encodedPassphrase;
142 varprefixPadding; 139 varprefixPadding;
143 var suffixPadding; 140 var suffixPadding;
144 var getRandomBytes; 141 var getRandomBytes;
145 142
146 getRandomBytes = MochiKit.Base.method(Clipperz.Crypto.PRNG.defaultRandomGenerator(), 'getRandomBytes'); 143 getRandomBytes = MochiKit.Base.method(Clipperz.Crypto.PRNG.defaultRandomGenerator(), 'getRandomBytes');
147 144
148 encodedPassphrase = new Clipperz.ByteArray(this.user().passphrase()).toBase64String(); 145 encodedPassphrase = new Clipperz.ByteArray(this.user().passphrase()).toBase64String();
149//MochiKit.Logging.logDebug("--- encodedPassphrase.length: " + encodedPassphrase.length); 146//MochiKit.Logging.logDebug("--- encodedPassphrase.length: " + encodedPassphrase.length);
150 prefixPadding = getRandomBytes(getRandomBytes(1).byteAtIndex(0)).toBase64String(); 147 prefixPadding = getRandomBytes(getRandomBytes(1).byteAtIndex(0)).toBase64String();
151//MochiKit.Logging.logDebug("--- prefixPadding.length: " + prefixPadding.length); 148//MochiKit.Logging.logDebug("--- prefixPadding.length: " + prefixPadding.length);
152 suffixPadding = getRandomBytes((500 - prefixPadding.length - encodedPassphrase.length) * 6 / 8).toBase64String(); 149 suffixPadding = getRandomBytes((500 - prefixPadding.length - encodedPassphrase.length) * 6 / 8).toBase64String();
153//MochiKit.Logging.logDebug("--- suffixPadding.length: " + suffixPadding.length); 150//MochiKit.Logging.logDebug("--- suffixPadding.length: " + suffixPadding.length);
154//MochiKit.Logging.logDebug("--- total.length: " + (prefixPadding.length + encodedPassphrase.length + suffixPadding.length)); 151//MochiKit.Logging.logDebug("--- total.length: " + (prefixPadding.length + encodedPassphrase.length + suffixPadding.length));
155 152
156 packedPassphrase = { 153 packedPassphrase = {
157 'prefix': prefixPadding, 154 'prefix': prefixPadding,
158 'passphrase': encodedPassphrase, 155 'passphrase': encodedPassphrase,
159 'suffix': suffixPadding 156 'suffix': suffixPadding
160 }; 157 };
161 158
162 // result = Clipperz.Base.serializeJSON(packedPassphrase); 159 // result = Clipperz.Base.serializeJSON(packedPassphrase);
163 result = packedPassphrase; 160 result = packedPassphrase;
164//MochiKit.Logging.logDebug("===== OTP packedPassprase: [" + result.length + "]" + result); 161//MochiKit.Logging.logDebug("===== OTP packedPassprase: [" + result.length + "]" + result);
165//MochiKit.Logging.logDebug("<<< OneTimePassword.packedPassphrase"); 162//MochiKit.Logging.logDebug("<<< OneTimePassword.packedPassphrase");
166 163
167 return result; 164 return result;
168 }, 165 },
169 166
170 //------------------------------------------------------------------------- 167 //-------------------------------------------------------------------------
171 168
172 'encryptedPackedPassphrase': function() { 169 'encryptedPackedPassphrase': function() {
173 return Clipperz.PM.Crypto.deferredEncryptWithCurrentVersion(this.passwordValue(), this.packedPassphrase()) 170 return Clipperz.PM.Crypto.deferredEncryptWithCurrentVersion(this.passwordValue(), this.packedPassphrase())
174 }, 171 },
175 172
176 //------------------------------------------------------------------------- 173 //-------------------------------------------------------------------------
177 174
178 'encryptedData': function() { 175 'encryptedData': function() {
179 var deferredResult; 176 var deferredResult;
180 varresult; 177 varresult;
181 178
182//MochiKit.Logging.logDebug(">>> OneTimePassword.encryptedData"); 179//MochiKit.Logging.logDebug(">>> OneTimePassword.encryptedData");
183//MochiKit.Logging.logDebug("--- OneTimePassword.encryptedData - id: " + this.reference()); 180//MochiKit.Logging.logDebug("--- OneTimePassword.encryptedData - id: " + this.reference());
184 result = { 181 result = {
185 'reference': this.reference(), 182 'reference': this.reference(),
186 'key': this.key(), 183 'key': this.key(),
187 'keyChecksum': this.keyChecksum(), 184 'keyChecksum': this.keyChecksum(),
188 'data': "", 185 'data': "",
189 'version': Clipperz.PM.Crypto.encryptingFunctions.currentVersion 186 'version': Clipperz.PM.Crypto.encryptingFunctions.currentVersion
190 } 187 }
191//MochiKit.Logging.logDebug("--- OneTimePassword.encryptedData - 2: " + Clipperz.Base.serializeJSON(result)); 188//MochiKit.Logging.logDebug("--- OneTimePassword.encryptedData - 2: " + Clipperz.Base.serializeJSON(result));
192 deferredResult = new MochiKit.Async.Deferred(); 189 deferredResult = new MochiKit.Async.Deferred();
193//MochiKit.Logging.logDebug("--- OneTimePassword.encryptedData - 3"); 190//MochiKit.Logging.logDebug("--- OneTimePassword.encryptedData - 3");
194//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("OneTimePassword.encryptedData - 1: " + res); return res;}); 191//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("OneTimePassword.encryptedData - 1: " + res); return res;});
195 //# deferredResult.addCallback(Clipperz.PM.Crypto.deferredEncryptWithCurrentVersion, this.passwordValue(), this.packedPassphrase()); 192 //# deferredResult.addCallback(Clipperz.PM.Crypto.deferredEncryptWithCurrentVersion, this.passwordValue(), this.packedPassphrase());
196 deferredResult.addCallback(MochiKit.Base.method(this, 'encryptedPackedPassphrase')); 193 deferredResult.addCallback(MochiKit.Base.method(this, 'encryptedPackedPassphrase'));
197//MochiKit.Logging.logDebug("--- OneTimePassword.encryptedData - 4"); 194//MochiKit.Logging.logDebug("--- OneTimePassword.encryptedData - 4");
198//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("OneTimePassword.encryptedData - 2: [" + res.length + "]" + res); return res;}); 195//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("OneTimePassword.encryptedData - 2: [" + res.length + "]" + res); return res;});
199 deferredResult.addCallback(function(aResult, res) { 196 deferredResult.addCallback(function(aResult, res) {
200 aResult['data'] = res; 197 aResult['data'] = res;
201 return aResult; 198 return aResult;
202 }, result); 199 }, result);
203//MochiKit.Logging.logDebug("--- OneTimePassword.encryptedData - 5"); 200//MochiKit.Logging.logDebug("--- OneTimePassword.encryptedData - 5");
204//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("OneTimePassword.encryptedData - 3: " + Clipperz.Base.serializeJSON(res)); return res;}); 201//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("OneTimePassword.encryptedData - 3: " + Clipperz.Base.serializeJSON(res)); return res;});
205 deferredResult.callback(); 202 deferredResult.callback();
206//MochiKit.Logging.logDebug("--- OneTimePassword.encryptedData - 6"); 203//MochiKit.Logging.logDebug("--- OneTimePassword.encryptedData - 6");
207 204
208 return deferredResult; 205 return deferredResult;
209 }, 206 },
210 207
211 //------------------------------------------------------------------------- 208 //-------------------------------------------------------------------------
212 209
213 'saveChanges': function() { 210 'saveChanges': function() {
214 var deferredResult; 211 var deferredResult;
215 varresult; 212 varresult;
216 213
217//MochiKit.Logging.logDebug(">>> OneTimePassword.saveChanges"); 214//MochiKit.Logging.logDebug(">>> OneTimePassword.saveChanges");
218 result = {}; 215 result = {};
219 deferredResult = new MochiKit.Async.Deferred(); 216 deferredResult = new MochiKit.Async.Deferred();
220 217
221 deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'saveOTP_encryptUserData'); 218 deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'saveOTP_encryptUserData');
222 deferredResult.addCallback(MochiKit.Base.method(this.user(), 'encryptedData')); 219 deferredResult.addCallback(MochiKit.Base.method(this.user(), 'encryptedData'));
223 deferredResult.addCallback(function(aResult, res) { 220 deferredResult.addCallback(function(aResult, res) {
224 aResult['user'] = res; 221 aResult['user'] = res;
225 return aResult; 222 return aResult;
226 }, result); 223 }, result);
227 224
228 deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'saveOTP_encryptOTPData'); 225 deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'saveOTP_encryptOTPData');
229 deferredResult.addCallback(MochiKit.Base.method(this, 'encryptedData')); 226 deferredResult.addCallback(MochiKit.Base.method(this, 'encryptedData'));
230 deferredResult.addCallback(function(aResult, res) { 227 deferredResult.addCallback(function(aResult, res) {
231 aResult['oneTimePassword'] = res; 228 aResult['oneTimePassword'] = res;
232 return aResult; 229 return aResult;
233 }, result); 230 }, result);
234 231
235 deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'saveOTP_sendingData'); 232 deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'saveOTP_sendingData');
236//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("OneTimePassword.saveChanges - 1: " + Clipperz.Base.serializeJSON(res)); return res;}); 233//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("OneTimePassword.saveChanges - 1: " + Clipperz.Base.serializeJSON(res)); return res;});
237 deferredResult.addCallback(MochiKit.Base.method(this.user().connection(), 'message'), 'addNewOneTimePassword'); 234 deferredResult.addCallback(MochiKit.Base.method(this.user().connection(), 'message'), 'addNewOneTimePassword');
238 235
239 deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'saveOTP_updatingInterface'); 236 deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'saveOTP_updatingInterface');
240//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("OneTimePassword.saveChanges - 2: " + res); return res;}); 237//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("OneTimePassword.saveChanges - 2: " + res); return res;});
241 deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'notify', 'OTPUpdated'); 238 deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'notify', 'OTPUpdated');
242 deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'oneTimePassword_saveChanges_done', null); 239 deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'oneTimePassword_saveChanges_done', null);
243//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("OneTimePassword.saveChanges - 2: " + res); return res;}); 240//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("OneTimePassword.saveChanges - 2: " + res); return res;});
244 deferredResult.callback(); 241 deferredResult.callback();
245//MochiKit.Logging.logDebug("<<< OneTimePassword.saveChanges"); 242//MochiKit.Logging.logDebug("<<< OneTimePassword.saveChanges");
246 243
247 return deferredResult; 244 return deferredResult;
248 }, 245 },
249 246
250 //------------------------------------------------------------------------- 247 //-------------------------------------------------------------------------
251 248
252 'usageDate': function() { 249 'usageDate': function() {
253 return this._usageDate; 250 return this._usageDate;
254 }, 251 },
255 252
256 'setUsageDate': function(aValue) { 253 'setUsageDate': function(aValue) {
257 this._usageDate = aValue; 254 this._usageDate = aValue;
258 }, 255 },
259 256
260 //------------------------------------------------------------------------- 257 //-------------------------------------------------------------------------
261 258
262 'connectionInfo': function() { 259 'connectionInfo': function() {
263 return this._connectionInfo; 260 return this._connectionInfo;
264 }, 261 },
265 262
266 'setConnectionInfo': function(aValue) { 263 'setConnectionInfo': function(aValue) {
267 this._connectionInfo = aValue; 264 this._connectionInfo = aValue;
268 }, 265 },
269 266
270 //------------------------------------------------------------------------- 267 //-------------------------------------------------------------------------
271 268
272 'isExpired': function() { 269 'isExpired': function() {
273 return (this.usageDate() != null); 270 return (this.usageDate() != null);
274 }, 271 },
275 272
276 //------------------------------------------------------------------------- 273 //-------------------------------------------------------------------------
277 274
278 'updateStatusWithValues': function(someValues) { 275 'updateStatusWithValues': function(someValues) {
279 var result; 276 var result;
280 277
281 result = false; 278 result = false;
282 279
283 if (someValues['status'] != this.status()) { 280 if (someValues['status'] != this.status()) {
284 result = true; 281 result = true;
285 } 282 }
286 283
287 this.setStatus(someValues['status']); 284 this.setStatus(someValues['status']);
288 this.setUsageDate(Clipperz.PM.Date.parseDateWithUTCFormat(someValues['requestDate'])); 285 this.setUsageDate(Clipperz.PM.Date.parseDateWithUTCFormat(someValues['requestDate']));
289 this.setConnectionInfo(someValues['connection']); 286 this.setConnectionInfo(someValues['connection']);
290 287
291 return result; 288 return result;
292 }, 289 },
293 */ 290 */
294 //------------------------------------------------------------------------- 291 //-------------------------------------------------------------------------
295 __syntaxFix__: "syntax fix" 292 __syntaxFix__: "syntax fix"
296}); 293});
297 294
298//############################################################################# 295//#############################################################################
299 296
300Clipperz.PM.DataModel.OneTimePassword.computeKeyWithUsernameAndPassword = function(anUsername, aPassword) { 297Clipperz.PM.DataModel.OneTimePassword.computeKeyWithUsernameAndPassword = function(anUsername, aPassword) {
301 return Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aPassword)).toHexString().substring(2); 298 return Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aPassword)).toHexString().substring(2);
302} 299}
303 300
304Clipperz.PM.DataModel.OneTimePassword.computeKeyChecksumWithUsernameAndPassword = function(anUsername, aPassword) { 301Clipperz.PM.DataModel.OneTimePassword.computeKeyChecksumWithUsernameAndPassword = function(anUsername, aPassword) {
305 return Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(anUsername + aPassword)).toHexString().substring(2); 302 return Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(anUsername + aPassword)).toHexString().substring(2);
306} 303}
307 304
308//============================================================================= 305//=============================================================================
309 306
310Clipperz.PM.DataModel.OneTimePassword.isValidOneTimePasswordValue = function(aPassword) { 307Clipperz.PM.DataModel.OneTimePassword.isValidOneTimePasswordValue = function(aPassword) {
311 var result; 308 var result;
312 309
313 //"yaxx k7ww - f8y6 tqz5 - 58b6 th44 - 9cwv q0fg" 310 //"yaxx k7ww - f8y6 tqz5 - 58b6 th44 - 9cwv q0fg"
314//console.log("Clipperz.PM.DataModel.OneTimePassword.isValidOneTimePasswordValue", aPassword); 311//console.log("Clipperz.PM.DataModel.OneTimePassword.isValidOneTimePasswordValue", aPassword);
315 if (aPassword.replace(/[\s\-]/g, '').length == 32) { 312 if (aPassword.replace(/[\s\-]/g, '').length == 32) {
316 try { 313 try {
317 var passwordByteArray; 314 var passwordByteArray;
318 315
319 passwordByteArray = new Clipperz.ByteArray(); 316 passwordByteArray = new Clipperz.ByteArray();
320 passwordByteArray.appendBase32String(aPassword); 317 passwordByteArray.appendBase32String(aPassword);
321 318
322 result = true; 319 result = true;
323 } catch(exception) { 320 } catch(exception) {
324 result = false; 321 result = false;
325 } 322 }
326 } else { 323 } else {
327 result = false; 324 result = false;
328 } 325 }
329 326
330 return result; 327 return result;
331} 328}
332 329
333//============================================================================= 330//=============================================================================
334 331
335Clipperz.PM.DataModel.OneTimePassword.normalizedOneTimePassword = function(aPassword) { 332Clipperz.PM.DataModel.OneTimePassword.normalizedOneTimePassword = function(aPassword) {
336 varresult; 333 varresult;
337 334
338 if (aPassword.replace(/[\s\-]/g, '').length == 32) { 335 if (aPassword.replace(/[\s\-]/g, '').length == 32) {
339 try { 336 try {
340 var passwordByteArray; 337 var passwordByteArray;
341 338
342 passwordByteArray = new Clipperz.ByteArray(); 339 passwordByteArray = new Clipperz.ByteArray();
343 passwordByteArray.appendBase32String(aPassword); 340 passwordByteArray.appendBase32String(aPassword);
344 341
345 result = passwordByteArray.toBase64String(); 342 result = passwordByteArray.toBase64String();
346 } catch(exception) { 343 } catch(exception) {
347 result = aPassword; 344 result = aPassword;
348 } 345 }
349 } else { 346 } else {
350 result = aPassword; 347 result = aPassword;
351 } 348 }
352 349
353//console.log("Clipperz.PM.DataModel.OneTimePassword.normalizedOneTimePassword", aPassword, result); 350//console.log("Clipperz.PM.DataModel.OneTimePassword.normalizedOneTimePassword", aPassword, result);
354 return result; 351 return result;
355} 352}
356 353
357//############################################################################# 354//#############################################################################
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 147aa7d..f51bbc2 100644
--- a/frontend/gamma/js/Clipperz/PM/DataModel/Record.Version.Field.js
+++ b/frontend/gamma/js/Clipperz/PM/DataModel/Record.Version.Field.js
@@ -1,167 +1,164 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29try { if (typeof(Clipperz.PM.DataModel.Record.Version) == 'undefined') { throw ""; }} catch (e) { 26try { if (typeof(Clipperz.PM.DataModel.Record.Version) == 'undefined') { throw ""; }} catch (e) {
30 throw "Clipperz.PM.DataModel.Record.Version.Field depends on Clipperz.PM.DataModel.Record.Version!"; 27 throw "Clipperz.PM.DataModel.Record.Version.Field depends on Clipperz.PM.DataModel.Record.Version!";
31} 28}
32 29
33Clipperz.PM.DataModel.Record.Version.Field = function(args) { 30Clipperz.PM.DataModel.Record.Version.Field = function(args) {
34 Clipperz.PM.DataModel.Record.Version.Field.superclass.constructor.apply(this, arguments); 31 Clipperz.PM.DataModel.Record.Version.Field.superclass.constructor.apply(this, arguments);
35 32
36 this._recordVersion = args.recordVersion|| Clipperz.Base.exception.raise('MandatoryParameter'); 33 this._recordVersion = args.recordVersion|| Clipperz.Base.exception.raise('MandatoryParameter');
37 this._reference = args.reference || Clipperz.PM.Crypto.randomKey(); 34 this._reference = args.reference || Clipperz.PM.Crypto.randomKey();
38 35
39 return this; 36 return this;
40} 37}
41 38
42 39
43Clipperz.Base.extend(Clipperz.PM.DataModel.Record.Version.Field, Object, { 40Clipperz.Base.extend(Clipperz.PM.DataModel.Record.Version.Field, Object, {
44 41
45 'toString': function() { 42 'toString': function() {
46 return "Record.Version.Field (" + this.reference() + ")"; 43 return "Record.Version.Field (" + this.reference() + ")";
47 }, 44 },
48 45
49 //------------------------------------------------------------------------- 46 //-------------------------------------------------------------------------
50 47
51 'recordVersion': function () { 48 'recordVersion': function () {
52 return this._recordVersion; 49 return this._recordVersion;
53 }, 50 },
54 51
55 //------------------------------------------------------------------------- 52 //-------------------------------------------------------------------------
56 53
57 'reference': function () { 54 'reference': function () {
58 return this._reference; 55 return this._reference;
59 }, 56 },
60 57
61 //------------------------------------------------------------------------- 58 //-------------------------------------------------------------------------
62 59
63 'getItem': function (aKey) { 60 'getItem': function (aKey) {
64 return Clipperz.Async.callbacks("Clipperz.PM.DataModel.Record.Version.Field.getItem", [ 61 return Clipperz.Async.callbacks("Clipperz.PM.DataModel.Record.Version.Field.getItem", [
65 MochiKit.Base.method(this, 'recordVersion'), 62 MochiKit.Base.method(this, 'recordVersion'),
66 MochiKit.Base.methodcaller('getValue', 'fields' + '.' + this.reference() + '.' + aKey) 63 MochiKit.Base.methodcaller('getValue', 'fields' + '.' + this.reference() + '.' + aKey)
67 ], {trace:false}); 64 ], {trace:false});
68 }, 65 },
69 66
70 'setItem': function (aKey, aValue) { 67 'setItem': function (aKey, aValue) {
71 return Clipperz.Async.callbacks("Clipperz.PM.DataModel.Record.Version.Field.getItem", [ 68 return Clipperz.Async.callbacks("Clipperz.PM.DataModel.Record.Version.Field.getItem", [
72 MochiKit.Base.method(this, 'recordVersion'), 69 MochiKit.Base.method(this, 'recordVersion'),
73 MochiKit.Base.methodcaller('setValue', 'fields' + '.' + this.reference() + '.' + aKey, aValue) 70 MochiKit.Base.methodcaller('setValue', 'fields' + '.' + this.reference() + '.' + aKey, aValue)
74 ], {trace:false}); 71 ], {trace:false});
75 }, 72 },
76 73
77 //------------------------------------------------------------------------- 74 //-------------------------------------------------------------------------
78 75
79 'label': function () { 76 'label': function () {
80 return this.getItem('label'); 77 return this.getItem('label');
81 }, 78 },
82 79
83 'setLabel': function (aValue) { 80 'setLabel': function (aValue) {
84 return this.setItem('label', aValue); 81 return this.setItem('label', aValue);
85 }, 82 },
86 83
87 //------------------------------------------------------------------------- 84 //-------------------------------------------------------------------------
88 85
89 'value': function () { 86 'value': function () {
90 return this.getItem('value'); 87 return this.getItem('value');
91 }, 88 },
92 89
93 'setValue': function (aValue) { 90 'setValue': function (aValue) {
94 return this.setItem('value', aValue); 91 return this.setItem('value', aValue);
95 }, 92 },
96 93
97 //------------------------------------------------------------------------- 94 //-------------------------------------------------------------------------
98 95
99 'actionType': function () { 96 'actionType': function () {
100 return Clipperz.Async.callbacks("Clipperz.PM.DataModel.Record.Version.Field.actionType", [ 97 return Clipperz.Async.callbacks("Clipperz.PM.DataModel.Record.Version.Field.actionType", [
101 Clipperz.Async.collectResults("Clipperz.PM.DataModel.Record.Version.Field.actionType [collect results]", { 98 Clipperz.Async.collectResults("Clipperz.PM.DataModel.Record.Version.Field.actionType [collect results]", {
102 'isHidden':MochiKit.Base.method(this, 'isHidden'), 99 'isHidden':MochiKit.Base.method(this, 'isHidden'),
103 'value':MochiKit.Base.method(this, 'value') 100 'value':MochiKit.Base.method(this, 'value')
104 }, {trace:false}), 101 }, {trace:false}),
105 function (someValues) { 102 function (someValues) {
106 var result; //'NONE', 'URL', 'EMAIL', 'PASSWORD' 103 var result; //'NONE', 'URL', 'EMAIL', 'PASSWORD'
107 104
108 result = 'NONE'; 105 result = 'NONE';
109 106
110 if (someValues['isHidden']) { 107 if (someValues['isHidden']) {
111 result = 'PASSWORD'; 108 result = 'PASSWORD';
112 } else if (Clipperz.Base.isUrl(someValues['value'])) { 109 } else if (Clipperz.Base.isUrl(someValues['value'])) {
113 result = 'URL' 110 result = 'URL'
114 } else if (Clipperz.Base.isEmail(someValues['value'])) { 111 } else if (Clipperz.Base.isEmail(someValues['value'])) {
115 result = 'EMAIL' 112 result = 'EMAIL'
116 }; 113 };
117 114
118 return result; 115 return result;
119 } 116 }
120 ], {trace:false}); 117 ], {trace:false});
121 }, 118 },
122 119
123 //------------------------------------------------------------------------- 120 //-------------------------------------------------------------------------
124 121
125 'isHidden': function () { 122 'isHidden': function () {
126 return this.getItem('hidden'); 123 return this.getItem('hidden');
127 }, 124 },
128 125
129 'setIsHidden': function (aValue) { 126 'setIsHidden': function (aValue) {
130 return this.setItem('hidden', aValue); 127 return this.setItem('hidden', aValue);
131 }, 128 },
132 129
133 //------------------------------------------------------------------------- 130 //-------------------------------------------------------------------------
134 131
135 'isEmpty': function () { 132 'isEmpty': function () {
136 var deferredResult; 133 var deferredResult;
137 134
138 deferredResult = new Clipperz.Async.Deferred("Clipperz.PM.DataModel.Record.Version.Field.isEmpty", {trace:false}); 135 deferredResult = new Clipperz.Async.Deferred("Clipperz.PM.DataModel.Record.Version.Field.isEmpty", {trace:false});
139 136
140 deferredResult.collectResults({ 137 deferredResult.collectResults({
141 'label': [ 138 'label': [
142 MochiKit.Base.method(this, 'label'), 139 MochiKit.Base.method(this, 'label'),
143 MochiKit.Base.partial(MochiKit.Base.operator.eq, '') 140 MochiKit.Base.partial(MochiKit.Base.operator.eq, '')
144 ], 141 ],
145 'value': [ 142 'value': [
146 MochiKit.Base.method(this, 'value'), 143 MochiKit.Base.method(this, 'value'),
147 MochiKit.Base.partial(MochiKit.Base.operator.eq, '') 144 MochiKit.Base.partial(MochiKit.Base.operator.eq, '')
148 ], 145 ],
149 'isHidden': [ 146 'isHidden': [
150 MochiKit.Base.method(this, 'isHidden'), 147 MochiKit.Base.method(this, 'isHidden'),
151 MochiKit.Base.partial(MochiKit.Base.operator.eq, false) 148 MochiKit.Base.partial(MochiKit.Base.operator.eq, false)
152 ] 149 ]
153 }); 150 });
154 deferredResult.addCallback(MochiKit.Base.values); 151 deferredResult.addCallback(MochiKit.Base.values);
155 deferredResult.addCallback(function(someValues) { 152 deferredResult.addCallback(function(someValues) {
156 return MochiKit.Iter.every(someValues, MochiKit.Base.operator.identity); 153 return MochiKit.Iter.every(someValues, MochiKit.Base.operator.identity);
157 }); 154 });
158 deferredResult.callback(); 155 deferredResult.callback();
159 156
160 return deferredResult; 157 return deferredResult;
161 }, 158 },
162 159
163 //------------------------------------------------------------------------- 160 //-------------------------------------------------------------------------
164 __syntaxFix__: "syntax fix" 161 __syntaxFix__: "syntax fix"
165}); 162});
166 163
167 164
diff --git a/frontend/gamma/js/Clipperz/PM/DataModel/Record.Version.js b/frontend/gamma/js/Clipperz/PM/DataModel/Record.Version.js
index 6e50f8e..dd35fc9 100644
--- a/frontend/gamma/js/Clipperz/PM/DataModel/Record.Version.js
+++ b/frontend/gamma/js/Clipperz/PM/DataModel/Record.Version.js
@@ -1,336 +1,333 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29try { if (typeof(Clipperz.PM.DataModel.Record) == 'undefined') { throw ""; }} catch (e) { 26try { if (typeof(Clipperz.PM.DataModel.Record) == 'undefined') { throw ""; }} catch (e) {
30 throw "Clipperz.PM.DataModel.Record.Version depends on Clipperz.PM.DataModel.Record!"; 27 throw "Clipperz.PM.DataModel.Record.Version depends on Clipperz.PM.DataModel.Record!";
31} 28}
32 29
33Clipperz.PM.DataModel.Record.Version = function(args) { 30Clipperz.PM.DataModel.Record.Version = function(args) {
34//console.log(">>> Record.new"); 31//console.log(">>> Record.new");
35 Clipperz.PM.DataModel.Record.Version.superclass.constructor.apply(this, arguments); 32 Clipperz.PM.DataModel.Record.Version.superclass.constructor.apply(this, arguments);
36 33
37 this._getVersionFunction = args.getVersion|| Clipperz.Base.exception.raise('MandatoryParameter'); 34 this._getVersionFunction = args.getVersion|| Clipperz.Base.exception.raise('MandatoryParameter');
38 this._fields = null; 35 this._fields = null;
39 36
40 return this; 37 return this;
41} 38}
42 39
43 40
44Clipperz.Base.extend(Clipperz.PM.DataModel.Record.Version, Clipperz.PM.DataModel.EncryptedRemoteObject, { 41Clipperz.Base.extend(Clipperz.PM.DataModel.Record.Version, Clipperz.PM.DataModel.EncryptedRemoteObject, {
45 42
46 'toString': function() { 43 'toString': function() {
47 return "Record.Version (" + this.reference() + ")"; 44 return "Record.Version (" + this.reference() + ")";
48 }, 45 },
49 46
50 //------------------------------------------------------------------------- 47 //-------------------------------------------------------------------------
51 48
52 'reference': function () { 49 'reference': function () {
53 return this._reference; 50 return this._reference;
54 }, 51 },
55 52
56 //------------------------------------------------------------------------- 53 //-------------------------------------------------------------------------
57/* 54/*
58 'hasPendingChanges': function () { 55 'hasPendingChanges': function () {
59 var deferredResult; 56 var deferredResult;
60 57
61 deferredResult = new Clipperz.Async.Deferred("Clipperz.PM.DataModel.Record.Version.hasPendingChanges", {trace:false}); 58 deferredResult = new Clipperz.Async.Deferred("Clipperz.PM.DataModel.Record.Version.hasPendingChanges", {trace:false});
62 deferredResult.addCallback(MochiKit.Base.bind(Clipperz.PM.DataModel.Record.Version.superclass.hasPendingChanges, this)); 59 deferredResult.addCallback(MochiKit.Base.bind(Clipperz.PM.DataModel.Record.Version.superclass.hasPendingChanges, this));
63 deferredResult.callback(); 60 deferredResult.callback();
64 61
65 return deferredResult; 62 return deferredResult;
66 }, 63 },
67*/ 64*/
68 //------------------------------------------------------------------------- 65 //-------------------------------------------------------------------------
69 66
70 67
71 'hasPendingChangesWhenBrandNew': function () { 68 'hasPendingChangesWhenBrandNew': function () {
72 var deferredResult; 69 var deferredResult;
73 70
74 deferredResult = new Clipperz.Async.Deferred("Clipperz.PM.DataModel.Record.Version.hasPendingChangesWhenBrandNew", {trace:false}); 71 deferredResult = new Clipperz.Async.Deferred("Clipperz.PM.DataModel.Record.Version.hasPendingChangesWhenBrandNew", {trace:false});
75 deferredResult.addMethod(this, 'fields'); 72 deferredResult.addMethod(this, 'fields');
76 deferredResult.addCallback(MochiKit.Base.values); 73 deferredResult.addCallback(MochiKit.Base.values);
77 deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.methodcaller('isEmpty')) 74 deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.methodcaller('isEmpty'))
78 deferredResult.addCallback(Clipperz.Async.collectAll); 75 deferredResult.addCallback(Clipperz.Async.collectAll);
79 deferredResult.addCallback(function(someValues) { 76 deferredResult.addCallback(function(someValues) {
80 return MochiKit.Iter.every(someValues, MochiKit.Base.operator.identity); 77 return MochiKit.Iter.every(someValues, MochiKit.Base.operator.identity);
81 }); 78 });
82 deferredResult.addCallback(MochiKit.Base.operator.lognot) 79 deferredResult.addCallback(MochiKit.Base.operator.lognot)
83 deferredResult.callback(); 80 deferredResult.callback();
84 81
85 return deferredResult; 82 return deferredResult;
86 }, 83 },
87 84
88 //========================================================================= 85 //=========================================================================
89 86
90 'commitTransientState': function () { 87 'commitTransientState': function () {
91 var deferredResult; 88 var deferredResult;
92 89
93 deferredResult = new Clipperz.Async.Deferred("Clipperz.PM.DataModel.Record.Version.commitTransientState", {trace:false}); 90 deferredResult = new Clipperz.Async.Deferred("Clipperz.PM.DataModel.Record.Version.commitTransientState", {trace:false});
94 deferredResult.addCallback(MochiKit.Base.bind(Clipperz.PM.DataModel.Record.Version.superclass.commitTransientState, this)); 91 deferredResult.addCallback(MochiKit.Base.bind(Clipperz.PM.DataModel.Record.Version.superclass.commitTransientState, this));
95 deferredResult.callback(); 92 deferredResult.callback();
96 93
97 return deferredResult; 94 return deferredResult;
98 }, 95 },
99 96
100 //========================================================================= 97 //=========================================================================
101 98
102 'unpackData': function (someData) { //++ 99 'unpackData': function (someData) { //++
103 varresult; 100 varresult;
104 101
105//console.log("Record.Version - UNPACK DATA", this, someData); 102//console.log("Record.Version - UNPACK DATA", this, someData);
106 result = someData; 103 result = someData;
107 if ((someData['fields'] != null) && (someData['fields'] instanceof Array)) { 104 if ((someData['fields'] != null) && (someData['fields'] instanceof Array)) {
108 varfields; 105 varfields;
109 var i,c; 106 var i,c;
110 107
111 fields = someData['fields']; 108 fields = someData['fields'];
112 delete someData['fields']; 109 delete someData['fields'];
113 110
114 someData['fields'] = {}; 111 someData['fields'] = {};
115 c = fields.length; 112 c = fields.length;
116 for (i=0; i<c; i++) { 113 for (i=0; i<c; i++) {
117 someData['fields'][i] = fields[i]; 114 someData['fields'][i] = fields[i];
118 } 115 }
119 } 116 }
120 117
121 118
122 119
123 return result; 120 return result;
124 }, 121 },
125 122
126 //========================================================================= 123 //=========================================================================
127 124
128 'fields': function () { 125 'fields': function () {
129 vardeferredResult; 126 vardeferredResult;
130 var deferredLock; 127 var deferredLock;
131 128
132 deferredLock = this.getDeferredLockForKey('fields'); 129 deferredLock = this.getDeferredLockForKey('fields');
133 130
134 deferredResult = new Clipperz.Async.Deferred("Record.Version.fields", {trace:false}); 131 deferredResult = new Clipperz.Async.Deferred("Record.Version.fields", {trace:false});
135 deferredResult.acquireLock(deferredLock); 132 deferredResult.acquireLock(deferredLock);
136 deferredResult.addCallback(MochiKit.Base.bind(function () { 133 deferredResult.addCallback(MochiKit.Base.bind(function () {
137 var innerDeferredResult; 134 var innerDeferredResult;
138 135
139 if (this._fields == null) { 136 if (this._fields == null) {
140 innerDeferredResult = new Clipperz.Async.Deferred("Record.Version.fields <inner deferred>", {trace:false}); 137 innerDeferredResult = new Clipperz.Async.Deferred("Record.Version.fields <inner deferred>", {trace:false});
141 innerDeferredResult.addMethod(this, 'getValue', 'fields'); 138 innerDeferredResult.addMethod(this, 'getValue', 'fields');
142 innerDeferredResult.addCallback(MochiKit.Base.bind(function (someObjectData) { 139 innerDeferredResult.addCallback(MochiKit.Base.bind(function (someObjectData) {
143 var reference; 140 var reference;
144 141
145 this._fields = {}; 142 this._fields = {};
146 143
147 for (reference in someObjectData) { 144 for (reference in someObjectData) {
148 varrecordVersionField; 145 varrecordVersionField;
149 146
150 recordVersionField = new Clipperz.PM.DataModel.Record.Version.Field({ 147 recordVersionField = new Clipperz.PM.DataModel.Record.Version.Field({
151 'recordVersion':this, 148 'recordVersion':this,
152 'reference': reference 149 'reference': reference
153 }); 150 });
154 151
155 this._fields[reference] = recordVersionField; 152 this._fields[reference] = recordVersionField;
156 } 153 }
157 154
158 return this._fields; 155 return this._fields;
159 }, this)); 156 }, this));
160 innerDeferredResult.callback(); 157 innerDeferredResult.callback();
161 } else { 158 } else {
162 innerDeferredResult = MochiKit.Async.succeed(this._fields); 159 innerDeferredResult = MochiKit.Async.succeed(this._fields);
163 } 160 }
164 161
165 return innerDeferredResult; 162 return innerDeferredResult;
166 }, this)); 163 }, this));
167 deferredResult.releaseLock(deferredLock); 164 deferredResult.releaseLock(deferredLock);
168 deferredResult.callback(); 165 deferredResult.callback();
169 166
170 return deferredResult; 167 return deferredResult;
171 }, 168 },
172 169
173 //------------------------------------------------------------------------- 170 //-------------------------------------------------------------------------
174 171
175 'getFieldsValues': function () { 172 'getFieldsValues': function () {
176 return this.getValue('fields'); 173 return this.getValue('fields');
177 }, 174 },
178 175
179 //------------------------------------------------------------------------- 176 //-------------------------------------------------------------------------
180 177
181 'addField': function (someParameters) { 178 'addField': function (someParameters) {
182 varnewField; 179 varnewField;
183 180
184 newField = new Clipperz.PM.DataModel.Record.Version.Field({recordVersion:this}); 181 newField = new Clipperz.PM.DataModel.Record.Version.Field({recordVersion:this});
185 182
186 return Clipperz.Async.callbacks("Record.Version.addField", [ 183 return Clipperz.Async.callbacks("Record.Version.addField", [
187 MochiKit.Base.method(this, 'fields'), 184 MochiKit.Base.method(this, 'fields'),
188 185
189 MochiKit.Base.method(this, '_getObjectDataStore'), 186 MochiKit.Base.method(this, '_getObjectDataStore'),
190 MochiKit.Base.methodcaller('values'), 187 MochiKit.Base.methodcaller('values'),
191 Clipperz.Base.serializeJSON, 188 Clipperz.Base.serializeJSON,
192 189
193 MochiKit.Base.bind(function () { this._fields[newField.reference()] = newField; }, this), 190 MochiKit.Base.bind(function () { this._fields[newField.reference()] = newField; }, this),
194 MochiKit.Base.method(newField, 'setLabel', someParameters['label']), 191 MochiKit.Base.method(newField, 'setLabel', someParameters['label']),
195 MochiKit.Base.method(newField, 'setValue', someParameters['value']), 192 MochiKit.Base.method(newField, 'setValue', someParameters['value']),
196 MochiKit.Base.method(newField, 'setIsHidden',someParameters['isHidden']), 193 MochiKit.Base.method(newField, 'setIsHidden',someParameters['isHidden']),
197 194
198 MochiKit.Base.method(this, '_getObjectDataStore'), 195 MochiKit.Base.method(this, '_getObjectDataStore'),
199 MochiKit.Base.methodcaller('values'), 196 MochiKit.Base.methodcaller('values'),
200 Clipperz.Base.serializeJSON, 197 Clipperz.Base.serializeJSON,
201 198
202 MochiKit.Base.partial(MochiKit.Async.succeed, newField) 199 MochiKit.Base.partial(MochiKit.Async.succeed, newField)
203 ], {trace:false}); 200 ], {trace:false});
204 }, 201 },
205 202
206 //------------------------------------------------------------------------- 203 //-------------------------------------------------------------------------
207 204
208 'removeField': function (aField) { 205 'removeField': function (aField) {
209 return Clipperz.Async.callbacks("Record.Version.removeField", [ 206 return Clipperz.Async.callbacks("Record.Version.removeField", [
210 MochiKit.Base.method(this, 'fields'), 207 MochiKit.Base.method(this, 'fields'),
211 MochiKit.Base.bind(function () { delete this._fields[aField.reference()]; }, this), 208 MochiKit.Base.bind(function () { delete this._fields[aField.reference()]; }, this),
212 MochiKit.Base.method(this, 'removeValue', 'fields' + '.' + aField.reference()) 209 MochiKit.Base.method(this, 'removeValue', 'fields' + '.' + aField.reference())
213 ], {trace:false}); 210 ], {trace:false});
214 }, 211 },
215 212
216 //------------------------------------------------------------------------- 213 //-------------------------------------------------------------------------
217/* 214/*
218 'sortFieldReference': function (someSortedFieldReferences) { 215 'sortFieldReference': function (someSortedFieldReferences) {
219 216
220 217
221 218
222 }, 219 },
223*/ 220*/
224 //========================================================================= 221 //=========================================================================
225/* 222/*
226 'directLogins': function () { 223 'directLogins': function () {
227 return MochiKit.Base.values(this._directLogins); 224 return MochiKit.Base.values(this._directLogins);
228 }, 225 },
229 226
230 'addDirectLogin': function (aDirectLogin) { 227 'addDirectLogin': function (aDirectLogin) {
231 this._directLogins[aDirectLogin.reference()] = aDirectLogin; 228 this._directLogins[aDirectLogin.reference()] = aDirectLogin;
232 }, 229 },
233*/ 230*/
234 231
235 //========================================================================= 232 //=========================================================================
236/* 233/*
237 'updateValues': function (anotherVersion) { 234 'updateValues': function (anotherVersion) {
238 return Clipperz.Async.callbacks("Record.Version.updateValue", [ 235 return Clipperz.Async.callbacks("Record.Version.updateValue", [
239 MochiKit.Base.partial(MochiKit.Async.succeed, this) 236 MochiKit.Base.partial(MochiKit.Async.succeed, this)
240 ], {trace:false}); 237 ], {trace:false});
241 }, 238 },
242*/ 239*/
243 //========================================================================= 240 //=========================================================================
244 241
245 'setRemoteData': function (aValue) { 242 'setRemoteData': function (aValue) {
246 this._remoteData = aValue; 243 this._remoteData = aValue;
247 244
248 return aValue; 245 return aValue;
249 }, 246 },
250 247
251 //========================================================================= 248 //=========================================================================
252 249
253 'getVersionFunction': function () { 250 'getVersionFunction': function () {
254 return this._getVersionFunction; 251 return this._getVersionFunction;
255 }, 252 },
256 253
257 'previousVersion': function () { 254 'previousVersion': function () {
258 return Clipperz.Async.callbacks("Record.Versions.previousVersion", [ 255 return Clipperz.Async.callbacks("Record.Versions.previousVersion", [
259 MochiKit.Base.method(this, 'previousVersionReference'), 256 MochiKit.Base.method(this, 'previousVersionReference'),
260 this.getVersionFunction() 257 this.getVersionFunction()
261 ], {trace:false}); 258 ], {trace:false});
262 }, 259 },
263 260
264 'previousVersionReference': function () { 261 'previousVersionReference': function () {
265 return this.getValue('previousVersionReference'); 262 return this.getValue('previousVersionReference');
266 }, 263 },
267 264
268 'previousVersionKey': function () { 265 'previousVersionKey': function () {
269 //TODO: this value i encrypted on its own. So it can not be saved in the main objectStore!!! 266 //TODO: this value i encrypted on its own. So it can not be saved in the main objectStore!!!
270 return this.getValue('previousVersionKey'); 267 return this.getValue('previousVersionKey');
271 }, 268 },
272 269
273 //------------------------------------------------------------------------- 270 //-------------------------------------------------------------------------
274 271
275 'setPreviousVersionReferenceAndKey': function (aVersionObjectAndKey) { 272 'setPreviousVersionReferenceAndKey': function (aVersionObjectAndKey) {
276 // this._previousVersion = anotherVersion; 273 // this._previousVersion = anotherVersion;
277 return Clipperz.Async.callbacks("Record.Version.setPreviousVersion", [ 274 return Clipperz.Async.callbacks("Record.Version.setPreviousVersion", [
278 MochiKit.Base.method(this, 'setValue', 'previousVersionReference',aVersionObjectAndKey['reference']), 275 MochiKit.Base.method(this, 'setValue', 'previousVersionReference',aVersionObjectAndKey['reference']),
279 MochiKit.Base.method(this, 'setValue', 'previousVersionKey', aVersionObjectAndKey['key']) 276 MochiKit.Base.method(this, 'setValue', 'previousVersionKey', aVersionObjectAndKey['key'])
280 ], {trace:false}); 277 ], {trace:false});
281 }, 278 },
282 279
283 //========================================================================= 280 //=========================================================================
284 281
285 'revertChanges': function () { 282 'revertChanges': function () {
286 this.setReference(this.transientState()['originalReference']); 283 this.setReference(this.transientState()['originalReference']);
287 Clipperz.PM.DataModel.Record.Version.superclass.revertChanges.apply(this, arguments); 284 Clipperz.PM.DataModel.Record.Version.superclass.revertChanges.apply(this, arguments);
288 }, 285 },
289 286
290 //------------------------------------------------------------------------- 287 //-------------------------------------------------------------------------
291 288
292 'prepareRemoteDataWithKey': function (aKey) { 289 'prepareRemoteDataWithKey': function (aKey) {
293 var deferredResult; 290 var deferredResult;
294 var result; 291 var result;
295 292
296 result = {}; 293 result = {};
297 294
298//console.log("prepareRemoteDataWithKey", aKey); 295//console.log("prepareRemoteDataWithKey", aKey);
299 deferredResult = new Clipperz.Async.Deferred("Record.Version.prepareRemoteDataWithKey", {trace:false}); 296 deferredResult = new Clipperz.Async.Deferred("Record.Version.prepareRemoteDataWithKey", {trace:false});
300 if (this.isBrandNew() == false) { 297 if (this.isBrandNew() == false) {
301 this.transientState()['originalReference'] = this.reference(); 298 this.transientState()['originalReference'] = this.reference();
302 299
303 deferredResult.collectResults({ 300 deferredResult.collectResults({
304 'key':MochiKit.Base.partial(MochiKit.Async.succeed, aKey), 301 'key':MochiKit.Base.partial(MochiKit.Async.succeed, aKey),
305 'value': MochiKit.Base.method(this, 'getKey'), 302 'value': MochiKit.Base.method(this, 'getKey'),
306 'version': MochiKit.Base.partial(MochiKit.Async.succeed, Clipperz.PM.Crypto.encryptingFunctions.currentVersion) 303 'version': MochiKit.Base.partial(MochiKit.Async.succeed, Clipperz.PM.Crypto.encryptingFunctions.currentVersion)
307 }); 304 });
308 deferredResult.addCallback(Clipperz.PM.Crypto.deferredEncrypt); 305 deferredResult.addCallback(Clipperz.PM.Crypto.deferredEncrypt);
309 deferredResult.addCallback(Clipperz.Async.setItem, result, 'previousVersionKey'); 306 deferredResult.addCallback(Clipperz.Async.setItem, result, 'previousVersionKey');
310 } else { 307 } else {
311 deferredResult.addCallback(Clipperz.Async.setItem, result, 'previousVersionKey', Clipperz.PM.Crypto.nullValue); 308 deferredResult.addCallback(Clipperz.Async.setItem, result, 'previousVersionKey', Clipperz.PM.Crypto.nullValue);
312 } 309 }
313 deferredResult.addCallback(MochiKit.Base.bind(Clipperz.PM.DataModel.Record.superclass.prepareRemoteDataWithKey, this, aKey)); 310 deferredResult.addCallback(MochiKit.Base.bind(Clipperz.PM.DataModel.Record.superclass.prepareRemoteDataWithKey, this, aKey));
314 deferredResult.addCallback(MochiKit.Base.update, result); 311 deferredResult.addCallback(MochiKit.Base.update, result);
315 deferredResult.addMethod(this, 'setRemoteData'); 312 deferredResult.addMethod(this, 'setRemoteData');
316 313
317 deferredResult.callback(); 314 deferredResult.callback();
318 315
319 return deferredResult; 316 return deferredResult;
320 }, 317 },
321 318
322 //========================================================================= 319 //=========================================================================
323/* 320/*
324 'deleteAllCleanTextData': function () { 321 'deleteAllCleanTextData': function () {
325 return Clipperz.PM.DataModel.Record.Version.superclass.deleteAllCleanTextData.apply(this, arguments); 322 return Clipperz.PM.DataModel.Record.Version.superclass.deleteAllCleanTextData.apply(this, arguments);
326 }, 323 },
327 324
328 'hasAnyCleanTextData': function () { 325 'hasAnyCleanTextData': function () {
329 return Clipperz.PM.DataModel.Record.Version.superclass.hasAnyCleanTextData.apply(this, arguments); 326 return Clipperz.PM.DataModel.Record.Version.superclass.hasAnyCleanTextData.apply(this, arguments);
330 }, 327 },
331*/ 328*/
332 //========================================================================= 329 //=========================================================================
333 __syntaxFix__: "syntax fix" 330 __syntaxFix__: "syntax fix"
334}); 331});
335 332
336 333
diff --git a/frontend/gamma/js/Clipperz/PM/DataModel/Record.js b/frontend/gamma/js/Clipperz/PM/DataModel/Record.js
index 85dd06b..b816f80 100644
--- a/frontend/gamma/js/Clipperz/PM/DataModel/Record.js
+++ b/frontend/gamma/js/Clipperz/PM/DataModel/Record.js
@@ -1,408 +1,405 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
30if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } 27if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
31if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; } 28if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; }
32 29
33 30
34Clipperz.PM.DataModel.Record = function(args) { 31Clipperz.PM.DataModel.Record = function(args) {
35//console.log(">>> new Clipperz.PM.DataModel.Record", args); 32//console.log(">>> new Clipperz.PM.DataModel.Record", args);
36 Clipperz.PM.DataModel.Record.superclass.constructor.apply(this, arguments); 33 Clipperz.PM.DataModel.Record.superclass.constructor.apply(this, arguments);
37 34
38 this._updateDate = (args.updateDate ? Clipperz.PM.Date.parse(args.updateDate) : Clipperz.Base.exception.raise('MandatoryParameter')); 35 this._updateDate = (args.updateDate ? Clipperz.PM.Date.parse(args.updateDate) : Clipperz.Base.exception.raise('MandatoryParameter'));
39 36
40 this._retrieveIndexDataFunction = args.retrieveIndexDataFunction|| Clipperz.Base.exception.raise('MandatoryParameter'); 37 this._retrieveIndexDataFunction = args.retrieveIndexDataFunction|| Clipperz.Base.exception.raise('MandatoryParameter');
41 this._updateIndexDataFunction = args.updateIndexDataFunction || Clipperz.Base.exception.raise('MandatoryParameter'); 38 this._updateIndexDataFunction = args.updateIndexDataFunction || Clipperz.Base.exception.raise('MandatoryParameter');
42 39
43 this._retrieveDirectLoginIndexDataFunction = args.retrieveDirectLoginIndexDataFunction|| null; 40 this._retrieveDirectLoginIndexDataFunction = args.retrieveDirectLoginIndexDataFunction|| null;
44 this._setDirectLoginIndexDataFunction = args.setDirectLoginIndexDataFunction || null; 41 this._setDirectLoginIndexDataFunction = args.setDirectLoginIndexDataFunction || null;
45 this._removeDirectLoginIndexDataFunction = args.removeDirectLoginIndexDataFunction|| null; 42 this._removeDirectLoginIndexDataFunction = args.removeDirectLoginIndexDataFunction|| null;
46 43
47 this._createNewDirectLoginFunction = args.createNewDirectLoginFunction || null; 44 this._createNewDirectLoginFunction = args.createNewDirectLoginFunction || null;
48 45
49 this._directLogins = {}; 46 this._directLogins = {};
50 47
51 this._versions = {}; 48 this._versions = {};
52 49
53 this._currentRecordVersion = null; 50 this._currentRecordVersion = null;
54 if (this.isBrandNew()) { 51 if (this.isBrandNew()) {
55 var newVersion; 52 var newVersion;
56 53
57 this.setNotes(''); 54 this.setNotes('');
58 newVersion = new Clipperz.PM.DataModel.Record.Version({ 55 newVersion = new Clipperz.PM.DataModel.Record.Version({
59 'retrieveKeyFunction':MochiKit.Base.method(this, 'getVersionKey'), 56 'retrieveKeyFunction':MochiKit.Base.method(this, 'getVersionKey'),
60 'getVersion': MochiKit.Base.method(this, 'getVersion') 57 'getVersion': MochiKit.Base.method(this, 'getVersion')
61 58
62 }); 59 });
63 this._versions[newVersion.reference()] = newVersion; 60 this._versions[newVersion.reference()] = newVersion;
64 this._currentVersionReference = newVersion.reference(); 61 this._currentVersionReference = newVersion.reference();
65 // this.setLabel(''); 62 // this.setLabel('');
66 } 63 }
67 64
68//console.log("<<< new Clipperz.PM.DataModel.Record", args); 65//console.log("<<< new Clipperz.PM.DataModel.Record", args);
69 66
70 return this; 67 return this;
71} 68}
72 69
73 70
74Clipperz.Base.extend(Clipperz.PM.DataModel.Record, Clipperz.PM.DataModel.EncryptedRemoteObject, { 71Clipperz.Base.extend(Clipperz.PM.DataModel.Record, Clipperz.PM.DataModel.EncryptedRemoteObject, {
75 72
76 'toString': function() { 73 'toString': function() {
77 return "Record (" + this.reference() + ")"; 74 return "Record (" + this.reference() + ")";
78 }, 75 },
79 76
80 //------------------------------------------------------------------------- 77 //-------------------------------------------------------------------------
81 78
82 'reference': function () { 79 'reference': function () {
83 return this._reference; 80 return this._reference;
84 }, 81 },
85 82
86 //========================================================================= 83 //=========================================================================
87 84
88 'getIndexData': function () { 85 'getIndexData': function () {
89 return this._retrieveIndexDataFunction(this.reference()); 86 return this._retrieveIndexDataFunction(this.reference());
90 }, 87 },
91 88
92 //......................................................................... 89 //.........................................................................
93 90
94 'getIndexDataForKey': function (aKey) { 91 'getIndexDataForKey': function (aKey) {
95 return Clipperz.Async.callbacks("Record.getIndexDataForKey", [ 92 return Clipperz.Async.callbacks("Record.getIndexDataForKey", [
96 MochiKit.Base.method(this, 'getIndexData'), 93 MochiKit.Base.method(this, 'getIndexData'),
97 MochiKit.Base.itemgetter(aKey) 94 MochiKit.Base.itemgetter(aKey)
98 ], {trace:false}); 95 ], {trace:false});
99 }, 96 },
100 97
101 //------------------------------------------------------------------------- 98 //-------------------------------------------------------------------------
102 99
103 'setIndexDataForKey': function (aKey, aValue) { 100 'setIndexDataForKey': function (aKey, aValue) {
104 // return this._updateIndexDataFunction(this.reference(), aKey, aValue); 101 // return this._updateIndexDataFunction(this.reference(), aKey, aValue);
105 102
106 var deferredResult; 103 var deferredResult;
107 104
108 deferredResult = new Clipperz.Async.Deferred("Record.setIndexDataForKey", {trace:false}); 105 deferredResult = new Clipperz.Async.Deferred("Record.setIndexDataForKey", {trace:false});
109 deferredResult.addMethod(this, 'getIndexDataForKey', aKey); 106 deferredResult.addMethod(this, 'getIndexDataForKey', aKey);
110 deferredResult.addCallback(MochiKit.Base.bind(function (aCurrentValue) { 107 deferredResult.addCallback(MochiKit.Base.bind(function (aCurrentValue) {
111 var result; 108 var result;
112 var originalValue; 109 var originalValue;
113 110
114 originalValue = this.transientState().getValue('originalValues.indexData.' + aKey); 111 originalValue = this.transientState().getValue('originalValues.indexData.' + aKey);
115 if (originalValue == null) { 112 if (originalValue == null) {
116 originalValue = this.transientState().setValue('originalValues.indexData.' + aKey, aCurrentValue); 113 originalValue = this.transientState().setValue('originalValues.indexData.' + aKey, aCurrentValue);
117 } 114 }
118 115
119 if (aCurrentValue != aValue) { 116 if (aCurrentValue != aValue) {
120 if (originalValue != aValue) { 117 if (originalValue != aValue) {
121 this.transientState().setValue('hasPendingChanges.indexData.' + aKey, true); 118 this.transientState().setValue('hasPendingChanges.indexData.' + aKey, true);
122 } else { 119 } else {
123 this.transientState().setValue('hasPendingChanges.indexData.' + aKey, false); 120 this.transientState().setValue('hasPendingChanges.indexData.' + aKey, false);
124 } 121 }
125 122
126 result = this._updateIndexDataFunction(this.reference(), aKey, aValue); 123 result = this._updateIndexDataFunction(this.reference(), aKey, aValue);
127 } else { 124 } else {
128 result = MochiKit.Async.succeed(aValue); 125 result = MochiKit.Async.succeed(aValue);
129 } 126 }
130 127
131 return result; 128 return result;
132 }, this)); 129 }, this));
133 130
134 deferredResult.callback(); 131 deferredResult.callback();
135 132
136 return deferredResult; 133 return deferredResult;
137 }, 134 },
138 135
139 //========================================================================= 136 //=========================================================================
140/* 137/*
141 'key': function () { 138 'key': function () {
142 return this.getIndexDataForKey('key'); 139 return this.getIndexDataForKey('key');
143 }, 140 },
144*/ 141*/
145 //========================================================================= 142 //=========================================================================
146 143
147 'label': function () { 144 'label': function () {
148 return this.getIndexDataForKey('label'); 145 return this.getIndexDataForKey('label');
149 }, 146 },
150 147
151 //......................................................................... 148 //.........................................................................
152 149
153 'setLabel': function (aValue) { 150 'setLabel': function (aValue) {
154 return this.setIndexDataForKey('label', aValue); 151 return this.setIndexDataForKey('label', aValue);
155 }, 152 },
156 153
157 //========================================================================= 154 //=========================================================================
158 155
159 'headerNotes': function () { 156 'headerNotes': function () {
160 return this.getIndexDataForKey('notes'); 157 return this.getIndexDataForKey('notes');
161 }, 158 },
162 159
163 //------------------------------------------------------------------------- 160 //-------------------------------------------------------------------------
164 161
165 'notes': function () { 162 'notes': function () {
166 return Clipperz.Async.callbacks("Record.notes", [ 163 return Clipperz.Async.callbacks("Record.notes", [
167 MochiKit.Base.method(this, 'headerNotes'), 164 MochiKit.Base.method(this, 'headerNotes'),
168 MochiKit.Base.bind(function (someHeaderNotes) { 165 MochiKit.Base.bind(function (someHeaderNotes) {
169 var result; 166 var result;
170 167
171 if ((someHeaderNotes == null) || (typeof(someHeaderNotes) == 'undefined')) { 168 if ((someHeaderNotes == null) || (typeof(someHeaderNotes) == 'undefined')) {
172 result = this.getValue('notes'); 169 result = this.getValue('notes');
173 } else { 170 } else {
174 result = MochiKit.Async.succeed(someHeaderNotes); 171 result = MochiKit.Async.succeed(someHeaderNotes);
175 } 172 }
176 173
177 return result; 174 return result;
178 }, this) 175 }, this)
179 ], {trace:false}); 176 ], {trace:false});
180 }, 177 },
181 178
182 //......................................................................... 179 //.........................................................................
183 180
184 'setNotes': function (aValue) { 181 'setNotes': function (aValue) {
185 return this.setValue('notes', aValue); 182 return this.setValue('notes', aValue);
186 }, 183 },
187 184
188 //========================================================================= 185 //=========================================================================
189 186
190 'updateDate': function () { 187 'updateDate': function () {
191 return MochiKit.Async.succeed(this._updateDate); 188 return MochiKit.Async.succeed(this._updateDate);
192 }, 189 },
193 190
194 //========================================================================= 191 //=========================================================================
195 192
196 'favicon': function () { 193 'favicon': function () {
197 var result; 194 var result;
198 var directLogins; 195 var directLogins;
199 196
200 directLogins = MochiKit.Base.values(this.directLogins()); 197 directLogins = MochiKit.Base.values(this.directLogins());
201 if (directLogins.length > 0) { 198 if (directLogins.length > 0) {
202 result = directLogins[0].favicon(); 199 result = directLogins[0].favicon();
203 // } else if (/* is there an URL to use for searching a favicon */){ 200 // } else if (/* is there an URL to use for searching a favicon */){
204 } else { 201 } else {
205 result = null; //MochiKit.Async.succeed(Clipperz.PM.Strings['defaultFaviconUrl']); 202 result = null; //MochiKit.Async.succeed(Clipperz.PM.Strings['defaultFaviconUrl']);
206 } 203 }
207 204
208 return result; 205 return result;
209 }, 206 },
210 207
211 //------------------------------------------------------------------------- 208 //-------------------------------------------------------------------------
212 209
213 'searchableContent': function () { 210 'searchableContent': function () {
214 var deferredResult; 211 var deferredResult;
215 212
216//console.log(">>> searchableContent"); 213//console.log(">>> searchableContent");
217 deferredResult = new Clipperz.Async.Deferred("Record.searchableContent", {trace:false}); 214 deferredResult = new Clipperz.Async.Deferred("Record.searchableContent", {trace:false});
218 215
219 deferredResult.collectResults({ 216 deferredResult.collectResults({
220 'recordLabel': MochiKit.Base.method(this, 'label'), 217 'recordLabel': MochiKit.Base.method(this, 'label'),
221 'directLoginLabels': [ 218 'directLoginLabels': [
222 MochiKit.Base.method(this, 'directLoginReferences'), 219 MochiKit.Base.method(this, 'directLoginReferences'),
223 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.itemgetter('label')) 220 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.itemgetter('label'))
224 ] 221 ]
225 }) 222 })
226 deferredResult.addCallback(function (someValues) { 223 deferredResult.addCallback(function (someValues) {
227 return someValues['recordLabel'] + ' ' + someValues['directLoginLabels'].join(' '); 224 return someValues['recordLabel'] + ' ' + someValues['directLoginLabels'].join(' ');
228 }); 225 });
229 deferredResult.callback(); 226 deferredResult.callback();
230//console.log("<<< searchableContent"); 227//console.log("<<< searchableContent");
231 228
232 return deferredResult; 229 return deferredResult;
233 }, 230 },
234 231
235 //------------------------------------------------------------------------- 232 //-------------------------------------------------------------------------
236 233
237 'isMatching': function (aRegExp) { 234 'isMatching': function (aRegExp) {
238 return Clipperz.Async.callbacks("deferredFilterFunction", [ 235 return Clipperz.Async.callbacks("deferredFilterFunction", [
239 MochiKit.Base.method(this, 'searchableContent'), 236 MochiKit.Base.method(this, 'searchableContent'),
240 MochiKit.Base.method(aRegExp, 'test'), 237 MochiKit.Base.method(aRegExp, 'test'),
241 function (doesItMatch) { 238 function (doesItMatch) {
242 var result; 239 var result;
243 240
244 if (doesItMatch) { 241 if (doesItMatch) {
245 result = MochiKit.Async.succeed('match'); 242 result = MochiKit.Async.succeed('match');
246 } else { 243 } else {
247 result = MochiKit.Async.fail('miss'); 244 result = MochiKit.Async.fail('miss');
248 } 245 }
249 246
250 return result; 247 return result;
251 } 248 }
252 ], {trace:false}); 249 ], {trace:false});
253 }, 250 },
254 251
255 //========================================================================= 252 //=========================================================================
256 253
257 'directLogins': function () { 254 'directLogins': function () {
258 return this._directLogins; 255 return this._directLogins;
259 }, 256 },
260 257
261 'addDirectLogin': function (aDirectLogin) { 258 'addDirectLogin': function (aDirectLogin) {
262 this._directLogins[aDirectLogin.reference()] = aDirectLogin; 259 this._directLogins[aDirectLogin.reference()] = aDirectLogin;
263 }, 260 },
264 261
265 'directLoginWithReference': function (aDirectLoginReference) { 262 'directLoginWithReference': function (aDirectLoginReference) {
266 return this._directLogins[aDirectLoginReference]; 263 return this._directLogins[aDirectLoginReference];
267 }, 264 },
268 265
269 'createNewDirectLoginFunction': function () { 266 'createNewDirectLoginFunction': function () {
270 return this._createNewDirectLoginFunction; 267 return this._createNewDirectLoginFunction;
271 }, 268 },
272 269
273 'saveOriginalDirectLoginStatusToTransientState': function () { 270 'saveOriginalDirectLoginStatusToTransientState': function () {
274 if (this.transientState().getValue('directLogins') == null) { 271 if (this.transientState().getValue('directLogins') == null) {
275 // this.transientState().setValue('directLogins', this._directLogins) 272 // this.transientState().setValue('directLogins', this._directLogins)
276//console.log("SET TRANSIENT STATE", Clipperz.Base.serializeJSON(MochiKit.Base.keys(this.transientState().getValue('directLogins')))) 273//console.log("SET TRANSIENT STATE", Clipperz.Base.serializeJSON(MochiKit.Base.keys(this.transientState().getValue('directLogins'))))
277 MochiKit.Iter.forEach(MochiKit.Base.keys(this._directLogins), MochiKit.Base.bind(function(aKey) { 274 MochiKit.Iter.forEach(MochiKit.Base.keys(this._directLogins), MochiKit.Base.bind(function(aKey) {
278 this.transientState().setValue('directLogins' + '.' + aKey, this._directLogins[aKey]) 275 this.transientState().setValue('directLogins' + '.' + aKey, this._directLogins[aKey])
279 }, this)) 276 }, this))
280 } 277 }
281 }, 278 },
282 279
283 'createNewDirectLogin': function () { 280 'createNewDirectLogin': function () {
284 this.saveOriginalDirectLoginStatusToTransientState(); 281 this.saveOriginalDirectLoginStatusToTransientState();
285 282
286 return this.createNewDirectLoginFunction()(this); 283 return this.createNewDirectLoginFunction()(this);
287 }, 284 },
288 285
289 'removeDirectLogin': function(aDirectLogin) { 286 'removeDirectLogin': function(aDirectLogin) {
290 this.saveOriginalDirectLoginStatusToTransientState(); 287 this.saveOriginalDirectLoginStatusToTransientState();
291 288
292 return Clipperz.Async.callbacks("Record.removeDirectLogin", [ 289 return Clipperz.Async.callbacks("Record.removeDirectLogin", [
293 MochiKit.Base.method(this, 'removeValue', 'directLogins' + '.' + aDirectLogin.reference()), 290 MochiKit.Base.method(this, 'removeValue', 'directLogins' + '.' + aDirectLogin.reference()),
294 MochiKit.Base.bind(function () { 291 MochiKit.Base.bind(function () {
295 delete this._directLogins[aDirectLogin.reference()] 292 delete this._directLogins[aDirectLogin.reference()]
296 }, this) 293 }, this)
297 ], {trace:false}); 294 ], {trace:false});
298 295
299 }, 296 },
300 297
301 'directLoginReferences': function () { 298 'directLoginReferences': function () {
302 var result; 299 var result;
303 300
304 result = Clipperz.Async.callbacks("Record.directLoginReferences", [ 301 result = Clipperz.Async.callbacks("Record.directLoginReferences", [
305 MochiKit.Base.method(this, 'directLogins'), 302 MochiKit.Base.method(this, 'directLogins'),
306 MochiKit.Base.values, 303 MochiKit.Base.values,
307 function (someDirectLogins) { 304 function (someDirectLogins) {
308 var result; 305 var result;
309 var i,c; 306 var i,c;
310 307
311 result = []; 308 result = [];
312 c = someDirectLogins.length; 309 c = someDirectLogins.length;
313 for (i=0; i<c; i++) { 310 for (i=0; i<c; i++) {
314 result.push(Clipperz.Async.collectResults("Record.directLoginReferences - collectResults", { 311 result.push(Clipperz.Async.collectResults("Record.directLoginReferences - collectResults", {
315 '_rowObject': MochiKit.Async.succeed, 312 '_rowObject': MochiKit.Async.succeed,
316 '_reference': MochiKit.Base.methodcaller('reference'), 313 '_reference': MochiKit.Base.methodcaller('reference'),
317 'label': MochiKit.Base.methodcaller('label'), 314 'label': MochiKit.Base.methodcaller('label'),
318 'favicon': MochiKit.Base.methodcaller('favicon') 315 'favicon': MochiKit.Base.methodcaller('favicon')
319 }, {trace:false})(someDirectLogins[i])); 316 }, {trace:false})(someDirectLogins[i]));
320 }; 317 };
321 318
322 return result; 319 return result;
323 }, 320 },
324 Clipperz.Async.collectAll 321 Clipperz.Async.collectAll
325 ], {trace:false}); 322 ], {trace:false});
326 323
327 return result; 324 return result;
328 }, 325 },
329 326
330 //========================================================================= 327 //=========================================================================
331 328
332 'unpackRemoteData': function (someData) { 329 'unpackRemoteData': function (someData) {
333 var result; 330 var result;
334 331
335//console.log("new Clipperz.PM.DataModel.Record.Version [2]"); 332//console.log("new Clipperz.PM.DataModel.Record.Version [2]");
336/* 333/*
337 this._currentRecordVersion = new Clipperz.PM.DataModel.Record.Version({ 334 this._currentRecordVersion = new Clipperz.PM.DataModel.Record.Version({
338 'reference': someData['currentVersion']['reference'], 335 'reference': someData['currentVersion']['reference'],
339 'retrieveKeyFunction': MochiKit.Base.method(this, 'getCurrentRecordVersionKey'), 336 'retrieveKeyFunction': MochiKit.Base.method(this, 'getCurrentRecordVersionKey'),
340 'remoteData': someData['currentVersion'], 337 'remoteData': someData['currentVersion'],
341 }); 338 });
342*/ 339*/
343 var versionKey; 340 var versionKey;
344 341
345 for (versionKey in someData['versions']) { 342 for (versionKey in someData['versions']) {
346//console.log("### versionKey", versionKey); 343//console.log("### versionKey", versionKey);
347 this._versions[versionKey] = new Clipperz.PM.DataModel.Record.Version({ 344 this._versions[versionKey] = new Clipperz.PM.DataModel.Record.Version({
348 'reference': versionKey, 345 'reference': versionKey,
349 'retrieveKeyFunction':MochiKit.Base.method(this, 'getVersionKey'), 346 'retrieveKeyFunction':MochiKit.Base.method(this, 'getVersionKey'),
350 'remoteData': someData['versions'][versionKey], 347 'remoteData': someData['versions'][versionKey],
351 'getVersion': MochiKit.Base.method(this, 'getVersion') 348 'getVersion': MochiKit.Base.method(this, 'getVersion')
352 }) 349 })
353 } 350 }
354 351
355 // this._currentVersionReference = someData['currentVersion']['reference']; 352 // this._currentVersionReference = someData['currentVersion']['reference'];
356 this._currentVersionReference = someData['currentVersion']; 353 this._currentVersionReference = someData['currentVersion'];
357//console.log("=== currentVersionReference", this._currentVersionReference, someData); 354//console.log("=== currentVersionReference", this._currentVersionReference, someData);
358 355
359 result = Clipperz.PM.DataModel.Record.superclass.unpackRemoteData.apply(this, arguments); 356 result = Clipperz.PM.DataModel.Record.superclass.unpackRemoteData.apply(this, arguments);
360 357
361 return result; 358 return result;
362 }, 359 },
363 360
364 //------------------------------------------------------------------------- 361 //-------------------------------------------------------------------------
365 362
366 'unpackData': function (someData) { 363 'unpackData': function (someData) {
367 var result; 364 var result;
368 365
369 result = Clipperz.PM.DataModel.Record.superclass.unpackData.apply(this, arguments); 366 result = Clipperz.PM.DataModel.Record.superclass.unpackData.apply(this, arguments);
370 367
371 if (MochiKit.Base.isUndefinedOrNull(result['notes'])) { 368 if (MochiKit.Base.isUndefinedOrNull(result['notes'])) {
372 result['notes'] = '' 369 result['notes'] = ''
373 } 370 }
374 371
375 return result; 372 return result;
376 }, 373 },
377 374
378 //------------------------------------------------------------------------- 375 //-------------------------------------------------------------------------
379 376
380 'prepareRemoteDataWithKey': function (aKey) { 377 'prepareRemoteDataWithKey': function (aKey) {
381 var deferredResult; 378 var deferredResult;
382 varnewVersionKey; 379 varnewVersionKey;
383 var result; 380 var result;
384 381
385 newVersionKey = Clipperz.PM.Crypto.randomKey(); 382 newVersionKey = Clipperz.PM.Crypto.randomKey();
386 result = {}; 383 result = {};
387 384
388 deferredResult = new Clipperz.Async.Deferred("Record.prepareRemoteDataWithKey", {trace:false}); 385 deferredResult = new Clipperz.Async.Deferred("Record.prepareRemoteDataWithKey", {trace:false});
389 deferredResult.addCallbackList([ 386 deferredResult.addCallbackList([
390 Clipperz.Async.collectResults("Record.prepareRemoteDataWithKey - collect results", { 387 Clipperz.Async.collectResults("Record.prepareRemoteDataWithKey - collect results", {
391 'isBrandNew': MochiKit.Base.method(this, 'isBrandNew'), 388 'isBrandNew': MochiKit.Base.method(this, 'isBrandNew'),
392 'versionHasPendingChanges':[ 389 'versionHasPendingChanges':[
393 // MochiKit.Base.method(this, 'getCurrentRecordVersion'), 390 // MochiKit.Base.method(this, 'getCurrentRecordVersion'),
394 // MochiKit.Base.methodcaller('hasPendingChanges') 391 // MochiKit.Base.methodcaller('hasPendingChanges')
395 MochiKit.Base.method(this, 'invokeCurrentRecordVersionMethod', 'hasPendingChanges') 392 MochiKit.Base.method(this, 'invokeCurrentRecordVersionMethod', 'hasPendingChanges')
396 ] 393 ]
397 }), 394 }),
398 Clipperz.Async.or, 395 Clipperz.Async.or,
399 396
400 Clipperz.Async.deferredIf("Current Version has pending changes", [ 397 Clipperz.Async.deferredIf("Current Version has pending changes", [
401 MochiKit.Base.method(this, 'createNewRecordVersion'), 398 MochiKit.Base.method(this, 'createNewRecordVersion'),
402 MochiKit.Base.methodcaller('prepareRemoteDataWithKey', newVersionKey), 399 MochiKit.Base.methodcaller('prepareRemoteDataWithKey', newVersionKey),
403 MochiKit.Base.partial(Clipperz.Async.setItem, result, 'currentRecordVersion'), 400 MochiKit.Base.partial(Clipperz.Async.setItem, result, 'currentRecordVersion'),
404 MochiKit.Base.method(this, 'setCurrentRecordVersionKey', newVersionKey) 401 MochiKit.Base.method(this, 'setCurrentRecordVersionKey', newVersionKey)
405 ], []), 402 ], []),
406 403
407 MochiKit.Base.bind(Clipperz.PM.DataModel.Record.superclass.prepareRemoteDataWithKey, this, aKey), 404 MochiKit.Base.bind(Clipperz.PM.DataModel.Record.superclass.prepareRemoteDataWithKey, this, aKey),
408 MochiKit.Base.partial(Clipperz.Async.setItem, result, 'record'), 405 MochiKit.Base.partial(Clipperz.Async.setItem, result, 'record'),
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 e675525..d6202ff 100644
--- a/frontend/gamma/js/Clipperz/PM/DataModel/User.Header.Legacy.js
+++ b/frontend/gamma/js/Clipperz/PM/DataModel/User.Header.Legacy.js
@@ -1,187 +1,184 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29try { if (typeof(Clipperz.PM.DataModel.User) == 'undefined') { throw ""; }} catch (e) { 26try { if (typeof(Clipperz.PM.DataModel.User) == 'undefined') { throw ""; }} catch (e) {
30 throw "Clipperz.PM.DataModel.User.Header.Legacy depends on Clipperz.PM.DataModel.User!"; 27 throw "Clipperz.PM.DataModel.User.Header.Legacy depends on Clipperz.PM.DataModel.User!";
31} 28}
32 29
33if (typeof(Clipperz.PM.DataModel.User.Header) == 'undefined') { Clipperz.PM.DataModel.User.Header = {}; } 30if (typeof(Clipperz.PM.DataModel.User.Header) == 'undefined') { Clipperz.PM.DataModel.User.Header = {}; }
34 31
35Clipperz.PM.DataModel.User.Header.Legacy = function(args) { 32Clipperz.PM.DataModel.User.Header.Legacy = function(args) {
36 //args = args || {}; 33 //args = args || {};
37 Clipperz.PM.DataModel.User.Header.Legacy.superclass.constructor.apply(this, arguments); 34 Clipperz.PM.DataModel.User.Header.Legacy.superclass.constructor.apply(this, arguments);
38 35
39 this._retrieveRecordDetailFunction = args.retrieveRecordDetailFunction|| Clipperz.Base.exception.raise('MandatoryParameter'); 36 this._retrieveRecordDetailFunction = args.retrieveRecordDetailFunction|| Clipperz.Base.exception.raise('MandatoryParameter');
40 this._records = null; 37 this._records = null;
41 //this._directLogins = null; 38 //this._directLogins = null;
42 39
43 return this; 40 return this;
44} 41}
45 42
46 43
47Clipperz.Base.extend(Clipperz.PM.DataModel.User.Header.Legacy, Clipperz.PM.DataModel.EncryptedRemoteObject, { 44Clipperz.Base.extend(Clipperz.PM.DataModel.User.Header.Legacy, Clipperz.PM.DataModel.EncryptedRemoteObject, {
48 45
49 'toString': function() { 46 'toString': function() {
50 return "Clipperz.PM.DataModel.User.Header.Legacy"; 47 return "Clipperz.PM.DataModel.User.Header.Legacy";
51 }, 48 },
52 49
53 //------------------------------------------------------------------------- 50 //-------------------------------------------------------------------------
54 51
55 'retrieveRecordDetailFunction': function () { 52 'retrieveRecordDetailFunction': function () {
56 return this._retrieveRecordDetailFunction; 53 return this._retrieveRecordDetailFunction;
57 }, 54 },
58 55
59 //------------------------------------------------------------------------- 56 //-------------------------------------------------------------------------
60 57
61 'getRecordKey': function (aRecordReference) { 58 'getRecordKey': function (aRecordReference) {
62 var deferredResult; 59 var deferredResult;
63 60
64 deferredResult = new Clipperz.Async.Deferred("User.Header.Legacy.getRecordKey", {trace:false}); 61 deferredResult = new Clipperz.Async.Deferred("User.Header.Legacy.getRecordKey", {trace:false});
65 deferredResult.addMethod(this, 'getRecordIndexData'); 62 deferredResult.addMethod(this, 'getRecordIndexData');
66 deferredResult.addCallback(MochiKit.Base.itemgetter('key')) 63 deferredResult.addCallback(MochiKit.Base.itemgetter('key'))
67 deferredResult.callback(); 64 deferredResult.callback();
68 65
69 return deferredResult; 66 return deferredResult;
70 }, 67 },
71 68
72 //========================================================================= 69 //=========================================================================
73 70
74 'getRecordIndexData': function (aRecordReference) { 71 'getRecordIndexData': function (aRecordReference) {
75 return this.getValue('records.' + aRecordReference); 72 return this.getValue('records.' + aRecordReference);
76 }, 73 },
77 74
78 'updateRecordIndexData': function (aRecordReference, aKey, aValue) { 75 'updateRecordIndexData': function (aRecordReference, aKey, aValue) {
79 return this.setValue('records.' + aRecordReference + "." + aKey, aValue); 76 return this.setValue('records.' + aRecordReference + "." + aKey, aValue);
80 }, 77 },
81 78
82 //------------------------------------------------------------------------- 79 //-------------------------------------------------------------------------
83 80
84 'getDirectLoginIndexData': function (aDirectLoginReference) { 81 'getDirectLoginIndexData': function (aDirectLoginReference) {
85 return this.getValue('directLogins.' + aDirectLoginReference); 82 return this.getValue('directLogins.' + aDirectLoginReference);
86 }, 83 },
87 84
88 'setDirectLoginIndexData': function (aDirectLoginReference, aKey, aValue) { 85 'setDirectLoginIndexData': function (aDirectLoginReference, aKey, aValue) {
89 return this.setValue('directLogins.' + aDirectLoginReference + '.' + aKey, aValue); 86 return this.setValue('directLogins.' + aDirectLoginReference + '.' + aKey, aValue);
90 }, 87 },
91 88
92 'removeDirectLoginIndexData': function (aDirectLoginReference) { 89 'removeDirectLoginIndexData': function (aDirectLoginReference) {
93 return this.removeValue('directLogins.' + aDirectLoginReference); 90 return this.removeValue('directLogins.' + aDirectLoginReference);
94 }, 91 },
95 92
96 //========================================================================= 93 //=========================================================================
97 94
98 'records': function () { 95 'records': function () {
99 vardeferredResult; 96 vardeferredResult;
100 var deferredLock; 97 var deferredLock;
101 98
102 deferredLock = this.getDeferredLockForKey('records'); 99 deferredLock = this.getDeferredLockForKey('records');
103 100
104 deferredResult = new Clipperz.Async.Deferred("User.Header.Legacy.records", {trace:false}); 101 deferredResult = new Clipperz.Async.Deferred("User.Header.Legacy.records", {trace:false});
105 deferredResult.acquireLock(deferredLock); 102 deferredResult.acquireLock(deferredLock);
106 deferredResult.addCallback(MochiKit.Base.bind(function () { 103 deferredResult.addCallback(MochiKit.Base.bind(function () {
107 var innerDeferredResult; 104 var innerDeferredResult;
108 105
109 if (this._records == null) { 106 if (this._records == null) {
110 innerDeferredResult = new Clipperz.Async.Deferred("User.Header.Legacy.records <inner deferred>", {trace:false}); 107 innerDeferredResult = new Clipperz.Async.Deferred("User.Header.Legacy.records <inner deferred>", {trace:false});
111 innerDeferredResult.collectResults({ 108 innerDeferredResult.collectResults({
112 'header': [ 109 'header': [
113 // MochiKit.Base.method(this, 'getObjectDataStore'), 110 // MochiKit.Base.method(this, 'getObjectDataStore'),
114 // MochiKit.Base.methodcaller('values') 111 // MochiKit.Base.methodcaller('values')
115 MochiKit.Base.method(this, 'values') 112 MochiKit.Base.method(this, 'values')
116 ], 113 ],
117 'recordsStats': [ 114 'recordsStats': [
118 MochiKit.Base.method(this, 'getRemoteData'), 115 MochiKit.Base.method(this, 'getRemoteData'),
119 MochiKit.Base.itemgetter('recordsStats') 116 MochiKit.Base.itemgetter('recordsStats')
120 ] 117 ]
121 }); 118 });
122 innerDeferredResult.addCallback(MochiKit.Base.bind(function (someObjectData) { 119 innerDeferredResult.addCallback(MochiKit.Base.bind(function (someObjectData) {
123 var reference; 120 var reference;
124 121
125 this._records = {}; 122 this._records = {};
126 // this._directLogins = {}; 123 // this._directLogins = {};
127 124
128 for (reference in someObjectData['header']['records']) { 125 for (reference in someObjectData['header']['records']) {
129 varrecord; 126 varrecord;
130 127
131 record = new Clipperz.PM.DataModel.Record({ 128 record = new Clipperz.PM.DataModel.Record({
132 'reference': reference, 129 'reference': reference,
133 'retrieveKeyFunction': MochiKit.Base.method(this, 'getRecordKey'), 130 'retrieveKeyFunction': MochiKit.Base.method(this, 'getRecordKey'),
134 'retrieveRemoteDataFunction':this.retrieveRecordDetailFunction(), 131 'retrieveRemoteDataFunction':this.retrieveRecordDetailFunction(),
135 // 'encryptedDataKeypath': 'data', 132 // 'encryptedDataKeypath': 'data',
136 // 'encryptedVersionKeypath': 'version', 133 // 'encryptedVersionKeypath': 'version',
137 134
138 'retrieveIndexDataFunction':MochiKit.Base.method(this, 'getRecordIndexData'), 135 'retrieveIndexDataFunction':MochiKit.Base.method(this, 'getRecordIndexData'),
139 'updateIndexDataFunction': MochiKit.Base.method(this, 'updateRecordIndexData'), 136 'updateIndexDataFunction': MochiKit.Base.method(this, 'updateRecordIndexData'),
140 'updateDate': someObjectData['recordsStats'][reference]['updateDate'], 137 'updateDate': someObjectData['recordsStats'][reference]['updateDate'],
141 138
142 'retrieveDirectLoginIndexDataFunction':MochiKit.Base.method(this, 'getDirectLoginIndexData'), 139 'retrieveDirectLoginIndexDataFunction':MochiKit.Base.method(this, 'getDirectLoginIndexData'),
143 'setDirectLoginIndexDataFunction': MochiKit.Base.method(this, 'setDirectLoginIndexData'), 140 'setDirectLoginIndexDataFunction': MochiKit.Base.method(this, 'setDirectLoginIndexData'),
144 'removeDirectLoginIndexDataFunction':MochiKit.Base.method(this, 'removeDirectLoginIndexData') 141 'removeDirectLoginIndexDataFunction':MochiKit.Base.method(this, 'removeDirectLoginIndexData')
145 }); 142 });
146 143
147 this._records[reference] = record; 144 this._records[reference] = record;
148 } 145 }
149 146
150 for (reference in someObjectData['header']['directLogins']) { 147 for (reference in someObjectData['header']['directLogins']) {
151 vardirectLogin; 148 vardirectLogin;
152 var record; 149 var record;
153 150
154 record = this._records[someObjectData['header']['directLogins'][reference]['record']]; 151 record = this._records[someObjectData['header']['directLogins'][reference]['record']];
155 if (record != null) { 152 if (record != null) {
156 directLogin = new Clipperz.PM.DataModel.DirectLogin({ 153 directLogin = new Clipperz.PM.DataModel.DirectLogin({
157 'reference': reference, 154 'reference': reference,
158 'record': record//, 155 'record': record//,
159 // 'retrieveIndexDataFunction':MochiKit.Base.method(this, 'getDirectLoginIndexData'), 156 // 'retrieveIndexDataFunction':MochiKit.Base.method(this, 'getDirectLoginIndexData'),
160 // 'setIndexDataFunction': MochiKit.Base.method(this, 'setDirectLoginIndexData'), 157 // 'setIndexDataFunction': MochiKit.Base.method(this, 'setDirectLoginIndexData'),
161 // 'removeIndexDataFunction': MochiKit.Base.method(this, 'removeDirectLoginIndexData') 158 // 'removeIndexDataFunction': MochiKit.Base.method(this, 'removeDirectLoginIndexData')
162 }); 159 });
163 } else { 160 } else {
164Clipperz.log("WARNING: DIRECT LOGIN without a matching RECORD!!"); 161Clipperz.log("WARNING: DIRECT LOGIN without a matching RECORD!!");
165 } 162 }
166 } 163 }
167 164
168 return this._records; 165 return this._records;
169 }, this)); 166 }, this));
170 innerDeferredResult.callback(); 167 innerDeferredResult.callback();
171 } else { 168 } else {
172 innerDeferredResult = MochiKit.Async.succeed(this._records); 169 innerDeferredResult = MochiKit.Async.succeed(this._records);
173 } 170 }
174 171
175 return innerDeferredResult; 172 return innerDeferredResult;
176 }, this)); 173 }, this));
177 deferredResult.releaseLock(deferredLock); 174 deferredResult.releaseLock(deferredLock);
178 deferredResult.callback(); 175 deferredResult.callback();
179 176
180 return deferredResult; 177 return deferredResult;
181 }, 178 },
182 179
183 //========================================================================= 180 //=========================================================================
184 __syntaxFix__: "syntax fix" 181 __syntaxFix__: "syntax fix"
185}); 182});
186 183
187 184
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 0ee8599..3528db6 100644
--- a/frontend/gamma/js/Clipperz/PM/DataModel/User.Header.OneTimePasswords.js
+++ b/frontend/gamma/js/Clipperz/PM/DataModel/User.Header.OneTimePasswords.js
@@ -1,128 +1,125 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29try { if (typeof(Clipperz.PM.DataModel.User) == 'undefined') { throw ""; }} catch (e) { 26try { if (typeof(Clipperz.PM.DataModel.User) == 'undefined') { throw ""; }} catch (e) {
30 throw "Clipperz.PM.DataModel.User.Header.OneTimePasswords depends on Clipperz.PM.DataModel.User!"; 27 throw "Clipperz.PM.DataModel.User.Header.OneTimePasswords depends on Clipperz.PM.DataModel.User!";
31} 28}
32if (typeof(Clipperz.PM.DataModel.User.Header) == 'undefined') { Clipperz.PM.DataModel.User.Header = {}; } 29if (typeof(Clipperz.PM.DataModel.User.Header) == 'undefined') { Clipperz.PM.DataModel.User.Header = {}; }
33 30
34//----------------------------------------------------------------------------- 31//-----------------------------------------------------------------------------
35 32
36Clipperz.PM.DataModel.User.Header.OneTimePasswords = function(args) { 33Clipperz.PM.DataModel.User.Header.OneTimePasswords = function(args) {
37 Clipperz.PM.DataModel.User.Header.OneTimePasswords.superclass.constructor.apply(this, arguments); 34 Clipperz.PM.DataModel.User.Header.OneTimePasswords.superclass.constructor.apply(this, arguments);
38 35
39 this._oneTimePasswords = null; 36 this._oneTimePasswords = null;
40 37
41 return this; 38 return this;
42} 39}
43 40
44//----------------------------------------------------------------------------- 41//-----------------------------------------------------------------------------
45 42
46Clipperz.Base.extend(Clipperz.PM.DataModel.User.Header.OneTimePasswords, Clipperz.PM.DataModel.EncryptedRemoteObject, { 43Clipperz.Base.extend(Clipperz.PM.DataModel.User.Header.OneTimePasswords, Clipperz.PM.DataModel.EncryptedRemoteObject, {
47 44
48 'toString': function() { 45 'toString': function() {
49 return "Clipperz.PM.DataModel.User.Header.OneTimePasswords"; 46 return "Clipperz.PM.DataModel.User.Header.OneTimePasswords";
50 }, 47 },
51 48
52 //------------------------------------------------------------------------- 49 //-------------------------------------------------------------------------
53/* 50/*
54 'packData': function (someData) { //++ 51 'packData': function (someData) { //++
55 var result; 52 var result;
56 53
57console.log(">>> OneTimePasswords.packData", someData); 54console.log(">>> OneTimePasswords.packData", someData);
58 result = Clipperz.PM.DataModel.User.Header.OneTimePasswords.superclass.packData.apply(this, arguments); 55 result = Clipperz.PM.DataModel.User.Header.OneTimePasswords.superclass.packData.apply(this, arguments);
59console.log("<<< OneTimePasswords.packData"); 56console.log("<<< OneTimePasswords.packData");
60 57
61 return result; 58 return result;
62 }, 59 },
63*/ 60*/
64 //------------------------------------------------------------------------- 61 //-------------------------------------------------------------------------
65/* 62/*
66 'packRemoteData': function (someData) { 63 'packRemoteData': function (someData) {
67 var result; 64 var result;
68 65
69console.log(">>> OneTimePasswords.packRemoteData", someData); 66console.log(">>> OneTimePasswords.packRemoteData", someData);
70 result = Clipperz.PM.DataModel.User.Header.OneTimePasswords.superclass.packRemoteData.apply(this, arguments); 67 result = Clipperz.PM.DataModel.User.Header.OneTimePasswords.superclass.packRemoteData.apply(this, arguments);
71console.log("<<< OneTimePasswords.packRemoteData"); 68console.log("<<< OneTimePasswords.packRemoteData");
72 69
73 return result; 70 return result;
74 }, 71 },
75*/ 72*/
76 //------------------------------------------------------------------------- 73 //-------------------------------------------------------------------------
77/* 74/*
78 'prepareRemoteDataWithKey': function (aKey) { 75 'prepareRemoteDataWithKey': function (aKey) {
79 var result; 76 var result;
80 77
81console.log(">>> OneTimePasswords.prepareRemoteDataWithKey"); 78console.log(">>> OneTimePasswords.prepareRemoteDataWithKey");
82 result = Clipperz.PM.DataModel.User.Header.OneTimePasswords.superclass.prepareRemoteDataWithKey.apply(this, arguments); 79 result = Clipperz.PM.DataModel.User.Header.OneTimePasswords.superclass.prepareRemoteDataWithKey.apply(this, arguments);
83console.log("<<< OneTimePasswords.prepareRemoteDataWithKey"); 80console.log("<<< OneTimePasswords.prepareRemoteDataWithKey");
84 81
85 return result; 82 return result;
86 }, 83 },
87*/ 84*/
88 //========================================================================= 85 //=========================================================================
89 86
90 'oneTimePasswords': function () { 87 'oneTimePasswords': function () {
91 vardeferredResult; 88 vardeferredResult;
92 89
93 deferredResult = new Clipperz.Async.Deferred("User.Header.OneTimePasswords.oneTimePasswords", {trace:false}); 90 deferredResult = new Clipperz.Async.Deferred("User.Header.OneTimePasswords.oneTimePasswords", {trace:false});
94 if (this._oneTimePasswords == null) { 91 if (this._oneTimePasswords == null) {
95 deferredResult.addMethod(this, 'values') 92 deferredResult.addMethod(this, 'values')
96 deferredResult.addCallback(MochiKit.Base.bind(function (someData) { 93 deferredResult.addCallback(MochiKit.Base.bind(function (someData) {
97 varotpKey; 94 varotpKey;
98 95
99 this._oneTimePasswords = {}; 96 this._oneTimePasswords = {};
100 97
101 for (otpKey in someData) { 98 for (otpKey in someData) {
102 var otp; 99 var otp;
103 var otpParameters; 100 var otpParameters;
104 101
105 otpParameters = Clipperz.Base.deepClone(someData[otpKey]); 102 otpParameters = Clipperz.Base.deepClone(someData[otpKey]);
106 otpParameters['reference'] = otpKey; 103 otpParameters['reference'] = otpKey;
107 104
108 otp = new Clipperz.PM.DataModel.OneTimePassword(otpParameters); 105 otp = new Clipperz.PM.DataModel.OneTimePassword(otpParameters);
109 this._oneTimePasswords[otpKey] = otp; 106 this._oneTimePasswords[otpKey] = otp;
110 } 107 }
111 108
112 return this._oneTimePasswords; 109 return this._oneTimePasswords;
113 110
114 }, this)); 111 }, this));
115 deferredResult.callback(); 112 deferredResult.callback();
116 } else { 113 } else {
117 deferredResult = MochiKit.Async.succeed(this._oneTimePasswords); 114 deferredResult = MochiKit.Async.succeed(this._oneTimePasswords);
118 } 115 }
119 116
120 return deferredResult; 117 return deferredResult;
121 }, 118 },
122 119
123 //========================================================================= 120 //=========================================================================
124 __syntaxFix__: "syntax fix" 121 __syntaxFix__: "syntax fix"
125}); 122});
126 123
127//----------------------------------------------------------------------------- 124//-----------------------------------------------------------------------------
128 125
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 91b981e..b164889 100644
--- a/frontend/gamma/js/Clipperz/PM/DataModel/User.Header.Preferences.js
+++ b/frontend/gamma/js/Clipperz/PM/DataModel/User.Header.Preferences.js
@@ -1,53 +1,50 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29try { if (typeof(Clipperz.PM.DataModel.User) == 'undefined') { throw ""; }} catch (e) { 26try { if (typeof(Clipperz.PM.DataModel.User) == 'undefined') { throw ""; }} catch (e) {
30 throw "Clipperz.PM.DataModel.User.Header.Preferences depends on Clipperz.PM.DataModel.User!"; 27 throw "Clipperz.PM.DataModel.User.Header.Preferences depends on Clipperz.PM.DataModel.User!";
31} 28}
32 29
33if (typeof(Clipperz.PM.DataModel.User.Header) == 'undefined') { Clipperz.PM.DataModel.User.Header = {}; } 30if (typeof(Clipperz.PM.DataModel.User.Header) == 'undefined') { Clipperz.PM.DataModel.User.Header = {}; }
34 31
35Clipperz.PM.DataModel.User.Header.Preferences = function(args) { 32Clipperz.PM.DataModel.User.Header.Preferences = function(args) {
36 Clipperz.PM.DataModel.User.Header.Preferences.superclass.constructor.apply(this, arguments); 33 Clipperz.PM.DataModel.User.Header.Preferences.superclass.constructor.apply(this, arguments);
37 34
38 return this; 35 return this;
39} 36}
40 37
41 38
42Clipperz.Base.extend(Clipperz.PM.DataModel.User.Header.Preferences, Clipperz.PM.DataModel.EncryptedRemoteObject, { 39Clipperz.Base.extend(Clipperz.PM.DataModel.User.Header.Preferences, Clipperz.PM.DataModel.EncryptedRemoteObject, {
43 40
44 'toString': function() { 41 'toString': function() {
45 return "Clipperz.PM.DataModel.User.Header.Preferences"; 42 return "Clipperz.PM.DataModel.User.Header.Preferences";
46 }, 43 },
47 44
48 //------------------------------------------------------------------------- 45 //-------------------------------------------------------------------------
49 //========================================================================= 46 //=========================================================================
50 __syntaxFix__: "syntax fix" 47 __syntaxFix__: "syntax fix"
51}); 48});
52 49
53 50
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 6ba58a8..f77ea80 100644
--- a/frontend/gamma/js/Clipperz/PM/DataModel/User.Header.RecordIndex.js
+++ b/frontend/gamma/js/Clipperz/PM/DataModel/User.Header.RecordIndex.js
@@ -1,408 +1,405 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29try { if (typeof(Clipperz.PM.DataModel.User) == 'undefined') { throw ""; }} catch (e) { 26try { if (typeof(Clipperz.PM.DataModel.User) == 'undefined') { throw ""; }} catch (e) {
30 throw "Clipperz.PM.DataModel.User.Header.RecordIndex depends on Clipperz.PM.DataModel.User!"; 27 throw "Clipperz.PM.DataModel.User.Header.RecordIndex depends on Clipperz.PM.DataModel.User!";
31} 28}
32 29
33if (typeof(Clipperz.PM.DataModel.User.Header) == 'undefined') { Clipperz.PM.DataModel.User.Header = {}; } 30if (typeof(Clipperz.PM.DataModel.User.Header) == 'undefined') { Clipperz.PM.DataModel.User.Header = {}; }
34 31
35Clipperz.PM.DataModel.User.Header.RecordIndex = function(args) { 32Clipperz.PM.DataModel.User.Header.RecordIndex = function(args) {
36 Clipperz.PM.DataModel.User.Header.RecordIndex.superclass.constructor.apply(this, arguments); 33 Clipperz.PM.DataModel.User.Header.RecordIndex.superclass.constructor.apply(this, arguments);
37 34
38//console.log("NEW Clipperz.PM.DataModel.User.Header.RecordIndex", args); 35//console.log("NEW Clipperz.PM.DataModel.User.Header.RecordIndex", args);
39 this._recordsData = new Clipperz.PM.DataModel.EncryptedRemoteObject({ 36 this._recordsData = new Clipperz.PM.DataModel.EncryptedRemoteObject({
40 'name':'recordsData', 37 'name':'recordsData',
41 'retrieveKeyFunction': args.retrieveKeyFunction, 38 'retrieveKeyFunction': args.retrieveKeyFunction,
42 'remoteData': { 39 'remoteData': {
43 'data': args.recordsData['data'], 40 'data': args.recordsData['data'],
44 'version': args.encryptedDataVersion, 41 'version': args.encryptedDataVersion,
45 'recordsStats': args.recordsStats 42 'recordsStats': args.recordsStats
46 }//, 43 }//,
47 // 'encryptedDataKeypath': 'data', 44 // 'encryptedDataKeypath': 'data',
48 // 'encryptedVersionKeypath': 'version' 45 // 'encryptedVersionKeypath': 'version'
49 }); 46 });
50 47
51 this._directLoginsData = new Clipperz.PM.DataModel.EncryptedRemoteObject({ 48 this._directLoginsData = new Clipperz.PM.DataModel.EncryptedRemoteObject({
52 'name':'directLoginsData', 49 'name':'directLoginsData',
53 'retrieveKeyFunction': args.retrieveKeyFunction, 50 'retrieveKeyFunction': args.retrieveKeyFunction,
54 'remoteData': { 51 'remoteData': {
55 'data': args.directLoginsData['data'], 52 'data': args.directLoginsData['data'],
56 'version': args.encryptedDataVersion 53 'version': args.encryptedDataVersion
57 }//, 54 }//,
58 // 'encryptedDataKeypath': 'data', 55 // 'encryptedDataKeypath': 'data',
59 // 'encryptedVersionKeypath': 'version' 56 // 'encryptedVersionKeypath': 'version'
60 }); 57 });
61 58
62 this._lock = new MochiKit.Async.DeferredLock(); 59 this._lock = new MochiKit.Async.DeferredLock();
63 this._transientState = null; 60 this._transientState = null;
64 61
65 this._retrieveRecordDetailFunction = args.retrieveRecordDetailFunction|| Clipperz.Base.exception.raise('MandatoryParameter'); 62 this._retrieveRecordDetailFunction = args.retrieveRecordDetailFunction|| Clipperz.Base.exception.raise('MandatoryParameter');
66 this._recordsIndex = args.recordsData['index'] || Clipperz.Base.exception.raise('MandatoryParameter'); 63 this._recordsIndex = args.recordsData['index'] || Clipperz.Base.exception.raise('MandatoryParameter');
67 this._directLoginsIndex = args.directLoginsData['index']|| Clipperz.Base.exception.raise('MandatoryParameter'); 64 this._directLoginsIndex = args.directLoginsData['index']|| Clipperz.Base.exception.raise('MandatoryParameter');
68 65
69 this._records = null; 66 this._records = null;
70 67
71 return this; 68 return this;
72} 69}
73 70
74 71
75Clipperz.Base.extend(Clipperz.PM.DataModel.User.Header.RecordIndex, Object, { 72Clipperz.Base.extend(Clipperz.PM.DataModel.User.Header.RecordIndex, Object, {
76 73
77 'toString': function() { 74 'toString': function() {
78 return "Clipperz.PM.DataModel.User.Header.RecordIndex"; 75 return "Clipperz.PM.DataModel.User.Header.RecordIndex";
79 }, 76 },
80 77
81 //------------------------------------------------------------------------- 78 //-------------------------------------------------------------------------
82 79
83 'retrieveRecordDetailFunction': function () { 80 'retrieveRecordDetailFunction': function () {
84 return this._retrieveRecordDetailFunction; 81 return this._retrieveRecordDetailFunction;
85 }, 82 },
86 83
87 //------------------------------------------------------------------------- 84 //-------------------------------------------------------------------------
88 85
89 'recordsIndex': function () { 86 'recordsIndex': function () {
90 return this._recordsIndex; 87 return this._recordsIndex;
91 }, 88 },
92 89
93 'recordsData': function () { 90 'recordsData': function () {
94 return this._recordsData; 91 return this._recordsData;
95 }, 92 },
96 93
97 //------------------------------------------------------------------------- 94 //-------------------------------------------------------------------------
98 95
99 'directLoginsIndex': function () { 96 'directLoginsIndex': function () {
100 return this._directLoginsIndex; 97 return this._directLoginsIndex;
101 }, 98 },
102 99
103 'directLoginsData': function () { 100 'directLoginsData': function () {
104 return this._directLoginsData; 101 return this._directLoginsData;
105 }, 102 },
106 103
107 //------------------------------------------------------------------------- 104 //-------------------------------------------------------------------------
108 105
109 'lock': function () { 106 'lock': function () {
110 return this._lock; 107 return this._lock;
111 }, 108 },
112 109
113 //------------------------------------------------------------------------- 110 //-------------------------------------------------------------------------
114 111
115 'transientState': function () { 112 'transientState': function () {
116 if (this._transientState == null) { 113 if (this._transientState == null) {
117 this._transientState = new Clipperz.KeyValueObjectStore(/*{'name':'User.Header.RecordIndex.transientState [1]'}*/); 114 this._transientState = new Clipperz.KeyValueObjectStore(/*{'name':'User.Header.RecordIndex.transientState [1]'}*/);
118 } 115 }
119 116
120 return this._transientState; 117 return this._transientState;
121 }, 118 },
122 119
123 'resetTransientState': function (isCommitting) { 120 'resetTransientState': function (isCommitting) {
124//console.log("######## UserHeaderRecordIndex - resetTransientState", Clipperz.Base.deepClone(this._transientState)); 121//console.log("######## UserHeaderRecordIndex - resetTransientState", Clipperz.Base.deepClone(this._transientState));
125 if (this._transientState != null) { 122 if (this._transientState != null) {
126 this._transientState.removeAllData(); 123 this._transientState.removeAllData();
127 } 124 }
128 125
129 this._transientState = null; 126 this._transientState = null;
130 }, 127 },
131 128
132 //------------------------------------------------------------------------- 129 //-------------------------------------------------------------------------
133 130
134 'getRecordKey': function (aRecordReference) { 131 'getRecordKey': function (aRecordReference) {
135 return Clipperz.Async.callbacks("User.Header.RecordIndex.getRecordKey", [ 132 return Clipperz.Async.callbacks("User.Header.RecordIndex.getRecordKey", [
136 MochiKit.Base.method(this, 'getRecordIndexData', aRecordReference), 133 MochiKit.Base.method(this, 'getRecordIndexData', aRecordReference),
137 MochiKit.Base.itemgetter('key') 134 MochiKit.Base.itemgetter('key')
138 ], {trace:false}); 135 ], {trace:false});
139 }, 136 },
140 137
141 'setRecordKey': function (aRecordReference, aValue) { 138 'setRecordKey': function (aRecordReference, aValue) {
142 return this.updateRecordIndexData(aRecordReference, 'key', aValue); 139 return this.updateRecordIndexData(aRecordReference, 'key', aValue);
143 }, 140 },
144 141
145 //------------------------------------------------------------------------- 142 //-------------------------------------------------------------------------
146 143
147 'getRecordIndexData': function (aRecordReference) { 144 'getRecordIndexData': function (aRecordReference) {
148 return this.recordsData().getValue(this.recordsIndex()[aRecordReference]); 145 return this.recordsData().getValue(this.recordsIndex()[aRecordReference]);
149 }, 146 },
150 147
151 //......................................................................... 148 //.........................................................................
152 149
153 'updateRecordIndexData': function (aRecordReference, aKey, aValue) { 150 'updateRecordIndexData': function (aRecordReference, aKey, aValue) {
154 return this.recordsData().setValue(this.recordsIndex()[aRecordReference]+'.'+aKey, aValue); 151 return this.recordsData().setValue(this.recordsIndex()[aRecordReference]+'.'+aKey, aValue);
155 }, 152 },
156 153
157 //------------------------------------------------------------------------- 154 //-------------------------------------------------------------------------
158 155
159 'getDirectLoginIndexData': function (aDirectLoginReference) { 156 'getDirectLoginIndexData': function (aDirectLoginReference) {
160 return this.directLoginsData().getValue(this.directLoginsIndex()[aDirectLoginReference]); 157 return this.directLoginsData().getValue(this.directLoginsIndex()[aDirectLoginReference]);
161 }, 158 },
162 159
163 'setDirectLoginIndexData': function (aDirectLoginReference, aKey, aValue) { 160 'setDirectLoginIndexData': function (aDirectLoginReference, aKey, aValue) {
164//console.log("UserHeaderRecordIndex.setDirectLoginIndexData", aDirectLoginReference, this.directLoginsIndex()[aDirectLoginReference], aKey); 161//console.log("UserHeaderRecordIndex.setDirectLoginIndexData", aDirectLoginReference, this.directLoginsIndex()[aDirectLoginReference], aKey);
165//if (MochiKit.Base.isUndefinedOrNull(this.directLoginsIndex()[aDirectLoginReference])) { 162//if (MochiKit.Base.isUndefinedOrNull(this.directLoginsIndex()[aDirectLoginReference])) {
166 //throw "PIPPO"; 163 //throw "PIPPO";
167//} 164//}
168 return this.directLoginsData().setValue(this.directLoginsIndex()[aDirectLoginReference] + '.' + aKey, aValue); 165 return this.directLoginsData().setValue(this.directLoginsIndex()[aDirectLoginReference] + '.' + aKey, aValue);
169 }, 166 },
170 167
171 'addDirectLoginIndexData': function (aDirectLoginReference) { 168 'addDirectLoginIndexData': function (aDirectLoginReference) {
172//console.log("UserHeaderRecordIndex.addDirectLoginIndexData", aDirectLoginReference, this.directLoginsIndex()[aDirectLoginReference]); 169//console.log("UserHeaderRecordIndex.addDirectLoginIndexData", aDirectLoginReference, this.directLoginsIndex()[aDirectLoginReference]);
173 return this.directLoginsData().setValue(this.directLoginsIndex()[aDirectLoginReference], {}); 170 return this.directLoginsData().setValue(this.directLoginsIndex()[aDirectLoginReference], {});
174 }, 171 },
175 172
176 'removeDirectLoginIndexData': function (aDirectLoginReference) { 173 'removeDirectLoginIndexData': function (aDirectLoginReference) {
177 return this.directLoginsData().removeValue(this.directLoginsIndex()[aDirectLoginReference]) 174 return this.directLoginsData().removeValue(this.directLoginsIndex()[aDirectLoginReference])
178 }, 175 },
179 176
180 //------------------------------------------------------------------------- 177 //-------------------------------------------------------------------------
181 178
182 'records': function () { 179 'records': function () {
183 vardeferredResult; 180 vardeferredResult;
184 181
185 deferredResult = new Clipperz.Async.Deferred("User.Header.RecordIndex.records", {trace:false}); 182 deferredResult = new Clipperz.Async.Deferred("User.Header.RecordIndex.records", {trace:false});
186 deferredResult.acquireLock(this.lock()); 183 deferredResult.acquireLock(this.lock());
187 deferredResult.addCallback(MochiKit.Base.bind(function () { 184 deferredResult.addCallback(MochiKit.Base.bind(function () {
188 var innerDeferredResult; 185 var innerDeferredResult;
189 186
190 if (this._records == null) { 187 if (this._records == null) {
191 innerDeferredResult = new Clipperz.Async.Deferred("User.Header.RecordIndex.records <inner deferred>", {trace:false}); 188 innerDeferredResult = new Clipperz.Async.Deferred("User.Header.RecordIndex.records <inner deferred>", {trace:false});
192 innerDeferredResult.collectResults({ 189 innerDeferredResult.collectResults({
193 'records': [ 190 'records': [
194 // MochiKit.Base.method(this.recordsData(), 'getObjectDataStore'), 191 // MochiKit.Base.method(this.recordsData(), 'getObjectDataStore'),
195 // MochiKit.Base.methodcaller('values') 192 // MochiKit.Base.methodcaller('values')
196 MochiKit.Base.method(this.recordsData(), 'values') 193 MochiKit.Base.method(this.recordsData(), 'values')
197 ], 194 ],
198 'recordsStats': [ 195 'recordsStats': [
199 MochiKit.Base.method(this.recordsData(), 'getRemoteData'), 196 MochiKit.Base.method(this.recordsData(), 'getRemoteData'),
200 MochiKit.Base.itemgetter('recordsStats') 197 MochiKit.Base.itemgetter('recordsStats')
201 ], 198 ],
202 'directLogins': [ 199 'directLogins': [
203 // MochiKit.Base.method(this.directLoginsData(), 'getObjectDataStore'), 200 // MochiKit.Base.method(this.directLoginsData(), 'getObjectDataStore'),
204 // MochiKit.Base.methodcaller('values') 201 // MochiKit.Base.methodcaller('values')
205 MochiKit.Base.method(this.directLoginsData(), 'values') 202 MochiKit.Base.method(this.directLoginsData(), 'values')
206 ] 203 ]
207 }) 204 })
208 innerDeferredResult.addCallback(MochiKit.Base.bind(function (someData) { 205 innerDeferredResult.addCallback(MochiKit.Base.bind(function (someData) {
209 var indexReference; 206 var indexReference;
210 var recordsInvertedIndex; 207 var recordsInvertedIndex;
211 var directLoginsInvertedIndex; 208 var directLoginsInvertedIndex;
212 209
213 recordsInvertedIndex = Clipperz.PM.DataModel.User.Header.RecordIndex.invertIndex(this.recordsIndex()); 210 recordsInvertedIndex = Clipperz.PM.DataModel.User.Header.RecordIndex.invertIndex(this.recordsIndex());
214 directLoginsInvertedIndex= Clipperz.PM.DataModel.User.Header.RecordIndex.invertIndex(this.directLoginsIndex()); 211 directLoginsInvertedIndex= Clipperz.PM.DataModel.User.Header.RecordIndex.invertIndex(this.directLoginsIndex());
215 212
216 this._records = {}; 213 this._records = {};
217 214
218 for (indexReference in someData['records']) { 215 for (indexReference in someData['records']) {
219 varrecord; 216 varrecord;
220 var reference; 217 var reference;
221 var updateDate; 218 var updateDate;
222 219
223 reference = recordsInvertedIndex[indexReference]; 220 reference = recordsInvertedIndex[indexReference];
224 221
225 if (typeof(someData['recordsStats'][reference]) != 'undefined') { 222 if (typeof(someData['recordsStats'][reference]) != 'undefined') {
226 updateDate = someData['recordsStats'][reference]['updateDate']; 223 updateDate = someData['recordsStats'][reference]['updateDate'];
227 224
228 record = new Clipperz.PM.DataModel.Record({ 225 record = new Clipperz.PM.DataModel.Record({
229 'reference': reference, 226 'reference': reference,
230 'retrieveKeyFunction': MochiKit.Base.method(this, 'getRecordKey'), 227 'retrieveKeyFunction': MochiKit.Base.method(this, 'getRecordKey'),
231 'retrieveRemoteDataFunction':this.retrieveRecordDetailFunction(), 228 'retrieveRemoteDataFunction':this.retrieveRecordDetailFunction(),
232 229
233 'retrieveIndexDataFunction':MochiKit.Base.method(this, 'getRecordIndexData'), 230 'retrieveIndexDataFunction':MochiKit.Base.method(this, 'getRecordIndexData'),
234 'updateIndexDataFunction': MochiKit.Base.method(this, 'updateRecordIndexData'), 231 'updateIndexDataFunction': MochiKit.Base.method(this, 'updateRecordIndexData'),
235 'updateDate': updateDate, 232 'updateDate': updateDate,
236 233
237 'retrieveDirectLoginIndexDataFunction':MochiKit.Base.method(this, 'getDirectLoginIndexData'), 234 'retrieveDirectLoginIndexDataFunction':MochiKit.Base.method(this, 'getDirectLoginIndexData'),
238 'setDirectLoginIndexDataFunction': MochiKit.Base.method(this, 'setDirectLoginIndexData'), 235 'setDirectLoginIndexDataFunction': MochiKit.Base.method(this, 'setDirectLoginIndexData'),
239 'removeDirectLoginIndexDataFunction':MochiKit.Base.method(this, 'removeDirectLoginIndexData'), 236 'removeDirectLoginIndexDataFunction':MochiKit.Base.method(this, 'removeDirectLoginIndexData'),
240 237
241 'createNewDirectLoginFunction': MochiKit.Base.method(this, 'createNewDirectLogin') 238 'createNewDirectLoginFunction': MochiKit.Base.method(this, 'createNewDirectLogin')
242 }); 239 });
243 240
244 this._records[reference] = record; 241 this._records[reference] = record;
245 } else { 242 } else {
246Clipperz.log("SKIPPING record " + reference + " as there are no stas associated - " + Clipperz.Base.serializeJSON(someData['records'][reference])); 243Clipperz.log("SKIPPING record " + reference + " as there are no stas associated - " + Clipperz.Base.serializeJSON(someData['records'][reference]));
247 //# skip the record, as it seems it is not present in the DB 244 //# skip the record, as it seems it is not present in the DB
248 //updateDate = Clipperz.PM.Date.formatDateWithUTCFormat(new Date()); 245 //updateDate = Clipperz.PM.Date.formatDateWithUTCFormat(new Date());
249 } 246 }
250 } 247 }
251 248
252 for (indexReference in someData['directLogins']) { 249 for (indexReference in someData['directLogins']) {
253 // vardirectLogin; 250 // vardirectLogin;
254 var reference; 251 var reference;
255 var record; 252 var record;
256 253
257 reference = directLoginsInvertedIndex[indexReference]; 254 reference = directLoginsInvertedIndex[indexReference];
258 record = this._records[recordsInvertedIndex[someData['directLogins'][indexReference]['record']]]; 255 record = this._records[recordsInvertedIndex[someData['directLogins'][indexReference]['record']]];
259 256
260 if (record != null) { 257 if (record != null) {
261 // directLogin = new Clipperz.PM.DataModel.DirectLogin({ 258 // directLogin = new Clipperz.PM.DataModel.DirectLogin({
262 new Clipperz.PM.DataModel.DirectLogin({ 259 new Clipperz.PM.DataModel.DirectLogin({
263 'reference': reference, 260 'reference': reference,
264 'record': record 261 'record': record
265 }); 262 });
266 } else { 263 } else {
267Clipperz.log("WARNING: DIRECT LOGIN without a matching RECORD!!"); 264Clipperz.log("WARNING: DIRECT LOGIN without a matching RECORD!!");
268//console.log("direct login data", someData['directLogins']); 265//console.log("direct login data", someData['directLogins']);
269//console.log("current direct login data", someData['directLogins'][indexReference]) 266//console.log("current direct login data", someData['directLogins'][indexReference])
270//console.log("reference", reference); 267//console.log("reference", reference);
271//console.log("record index", this.recordsIndex()); 268//console.log("record index", this.recordsIndex());
272//console.log("record inverted index", recordsInvertedIndex); 269//console.log("record inverted index", recordsInvertedIndex);
273 } 270 }
274 } 271 }
275 272
276 return this._records; 273 return this._records;
277 }, this)); 274 }, this));
278 innerDeferredResult.callback(); 275 innerDeferredResult.callback();
279 } else { 276 } else {
280 innerDeferredResult = MochiKit.Async.succeed(this._records); 277 innerDeferredResult = MochiKit.Async.succeed(this._records);
281 } 278 }
282 279
283 return innerDeferredResult; 280 return innerDeferredResult;
284 }, this)); 281 }, this));
285 deferredResult.releaseLock(this.lock()); 282 deferredResult.releaseLock(this.lock());
286 deferredResult.callback(); 283 deferredResult.callback();
287 284
288 return deferredResult; 285 return deferredResult;
289 }, 286 },
290 287
291 //------------------------------------------------------------------------- 288 //-------------------------------------------------------------------------
292 289
293 'updateRecordIndexForNewRecord': function (aNewRecord) { 290 'updateRecordIndexForNewRecord': function (aNewRecord) {
294 var newRecordIndex; 291 var newRecordIndex;
295 var recordReference; 292 var recordReference;
296 293
297 recordReference = aNewRecord.reference(); 294 recordReference = aNewRecord.reference();
298 newRecordIndex = (MochiKit.Base.listMax(MochiKit.Base.map(MochiKit.Base.partial(MochiKit.Base.operator.mul, 1), MochiKit.Base.values(this.recordsIndex()))) + 1) + ''; 295 newRecordIndex = (MochiKit.Base.listMax(MochiKit.Base.map(MochiKit.Base.partial(MochiKit.Base.operator.mul, 1), MochiKit.Base.values(this.recordsIndex()))) + 1) + '';
299 this.recordsIndex()[recordReference] = newRecordIndex; 296 this.recordsIndex()[recordReference] = newRecordIndex;
300 297
301 this.transientState().setValue('newlyCreatedRecordsIndex' + '.' + recordReference, newRecordIndex); 298 this.transientState().setValue('newlyCreatedRecordsIndex' + '.' + recordReference, newRecordIndex);
302 this.transientState().setValue('newlyCreatedRecordsReferences'+ '.' + recordReference, aNewRecord); 299 this.transientState().setValue('newlyCreatedRecordsReferences'+ '.' + recordReference, aNewRecord);
303 }, 300 },
304 301
305 //......................................................................... 302 //.........................................................................
306 303
307 'createNewRecord': function () { 304 'createNewRecord': function () {
308 var deferredResult; 305 var deferredResult;
309 var newRecord; 306 var newRecord;
310 307
311//console.log("#### new Clipperz.PM.DataModel.Record [4]"); 308//console.log("#### new Clipperz.PM.DataModel.Record [4]");
312 newRecord = new Clipperz.PM.DataModel.Record({ 309 newRecord = new Clipperz.PM.DataModel.Record({
313 'retrieveKeyFunction': MochiKit.Base.method(this, 'getRecordKey'), 310 'retrieveKeyFunction': MochiKit.Base.method(this, 'getRecordKey'),
314 'retrieveRemoteDataFunction':this.retrieveRecordDetailFunction(), 311 'retrieveRemoteDataFunction':this.retrieveRecordDetailFunction(),
315 312
316 'retrieveIndexDataFunction':MochiKit.Base.method(this, 'getRecordIndexData'), 313 'retrieveIndexDataFunction':MochiKit.Base.method(this, 'getRecordIndexData'),
317 'updateIndexDataFunction': MochiKit.Base.method(this, 'updateRecordIndexData'), 314 'updateIndexDataFunction': MochiKit.Base.method(this, 'updateRecordIndexData'),
318 'updateDate': Clipperz.PM.Date.formatDateWithUTCFormat(new Date()), 315 'updateDate': Clipperz.PM.Date.formatDateWithUTCFormat(new Date()),
319 316
320 'retrieveDirectLoginIndexDataFunction':MochiKit.Base.method(this, 'getDirectLoginIndexData'), 317 'retrieveDirectLoginIndexDataFunction':MochiKit.Base.method(this, 'getDirectLoginIndexData'),
321 'setDirectLoginIndexDataFunction': MochiKit.Base.method(this, 'setDirectLoginIndexData'), 318 'setDirectLoginIndexDataFunction': MochiKit.Base.method(this, 'setDirectLoginIndexData'),
322 'removeDirectLoginIndexDataFunction':MochiKit.Base.method(this, 'removeDirectLoginIndexData'), 319 'removeDirectLoginIndexDataFunction':MochiKit.Base.method(this, 'removeDirectLoginIndexData'),
323 320
324 'createNewDirectLoginFunction': MochiKit.Base.method(this, 'createNewDirectLogin') 321 'createNewDirectLoginFunction': MochiKit.Base.method(this, 'createNewDirectLogin')
325 }); 322 });
326 323
327 this.transientState().setValue('newRecordsReferences' + '.' + newRecord.reference(), newRecord); 324 this.transientState().setValue('newRecordsReferences' + '.' + newRecord.reference(), newRecord);
328 this.updateRecordIndexForNewRecord(newRecord); 325 this.updateRecordIndexForNewRecord(newRecord);
329 326
330 deferredResult = Clipperz.Async.callbacks("User.Header.RecordIndex.createNewRecord", [ 327 deferredResult = Clipperz.Async.callbacks("User.Header.RecordIndex.createNewRecord", [
331 MochiKit.Base.method(this, 'records'), 328 MochiKit.Base.method(this, 'records'),
332 MochiKit.Base.partial(Clipperz.Async.setItemOnObject, newRecord.reference(), newRecord), 329 MochiKit.Base.partial(Clipperz.Async.setItemOnObject, newRecord.reference(), newRecord),
333 MochiKit.Base.method(this, 'setRecordKey', newRecord.reference(), Clipperz.PM.Crypto.randomKey()), 330 MochiKit.Base.method(this, 'setRecordKey', newRecord.reference(), Clipperz.PM.Crypto.randomKey()),
334 MochiKit.Base.method(newRecord, 'setLabel', ''), 331 MochiKit.Base.method(newRecord, 'setLabel', ''),
335 MochiKit.Base.partial(MochiKit.Async.succeed, newRecord) 332 MochiKit.Base.partial(MochiKit.Async.succeed, newRecord)
336 ], {trace:false}); 333 ], {trace:false});
337 334
338 335
339 return deferredResult; 336 return deferredResult;
340 }, 337 },
341 338
342 //------------------------------------------------------------------------- 339 //-------------------------------------------------------------------------
343 340
344 'deleteRecord': function (aRecord) { 341 'deleteRecord': function (aRecord) {
345 var deferredResult; 342 var deferredResult;
346 var recordReference; 343 var recordReference;
347 344
348 recordReference = aRecord.reference(); 345 recordReference = aRecord.reference();
349 346
350 deferredResult = new Clipperz.Async.Deferred("User.Header.RecordIndex.deleteRecord", {trace:false}); 347 deferredResult = new Clipperz.Async.Deferred("User.Header.RecordIndex.deleteRecord", {trace:false});
351 348
352 deferredResult.addMethod(aRecord, 'directLogins'); 349 deferredResult.addMethod(aRecord, 'directLogins');
353 deferredResult.addCallback(MochiKit.Base.values); 350 deferredResult.addCallback(MochiKit.Base.values);
354 deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.method(this, 'removeDirectLogin')); 351 deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.method(this, 'removeDirectLogin'));
355 352
356 deferredResult.addMethod(this.recordsData(), 'removeValue', this.recordsIndex()[recordReference]); 353 deferredResult.addMethod(this.recordsData(), 'removeValue', this.recordsIndex()[recordReference]);
357 deferredResult.addCallback(MochiKit.Base.bind(function () { 354 deferredResult.addCallback(MochiKit.Base.bind(function () {
358 this.transientState().setValue('deleteRecordsIndex' + '.' + recordReference, this.recordsIndex()[recordReference]); 355 this.transientState().setValue('deleteRecordsIndex' + '.' + recordReference, this.recordsIndex()[recordReference]);
359 delete this.recordsIndex()[recordReference]; 356 delete this.recordsIndex()[recordReference];
360 }, this)); 357 }, this));
361 358
362 deferredResult.addMethod(this, 'records'); 359 deferredResult.addMethod(this, 'records');
363 deferredResult.addCallback(MochiKit.Base.itemgetter(recordReference)); 360 deferredResult.addCallback(MochiKit.Base.itemgetter(recordReference));
364 deferredResult.addMethod(this.transientState(), 'setValue', 'deleteRecordsReferences' + '.' + recordReference); 361 deferredResult.addMethod(this.transientState(), 'setValue', 'deleteRecordsReferences' + '.' + recordReference);
365 362
366 deferredResult.addMethod(this, 'records'); 363 deferredResult.addMethod(this, 'records');
367 deferredResult.addCallback(MochiKit.Base.bind(function (someRecords) { 364 deferredResult.addCallback(MochiKit.Base.bind(function (someRecords) {
368 delete someRecords[recordReference]; 365 delete someRecords[recordReference];
369 }, this)); 366 }, this));
370 deferredResult.callback(); 367 deferredResult.callback();
371 368
372 return deferredResult; 369 return deferredResult;
373 }, 370 },
374 371
375 //========================================================================= 372 //=========================================================================
376 373
377 'removeDirectLogin': function (aDirectLogin) { 374 'removeDirectLogin': function (aDirectLogin) {
378 this.directLoginsData().removeValue(this.directLoginsIndex()[aDirectLogin.reference()]); 375 this.directLoginsData().removeValue(this.directLoginsIndex()[aDirectLogin.reference()]);
379 }, 376 },
380 377
381 //------------------------------------------------------------------------- 378 //-------------------------------------------------------------------------
382 379
383 'createNewDirectLogin': function (aRecord) { 380 'createNewDirectLogin': function (aRecord) {
384 var newDirectLogin; 381 var newDirectLogin;
385 varnewDirectLoginIndexValue; 382 varnewDirectLoginIndexValue;
386 383
387 newDirectLogin = new Clipperz.PM.DataModel.DirectLogin({record:aRecord}); 384 newDirectLogin = new Clipperz.PM.DataModel.DirectLogin({record:aRecord});
388 newDirectLoginIndexValue = MochiKit.Base.listMax(MochiKit.Base.map(function (aValue) { return aValue * 1; }, MochiKit.Base.values(this.directLoginsIndex()))) + 1; 385 newDirectLoginIndexValue = MochiKit.Base.listMax(MochiKit.Base.map(function (aValue) { return aValue * 1; }, MochiKit.Base.values(this.directLoginsIndex()))) + 1;
389 386
390 this.transientState().setValue('newDirectLoginReferences' + '.' + newDirectLogin.reference(), newDirectLogin); 387 this.transientState().setValue('newDirectLoginReferences' + '.' + newDirectLogin.reference(), newDirectLogin);
391 388
392//console.log("UserHeaderRecordIndex.createNewDirectLogin [1]", newDirectLogin.reference(), newDirectLoginIndexValue); 389//console.log("UserHeaderRecordIndex.createNewDirectLogin [1]", newDirectLogin.reference(), newDirectLoginIndexValue);
393 this.directLoginsIndex()[newDirectLogin.reference()] = newDirectLoginIndexValue; 390 this.directLoginsIndex()[newDirectLogin.reference()] = newDirectLoginIndexValue;
394//console.log("UserHeaderRecordIndex.createNewDirectLogin [2]", newDirectLogin.reference(), this.directLoginsIndex()[newDirectLogin.reference()]); 391//console.log("UserHeaderRecordIndex.createNewDirectLogin [2]", newDirectLogin.reference(), this.directLoginsIndex()[newDirectLogin.reference()]);
395 this.directLoginsData().setValue(this.directLoginsIndex()[newDirectLogin.reference()], {'record': this.recordsIndex()[aRecord.reference()]}); 392 this.directLoginsData().setValue(this.directLoginsIndex()[newDirectLogin.reference()], {'record': this.recordsIndex()[aRecord.reference()]});
396 393
397 return newDirectLogin; 394 return newDirectLogin;
398 }, 395 },
399 396
400 //========================================================================= 397 //=========================================================================
401 398
402 'deleteAllCleanTextData': function () { 399 'deleteAllCleanTextData': function () {
403 return Clipperz.Async.callbacks("User.Header.RecordIndex.deleteAllCleanTextData", [ 400 return Clipperz.Async.callbacks("User.Header.RecordIndex.deleteAllCleanTextData", [
404 // MochiKit.Base.method(this, 'records'), 401 // MochiKit.Base.method(this, 'records'),
405 // MochiKit.Base.values, 402 // MochiKit.Base.values,
406 // MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('deleteAllCleanTextData')), 403 // MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('deleteAllCleanTextData')),
407 404
408 MochiKit.Base.method(this, 'recordsData'), 405 MochiKit.Base.method(this, 'recordsData'),
diff --git a/frontend/gamma/js/Clipperz/PM/DataModel/User.js b/frontend/gamma/js/Clipperz/PM/DataModel/User.js
index e8afa97..72d4006 100644
--- a/frontend/gamma/js/Clipperz/PM/DataModel/User.js
+++ b/frontend/gamma/js/Clipperz/PM/DataModel/User.js
@@ -1,408 +1,405 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
30if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } 27if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
31if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; } 28if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; }
32 29
33 30
34//############################################################################# 31//#############################################################################
35 32
36Clipperz.PM.DataModel.User = function (args) { 33Clipperz.PM.DataModel.User = function (args) {
37 args = args || {}; 34 args = args || {};
38 35
39 Clipperz.PM.DataModel.User.superclass.constructor.apply(this, arguments); 36 Clipperz.PM.DataModel.User.superclass.constructor.apply(this, arguments);
40 37
41 this._username = args.username || null; 38 this._username = args.username || null;
42 this._getPassphraseFunction = args.getPassphraseFunction || null; 39 this._getPassphraseFunction = args.getPassphraseFunction || null;
43 40
44 this._data = null; 41 this._data = null;
45 42
46 this._connection = null; 43 this._connection = null;
47 this._connectionVersion = 'current'; 44 this._connectionVersion = 'current';
48 45
49 this._serverData = null; 46 this._serverData = null;
50 this._serverLockValue = null; 47 this._serverLockValue = null;
51 this._transientState = null; 48 this._transientState = null;
52 49
53 this._deferredLocks = { 50 this._deferredLocks = {
54 'passphrase': new MochiKit.Async.DeferredLock(), 51 'passphrase': new MochiKit.Async.DeferredLock(),
55 'serverData': new MochiKit.Async.DeferredLock(), 52 'serverData': new MochiKit.Async.DeferredLock(),
56 // 'recordsIndex': new MochiKit.Async.DeferredLock(), 53 // 'recordsIndex': new MochiKit.Async.DeferredLock(),
57 // 'directLoginsIndex':new MochiKit.Async.DeferredLock() 54 // 'directLoginsIndex':new MochiKit.Async.DeferredLock()
58 // 'preferences': new MochiKit.Async.DeferredLock() 55 // 'preferences': new MochiKit.Async.DeferredLock()
59 // 'oneTimePasswords': new MochiKit.Async.DeferredLock() 56 // 'oneTimePasswords': new MochiKit.Async.DeferredLock()
60 '__syntaxFix__': 'syntax fix' 57 '__syntaxFix__': 'syntax fix'
61 }; 58 };
62 59
63 return this; 60 return this;
64} 61}
65 62
66Clipperz.Base.extend(Clipperz.PM.DataModel.User, Object, { 63Clipperz.Base.extend(Clipperz.PM.DataModel.User, Object, {
67 64
68 'toString': function () { 65 'toString': function () {
69 return "Clipperz.PM.DataModel.User - " + this.username(); 66 return "Clipperz.PM.DataModel.User - " + this.username();
70 }, 67 },
71 68
72 //------------------------------------------------------------------------- 69 //-------------------------------------------------------------------------
73 70
74 'username': function () { 71 'username': function () {
75 return this._username; 72 return this._username;
76 }, 73 },
77 74
78 'setUsername': function (aValue) { 75 'setUsername': function (aValue) {
79 this._username = aValue; 76 this._username = aValue;
80 }, 77 },
81 78
82 //------------------------------------------------------------------------- 79 //-------------------------------------------------------------------------
83 80
84 'displayName': function() { 81 'displayName': function() {
85 return "" + this.username() + ""; 82 return "" + this.username() + "";
86 }, 83 },
87 84
88 //------------------------------------------------------------------------- 85 //-------------------------------------------------------------------------
89 86
90 'data': function () { 87 'data': function () {
91 if (this._data == null) { 88 if (this._data == null) {
92 this._data = new Clipperz.KeyValueObjectStore(/*{'name':'User.data [1]'}*/); 89 this._data = new Clipperz.KeyValueObjectStore(/*{'name':'User.data [1]'}*/);
93 }; 90 };
94 91
95 return this._data; 92 return this._data;
96 }, 93 },
97 94
98 //------------------------------------------------------------------------- 95 //-------------------------------------------------------------------------
99 96
100 'serverLockValue': function () { 97 'serverLockValue': function () {
101 return this._serverLockValue; 98 return this._serverLockValue;
102 }, 99 },
103 100
104 'setServerLockValue': function (aValue) { 101 'setServerLockValue': function (aValue) {
105 this._serverLockValue = aValue; 102 this._serverLockValue = aValue;
106 }, 103 },
107 104
108 //------------------------------------------------------------------------- 105 //-------------------------------------------------------------------------
109 106
110 'transientState': function () { 107 'transientState': function () {
111 if (this._transientState == null) { 108 if (this._transientState == null) {
112 this._transientState = {} 109 this._transientState = {}
113 } 110 }
114 111
115 return this._transientState; 112 return this._transientState;
116 }, 113 },
117 114
118 'resetTransientState': function (isCommitting) { 115 'resetTransientState': function (isCommitting) {
119 this._transientState = null; 116 this._transientState = null;
120 }, 117 },
121 118
122 //------------------------------------------------------------------------- 119 //-------------------------------------------------------------------------
123 120
124 'deferredLockForSection': function(aSectionName) { 121 'deferredLockForSection': function(aSectionName) {
125 return this._deferredLocks[aSectionName]; 122 return this._deferredLocks[aSectionName];
126 }, 123 },
127 124
128 //------------------------------------------------------------------------- 125 //-------------------------------------------------------------------------
129 126
130 'getPassphrase': function() { 127 'getPassphrase': function() {
131 var deferredResult; 128 var deferredResult;
132 129
133 deferredResult = new Clipperz.Async.Deferred("User.getPassphrase", {trace:false}); 130 deferredResult = new Clipperz.Async.Deferred("User.getPassphrase", {trace:false});
134 deferredResult.acquireLock(this.deferredLockForSection('passphrase')); 131 deferredResult.acquireLock(this.deferredLockForSection('passphrase'));
135 deferredResult.addMethod(this.data(), 'deferredGetOrSet', 'passphrase', this.getPassphraseFunction()); 132 deferredResult.addMethod(this.data(), 'deferredGetOrSet', 'passphrase', this.getPassphraseFunction());
136 deferredResult.releaseLock(this.deferredLockForSection('passphrase')); 133 deferredResult.releaseLock(this.deferredLockForSection('passphrase'));
137 deferredResult.callback(); 134 deferredResult.callback();
138 135
139 return deferredResult; 136 return deferredResult;
140 }, 137 },
141 138
142 'getPassphraseFunction': function () { 139 'getPassphraseFunction': function () {
143 return this._getPassphraseFunction; 140 return this._getPassphraseFunction;
144 }, 141 },
145 142
146 //------------------------------------------------------------------------- 143 //-------------------------------------------------------------------------
147 144
148 'getCredentials': function () { 145 'getCredentials': function () {
149 return Clipperz.Async.collectResults("User; get username and passphrase", { 146 return Clipperz.Async.collectResults("User; get username and passphrase", {
150 'username': MochiKit.Base.method(this, 'username'), 147 'username': MochiKit.Base.method(this, 'username'),
151 'password': MochiKit.Base.method(this, 'getPassphrase') 148 'password': MochiKit.Base.method(this, 'getPassphrase')
152 }, {trace:false})(); 149 }, {trace:false})();
153 }, 150 },
154 151
155 //------------------------------------------------------------------------- 152 //-------------------------------------------------------------------------
156 153
157 'changePassphrase': function (aNewValue) { 154 'changePassphrase': function (aNewValue) {
158 return this.updateCredentials(this.username(), aNewValue); 155 return this.updateCredentials(this.username(), aNewValue);
159 }, 156 },
160 157
161 //......................................................................... 158 //.........................................................................
162 159
163 'updateCredentials': function (aUsername, aPassphrase) { 160 'updateCredentials': function (aUsername, aPassphrase) {
164 vardeferredResult; 161 vardeferredResult;
165 162
166 deferredResult = new Clipperz.Async.Deferred("User.updateCredentials", {trace:false}); 163 deferredResult = new Clipperz.Async.Deferred("User.updateCredentials", {trace:false});
167 // deferredResult.addMethod(this, 'getPassphrase'); 164 // deferredResult.addMethod(this, 'getPassphrase');
168 // deferredResult.setValue('currentPassphrase'); 165 // deferredResult.setValue('currentPassphrase');
169 deferredResult.addMethod(this.connection(), 'ping'); 166 deferredResult.addMethod(this.connection(), 'ping');
170 deferredResult.addMethod(this, 'setUsername', aUsername) 167 deferredResult.addMethod(this, 'setUsername', aUsername)
171 deferredResult.acquireLock(this.deferredLockForSection('passphrase')); 168 deferredResult.acquireLock(this.deferredLockForSection('passphrase'));
172 deferredResult.addMethod(this.data(), 'deferredGetOrSet', 'passphrase', aPassphrase); 169 deferredResult.addMethod(this.data(), 'deferredGetOrSet', 'passphrase', aPassphrase);
173 deferredResult.releaseLock(this.deferredLockForSection('passphrase')); 170 deferredResult.releaseLock(this.deferredLockForSection('passphrase'));
174 // deferredResult.getValue('currentPassphrase'); 171 // deferredResult.getValue('currentPassphrase');
175 deferredResult.addMethod(this, 'prepareRemoteDataWithKey', aPassphrase); 172 deferredResult.addMethod(this, 'prepareRemoteDataWithKey', aPassphrase);
176 deferredResult.addMethod(this.connection(), 'updateCredentials', aUsername, aPassphrase); 173 deferredResult.addMethod(this.connection(), 'updateCredentials', aUsername, aPassphrase);
177 deferredResult.callback(); 174 deferredResult.callback();
178 175
179 return deferredResult; 176 return deferredResult;
180 }, 177 },
181 178
182 //------------------------------------------------------------------------- 179 //-------------------------------------------------------------------------
183 180
184 'initialSetupWithNoData': function () { 181 'initialSetupWithNoData': function () {
185 this._serverData = { 182 this._serverData = {
186 'version': '0.1', 183 'version': '0.1',
187 'statistics': "", 184 'statistics': "",
188 'header': { 185 'header': {
189 'data': null, 186 'data': null,
190 'version': Clipperz.PM.Crypto.encryptingFunctions.currentVersion, 187 'version': Clipperz.PM.Crypto.encryptingFunctions.currentVersion,
191 188
192 'recordsIndex': new Clipperz.PM.DataModel.User.Header.RecordIndex({ 189 'recordsIndex': new Clipperz.PM.DataModel.User.Header.RecordIndex({
193 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase'), 190 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase'),
194 'recordsData': {'data':null, 'index':{}}, 191 'recordsData': {'data':null, 'index':{}},
195 'recordsStats': null, 192 'recordsStats': null,
196 'directLoginsData': {'data':null, 'index':{}}, 193 'directLoginsData': {'data':null, 'index':{}},
197 'encryptedDataVersion': Clipperz.PM.Crypto.encryptingFunctions.currentVersion, 194 'encryptedDataVersion': Clipperz.PM.Crypto.encryptingFunctions.currentVersion,
198 'retrieveRecordDetailFunction':MochiKit.Base.method(this, 'getRecordDetail') 195 'retrieveRecordDetailFunction':MochiKit.Base.method(this, 'getRecordDetail')
199 }), 196 }),
200 'preferences': new Clipperz.PM.DataModel.User.Header.Preferences({ 197 'preferences': new Clipperz.PM.DataModel.User.Header.Preferences({
201 'name':'preferences', 198 'name':'preferences',
202 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase') 199 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase')
203 }), 200 }),
204 'oneTimePasswords': new Clipperz.PM.DataModel.User.Header.OneTimePasswords({ 201 'oneTimePasswords': new Clipperz.PM.DataModel.User.Header.OneTimePasswords({
205 'name':'preferences', 202 'name':'preferences',
206 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase') 203 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase')
207 }) 204 })
208 } 205 }
209 }; 206 };
210 207
211 // this._serverLockValue = Clipperz.PM.Crypto.randomKey(); 208 // this._serverLockValue = Clipperz.PM.Crypto.randomKey();
212 }, 209 },
213 210
214 //......................................................................... 211 //.........................................................................
215 212
216 'registerAsNewAccount': function () { 213 'registerAsNewAccount': function () {
217 var deferredResult; 214 var deferredResult;
218 215
219 deferredResult = new Clipperz.Async.Deferred("User.registerAsNewAccount", {trace:false}); 216 deferredResult = new Clipperz.Async.Deferred("User.registerAsNewAccount", {trace:false});
220 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'updateProgress', {'extraSteps':3}); 217 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'updateProgress', {'extraSteps':3});
221 deferredResult.addMethod(this, 'initialSetupWithNoData') 218 deferredResult.addMethod(this, 'initialSetupWithNoData')
222 deferredResult.addMethod(this, 'getPassphrase'); 219 deferredResult.addMethod(this, 'getPassphrase');
223 deferredResult.addMethod(this, 'prepareRemoteDataWithKey'); 220 deferredResult.addMethod(this, 'prepareRemoteDataWithKey');
224 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress'); 221 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
225 deferredResult.addMethod(this.connection(), 'register'); 222 deferredResult.addMethod(this.connection(), 'register');
226 deferredResult.addCallback(MochiKit.Base.itemgetter('lock')); 223 deferredResult.addCallback(MochiKit.Base.itemgetter('lock'));
227 deferredResult.addMethod(this, 'setServerLockValue'); 224 deferredResult.addMethod(this, 'setServerLockValue');
228 deferredResult.addCallbackPass(MochiKit.Signal.signal,Clipperz.Signal.NotificationCenter, 'userSuccessfullyRegistered'); 225 deferredResult.addCallbackPass(MochiKit.Signal.signal,Clipperz.Signal.NotificationCenter, 'userSuccessfullyRegistered');
229 226
230 // deferredResult.addErrback (MochiKit.Base.method(this, 'handleRegistrationFailure')); 227 // deferredResult.addErrback (MochiKit.Base.method(this, 'handleRegistrationFailure'));
231 228
232 deferredResult.callback(); 229 deferredResult.callback();
233 230
234 return deferredResult; 231 return deferredResult;
235 }, 232 },
236 233
237 //------------------------------------------------------------------------- 234 //-------------------------------------------------------------------------
238 235
239 'login': function () { 236 'login': function () {
240 var deferredResult; 237 var deferredResult;
241 238
242 deferredResult = new Clipperz.Async.Deferred("User.login", {trace:false}); 239 deferredResult = new Clipperz.Async.Deferred("User.login", {trace:false});
243 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'updateProgress', {'extraSteps':3}); 240 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'updateProgress', {'extraSteps':3});
244 deferredResult.addMethod(this, 'getPassphrase'); 241 deferredResult.addMethod(this, 'getPassphrase');
245 deferredResult.addCallback(Clipperz.PM.DataModel.OneTimePassword.isValidOneTimePasswordValue); 242 deferredResult.addCallback(Clipperz.PM.DataModel.OneTimePassword.isValidOneTimePasswordValue);
246 deferredResult.addCallback(Clipperz.Async.deferredIf("Is the passphrase an OTP", [ 243 deferredResult.addCallback(Clipperz.Async.deferredIf("Is the passphrase an OTP", [
247 MochiKit.Base.partial(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'updateProgress', {'extraSteps':1}), 244 MochiKit.Base.partial(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'updateProgress', {'extraSteps':1}),
248 MochiKit.Base.method(this, 'getCredentials'), 245 MochiKit.Base.method(this, 'getCredentials'),
249 MochiKit.Base.method(this.connection(), 'redeemOneTimePassword'), 246 MochiKit.Base.method(this.connection(), 'redeemOneTimePassword'),
250 MochiKit.Base.method(this.data(), 'setValue', 'passphrase') 247 MochiKit.Base.method(this.data(), 'setValue', 'passphrase')
251 ], [])); 248 ], []));
252 deferredResult.addErrback(MochiKit.Base.method(this, 'getPassphrase')); 249 deferredResult.addErrback(MochiKit.Base.method(this, 'getPassphrase'));
253 deferredResult.addMethod(this.connection(), 'login'); 250 deferredResult.addMethod(this.connection(), 'login');
254 deferredResult.addCallbackPass(MochiKit.Signal.signal,Clipperz.Signal.NotificationCenter, 'userSuccessfullyLoggedIn'); 251 deferredResult.addCallbackPass(MochiKit.Signal.signal,Clipperz.Signal.NotificationCenter, 'userSuccessfullyLoggedIn');
255 deferredResult.addErrback (MochiKit.Base.method(this, 'handleConnectionFallback')); 252 deferredResult.addErrback (MochiKit.Base.method(this, 'handleConnectionFallback'));
256 253
257 deferredResult.callback(); 254 deferredResult.callback();
258 255
259 return deferredResult; 256 return deferredResult;
260 }, 257 },
261 258
262 //......................................................................... 259 //.........................................................................
263 260
264 'handleConnectionFallback': function(aValue) { 261 'handleConnectionFallback': function(aValue) {
265 var result; 262 var result;
266 263
267 if (aValue instanceof MochiKit.Async.CancelledError) { 264 if (aValue instanceof MochiKit.Async.CancelledError) {
268 result = aValue; 265 result = aValue;
269 } else { 266 } else {
270 this.setConnectionVersion(Clipperz.PM.Connection.communicationProtocol.fallbackVersions[this.connectionVersion()]); 267 this.setConnectionVersion(Clipperz.PM.Connection.communicationProtocol.fallbackVersions[this.connectionVersion()]);
271 268
272 if (this.connectionVersion() != null) { 269 if (this.connectionVersion() != null) {
273 result = new Clipperz.Async.Deferred("User.handleConnectionFallback - retry"); 270 result = new Clipperz.Async.Deferred("User.handleConnectionFallback - retry");
274 271
275 result.addMethod(this, 'login'); 272 result.addMethod(this, 'login');
276 result.callback(); 273 result.callback();
277 } else { 274 } else {
278 result = Clipperz.Async.callbacks("User.handleConnectionFallback - failed", [ 275 result = Clipperz.Async.callbacks("User.handleConnectionFallback - failed", [
279 MochiKit.Base.method(this.data(), 'removeValue', 'passphrase'), 276 MochiKit.Base.method(this.data(), 'removeValue', 'passphrase'),
280 MochiKit.Base.method(this, 'setConnectionVersion', 'current'), 277 MochiKit.Base.method(this, 'setConnectionVersion', 'current'),
281 MochiKit.Base.partial(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'userLoginFailed'), 278 MochiKit.Base.partial(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'userLoginFailed'),
282 MochiKit.Base.partial(MochiKit.Async.fail, Clipperz.PM.DataModel.User.exception.LoginFailed) 279 MochiKit.Base.partial(MochiKit.Async.fail, Clipperz.PM.DataModel.User.exception.LoginFailed)
283 ], {trace:false}); 280 ], {trace:false});
284 } 281 }
285 } 282 }
286 283
287 return result; 284 return result;
288 }, 285 },
289 286
290 //------------------------------------------------------------------------- 287 //-------------------------------------------------------------------------
291 288
292 'lock': function () { 289 'lock': function () {
293 return Clipperz.Async.callbacks("User.lock", [ 290 return Clipperz.Async.callbacks("User.lock", [
294 MochiKit.Base.method(this, 'deleteAllCleanTextData') 291 MochiKit.Base.method(this, 'deleteAllCleanTextData')
295 ], {trace:false}); 292 ], {trace:false});
296 }, 293 },
297 294
298 //------------------------------------------------------------------------- 295 //-------------------------------------------------------------------------
299 296
300 'logout': function () { 297 'logout': function () {
301 return Clipperz.Async.callbacks("User.logout", [ 298 return Clipperz.Async.callbacks("User.logout", [
302 MochiKit.Base.method(this, 'deleteAllCleanTextData'), 299 MochiKit.Base.method(this, 'deleteAllCleanTextData'),
303 MochiKit.Base.method(this.connection(), 'logout') 300 MochiKit.Base.method(this.connection(), 'logout')
304 ], {trace:false}); 301 ], {trace:false});
305 }, 302 },
306 303
307 //------------------------------------------------------------------------- 304 //-------------------------------------------------------------------------
308 305
309 'headerFormatVersion': function(anHeader) { 306 'headerFormatVersion': function(anHeader) {
310 var result; 307 var result;
311 308
312 if (anHeader.charAt(0) == '{') { 309 if (anHeader.charAt(0) == '{') {
313 varheaderData; 310 varheaderData;
314 311
315 headerData = Clipperz.Base.evalJSON(anHeader); 312 headerData = Clipperz.Base.evalJSON(anHeader);
316 result = headerData['version']; 313 result = headerData['version'];
317 } else { 314 } else {
318 result = 'LEGACY'; 315 result = 'LEGACY';
319 } 316 }
320 317
321 return result; 318 return result;
322 }, 319 },
323 320
324 //------------------------------------------------------------------------- 321 //-------------------------------------------------------------------------
325 322
326 'unpackServerData': function (someServerData) { 323 'unpackServerData': function (someServerData) {
327 var unpackedData; 324 var unpackedData;
328 var headerVersion; 325 var headerVersion;
329 326
330 varrecordsIndex; 327 varrecordsIndex;
331 var preferences; 328 var preferences;
332 var oneTimePasswords; 329 var oneTimePasswords;
333 330
334//console.log(">>> ***************** user.unpackServerData", someServerData); 331//console.log(">>> ***************** user.unpackServerData", someServerData);
335 this.setServerLockValue(someServerData['lock']); 332 this.setServerLockValue(someServerData['lock']);
336 333
337 headerVersion = this.headerFormatVersion(someServerData['header']); 334 headerVersion = this.headerFormatVersion(someServerData['header']);
338 335
339 switch (headerVersion) { 336 switch (headerVersion) {
340 case 'LEGACY': 337 case 'LEGACY':
341 varlegacyHeader; 338 varlegacyHeader;
342 339
343 legacyHeader = new Clipperz.PM.DataModel.User.Header.Legacy({ 340 legacyHeader = new Clipperz.PM.DataModel.User.Header.Legacy({
344 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase'), 341 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase'),
345 'remoteData': { 342 'remoteData': {
346 'data': someServerData['header'], 343 'data': someServerData['header'],
347 'version': someServerData['version'], 344 'version': someServerData['version'],
348 'recordsStats': someServerData['recordsStats'] 345 'recordsStats': someServerData['recordsStats']
349 }, 346 },
350 // 'encryptedDataKeypath': 'data', 347 // 'encryptedDataKeypath': 'data',
351 // 'encryptedVersionKeypath': 'version', 348 // 'encryptedVersionKeypath': 'version',
352 'retrieveRecordDetailFunction':MochiKit.Base.method(this, 'getRecordDetail') 349 'retrieveRecordDetailFunction':MochiKit.Base.method(this, 'getRecordDetail')
353 }); 350 });
354 351
355 recordsIndex = legacyHeader; 352 recordsIndex = legacyHeader;
356 preferences = legacyHeader; 353 preferences = legacyHeader;
357 oneTimePasswords= legacyHeader; 354 oneTimePasswords= legacyHeader;
358 break; 355 break;
359 case '0.1': 356 case '0.1':
360 varheaderData; 357 varheaderData;
361 358
362 headerData = Clipperz.Base.evalJSON(someServerData['header']); 359 headerData = Clipperz.Base.evalJSON(someServerData['header']);
363 360
364 recordsIndex = new Clipperz.PM.DataModel.User.Header.RecordIndex({ 361 recordsIndex = new Clipperz.PM.DataModel.User.Header.RecordIndex({
365 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase'), 362 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase'),
366 'recordsData': headerData['records'], 363 'recordsData': headerData['records'],
367 'recordsStats': someServerData['recordsStats'], 364 'recordsStats': someServerData['recordsStats'],
368 'directLoginsData': headerData['directLogins'], 365 'directLoginsData': headerData['directLogins'],
369 'encryptedDataVersion': someServerData['version'], 366 'encryptedDataVersion': someServerData['version'],
370 'retrieveRecordDetailFunction':MochiKit.Base.method(this, 'getRecordDetail') 367 'retrieveRecordDetailFunction':MochiKit.Base.method(this, 'getRecordDetail')
371 }); 368 });
372 369
373 //Still missing a test case that actually fais with the old version of the code, where the check for undefined was missing 370 //Still missing a test case that actually fais with the old version of the code, where the check for undefined was missing
374 if (typeof(headerData['preferences']) != 'undefined') { 371 if (typeof(headerData['preferences']) != 'undefined') {
375 preferences= new Clipperz.PM.DataModel.User.Header.Preferences({ 372 preferences= new Clipperz.PM.DataModel.User.Header.Preferences({
376 'name':'preferences', 373 'name':'preferences',
377 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase'), 374 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase'),
378 'remoteData': { 375 'remoteData': {
379 'data': headerData['preferences']['data'], 376 'data': headerData['preferences']['data'],
380 'version': someServerData['version'] 377 'version': someServerData['version']
381 } 378 }
382 }); 379 });
383 } else { 380 } else {
384 preferences= new Clipperz.PM.DataModel.User.Header.Preferences({ 381 preferences= new Clipperz.PM.DataModel.User.Header.Preferences({
385 'name':'preferences', 382 'name':'preferences',
386 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase') 383 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase')
387 }); 384 });
388 } 385 }
389 386
390 if (typeof(headerData['oneTimePasswords']) != 'undefined') { 387 if (typeof(headerData['oneTimePasswords']) != 'undefined') {
391 oneTimePasswords = new Clipperz.PM.DataModel.User.Header.OneTimePasswords({ 388 oneTimePasswords = new Clipperz.PM.DataModel.User.Header.OneTimePasswords({
392 'name':'preferences', 389 'name':'preferences',
393 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase'), 390 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase'),
394 'remoteData': { 391 'remoteData': {
395 'data': headerData['oneTimePasswords']['data'], 392 'data': headerData['oneTimePasswords']['data'],
396 'version': someServerData['version'] 393 'version': someServerData['version']
397 } 394 }
398 }); 395 });
399 } else { 396 } else {
400 oneTimePasswords = new Clipperz.PM.DataModel.User.Header.OneTimePasswords({ 397 oneTimePasswords = new Clipperz.PM.DataModel.User.Header.OneTimePasswords({
401 'name':'preferences', 398 'name':'preferences',
402 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase') 399 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase')
403 }); 400 });
404 } 401 }
405 402
406 break; 403 break;
407 } 404 }
408 405
diff --git a/frontend/gamma/js/Clipperz/PM/Date.js b/frontend/gamma/js/Clipperz/PM/Date.js
index a131357..96a2700 100644
--- a/frontend/gamma/js/Clipperz/PM/Date.js
+++ b/frontend/gamma/js/Clipperz/PM/Date.js
@@ -1,201 +1,198 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
30if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } 27if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
31if (typeof(Clipperz.PM.Date) == 'undefined') { Clipperz.PM.Date = {}; } 28if (typeof(Clipperz.PM.Date) == 'undefined') { Clipperz.PM.Date = {}; }
32 29
33Clipperz.PM.Date.VERSION = "0.1"; 30Clipperz.PM.Date.VERSION = "0.1";
34Clipperz.PM.Date.NAME = "Clipperz.PM.Date"; 31Clipperz.PM.Date.NAME = "Clipperz.PM.Date";
35 32
36MochiKit.Base.update(Clipperz.PM.Date, { 33MochiKit.Base.update(Clipperz.PM.Date, {
37 34
38 '__repr__': function () { 35 '__repr__': function () {
39 return "[" + this.NAME + " " + this.VERSION + "]"; 36 return "[" + this.NAME + " " + this.VERSION + "]";
40 }, 37 },
41 38
42 //------------------------------------------------------------------------- 39 //-------------------------------------------------------------------------
43 40
44 'toString': function () { 41 'toString': function () {
45 return this.__repr__(); 42 return this.__repr__();
46 }, 43 },
47 44
48 //------------------------------------------------------------------------- 45 //-------------------------------------------------------------------------
49 46
50 'locale': function() { 47 'locale': function() {
51 return { 48 return {
52 'amDesignation':Clipperz.PM.Strings.getValue('calendarStrings.amDesignation'), 49 'amDesignation':Clipperz.PM.Strings.getValue('calendarStrings.amDesignation'),
53 'pmDesignation':Clipperz.PM.Strings.getValue('calendarStrings.pmDesignation'), 50 'pmDesignation':Clipperz.PM.Strings.getValue('calendarStrings.pmDesignation'),
54 'days': Clipperz.PM.Strings.getValue('calendarStrings.days'), 51 'days': Clipperz.PM.Strings.getValue('calendarStrings.days'),
55 'shortDays': Clipperz.PM.Strings.getValue('calendarStrings.shortDays'), 52 'shortDays': Clipperz.PM.Strings.getValue('calendarStrings.shortDays'),
56 'shortMonths': Clipperz.PM.Strings.getValue('calendarStrings.shortMonths'), 53 'shortMonths': Clipperz.PM.Strings.getValue('calendarStrings.shortMonths'),
57 'months': Clipperz.PM.Strings.getValue('calendarStrings.months') 54 'months': Clipperz.PM.Strings.getValue('calendarStrings.months')
58 } 55 }
59 }, 56 },
60 57
61 //========================================================================= 58 //=========================================================================
62/* 59/*
63 'formatDateWithPHPLikeTemplate': function(aDate, aTemplate) { 60 'formatDateWithPHPLikeTemplate': function(aDate, aTemplate) {
64 return Clipperz.Date.formatDateWithPHPLikeTemplateAndLocale(aDate, aTemplate, Clipperz.PM.Date.locale()); 61 return Clipperz.Date.formatDateWithPHPLikeTemplateAndLocale(aDate, aTemplate, Clipperz.PM.Date.locale());
65 }, 62 },
66 63
67 'parseDateWithPHPLikeTemplate': function(aDate, aTemplate) { 64 'parseDateWithPHPLikeTemplate': function(aDate, aTemplate) {
68 return Clipperz.Date.parseDateWithPHPTemplateAndLocale(aDate, aTemplate, Clipperz.PM.Date.locale()); 65 return Clipperz.Date.parseDateWithPHPTemplateAndLocale(aDate, aTemplate, Clipperz.PM.Date.locale());
69 }, 66 },
70 67
71 //========================================================================= 68 //=========================================================================
72 69
73 'formatDateWithJavaLikeTemplate': function(aDate, aTemplate) { 70 'formatDateWithJavaLikeTemplate': function(aDate, aTemplate) {
74 return Clipperz.Date.formatDateWithJavaLikeTemplateAndLocale(aDate, aTemplate, Clipperz.PM.Date.locale()); 71 return Clipperz.Date.formatDateWithJavaLikeTemplateAndLocale(aDate, aTemplate, Clipperz.PM.Date.locale());
75 }, 72 },
76 73
77 'parseDateWithJavaLikeTemplate': function(aDate, aTemplate) { 74 'parseDateWithJavaLikeTemplate': function(aDate, aTemplate) {
78 return Clipperz.Date.parseDateWithJavaLikeTemplateAndLocale(aDate, aTemplate, Clipperz.PM.Date.locale()); 75 return Clipperz.Date.parseDateWithJavaLikeTemplateAndLocale(aDate, aTemplate, Clipperz.PM.Date.locale());
79 }, 76 },
80*/ 77*/
81 //========================================================================= 78 //=========================================================================
82 79
83 'formatWithTemplate': function (aTemplate, aDate) { 80 'formatWithTemplate': function (aTemplate, aDate) {
84 return Clipperz.PM.Date.formatDateWithTemplate(aDate, aTemplate); 81 return Clipperz.PM.Date.formatDateWithTemplate(aDate, aTemplate);
85 }, 82 },
86 83
87 'formatDateWithTemplate': function(aDate, aTemplate) { 84 'formatDateWithTemplate': function(aDate, aTemplate) {
88 var result; 85 var result;
89 86
90 if (aDate == null) { 87 if (aDate == null) {
91 result = "" 88 result = ""
92 } else { 89 } else {
93 result = Clipperz.Date.formatDateWithPHPLikeTemplateAndLocale(aDate, aTemplate, Clipperz.PM.Date.locale()); 90 result = Clipperz.Date.formatDateWithPHPLikeTemplateAndLocale(aDate, aTemplate, Clipperz.PM.Date.locale());
94 }; 91 };
95 92
96 return result; 93 return result;
97 }, 94 },
98 95
99 'parseDateWithTemplate': function(aValue, aTemplate) { 96 'parseDateWithTemplate': function(aValue, aTemplate) {
100 return Clipperz.Date.parseDateWithPHPTemplateAndLocale(aValue, aTemplate, Clipperz.PM.Date.locale()); 97 return Clipperz.Date.parseDateWithPHPTemplateAndLocale(aValue, aTemplate, Clipperz.PM.Date.locale());
101 }, 98 },
102 99
103 //========================================================================= 100 //=========================================================================
104 101
105 'formatDateWithUTCFormat': function(aDate) { 102 'formatDateWithUTCFormat': function(aDate) {
106 return Clipperz.Date.formatDateWithUTCFormatAndLocale(aDate, Clipperz.PM.Date.locale()); 103 return Clipperz.Date.formatDateWithUTCFormatAndLocale(aDate, Clipperz.PM.Date.locale());
107 }, 104 },
108 105
109 'parseDateWithUTCFormat': function(aValue) { 106 'parseDateWithUTCFormat': function(aValue) {
110 var result; 107 var result;
111 108
112 if (aValue == null) { 109 if (aValue == null) {
113 result = null; 110 result = null;
114 } else { 111 } else {
115 result = Clipperz.Date.parseDateWithUTCFormatAndLocale(aValue, Clipperz.PM.Date.locale()); 112 result = Clipperz.Date.parseDateWithUTCFormatAndLocale(aValue, Clipperz.PM.Date.locale());
116 } 113 }
117 114
118 return result; 115 return result;
119 }, 116 },
120 117
121 //========================================================================= 118 //=========================================================================
122 119
123 'getElapsedTimeDescription': function(aDate) { 120 'getElapsedTimeDescription': function(aDate) {
124 var result; 121 var result;
125 122
126 result = "" 123 result = ""
127 124
128 if (aDate != null) { 125 if (aDate != null) {
129 var now; 126 var now;
130 var elapsedTime; 127 var elapsedTime;
131 128
132 var millisencondsInAMinute; 129 var millisencondsInAMinute;
133 var millisencondsInAnHour; 130 var millisencondsInAnHour;
134 var millisencondsInADay; 131 var millisencondsInADay;
135 var millisencondsInAWeek; 132 var millisencondsInAWeek;
136 var millisencondsInAMonth; 133 var millisencondsInAMonth;
137 134
138 now = new Date(); 135 now = new Date();
139 elapsedTime = now.getTime() - aDate.getTime(); 136 elapsedTime = now.getTime() - aDate.getTime();
140 137
141 millisencondsInAMinute = 60 * 1000; 138 millisencondsInAMinute = 60 * 1000;
142 millisencondsInAnHour = millisencondsInAMinute * 60; 139 millisencondsInAnHour = millisencondsInAMinute * 60;
143 millisencondsInADay = millisencondsInAnHour * 24; 140 millisencondsInADay = millisencondsInAnHour * 24;
144 millisencondsInAWeek = millisencondsInADay * 7; 141 millisencondsInAWeek = millisencondsInADay * 7;
145 millisencondsInAMonth = millisencondsInAWeek * 5; 142 millisencondsInAMonth = millisencondsInAWeek * 5;
146 143
147 if ((elapsedTime / millisencondsInAMonth) > 1) { 144 if ((elapsedTime / millisencondsInAMonth) > 1) {
148 result = Clipperz.PM.Strings.getValue('elapsedTimeDescriptions.MORE_THAN_A_MONTH_AGO'); 145 result = Clipperz.PM.Strings.getValue('elapsedTimeDescriptions.MORE_THAN_A_MONTH_AGO');
149 } else if ((elapsedTime / millisencondsInAWeek) > 1) { 146 } else if ((elapsedTime / millisencondsInAWeek) > 1) {
150 var elapsedWeeks; 147 var elapsedWeeks;
151 148
152 elapsedWeeks = Math.floor((elapsedTime / millisencondsInAWeek)); 149 elapsedWeeks = Math.floor((elapsedTime / millisencondsInAWeek));
153 if (elapsedWeeks == 1) { 150 if (elapsedWeeks == 1) {
154 result = Clipperz.PM.Strings.getValue('elapsedTimeDescriptions.MORE_THAN_A_WEEK_AGO'); 151 result = Clipperz.PM.Strings.getValue('elapsedTimeDescriptions.MORE_THAN_A_WEEK_AGO');
155 } else { 152 } else {
156 result = Clipperz.PM.Strings.getValue('elapsedTimeDescriptions.MORE_THAN_*_WEEKS_AGO').replace(/__elapsed__/, elapsedWeeks); 153 result = Clipperz.PM.Strings.getValue('elapsedTimeDescriptions.MORE_THAN_*_WEEKS_AGO').replace(/__elapsed__/, elapsedWeeks);
157 } 154 }
158 } else if ((elapsedTime / millisencondsInADay) > 1) { 155 } else if ((elapsedTime / millisencondsInADay) > 1) {
159 var elapsedDays; 156 var elapsedDays;
160 157
161 elapsedDays = Math.floor((elapsedTime / millisencondsInADay)); 158 elapsedDays = Math.floor((elapsedTime / millisencondsInADay));
162 if (elapsedDays == 1) { 159 if (elapsedDays == 1) {
163 result = Clipperz.PM.Strings.getValue('elapsedTimeDescriptions.YESTERDAY'); 160 result = Clipperz.PM.Strings.getValue('elapsedTimeDescriptions.YESTERDAY');
164 } else { 161 } else {
165 result = Clipperz.PM.Strings.getValue('elapsedTimeDescriptions.*_DAYS_AGO').replace(/__elapsed__/, elapsedDays); 162 result = Clipperz.PM.Strings.getValue('elapsedTimeDescriptions.*_DAYS_AGO').replace(/__elapsed__/, elapsedDays);
166 } 163 }
167 } else if ((elapsedTime / millisencondsInAnHour) > 1) { 164 } else if ((elapsedTime / millisencondsInAnHour) > 1) {
168 var elapsedHours; 165 var elapsedHours;
169 166
170 elapsedHours = Math.floor((elapsedTime / millisencondsInAnHour)); 167 elapsedHours = Math.floor((elapsedTime / millisencondsInAnHour));
171 if (elapsedHours == 1) { 168 if (elapsedHours == 1) {
172 result = Clipperz.PM.Strings.getValue('elapsedTimeDescriptions.ABOUT_AN_HOUR_AGO'); 169 result = Clipperz.PM.Strings.getValue('elapsedTimeDescriptions.ABOUT_AN_HOUR_AGO');
173 } else { 170 } else {
174 result = Clipperz.PM.Strings.getValue('elapsedTimeDescriptions.*_HOURS_AGO').replace(/__elapsed__/, elapsedHours); 171 result = Clipperz.PM.Strings.getValue('elapsedTimeDescriptions.*_HOURS_AGO').replace(/__elapsed__/, elapsedHours);
175 } 172 }
176 } else { 173 } else {
177 var elapsed10Minutes; 174 var elapsed10Minutes;
178 175
179 elapsed10Minutes = (Math.floor((elapsedTime / millisencondsInAMinute) / 10)) * 10; 176 elapsed10Minutes = (Math.floor((elapsedTime / millisencondsInAMinute) / 10)) * 10;
180 if (elapsed10Minutes == 0) { 177 if (elapsed10Minutes == 0) {
181 result = Clipperz.PM.Strings.getValue('elapsedTimeDescriptions.JUST_A_FEW_MINUTES_AGO'); 178 result = Clipperz.PM.Strings.getValue('elapsedTimeDescriptions.JUST_A_FEW_MINUTES_AGO');
182 } else { 179 } else {
183 result = Clipperz.PM.Strings.getValue('elapsedTimeDescriptions.ABOUT_*_MINUTES_AGO').replace(/__elapsed__/, elapsed10Minutes+""); 180 result = Clipperz.PM.Strings.getValue('elapsedTimeDescriptions.ABOUT_*_MINUTES_AGO').replace(/__elapsed__/, elapsed10Minutes+"");
184 } 181 }
185 } 182 }
186 } 183 }
187 184
188 return result; 185 return result;
189 }, 186 },
190 187
191 //------------------------------------------------------------------------- 188 //-------------------------------------------------------------------------
192 189
193 'parse': function (aValue) { 190 'parse': function (aValue) {
194 return Clipperz.PM.Date.parseDateWithUTCFormat(aValue); 191 return Clipperz.PM.Date.parseDateWithUTCFormat(aValue);
195 }, 192 },
196 193
197 //------------------------------------------------------------------------- 194 //-------------------------------------------------------------------------
198 __syntaxFix__: "syntax fix" 195 __syntaxFix__: "syntax fix"
199 196
200}); 197});
201 198
diff --git a/frontend/gamma/js/Clipperz/PM/Proxy.js b/frontend/gamma/js/Clipperz/PM/Proxy.js
index d90bcb7..190bffd 100644
--- a/frontend/gamma/js/Clipperz/PM/Proxy.js
+++ b/frontend/gamma/js/Clipperz/PM/Proxy.js
@@ -1,172 +1,169 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
30if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } 27if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
31 28
32//============================================================================= 29//=============================================================================
33 30
34Clipperz.PM.Proxy = function(args) { 31Clipperz.PM.Proxy = function(args) {
35 args = args || {}; 32 args = args || {};
36 33
37 this._shouldPayTolls = args.shouldPayTolls || false; 34 this._shouldPayTolls = args.shouldPayTolls || false;
38 35
39 this._tolls = { 36 this._tolls = {
40 'CONNECT':[], 37 'CONNECT':[],
41 'REGISTER':[], 38 'REGISTER':[],
42 'MESSAGE':[] 39 'MESSAGE':[]
43 }; 40 };
44 41
45 if (args.isDefault === true) { 42 if (args.isDefault === true) {
46 Clipperz.PM.Proxy.defaultProxy = this; 43 Clipperz.PM.Proxy.defaultProxy = this;
47 } 44 }
48 45
49 return this; 46 return this;
50} 47}
51 48
52Clipperz.PM.Proxy.prototype = MochiKit.Base.update(null, { 49Clipperz.PM.Proxy.prototype = MochiKit.Base.update(null, {
53 50
54 'toString': function() { 51 'toString': function() {
55 return "Clipperz.PM.Proxy"; 52 return "Clipperz.PM.Proxy";
56 }, 53 },
57 54
58 //========================================================================= 55 //=========================================================================
59 56
60 'shouldPayTolls': function() { 57 'shouldPayTolls': function() {
61 return this._shouldPayTolls; 58 return this._shouldPayTolls;
62 }, 59 },
63 60
64 //------------------------------------------------------------------------- 61 //-------------------------------------------------------------------------
65 62
66 'tolls': function() { 63 'tolls': function() {
67 return this._tolls; 64 return this._tolls;
68 }, 65 },
69 66
70 //------------------------------------------------------------------------- 67 //-------------------------------------------------------------------------
71 68
72 'payToll': function(aRequestType, someParameters) { 69 'payToll': function(aRequestType, someParameters) {
73 vardeferredResult; 70 vardeferredResult;
74 71
75//console.log(">>> Proxy.payToll", aRequestType, someParameters); 72//console.log(">>> Proxy.payToll", aRequestType, someParameters);
76 if (this.shouldPayTolls()) { 73 if (this.shouldPayTolls()) {
77 deferredResult = new Clipperz.Async.Deferred("Proxy.payToll", {trace:false}); 74 deferredResult = new Clipperz.Async.Deferred("Proxy.payToll", {trace:false});
78 75
79 if (this.tolls()[aRequestType].length == 0) { 76 if (this.tolls()[aRequestType].length == 0) {
80 deferredResult.addMethod(this, 'sendMessage', 'knock', {requestType:aRequestType}); 77 deferredResult.addMethod(this, 'sendMessage', 'knock', {requestType:aRequestType});
81 deferredResult.addMethod(this, 'setTollCallback'); 78 deferredResult.addMethod(this, 'setTollCallback');
82 } 79 }
83 deferredResult.addMethod(this.tolls()[aRequestType], 'pop'); 80 deferredResult.addMethod(this.tolls()[aRequestType], 'pop');
84 deferredResult.addCallback(MochiKit.Base.methodcaller('deferredPay')); 81 deferredResult.addCallback(MochiKit.Base.methodcaller('deferredPay'));
85 deferredResult.addCallback(function(aToll) { 82 deferredResult.addCallback(function(aToll) {
86 var result; 83 var result;
87 84
88 result = { 85 result = {
89 parameters: someParameters, 86 parameters: someParameters,
90 toll: aToll 87 toll: aToll
91 } 88 }
92 89
93 return result; 90 return result;
94 }); 91 });
95 92
96 deferredResult.callback(); 93 deferredResult.callback();
97 } else { 94 } else {
98 deferredResult = MochiKit.Async.succeed({parameters:someParameters}); 95 deferredResult = MochiKit.Async.succeed({parameters:someParameters});
99 } 96 }
100//console.log("<<< Proxy.payToll"); 97//console.log("<<< Proxy.payToll");
101 98
102 return deferredResult; 99 return deferredResult;
103 }, 100 },
104 101
105 //------------------------------------------------------------------------- 102 //-------------------------------------------------------------------------
106 103
107 'addToll': function(aToll) { 104 'addToll': function(aToll) {
108//console.log(">>> Proxy.addToll", aToll); 105//console.log(">>> Proxy.addToll", aToll);
109 this.tolls()[aToll.requestType()].push(aToll); 106 this.tolls()[aToll.requestType()].push(aToll);
110//console.log("<<< Proxy.addToll"); 107//console.log("<<< Proxy.addToll");
111 }, 108 },
112 109
113 //========================================================================= 110 //=========================================================================
114 111
115 'setTollCallback': function(someParameters) { 112 'setTollCallback': function(someParameters) {
116//console.log(">>> Proxy.setTollCallback", someParameters); 113//console.log(">>> Proxy.setTollCallback", someParameters);
117 if (typeof(someParameters['toll']) != 'undefined') { 114 if (typeof(someParameters['toll']) != 'undefined') {
118//console.log("added a new toll", someParameters['toll']); 115//console.log("added a new toll", someParameters['toll']);
119 this.addToll(new Clipperz.PM.Toll(someParameters['toll'])); 116 this.addToll(new Clipperz.PM.Toll(someParameters['toll']));
120 } 117 }
121//console.log("<<< Proxy.setTallCallback", someParameters['result']); 118//console.log("<<< Proxy.setTallCallback", someParameters['result']);
122 return someParameters['result']; 119 return someParameters['result'];
123 }, 120 },
124 121
125 //========================================================================= 122 //=========================================================================
126 123
127 'registration': function (someParameters) { 124 'registration': function (someParameters) {
128 return this.processMessage('registration', someParameters, 'REGISTER'); 125 return this.processMessage('registration', someParameters, 'REGISTER');
129 }, 126 },
130 127
131 'handshake': function (someParameters) { 128 'handshake': function (someParameters) {
132 return this.processMessage('handshake', someParameters, 'CONNECT'); 129 return this.processMessage('handshake', someParameters, 'CONNECT');
133 }, 130 },
134 131
135 'message': function (someParameters) { 132 'message': function (someParameters) {
136 return this.processMessage('message', someParameters, 'MESSAGE'); 133 return this.processMessage('message', someParameters, 'MESSAGE');
137 }, 134 },
138 135
139 'logout': function (someParameters) { 136 'logout': function (someParameters) {
140 return this.processMessage('logout', someParameters, 'MESSAGE'); 137 return this.processMessage('logout', someParameters, 'MESSAGE');
141 }, 138 },
142 139
143 //========================================================================= 140 //=========================================================================
144 141
145 'processMessage': function (aFunctionName, someParameters, aRequestType) { 142 'processMessage': function (aFunctionName, someParameters, aRequestType) {
146 vardeferredResult; 143 vardeferredResult;
147 144
148 deferredResult = new Clipperz.Async.Deferred("Proxy.processMessage", {trace:false}); 145 deferredResult = new Clipperz.Async.Deferred("Proxy.processMessage", {trace:false});
149 deferredResult.addMethod(this, 'payToll', aRequestType); 146 deferredResult.addMethod(this, 'payToll', aRequestType);
150 deferredResult.addMethod(this, 'sendMessage', aFunctionName); 147 deferredResult.addMethod(this, 'sendMessage', aFunctionName);
151 deferredResult.addMethod(this, 'setTollCallback'); 148 deferredResult.addMethod(this, 'setTollCallback');
152 deferredResult.callback(someParameters); 149 deferredResult.callback(someParameters);
153 150
154 return deferredResult; 151 return deferredResult;
155 }, 152 },
156 153
157 //========================================================================= 154 //=========================================================================
158 155
159 'sendMessage': function () { 156 'sendMessage': function () {
160 throw Clipperz.Base.exception.AbstractMethod; 157 throw Clipperz.Base.exception.AbstractMethod;
161 }, 158 },
162 159
163 //========================================================================= 160 //=========================================================================
164 161
165 'isReadOnly': function () { 162 'isReadOnly': function () {
166 return false; 163 return false;
167 }, 164 },
168 165
169 //========================================================================= 166 //=========================================================================
170 __syntaxFix__: "syntax fix" 167 __syntaxFix__: "syntax fix"
171 168
172}); 169});
diff --git a/frontend/gamma/js/Clipperz/PM/Proxy/Proxy.JSON.js b/frontend/gamma/js/Clipperz/PM/Proxy/Proxy.JSON.js
index 65b46de..5b39b4a 100755
--- a/frontend/gamma/js/Clipperz/PM/Proxy/Proxy.JSON.js
+++ b/frontend/gamma/js/Clipperz/PM/Proxy/Proxy.JSON.js
@@ -1,94 +1,91 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
30if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } 27if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
31 28
32//============================================================================= 29//=============================================================================
33 30
34Clipperz.PM.Proxy.JSON = function(args) { 31Clipperz.PM.Proxy.JSON = function(args) {
35 Clipperz.PM.Proxy.JSON.superclass.constructor.call(this, args); 32 Clipperz.PM.Proxy.JSON.superclass.constructor.call(this, args);
36 33
37 this._url = args.url || Clipperz.Base.exception.raise('MandatoryParameter'); 34 this._url = args.url || Clipperz.Base.exception.raise('MandatoryParameter');
38 35
39 return this; 36 return this;
40} 37}
41 38
42Clipperz.Base.extend(Clipperz.PM.Proxy.JSON, Clipperz.PM.Proxy, { 39Clipperz.Base.extend(Clipperz.PM.Proxy.JSON, Clipperz.PM.Proxy, {
43 40
44 'toString': function() { 41 'toString': function() {
45 return "Clipperz.PM.Proxy.JSON"; 42 return "Clipperz.PM.Proxy.JSON";
46 }, 43 },
47 44
48 //========================================================================= 45 //=========================================================================
49 46
50 'url': function () { 47 'url': function () {
51 return this._url; 48 return this._url;
52 }, 49 },
53 50
54 //========================================================================= 51 //=========================================================================
55 52
56 'sendMessage': function(aFunctionName, someParameters) { 53 'sendMessage': function(aFunctionName, someParameters) {
57 vardeferredResult; 54 vardeferredResult;
58 var parameters; 55 var parameters;
59 56
60 parameters = { 57 parameters = {
61 method: aFunctionName, 58 method: aFunctionName,
62 // version: someParameters['version'], 59 // version: someParameters['version'],
63 // message: someParameters['message'], 60 // message: someParameters['message'],
64 parameters: Clipperz.Base.serializeJSON(someParameters) 61 parameters: Clipperz.Base.serializeJSON(someParameters)
65 }; 62 };
66 63
67 deferredResult = new Clipperz.Async.Deferred("Proxy.JSON.sendMessage", {trace:false}); 64 deferredResult = new Clipperz.Async.Deferred("Proxy.JSON.sendMessage", {trace:false});
68 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'remoteRequestSent'); 65 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'remoteRequestSent');
69 deferredResult.addCallback(MochiKit.Async.doXHR, this.url(), { 66 deferredResult.addCallback(MochiKit.Async.doXHR, this.url(), {
70 method:'POST', 67 method:'POST',
71 sendContent:MochiKit.Base.queryString(parameters), 68 sendContent:MochiKit.Base.queryString(parameters),
72 headers:{"Content-Type":"application/x-www-form-urlencoded"} 69 headers:{"Content-Type":"application/x-www-form-urlencoded"}
73 }); 70 });
74 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'remoteRequestReceived'); 71 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'remoteRequestReceived');
75 // deferredResult.addCallback(MochiKit.Async.evalJSONRequest); 72 // deferredResult.addCallback(MochiKit.Async.evalJSONRequest);
76 deferredResult.addCallback(MochiKit.Base.itemgetter('responseText')); 73 deferredResult.addCallback(MochiKit.Base.itemgetter('responseText'));
77 deferredResult.addCallback(Clipperz.Base.evalJSON); 74 deferredResult.addCallback(Clipperz.Base.evalJSON);
78 deferredResult.addCallback(function (someValues) { 75 deferredResult.addCallback(function (someValues) {
79 if (someValues['result'] == 'EXCEPTION') { 76 if (someValues['result'] == 'EXCEPTION') {
80 throw someValues['message']; 77 throw someValues['message'];
81 } 78 }
82 79
83 return someValues; 80 return someValues;
84 }) 81 })
85 // return MochiKit.Base.evalJSON(req.responseText); 82 // return MochiKit.Base.evalJSON(req.responseText);
86 deferredResult.callback(); 83 deferredResult.callback();
87 84
88 return deferredResult; 85 return deferredResult;
89 }, 86 },
90 87
91 //========================================================================= 88 //=========================================================================
92 __syntaxFix__: "syntax fix" 89 __syntaxFix__: "syntax fix"
93 90
94}); 91});
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 de8e7f6..01ba122 100644
--- a/frontend/gamma/js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js
+++ b/frontend/gamma/js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js
@@ -1,408 +1,405 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29try { if (typeof(Clipperz.PM.Proxy.Offline) == 'undefined') { throw ""; }} catch (e) { 26try { if (typeof(Clipperz.PM.Proxy.Offline) == 'undefined') { throw ""; }} catch (e) {
30 throw "Clipperz.PM.Proxy.Offline.DataStore depends on Clipperz.PM.Proxy.Offline!"; 27 throw "Clipperz.PM.Proxy.Offline.DataStore depends on Clipperz.PM.Proxy.Offline!";
31} 28}
32 29
33//============================================================================= 30//=============================================================================
34 31
35Clipperz.PM.Proxy.Offline.DataStore = function(args) { 32Clipperz.PM.Proxy.Offline.DataStore = function(args) {
36 args = args || {}; 33 args = args || {};
37 34
38 this._data = args.data || (typeof(_clipperz_dump_data_) != 'undefined' ? _clipperz_dump_data_ : null); 35 this._data = args.data || (typeof(_clipperz_dump_data_) != 'undefined' ? _clipperz_dump_data_ : null);
39 this._isReadOnly = (typeof(args.readOnly) == 'undefined' ? true : args.readOnly); 36 this._isReadOnly = (typeof(args.readOnly) == 'undefined' ? true : args.readOnly);
40 this._shouldPayTolls = args.shouldPayTolls || false; 37 this._shouldPayTolls = args.shouldPayTolls || false;
41 38
42 this._tolls = {}; 39 this._tolls = {};
43 this._currentStaticConnection = null; 40 this._currentStaticConnection = null;
44 41
45 return this; 42 return this;
46} 43}
47 44
48Clipperz.Base.extend(Clipperz.PM.Proxy.Offline.DataStore, Object, { 45Clipperz.Base.extend(Clipperz.PM.Proxy.Offline.DataStore, Object, {
49 46
50 //------------------------------------------------------------------------- 47 //-------------------------------------------------------------------------
51 48
52 'isReadOnly': function () { 49 'isReadOnly': function () {
53 return this._isReadOnly; 50 return this._isReadOnly;
54 }, 51 },
55 52
56 //------------------------------------------------------------------------- 53 //-------------------------------------------------------------------------
57 54
58 'shouldPayTolls': function() { 55 'shouldPayTolls': function() {
59 return this._shouldPayTolls; 56 return this._shouldPayTolls;
60 }, 57 },
61 58
62 //------------------------------------------------------------------------- 59 //-------------------------------------------------------------------------
63 60
64 'data': function () { 61 'data': function () {
65 return this._data; 62 return this._data;
66 }, 63 },
67 64
68 //------------------------------------------------------------------------- 65 //-------------------------------------------------------------------------
69 66
70 'tolls': function () { 67 'tolls': function () {
71 return this._tolls; 68 return this._tolls;
72 }, 69 },
73 70
74 //========================================================================= 71 //=========================================================================
75 72
76 'resetData': function() { 73 'resetData': function() {
77 this._data = { 74 this._data = {
78 'users': { 75 'users': {
79 'catchAllUser': { 76 'catchAllUser': {
80 __masterkey_test_value__: 'masterkey', 77 __masterkey_test_value__: 'masterkey',
81 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00', 78 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00',
82 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00' 79 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00'
83 } 80 }
84 } 81 }
85 }; 82 };
86 }, 83 },
87 84
88 //------------------------------------------------------------------------- 85 //-------------------------------------------------------------------------
89 86
90 'setupWithEncryptedData': function(someData) { 87 'setupWithEncryptedData': function(someData) {
91 this._data = Clipperz.Base.deepClone(someData); 88 this._data = Clipperz.Base.deepClone(someData);
92 }, 89 },
93 90
94 //------------------------------------------------------------------------- 91 //-------------------------------------------------------------------------
95 92
96 'setupWithData': function(someData) { 93 'setupWithData': function(someData) {
97 var deferredResult; 94 var deferredResult;
98 var resultData; 95 var resultData;
99 var i, c; 96 var i, c;
100 97
101//Clipperz.log(">>> Proxy.Test.setupWithData"); 98//Clipperz.log(">>> Proxy.Test.setupWithData");
102 resultData = this._data; 99 resultData = this._data;
103 100
104 deferredResult = new Clipperz.Async.Deferred("Proxy.Test.seupWithData", {trace:false}); 101 deferredResult = new Clipperz.Async.Deferred("Proxy.Test.seupWithData", {trace:false});
105 c = someData['users'].length; 102 c = someData['users'].length;
106 103
107 for (i=0; i<c; i++) { 104 for (i=0; i<c; i++) {
108 varnewConnection; 105 varnewConnection;
109 varrecordConfiguration; 106 varrecordConfiguration;
110 107
111 deferredResult.addMethod(this, 'userSerializedEncryptedData', someData['users'][i]); 108 deferredResult.addMethod(this, 'userSerializedEncryptedData', someData['users'][i]);
112 deferredResult.addCallback(MochiKit.Base.bind(function(aUserSerializationContext) { 109 deferredResult.addCallback(MochiKit.Base.bind(function(aUserSerializationContext) {
113//console.log("SERIALIZED USER", aUserSerializationContext); 110//console.log("SERIALIZED USER", aUserSerializationContext);
114 resultData['users'][aUserSerializationContext['credentials']['C']] = { 111 resultData['users'][aUserSerializationContext['credentials']['C']] = {
115 's': aUserSerializationContext['credentials']['s'], 112 's': aUserSerializationContext['credentials']['s'],
116 'v': aUserSerializationContext['credentials']['v'], 113 'v': aUserSerializationContext['credentials']['v'],
117 'version': aUserSerializationContext['data']['connectionVersion'], 114 'version': aUserSerializationContext['data']['connectionVersion'],
118 'userDetails': aUserSerializationContext['encryptedData']['user']['header'], 115 'userDetails': aUserSerializationContext['encryptedData']['user']['header'],
119 'userDetailsVersion':aUserSerializationContext['encryptedData']['user']['version'], 116 'userDetailsVersion':aUserSerializationContext['encryptedData']['user']['version'],
120 'statistics': aUserSerializationContext['encryptedData']['user']['statistics'], 117 'statistics': aUserSerializationContext['encryptedData']['user']['statistics'],
121 'lock': aUserSerializationContext['encryptedData']['user']['lock'], 118 'lock': aUserSerializationContext['encryptedData']['user']['lock'],
122 'records': this.rearrangeRecordsData(aUserSerializationContext['encryptedData']['records']) 119 'records': this.rearrangeRecordsData(aUserSerializationContext['encryptedData']['records'])
123 } 120 }
124 }, this)); 121 }, this));
125 } 122 }
126 123
127 deferredResult.addCallback(MochiKit.Base.bind(function() { 124 deferredResult.addCallback(MochiKit.Base.bind(function() {
128//console.log("this._data", resultData); 125//console.log("this._data", resultData);
129 this._data = resultData; 126 this._data = resultData;
130 }, this)); 127 }, this));
131 128
132 deferredResult.callback(); 129 deferredResult.callback();
133//Clipperz.log("<<< Proxy.Test.setupWithData"); 130//Clipperz.log("<<< Proxy.Test.setupWithData");
134 131
135 return deferredResult; 132 return deferredResult;
136 }, 133 },
137 134
138 //========================================================================= 135 //=========================================================================
139 136
140 'getTollForRequestType': function (aRequestType) { 137 'getTollForRequestType': function (aRequestType) {
141 varresult; 138 varresult;
142 vartargetValue; 139 vartargetValue;
143 var cost; 140 var cost;
144 141
145 targetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2); 142 targetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2);
146 switch (aRequestType) { 143 switch (aRequestType) {
147 case 'REGISTER': 144 case 'REGISTER':
148 cost = 5; 145 cost = 5;
149 break; 146 break;
150 case 'CONNECT': 147 case 'CONNECT':
151 cost = 5; 148 cost = 5;
152 break; 149 break;
153 case 'MESSAGE': 150 case 'MESSAGE':
154 cost = 2; 151 cost = 2;
155 break; 152 break;
156 } 153 }
157 154
158 result = { 155 result = {
159 requestType: aRequestType, 156 requestType: aRequestType,
160 targetValue: targetValue, 157 targetValue: targetValue,
161 cost: cost 158 cost: cost
162 } 159 }
163 160
164 if (this.shouldPayTolls()) { 161 if (this.shouldPayTolls()) {
165 this.tolls()[targetValue] = result; 162 this.tolls()[targetValue] = result;
166 } 163 }
167 164
168 return result; 165 return result;
169 }, 166 },
170 167
171 //------------------------------------------------------------------------- 168 //-------------------------------------------------------------------------
172 169
173 'checkToll': function (aFunctionName, someParameters) { 170 'checkToll': function (aFunctionName, someParameters) {
174 if (this.shouldPayTolls()) { 171 if (this.shouldPayTolls()) {
175 var localToll; 172 var localToll;
176 vartollParameters; 173 vartollParameters;
177 174
178 tollParameters = someParameters['toll']; 175 tollParameters = someParameters['toll'];
179 localToll = this.tolls()[tollParameters['targetValue']]; 176 localToll = this.tolls()[tollParameters['targetValue']];
180 177
181 if (localToll != null) { 178 if (localToll != null) {
182 if (! Clipperz.PM.Toll.validate(tollParameters['targetValue'], tollParameters['toll'], localToll['cost'])) { 179 if (! Clipperz.PM.Toll.validate(tollParameters['targetValue'], tollParameters['toll'], localToll['cost'])) {
183 throw "Toll value too low."; 180 throw "Toll value too low.";
184 }; 181 };
185 } else { 182 } else {
186 throw "Missing toll"; 183 throw "Missing toll";
187 } 184 }
188 } 185 }
189 }, 186 },
190 187
191 //========================================================================= 188 //=========================================================================
192 189
193 'currentStaticConnection': function () { 190 'currentStaticConnection': function () {
194 if (this._currentStaticConnection == null) { 191 if (this._currentStaticConnection == null) {
195 this._currentStaticConnection = {}; 192 this._currentStaticConnection = {};
196 } 193 }
197 194
198 return this._currentStaticConnection; 195 return this._currentStaticConnection;
199 }, 196 },
200 197
201 //------------------------------------------------------------------------- 198 //-------------------------------------------------------------------------
202 199
203 'getConnectionForRequest': function (aFunctionName, someParameters) { 200 'getConnectionForRequest': function (aFunctionName, someParameters) {
204 varresult; 201 varresult;
205 202
206 if (this.shouldPayTolls()) { 203 if (this.shouldPayTolls()) {
207 if ((typeof(someParameters['toll']) != 'undefined') && (typeof(someParameters['toll']['targetValue']) != 'undefined')) { 204 if ((typeof(someParameters['toll']) != 'undefined') && (typeof(someParameters['toll']['targetValue']) != 'undefined')) {
208 result = this.tolls()[someParameters['toll']['targetValue']]['connection']; 205 result = this.tolls()[someParameters['toll']['targetValue']]['connection'];
209 if (typeof(result) == 'undefined') { 206 if (typeof(result) == 'undefined') {
210 result = {}; 207 result = {};
211 } 208 }
212 } else { 209 } else {
213 result = {}; 210 result = {};
214 } 211 }
215 } else { 212 } else {
216 result = this.currentStaticConnection(); 213 result = this.currentStaticConnection();
217 } 214 }
218 215
219 return result; 216 return result;
220 }, 217 },
221 218
222 //------------------------------------------------------------------------- 219 //-------------------------------------------------------------------------
223 220
224 'storeConnectionForRequestWithConnectionAndResponse': function (aFunctionName, someParameters, aConnection, aResponse) { 221 'storeConnectionForRequestWithConnectionAndResponse': function (aFunctionName, someParameters, aConnection, aResponse) {
225 if (this.shouldPayTolls()) { 222 if (this.shouldPayTolls()) {
226 if ((typeof(aResponse['toll']) != 'undefined') 223 if ((typeof(aResponse['toll']) != 'undefined')
227 &&(typeof(aResponse['toll']['targetValue']) != 'undefined') 224 &&(typeof(aResponse['toll']['targetValue']) != 'undefined')
228 &&(typeof(this.tolls()[aResponse['toll']['targetValue']]) != 'undefined') 225 &&(typeof(this.tolls()[aResponse['toll']['targetValue']]) != 'undefined')
229 ) { 226 ) {
230 this.tolls()[aResponse['toll']['targetValue']]['connection'] = aConnection; 227 this.tolls()[aResponse['toll']['targetValue']]['connection'] = aConnection;
231 } 228 }
232 } 229 }
233 }, 230 },
234 231
235 //========================================================================= 232 //=========================================================================
236 233
237 'processMessage': function (aFunctionName, someParameters) { 234 'processMessage': function (aFunctionName, someParameters) {
238 var result; 235 var result;
239 varconnection; 236 varconnection;
240 237
241 connection = this.getConnectionForRequest(aFunctionName, someParameters); 238 connection = this.getConnectionForRequest(aFunctionName, someParameters);
242 239
243 switch(aFunctionName) { 240 switch(aFunctionName) {
244 case 'knock': 241 case 'knock':
245 result = this._knock(connection, someParameters); 242 result = this._knock(connection, someParameters);
246 break; 243 break;
247 case 'registration': 244 case 'registration':
248 this.checkToll(aFunctionName, someParameters); 245 this.checkToll(aFunctionName, someParameters);
249 result = this._registration(connection, someParameters.parameters); 246 result = this._registration(connection, someParameters.parameters);
250 break; 247 break;
251 case 'handshake': 248 case 'handshake':
252 this.checkToll(aFunctionName, someParameters); 249 this.checkToll(aFunctionName, someParameters);
253 result = this._handshake(connection, someParameters.parameters); 250 result = this._handshake(connection, someParameters.parameters);
254 break; 251 break;
255 case 'message': 252 case 'message':
256 this.checkToll(aFunctionName, someParameters); 253 this.checkToll(aFunctionName, someParameters);
257 result = this._message(connection, someParameters.parameters); 254 result = this._message(connection, someParameters.parameters);
258 break; 255 break;
259 case 'logout': 256 case 'logout':
260 this._currentStaticConnection = null; 257 this._currentStaticConnection = null;
261 result = this._logout(connection, someParameters.parameters); 258 result = this._logout(connection, someParameters.parameters);
262 break; 259 break;
263 } 260 }
264 261
265 this.storeConnectionForRequestWithConnectionAndResponse(aFunctionName, someParameters, connection, result); 262 this.storeConnectionForRequestWithConnectionAndResponse(aFunctionName, someParameters, connection, result);
266 263
267 return MochiKit.Async.succeed(result); 264 return MochiKit.Async.succeed(result);
268 }, 265 },
269 266
270 //========================================================================= 267 //=========================================================================
271 268
272 '_knock': function(aConnection, someParameters) { 269 '_knock': function(aConnection, someParameters) {
273 var result; 270 var result;
274 271
275 result = { 272 result = {
276 toll: this.getTollForRequestType(someParameters['requestType']) 273 toll: this.getTollForRequestType(someParameters['requestType'])
277 } 274 }
278 275
279 return result; 276 return result;
280 }, 277 },
281 278
282 //------------------------------------------------------------------------- 279 //-------------------------------------------------------------------------
283 280
284 '_registration': function(aConnection, someParameters) { 281 '_registration': function(aConnection, someParameters) {
285 if (this.isReadOnly() == false) { 282 if (this.isReadOnly() == false) {
286 if (typeof(this.data()['users'][someParameters['credentials']['C']]) == 'undefined') { 283 if (typeof(this.data()['users'][someParameters['credentials']['C']]) == 'undefined') {
287 this.data()['users'][someParameters['credentials']['C']] = { 284 this.data()['users'][someParameters['credentials']['C']] = {
288 's': someParameters['credentials']['s'], 285 's': someParameters['credentials']['s'],
289 'v': someParameters['credentials']['v'], 286 'v': someParameters['credentials']['v'],
290 'version':someParameters['credentials']['version'], 287 'version':someParameters['credentials']['version'],
291 'lock': Clipperz.Crypto.Base.generateRandomSeed(), 288 'lock': Clipperz.Crypto.Base.generateRandomSeed(),
292 'userDetails': someParameters['user']['header'], 289 'userDetails': someParameters['user']['header'],
293 'statistics': someParameters['user']['statistics'], 290 'statistics': someParameters['user']['statistics'],
294 'userDetailsVersion':someParameters['user']['version'], 291 'userDetailsVersion':someParameters['user']['version'],
295 'records':{} 292 'records':{}
296 } 293 }
297 } else { 294 } else {
298 throw "user already exists"; 295 throw "user already exists";
299 } 296 }
300 } else { 297 } else {
301 throw Clipperz.PM.Proxy.Offline.DataStore.exception.ReadOnly; 298 throw Clipperz.PM.Proxy.Offline.DataStore.exception.ReadOnly;
302 } 299 }
303 300
304 result = { 301 result = {
305 result: { 302 result: {
306 'lock': this.data()['users'][someParameters['credentials']['C']]['lock'], 303 'lock': this.data()['users'][someParameters['credentials']['C']]['lock'],
307 'result':'done' 304 'result':'done'
308 }, 305 },
309 toll: this.getTollForRequestType('CONNECT') 306 toll: this.getTollForRequestType('CONNECT')
310 } 307 }
311 308
312 return result; 309 return result;
313 }, 310 },
314 311
315 //------------------------------------------------------------------------- 312 //-------------------------------------------------------------------------
316 313
317 '_handshake': function(aConnection, someParameters) { 314 '_handshake': function(aConnection, someParameters) {
318 var result; 315 var result;
319 varnextTollRequestType; 316 varnextTollRequestType;
320 317
321 result = {}; 318 result = {};
322 if (someParameters.message == "connect") { 319 if (someParameters.message == "connect") {
323 var userData; 320 var userData;
324 var randomBytes; 321 var randomBytes;
325 var v; 322 var v;
326 323
327 userData = this.data()['users'][someParameters.parameters.C]; 324 userData = this.data()['users'][someParameters.parameters.C];
328 325
329 if ((typeof(userData) != 'undefined') && (userData['version'] == someParameters.version)) { 326 if ((typeof(userData) != 'undefined') && (userData['version'] == someParameters.version)) {
330 aConnection['userData'] = userData; 327 aConnection['userData'] = userData;
331 aConnection['C'] = someParameters.parameters.C; 328 aConnection['C'] = someParameters.parameters.C;
332 } else { 329 } else {
333 aConnection['userData'] = this.data()['users']['catchAllUser']; 330 aConnection['userData'] = this.data()['users']['catchAllUser'];
334 } 331 }
335 332
336 randomBytes = Clipperz.Crypto.Base.generateRandomSeed(); 333 randomBytes = Clipperz.Crypto.Base.generateRandomSeed();
337 aConnection['b'] = new Clipperz.Crypto.BigInt(randomBytes, 16); 334 aConnection['b'] = new Clipperz.Crypto.BigInt(randomBytes, 16);
338 v = new Clipperz.Crypto.BigInt(aConnection['userData']['v'], 16); 335 v = new Clipperz.Crypto.BigInt(aConnection['userData']['v'], 16);
339 aConnection['B'] = v.add(Clipperz.Crypto.SRP.g().powerModule(aConnection['b'], Clipperz.Crypto.SRP.n())); 336 aConnection['B'] = v.add(Clipperz.Crypto.SRP.g().powerModule(aConnection['b'], Clipperz.Crypto.SRP.n()));
340 337
341 aConnection['A'] = someParameters.parameters.A; 338 aConnection['A'] = someParameters.parameters.A;
342 339
343 result['s'] = aConnection['userData']['s']; 340 result['s'] = aConnection['userData']['s'];
344 result['B'] = aConnection['B'].asString(16); 341 result['B'] = aConnection['B'].asString(16);
345 342
346 nextTollRequestType = 'CONNECT'; 343 nextTollRequestType = 'CONNECT';
347 } else if (someParameters.message == "credentialCheck") { 344 } else if (someParameters.message == "credentialCheck") {
348 var v, u, S, A, K, M1; 345 var v, u, S, A, K, M1;
349 346
350 v = new Clipperz.Crypto.BigInt(aConnection['userData']['v'], 16); 347 v = new Clipperz.Crypto.BigInt(aConnection['userData']['v'], 16);
351 u = new Clipperz.Crypto.BigInt(Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters.version].hash(new Clipperz.ByteArray(aConnection['B'].asString(10))).toHexString(), 16); 348 u = new Clipperz.Crypto.BigInt(Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters.version].hash(new Clipperz.ByteArray(aConnection['B'].asString(10))).toHexString(), 16);
352 A = new Clipperz.Crypto.BigInt(aConnection['A'], 16); 349 A = new Clipperz.Crypto.BigInt(aConnection['A'], 16);
353 S = (A.multiply(v.powerModule(u, Clipperz.Crypto.SRP.n()))).powerModule(aConnection['b'], Clipperz.Crypto.SRP.n()); 350 S = (A.multiply(v.powerModule(u, Clipperz.Crypto.SRP.n()))).powerModule(aConnection['b'], Clipperz.Crypto.SRP.n());
354 351
355 K = Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters.version].hash(new Clipperz.ByteArray(S.asString(10))).toHexString().slice(2); 352 K = Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters.version].hash(new Clipperz.ByteArray(S.asString(10))).toHexString().slice(2);
356 353
357 M1 = Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters.version].hash(new Clipperz.ByteArray(A.asString(10) + aConnection['B'].asString(10) + K)).toHexString().slice(2); 354 M1 = Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters.version].hash(new Clipperz.ByteArray(A.asString(10) + aConnection['B'].asString(10) + K)).toHexString().slice(2);
358 if (someParameters.parameters.M1 == M1) { 355 if (someParameters.parameters.M1 == M1) {
359 var M2; 356 var M2;
360 357
361 M2 = Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters.version].hash(new Clipperz.ByteArray(A.asString(10) + someParameters.parameters.M1 + K)).toHexString().slice(2); 358 M2 = Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters.version].hash(new Clipperz.ByteArray(A.asString(10) + someParameters.parameters.M1 + K)).toHexString().slice(2);
362 result['M2'] = M2; 359 result['M2'] = M2;
363 } else { 360 } else {
364 throw new Error("Client checksum verification failed! Expected <" + M1 + ">, received <" + someParameters.parameters.M1 + ">.", "Error"); 361 throw new Error("Client checksum verification failed! Expected <" + M1 + ">, received <" + someParameters.parameters.M1 + ">.", "Error");
365 } 362 }
366 363
367 nextTollRequestType = 'MESSAGE'; 364 nextTollRequestType = 'MESSAGE';
368 } else if (someParameters.message == "oneTimePassword") { 365 } else if (someParameters.message == "oneTimePassword") {
369 var otpData; 366 var otpData;
370 367
371 otpData = this.data()['onetimePasswords'][someParameters.parameters.oneTimePasswordKey]; 368 otpData = this.data()['onetimePasswords'][someParameters.parameters.oneTimePasswordKey];
372 369
373 try { 370 try {
374 if (typeof(otpData) != 'undefined') { 371 if (typeof(otpData) != 'undefined') {
375 if (otpData['status'] == 'ACTIVE') { 372 if (otpData['status'] == 'ACTIVE') {
376 if (otpData['key_checksum'] == someParameters.parameters.oneTimePasswordKeyChecksum) { 373 if (otpData['key_checksum'] == someParameters.parameters.oneTimePasswordKeyChecksum) {
377 result = { 374 result = {
378 'data': otpData['data'], 375 'data': otpData['data'],
379 'version':otpData['version'] 376 'version':otpData['version']
380 } 377 }
381 378
382 otpData['status'] = 'REQUESTED'; 379 otpData['status'] = 'REQUESTED';
383 } else { 380 } else {
384 otpData['status'] = 'DISABLED'; 381 otpData['status'] = 'DISABLED';
385 throw "The requested One Time Password has been disabled, due to a wrong keyChecksum"; 382 throw "The requested One Time Password has been disabled, due to a wrong keyChecksum";
386 } 383 }
387 } else { 384 } else {
388 throw "The requested One Time Password was not active"; 385 throw "The requested One Time Password was not active";
389 } 386 }
390 } else { 387 } else {
391 throw "The requested One Time Password has not been found" 388 throw "The requested One Time Password has not been found"
392 } 389 }
393 } catch (exception) { 390 } catch (exception) {
394 result = { 391 result = {
395 'data': Clipperz.PM.Crypto.randomKey(), 392 'data': Clipperz.PM.Crypto.randomKey(),
396 'version':Clipperz.PM.Connection.communicationProtocol.currentVersion 393 'version':Clipperz.PM.Connection.communicationProtocol.currentVersion
397 } 394 }
398 } 395 }
399 nextTollRequestType = 'CONNECT'; 396 nextTollRequestType = 'CONNECT';
400 } else { 397 } else {
401 MochiKit.Logging.logError("Clipperz.PM.Proxy.Test.handshake - unhandled message: " + someParameters.message); 398 MochiKit.Logging.logError("Clipperz.PM.Proxy.Test.handshake - unhandled message: " + someParameters.message);
402 } 399 }
403 400
404 result = { 401 result = {
405 result: result, 402 result: result,
406 toll: this.getTollForRequestType(nextTollRequestType) 403 toll: this.getTollForRequestType(nextTollRequestType)
407 } 404 }
408 405
diff --git a/frontend/gamma/js/Clipperz/PM/Proxy/Proxy.Offline.js b/frontend/gamma/js/Clipperz/PM/Proxy/Proxy.Offline.js
index a15b223..a86ac4f 100644
--- a/frontend/gamma/js/Clipperz/PM/Proxy/Proxy.Offline.js
+++ b/frontend/gamma/js/Clipperz/PM/Proxy/Proxy.Offline.js
@@ -1,67 +1,64 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
30if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } 27if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
31 28
32//============================================================================= 29//=============================================================================
33 30
34Clipperz.PM.Proxy.Offline = function(args) { 31Clipperz.PM.Proxy.Offline = function(args) {
35 args = args || {}; 32 args = args || {};
36 33
37 Clipperz.PM.Proxy.Offline.superclass.constructor.call(this, args); 34 Clipperz.PM.Proxy.Offline.superclass.constructor.call(this, args);
38 35
39 this._dataStore = args.dataStore || new Clipperz.PM.Proxy.Offline.DataStore(args); 36 this._dataStore = args.dataStore || new Clipperz.PM.Proxy.Offline.DataStore(args);
40 37
41 return this; 38 return this;
42} 39}
43 40
44Clipperz.Base.extend(Clipperz.PM.Proxy.Offline, Clipperz.PM.Proxy, { 41Clipperz.Base.extend(Clipperz.PM.Proxy.Offline, Clipperz.PM.Proxy, {
45 42
46 'toString': function () { 43 'toString': function () {
47 return "Clipperz.PM.Proxy.Offline"; 44 return "Clipperz.PM.Proxy.Offline";
48 }, 45 },
49 46
50 //------------------------------------------------------------------------- 47 //-------------------------------------------------------------------------
51 48
52 'dataStore': function () { 49 'dataStore': function () {
53 return this._dataStore; 50 return this._dataStore;
54 }, 51 },
55 52
56 //------------------------------------------------------------------------- 53 //-------------------------------------------------------------------------
57 54
58 'sendMessage': function(aFunctionName, someParameters) { 55 'sendMessage': function(aFunctionName, someParameters) {
59 return this.dataStore().processMessage(aFunctionName, someParameters); 56 return this.dataStore().processMessage(aFunctionName, someParameters);
60 }, 57 },
61 58
62 //------------------------------------------------------------------------- 59 //-------------------------------------------------------------------------
63 60
64 __syntaxFix__: "syntax fix" 61 __syntaxFix__: "syntax fix"
65 62
66}); 63});
67 64
diff --git a/frontend/gamma/js/Clipperz/PM/Proxy/Proxy.Test.js b/frontend/gamma/js/Clipperz/PM/Proxy/Proxy.Test.js
index be1c337..d554c6a 100644
--- a/frontend/gamma/js/Clipperz/PM/Proxy/Proxy.Test.js
+++ b/frontend/gamma/js/Clipperz/PM/Proxy/Proxy.Test.js
@@ -1,167 +1,164 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
30if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } 27if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
31if (typeof(Clipperz.PM.Proxy) == 'undefined') { Clipperz.PM.Proxy = {}; } 28if (typeof(Clipperz.PM.Proxy) == 'undefined') { Clipperz.PM.Proxy = {}; }
32 29
33//============================================================================= 30//=============================================================================
34 31
35Clipperz.PM.Proxy.Test = function(args) { 32Clipperz.PM.Proxy.Test = function(args) {
36 Clipperz.PM.Proxy.Test.superclass.constructor.call(this, args); 33 Clipperz.PM.Proxy.Test.superclass.constructor.call(this, args);
37 34
38 args = args || {}; 35 args = args || {};
39 36
40 this._expectedRequests = (args.shouldCheckExpectedRequests === true) ? [] : null; 37 this._expectedRequests = (args.shouldCheckExpectedRequests === true) ? [] : null;
41 this._isExpectingRequests = true; 38 this._isExpectingRequests = true;
42 this._unexpectedRequests = []; 39 this._unexpectedRequests = [];
43 40
44 this.dataStore().resetData(); 41 this.dataStore().resetData();
45 42
46 return this; 43 return this;
47} 44}
48 45
49Clipperz.Base.extend(Clipperz.PM.Proxy.Test, Clipperz.PM.Proxy.Offline, { 46Clipperz.Base.extend(Clipperz.PM.Proxy.Test, Clipperz.PM.Proxy.Offline, {
50 47
51 'toString': function() { 48 'toString': function() {
52 return "Clipperz.PM.Proxy.Test"; 49 return "Clipperz.PM.Proxy.Test";
53 }, 50 },
54 51
55 //========================================================================= 52 //=========================================================================
56 53
57 'expectedRequests': function () { 54 'expectedRequests': function () {
58 return this._expectedRequests; 55 return this._expectedRequests;
59 }, 56 },
60 57
61 //------------------------------------------------------------------------- 58 //-------------------------------------------------------------------------
62 59
63 'shouldCheckExpectedRequests': function () { 60 'shouldCheckExpectedRequests': function () {
64 return (this._expectedRequests != null); 61 return (this._expectedRequests != null);
65 }, 62 },
66 63
67 'setShouldCheckExpectedRequests': function(aValue) { 64 'setShouldCheckExpectedRequests': function(aValue) {
68 if (aValue) { 65 if (aValue) {
69 this._expectedRequests = aValue; 66 this._expectedRequests = aValue;
70 } else { 67 } else {
71 this._expectedRequests = null; 68 this._expectedRequests = null;
72 } 69 }
73 }, 70 },
74 71
75 //------------------------------------------------------------------------- 72 //-------------------------------------------------------------------------
76 73
77 'shouldNotReceiveAnyFurtherRequest': function () { 74 'shouldNotReceiveAnyFurtherRequest': function () {
78 this._isExpectingRequests = false; 75 this._isExpectingRequests = false;
79 }, 76 },
80 77
81 'mayReceiveMoreRequests': function () { 78 'mayReceiveMoreRequests': function () {
82 this._isExpectingRequests = true; 79 this._isExpectingRequests = true;
83 this.resetUnexpectedRequests(); 80 this.resetUnexpectedRequests();
84 }, 81 },
85 82
86 'isExpectingRequests': function () { 83 'isExpectingRequests': function () {
87 return this._isExpectingRequests; 84 return this._isExpectingRequests;
88 }, 85 },
89 86
90 //------------------------------------------------------------------------- 87 //-------------------------------------------------------------------------
91 88
92 'unexpectedRequests': function () { 89 'unexpectedRequests': function () {
93 return this._unexpectedRequests; 90 return this._unexpectedRequests;
94 }, 91 },
95 92
96 'resetUnexpectedRequests': function () { 93 'resetUnexpectedRequests': function () {
97 this._unexpectedRequests = []; 94 this._unexpectedRequests = [];
98 }, 95 },
99 96
100 //------------------------------------------------------------------------- 97 //-------------------------------------------------------------------------
101 98
102 'testExpectedRequestParameters': function (aPath, anActualRequest, anExpectedRequest) { 99 'testExpectedRequestParameters': function (aPath, anActualRequest, anExpectedRequest) {
103 var aKey; 100 var aKey;
104//console.log(">>> Proxy.testExpectedRequestParameters [" + aPath + "]", anActualRequest, anExpectedRequest); 101//console.log(">>> Proxy.testExpectedRequestParameters [" + aPath + "]", anActualRequest, anExpectedRequest);
105 for (aKey in anExpectedRequest) { 102 for (aKey in anExpectedRequest) {
106 if (typeof(anActualRequest[aKey]) == 'undefined') { 103 if (typeof(anActualRequest[aKey]) == 'undefined') {
107 throw "the expected paramter [" + aKey + "] is missing from the actual request"; 104 throw "the expected paramter [" + aKey + "] is missing from the actual request";
108 } 105 }
109 if (typeof(anExpectedRequest[aKey]) == 'object') { 106 if (typeof(anExpectedRequest[aKey]) == 'object') {
110 this.testExpectedRequestParameters(aPath + "." + aKey, anActualRequest[aKey], anExpectedRequest[aKey]) 107 this.testExpectedRequestParameters(aPath + "." + aKey, anActualRequest[aKey], anExpectedRequest[aKey])
111 } else { 108 } else {
112 if (! anExpectedRequest[aKey](anActualRequest[aKey])) { 109 if (! anExpectedRequest[aKey](anActualRequest[aKey])) {
113 throw "wrong value for paramter [" + aKey + "]; got '" + anActualRequest[aKey] + "'"; 110 throw "wrong value for paramter [" + aKey + "]; got '" + anActualRequest[aKey] + "'";
114 } 111 }
115 } 112 }
116 } 113 }
117//console.log("<<< Proxy.testExpectedRequestParameters"); 114//console.log("<<< Proxy.testExpectedRequestParameters");
118 }, 115 },
119 116
120 //------------------------------------------------------------------------- 117 //-------------------------------------------------------------------------
121 118
122 'checkRequest': function(aFunctionName, someParameters) { 119 'checkRequest': function(aFunctionName, someParameters) {
123 if (this.shouldCheckExpectedRequests()) { 120 if (this.shouldCheckExpectedRequests()) {
124 var expectedRequest; 121 var expectedRequest;
125 122
126//console.log(">>> Proxy.Test.checkRequest - " + aFunctionName, someParameters); 123//console.log(">>> Proxy.Test.checkRequest - " + aFunctionName, someParameters);
127 expectedRequest = this.expectedRequests().pop(); 124 expectedRequest = this.expectedRequests().pop();
128//console.log("--- Proxy.Test.checkRequest - expectedRequest", expectedRequest); 125//console.log("--- Proxy.Test.checkRequest - expectedRequest", expectedRequest);
129 if (expectedRequest == null) { 126 if (expectedRequest == null) {
130 throw "Proxy.Test.sentMessage: no expected result specified. Got request '" + aFunctionName + "': " + someParameters; 127 throw "Proxy.Test.sentMessage: no expected result specified. Got request '" + aFunctionName + "': " + someParameters;
131 } 128 }
132 129
133 try { 130 try {
134 if (aFunctionName != expectedRequest.functionName) { 131 if (aFunctionName != expectedRequest.functionName) {
135 throw "wrong function name. Got '" + aFunctionName + "', expected '" + expectedRequest.request.functionName + "'"; 132 throw "wrong function name. Got '" + aFunctionName + "', expected '" + expectedRequest.request.functionName + "'";
136 } 133 }
137 134
138 this.testExpectedRequestParameters("parameters", someParameters, expectedRequest.parameters); 135 this.testExpectedRequestParameters("parameters", someParameters, expectedRequest.parameters);
139 } catch(exception) { 136 } catch(exception) {
140//console.log("EXCEPTION: Proxy.Test.sentMessage[" + expectedRequest.name + "]", exception) 137//console.log("EXCEPTION: Proxy.Test.sentMessage[" + expectedRequest.name + "]", exception)
141 throw "Proxy.Test.sentMessage[" + expectedRequest.name + "]: " + exception; 138 throw "Proxy.Test.sentMessage[" + expectedRequest.name + "]: " + exception;
142 } 139 }
143 } 140 }
144//console.log("<<< Proxy.Test.checkRequest"); 141//console.log("<<< Proxy.Test.checkRequest");
145 }, 142 },
146 143
147 //========================================================================= 144 //=========================================================================
148 145
149 'sendMessage': function(aFunctionName, someParameters) { 146 'sendMessage': function(aFunctionName, someParameters) {
150 var result; 147 var result;
151 148
152 if (this.isExpectingRequests() == false) { 149 if (this.isExpectingRequests() == false) {
153 // throw Clipperz.PM.Connection.exception.UnexpectedRequest; 150 // throw Clipperz.PM.Connection.exception.UnexpectedRequest;
154Clipperz.log("UNEXPECTED REQUEST " + aFunctionName /* + ": " + Clipperz.Base.serializeJSON(someParameters) */); 151Clipperz.log("UNEXPECTED REQUEST " + aFunctionName /* + ": " + Clipperz.Base.serializeJSON(someParameters) */);
155 this.unexpectedRequests().push({'functionName':aFunctionName, 'someParameters': someParameters}); 152 this.unexpectedRequests().push({'functionName':aFunctionName, 'someParameters': someParameters});
156 }; 153 };
157 this.checkRequest(aFunctionName, someParameters); 154 this.checkRequest(aFunctionName, someParameters);
158 result = Clipperz.PM.Proxy.Test.superclass.sendMessage.call(this, aFunctionName, someParameters); 155 result = Clipperz.PM.Proxy.Test.superclass.sendMessage.call(this, aFunctionName, someParameters);
159 156
160 return result; 157 return result;
161 }, 158 },
162 159
163 //========================================================================= 160 //=========================================================================
164 __syntaxFix__: "syntax fix" 161 __syntaxFix__: "syntax fix"
165 162
166}); 163});
167 164
diff --git a/frontend/gamma/js/Clipperz/PM/Strings.js b/frontend/gamma/js/Clipperz/PM/Strings.js
index 43ef21f..a051365 100644
--- a/frontend/gamma/js/Clipperz/PM/Strings.js
+++ b/frontend/gamma/js/Clipperz/PM/Strings.js
@@ -1,295 +1,292 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
30if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } 27if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
31if (typeof(Clipperz.PM.Strings) == 'undefined') { Clipperz.PM.Strings = {}; } 28if (typeof(Clipperz.PM.Strings) == 'undefined') { Clipperz.PM.Strings = {}; }
32if (typeof(Clipperz.PM.Strings.Languages) == 'undefined') { Clipperz.PM.Strings.Languages = {}; } 29if (typeof(Clipperz.PM.Strings.Languages) == 'undefined') { Clipperz.PM.Strings.Languages = {}; }
33 30
34//----------------------------------------------------------------------------- 31//-----------------------------------------------------------------------------
35/* 32/*
36Clipperz.PM.Strings.standardStrings = { 33Clipperz.PM.Strings.standardStrings = {
37 'loginPanelSwitchLanguageSelectOptions':[ 34 'loginPanelSwitchLanguageSelectOptions':[
38/ * 35/ *
39 {tag:'option', html:"Arabic (Oman) (العربية)", value:'ar-OM', disabled:true}, 36 {tag:'option', html:"Arabic (Oman) (العربية)", value:'ar-OM', disabled:true},
40 {tag:'option', html:"Arabic (Syria) (العربية)", value:'ar-SY', disabled:true}, 37 {tag:'option', html:"Arabic (Syria) (العربية)", value:'ar-SY', disabled:true},
41 {tag:'option', html:"Bahasa Indonesia", value:'id-ID', disabled:true}, 38 {tag:'option', html:"Bahasa Indonesia", value:'id-ID', disabled:true},
42 {tag:'option', html:"Bulgarian (Български)", value:'bg-BG', disabled:true}, 39 {tag:'option', html:"Bulgarian (Български)", value:'bg-BG', disabled:true},
43 {tag:'option', html:"Català", value:'ca-ES', disabled:true}, 40 {tag:'option', html:"Català", value:'ca-ES', disabled:true},
44 {tag:'option', html:"Chinese (Simplified) (简体中文)", value:'zh-CN', disabled:true}, 41 {tag:'option', html:"Chinese (Simplified) (简体中文)", value:'zh-CN', disabled:true},
45 {tag:'option', html:"Chinese (Traditional) (正體中文)", value:'zh-TW', disabled:true}, 42 {tag:'option', html:"Chinese (Traditional) (正體中文)", value:'zh-TW', disabled:true},
46 {tag:'option', html:"Czech (Česky)", value:'cs-CZ', disabled:true}, 43 {tag:'option', html:"Czech (Česky)", value:'cs-CZ', disabled:true},
47 {tag:'option', html:"Dansk", value:'da-DK', disabled:true}, 44 {tag:'option', html:"Dansk", value:'da-DK', disabled:true},
48 {tag:'option', html:"Deutsch", value:'de-DE'/ *, disabled:true* /}, 45 {tag:'option', html:"Deutsch", value:'de-DE'/ *, disabled:true* /},
49 {tag:'option', html:"English (American)", value:'en-US'/ *, disabled:true* /}, 46 {tag:'option', html:"English (American)", value:'en-US'/ *, disabled:true* /},
50 {tag:'option', html:"English (British)", value:'en-GB'/ *, disabled:true* /}, 47 {tag:'option', html:"English (British)", value:'en-GB'/ *, disabled:true* /},
51 {tag:'option', html:"English (Canadian)", value:'en-CA'/ *, disabled:true* /}, 48 {tag:'option', html:"English (Canadian)", value:'en-CA'/ *, disabled:true* /},
52 {tag:'option', html:"Español", value:'es-ES', disabled:true}, 49 {tag:'option', html:"Español", value:'es-ES', disabled:true},
53 {tag:'option', html:"Eesti", value:'et-EE', disabled:true}, 50 {tag:'option', html:"Eesti", value:'et-EE', disabled:true},
54 {tag:'option', html:"Français", value:'fr-FR', disabled:true}, 51 {tag:'option', html:"Français", value:'fr-FR', disabled:true},
55 {tag:'option', html:"Galego", value:'gl-ES', disabled:true}, 52 {tag:'option', html:"Galego", value:'gl-ES', disabled:true},
56 {tag:'option', html:"Greek (Ελληνικά)", value:'el-GR', disabled:true}, 53 {tag:'option', html:"Greek (Ελληνικά)", value:'el-GR', disabled:true},
57 {tag:'option', html:"Íslenska", value:'is-IS', disabled:true}, 54 {tag:'option', html:"Íslenska", value:'is-IS', disabled:true},
58 {tag:'option', html:"Italiano", value:'it-IT'/ *, disabled:true* /}, 55 {tag:'option', html:"Italiano", value:'it-IT'/ *, disabled:true* /},
59 {tag:'option', html:"Japanese (日本語)", value:'ja-JP', disabled:true}, 56 {tag:'option', html:"Japanese (日本語)", value:'ja-JP', disabled:true},
60 {tag:'option', html:"Korean (한국어)", value:'ko-KR', disabled:true}, 57 {tag:'option', html:"Korean (한국어)", value:'ko-KR', disabled:true},
61 {tag:'option', html:"Latviešu", value:'lv-LV', disabled:true}, 58 {tag:'option', html:"Latviešu", value:'lv-LV', disabled:true},
62 {tag:'option', html:"Lietuvių", value:'lt-LT', disabled:true}, 59 {tag:'option', html:"Lietuvių", value:'lt-LT', disabled:true},
63 {tag:'option', html:"Macedonian (Македонски)", value:'mk-MK', disabled:true}, 60 {tag:'option', html:"Macedonian (Македонски)", value:'mk-MK', disabled:true},
64 {tag:'option', html:"Magyar", value:'hu-HU', disabled:true}, 61 {tag:'option', html:"Magyar", value:'hu-HU', disabled:true},
65 {tag:'option', html:"Nederlands", value:'nl-NL', disabled:true}, 62 {tag:'option', html:"Nederlands", value:'nl-NL', disabled:true},
66 {tag:'option', html:"Norsk bokmål", value:'nb-NO', disabled:true}, 63 {tag:'option', html:"Norsk bokmål", value:'nb-NO', disabled:true},
67 {tag:'option', html:"Norsk nynorsk", value:'nn-NO', disabled:true}, 64 {tag:'option', html:"Norsk nynorsk", value:'nn-NO', disabled:true},
68 {tag:'option', html:"Persian (Western) (فارسى)", value:'fa-IR', disabled:true}, 65 {tag:'option', html:"Persian (Western) (فارسى)", value:'fa-IR', disabled:true},
69 {tag:'option', html:"Polski", value:'pl-PL', disabled:true}, 66 {tag:'option', html:"Polski", value:'pl-PL', disabled:true},
70 {tag:'option', html:"Português", value:'pt-PT'/ *, disabled:true* /}, 67 {tag:'option', html:"Português", value:'pt-PT'/ *, disabled:true* /},
71 {tag:'option', html:"Português Brasileiro", value:'pt-BR'/ *, disabled:true* /}, 68 {tag:'option', html:"Português Brasileiro", value:'pt-BR'/ *, disabled:true* /},
72 {tag:'option', html:"Românä", value:'ro-RO', disabled:true}, 69 {tag:'option', html:"Românä", value:'ro-RO', disabled:true},
73 {tag:'option', html:"Russian (Русский)", value:'ru-RU', disabled:true}, 70 {tag:'option', html:"Russian (Русский)", value:'ru-RU', disabled:true},
74 {tag:'option', html:"Slovak (Slovenčina)", value:'sk-SK', disabled:true}, 71 {tag:'option', html:"Slovak (Slovenčina)", value:'sk-SK', disabled:true},
75 {tag:'option', html:"Slovenian (Slovenščina)", value:'sl-SI', disabled:true}, 72 {tag:'option', html:"Slovenian (Slovenščina)", value:'sl-SI', disabled:true},
76 {tag:'option', html:"Suomi", value:'fi-FI', disabled:true}, 73 {tag:'option', html:"Suomi", value:'fi-FI', disabled:true},
77 {tag:'option', html:"Svenska", value:'sv-SE', disabled:true}, 74 {tag:'option', html:"Svenska", value:'sv-SE', disabled:true},
78 {tag:'option', html:"Thai (ไทย)", value:'th-TH', disabled:true}, 75 {tag:'option', html:"Thai (ไทย)", value:'th-TH', disabled:true},
79 {tag:'option', html:"Türkçe", value:'tr-TR', disabled:true}, 76 {tag:'option', html:"Türkçe", value:'tr-TR', disabled:true},
80 {tag:'option', html:"Ukrainian (Українська)", value:'uk-UA', disabled:true} 77 {tag:'option', html:"Ukrainian (Українська)", value:'uk-UA', disabled:true}
81* / 78* /
82 {tag:'option', html:"Arabic (العربية)", value:"ar", disabled:true, cls:'disabledOption'}, 79 {tag:'option', html:"Arabic (العربية)", value:"ar", disabled:true, cls:'disabledOption'},
83 // {tag:'option', html:"Chinese (中文)", value:"zh", disabled:true}, 80 // {tag:'option', html:"Chinese (中文)", value:"zh", disabled:true},
84 {tag:'option', html:"Chinese (Simplified) (简体中文)", value:'zh-CN'}, 81 {tag:'option', html:"Chinese (Simplified) (简体中文)", value:'zh-CN'},
85 {tag:'option', html:"Dutch (Nederlands)", value:"nl-NL", disabled:true, cls:'disabledOption'}, 82 {tag:'option', html:"Dutch (Nederlands)", value:"nl-NL", disabled:true, cls:'disabledOption'},
86 {tag:'option', html:"English", value:"en-US"}, 83 {tag:'option', html:"English", value:"en-US"},
87 {tag:'option', html:"French (Français)", value:"fr-FR"}, 84 {tag:'option', html:"French (Français)", value:"fr-FR"},
88 {tag:'option', html:"German (Deutsch)", value:"de-DE", disabled:true, cls:'disabledOption'}, 85 {tag:'option', html:"German (Deutsch)", value:"de-DE", disabled:true, cls:'disabledOption'},
89 {tag:'option', html:"Greek (Ελληνικά)", value:"el-GR", disabled:true, cls:'disabledOption'}, 86 {tag:'option', html:"Greek (Ελληνικά)", value:"el-GR", disabled:true, cls:'disabledOption'},
90 {tag:'option', html:"Hebrew (עברית)", value:"he-IL", disabled:true, cls:'disabledOption'}, 87 {tag:'option', html:"Hebrew (עברית)", value:"he-IL", disabled:true, cls:'disabledOption'},
91 {tag:'option', html:"Italian (Italiano)", value:"it-IT"}, 88 {tag:'option', html:"Italian (Italiano)", value:"it-IT"},
92 {tag:'option', html:"Japanese (日本語)", value:"ja-JP"}, 89 {tag:'option', html:"Japanese (日本語)", value:"ja-JP"},
93 {tag:'option', html:"Korean (한국어)", value:"ko-KR", disabled:true, cls:'disabledOption'}, 90 {tag:'option', html:"Korean (한국어)", value:"ko-KR", disabled:true, cls:'disabledOption'},
94 {tag:'option', html:"Norwegian (Norsk)", value:"no", disabled:true, cls:'disabledOption'}, 91 {tag:'option', html:"Norwegian (Norsk)", value:"no", disabled:true, cls:'disabledOption'},
95 {tag:'option', html:"Persian (فارسی)", value:"fa-IR", disabled:true, cls:'disabledOption'}, 92 {tag:'option', html:"Persian (فارسی)", value:"fa-IR", disabled:true, cls:'disabledOption'},
96 {tag:'option', html:"Polish (Polski)", value:"pl-PL", disabled:true, cls:'disabledOption'}, 93 {tag:'option', html:"Polish (Polski)", value:"pl-PL", disabled:true, cls:'disabledOption'},
97 {tag:'option', html:"Portuguese (Português)", value:"pt-BR"}, 94 {tag:'option', html:"Portuguese (Português)", value:"pt-BR"},
98 {tag:'option', html:"Russian (Русский)", value:"ru-RU", disabled:true, cls:'disabledOption'}, 95 {tag:'option', html:"Russian (Русский)", value:"ru-RU", disabled:true, cls:'disabledOption'},
99 {tag:'option', html:"Spanish (Español)", value:"es-ES"}, 96 {tag:'option', html:"Spanish (Español)", value:"es-ES"},
100 {tag:'option', html:"Swedish (Svenska)", value:"sv-SE", disabled:true, cls:'disabledOption'}, 97 {tag:'option', html:"Swedish (Svenska)", value:"sv-SE", disabled:true, cls:'disabledOption'},
101 {tag:'option', html:"Turkish (Türkçe)", value:"tr-TR", disabled:true, cls:'disabledOption'}, 98 {tag:'option', html:"Turkish (Türkçe)", value:"tr-TR", disabled:true, cls:'disabledOption'},
102 {tag:'option', html:"Vietnamese (Tiếng Việt)", value:"vi-VN", disabled:true, cls:'disabledOption'} 99 {tag:'option', html:"Vietnamese (Tiếng Việt)", value:"vi-VN", disabled:true, cls:'disabledOption'}
103 ] 100 ]
104} 101}
105*/ 102*/
106 103
107Clipperz.PM.Strings.GeneralSettings = { 104Clipperz.PM.Strings.GeneralSettings = {
108 'defaults': { 105 'defaults': {
109 // 'loginFormAarghThatsBadUrl':"http://www.clipperz.com/support/faq/account_faq", 106 // 'loginFormAarghThatsBadUrl':"http://www.clipperz.com/support/faq/account_faq",
110 // 'loginFormVerifyTheCodeUrl':"http://www.clipperz.com/learn_more/reviewing_the_code", 107 // 'loginFormVerifyTheCodeUrl':"http://www.clipperz.com/learn_more/reviewing_the_code",
111 108
112 // 'donateHeaderLinkUrl': "http://www.clipperz.com/donations", 109 // 'donateHeaderLinkUrl': "http://www.clipperz.com/donations",
113 // 'creditsHeaderLinkUrl': "http://www.clipperz.com/credits", 110 // 'creditsHeaderLinkUrl': "http://www.clipperz.com/credits",
114 // 'feedbackHeaderLinkUrl': "http://www.clipperz.com/contact", 111 // 'feedbackHeaderLinkUrl': "http://www.clipperz.com/contact",
115 // 'helpHeaderLinkUrl': "http://www.clipperz.com/support/user_guide", 112 // 'helpHeaderLinkUrl': "http://www.clipperz.com/support/user_guide",
116 // 'forumHeaderLinkUrl': "http://www.clipperz.com/forum", 113 // 'forumHeaderLinkUrl': "http://www.clipperz.com/forum",
117 114
118 // 'httpAuthBookmarkletConfiguration':{tag:'textarea', id:'httpAuthDefaultConfiguration', html:"" + 115 // 'httpAuthBookmarkletConfiguration':{tag:'textarea', id:'httpAuthDefaultConfiguration', html:"" +
119 // "{ \"page\":{\"title\":\"HTTP authentication\"}," + "\n" + 116 // "{ \"page\":{\"title\":\"HTTP authentication\"}," + "\n" +
120 // " \"form\":{\"attributes\": {" + "\n" + 117 // " \"form\":{\"attributes\": {" + "\n" +
121 // " \"action\":\"\"," + "\n" + 118 // " \"action\":\"\"," + "\n" +
122 // " \"type\":\"http_auth\"" + "\n" + 119 // " \"type\":\"http_auth\"" + "\n" +
123 // " }, \"inputs\": [" + "\n" + 120 // " }, \"inputs\": [" + "\n" +
124 // " {\"type\":\"text\",\"name\":\"url\",\"value\":\"\"}," + "\n" + 121 // " {\"type\":\"text\",\"name\":\"url\",\"value\":\"\"}," + "\n" +
125 // " {\"type\":\"text\",\"name\":\"username\",\"value\":\"\"}," + "\n" + 122 // " {\"type\":\"text\",\"name\":\"username\",\"value\":\"\"}," + "\n" +
126 // " {\"type\":\"password\",\"name\":\"password\",\"value\":\"\"}" + "\n" + 123 // " {\"type\":\"password\",\"name\":\"password\",\"value\":\"\"}" + "\n" +
127 // " ]}, \"version\":\"0.2.3\"}" 124 // " ]}, \"version\":\"0.2.3\"}"
128 // }, 125 // },
129 126
130 'directLoginJumpPageUrl':"", 127 'directLoginJumpPageUrl':"",
131 'defaultFaviconUrl': "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=", 128 'defaultFaviconUrl': "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=",
132 'defaultFaviconUrl_IE': "https://www.clipperz.com/images/icons/misc/favicon.ico", 129 'defaultFaviconUrl_IE': "https://www.clipperz.com/images/icons/misc/favicon.ico",
133 130
134 // 'icons_baseUrl':"https://www.clipperz.com/images/icons", 131 // 'icons_baseUrl':"https://www.clipperz.com/images/icons",
135 132
136 // 'passwordGeneratorLowercaseCharset':"abcdefghijklmnopqrstuvwxyz", 133 // 'passwordGeneratorLowercaseCharset':"abcdefghijklmnopqrstuvwxyz",
137 // 'passwordGeneratorUppercaseCharset':"ABCDEFGHIJKLMNOPQRSTUVWXYZ", 134 // 'passwordGeneratorUppercaseCharset':"ABCDEFGHIJKLMNOPQRSTUVWXYZ",
138 // 'passwordGeneratorNumberCharset': "0123456789", 135 // 'passwordGeneratorNumberCharset': "0123456789",
139 // 'passwordGeneratorSymbolCharset': "!@#$%^&*+?[]{}/|\\<>,.;:~=-_", 136 // 'passwordGeneratorSymbolCharset': "!@#$%^&*+?[]{}/|\\<>,.;:~=-_",
140 137
141 // 'passwordGenerator': { 138 // 'passwordGenerator': {
142 // 'lowercaseCharset':"abcdefghijklmnopqrstuvwxyz", 139 // 'lowercaseCharset':"abcdefghijklmnopqrstuvwxyz",
143 // 'uppercaseCharset':"ABCDEFGHIJKLMNOPQRSTUVWXYZ", 140 // 'uppercaseCharset':"ABCDEFGHIJKLMNOPQRSTUVWXYZ",
144 // 'numberCharset':"0123456789", 141 // 'numberCharset':"0123456789",
145 // 'symbolCharset':"!@#$%^&*+?[]{}/|\\<>,.;:~=-_", 142 // 'symbolCharset':"!@#$%^&*+?[]{}/|\\<>,.;:~=-_",
146 // }, 143 // },
147 144
148 '_': "" 145 '_': ""
149 } 146 }
150} 147}
151 148
152Clipperz.PM.Strings.defaultLanguages = { 149Clipperz.PM.Strings.defaultLanguages = {
153 'default':"en-us", 150 'default':"en-us",
154 151
155 // 'de':"de-de", 152 // 'de':"de-de",
156 // 'el':"el-gr", 153 // 'el':"el-gr",
157 // 'he':"he-il", 154 // 'he':"he-il",
158 // 'ru':"ru-ru", 155 // 'ru':"ru-ru",
159 156
160 'fr':"fr-fr", 157 'fr':"fr-fr",
161 'es':"es-es", 158 'es':"es-es",
162 'zh':"zh-cn", 159 'zh':"zh-cn",
163 'ja':"ja-jp", 160 'ja':"ja-jp",
164 'pt':"pt-br", 161 'pt':"pt-br",
165 'it':"it-it", 162 'it':"it-it",
166 'en': "en-us" 163 'en': "en-us"
167} 164}
168 165
169Clipperz.PM.Strings.inputTypeToRecordFieldType = { 166Clipperz.PM.Strings.inputTypeToRecordFieldType = {
170 'text': 'TXT', 167 'text': 'TXT',
171 'password': 'PWD', 168 'password': 'PWD',
172 'checkbox': 'CHECK', 169 'checkbox': 'CHECK',
173 'radio': 'RADIO', 170 'radio': 'RADIO',
174 'select': 'SELECT' 171 'select': 'SELECT'
175}; 172};
176 173
177//----------------------------------------------------------------------------- 174//-----------------------------------------------------------------------------
178 175
179Clipperz.PM.Strings.translateBookmarklet = function (aBookmarkletString) { 176Clipperz.PM.Strings.translateBookmarklet = function (aBookmarkletString) {
180 var result; 177 var result;
181 178
182 result = aBookmarkletString; 179 result = aBookmarkletString;
183 180
184 result = result.replace(/@BOOKMARKLET_NO_EXCEPTION_MESSAGE@/,Clipperz.PM.Strings.getValue('bookmarkletCopy.noExceptionMessage')); 181 result = result.replace(/@BOOKMARKLET_NO_EXCEPTION_MESSAGE@/,Clipperz.PM.Strings.getValue('bookmarkletCopy.noExceptionMessage'));
185 result = result.replace(/@BOOKMARKLET_EXCEPTION_MESSAGE@/, Clipperz.PM.Strings.getValue('bookmarkletCopy.exceptionMessage')); 182 result = result.replace(/@BOOKMARKLET_EXCEPTION_MESSAGE@/, Clipperz.PM.Strings.getValue('bookmarkletCopy.exceptionMessage'));
186 result = result.replace(/@BOOKMARKLET_COPY@/, Clipperz.PM.Strings.getValue('bookmarkletCopy.copy')); 183 result = result.replace(/@BOOKMARKLET_COPY@/, Clipperz.PM.Strings.getValue('bookmarkletCopy.copy'));
187 result = result.replace(/@BOOKMARKLET_SUCCESSFUL_MESSAGE@/, Clipperz.PM.Strings.getValue('bookmarkletCopy.successfulMessage')); 184 result = result.replace(/@BOOKMARKLET_SUCCESSFUL_MESSAGE@/, Clipperz.PM.Strings.getValue('bookmarkletCopy.successfulMessage'));
188 result = result.replace(/@BOOKMARKLET_FAIL_MESSAGE@/, Clipperz.PM.Strings.getValue('bookmarkletCopy.failMessage')); 185 result = result.replace(/@BOOKMARKLET_FAIL_MESSAGE@/, Clipperz.PM.Strings.getValue('bookmarkletCopy.failMessage'));
189 186
190 return result; 187 return result;
191} 188}
192 189
193//----------------------------------------------------------------------------- 190//-----------------------------------------------------------------------------
194 191
195Clipperz.PM.Strings.Languages.setSelectedLanguage = function(aLanguage) { 192Clipperz.PM.Strings.Languages.setSelectedLanguage = function(aLanguage) {
196 var language; 193 var language;
197 varselectedLanguage; 194 varselectedLanguage;
198 195
199 language = (aLanguage || Clipperz.PM.Strings.preferredLanguage || 'default').toLowerCase(); 196 language = (aLanguage || Clipperz.PM.Strings.preferredLanguage || 'default').toLowerCase();
200 if (typeof(Clipperz.PM.Strings.defaultLanguages[language]) != 'undefined') { 197 if (typeof(Clipperz.PM.Strings.defaultLanguages[language]) != 'undefined') {
201 language = Clipperz.PM.Strings.defaultLanguages[language]; 198 language = Clipperz.PM.Strings.defaultLanguages[language];
202 } 199 }
203 200
204 if (typeof(Clipperz.PM.Strings.Languages[language]) != 'undefined') { 201 if (typeof(Clipperz.PM.Strings.Languages[language]) != 'undefined') {
205 selectedLanguage = language; 202 selectedLanguage = language;
206 } else if (typeof(Clipperz.PM.Strings.defaultLanguages[language.substr(0,2)]) != 'undefined') { 203 } else if (typeof(Clipperz.PM.Strings.defaultLanguages[language.substr(0,2)]) != 'undefined') {
207 selectedLanguage = Clipperz.PM.Strings.defaultLanguages[language.substr(0,2)]; 204 selectedLanguage = Clipperz.PM.Strings.defaultLanguages[language.substr(0,2)];
208 } else { 205 } else {
209 selectedLanguage = Clipperz.PM.Strings.defaultLanguages['default']; 206 selectedLanguage = Clipperz.PM.Strings.defaultLanguages['default'];
210 } 207 }
211 208
212 if (selectedLanguage != Clipperz.PM.Strings.selectedLanguage) { 209 if (selectedLanguage != Clipperz.PM.Strings.selectedLanguage) {
213 vartranslations; 210 vartranslations;
214 211
215 Clipperz.PM.Strings.selectedLanguage = selectedLanguage; 212 Clipperz.PM.Strings.selectedLanguage = selectedLanguage;
216 213
217 translations = {}; 214 translations = {};
218 // MochiKit.Base.update(translations, Clipperz.PM.Strings.standardStrings) 215 // MochiKit.Base.update(translations, Clipperz.PM.Strings.standardStrings)
219 216
220 MochiKit.Base.updatetree(translations, Clipperz.PM.Strings.Languages['defaults']); 217 MochiKit.Base.updatetree(translations, Clipperz.PM.Strings.Languages['defaults']);
221 MochiKit.Base.updatetree(translations, Clipperz.PM.Strings.GeneralSettings['defaults']); 218 MochiKit.Base.updatetree(translations, Clipperz.PM.Strings.GeneralSettings['defaults']);
222 219
223 MochiKit.Base.updatetree(translations, Clipperz.PM.Strings.Languages[Clipperz.PM.Strings.defaultLanguages['default']]); 220 MochiKit.Base.updatetree(translations, Clipperz.PM.Strings.Languages[Clipperz.PM.Strings.defaultLanguages['default']]);
224 MochiKit.Base.updatetree(translations, Clipperz.PM.Strings.GeneralSettings[Clipperz.PM.Strings.defaultLanguages['default']]); 221 MochiKit.Base.updatetree(translations, Clipperz.PM.Strings.GeneralSettings[Clipperz.PM.Strings.defaultLanguages['default']]);
225 222
226 MochiKit.Base.updatetree(translations, Clipperz.PM.Strings.Languages[selectedLanguage]); 223 MochiKit.Base.updatetree(translations, Clipperz.PM.Strings.Languages[selectedLanguage]);
227 MochiKit.Base.updatetree(translations, Clipperz.PM.Strings.GeneralSettings[selectedLanguage]); 224 MochiKit.Base.updatetree(translations, Clipperz.PM.Strings.GeneralSettings[selectedLanguage]);
228 225
229 Clipperz.PM.Strings.stringsObjectStore = new Clipperz.KeyValueObjectStore(/*{'name':'String.stringsObjectStore [1]'}*/); 226 Clipperz.PM.Strings.stringsObjectStore = new Clipperz.KeyValueObjectStore(/*{'name':'String.stringsObjectStore [1]'}*/);
230 Clipperz.PM.Strings.stringsObjectStore.initWithValues(translations); 227 Clipperz.PM.Strings.stringsObjectStore.initWithValues(translations);
231 228
232 if (typeof(bookmarklet) != 'undefined') { 229 if (typeof(bookmarklet) != 'undefined') {
233 Clipperz.PM.Strings.stringsObjectStore.setValue('bookmarklet', Clipperz.PM.Strings.translateBookmarklet(bookmarklet)); 230 Clipperz.PM.Strings.stringsObjectStore.setValue('bookmarklet', Clipperz.PM.Strings.translateBookmarklet(bookmarklet));
234 } 231 }
235 232
236 MochiKit.Signal.signal(Clipperz.PM.Strings.Languages, 'switchLanguage', selectedLanguage); 233 MochiKit.Signal.signal(Clipperz.PM.Strings.Languages, 'switchLanguage', selectedLanguage);
237 } 234 }
238} 235}
239 236
240//----------------------------------------------------------------------------- 237//-----------------------------------------------------------------------------
241 238
242Clipperz.PM.Strings.getValue = function (aKeyPath, someKeyValues) { 239Clipperz.PM.Strings.getValue = function (aKeyPath, someKeyValues) {
243 varresult; 240 varresult;
244 241
245 result = Clipperz.PM.Strings.stringsObjectStore.getValue(aKeyPath); 242 result = Clipperz.PM.Strings.stringsObjectStore.getValue(aKeyPath);
246 243
247//try { 244//try {
248 if (typeof(result) == 'string') { 245 if (typeof(result) == 'string') {
249 if (typeof (someKeyValues) != 'undefined') { 246 if (typeof (someKeyValues) != 'undefined') {
250 varkey; 247 varkey;
251 248
252 for (key in someKeyValues) { 249 for (key in someKeyValues) {
253 result = result.replace( new RegExp(key), someKeyValues[key]); 250 result = result.replace( new RegExp(key), someKeyValues[key]);
254 // result.replace(, ''); 251 // result.replace(, '');
255 } 252 }
256 } 253 }
257 254
258 result = result.replace(new RegExp('\n'), '<br>'); 255 result = result.replace(new RegExp('\n'), '<br>');
259 } 256 }
260//} catch (exception) { 257//} catch (exception) {
261 //console.log("####", result, aKeyPath, someKeyValues, exception); 258 //console.log("####", result, aKeyPath, someKeyValues, exception);
262//} 259//}
263 260
264 return result; 261 return result;
265} 262}
266 263
267Clipperz.PM.Strings.errorDescriptionForException = function (anException) { 264Clipperz.PM.Strings.errorDescriptionForException = function (anException) {
268 var result; 265 var result;
269 266
270 result = Clipperz.PM.Strings.getValue('exceptionsMessages' + '.' + anException.name); 267 result = Clipperz.PM.Strings.getValue('exceptionsMessages' + '.' + anException.name);
271 268
272 if (result == null) { 269 if (result == null) {
273 result = anException.message; 270 result = anException.message;
274 } 271 }
275 272
276 return result; 273 return result;
277}, 274},
278 275
279//----------------------------------------------------------------------------- 276//-----------------------------------------------------------------------------
280 277
281Clipperz.PM.Strings.Languages.initSetup = function() { 278Clipperz.PM.Strings.Languages.initSetup = function() {
282 varlanguage; 279 varlanguage;
283 varlanguageParser; 280 varlanguageParser;
284 281
285 language = navigator.language || navigator.userLanguage; //en, en-US, .... "de", "nb-no" 282 language = navigator.language || navigator.userLanguage; //en, en-US, .... "de", "nb-no"
286 languageParser = new RegExp("language=([a-z]{2}(?:\-[a-z]{2})?)(\&|$)", "i"); 283 languageParser = new RegExp("language=([a-z]{2}(?:\-[a-z]{2})?)(\&|$)", "i");
287 if (languageParser.test(window.location.search)) { 284 if (languageParser.test(window.location.search)) {
288 language = RegExp.$1; 285 language = RegExp.$1;
289 } 286 }
290 287
291 Clipperz.PM.Strings.preferredLanguage = language.toLowerCase(); 288 Clipperz.PM.Strings.preferredLanguage = language.toLowerCase();
292 Clipperz.PM.Strings.Languages.setSelectedLanguage(Clipperz.PM.Strings.preferredLanguage); 289 Clipperz.PM.Strings.Languages.setSelectedLanguage(Clipperz.PM.Strings.preferredLanguage);
293} 290}
294 291
295//----------------------------------------------------------------------------- 292//-----------------------------------------------------------------------------
diff --git a/frontend/gamma/js/Clipperz/PM/Strings/MessagePanelConfigurations.js b/frontend/gamma/js/Clipperz/PM/Strings/MessagePanelConfigurations.js
index 446e96c..7f6c52f 100644
--- a/frontend/gamma/js/Clipperz/PM/Strings/MessagePanelConfigurations.js
+++ b/frontend/gamma/js/Clipperz/PM/Strings/MessagePanelConfigurations.js
@@ -1,389 +1,386 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
30if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } 27if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
31if (typeof(Clipperz.PM.Strings) == 'undefined') { Clipperz.PM.Strings = {}; } 28if (typeof(Clipperz.PM.Strings) == 'undefined') { Clipperz.PM.Strings = {}; }
32 29
33Clipperz.PM.Strings.messagePanelConfigurations = { 30Clipperz.PM.Strings.messagePanelConfigurations = {
34 31
35 32
36 //------------------------------------------------------------------------- 33 //-------------------------------------------------------------------------
37 // 34 //
38 // Registration - connection 35 // Registration - connection
39 // 36 //
40 'registration_verify': function() { 37 'registration_verify': function() {
41 return { 38 return {
42 'title': null, 39 'title': null,
43 'text': Clipperz.PM.Strings['connectionRegistrationSendingRequestMessageText'] 40 'text': Clipperz.PM.Strings['connectionRegistrationSendingRequestMessageText']
44 } 41 }
45 }, 42 },
46 43
47 'registration_sendingCredentials': function() { 44 'registration_sendingCredentials': function() {
48 return { 45 return {
49 'title': null, 46 'title': null,
50 'text': Clipperz.PM.Strings['connectionRegistrationSendingCredentialsMessageText'] 47 'text': Clipperz.PM.Strings['connectionRegistrationSendingCredentialsMessageText']
51 } 48 }
52 }, 49 },
53 50
54 //------------------------------------------------------------------------- 51 //-------------------------------------------------------------------------
55 // 52 //
56 // One Time Password login message panel 53 // One Time Password login message panel
57 // 54 //
58 55
59 'OTP_login_start': function() { 56 'OTP_login_start': function() {
60 return { 57 return {
61 'title': Clipperz.PM.Strings['OTPloginMessagePanelInitialTitle'], 58 'title': Clipperz.PM.Strings['OTPloginMessagePanelInitialTitle'],
62 'text': Clipperz.PM.Strings['OTPloginMessagePanelInitialText'], 59 'text': Clipperz.PM.Strings['OTPloginMessagePanelInitialText'],
63 'steps': '+3', 60 'steps': '+3',
64 'buttons': {} 61 'buttons': {}
65 } 62 }
66 }, 63 },
67 64
68 'OTP_login_loadingOTP': function() { 65 'OTP_login_loadingOTP': function() {
69 return { 66 return {
70 'title': Clipperz.PM.Strings['OTPloginMessagePanelLoadingTitle'], 67 'title': Clipperz.PM.Strings['OTPloginMessagePanelLoadingTitle'],
71 'text': Clipperz.PM.Strings['OTPloginMessagePanelLoadingText'] 68 'text': Clipperz.PM.Strings['OTPloginMessagePanelLoadingText']
72 } 69 }
73 }, 70 },
74 71
75 'OTP_login_extractingPassphrase': function() { 72 'OTP_login_extractingPassphrase': function() {
76 return { 73 return {
77 'title': Clipperz.PM.Strings['OTPloginMessagePanelProcessingTitle'], 74 'title': Clipperz.PM.Strings['OTPloginMessagePanelProcessingTitle'],
78 'text': Clipperz.PM.Strings['OTPloginMessagePanelProcessingText'] 75 'text': Clipperz.PM.Strings['OTPloginMessagePanelProcessingText']
79 } 76 }
80 }, 77 },
81 78
82 79
83 //------------------------------------------------------------------------- 80 //-------------------------------------------------------------------------
84 // 81 //
85 // Login message panel 82 // Login message panel
86 // 83 //
87 'login_start': function() { 84 'login_start': function() {
88 return { 85 return {
89 'title': Clipperz.PM.Strings['loginMessagePanelInitialTitle'], 86 'title': Clipperz.PM.Strings['loginMessagePanelInitialTitle'],
90 'text': Clipperz.PM.Strings['loginMessagePanelInitialText'], 87 'text': Clipperz.PM.Strings['loginMessagePanelInitialText'],
91 'steps': '+7', 88 'steps': '+7',
92 'buttons': { 89 'buttons': {
93 'ok': Clipperz.PM.Strings['loginMessagePanelInitialButtonLabel'] 90 'ok': Clipperz.PM.Strings['loginMessagePanelInitialButtonLabel']
94 } 91 }
95 } 92 }
96 }, 93 },
97 94
98 'login_connected': function() { 95 'login_connected': function() {
99 return { 96 return {
100 'title': Clipperz.PM.Strings['loginMessagePanelConnectedTitle'], 97 'title': Clipperz.PM.Strings['loginMessagePanelConnectedTitle'],
101 'text': Clipperz.PM.Strings['loginMessagePanelConnectedText'], 98 'text': Clipperz.PM.Strings['loginMessagePanelConnectedText'],
102 'buttons': {} 99 'buttons': {}
103 } 100 }
104 }, 101 },
105 102
106 'login_failed':function() { 103 'login_failed':function() {
107 return { 104 return {
108 'title': Clipperz.PM.Strings['loginMessagePanelFailureTitle'], 105 'title': Clipperz.PM.Strings['loginMessagePanelFailureTitle'],
109 'text': Clipperz.PM.Strings['loginMessagePanelFailureText'], 106 'text': Clipperz.PM.Strings['loginMessagePanelFailureText'],
110 'button': Clipperz.PM.Strings['loginMessagePanelFailureButtonLabel'] 107 'button': Clipperz.PM.Strings['loginMessagePanelFailureButtonLabel']
111 } 108 }
112 }, 109 },
113 110
114 //------------------------------------------------------------------------- 111 //-------------------------------------------------------------------------
115 // 112 //
116 // Login message panel - connection 113 // Login message panel - connection
117 // 114 //
118 'connection_sendingCredentials': function() { 115 'connection_sendingCredentials': function() {
119 return { 116 return {
120 'title': Clipperz.PM.Strings['connectionLoginSendingCredentialsMessageTitle'], 117 'title': Clipperz.PM.Strings['connectionLoginSendingCredentialsMessageTitle'],
121 'text': Clipperz.PM.Strings['connectionLoginSendingCredentialsMessageText'] 118 'text': Clipperz.PM.Strings['connectionLoginSendingCredentialsMessageText']
122 } 119 }
123 }, 120 },
124 121
125 'connection_credentialVerification': function() { 122 'connection_credentialVerification': function() {
126 return { 123 return {
127 'title': Clipperz.PM.Strings['connectionLoginCredentialsVerificationMessageTitle'], 124 'title': Clipperz.PM.Strings['connectionLoginCredentialsVerificationMessageTitle'],
128 'text': Clipperz.PM.Strings['connectionLoginCredentialsVerificationMessageText'] 125 'text': Clipperz.PM.Strings['connectionLoginCredentialsVerificationMessageText']
129 } 126 }
130 }, 127 },
131 128
132 'connection_loggedIn': function() { 129 'connection_loggedIn': function() {
133 return { 130 return {
134 'title': Clipperz.PM.Strings['connectionLoginDoneMessageTitle'], 131 'title': Clipperz.PM.Strings['connectionLoginDoneMessageTitle'],
135 'text': Clipperz.PM.Strings['connectionLoginDoneMessageText'] 132 'text': Clipperz.PM.Strings['connectionLoginDoneMessageText']
136 } 133 }
137 }, 134 },
138 135
139 //------------------------------------------------------------------------- 136 //-------------------------------------------------------------------------
140 // 137 //
141 //Login message panel - user 138 //Login message panel - user
142 // 139 //
143 'connection_upgrading': function() { 140 'connection_upgrading': function() {
144 return { 141 return {
145 'title': Clipperz.PM.Strings['userLoginPanelUpgradingUserCredentialsMessageTitle'], 142 'title': Clipperz.PM.Strings['userLoginPanelUpgradingUserCredentialsMessageTitle'],
146 'text': Clipperz.PM.Strings['userLoginPanelUpgradingUserCredentialsMessageText'], 143 'text': Clipperz.PM.Strings['userLoginPanelUpgradingUserCredentialsMessageText'],
147 'steps': '+1' 144 'steps': '+1'
148 } 145 }
149 }, 146 },
150 147
151 'connection_done': function() { 148 'connection_done': function() {
152 return { 149 return {
153 'title': Clipperz.PM.Strings['userLoginPanelConnectedMessageTitle'], 150 'title': Clipperz.PM.Strings['userLoginPanelConnectedMessageTitle'],
154 'text': Clipperz.PM.Strings['userLoginPanelConnectedMessageText'] 151 'text': Clipperz.PM.Strings['userLoginPanelConnectedMessageText']
155 } 152 }
156 }, 153 },
157 154
158 'connection_tryOlderSchema': function() { 155 'connection_tryOlderSchema': function() {
159 return { 156 return {
160 'title': Clipperz.PM.Strings['userLoginPanelTryingAnOlderConnectionSchemaMessageTitle'], 157 'title': Clipperz.PM.Strings['userLoginPanelTryingAnOlderConnectionSchemaMessageTitle'],
161 'text': Clipperz.PM.Strings['userLoginPanelTryingAnOlderConnectionSchemaMessageText'], 158 'text': Clipperz.PM.Strings['userLoginPanelTryingAnOlderConnectionSchemaMessageText'],
162 'steps': '+4' 159 'steps': '+4'
163 } 160 }
164 }, 161 },
165 162
166 'connection_loadingUserData': function() { 163 'connection_loadingUserData': function() {
167 return { 164 return {
168 'title': Clipperz.PM.Strings['userLoginPanelLoadingUserDataMessageTitle'], 165 'title': Clipperz.PM.Strings['userLoginPanelLoadingUserDataMessageTitle'],
169 'text': Clipperz.PM.Strings['userLoginPanelLoadingUserDataMessageText'] 166 'text': Clipperz.PM.Strings['userLoginPanelLoadingUserDataMessageText']
170 } 167 }
171 }, 168 },
172 169
173 'connection_decryptingUserData': function() { 170 'connection_decryptingUserData': function() {
174 return { 171 return {
175 'title': Clipperz.PM.Strings['userLoginPanelDecryptingUserDataMessageTitle'], 172 'title': Clipperz.PM.Strings['userLoginPanelDecryptingUserDataMessageTitle'],
176 'text': Clipperz.PM.Strings['userLoginPanelDecryptingUserDataMessageText'], 173 'text': Clipperz.PM.Strings['userLoginPanelDecryptingUserDataMessageText'],
177 'steps': '+1' 174 'steps': '+1'
178 } 175 }
179 }, 176 },
180 177
181 'connection_decryptingUserStatistics': function() { 178 'connection_decryptingUserStatistics': function() {
182 return { 179 return {
183 'title': Clipperz.PM.Strings['userLoginPanelDecryptingUserStatisticsMessageTitle'], 180 'title': Clipperz.PM.Strings['userLoginPanelDecryptingUserStatisticsMessageTitle'],
184 'text': Clipperz.PM.Strings['userLoginPanelDecryptingUserStatisticsMessageText'] 181 'text': Clipperz.PM.Strings['userLoginPanelDecryptingUserStatisticsMessageText']
185 } 182 }
186 }, 183 },
187 184
188 'collectingEntropy': function() { 185 'collectingEntropy': function() {
189 return { 186 return {
190 'text': Clipperz.PM.Strings['panelCollectingEntryopyMessageText'], 187 'text': Clipperz.PM.Strings['panelCollectingEntryopyMessageText'],
191 'steps': '+1' 188 'steps': '+1'
192 } 189 }
193 }, 190 },
194 191
195 //------------------------------------------------------------------------- 192 //-------------------------------------------------------------------------
196 // 193 //
197 // Cards block - delete card panel 194 // Cards block - delete card panel
198 // 195 //
199 'deleteRecord_collectData': function() { 196 'deleteRecord_collectData': function() {
200 return { 197 return {
201 'title': Clipperz.PM.Strings['deleteRecordPanelCollectRecordDataMessageTitle'], 198 'title': Clipperz.PM.Strings['deleteRecordPanelCollectRecordDataMessageTitle'],
202 'text': Clipperz.PM.Strings['deleteRecordPanelCollectRecordDataMessageText'] 199 'text': Clipperz.PM.Strings['deleteRecordPanelCollectRecordDataMessageText']
203 } 200 }
204 }, 201 },
205 202
206 'deleteRecord_encryptData': function() { 203 'deleteRecord_encryptData': function() {
207 return { 204 return {
208 'title': Clipperz.PM.Strings['deleteRecordPanelEncryptUserDataMessageTitle'], 205 'title': Clipperz.PM.Strings['deleteRecordPanelEncryptUserDataMessageTitle'],
209 'text': Clipperz.PM.Strings['deleteRecordPanelEncryptUserDataMessageText'] 206 'text': Clipperz.PM.Strings['deleteRecordPanelEncryptUserDataMessageText']
210 } 207 }
211 }, 208 },
212 209
213 'deleteRecord_sendingData': function() { 210 'deleteRecord_sendingData': function() {
214 return { 211 return {
215 'title': Clipperz.PM.Strings['deleteRecordPanelSendingDataToTheServerMessageTitle'], 212 'title': Clipperz.PM.Strings['deleteRecordPanelSendingDataToTheServerMessageTitle'],
216 'text': Clipperz.PM.Strings['deleteRecordPanelSendingDataToTheServerMessageText'] 213 'text': Clipperz.PM.Strings['deleteRecordPanelSendingDataToTheServerMessageText']
217 } 214 }
218 }, 215 },
219 216
220 'deleteRecord_updatingInterface': function() { 217 'deleteRecord_updatingInterface': function() {
221 return { 218 return {
222 'title': Clipperz.PM.Strings['deleteRecordPanelUpdatingTheInterfaceMessageTitle'], 219 'title': Clipperz.PM.Strings['deleteRecordPanelUpdatingTheInterfaceMessageTitle'],
223 'text': Clipperz.PM.Strings['deleteRecordPanelUpdatingTheInterfaceMessageText'] 220 'text': Clipperz.PM.Strings['deleteRecordPanelUpdatingTheInterfaceMessageText']
224 } 221 }
225 }, 222 },
226 223
227 224
228 //------------------------------------------------------------------------- 225 //-------------------------------------------------------------------------
229 // 226 //
230 //Cards block - save card panel 227 //Cards block - save card panel
231 // 228 //
232 'saveCard_collectRecordInfo': function() { 229 'saveCard_collectRecordInfo': function() {
233 return { 230 return {
234 'title': Clipperz.PM.Strings['recordSaveChangesPanelCollectRecordInfoMessageTitle'], 231 'title': Clipperz.PM.Strings['recordSaveChangesPanelCollectRecordInfoMessageTitle'],
235 'text': Clipperz.PM.Strings['recordSaveChangesPanelCollectRecordInfoMessageText'] 232 'text': Clipperz.PM.Strings['recordSaveChangesPanelCollectRecordInfoMessageText']
236 } 233 }
237 }, 234 },
238 235
239 'saveCard_encryptUserData': function() { 236 'saveCard_encryptUserData': function() {
240 return { 237 return {
241 'title': Clipperz.PM.Strings['recordSaveChangesPanelEncryptUserDataMessageTitle'], 238 'title': Clipperz.PM.Strings['recordSaveChangesPanelEncryptUserDataMessageTitle'],
242 'text': Clipperz.PM.Strings['recordSaveChangesPanelEncryptUserDataMessageText'] 239 'text': Clipperz.PM.Strings['recordSaveChangesPanelEncryptUserDataMessageText']
243 } 240 }
244 }, 241 },
245 242
246 'saveCard_encryptRecordData': function() { 243 'saveCard_encryptRecordData': function() {
247 return { 244 return {
248 'title': Clipperz.PM.Strings['recordSaveChangesPanelEncryptRecordDataMessageTitle'], 245 'title': Clipperz.PM.Strings['recordSaveChangesPanelEncryptRecordDataMessageTitle'],
249 'text': Clipperz.PM.Strings['recordSaveChangesPanelEncryptRecordDataMessageText'] 246 'text': Clipperz.PM.Strings['recordSaveChangesPanelEncryptRecordDataMessageText']
250 } 247 }
251 }, 248 },
252 249
253 'saveCard_encryptRecordVersions': function() { 250 'saveCard_encryptRecordVersions': function() {
254 return { 251 return {
255 'title': Clipperz.PM.Strings['recordSaveChangesPanelEncryptRecordVersionDataMessageTitle'], 252 'title': Clipperz.PM.Strings['recordSaveChangesPanelEncryptRecordVersionDataMessageTitle'],
256 'text': Clipperz.PM.Strings['recordSaveChangesPanelEncryptRecordVersionDataMessageText'] 253 'text': Clipperz.PM.Strings['recordSaveChangesPanelEncryptRecordVersionDataMessageText']
257 } 254 }
258 }, 255 },
259 256
260 'saveCard_sendingData': function() { 257 'saveCard_sendingData': function() {
261 return { 258 return {
262 'title': Clipperz.PM.Strings['recordSaveChangesPanelSendingDataToTheServerMessageTitle'], 259 'title': Clipperz.PM.Strings['recordSaveChangesPanelSendingDataToTheServerMessageTitle'],
263 'text': Clipperz.PM.Strings['recordSaveChangesPanelSendingDataToTheServerMessageText'] 260 'text': Clipperz.PM.Strings['recordSaveChangesPanelSendingDataToTheServerMessageText']
264 } 261 }
265 }, 262 },
266 263
267 'saveCard_updatingInterface': function() { 264 'saveCard_updatingInterface': function() {
268 return { 265 return {
269 'title': Clipperz.PM.Strings['recordSaveChangesPanelUpdatingTheInterfaceMessageTitle'], 266 'title': Clipperz.PM.Strings['recordSaveChangesPanelUpdatingTheInterfaceMessageTitle'],
270 'text': Clipperz.PM.Strings['recordSaveChangesPanelUpdatingTheInterfaceMessageText'] 267 'text': Clipperz.PM.Strings['recordSaveChangesPanelUpdatingTheInterfaceMessageText']
271 } 268 }
272 }, 269 },
273 270
274 //------------------------------------------------------------------------- 271 //-------------------------------------------------------------------------
275 // 272 //
276 //Account panel - user preferences 273 //Account panel - user preferences
277 // 274 //
278 'account_savingPreferences_1': function() { 275 'account_savingPreferences_1': function() {
279 return { 276 return {
280 'title': Clipperz.PM.Strings['accountPreferencesSavingPanelTitle_Step1'], 277 'title': Clipperz.PM.Strings['accountPreferencesSavingPanelTitle_Step1'],
281 'text': Clipperz.PM.Strings['accountPreferencesSavingPanelText_Step1'], 278 'text': Clipperz.PM.Strings['accountPreferencesSavingPanelText_Step1'],
282 'steps': '+3' 279 'steps': '+3'
283 } 280 }
284 }, 281 },
285 282
286 'account_savingPreferences_2': function() { 283 'account_savingPreferences_2': function() {
287 return { 284 return {
288 'title': Clipperz.PM.Strings['accountPreferencesSavingPanelTitle_Step2'], 285 'title': Clipperz.PM.Strings['accountPreferencesSavingPanelTitle_Step2'],
289 'text': Clipperz.PM.Strings['accountPreferencesSavingPanelText_Step2'] 286 'text': Clipperz.PM.Strings['accountPreferencesSavingPanelText_Step2']
290 } 287 }
291 }, 288 },
292 289
293 290
294 //------------------------------------------------------------------------- 291 //-------------------------------------------------------------------------
295 // 292 //
296 //Account panel - change credentials 293 //Account panel - change credentials
297 // 294 //
298 'changeCredentials_encryptingData': function() { 295 'changeCredentials_encryptingData': function() {
299 return { 296 return {
300 'title': Clipperz.PM.Strings['changeCredentialsPanelEncryptingDataMessageTitle'], 297 'title': Clipperz.PM.Strings['changeCredentialsPanelEncryptingDataMessageTitle'],
301 'text': Clipperz.PM.Strings['changeCredentialsPanelEncryptingDataMessageText'] 298 'text': Clipperz.PM.Strings['changeCredentialsPanelEncryptingDataMessageText']
302 } 299 }
303 }, 300 },
304 301
305 'changeCredentials_creatingNewCredentials': function() { 302 'changeCredentials_creatingNewCredentials': function() {
306 return { 303 return {
307 'title': Clipperz.PM.Strings['changeCredentialsPanelCreatingNewCredentialsMessageTitle'], 304 'title': Clipperz.PM.Strings['changeCredentialsPanelCreatingNewCredentialsMessageTitle'],
308 'text': Clipperz.PM.Strings['changeCredentialsPanelCreatingNewCredentialsMessageText'] 305 'text': Clipperz.PM.Strings['changeCredentialsPanelCreatingNewCredentialsMessageText']
309 } 306 }
310 }, 307 },
311 308
312 'changeCredentials_sendingCredentials': function() { 309 'changeCredentials_sendingCredentials': function() {
313 return { 310 return {
314 'title': Clipperz.PM.Strings['changeCredentialsPanelSendingNewCredentialsToTheServerMessageTitle'], 311 'title': Clipperz.PM.Strings['changeCredentialsPanelSendingNewCredentialsToTheServerMessageTitle'],
315 'text': Clipperz.PM.Strings['changeCredentialsPanelSendingNewCredentialsToTheServerMessageText'] 312 'text': Clipperz.PM.Strings['changeCredentialsPanelSendingNewCredentialsToTheServerMessageText']
316 } 313 }
317 }, 314 },
318 315
319 'changeCredentials_done': function() { 316 'changeCredentials_done': function() {
320 return { 317 return {
321 'title': Clipperz.PM.Strings['changeCredentialsPanelDoneMessageTitle'], 318 'title': Clipperz.PM.Strings['changeCredentialsPanelDoneMessageTitle'],
322 'text': Clipperz.PM.Strings['changeCredentialsPanelDoneMessageText'] 319 'text': Clipperz.PM.Strings['changeCredentialsPanelDoneMessageText']
323 } 320 }
324 }, 321 },
325 322
326 323
327 //------------------------------------------------------------------------- 324 //-------------------------------------------------------------------------
328 // 325 //
329 //Account panel - change credentials 326 //Account panel - change credentials
330 // 327 //
331 'saveOTP_encryptUserData': function() { 328 'saveOTP_encryptUserData': function() {
332 return { 329 return {
333 'title': Clipperz.PM.Strings['saveOTP_encryptUserDataTitle'], 330 'title': Clipperz.PM.Strings['saveOTP_encryptUserDataTitle'],
334 'text': Clipperz.PM.Strings['saveOTP_encryptUserDataText'], 331 'text': Clipperz.PM.Strings['saveOTP_encryptUserDataText'],
335 'steps': '+4' 332 'steps': '+4'
336 } 333 }
337 }, 334 },
338 335
339 'saveOTP_encryptOTPData': function() { 336 'saveOTP_encryptOTPData': function() {
340 return { 337 return {
341 'title': Clipperz.PM.Strings['saveOTP_encryptOTPDataTitle'], 338 'title': Clipperz.PM.Strings['saveOTP_encryptOTPDataTitle'],
342 'text': Clipperz.PM.Strings['saveOTP_encryptOTPDataText'] 339 'text': Clipperz.PM.Strings['saveOTP_encryptOTPDataText']
343 } 340 }
344 }, 341 },
345 342
346 'saveOTP_sendingData': function() { 343 'saveOTP_sendingData': function() {
347 return { 344 return {
348 'title': Clipperz.PM.Strings['saveOTP_sendingDataTitle'], 345 'title': Clipperz.PM.Strings['saveOTP_sendingDataTitle'],
349 'text': Clipperz.PM.Strings['saveOTP_sendingDataText'] 346 'text': Clipperz.PM.Strings['saveOTP_sendingDataText']
350 } 347 }
351 }, 348 },
352 349
353 'saveOTP_updatingInterface': function() { 350 'saveOTP_updatingInterface': function() {
354 return { 351 return {
355 'title': Clipperz.PM.Strings['saveOTP_updatingInterfaceTitle'], 352 'title': Clipperz.PM.Strings['saveOTP_updatingInterfaceTitle'],
356 'text': Clipperz.PM.Strings['saveOTP_updatingInterfaceText'] 353 'text': Clipperz.PM.Strings['saveOTP_updatingInterfaceText']
357 } 354 }
358 }, 355 },
359 356
360 357
361 //------------------------------------------------------------------------- 358 //-------------------------------------------------------------------------
362 // 359 //
363 //Data panel - processingImportData 360 //Data panel - processingImportData
364 // 361 //
365 'parseImportData': function() { 362 'parseImportData': function() {
366 return { 363 return {
367 'title': Clipperz.PM.Strings['importData_parsingDataTitle'], 364 'title': Clipperz.PM.Strings['importData_parsingDataTitle'],
368 'text': Clipperz.PM.Strings['importData_parsingDataText'] 365 'text': Clipperz.PM.Strings['importData_parsingDataText']
369 } 366 }
370 }, 367 },
371 368
372 'previewImportData': function() { 369 'previewImportData': function() {
373 return { 370 return {
374 'title': Clipperz.PM.Strings['importData_previewingDataTitle'], 371 'title': Clipperz.PM.Strings['importData_previewingDataTitle'],
375 'text': Clipperz.PM.Strings['importData_previewingDataText'] 372 'text': Clipperz.PM.Strings['importData_previewingDataText']
376 } 373 }
377 }, 374 },
378 375
379 'processingImportData': function() { 376 'processingImportData': function() {
380 return { 377 return {
381 'title': Clipperz.PM.Strings['importData_processingDataTitle'], 378 'title': Clipperz.PM.Strings['importData_processingDataTitle'],
382 'text': Clipperz.PM.Strings['importData_processingDataText'] 379 'text': Clipperz.PM.Strings['importData_processingDataText']
383 } 380 }
384 }, 381 },
385 382
386 //------------------------------------------------------------------------- 383 //-------------------------------------------------------------------------
387 __syntaxFix__: "syntax fix" 384 __syntaxFix__: "syntax fix"
388 385
389} 386}
diff --git a/frontend/gamma/js/Clipperz/PM/Strings/Strings_defaults.js b/frontend/gamma/js/Clipperz/PM/Strings/Strings_defaults.js
index 1ad2696..101ed3f 100644
--- a/frontend/gamma/js/Clipperz/PM/Strings/Strings_defaults.js
+++ b/frontend/gamma/js/Clipperz/PM/Strings/Strings_defaults.js
@@ -1,390 +1,387 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
30if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } 27if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
31if (typeof(Clipperz.PM.Strings) == 'undefined') { Clipperz.PM.Strings = {}; } 28if (typeof(Clipperz.PM.Strings) == 'undefined') { Clipperz.PM.Strings = {}; }
32if (typeof(Clipperz.PM.Strings.Languages) == 'undefined') { Clipperz.PM.Strings.Languages = {}; } 29if (typeof(Clipperz.PM.Strings.Languages) == 'undefined') { Clipperz.PM.Strings.Languages = {}; }
33 30
34//============================================================================= 31//=============================================================================
35// 32//
36 // D E F A U L T S ( defaults ) 33 // D E F A U L T S ( defaults )
37// 34//
38//============================================================================= 35//=============================================================================
39 36
40Clipperz.PM.Strings.Languages['defaults'] = { 37Clipperz.PM.Strings.Languages['defaults'] = {
41 38
42'elapsedTimeDescriptions': { 39'elapsedTimeDescriptions': {
43 'MORE_THAN_A_MONTH_AGO': "more than a month ago", 40 'MORE_THAN_A_MONTH_AGO': "more than a month ago",
44 'MORE_THAN_A_WEEK_AGO': "more than a week ago", 41 'MORE_THAN_A_WEEK_AGO': "more than a week ago",
45 'MORE_THAN_*_WEEKS_AGO': "more than __elapsed__ weeks ago", 42 'MORE_THAN_*_WEEKS_AGO': "more than __elapsed__ weeks ago",
46 'YESTERDAY': "yesterday", 43 'YESTERDAY': "yesterday",
47 '*_DAYS_AGO': "__elapsed__ days ago", 44 '*_DAYS_AGO': "__elapsed__ days ago",
48 'ABOUT_AN_HOUR_AGO': "about an hour ago", 45 'ABOUT_AN_HOUR_AGO': "about an hour ago",
49 '*_HOURS_AGO': "__elapsed__ hours ago", 46 '*_HOURS_AGO': "__elapsed__ hours ago",
50 'JUST_A_FEW_MINUTES_AGO': "just a few minutes ago", 47 'JUST_A_FEW_MINUTES_AGO': "just a few minutes ago",
51 'ABOUT_*_MINUTES_AGO': "about __elapsed__ minutes ago" 48 'ABOUT_*_MINUTES_AGO': "about __elapsed__ minutes ago"
52}, 49},
53/* 50/*
54 'unknown_ip': "unknown", 51 'unknown_ip': "unknown",
55 52
56'countries': { 53'countries': {
57 '--': "unknown", 54 '--': "unknown",
58 'AD': "Andorra", 55 'AD': "Andorra",
59 'AE': "United Arab Emirates", 56 'AE': "United Arab Emirates",
60 'AF': "Afghanistan", 57 'AF': "Afghanistan",
61 'AG': "Antigua and Barbuda", 58 'AG': "Antigua and Barbuda",
62 'AI': "Anguilla", 59 'AI': "Anguilla",
63 'AL': "Albania", 60 'AL': "Albania",
64 'AM': "Armenia", 61 'AM': "Armenia",
65 'AN': "Netherlands Antilles", 62 'AN': "Netherlands Antilles",
66 'AO': "Angola", 63 'AO': "Angola",
67 'AP': "Non-Spec Asia Pas Location", 64 'AP': "Non-Spec Asia Pas Location",
68 'AR': "Argentina", 65 'AR': "Argentina",
69 'AS': "American Samoa", 66 'AS': "American Samoa",
70 'AT': "Austria", 67 'AT': "Austria",
71 'AU': "Australia", 68 'AU': "Australia",
72 'AW': "Aruba", 69 'AW': "Aruba",
73 'AX': "Aland Islands", 70 'AX': "Aland Islands",
74 'AZ': "Azerbaijan", 71 'AZ': "Azerbaijan",
75 'BA': "Bosnia and Herzegowina", 72 'BA': "Bosnia and Herzegowina",
76 'BB': "Barbados", 73 'BB': "Barbados",
77 'BD': "Bangladesh", 74 'BD': "Bangladesh",
78 'BE': "Belgium", 75 'BE': "Belgium",
79 'BF': "Burkina Faso", 76 'BF': "Burkina Faso",
80 'BG': "Bulgaria", 77 'BG': "Bulgaria",
81 'BH': "Bahrain", 78 'BH': "Bahrain",
82 'BI': "Burundi", 79 'BI': "Burundi",
83 'BJ': "Benin", 80 'BJ': "Benin",
84 'BM': "Bermuda", 81 'BM': "Bermuda",
85 'BN': "Brunei Darussalam", 82 'BN': "Brunei Darussalam",
86 'BO': "Bolivia", 83 'BO': "Bolivia",
87 'BR': "Brazil", 84 'BR': "Brazil",
88 'BS': "Bahamas", 85 'BS': "Bahamas",
89 'BT': "Bhutan", 86 'BT': "Bhutan",
90 'BW': "Botswana", 87 'BW': "Botswana",
91 'BY': "Belarus", 88 'BY': "Belarus",
92 'BZ': "Belize", 89 'BZ': "Belize",
93 'CA': "Canada", 90 'CA': "Canada",
94 'CD': "Congo the Democratic Republic of the", 91 'CD': "Congo the Democratic Republic of the",
95 'CF': "Central African Republic", 92 'CF': "Central African Republic",
96 'CH': "Switzerland", 93 'CH': "Switzerland",
97 'CI': "Cote D'ivoire", 94 'CI': "Cote D'ivoire",
98 'CK': "Cook Islands", 95 'CK': "Cook Islands",
99 'CL': "Chile", 96 'CL': "Chile",
100 'CM': "Cameroon", 97 'CM': "Cameroon",
101 'CN': "China", 98 'CN': "China",
102 'CO': "Colombia", 99 'CO': "Colombia",
103 'CR': "Costa Rica", 100 'CR': "Costa Rica",
104 'CS': "Serbia and Montenegro", 101 'CS': "Serbia and Montenegro",
105 'CU': "Cuba", 102 'CU': "Cuba",
106 'CY': "Cyprus", 103 'CY': "Cyprus",
107 'CZ': "Czech Republic", 104 'CZ': "Czech Republic",
108 'DE': "Germany", 105 'DE': "Germany",
109 'DJ': "Djibouti", 106 'DJ': "Djibouti",
110 'DK': "Denmark", 107 'DK': "Denmark",
111 'DO': "Dominican Republic", 108 'DO': "Dominican Republic",
112 'DZ': "Algeria", 109 'DZ': "Algeria",
113 'EC': "Ecuador", 110 'EC': "Ecuador",
114 'EE': "Estonia", 111 'EE': "Estonia",
115 'EG': "Egypt", 112 'EG': "Egypt",
116 'ER': "Eritrea", 113 'ER': "Eritrea",
117 'ES': "Spain", 114 'ES': "Spain",
118 'ET': "Ethiopia", 115 'ET': "Ethiopia",
119 'EU': "European Union", 116 'EU': "European Union",
120 'FI': "Finland", 117 'FI': "Finland",
121 'FJ': "Fiji", 118 'FJ': "Fiji",
122 'FM': "Micronesia Federated States of", 119 'FM': "Micronesia Federated States of",
123 'FO': "Faroe Islands", 120 'FO': "Faroe Islands",
124 'FR': "France", 121 'FR': "France",
125 'GA': "Gabon", 122 'GA': "Gabon",
126 'GB': "United Kingdom", 123 'GB': "United Kingdom",
127 'GD': "Grenada", 124 'GD': "Grenada",
128 'GE': "Georgia", 125 'GE': "Georgia",
129 'GF': "French Guiana", 126 'GF': "French Guiana",
130 'GG': "Guernsey", 127 'GG': "Guernsey",
131 'GH': "Ghana", 128 'GH': "Ghana",
132 'GI': "Gibraltar", 129 'GI': "Gibraltar",
133 'GL': "Greenland", 130 'GL': "Greenland",
134 'GM': "Gambia", 131 'GM': "Gambia",
135 'GP': "Guadeloupe", 132 'GP': "Guadeloupe",
136 'GR': "Greece", 133 'GR': "Greece",
137 'GT': "Guatemala", 134 'GT': "Guatemala",
138 'GU': "Guam", 135 'GU': "Guam",
139 'GW': "Guinea-Bissau", 136 'GW': "Guinea-Bissau",
140 'GY': "Guyana", 137 'GY': "Guyana",
141 'HK': "Hong Kong", 138 'HK': "Hong Kong",
142 'HN': "Honduras", 139 'HN': "Honduras",
143 'HR': "Croatia (Local Name: Hrvatska)", 140 'HR': "Croatia (Local Name: Hrvatska)",
144 'HT': "Haiti", 141 'HT': "Haiti",
145 'HU': "Hungary", 142 'HU': "Hungary",
146 'ID': "Indonesia", 143 'ID': "Indonesia",
147 'IE': "Ireland", 144 'IE': "Ireland",
148 'IL': "Israel", 145 'IL': "Israel",
149 'IM': "Isle of Man", 146 'IM': "Isle of Man",
150 'IN': "India", 147 'IN': "India",
151 'IO': "British Indian Ocean Territory", 148 'IO': "British Indian Ocean Territory",
152 'IQ': "Iraq", 149 'IQ': "Iraq",
153 'IR': "Iran (Islamic Republic of)", 150 'IR': "Iran (Islamic Republic of)",
154 'IS': "Iceland", 151 'IS': "Iceland",
155 'IT': "Italy", 152 'IT': "Italy",
156 'JE': "Jersey", 153 'JE': "Jersey",
157 'JM': "Jamaica", 154 'JM': "Jamaica",
158 'JO': "Jordan", 155 'JO': "Jordan",
159 'JP': "Japan", 156 'JP': "Japan",
160 'KE': "Kenya", 157 'KE': "Kenya",
161 'KG': "Kyrgyzstan", 158 'KG': "Kyrgyzstan",
162 'KH': "Cambodia", 159 'KH': "Cambodia",
163 'KI': "Kiribati", 160 'KI': "Kiribati",
164 'KN': "Saint Kitts and Nevis", 161 'KN': "Saint Kitts and Nevis",
165 'KR': "Korea Republic of", 162 'KR': "Korea Republic of",
166 'KW': "Kuwait", 163 'KW': "Kuwait",
167 'KY': "Cayman Islands", 164 'KY': "Cayman Islands",
168 'KZ': "Kazakhstan", 165 'KZ': "Kazakhstan",
169 'LA': "Lao People's Democratic Republic", 166 'LA': "Lao People's Democratic Republic",
170 'LB': "Lebanon", 167 'LB': "Lebanon",
171 'LC': "Saint Lucia", 168 'LC': "Saint Lucia",
172 'LI': "Liechtenstein", 169 'LI': "Liechtenstein",
173 'LK': "Sri Lanka", 170 'LK': "Sri Lanka",
174 'LR': "Liberia", 171 'LR': "Liberia",
175 'LS': "Lesotho", 172 'LS': "Lesotho",
176 'LT': "Lithuania", 173 'LT': "Lithuania",
177 'LU': "Luxembourg", 174 'LU': "Luxembourg",
178 'LV': "Latvia", 175 'LV': "Latvia",
179 'LY': "Libyan Arab Jamahiriya", 176 'LY': "Libyan Arab Jamahiriya",
180 'MA': "Morocco", 177 'MA': "Morocco",
181 'MC': "Monaco", 178 'MC': "Monaco",
182 'MD': "Moldova Republic of", 179 'MD': "Moldova Republic of",
183 'MG': "Madagascar", 180 'MG': "Madagascar",
184 'MH': "Marshall Islands", 181 'MH': "Marshall Islands",
185 'MK': "Macedonia the Former Yugoslav Republic of", 182 'MK': "Macedonia the Former Yugoslav Republic of",
186 'ML': "Mali", 183 'ML': "Mali",
187 'MM': "Myanmar", 184 'MM': "Myanmar",
188 'MN': "Mongolia", 185 'MN': "Mongolia",
189 'MO': "Macau", 186 'MO': "Macau",
190 'MP': "Northern Mariana Islands", 187 'MP': "Northern Mariana Islands",
191 'MR': "Mauritania", 188 'MR': "Mauritania",
192 'MS': "Montserrat", 189 'MS': "Montserrat",
193 'MT': "Malta", 190 'MT': "Malta",
194 'MU': "Mauritius", 191 'MU': "Mauritius",
195 'MV': "Maldives", 192 'MV': "Maldives",
196 'MW': "Malawi", 193 'MW': "Malawi",
197 'MX': "Mexico", 194 'MX': "Mexico",
198 'MY': "Malaysia", 195 'MY': "Malaysia",
199 'MZ': "Mozambique", 196 'MZ': "Mozambique",
200 'NA': "Namibia", 197 'NA': "Namibia",
201 'NC': "New Caledonia", 198 'NC': "New Caledonia",
202 'NF': "Norfolk Island", 199 'NF': "Norfolk Island",
203 'NG': "Nigeria", 200 'NG': "Nigeria",
204 'NI': "Nicaragua", 201 'NI': "Nicaragua",
205 'NL': "Netherlands", 202 'NL': "Netherlands",
206 'NO': "Norway", 203 'NO': "Norway",
207 'NP': "Nepal", 204 'NP': "Nepal",
208 'NR': "Nauru", 205 'NR': "Nauru",
209 'NU': "Niue", 206 'NU': "Niue",
210 'NZ': "New Zealand", 207 'NZ': "New Zealand",
211 'OM': "Oman", 208 'OM': "Oman",
212 'PA': "Panama", 209 'PA': "Panama",
213 'PE': "Peru", 210 'PE': "Peru",
214 'PF': "French Polynesia", 211 'PF': "French Polynesia",
215 'PG': "Papua New Guinea", 212 'PG': "Papua New Guinea",
216 'PH': "Philippines", 213 'PH': "Philippines",
217 'PK': "Pakistan", 214 'PK': "Pakistan",
218 'PL': "Poland", 215 'PL': "Poland",
219 'PR': "Puerto Rico", 216 'PR': "Puerto Rico",
220 'PS': "Palestinian Territory Occupied", 217 'PS': "Palestinian Territory Occupied",
221 'PT': "Portugal", 218 'PT': "Portugal",
222 'PW': "Palau", 219 'PW': "Palau",
223 'PY': "Paraguay", 220 'PY': "Paraguay",
224 'QA': "Qatar", 221 'QA': "Qatar",
225 'RO': "Romania", 222 'RO': "Romania",
226 'RS': "Serbia", 223 'RS': "Serbia",
227 'RU': "Russian Federation", 224 'RU': "Russian Federation",
228 'RW': "Rwanda", 225 'RW': "Rwanda",
229 'SA': "Saudi Arabia", 226 'SA': "Saudi Arabia",
230 'SB': "Solomon Islands", 227 'SB': "Solomon Islands",
231 'SC': "Seychelles", 228 'SC': "Seychelles",
232 'SD': "Sudan", 229 'SD': "Sudan",
233 'SE': "Sweden", 230 'SE': "Sweden",
234 'SG': "Singapore", 231 'SG': "Singapore",
235 'SI': "Slovenia", 232 'SI': "Slovenia",
236 'SK': "Slovakia (Slovak Republic)", 233 'SK': "Slovakia (Slovak Republic)",
237 'SL': "Sierra Leone", 234 'SL': "Sierra Leone",
238 'SM': "San Marino", 235 'SM': "San Marino",
239 'SN': "Senegal", 236 'SN': "Senegal",
240 'SR': "Suriname", 237 'SR': "Suriname",
241 'SV': "El Salvador", 238 'SV': "El Salvador",
242 'SY': "Syrian Arab Republic", 239 'SY': "Syrian Arab Republic",
243 'SZ': "Swaziland", 240 'SZ': "Swaziland",
244 'TC': "Turks and Caicos Islands", 241 'TC': "Turks and Caicos Islands",
245 'TG': "Togo", 242 'TG': "Togo",
246 'TH': "Thailand", 243 'TH': "Thailand",
247 'TJ': "Tajikistan", 244 'TJ': "Tajikistan",
248 'TM': "Turkmenistan", 245 'TM': "Turkmenistan",
249 'TN': "Tunisia", 246 'TN': "Tunisia",
250 'TO': "Tonga", 247 'TO': "Tonga",
251 'TR': "Turkey", 248 'TR': "Turkey",
252 'TT': "Trinidad and Tobago", 249 'TT': "Trinidad and Tobago",
253 'TV': "Tuvalu", 250 'TV': "Tuvalu",
254 'TW': "Taiwan Province of China", 251 'TW': "Taiwan Province of China",
255 'TZ': "Tanzania United Republic of", 252 'TZ': "Tanzania United Republic of",
256 'UA': "Ukraine", 253 'UA': "Ukraine",
257 'UG': "Uganda", 254 'UG': "Uganda",
258 'US': "United States", 255 'US': "United States",
259 'UY': "Uruguay", 256 'UY': "Uruguay",
260 'UZ': "Uzbekistan", 257 'UZ': "Uzbekistan",
261 'VA': "Holy See (Vatican City State)", 258 'VA': "Holy See (Vatican City State)",
262 'VE': "Venezuela", 259 'VE': "Venezuela",
263 'VG': "Virgin Islands (British)", 260 'VG': "Virgin Islands (British)",
264 'VI': "Virgin Islands (U.S.)", 261 'VI': "Virgin Islands (U.S.)",
265 'VN': "Viet Nam", 262 'VN': "Viet Nam",
266 'VU': "Vanuatu", 263 'VU': "Vanuatu",
267 'WF': "Wallis and Futuna Islands", 264 'WF': "Wallis and Futuna Islands",
268 'WS': "Samoa", 265 'WS': "Samoa",
269 'YE': "Yemen", 266 'YE': "Yemen",
270 'ZA': "South Africa", 267 'ZA': "South Africa",
271 'ZM': "Zambia", 268 'ZM': "Zambia",
272 'ZW': "Zimbabwe", 269 'ZW': "Zimbabwe",
273 'ZZ': "Reserved" 270 'ZZ': "Reserved"
274}, 271},
275 272
276'browsers': { 273'browsers': {
277 'UNKNOWN': "Unknown", 274 'UNKNOWN': "Unknown",
278 'MSIE': "Internet Explorer", 275 'MSIE': "Internet Explorer",
279 'FIREFOX': "Firefox", 276 'FIREFOX': "Firefox",
280 'OPERA': "Opera", 277 'OPERA': "Opera",
281 'SAFARI': "Safari", 278 'SAFARI': "Safari",
282 'OMNIWEB': "OmniWeb", 279 'OMNIWEB': "OmniWeb",
283 'CAMINO': "Camino", 280 'CAMINO': "Camino",
284 'CHROME': "Chrome" 281 'CHROME': "Chrome"
285}, 282},
286 283
287'operatingSystems': { 284'operatingSystems': {
288 'UNKNOWN': "Unknown", 285 'UNKNOWN': "Unknown",
289 'WINDOWS': "Windows", 286 'WINDOWS': "Windows",
290 'MAC': "Mac", 287 'MAC': "Mac",
291 'LINUX': "Linux", 288 'LINUX': "Linux",
292 'IPHONE': "iPhone", 289 'IPHONE': "iPhone",
293 'MOBILE': "Mobile", 290 'MOBILE': "Mobile",
294 'OPENBSD': "OpenBSD", 291 'OPENBSD': "OpenBSD",
295 'FREEBSD': "FreeBSD", 292 'FREEBSD': "FreeBSD",
296 'NETBSD': "NetBSD" 293 'NETBSD': "NetBSD"
297}, 294},
298*/ 295*/
299 296
300 //Calendar texts 297 //Calendar texts
301'calendarStrings': { 298'calendarStrings': {
302 'months': { 299 'months': {
303 '0':"January", 300 '0':"January",
304 '1':"February", 301 '1':"February",
305 '2':"March", 302 '2':"March",
306 '3':"April", 303 '3':"April",
307 '4':"May", 304 '4':"May",
308 '5':"June", 305 '5':"June",
309 '6':"July", 306 '6':"July",
310 '7':"August", 307 '7':"August",
311 '8':"September", 308 '8':"September",
312 '9':"October", 309 '9':"October",
313 '10':"November", 310 '10':"November",
314 '11':"December" 311 '11':"December"
315 }, 312 },
316 'shortMonths':{ 313 'shortMonths':{
317 '0':"Jan", 314 '0':"Jan",
318 '1':"Feb", 315 '1':"Feb",
319 '2':"Mar", 316 '2':"Mar",
320 '3':"Apr", 317 '3':"Apr",
321 '4':"May", 318 '4':"May",
322 '5':"Jun", 319 '5':"Jun",
323 '6':"Jul", 320 '6':"Jul",
324 '7':"Aug", 321 '7':"Aug",
325 '8':"Sep", 322 '8':"Sep",
326 '9':"Oct", 323 '9':"Oct",
327 '10':"Nov", 324 '10':"Nov",
328 '11':"Dec" 325 '11':"Dec"
329 }, 326 },
330 327
331 'days':{ 328 'days':{
332 '0':"Sunday", 329 '0':"Sunday",
333 '1':"Monday", 330 '1':"Monday",
334 '2':"Tuesday", 331 '2':"Tuesday",
335 '3':"Wednesday", 332 '3':"Wednesday",
336 '4':"Thursday", 333 '4':"Thursday",
337 '5':"Friday", 334 '5':"Friday",
338 '6':"Saturday" 335 '6':"Saturday"
339 }, 336 },
340 337
341 'shortDays':{ 338 'shortDays':{
342 '0':"Sun", 339 '0':"Sun",
343 '1':"Mon", 340 '1':"Mon",
344 '2':"Tue", 341 '2':"Tue",
345 '3':"Wed", 342 '3':"Wed",
346 '4':"Thu", 343 '4':"Thu",
347 '5':"Fri", 344 '5':"Fri",
348 '6':"Sat" 345 '6':"Sat"
349 }, 346 },
350 347
351 'veryShortDays':{ 348 'veryShortDays':{
352 '0':"Su", 349 '0':"Su",
353 '1':"Mo", 350 '1':"Mo",
354 '2':"Tu", 351 '2':"Tu",
355 '3':"We", 352 '3':"We",
356 '4':"Th", 353 '4':"Th",
357 '5':"Fr", 354 '5':"Fr",
358 '6':"Sa" 355 '6':"Sa"
359 }, 356 },
360 357
361 'amDesignation':"am", 358 'amDesignation':"am",
362 'pmDesignation':"pm" 359 'pmDesignation':"pm"
363 360
364}, 361},
365 362
366// Date format 363// Date format
367 'fullDate_format':"l, F d, Y H:i:s", 364 'fullDate_format':"l, F d, Y H:i:s",
368 365
369//################################################################################ 366//################################################################################
370 367
371'pageHeader': { 368'pageHeader': {
372 'donation':"donate", 369 'donation':"donate",
373 'forum':"forum", 370 'forum':"forum",
374 'credits':"credits", 371 'credits':"credits",
375 'feedback':"feedback", 372 'feedback':"feedback",
376 'help': "help" 373 'help': "help"
377}, 374},
378 375
379'bookmarkletCopy': { 376'bookmarkletCopy': {
380 'noExceptionMessage':"The direct login configuration has been collected.", 377 'noExceptionMessage':"The direct login configuration has been collected.",
381 'exceptionMessage': "Sorry! There was an error while processing the page.", 378 'exceptionMessage': "Sorry! There was an error while processing the page.",
382 'copy': "copy", 379 'copy': "copy",
383 'successfulMessage':"DONE!", 380 'successfulMessage':"DONE!",
384 'failMessage': "Failed! :(" 381 'failMessage': "Failed! :("
385}, 382},
386 383
387//################################################################################ 384//################################################################################
388 385
389__syntaxFix__: "syntax fix" 386__syntaxFix__: "syntax fix"
390} 387}
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 eebdb16..b540633 100644
--- a/frontend/gamma/js/Clipperz/PM/Strings/Strings_en-US.js
+++ b/frontend/gamma/js/Clipperz/PM/Strings/Strings_en-US.js
@@ -1,408 +1,405 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29//============================================================================= 26//=============================================================================
30// 27//
31 // E N G L I S H A M E R I C A N ( en_US ) 28 // E N G L I S H A M E R I C A N ( en_US )
32// 29//
33//============================================================================= 30//=============================================================================
34 31
35Clipperz.PM.Strings.Languages['en-us'] = { 32Clipperz.PM.Strings.Languages['en-us'] = {
36/* 33/*
37 //Login page - description 34 //Login page - description
38'clipperzServiceDescription': "\ 35'clipperzServiceDescription': "\
39 <!-- FIX CSS DONE -->\ 36 <!-- FIX CSS DONE -->\
40 <h2>Keep it to yourself!</h2>\ 37 <h2>Keep it to yourself!</h2>\
41 <ul>\ 38 <ul>\
42 <li>\ 39 <li>\
43 <h3>Clipperz is:</h3>\ 40 <h3>Clipperz is:</h3>\
44 <ul>\ 41 <ul>\
45 <li><p>a secure and simple password manager</p></li>\ 42 <li><p>a secure and simple password manager</p></li>\
46 <li><p>an effective single sign-on solution</p></li>\ 43 <li><p>an effective single sign-on solution</p></li>\
47 <li><p>a digital vault for your personal data</p></li>\ 44 <li><p>a digital vault for your personal data</p></li>\
48 </ul>\ 45 </ul>\
49 </li>\ 46 </li>\
50 <li>\ 47 <li>\
51 <h3>With Clipperz you can:</h3>\ 48 <h3>With Clipperz you can:</h3>\
52 <ul>\ 49 <ul>\
53 <li><p>store and manage your passwords and online credentials</p></li>\ 50 <li><p>store and manage your passwords and online credentials</p></li>\
54 <li><p>login to your web services without entering any username or password</p></li>\ 51 <li><p>login to your web services without entering any username or password</p></li>\
55 <li><p>protect all your sensitive data: codes for burglar alarms, PINs, credit card numbers, …</p></li>\ 52 <li><p>protect all your sensitive data: codes for burglar alarms, PINs, credit card numbers, …</p></li>\
56 <li><p>share secrets with family members and associates (coming soon)</p></li>\ 53 <li><p>share secrets with family members and associates (coming soon)</p></li>\
57 </ul>\ 54 </ul>\
58 </li>\ 55 </li>\
59 <li>\ 56 <li>\
60 <h3>Clipperz benefits:</h3>\ 57 <h3>Clipperz benefits:</h3>\
61 <ul>\ 58 <ul>\
62 <li><p>free and completely anonymous</p></li>\ 59 <li><p>free and completely anonymous</p></li>\
63 <li><p>access it any time from any computer</p></li>\ 60 <li><p>access it any time from any computer</p></li>\
64 <li><p>no software to download and nothing to install</p></li>\ 61 <li><p>no software to download and nothing to install</p></li>\
65 <li><p>avoid keeping secrets on your PC or on paper</p></li>\ 62 <li><p>avoid keeping secrets on your PC or on paper</p></li>\
66 </ul>\ 63 </ul>\
67 </li>\ 64 </li>\
68 <li>\ 65 <li>\
69 <h3>Clipperz security:</h3>\ 66 <h3>Clipperz security:</h3>\
70 <ul>\ 67 <ul>\
71 <li><p>your secrets are locally encrypted by your browser before being uploaded to Clipperz</p></li>\ 68 <li><p>your secrets are locally encrypted by your browser before being uploaded to Clipperz</p></li>\
72 <li><p>the encryption key is a passphrase known only to you</p></li>\ 69 <li><p>the encryption key is a passphrase known only to you</p></li>\
73 <li><p>Clipperz hosts your sensitive data in encrypted form and could never actually access the data in its plain form</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>\
74 <li><p>Clipperz is built upon standard encryption schemes, nothing fancies or homemade</p></li>\ 71 <li><p>Clipperz is built upon standard encryption schemes, nothing fancies or homemade</p></li>\
75 <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>\ 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>\
76 </ul>\ 73 </ul>\
77 </li>\ 74 </li>\
78 <li>\ 75 <li>\
79 <a href=\"http://www.clipperz.com\" target=\"_blank\">Learn more</a>\ 76 <a href=\"http://www.clipperz.com\" target=\"_blank\">Learn more</a>\
80 </li>\ 77 </li>\
81 </ul>", 78 </ul>",
82 79
83 80
84 'loginFormTitle': "login with your Clipperz account", 81 'loginFormTitle': "login with your Clipperz account",
85 'loginFormUsernameLabel': "username", 82 'loginFormUsernameLabel': "username",
86 'loginFormPassphraseLabel': "passphrase", 83 'loginFormPassphraseLabel': "passphrase",
87 'loginFormDontHaveAnAccountLabel': "don\'t have an account?", 84 'loginFormDontHaveAnAccountLabel': "don\'t have an account?",
88 'loginFormCreateOneLabel': "create one", 85 'loginFormCreateOneLabel': "create one",
89 'loginFormForgotYourCredentialsLabel': "forgot your credentials?", 86 'loginFormForgotYourCredentialsLabel': "forgot your credentials?",
90 'loginFormAarghThatsBadLabel': "aargh! that\'s bad!", 87 'loginFormAarghThatsBadLabel': "aargh! that\'s bad!",
91 'loginFormAfraidOfMaliciousScriptsLabel': "afraid of malicious scripts?", 88 'loginFormAfraidOfMaliciousScriptsLabel': "afraid of malicious scripts?",
92 'loginFormVerifyTheCodeLabel': "verify the code", 89 'loginFormVerifyTheCodeLabel': "verify the code",
93 'loginFormButtonLabel': "Login", 90 'loginFormButtonLabel': "Login",
94 'loginFormOneTimePasswordCheckboxLabel': "use a one-time passphrase", 91 'loginFormOneTimePasswordCheckboxLabel': "use a one-time passphrase",
95'loginFormOneTimePasswordCheckboxDescription': "", 92'loginFormOneTimePasswordCheckboxDescription': "",
96 93
97// Login page - language selection 94// Login page - language selection
98 'loginPanelSwithLanguageDescription': "<h5>Switch to your preferred language</h5>", 95 'loginPanelSwithLanguageDescription': "<h5>Switch to your preferred language</h5>",
99 96
100// Login page - browser compatibility 97// Login page - browser compatibility
101 '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>", 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>",
102 99
103// Login with OTP - message panel 100// Login with OTP - message panel
104 'OTPloginMessagePanelInitialTitle': "Logging in using a one-time passphrase", 101 'OTPloginMessagePanelInitialTitle': "Logging in using a one-time passphrase",
105 'OTPloginMessagePanelInitialText': "Sending OTP credentials …", 102 'OTPloginMessagePanelInitialText': "Sending OTP credentials …",
106 'OTPloginMessagePanelLoadingTitle': "Logging in using a one-time passphrase", 103 'OTPloginMessagePanelLoadingTitle': "Logging in using a one-time passphrase",
107 'OTPloginMessagePanelLoadingText': "Fetching encrypted authentication data from the server …", 104 'OTPloginMessagePanelLoadingText': "Fetching encrypted authentication data from the server …",
108 'OTPloginMessagePanelProcessingTitle': "Logging in using a one-time passphrase", 105 'OTPloginMessagePanelProcessingTitle': "Logging in using a one-time passphrase",
109 'OTPloginMessagePanelProcessingText': "Local decryption of authentication data", 106 'OTPloginMessagePanelProcessingText': "Local decryption of authentication data",
110 107
111// Regular login - message panel 108// Regular login - message panel
112 'loginMessagePanelInitialTitle': "Logging in …", 109 'loginMessagePanelInitialTitle': "Logging in …",
113 'loginMessagePanelInitialText': "---", 110 'loginMessagePanelInitialText': "---",
114 'loginMessagePanelInitialButtonLabel': "Cancel", 111 'loginMessagePanelInitialButtonLabel': "Cancel",
115 'loginMessagePanelConnectedTitle': "Connected", 112 'loginMessagePanelConnectedTitle': "Connected",
116 'loginMessagePanelConnectedText': "Done", 113 'loginMessagePanelConnectedText': "Done",
117 'loginMessagePanelFailureTitle': "Error", 114 'loginMessagePanelFailureTitle': "Error",
118 'loginMessagePanelFailureText': "Login failed", 115 'loginMessagePanelFailureText': "Login failed",
119 'loginMessagePanelFailureButtonLabel': "Close", 116 'loginMessagePanelFailureButtonLabel': "Close",
120 117
121// Regular login - message panel - connection 118// Regular login - message panel - connection
122 'connectionLoginSendingCredentialsMessageTitle': "Verifying credentials", 119 'connectionLoginSendingCredentialsMessageTitle': "Verifying credentials",
123 'connectionLoginSendingCredentialsMessageText': "Sending credentials", 120 'connectionLoginSendingCredentialsMessageText': "Sending credentials",
124 'connectionLoginCredentialsVerificationMessageTitle':"Verifying credentials", 121 'connectionLoginCredentialsVerificationMessageTitle':"Verifying credentials",
125 'connectionLoginCredentialsVerificationMessageText':"Performing SRP authentication", 122 'connectionLoginCredentialsVerificationMessageText':"Performing SRP authentication",
126 'connectionLoginDoneMessageTitle': "Verifying credentials", 123 'connectionLoginDoneMessageTitle': "Verifying credentials",
127 'connectionLoginDoneMessageText': "Connected", 124 'connectionLoginDoneMessageText': "Connected",
128 125
129 //Regular login - message panel - user 126 //Regular login - message panel - user
130 'userLoginPanelUpgradingUserCredentialsMessageTitle': "Verifying credentials", 127 'userLoginPanelUpgradingUserCredentialsMessageTitle': "Verifying credentials",
131 'userLoginPanelUpgradingUserCredentialsMessageText': "Upgrading your credentials to a new authentication schema", 128 'userLoginPanelUpgradingUserCredentialsMessageText': "Upgrading your credentials to a new authentication schema",
132 'userLoginPanelConnectedMessageTitle': "User authenticated", 129 'userLoginPanelConnectedMessageTitle': "User authenticated",
133 'userLoginPanelConnectedMessageText': "Successfully logged in", 130 'userLoginPanelConnectedMessageText': "Successfully logged in",
134 'userLoginPanelTryingAnOlderConnectionSchemaMessageTitle': "Verifying credentials", 131 'userLoginPanelTryingAnOlderConnectionSchemaMessageTitle': "Verifying credentials",
135 'userLoginPanelTryingAnOlderConnectionSchemaMessageText': "Trying an older authentication schema", 132 'userLoginPanelTryingAnOlderConnectionSchemaMessageText': "Trying an older authentication schema",
136 'userLoginPanelLoadingUserDataMessageTitle': "User authenticated", 133 'userLoginPanelLoadingUserDataMessageTitle': "User authenticated",
137 'userLoginPanelLoadingUserDataMessageText': "Downloading encrypted card headers from Clipperz", 134 'userLoginPanelLoadingUserDataMessageText': "Downloading encrypted card headers from Clipperz",
138 'userLoginPanelDecryptingUserDataMessageTitle': "User authenticated", 135 'userLoginPanelDecryptingUserDataMessageTitle': "User authenticated",
139 'userLoginPanelDecryptingUserDataMessageText': "Local decryption of card headers", 136 'userLoginPanelDecryptingUserDataMessageText': "Local decryption of card headers",
140 'userLoginPanelDecryptingUserStatisticsMessageTitle': "User authenticated", 137 'userLoginPanelDecryptingUserStatisticsMessageTitle': "User authenticated",
141 'userLoginPanelDecryptingUserStatisticsMessageText': "Local decryption of usage statistics", 138 'userLoginPanelDecryptingUserStatisticsMessageText': "Local decryption of usage statistics",
142 139
143 //Registration page - splash alert 140 //Registration page - splash alert
144 'splashAlertTitle':"Welcome to Clipperz!", 141 'splashAlertTitle':"Welcome to Clipperz!",
145'splashAlertText': "\ 142'splashAlertText': "\
146 <!-- FIX CSS DONE! -->\ 143 <!-- FIX CSS DONE! -->\
147 <p>Some security advice</p>\ 144 <p>Some security advice</p>\
148 <ul>\ 145 <ul>\
149 <li><p>Storing your data at Clipperz is as secure as the passphrase you choose to protect them. Nobody can access them unless they know your passphrase.</p></li>\ 146 <li><p>Storing your data at Clipperz is as secure as the passphrase you choose to protect them. Nobody can access them unless they know your passphrase.</p></li>\
150 <li><p>If you are going to use Clipperz for safeguarding sensitive and critical information please make sure to use a strong passphrase. The longer the better!</p></li>\ 147 <li><p>If you are going to use Clipperz for safeguarding sensitive and critical information please make sure to use a strong passphrase. The longer the better!</p></li>\
151 <li><p>Clipperz will not be able to recover a lost passphrase!</p></li>\ 148 <li><p>Clipperz will not be able to recover a lost passphrase!</p></li>\
152 </ul>\ 149 </ul>\
153 <p>For any further information, please refer to <a href=\"http://www.clipperz.com\" target=\"_blank\">Clipperz</a> website.</p>", 150 <p>For any further information, please refer to <a href=\"http://www.clipperz.com\" target=\"_blank\">Clipperz</a> website.</p>",
154 'splashAlertCloseButtonLabel':"Ok", 151 'splashAlertCloseButtonLabel':"Ok",
155 152
156 // Registration page - form 153 // Registration page - form
157 'registrationFormTitle': "create your account", 154 'registrationFormTitle': "create your account",
158 'registrationFormUsernameLabel': "username", 155 'registrationFormUsernameLabel': "username",
159 'registrationFormPassphraseLabel': "passphrase", 156 'registrationFormPassphraseLabel': "passphrase",
160 'registrationFormRetypePassphraseLabel': "re-enter passphrase", 157 'registrationFormRetypePassphraseLabel': "re-enter passphrase",
161 'registrationFormSafetyCheckLabel': "I understand that Clipperz will not be able to recover a lost passphrase.", 158 'registrationFormSafetyCheckLabel': "I understand that Clipperz will not be able to recover a lost passphrase.",
162 'registrationFormTermsOfServiceCheckLabel': "I have read and agreed to the <a href='http://www.clipperz.com/terms_of_service' target='_blank'>Terms of Service</a>.", 159 'registrationFormTermsOfServiceCheckLabel': "I have read and agreed to the <a href='http://www.clipperz.com/terms_of_service' target='_blank'>Terms of Service</a>.",
163 'registrationFormDoYouAlreadyHaveAnAccountLabel': "do you already have an account?", 160 'registrationFormDoYouAlreadyHaveAnAccountLabel': "do you already have an account?",
164 'registrationFormSimplyLoginLabel': "simply login", 161 'registrationFormSimplyLoginLabel': "simply login",
165 'registrationFormButtonLabel': "Register", 162 'registrationFormButtonLabel': "Register",
166 163
167// Registration page - warning messages 164// Registration page - warning messages
168 'registrationFormWarningMessageNotMatchingPassphrases':"Your passphrases don't match, please re-type them.", 165 'registrationFormWarningMessageNotMatchingPassphrases':"Your passphrases don't match, please re-type them.",
169 'registrationFormWarningMessageSafetyCheckNotSelected':"Please read and check all the boxes below.", 166 'registrationFormWarningMessageSafetyCheckNotSelected':"Please read and check all the boxes below.",
170 'registrationFormWarningMessageTermsOfServiceCheckNotSelected':"You need to agree to the Terms of Service.", 167 'registrationFormWarningMessageTermsOfServiceCheckNotSelected':"You need to agree to the Terms of Service.",
171 168
172 // Registration page - message panel 169 // Registration page - message panel
173 'registrationMessagePanelInitialTitle': "Creating account …", 170 'registrationMessagePanelInitialTitle': "Creating account …",
174 'registrationMessagePanelInitialText': "---", 171 'registrationMessagePanelInitialText': "---",
175 'registrationMessagePanelInitialButtonLabel': "Cancel", 172 'registrationMessagePanelInitialButtonLabel': "Cancel",
176 'registrationMessagePanelRegistrationDoneTitle': "Registration", 173 'registrationMessagePanelRegistrationDoneTitle': "Registration",
177 'registrationMessagePanelRegistrationDoneText': "Done", 174 'registrationMessagePanelRegistrationDoneText': "Done",
178 'registrationMessagePanelFailureTitle': "Registration failed", 175 'registrationMessagePanelFailureTitle': "Registration failed",
179 'registrationMessagePanelFailureButtonLabel': "Close", 176 'registrationMessagePanelFailureButtonLabel': "Close",
180 177
181// Registration page - message panel - connection 178// Registration page - message panel - connection
182 'connectionRegistrationSendingRequestMessageText': "Verifying credentials", 179 'connectionRegistrationSendingRequestMessageText': "Verifying credentials",
183 'connectionRegistrationSendingCredentialsMessageText':"Sending credentials", 180 'connectionRegistrationSendingCredentialsMessageText':"Sending credentials",
184 181
185// Registration page - splash panel 182// Registration page - splash panel
186 'registrationSplashPanelTitle': "Security advice", 183 'registrationSplashPanelTitle': "Security advice",
187 'registrationSplashPanelDescription': "<p>These are your Clipperz credentials, take good care of them. Clipperz will never display your username and passphrase a second time!</p>", 184 'registrationSplashPanelDescription': "<p>These are your Clipperz credentials, take good care of them. Clipperz will never display your username and passphrase a second time!</p>",
188 'registrationSplashPanelUsernameLabel': "username", 185 'registrationSplashPanelUsernameLabel': "username",
189 'registrationSplashPanelPassphraseLabel':"passphrase", 186 'registrationSplashPanelPassphraseLabel':"passphrase",
190 187
191 'registrationSplashPanelShowPassphraseButtonLabel':"show passphrase", 188 'registrationSplashPanelShowPassphraseButtonLabel':"show passphrase",
192 189
193 //Header links 190 //Header links
194 'donateHeaderLinkLabel': "donate", 191 'donateHeaderLinkLabel': "donate",
195 'creditsHeaderLinkLabel': "credits", 192 'creditsHeaderLinkLabel': "credits",
196 'feedbackHeaderLinkLabel': "feedback", 193 'feedbackHeaderLinkLabel': "feedback",
197 'helpHeaderLinkLabel': "help", 194 'helpHeaderLinkLabel': "help",
198 'forumHeaderLinkLabel': "forum", 195 'forumHeaderLinkLabel': "forum",
199 196
200 //Menu labels 197 //Menu labels
201 'recordMenuLabel': "cards", 198 'recordMenuLabel': "cards",
202 'accountMenuLabel': "account", 199 'accountMenuLabel': "account",
203 'dataMenuLabel': "data", 200 'dataMenuLabel': "data",
204 'contactsMenuLabel': "contacts", 201 'contactsMenuLabel': "contacts",
205 'toolsMenuLabel': "tools", 202 'toolsMenuLabel': "tools",
206 'logoutMenuLabel': "logout", 203 'logoutMenuLabel': "logout",
207 'lockMenuLabel': "lock", 204 'lockMenuLabel': "lock",
208 205
209 //Lock dialog 206 //Lock dialog
210 'lockTitle': "The account is locked", 207 'lockTitle': "The account is locked",
211 'lockDescription': "<p>To unlock your account, please enter your passphrase.</p>", 208 'lockDescription': "<p>To unlock your account, please enter your passphrase.</p>",
212 'unlockButtonLabel': "Unlock", 209 'unlockButtonLabel': "Unlock",
213 210
214 //Account panel - change passphrase 211 //Account panel - change passphrase
215 'changePasswordTabLabel': "Change your passphrase", 212 'changePasswordTabLabel': "Change your passphrase",
216 'changePasswordTabTitle': "Change your passphrase", 213 'changePasswordTabTitle': "Change your passphrase",
217 214
218 'changePasswordFormUsernameLabel': "username", 215 'changePasswordFormUsernameLabel': "username",
219 'changePasswordFormOldPassphraseLabel': "old passphrase", 216 'changePasswordFormOldPassphraseLabel': "old passphrase",
220 'changePasswordFormNewPassphraseLabel': "new passphrase", 217 'changePasswordFormNewPassphraseLabel': "new passphrase",
221 'changePasswordFormRetypePassphraseLabel':"re-enter new passphrase", 218 'changePasswordFormRetypePassphraseLabel':"re-enter new passphrase",
222 'changePasswordFormSafetyCheckboxLabel':"I understand that Clipperz will not be able to recover a lost passphrase.", 219 'changePasswordFormSafetyCheckboxLabel':"I understand that Clipperz will not be able to recover a lost passphrase.",
223 'changePasswordFormSubmitLabel': "Change passphrase", 220 'changePasswordFormSubmitLabel': "Change passphrase",
224 221
225 //Account panel - change passphrase - warning messages 222 //Account panel - change passphrase - warning messages
226 'changePasswordFormWrongUsernameWarning': "Wrong username", 223 'changePasswordFormWrongUsernameWarning': "Wrong username",
227 'changePasswordFormWrongPassphraseWarning': "Wrong passphrase", 224 'changePasswordFormWrongPassphraseWarning': "Wrong passphrase",
228 'changePasswordFormWrongRetypePassphraseWarning':"Your passphrases don't match, please re-type them.", 225 'changePasswordFormWrongRetypePassphraseWarning':"Your passphrases don't match, please re-type them.",
229 'changePasswordFormSafetyCheckWarning': "Please read and check the box below.", 226 'changePasswordFormSafetyCheckWarning': "Please read and check the box below.",
230 227
231 //Account panel - change passphrase - progress dialog 228 //Account panel - change passphrase - progress dialog
232 'changePasswordFormProgressDialogTitle': "Changing user credentials", 229 'changePasswordFormProgressDialogTitle': "Changing user credentials",
233 'changePasswordFormProgressDialogEmptyText': "---", 230 'changePasswordFormProgressDialogEmptyText': "---",
234 'changePasswordFormProgressDialogConnectedMessageTitle': "Connected", 231 'changePasswordFormProgressDialogConnectedMessageTitle': "Connected",
235 'changePasswordFormProgressDialogConnectedMessageText': "Done", 232 'changePasswordFormProgressDialogConnectedMessageText': "Done",
236 'changePasswordFormProgressDialogErrorMessageTitle': "Error", 233 'changePasswordFormProgressDialogErrorMessageTitle': "Error",
237 'changePasswordFormProgressDialogErrorMessageText': "Credentials change failed!", 234 'changePasswordFormProgressDialogErrorMessageText': "Credentials change failed!",
238 235
239 'changeCredentialsPanelEncryptingDataMessageTitle': "Changing your passphrase", 236 'changeCredentialsPanelEncryptingDataMessageTitle': "Changing your passphrase",
240 'changeCredentialsPanelEncryptingDataMessageText': "Local encryption of card headers", 237 'changeCredentialsPanelEncryptingDataMessageText': "Local encryption of card headers",
241 'changeCredentialsPanelCreatingNewCredentialsMessageTitle': "Changing your passphrase", 238 'changeCredentialsPanelCreatingNewCredentialsMessageTitle': "Changing your passphrase",
242 'changeCredentialsPanelCreatingNewCredentialsMessageText': "Updating your credentials", 239 'changeCredentialsPanelCreatingNewCredentialsMessageText': "Updating your credentials",
243 'changeCredentialsPanelSendingNewCredentialsToTheServerMessageTitle':"Changing your passphrase", 240 'changeCredentialsPanelSendingNewCredentialsToTheServerMessageTitle':"Changing your passphrase",
244 'changeCredentialsPanelSendingNewCredentialsToTheServerMessageText':"Uploading your encrypted credentials to Clipperz", 241 'changeCredentialsPanelSendingNewCredentialsToTheServerMessageText':"Uploading your encrypted credentials to Clipperz",
245 'changeCredentialsPanelDoneMessageTitle': "Changing your passphrase", 242 'changeCredentialsPanelDoneMessageTitle': "Changing your passphrase",
246 'changeCredentialsPanelDoneMessageText': "Done", 243 'changeCredentialsPanelDoneMessageText': "Done",
247 244
248 //Account panel - OTP 245 //Account panel - OTP
249 'manageOTPTabLabel': "Manage your one-time passphrases", 246 'manageOTPTabLabel': "Manage your one-time passphrases",
250 'manageOTPTabTitle': "Manage your one-time passphrases", 247 'manageOTPTabTitle': "Manage your one-time passphrases",
251 248
252 'manageOTPTabDescription':"\ 249 'manageOTPTabDescription':"\
253 <p>A one-time passphrase works like your regular passphrase, but can be used only once.</p>\ 250 <p>A one-time passphrase works like your regular passphrase, but can be used only once.</p>\
254 <p>If the same passphrase is used again at a later stage in a login attempt it will be rejected and the login process will fail.</p>\ 251 <p>If the same passphrase is used again at a later stage in a login attempt it will be rejected and the login process will fail.</p>\
255 <p>Immediately after a successful login, your one-time passphrase will be deleted preventing any fraudulent access.</p>\ 252 <p>Immediately after a successful login, your one-time passphrase will be deleted preventing any fraudulent access.</p>\
256 <p>One-time passphrases are an excellent choice if one is concerned about keyloggers or spyware infections that may be collecting data from compromised machines.</p>\ 253 <p>One-time passphrases are an excellent choice if one is concerned about keyloggers or spyware infections that may be collecting data from compromised machines.</p>\
257 <p><b>It's strongly advisable to use one-time passphrases when accessing Clipperz from public terminals, such as Internet cafes and libraries.</b></p>", 254 <p><b>It's strongly advisable to use one-time passphrases when accessing Clipperz from public terminals, such as Internet cafes and libraries.</b></p>",
258 255
259 //Account panel - OTP - OTP table 256 //Account panel - OTP - OTP table
260'oneTimePasswordReadOnlyMessage': "\ 257'oneTimePasswordReadOnlyMessage': "\
261 <h6>Sorry!</h6>\ 258 <h6>Sorry!</h6>\
262 <p>You cannot manage your one-time passphrases when using the offline version of Clipperz.</p>", 259 <p>You cannot manage your one-time passphrases when using the offline version of Clipperz.</p>",
263 260
264 'oneTimePasswordLoadingMessage':"\ 261 'oneTimePasswordLoadingMessage':"\
265 <h6>Loading data</h6>\ 262 <h6>Loading data</h6>\
266 <p>Please wait …</p>", 263 <p>Please wait …</p>",
267 264
268 'oneTimePasswordNoPasswordAvailable':"\ 265 'oneTimePasswordNoPasswordAvailable':"\
269 <h6>No one-time passphrase available</h6>\ 266 <h6>No one-time passphrase available</h6>\
270 <p>Click the “New” button above to add one-time passphrases to your account.</p>", 267 <p>Click the “New” button above to add one-time passphrases to your account.</p>",
271 268
272 'createNewOTPButtonLabel': "New", 269 'createNewOTPButtonLabel': "New",
273 'deleteOTPButtonLabel': "Delete", 270 'deleteOTPButtonLabel': "Delete",
274 'printOTPButtonLabel': "Print", 271 'printOTPButtonLabel': "Print",
275 272
276 'disabledOneTimePassword_warning': "disabled", 273 'disabledOneTimePassword_warning': "disabled",
277 274
278 'oneTimePasswordSelectionLink_selectLabel':"Select:", 275 'oneTimePasswordSelectionLink_selectLabel':"Select:",
279 'oneTimePasswordSelectionLink_all': "all", 276 'oneTimePasswordSelectionLink_all': "all",
280 'oneTimePasswordSelectionLink_none': "none", 277 'oneTimePasswordSelectionLink_none': "none",
281 'oneTimePasswordSelectionLink_used': "used", 278 'oneTimePasswordSelectionLink_used': "used",
282 'oneTimePasswordSelectionLink_unused': "unused", 279 'oneTimePasswordSelectionLink_unused': "unused",
283 280
284//Account panel - OTP - saving new OTP dialog 281//Account panel - OTP - saving new OTP dialog
285 'saveOTP_encryptUserDataTitle': "Saving one-time passphrase", 282 'saveOTP_encryptUserDataTitle': "Saving one-time passphrase",
286 'saveOTP_encryptUserDataText': "Processing new OTP credentials …", 283 'saveOTP_encryptUserDataText': "Processing new OTP credentials …",
287 'saveOTP_encryptOTPDataTitle': "Saving one-time passphrase", 284 'saveOTP_encryptOTPDataTitle': "Saving one-time passphrase",
288 'saveOTP_encryptOTPDataText': "Local encryption of authentication data …", 285 'saveOTP_encryptOTPDataText': "Local encryption of authentication data …",
289 'saveOTP_sendingDataTitle': "Saving one-time passphrase", 286 'saveOTP_sendingDataTitle': "Saving one-time passphrase",
290 'saveOTP_sendingDataText': "Sending authentication data to the server …", 287 'saveOTP_sendingDataText': "Sending authentication data to the server …",
291 'saveOTP_updatingInterfaceTitle': "Saving one-time passphrase", 288 'saveOTP_updatingInterfaceTitle': "Saving one-time passphrase",
292 'saveOTP_updatingInterfaceText': "Updating interface", 289 'saveOTP_updatingInterfaceText': "Updating interface",
293 290
294// Account panel - preferences 291// Account panel - preferences
295 'accountPreferencesLabel': "Preferences", 292 'accountPreferencesLabel': "Preferences",
296 'accountPreferencesTabTitle': "Preferences", 293 'accountPreferencesTabTitle': "Preferences",
297 294
298 'accountPreferencesLanguageTitle': "Language", 295 'accountPreferencesLanguageTitle': "Language",
299 'accountPreferencesLanguageDescription':"<p>Choose your preferred language from the list below.</p>", 296 'accountPreferencesLanguageDescription':"<p>Choose your preferred language from the list below.</p>",
300 297
301 'showDonationReminderPanelTitle': "Donation reminders", 298 'showDonationReminderPanelTitle': "Donation reminders",
302 'showDonationReminderPanelDescription': "<p>Show donation reminders</p>", 299 'showDonationReminderPanelDescription': "<p>Show donation reminders</p>",
303 300
304 'saveUserPreferencesFormSubmitLabel': "Save", 301 'saveUserPreferencesFormSubmitLabel': "Save",
305 'cancelUserPreferencesFormSubmitLabel': "Cancel", 302 'cancelUserPreferencesFormSubmitLabel': "Cancel",
306 303
307// Account panel - preferences - saving dialog 304// Account panel - preferences - saving dialog
308 'accountPreferencesSavingPanelTitle_Step1': "Saving preferences", 305 'accountPreferencesSavingPanelTitle_Step1': "Saving preferences",
309 'accountPreferencesSavingPanelText_Step1': "Local encryption of your preferences", 306 'accountPreferencesSavingPanelText_Step1': "Local encryption of your preferences",
310 'accountPreferencesSavingPanelTitle_Step2': "Saving preferences", 307 'accountPreferencesSavingPanelTitle_Step2': "Saving preferences",
311 'accountPreferencesSavingPanelText_Step2': "Sending encrypted preferences to Clipperz", 308 'accountPreferencesSavingPanelText_Step2': "Sending encrypted preferences to Clipperz",
312 309
313 //Account panel - login history 310 //Account panel - login history
314 'accountLoginHistoryLabel': "Login history", 311 'accountLoginHistoryLabel': "Login history",
315 'loginHistoryTabTitle': "Login history", 312 'loginHistoryTabTitle': "Login history",
316 313
317 'loginHistoryReadOnlyMessage': "\ 314 'loginHistoryReadOnlyMessage': "\
318 <h6>Sorry!</h6>\ 315 <h6>Sorry!</h6>\
319 <p>The login history is not available while using the offline version of Clipperz.</p>", 316 <p>The login history is not available while using the offline version of Clipperz.</p>",
320 317
321 'loginHistoryLoadingMessage': "\ 318 'loginHistoryLoadingMessage': "\
322 <h6>Loading data</h6>\ 319 <h6>Loading data</h6>\
323 <p>Please wait …</p>", 320 <p>Please wait …</p>",
324 321
325 'loginHistoryLoadedMessage': "\ 322 'loginHistoryLoadedMessage': "\
326 <h6>Your latest 10 logins</h6>\ 323 <h6>Your latest 10 logins</h6>\
327 <p></p>", 324 <p></p>",
328 325
329 'loginHistoryIPLabel': "IP", 326 'loginHistoryIPLabel': "IP",
330 'loginHistoryTimeLabel': "date", 327 'loginHistoryTimeLabel': "date",
331 'loginHistoryCurrentSessionText': "current session", 328 'loginHistoryCurrentSessionText': "current session",
332 'loginHistoryReloadButtonLabel': "Reload login history", 329 'loginHistoryReloadButtonLabel': "Reload login history",
333 330
334 //Account panel - delete account 331 //Account panel - delete account
335 'deleteAccountTabLabel': "Delete your account", 332 'deleteAccountTabLabel': "Delete your account",
336 'deleteAccountTabTitle': "Delete your account", 333 'deleteAccountTabTitle': "Delete your account",
337 334
338 'deleteAccountFormUsernameLabel': "username", 335 'deleteAccountFormUsernameLabel': "username",
339 'deleteAccountFormPassphraseLabel': "passphrase", 336 'deleteAccountFormPassphraseLabel': "passphrase",
340 'deleteAccountFormSafetyCheckboxLabel': "I understand that all my data will be deleted and that this action is irreversible.", 337 'deleteAccountFormSafetyCheckboxLabel': "I understand that all my data will be deleted and that this action is irreversible.",
341 'deleteAccountFormSubmitLabel': "Delete my account", 338 'deleteAccountFormSubmitLabel': "Delete my account",
342 339
343//Account panel - delete account - warnings 340//Account panel - delete account - warnings
344 'deleteAccountFormWrongUsernameWarning':"Wrong username", 341 'deleteAccountFormWrongUsernameWarning':"Wrong username",
345 'deleteAccountFormWrongPassphraseWarning':"Wrong passphrase", 342 'deleteAccountFormWrongPassphraseWarning':"Wrong passphrase",
346 'deleteAccountFormSafetyCheckWarning': "Please read and check the box below.", 343 'deleteAccountFormSafetyCheckWarning': "Please read and check the box below.",
347 344
348//Account panel - delete account - confirmation 345//Account panel - delete account - confirmation
349 'accountPanelDeletingAccountPanelConfirmationTitle':"ATTENTION", 346 'accountPanelDeletingAccountPanelConfirmationTitle':"ATTENTION",
350 'accountPanelDeleteAccountPanelConfirmationText': "Are your sure you want to delete your account?", 347 'accountPanelDeleteAccountPanelConfirmationText': "Are your sure you want to delete your account?",
351 'accountPanelDeleteAccountPanelConfirmButtonLabel': "Yes", 348 'accountPanelDeleteAccountPanelConfirmButtonLabel': "Yes",
352 'accountPanelDeleteAccountPanelDenyButtonLabel': "No", 349 'accountPanelDeleteAccountPanelDenyButtonLabel': "No",
353 350
354//Account panel - delete account - confirmation 351//Account panel - delete account - confirmation
355 'accountPanelDeletingAccountPanelProgressTitle': "Deleting the account data", 352 'accountPanelDeletingAccountPanelProgressTitle': "Deleting the account data",
356 'accountPanelDeletingAccountPanelProgressText': "The operation could take long, please be patient.", 353 'accountPanelDeletingAccountPanelProgressText': "The operation could take long, please be patient.",
357 354
358//Data panel - offline copy 355//Data panel - offline copy
359 'offlineCopyTabLabel': "Offline copy", 356 'offlineCopyTabLabel': "Offline copy",
360 'offlineCopyTabTitle': "Offline copy", 357 'offlineCopyTabTitle': "Offline copy",
361 358
362'offlineCopyTabDescription': "\ 359'offlineCopyTabDescription': "\
363 <!-- FIX CSS DONE! -->\ 360 <!-- FIX CSS DONE! -->\
364 <p>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.</p>\ 361 <p>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.</p>\
365 <p>The read-only version is as secure as the read-and-write one and will not expose your data to higher risks since they both share the same code and security architecture.</p>\ 362 <p>The read-only version is as secure as the read-and-write one and will not expose your data to higher risks since they both share the same code and security architecture.</p>\
366 <ol>\ 363 <ol>\
367 <li><p>Click the link below to start the download.</p></li>\ 364 <li><p>Click the link below to start the download.</p></li>\
368 <li><p>The browser will ask you what to do with the “Clipperz_YYYYMMDD.html” file. Save it on your hard disk.</p></li>\ 365 <li><p>The browser will ask you what to do with the “Clipperz_YYYYMMDD.html” file. Save it on your hard disk.</p></li>\
369 <li><p>Double click on the downloaded file to launch the offline version in your browser.</p></li>\ 366 <li><p>Double click on the downloaded file to launch the offline version in your browser.</p></li>\
370 <li><p>Enter the usual username and passphrase.</p></li>\ 367 <li><p>Enter the usual username and passphrase.</p></li>\
371 </ol>", 368 </ol>",
372 369
373 'offlineCopyDownloadLinkLabel': "Download", 370 'offlineCopyDownloadLinkLabel': "Download",
374 371
375 //Data panel - offline copy - not updated 372 //Data panel - offline copy - not updated
376 'offlineCopyDownloadWarning': "\ 373 'offlineCopyDownloadWarning': "\
377 <!-- FIX CSS DONE! -->\ 374 <!-- FIX CSS DONE! -->\
378 <h4><a href=\"#\" id=\"offlineCopyDownloadWarningLink\">Update your “offline copy”!</a></h4>\ 375 <h4><a href=\"#\" id=\"offlineCopyDownloadWarningLink\">Update your “offline copy”!</a></h4>\
379 <p>You have recently created or modified one or more cards, it would be wise to download a new copy of the offline version.</p>", 376 <p>You have recently created or modified one or more cards, it would be wise to download a new copy of the offline version.</p>",
380 377
381 'offlineCopyDownloadOk': "", 378 'offlineCopyDownloadOk': "",
382 379
383 //Data panel - sharing 380 //Data panel - sharing
384 'sharingTabLabel': "Sharing", 381 'sharingTabLabel': "Sharing",
385 'sharingTabTitle': "Sharing", 382 'sharingTabTitle': "Sharing",
386 383
387 'sharingTabDescription': "\ 384 'sharingTabDescription': "\
388 <p>Quite often a confidential piece of information needs to be shared with one or more persons.</p>\ 385 <p>Quite often a confidential piece of information needs to be shared with one or more persons.</p>\
389 <p>This could be as simple as giving your colleague the access code of your voice mailbox when you are out of the office, or as complicated as enabling the entitled heirs to access your safe deposit box at the local bank when you pass on.</p>\ 386 <p>This could be as simple as giving your colleague the access code of your voice mailbox when you are out of the office, or as complicated as enabling the entitled heirs to access your safe deposit box at the local bank when you pass on.</p>\
390 <p>Clipperz can make sharing your secrets a secure and straightforward process.</p>\ 387 <p>Clipperz can make sharing your secrets a secure and straightforward process.</p>\
391 <p></p>\ 388 <p></p>\
392 <p><b>Coming soon …</b></p>", 389 <p><b>Coming soon …</b></p>",
393 390
394 // Data panel - import 391 // Data panel - import
395 'importTabLabel': "Import", 392 'importTabLabel': "Import",
396 'importTabTitle': "Import", 393 'importTabTitle': "Import",
397 394
398 'importTabDescription': "<p>You can bulk import data to your Clipperz account from several file formats.</p>", 395 'importTabDescription': "<p>You can bulk import data to your Clipperz account from several file formats.</p>",
399 396
400 //Data panel - export 397 //Data panel - export
401 'printingTabLabel': "Export", 398 'printingTabLabel': "Export",
402 'printingTabTitle': "Export", 399 'printingTabTitle': "Export",
403 400
404 'printingTabDescription': "\ 401 'printingTabDescription': "\
405 <h5>Printing</h5>\ 402 <h5>Printing</h5>\
406 <p>Click on the link below to open a new window displaying all your cards in a printable format.</p>\ 403 <p>Click on the link below to open a new window displaying all your cards in a printable format.</p>\
407 <p>If you are going to print for backup purposes, please consider the safer option provided by the “offline copy”.</p>", 404 <p>If you are going to print for backup purposes, please consider the safer option provided by the “offline copy”.</p>",
408 405
diff --git a/frontend/gamma/js/Clipperz/PM/Toll.js b/frontend/gamma/js/Clipperz/PM/Toll.js
index a533f51..bb31c43 100644
--- a/frontend/gamma/js/Clipperz/PM/Toll.js
+++ b/frontend/gamma/js/Clipperz/PM/Toll.js
@@ -1,194 +1,191 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
30if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } 27if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
31 28
32//============================================================================= 29//=============================================================================
33 30
34Clipperz.PM.Toll = function(args) { 31Clipperz.PM.Toll = function(args) {
35 args = args || {}; 32 args = args || {};
36 33
37 this._requestType = args.requestType; 34 this._requestType = args.requestType;
38 this._targetValue = args.targetValue; 35 this._targetValue = args.targetValue;
39 this._cost = args.cost; 36 this._cost = args.cost;
40 this._toll = null; 37 this._toll = null;
41 38
42 return this; 39 return this;
43} 40}
44 41
45Clipperz.PM.Toll.prototype = MochiKit.Base.update(null, { 42Clipperz.PM.Toll.prototype = MochiKit.Base.update(null, {
46 43
47 'toString': function() { 44 'toString': function() {
48 return "Clipperz.PM.Toll (" + this.requestType() + ": " + this.cost() + " - " + ((this.toll() == null)? 'UNPAID' : 'PAID') + ")"; 45 return "Clipperz.PM.Toll (" + this.requestType() + ": " + this.cost() + " - " + ((this.toll() == null)? 'UNPAID' : 'PAID') + ")";
49 }, 46 },
50 47
51 //------------------------------------------------------------------------- 48 //-------------------------------------------------------------------------
52 49
53 'requestType': function() { 50 'requestType': function() {
54 return this._requestType; 51 return this._requestType;
55 }, 52 },
56 53
57 //------------------------------------------------------------------------- 54 //-------------------------------------------------------------------------
58 55
59 'targetValue': function() { 56 'targetValue': function() {
60 return this._targetValue; 57 return this._targetValue;
61 }, 58 },
62 59
63 //------------------------------------------------------------------------- 60 //-------------------------------------------------------------------------
64 61
65 'cost': function() { 62 'cost': function() {
66 return this._cost; 63 return this._cost;
67 }, 64 },
68 65
69 //------------------------------------------------------------------------- 66 //-------------------------------------------------------------------------
70 67
71 'toll': function() { 68 'toll': function() {
72 return this._toll; 69 return this._toll;
73 }, 70 },
74 71
75 //------------------------------------------------------------------------- 72 //-------------------------------------------------------------------------
76/* 73/*
77 '__pay': function() { 74 '__pay': function() {
78 varresult; 75 varresult;
79 vartargetData; 76 vartargetData;
80 vartargetMatchSize; 77 vartargetMatchSize;
81 var prefixMatchingBits; 78 var prefixMatchingBits;
82 varpayment; 79 varpayment;
83 var i; 80 var i;
84 81
85 if (this.toll() == null) { 82 if (this.toll() == null) {
86 i = 0; 83 i = 0;
87 targetData = new Clipperz.ByteArray("0x" + this.targetValue()); 84 targetData = new Clipperz.ByteArray("0x" + this.targetValue());
88 targetMatchSize = this.cost(); 85 targetMatchSize = this.cost();
89 86
90 payment = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32); 87 payment = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32);
91 88
92 do { 89 do {
93 varpaymentData; 90 varpaymentData;
94 91
95 //payment = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32); 92 //payment = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32);
96 payment.increment(); 93 payment.increment();
97 paymentData = Clipperz.Crypto.SHA.sha256(payment); 94 paymentData = Clipperz.Crypto.SHA.sha256(payment);
98 // prefixMatchingBits = this.prefixMatchingBits(targetData, paymentData); 95 // prefixMatchingBits = this.prefixMatchingBits(targetData, paymentData);
99 prefixMatchingBits = Clipperz.ByteArray.prefixMatchingBits(targetData, paymentData); 96 prefixMatchingBits = Clipperz.ByteArray.prefixMatchingBits(targetData, paymentData);
100 i++; 97 i++;
101 } while (prefixMatchingBits < targetMatchSize); 98 } while (prefixMatchingBits < targetMatchSize);
102 99
103 this._toll = payment.toHexString().substring(2) 100 this._toll = payment.toHexString().substring(2)
104 } 101 }
105 102
106 return this; 103 return this;
107 }, 104 },
108 */ 105 */
109 //------------------------------------------------------------------------- 106 //-------------------------------------------------------------------------
110 107
111 'innerDeferredPay': function (aTargetValue, aCost, aPayment) { 108 'innerDeferredPay': function (aTargetValue, aCost, aPayment) {
112 var deferredResult; 109 var deferredResult;
113 var result; 110 var result;
114 var payment; 111 var payment;
115 var i; 112 var i;
116 113
117 result = null; 114 result = null;
118 payment = aPayment; 115 payment = aPayment;
119 i = 0; 116 i = 0;
120 117
121 while ((result == null) && (i < Clipperz.PM.Toll.numberOfCloseLoopIterations)) { 118 while ((result == null) && (i < Clipperz.PM.Toll.numberOfCloseLoopIterations)) {
122 if (Clipperz.ByteArray.prefixMatchingBits(aTargetValue, Clipperz.Crypto.SHA.sha256(payment)) > aCost) { 119 if (Clipperz.ByteArray.prefixMatchingBits(aTargetValue, Clipperz.Crypto.SHA.sha256(payment)) > aCost) {
123 result = payment; 120 result = payment;
124 } else { 121 } else {
125 payment.increment(); 122 payment.increment();
126 } 123 }
127 124
128 i ++; 125 i ++;
129 } 126 }
130 127
131 if (result == null) { 128 if (result == null) {
132 deferredResult = MochiKit.Async.callLater(Clipperz.PM.Toll.pauseBetweenEachCloseLoop, MochiKit.Base.method(this, 'innerDeferredPay', aTargetValue, aCost, aPayment)); 129 deferredResult = MochiKit.Async.callLater(Clipperz.PM.Toll.pauseBetweenEachCloseLoop, MochiKit.Base.method(this, 'innerDeferredPay', aTargetValue, aCost, aPayment));
133 } else { 130 } else {
134 deferredResult = MochiKit.Async.succeed(result); 131 deferredResult = MochiKit.Async.succeed(result);
135 } 132 }
136 133
137 return deferredResult; 134 return deferredResult;
138 }, 135 },
139 136
140 'deferredPay': function () { 137 'deferredPay': function () {
141 vardeferredResult; 138 vardeferredResult;
142 vartoll; 139 vartoll;
143 140
144 toll = this; 141 toll = this;
145 deferredResult = new Clipperz.Async.Deferred("Toll.deferredPay"); 142 deferredResult = new Clipperz.Async.Deferred("Toll.deferredPay");
146//deferredResult.addLog("--->>> deferredPay - " + this.cost()); 143//deferredResult.addLog("--->>> deferredPay - " + this.cost());
147 deferredResult.addMethod(Clipperz.Crypto.PRNG.defaultRandomGenerator(), 'getRandomBytes', 32); 144 deferredResult.addMethod(Clipperz.Crypto.PRNG.defaultRandomGenerator(), 'getRandomBytes', 32);
148 deferredResult.addMethod(toll, 'innerDeferredPay', new Clipperz.ByteArray("0x" + this.targetValue()), this.cost()); 145 deferredResult.addMethod(toll, 'innerDeferredPay', new Clipperz.ByteArray("0x" + this.targetValue()), this.cost());
149 deferredResult.addCallback(MochiKit.Base.bind(function(aPayment) { 146 deferredResult.addCallback(MochiKit.Base.bind(function(aPayment) {
150 var result; 147 var result;
151 148
152 result = { 149 result = {
153 targetValue: this.targetValue(), 150 targetValue: this.targetValue(),
154 toll: aPayment.toHexString().substr(2) 151 toll: aPayment.toHexString().substr(2)
155 }; 152 };
156 153
157 return result; 154 return result;
158 }, this)); 155 }, this));
159//deferredResult.addLog("<<<--- deferredPay - " + this.cost()); 156//deferredResult.addLog("<<<--- deferredPay - " + this.cost());
160 deferredResult.callback(); 157 deferredResult.callback();
161 158
162 return deferredResult; 159 return deferredResult;
163 }, 160 },
164 161
165 //========================================================================= 162 //=========================================================================
166 __syntaxFix__: "syntax fix" 163 __syntaxFix__: "syntax fix"
167 164
168}); 165});
169 166
170 167
171Clipperz.PM.Toll.validate = function(aTargetValue, aToll, aCost) { 168Clipperz.PM.Toll.validate = function(aTargetValue, aToll, aCost) {
172 var result; 169 var result;
173 vartollValue; 170 vartollValue;
174 var targetValue; 171 var targetValue;
175 var hashedTollValue; 172 var hashedTollValue;
176 var payedToll; 173 var payedToll;
177 174
178 tollValue = new Clipperz.ByteArray("0x" + aToll); 175 tollValue = new Clipperz.ByteArray("0x" + aToll);
179 targetValue = new Clipperz.ByteArray("0x" + aTargetValue); 176 targetValue = new Clipperz.ByteArray("0x" + aTargetValue);
180 hashedTollValue = Clipperz.Crypto.SHA.sha256(tollValue); 177 hashedTollValue = Clipperz.Crypto.SHA.sha256(tollValue);
181 178
182 payedToll = Clipperz.ByteArray.prefixMatchingBits(targetValue, hashedTollValue); 179 payedToll = Clipperz.ByteArray.prefixMatchingBits(targetValue, hashedTollValue);
183 180
184 if (payedToll < aCost) { 181 if (payedToll < aCost) {
185 result = false; 182 result = false;
186 } else { 183 } else {
187 result = true; 184 result = true;
188 } 185 }
189 186
190 return result; 187 return result;
191}; 188};
192 189
193Clipperz.PM.Toll.numberOfCloseLoopIterations = 50; 190Clipperz.PM.Toll.numberOfCloseLoopIterations = 50;
194Clipperz.PM.Toll.pauseBetweenEachCloseLoop = 0.5; \ No newline at end of file 191Clipperz.PM.Toll.pauseBetweenEachCloseLoop = 0.5; \ No newline at end of file
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 169946a..25e82ca 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Canvas/CoverActions/download.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Canvas/CoverActions/download.js
@@ -1,120 +1,117 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29// 26//
30 //download.js 27 //download.js
31 //Download 28 //Download
32// 29//
33 //Created by Giulio Cesare Solaroli on 3/15/10 30 //Created by Giulio Cesare Solaroli on 3/15/10
34 //Copyright 2010 Clipperz 31 //Copyright 2010 Clipperz
35 //This code was generated by Opacity. You may use or modify it in any way. 32 //This code was generated by Opacity. You may use or modify it in any way.
36// 33//
37 34
38var kClipperz_PM_UI_Canvas_CoverActions_downloadWidth = 46.0; 35var kClipperz_PM_UI_Canvas_CoverActions_downloadWidth = 46.0;
39var kClipperz_PM_UI_Canvas_CoverActions_downloadHeight = 46.0; 36var kClipperz_PM_UI_Canvas_CoverActions_downloadHeight = 46.0;
40 37
41function Clipperz_PM_UI_Canvas_CoverActions_download(canvas, aColor, aFillColor, aThickness) 38function Clipperz_PM_UI_Canvas_CoverActions_download(canvas, aColor, aFillColor, aThickness)
42{ 39{
43 var context = canvas.getContext("2d"); 40 var context = canvas.getContext("2d");
44 var alignStroke; 41 var alignStroke;
45 var resolution; 42 var resolution;
46 var stroke; 43 var stroke;
47 var path; 44 var path;
48 var pointX; 45 var pointX;
49 var pointY; 46 var pointY;
50 if (window.devicePixelRatio) 47 if (window.devicePixelRatio)
51 resolution = window.devicePixelRatio; 48 resolution = window.devicePixelRatio;
52 else 49 else
53 resolution = 1.0; 50 resolution = 1.0;
54 resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_CoverActions_downloadWidth + canvas.height / kClipperz_PM_UI_Canvas_CoverActions_downloadHeight); 51 resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_CoverActions_downloadWidth + canvas.height / kClipperz_PM_UI_Canvas_CoverActions_downloadHeight);
55 52
56 context.save(); 53 context.save();
57 context.scale(canvas.width / kClipperz_PM_UI_Canvas_CoverActions_downloadWidth, canvas.height / kClipperz_PM_UI_Canvas_CoverActions_downloadHeight); 54 context.scale(canvas.width / kClipperz_PM_UI_Canvas_CoverActions_downloadWidth, canvas.height / kClipperz_PM_UI_Canvas_CoverActions_downloadHeight);
58 context.clearRect(0.0, 0.0, kClipperz_PM_UI_Canvas_CoverActions_downloadWidth, 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);
59 56
60 // arrow 57 // arrow
61 58
62 stroke = aThickness; 59 stroke = aThickness;
63 stroke *= resolution; 60 stroke *= resolution;
64 if (stroke < 1.0) 61 if (stroke < 1.0)
65 stroke = Math.ceil(stroke); 62 stroke = Math.ceil(stroke);
66 else 63 else
67 stroke = Math.round(stroke); 64 stroke = Math.round(stroke);
68 stroke /= resolution; 65 stroke /= resolution;
69 alignStroke = (0.5 * stroke * resolution) % 1.0; 66 alignStroke = (0.5 * stroke * resolution) % 1.0;
70 context.beginPath(); 67 context.beginPath();
71 pointX = 16.5; 68 pointX = 16.5;
72 pointY = 22.5; 69 pointY = 22.5;
73 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 70 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
74 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 71 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
75 context.moveTo(pointX, pointY); 72 context.moveTo(pointX, pointY);
76 pointX = 19.5; 73 pointX = 19.5;
77 pointY = 8.5; 74 pointY = 8.5;
78 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 75 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
79 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 76 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
80 context.lineTo(pointX, pointY); 77 context.lineTo(pointX, pointY);
81 pointX = 30.038; 78 pointX = 30.038;
82 pointY = 10.605; 79 pointY = 10.605;
83 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 80 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
84 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 81 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
85 context.lineTo(pointX, pointY); 82 context.lineTo(pointX, pointY);
86 pointX = 27.354; 83 pointX = 27.354;
87 pointY = 24.354; 84 pointY = 24.354;
88 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 85 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
89 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 86 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
90 context.lineTo(pointX, pointY); 87 context.lineTo(pointX, pointY);
91 pointX = 33.28; 88 pointX = 33.28;
92 pointY = 25.293; 89 pointY = 25.293;
93 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 90 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
94 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 91 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
95 context.lineTo(pointX, pointY); 92 context.lineTo(pointX, pointY);
96 pointX = 19.81; 93 pointX = 19.81;
97 pointY = 36.828; 94 pointY = 36.828;
98 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 95 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
99 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 96 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
100 context.lineTo(pointX, pointY); 97 context.lineTo(pointX, pointY);
101 pointX = 10.07; 98 pointX = 10.07;
102 pointY = 21.617; 99 pointY = 21.617;
103 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 100 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
104 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 101 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
105 context.lineTo(pointX, pointY); 102 context.lineTo(pointX, pointY);
106 pointX = 16.5; 103 pointX = 16.5;
107 pointY = 22.5; 104 pointY = 22.5;
108 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 105 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
109 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 106 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
110 context.lineTo(pointX, pointY); 107 context.lineTo(pointX, pointY);
111 context.closePath(); 108 context.closePath();
112 context.fillStyle = aFillColor; 109 context.fillStyle = aFillColor;
113 context.fill(); 110 context.fill();
114 context.strokeStyle = aColor; 111 context.strokeStyle = aColor;
115 context.lineWidth = stroke; 112 context.lineWidth = stroke;
116 context.lineCap = "square"; 113 context.lineCap = "square";
117 context.stroke(); 114 context.stroke();
118 115
119 context.restore(); 116 context.restore();
120} 117}
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 b8e535b..ba425ec 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Canvas/CoverActions/look.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Canvas/CoverActions/look.js
@@ -1,208 +1,205 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29// 26//
30 //look.js 27 //look.js
31 //Look 28 //Look
32// 29//
33 //Created by Giulio Cesare Solaroli on 3/15/10 30 //Created by Giulio Cesare Solaroli on 3/15/10
34 //Copyright 2010 Clipperz 31 //Copyright 2010 Clipperz
35 //This code was generated by Opacity. You may use or modify it in any way. 32 //This code was generated by Opacity. You may use or modify it in any way.
36// 33//
37 34
38var kClipperz_PM_UI_Canvas_CoverActions_lookWidth = 46.0; 35var kClipperz_PM_UI_Canvas_CoverActions_lookWidth = 46.0;
39var kClipperz_PM_UI_Canvas_CoverActions_lookHeight = 46.0; 36var kClipperz_PM_UI_Canvas_CoverActions_lookHeight = 46.0;
40 37
41function Clipperz_PM_UI_Canvas_CoverActions_look(canvas, aColor, aFillColor, aThickness) 38function Clipperz_PM_UI_Canvas_CoverActions_look(canvas, aColor, aFillColor, aThickness)
42{ 39{
43 var context = canvas.getContext("2d"); 40 var context = canvas.getContext("2d");
44 var alignStroke; 41 var alignStroke;
45 var resolution; 42 var resolution;
46 var stroke; 43 var stroke;
47 var path; 44 var path;
48 var pointX; 45 var pointX;
49 var pointY; 46 var pointY;
50 if (window.devicePixelRatio) 47 if (window.devicePixelRatio)
51 resolution = window.devicePixelRatio; 48 resolution = window.devicePixelRatio;
52 else 49 else
53 resolution = 1.0; 50 resolution = 1.0;
54 resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_CoverActions_lookWidth + canvas.height / kClipperz_PM_UI_Canvas_CoverActions_lookHeight); 51 resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_CoverActions_lookWidth + canvas.height / kClipperz_PM_UI_Canvas_CoverActions_lookHeight);
55 52
56 context.save(); 53 context.save();
57 context.scale(canvas.width / kClipperz_PM_UI_Canvas_CoverActions_lookWidth, canvas.height / kClipperz_PM_UI_Canvas_CoverActions_lookHeight); 54 context.scale(canvas.width / kClipperz_PM_UI_Canvas_CoverActions_lookWidth, canvas.height / kClipperz_PM_UI_Canvas_CoverActions_lookHeight);
58 context.clearRect(0.0, 0.0, kClipperz_PM_UI_Canvas_CoverActions_lookWidth, 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);
59 56
60 // Layer 6 57 // Layer 6
61 58
62 stroke = aThickness; 59 stroke = aThickness;
63 stroke *= resolution; 60 stroke *= resolution;
64 if (stroke < 1.0) 61 if (stroke < 1.0)
65 stroke = Math.ceil(stroke); 62 stroke = Math.ceil(stroke);
66 else 63 else
67 stroke = Math.round(stroke); 64 stroke = Math.round(stroke);
68 stroke /= resolution; 65 stroke /= resolution;
69 alignStroke = (0.5 * stroke * resolution) % 1.0; 66 alignStroke = (0.5 * stroke * resolution) % 1.0;
70 context.save(); 67 context.save();
71 context.translate(17.5, 23.0); 68 context.translate(17.5, 23.0);
72 context.rotate(-0.503); 69 context.rotate(-0.503);
73 context.translate(-17.5, -23.0); 70 context.translate(-17.5, -23.0);
74 context.beginPath(); 71 context.beginPath();
75 pointX = 28.5; 72 pointX = 28.5;
76 pointY = 31.5; 73 pointY = 31.5;
77 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 74 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
78 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 75 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
79 context.moveTo(pointX, pointY); 76 context.moveTo(pointX, pointY);
80 pointX = 28.5; 77 pointX = 28.5;
81 pointY = 14.5; 78 pointY = 14.5;
82 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 79 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
83 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 80 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
84 context.lineTo(pointX, pointY); 81 context.lineTo(pointX, pointY);
85 pointX = 6.5; 82 pointX = 6.5;
86 pointY = 14.5; 83 pointY = 14.5;
87 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 84 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
88 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 85 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
89 context.lineTo(pointX, pointY); 86 context.lineTo(pointX, pointY);
90 pointX = 6.5; 87 pointX = 6.5;
91 pointY = 31.5; 88 pointY = 31.5;
92 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 89 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
93 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 90 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
94 context.lineTo(pointX, pointY); 91 context.lineTo(pointX, pointY);
95 pointX = 28.5; 92 pointX = 28.5;
96 pointY = 31.5; 93 pointY = 31.5;
97 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 94 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
98 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 95 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
99 context.lineTo(pointX, pointY); 96 context.lineTo(pointX, pointY);
100 context.closePath(); 97 context.closePath();
101 context.fillStyle = aFillColor; 98 context.fillStyle = aFillColor;
102 context.fill(); 99 context.fill();
103 context.strokeStyle = aColor; 100 context.strokeStyle = aColor;
104 context.lineWidth = stroke; 101 context.lineWidth = stroke;
105 context.lineCap = "square"; 102 context.lineCap = "square";
106 context.stroke(); 103 context.stroke();
107 context.restore(); 104 context.restore();
108 105
109 // Layer 3 106 // Layer 3
110 107
111 stroke = aThickness; 108 stroke = aThickness;
112 stroke *= resolution; 109 stroke *= resolution;
113 if (stroke < 1.0) 110 if (stroke < 1.0)
114 stroke = Math.ceil(stroke); 111 stroke = Math.ceil(stroke);
115 else 112 else
116 stroke = Math.round(stroke); 113 stroke = Math.round(stroke);
117 stroke /= resolution; 114 stroke /= resolution;
118 alignStroke = (0.5 * stroke * resolution) % 1.0; 115 alignStroke = (0.5 * stroke * resolution) % 1.0;
119 context.save(); 116 context.save();
120 context.translate(22.5, 20.0); 117 context.translate(22.5, 20.0);
121 context.rotate(-0.071); 118 context.rotate(-0.071);
122 context.translate(-22.5, -20.0); 119 context.translate(-22.5, -20.0);
123 context.beginPath(); 120 context.beginPath();
124 pointX = 33.5; 121 pointX = 33.5;
125 pointY = 28.5; 122 pointY = 28.5;
126 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 123 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
127 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 124 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
128 context.moveTo(pointX, pointY); 125 context.moveTo(pointX, pointY);
129 pointX = 33.5; 126 pointX = 33.5;
130 pointY = 11.5; 127 pointY = 11.5;
131 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 128 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
132 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 129 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
133 context.lineTo(pointX, pointY); 130 context.lineTo(pointX, pointY);
134 pointX = 11.5; 131 pointX = 11.5;
135 pointY = 11.5; 132 pointY = 11.5;
136 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 133 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
137 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 134 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
138 context.lineTo(pointX, pointY); 135 context.lineTo(pointX, pointY);
139 pointX = 11.5; 136 pointX = 11.5;
140 pointY = 28.5; 137 pointY = 28.5;
141 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 138 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
142 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 139 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
143 context.lineTo(pointX, pointY); 140 context.lineTo(pointX, pointY);
144 pointX = 33.5; 141 pointX = 33.5;
145 pointY = 28.5; 142 pointY = 28.5;
146 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 143 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
147 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 144 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
148 context.lineTo(pointX, pointY); 145 context.lineTo(pointX, pointY);
149 context.closePath(); 146 context.closePath();
150 context.fillStyle = aFillColor; 147 context.fillStyle = aFillColor;
151 context.fill(); 148 context.fill();
152 context.strokeStyle = aColor; 149 context.strokeStyle = aColor;
153 context.lineWidth = stroke; 150 context.lineWidth = stroke;
154 context.lineCap = "square"; 151 context.lineCap = "square";
155 context.stroke(); 152 context.stroke();
156 context.restore(); 153 context.restore();
157 154
158 // Layer 4 155 // Layer 4
159 156
160 stroke = aThickness; 157 stroke = aThickness;
161 stroke *= resolution; 158 stroke *= resolution;
162 if (stroke < 1.0) 159 if (stroke < 1.0)
163 stroke = Math.ceil(stroke); 160 stroke = Math.ceil(stroke);
164 else 161 else
165 stroke = Math.round(stroke); 162 stroke = Math.round(stroke);
166 stroke /= resolution; 163 stroke /= resolution;
167 alignStroke = (0.5 * stroke * resolution) % 1.0; 164 alignStroke = (0.5 * stroke * resolution) % 1.0;
168 context.save(); 165 context.save();
169 context.translate(27.5, 18.0); 166 context.translate(27.5, 18.0);
170 context.rotate(0.232); 167 context.rotate(0.232);
171 context.translate(-27.5, -18.0); 168 context.translate(-27.5, -18.0);
172 context.beginPath(); 169 context.beginPath();
173 pointX = 38.5; 170 pointX = 38.5;
174 pointY = 26.5; 171 pointY = 26.5;
175 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 172 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
176 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 173 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
177 context.moveTo(pointX, pointY); 174 context.moveTo(pointX, pointY);
178 pointX = 38.5; 175 pointX = 38.5;
179 pointY = 9.5; 176 pointY = 9.5;
180 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 177 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
181 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 178 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
182 context.lineTo(pointX, pointY); 179 context.lineTo(pointX, pointY);
183 pointX = 16.5; 180 pointX = 16.5;
184 pointY = 9.5; 181 pointY = 9.5;
185 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 182 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
186 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 183 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
187 context.lineTo(pointX, pointY); 184 context.lineTo(pointX, pointY);
188 pointX = 16.5; 185 pointX = 16.5;
189 pointY = 26.5; 186 pointY = 26.5;
190 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 187 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
191 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 188 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
192 context.lineTo(pointX, pointY); 189 context.lineTo(pointX, pointY);
193 pointX = 38.5; 190 pointX = 38.5;
194 pointY = 26.5; 191 pointY = 26.5;
195 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 192 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
196 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 193 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
197 context.lineTo(pointX, pointY); 194 context.lineTo(pointX, pointY);
198 context.closePath(); 195 context.closePath();
199 context.fillStyle = aFillColor; 196 context.fillStyle = aFillColor;
200 context.fill(); 197 context.fill();
201 context.strokeStyle = aColor; 198 context.strokeStyle = aColor;
202 context.lineWidth = stroke; 199 context.lineWidth = stroke;
203 context.lineCap = "square"; 200 context.lineCap = "square";
204 context.stroke(); 201 context.stroke();
205 context.restore(); 202 context.restore();
206 203
207 context.restore(); 204 context.restore();
208} 205}
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 9c4e5ba..5c1f860 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Canvas/Features/directLogin.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Canvas/Features/directLogin.js
@@ -1,209 +1,206 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29// 26//
30 //directLogin.js 27 //directLogin.js
31 //directLogin 28 //directLogin
32// 29//
33 //Created by Giulio Cesare Solaroli on 3/7/10 30 //Created by Giulio Cesare Solaroli on 3/7/10
34 //Copyright 2010 Clipperz 31 //Copyright 2010 Clipperz
35 //This code was generated by Opacity. You may use or modify it in any way. 32 //This code was generated by Opacity. You may use or modify it in any way.
36// 33//
37 34
38var kClipperz_PM_UI_Canvas_Features_directLoginWidth = 76.0; 35var kClipperz_PM_UI_Canvas_Features_directLoginWidth = 76.0;
39var kClipperz_PM_UI_Canvas_Features_directLoginHeight = 76.0; 36var kClipperz_PM_UI_Canvas_Features_directLoginHeight = 76.0;
40 37
41function Clipperz_PM_UI_Canvas_Features_directLogin(canvas, aColor, aBannerColor, aBannerBackgroundColor) 38function Clipperz_PM_UI_Canvas_Features_directLogin(canvas, aColor, aBannerColor, aBannerBackgroundColor)
42{ 39{
43 var context = canvas.getContext("2d"); 40 var context = canvas.getContext("2d");
44 var alignStroke; 41 var alignStroke;
45 var resolution; 42 var resolution;
46 var stroke; 43 var stroke;
47 var path; 44 var path;
48 var pointX; 45 var pointX;
49 var pointY; 46 var pointY;
50 if (window.devicePixelRatio) 47 if (window.devicePixelRatio)
51 resolution = window.devicePixelRatio; 48 resolution = window.devicePixelRatio;
52 else 49 else
53 resolution = 1.0; 50 resolution = 1.0;
54 resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_Features_directLoginWidth + canvas.height / kClipperz_PM_UI_Canvas_Features_directLoginHeight); 51 resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_Features_directLoginWidth + canvas.height / kClipperz_PM_UI_Canvas_Features_directLoginHeight);
55 52
56 context.save(); 53 context.save();
57 context.scale(canvas.width / kClipperz_PM_UI_Canvas_Features_directLoginWidth, canvas.height / kClipperz_PM_UI_Canvas_Features_directLoginHeight); 54 context.scale(canvas.width / kClipperz_PM_UI_Canvas_Features_directLoginWidth, canvas.height / kClipperz_PM_UI_Canvas_Features_directLoginHeight);
58 context.clearRect(0.0, 0.0, kClipperz_PM_UI_Canvas_Features_directLoginWidth, 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);
59 56
60 // Layer 2 57 // Layer 2
61 58
62 stroke = 6.0; 59 stroke = 6.0;
63 stroke *= resolution; 60 stroke *= resolution;
64 if (stroke < 1.0) 61 if (stroke < 1.0)
65 stroke = Math.ceil(stroke); 62 stroke = Math.ceil(stroke);
66 else 63 else
67 stroke = Math.round(stroke); 64 stroke = Math.round(stroke);
68 stroke /= resolution; 65 stroke /= resolution;
69 alignStroke = (0.5 * stroke * resolution) % 1.0; 66 alignStroke = (0.5 * stroke * resolution) % 1.0;
70 context.beginPath(); 67 context.beginPath();
71 pointX = 30.0; 68 pointX = 30.0;
72 pointY = 41.0; 69 pointY = 41.0;
73 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 70 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
74 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 71 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
75 context.moveTo(pointX, pointY); 72 context.moveTo(pointX, pointY);
76 pointX = 45.579; 73 pointX = 45.579;
77 pointY = 25.451; 74 pointY = 25.451;
78 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 75 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
79 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 76 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
80 context.lineTo(pointX, pointY); 77 context.lineTo(pointX, pointY);
81 context.strokeStyle = aColor; 78 context.strokeStyle = aColor;
82 context.lineWidth = stroke; 79 context.lineWidth = stroke;
83 context.lineCap = "square"; 80 context.lineCap = "square";
84 context.stroke(); 81 context.stroke();
85 82
86 alignStroke = 0.0; 83 alignStroke = 0.0;
87 context.beginPath(); 84 context.beginPath();
88 pointX = 34.207; 85 pointX = 34.207;
89 pointY = 45.697; 86 pointY = 45.697;
90 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 87 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
91 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 88 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
92 context.moveTo(pointX, pointY); 89 context.moveTo(pointX, pointY);
93 pointX = 24.101; 90 pointX = 24.101;
94 pointY = 37.52; 91 pointY = 37.52;
95 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 92 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
96 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 93 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
97 context.lineTo(pointX, pointY); 94 context.lineTo(pointX, pointY);
98 pointX = 24.122; 95 pointX = 24.122;
99 pointY = 47.828; 96 pointY = 47.828;
100 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 97 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
101 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 98 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
102 context.lineTo(pointX, pointY); 99 context.lineTo(pointX, pointY);
103 pointX = 34.207; 100 pointX = 34.207;
104 pointY = 45.697; 101 pointY = 45.697;
105 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 102 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
106 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 103 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
107 context.lineTo(pointX, pointY); 104 context.lineTo(pointX, pointY);
108 context.closePath(); 105 context.closePath();
109 context.fillStyle = aColor; 106 context.fillStyle = aColor;
110 context.fill(); 107 context.fill();
111 108
112 stroke = 6.0; 109 stroke = 6.0;
113 stroke *= resolution; 110 stroke *= resolution;
114 if (stroke < 1.0) 111 if (stroke < 1.0)
115 stroke = Math.ceil(stroke); 112 stroke = Math.ceil(stroke);
116 else 113 else
117 stroke = Math.round(stroke); 114 stroke = Math.round(stroke);
118 stroke /= resolution; 115 stroke /= resolution;
119 alignStroke = (0.5 * stroke * resolution) % 1.0; 116 alignStroke = (0.5 * stroke * resolution) % 1.0;
120 context.beginPath(); 117 context.beginPath();
121 pointX = 24.631; 118 pointX = 24.631;
122 pointY = 28.971; 119 pointY = 28.971;
123 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 120 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
124 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 121 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
125 context.moveTo(pointX, pointY); 122 context.moveTo(pointX, pointY);
126 pointX = 46.497; 123 pointX = 46.497;
127 pointY = 26.451; 124 pointY = 26.451;
128 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 125 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
129 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 126 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
130 context.lineTo(pointX, pointY); 127 context.lineTo(pointX, pointY);
131 context.strokeStyle = aColor; 128 context.strokeStyle = aColor;
132 context.stroke(); 129 context.stroke();
133 130
134 alignStroke = 0.0; 131 alignStroke = 0.0;
135 context.beginPath(); 132 context.beginPath();
136 pointX = 25.014; 133 pointX = 25.014;
137 pointY = 35.265; 134 pointY = 35.265;
138 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 135 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
139 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 136 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
140 context.moveTo(pointX, pointY); 137 context.moveTo(pointX, pointY);
141 pointX = 22.166; 138 pointX = 22.166;
142 pointY = 22.58; 139 pointY = 22.58;
143 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 140 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
144 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 141 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
145 context.lineTo(pointX, pointY); 142 context.lineTo(pointX, pointY);
146 pointX = 15.784; 143 pointX = 15.784;
147 pointY = 30.675; 144 pointY = 30.675;
148 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 145 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
149 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 146 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
150 context.lineTo(pointX, pointY); 147 context.lineTo(pointX, pointY);
151 pointX = 25.014; 148 pointX = 25.014;
152 pointY = 35.265; 149 pointY = 35.265;
153 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 150 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
154 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 151 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
155 context.lineTo(pointX, pointY); 152 context.lineTo(pointX, pointY);
156 context.closePath(); 153 context.closePath();
157 context.fillStyle = aColor; 154 context.fillStyle = aColor;
158 context.fill(); 155 context.fill();
159 156
160 stroke = 6.0; 157 stroke = 6.0;
161 stroke *= resolution; 158 stroke *= resolution;
162 if (stroke < 1.0) 159 if (stroke < 1.0)
163 stroke = Math.ceil(stroke); 160 stroke = Math.ceil(stroke);
164 else 161 else
165 stroke = Math.round(stroke); 162 stroke = Math.round(stroke);
166 stroke /= resolution; 163 stroke /= resolution;
167 alignStroke = (0.5 * stroke * resolution) % 1.0; 164 alignStroke = (0.5 * stroke * resolution) % 1.0;
168 context.beginPath(); 165 context.beginPath();
169 pointX = 42.282; 166 pointX = 42.282;
170 pointY = 47.03; 167 pointY = 47.03;
171 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 168 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
172 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 169 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
173 context.moveTo(pointX, pointY); 170 context.moveTo(pointX, pointY);
174 pointX = 47.771; 171 pointX = 47.771;
175 pointY = 25.714; 172 pointY = 25.714;
176 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 173 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
177 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 174 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
178 context.lineTo(pointX, pointY); 175 context.lineTo(pointX, pointY);
179 context.strokeStyle = aColor; 176 context.strokeStyle = aColor;
180 context.stroke(); 177 context.stroke();
181 178
182 alignStroke = 0.0; 179 alignStroke = 0.0;
183 context.beginPath(); 180 context.beginPath();
184 pointX = 48.294; 181 pointX = 48.294;
185 pointY = 48.929; 182 pointY = 48.929;
186 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 183 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
187 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 184 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
188 context.moveTo(pointX, pointY); 185 context.moveTo(pointX, pointY);
189 pointX = 35.432; 186 pointX = 35.432;
190 pointY = 47.039; 187 pointY = 47.039;
191 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 188 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
192 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 189 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
193 context.lineTo(pointX, pointY); 190 context.lineTo(pointX, pointY);
194 pointX = 40.7; 191 pointX = 40.7;
195 pointY = 55.899; 192 pointY = 55.899;
196 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 193 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
197 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 194 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
198 context.lineTo(pointX, pointY); 195 context.lineTo(pointX, pointY);
199 pointX = 48.294; 196 pointX = 48.294;
200 pointY = 48.929; 197 pointY = 48.929;
201 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 198 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
202 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 199 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
203 context.lineTo(pointX, pointY); 200 context.lineTo(pointX, pointY);
204 context.closePath(); 201 context.closePath();
205 context.fillStyle = aColor; 202 context.fillStyle = aColor;
206 context.fill(); 203 context.fill();
207 204
208 context.restore(); 205 context.restore();
209} 206}
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 501b69b..b829ed6 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Canvas/Features/protect.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Canvas/Features/protect.js
@@ -1,237 +1,234 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29// 26//
30 //protect.js 27 //protect.js
31 //protect 28 //protect
32// 29//
33 //Created by Giulio Cesare Solaroli on 3/7/10 30 //Created by Giulio Cesare Solaroli on 3/7/10
34 //Copyright 2010 Clipperz 31 //Copyright 2010 Clipperz
35 //This code was generated by Opacity. You may use or modify it in any way. 32 //This code was generated by Opacity. You may use or modify it in any way.
36// 33//
37 34
38var kClipperz_PM_UI_Canvas_Features_protectWidth = 76.0; 35var kClipperz_PM_UI_Canvas_Features_protectWidth = 76.0;
39var kClipperz_PM_UI_Canvas_Features_protectHeight = 76.0; 36var kClipperz_PM_UI_Canvas_Features_protectHeight = 76.0;
40 37
41function Clipperz_PM_UI_Canvas_Features_protect(canvas, aColor, aBannerColor, aBannerBackgroundColor) 38function Clipperz_PM_UI_Canvas_Features_protect(canvas, aColor, aBannerColor, aBannerBackgroundColor)
42{ 39{
43 var context = canvas.getContext("2d"); 40 var context = canvas.getContext("2d");
44 var alignStroke; 41 var alignStroke;
45 var resolution; 42 var resolution;
46 var path; 43 var path;
47 var pointX; 44 var pointX;
48 var pointY; 45 var pointY;
49 var controlPoint1X; 46 var controlPoint1X;
50 var controlPoint1Y; 47 var controlPoint1Y;
51 var controlPoint2X; 48 var controlPoint2X;
52 var controlPoint2Y; 49 var controlPoint2Y;
53 var stroke; 50 var stroke;
54 if (window.devicePixelRatio) 51 if (window.devicePixelRatio)
55 resolution = window.devicePixelRatio; 52 resolution = window.devicePixelRatio;
56 else 53 else
57 resolution = 1.0; 54 resolution = 1.0;
58 resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_Features_protectWidth + canvas.height / kClipperz_PM_UI_Canvas_Features_protectHeight); 55 resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_Features_protectWidth + canvas.height / kClipperz_PM_UI_Canvas_Features_protectHeight);
59 56
60 context.save(); 57 context.save();
61 context.scale(canvas.width / kClipperz_PM_UI_Canvas_Features_protectWidth, canvas.height / kClipperz_PM_UI_Canvas_Features_protectHeight); 58 context.scale(canvas.width / kClipperz_PM_UI_Canvas_Features_protectWidth, canvas.height / kClipperz_PM_UI_Canvas_Features_protectHeight);
62 context.clearRect(0.0, 0.0, kClipperz_PM_UI_Canvas_Features_protectWidth, 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);
63 60
64 // Layer 1 61 // Layer 1
65 62
66 alignStroke = 0.0; 63 alignStroke = 0.0;
67 context.beginPath(); 64 context.beginPath();
68 pointX = 38.5; 65 pointX = 38.5;
69 pointY = 36.0; 66 pointY = 36.0;
70 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 67 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
71 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 68 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
72 context.moveTo(pointX, pointY); 69 context.moveTo(pointX, pointY);
73 pointX = 37.068; 70 pointX = 37.068;
74 pointY = 38.816; 71 pointY = 38.816;
75 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 72 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
76 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 73 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
77 controlPoint1X = 37.41; 74 controlPoint1X = 37.41;
78 controlPoint1Y = 36.234; 75 controlPoint1Y = 36.234;
79 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 76 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
80 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 77 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
81 controlPoint2X = 37.175; 78 controlPoint2X = 37.175;
82 controlPoint2Y = 37.907; 79 controlPoint2Y = 37.907;
83 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 80 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
84 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 81 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
85 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 82 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
86 pointX = 37.031; 83 pointX = 37.031;
87 pointY = 40.802; 84 pointY = 40.802;
88 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 85 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
89 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 86 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
90 controlPoint1X = 36.991; 87 controlPoint1X = 36.991;
91 controlPoint1Y = 39.474; 88 controlPoint1Y = 39.474;
92 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 89 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
93 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 90 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
94 controlPoint2X = 36.98; 91 controlPoint2X = 36.98;
95 controlPoint2Y = 40.141; 92 controlPoint2Y = 40.141;
96 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 93 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
97 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 94 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
98 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 95 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
99 pointX = 37.258; 96 pointX = 37.258;
100 pointY = 42.23; 97 pointY = 42.23;
101 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 98 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
102 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 99 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
103 controlPoint1X = 37.068; 100 controlPoint1X = 37.068;
104 controlPoint1Y = 41.283; 101 controlPoint1Y = 41.283;
105 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 102 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
106 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 103 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
107 controlPoint2X = 37.139; 104 controlPoint2X = 37.139;
108 controlPoint2Y = 41.762; 105 controlPoint2Y = 41.762;
109 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 106 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
110 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 107 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
111 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 108 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
112 pointX = 38.348; 109 pointX = 38.348;
113 pointY = 43.979; 110 pointY = 43.979;
114 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 111 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
115 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 112 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
116 controlPoint1X = 37.402; 113 controlPoint1X = 37.402;
117 controlPoint1Y = 42.799; 114 controlPoint1Y = 42.799;
118 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 115 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
119 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 116 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
120 controlPoint2X = 37.682; 117 controlPoint2X = 37.682;
121 controlPoint2Y = 43.798; 118 controlPoint2Y = 43.798;
122 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 119 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
123 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 120 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
124 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 121 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
125 pointX = 38.5; 122 pointX = 38.5;
126 pointY = 36.0; 123 pointY = 36.0;
127 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 124 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
128 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 125 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
129 controlPoint1X = 40.249; 126 controlPoint1X = 40.249;
130 controlPoint1Y = 44.497; 127 controlPoint1Y = 44.497;
131 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 128 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
132 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 129 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
133 controlPoint2X = 40.723; 130 controlPoint2X = 40.723;
134 controlPoint2Y = 36.303; 131 controlPoint2Y = 36.303;
135 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 132 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
136 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 133 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
137 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 134 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
138 pointX = 38.5; 135 pointX = 38.5;
139 pointY = 36.0; 136 pointY = 36.0;
140 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 137 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
141 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 138 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
142 context.lineTo(pointX, pointY); 139 context.lineTo(pointX, pointY);
143 context.closePath(); 140 context.closePath();
144 pointX = 50.0; 141 pointX = 50.0;
145 pointY = 52.0; 142 pointY = 52.0;
146 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 143 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
147 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 144 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
148 context.moveTo(pointX, pointY); 145 context.moveTo(pointX, pointY);
149 pointX = 26.0; 146 pointX = 26.0;
150 pointY = 52.0; 147 pointY = 52.0;
151 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 148 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
152 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 149 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
153 context.lineTo(pointX, pointY); 150 context.lineTo(pointX, pointY);
154 pointX = 26.0; 151 pointX = 26.0;
155 pointY = 33.0; 152 pointY = 33.0;
156 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 153 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
157 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 154 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
158 context.lineTo(pointX, pointY); 155 context.lineTo(pointX, pointY);
159 pointX = 50.0; 156 pointX = 50.0;
160 pointY = 33.0; 157 pointY = 33.0;
161 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 158 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
162 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 159 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
163 context.lineTo(pointX, pointY); 160 context.lineTo(pointX, pointY);
164 pointX = 50.0; 161 pointX = 50.0;
165 pointY = 52.0; 162 pointY = 52.0;
166 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 163 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
167 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 164 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
168 context.lineTo(pointX, pointY); 165 context.lineTo(pointX, pointY);
169 context.closePath(); 166 context.closePath();
170 context.fillStyle = aColor; 167 context.fillStyle = aColor;
171 context.fill(); 168 context.fill();
172 169
173 alignStroke = 0.0; 170 alignStroke = 0.0;
174 context.beginPath(); 171 context.beginPath();
175 pointX = 47.0; 172 pointX = 47.0;
176 pointY = 32.463; 173 pointY = 32.463;
177 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 174 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
178 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 175 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
179 context.moveTo(pointX, pointY); 176 context.moveTo(pointX, pointY);
180 pointX = 38.0; 177 pointX = 38.0;
181 pointY = 52.0; 178 pointY = 52.0;
182 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 179 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
183 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 180 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
184 controlPoint1X = 47.0; 181 controlPoint1X = 47.0;
185 controlPoint1Y = 52.925; 182 controlPoint1Y = 52.925;
186 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 183 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
187 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 184 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
188 controlPoint2X = 38.0; 185 controlPoint2X = 38.0;
189 controlPoint2Y = 52.0; 186 controlPoint2Y = 52.0;
190 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 187 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
191 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 188 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
192 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 189 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
193 pointX = 29.0; 190 pointX = 29.0;
194 pointY = 32.463; 191 pointY = 32.463;
195 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 192 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
196 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 193 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
197 controlPoint1X = 38.0; 194 controlPoint1X = 38.0;
198 controlPoint1Y = 52.0; 195 controlPoint1Y = 52.0;
199 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 196 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
200 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 197 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
201 controlPoint2X = 29.0; 198 controlPoint2X = 29.0;
202 controlPoint2Y = 52.925; 199 controlPoint2Y = 52.925;
203 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 200 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
204 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 201 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
205 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 202 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
206 pointX = 47.0; 203 pointX = 47.0;
207 pointY = 32.463; 204 pointY = 32.463;
208 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 205 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
209 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 206 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
210 controlPoint1X = 29.0; 207 controlPoint1X = 29.0;
211 controlPoint1Y = 12.0; 208 controlPoint1Y = 12.0;
212 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 209 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
213 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 210 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
214 controlPoint2X = 47.0; 211 controlPoint2X = 47.0;
215 controlPoint2Y = 12.0; 212 controlPoint2Y = 12.0;
216 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 213 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
217 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 214 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
218 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 215 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
219 context.closePath(); 216 context.closePath();
220 context.strokeStyle = aColor; 217 context.strokeStyle = aColor;
221 stroke = 4.0; 218 stroke = 4.0;
222 stroke *= resolution; 219 stroke *= resolution;
223 if (stroke < 1.0) 220 if (stroke < 1.0)
224 stroke = Math.ceil(stroke); 221 stroke = Math.ceil(stroke);
225 else 222 else
226 stroke = Math.round(stroke); 223 stroke = Math.round(stroke);
227 stroke /= resolution; 224 stroke /= resolution;
228 stroke *= 2.0; 225 stroke *= 2.0;
229 context.lineWidth = stroke; 226 context.lineWidth = stroke;
230 context.lineCap = "square"; 227 context.lineCap = "square";
231 context.save(); 228 context.save();
232 context.clip(); 229 context.clip();
233 context.stroke(); 230 context.stroke();
234 context.restore(); 231 context.restore();
235 232
236 context.restore(); 233 context.restore();
237} 234}
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 825a17e..8d73cc7 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Canvas/Features/share.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Canvas/Features/share.js
@@ -1,408 +1,405 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29// 26//
30 //share.js 27 //share.js
31 //share 28 //share
32// 29//
33 //Created by Giulio Cesare Solaroli on 3/7/10 30 //Created by Giulio Cesare Solaroli on 3/7/10
34 //Copyright 2010 Clipperz 31 //Copyright 2010 Clipperz
35 //This code was generated by Opacity. You may use or modify it in any way. 32 //This code was generated by Opacity. You may use or modify it in any way.
36// 33//
37 34
38var kClipperz_PM_UI_Canvas_Features_shareWidth = 76.0; 35var kClipperz_PM_UI_Canvas_Features_shareWidth = 76.0;
39var kClipperz_PM_UI_Canvas_Features_shareHeight = 76.0; 36var kClipperz_PM_UI_Canvas_Features_shareHeight = 76.0;
40 37
41function Clipperz_PM_UI_Canvas_Features_share(canvas, aColor, aBannerColor, aBannerBackgroundColor) 38function Clipperz_PM_UI_Canvas_Features_share(canvas, aColor, aBannerColor, aBannerBackgroundColor)
42{ 39{
43 var context = canvas.getContext("2d"); 40 var context = canvas.getContext("2d");
44 var alignStroke; 41 var alignStroke;
45 var resolution; 42 var resolution;
46 var path; 43 var path;
47 var pointX; 44 var pointX;
48 var pointY; 45 var pointY;
49 var controlPoint1X; 46 var controlPoint1X;
50 var controlPoint1Y; 47 var controlPoint1Y;
51 var controlPoint2X; 48 var controlPoint2X;
52 var controlPoint2Y; 49 var controlPoint2Y;
53 var stroke; 50 var stroke;
54 if (window.devicePixelRatio) 51 if (window.devicePixelRatio)
55 resolution = window.devicePixelRatio; 52 resolution = window.devicePixelRatio;
56 else 53 else
57 resolution = 1.0; 54 resolution = 1.0;
58 resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_Features_shareWidth + canvas.height / kClipperz_PM_UI_Canvas_Features_shareHeight); 55 resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_Features_shareWidth + canvas.height / kClipperz_PM_UI_Canvas_Features_shareHeight);
59 56
60 context.save(); 57 context.save();
61 context.scale(canvas.width / kClipperz_PM_UI_Canvas_Features_shareWidth, canvas.height / kClipperz_PM_UI_Canvas_Features_shareHeight); 58 context.scale(canvas.width / kClipperz_PM_UI_Canvas_Features_shareWidth, canvas.height / kClipperz_PM_UI_Canvas_Features_shareHeight);
62 context.clearRect(0.0, 0.0, kClipperz_PM_UI_Canvas_Features_shareWidth, 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);
63 60
64 // Layer 1 61 // Layer 1
65 62
66 alignStroke = 0.0; 63 alignStroke = 0.0;
67 context.beginPath(); 64 context.beginPath();
68 pointX = 43.179; 65 pointX = 43.179;
69 pointY = 18.621; 66 pointY = 18.621;
70 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 67 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
71 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 68 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
72 context.moveTo(pointX, pointY); 69 context.moveTo(pointX, pointY);
73 pointX = 37.163; 70 pointX = 37.163;
74 pointY = 12.605; 71 pointY = 12.605;
75 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 72 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
76 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 73 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
77 controlPoint1X = 43.179; 74 controlPoint1X = 43.179;
78 controlPoint1Y = 15.32; 75 controlPoint1Y = 15.32;
79 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 76 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
80 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 77 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
81 controlPoint2X = 40.463; 78 controlPoint2X = 40.463;
82 controlPoint2Y = 12.605; 79 controlPoint2Y = 12.605;
83 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 80 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
84 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 81 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
85 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 82 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
86 pointX = 31.147; 83 pointX = 31.147;
87 pointY = 18.621; 84 pointY = 18.621;
88 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 85 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
89 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 86 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
90 controlPoint1X = 33.863; 87 controlPoint1X = 33.863;
91 controlPoint1Y = 12.605; 88 controlPoint1Y = 12.605;
92 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 89 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
93 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 90 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
94 controlPoint2X = 31.147; 91 controlPoint2X = 31.147;
95 controlPoint2Y = 15.32; 92 controlPoint2Y = 15.32;
96 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 93 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
97 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 94 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
98 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 95 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
99 pointX = 37.163; 96 pointX = 37.163;
100 pointY = 24.637; 97 pointY = 24.637;
101 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 98 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
102 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 99 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
103 controlPoint1X = 31.147; 100 controlPoint1X = 31.147;
104 controlPoint1Y = 21.921; 101 controlPoint1Y = 21.921;
105 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 102 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
106 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 103 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
107 controlPoint2X = 33.863; 104 controlPoint2X = 33.863;
108 controlPoint2Y = 24.637; 105 controlPoint2Y = 24.637;
109 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 106 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
110 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 107 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
111 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 108 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
112 pointX = 43.179; 109 pointX = 43.179;
113 pointY = 18.621; 110 pointY = 18.621;
114 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 111 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
115 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 112 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
116 controlPoint1X = 40.463; 113 controlPoint1X = 40.463;
117 controlPoint1Y = 24.637; 114 controlPoint1Y = 24.637;
118 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 115 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
119 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 116 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
120 controlPoint2X = 43.179; 117 controlPoint2X = 43.179;
121 controlPoint2Y = 21.921; 118 controlPoint2Y = 21.921;
122 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 119 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
123 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 120 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
124 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 121 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
125 context.closePath(); 122 context.closePath();
126 context.fillStyle = aColor; 123 context.fillStyle = aColor;
127 context.fill(); 124 context.fill();
128 125
129 alignStroke = 0.0; 126 alignStroke = 0.0;
130 context.beginPath(); 127 context.beginPath();
131 pointX = 56.548; 128 pointX = 56.548;
132 pointY = 53.379; 129 pointY = 53.379;
133 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 130 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
134 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 131 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
135 context.moveTo(pointX, pointY); 132 context.moveTo(pointX, pointY);
136 pointX = 51.2; 133 pointX = 51.2;
137 pointY = 48.032; 134 pointY = 48.032;
138 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 135 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
139 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 136 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
140 controlPoint1X = 56.548; 137 controlPoint1X = 56.548;
141 controlPoint1Y = 50.446; 138 controlPoint1Y = 50.446;
142 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 139 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
143 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 140 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
144 controlPoint2X = 54.134; 141 controlPoint2X = 54.134;
145 controlPoint2Y = 48.032; 142 controlPoint2Y = 48.032;
146 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 143 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
147 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 144 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
148 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 145 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
149 pointX = 45.853; 146 pointX = 45.853;
150 pointY = 53.379; 147 pointY = 53.379;
151 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 148 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
152 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 149 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
153 controlPoint1X = 48.267; 150 controlPoint1X = 48.267;
154 controlPoint1Y = 48.032; 151 controlPoint1Y = 48.032;
155 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 152 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
156 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 153 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
157 controlPoint2X = 45.853; 154 controlPoint2X = 45.853;
158 controlPoint2Y = 50.446; 155 controlPoint2Y = 50.446;
159 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 156 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
160 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 157 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
161 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 158 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
162 pointX = 51.2; 159 pointX = 51.2;
163 pointY = 58.727; 160 pointY = 58.727;
164 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 161 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
165 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 162 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
166 controlPoint1X = 45.853; 163 controlPoint1X = 45.853;
167 controlPoint1Y = 56.313; 164 controlPoint1Y = 56.313;
168 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 165 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
169 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 166 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
170 controlPoint2X = 48.267; 167 controlPoint2X = 48.267;
171 controlPoint2Y = 58.727; 168 controlPoint2Y = 58.727;
172 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 169 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
173 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 170 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
174 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 171 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
175 pointX = 56.548; 172 pointX = 56.548;
176 pointY = 53.379; 173 pointY = 53.379;
177 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 174 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
178 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 175 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
179 controlPoint1X = 54.134; 176 controlPoint1X = 54.134;
180 controlPoint1Y = 58.727; 177 controlPoint1Y = 58.727;
181 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 178 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
182 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 179 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
183 controlPoint2X = 56.548; 180 controlPoint2X = 56.548;
184 controlPoint2Y = 56.313; 181 controlPoint2Y = 56.313;
185 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 182 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
186 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 183 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
187 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 184 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
188 context.closePath(); 185 context.closePath();
189 context.fillStyle = aColor; 186 context.fillStyle = aColor;
190 context.fill(); 187 context.fill();
191 188
192 alignStroke = 0.0; 189 alignStroke = 0.0;
193 context.beginPath(); 190 context.beginPath();
194 pointX = 31.147; 191 pointX = 31.147;
195 pointY = 38.674; 192 pointY = 38.674;
196 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 193 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
197 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 194 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
198 context.moveTo(pointX, pointY); 195 context.moveTo(pointX, pointY);
199 pointX = 25.8; 196 pointX = 25.8;
200 pointY = 33.326; 197 pointY = 33.326;
201 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 198 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
202 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 199 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
203 controlPoint1X = 31.147; 200 controlPoint1X = 31.147;
204 controlPoint1Y = 35.74; 201 controlPoint1Y = 35.74;
205 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 202 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
206 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 203 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
207 controlPoint2X = 28.733; 204 controlPoint2X = 28.733;
208 controlPoint2Y = 33.326; 205 controlPoint2Y = 33.326;
209 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 206 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
210 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 207 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
211 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 208 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
212 pointX = 20.452; 209 pointX = 20.452;
213 pointY = 38.674; 210 pointY = 38.674;
214 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 211 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
215 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 212 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
216 controlPoint1X = 22.866; 213 controlPoint1X = 22.866;
217 controlPoint1Y = 33.326; 214 controlPoint1Y = 33.326;
218 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 215 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
219 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 216 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
220 controlPoint2X = 20.452; 217 controlPoint2X = 20.452;
221 controlPoint2Y = 35.74; 218 controlPoint2Y = 35.74;
222 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 219 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
223 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 220 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
224 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 221 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
225 pointX = 25.8; 222 pointX = 25.8;
226 pointY = 44.021; 223 pointY = 44.021;
227 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 224 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
228 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 225 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
229 controlPoint1X = 20.452; 226 controlPoint1X = 20.452;
230 controlPoint1Y = 41.607; 227 controlPoint1Y = 41.607;
231 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 228 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
232 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 229 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
233 controlPoint2X = 22.866; 230 controlPoint2X = 22.866;
234 controlPoint2Y = 44.021; 231 controlPoint2Y = 44.021;
235 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 232 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
236 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 233 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
237 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 234 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
238 pointX = 31.147; 235 pointX = 31.147;
239 pointY = 38.674; 236 pointY = 38.674;
240 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 237 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
241 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 238 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
242 controlPoint1X = 28.733; 239 controlPoint1X = 28.733;
243 controlPoint1Y = 44.021; 240 controlPoint1Y = 44.021;
244 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 241 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
245 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 242 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
246 controlPoint2X = 31.147; 243 controlPoint2X = 31.147;
247 controlPoint2Y = 41.607; 244 controlPoint2Y = 41.607;
248 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 245 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
249 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 246 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
250 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 247 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
251 context.closePath(); 248 context.closePath();
252 context.fillStyle = aColor; 249 context.fillStyle = aColor;
253 context.fill(); 250 context.fill();
254 251
255 alignStroke = 0.0; 252 alignStroke = 0.0;
256 context.beginPath(); 253 context.beginPath();
257 pointX = 39.168; 254 pointX = 39.168;
258 pointY = 48.032; 255 pointY = 48.032;
259 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 256 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
260 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 257 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
261 context.moveTo(pointX, pointY); 258 context.moveTo(pointX, pointY);
262 pointX = 33.821; 259 pointX = 33.821;
263 pointY = 42.684; 260 pointY = 42.684;
264 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 261 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
265 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 262 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
266 controlPoint1X = 39.168; 263 controlPoint1X = 39.168;
267 controlPoint1Y = 45.098; 264 controlPoint1Y = 45.098;
268 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 265 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
269 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 266 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
270 controlPoint2X = 36.754; 267 controlPoint2X = 36.754;
271 controlPoint2Y = 42.684; 268 controlPoint2Y = 42.684;
272 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 269 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
273 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 270 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
274 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 271 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
275 pointX = 28.473; 272 pointX = 28.473;
276 pointY = 48.032; 273 pointY = 48.032;
277 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 274 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
278 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 275 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
279 controlPoint1X = 30.887; 276 controlPoint1X = 30.887;
280 controlPoint1Y = 42.684; 277 controlPoint1Y = 42.684;
281 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 278 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
282 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 279 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
283 controlPoint2X = 28.473; 280 controlPoint2X = 28.473;
284 controlPoint2Y = 45.098; 281 controlPoint2Y = 45.098;
285 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 282 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
286 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 283 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
287 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 284 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
288 pointX = 33.821; 285 pointX = 33.821;
289 pointY = 53.379; 286 pointY = 53.379;
290 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 287 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
291 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 288 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
292 controlPoint1X = 28.473; 289 controlPoint1X = 28.473;
293 controlPoint1Y = 50.965; 290 controlPoint1Y = 50.965;
294 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 291 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
295 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 292 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
296 controlPoint2X = 30.887; 293 controlPoint2X = 30.887;
297 controlPoint2Y = 53.379; 294 controlPoint2Y = 53.379;
298 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 295 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
299 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 296 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
300 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 297 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
301 pointX = 39.168; 298 pointX = 39.168;
302 pointY = 48.032; 299 pointY = 48.032;
303 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 300 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
304 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 301 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
305 controlPoint1X = 36.754; 302 controlPoint1X = 36.754;
306 controlPoint1Y = 53.379; 303 controlPoint1Y = 53.379;
307 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 304 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
308 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 305 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
309 controlPoint2X = 39.168; 306 controlPoint2X = 39.168;
310 controlPoint2Y = 50.965; 307 controlPoint2Y = 50.965;
311 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 308 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
312 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 309 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
313 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 310 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
314 context.closePath(); 311 context.closePath();
315 context.fillStyle = aColor; 312 context.fillStyle = aColor;
316 context.fill(); 313 context.fill();
317 314
318 alignStroke = 0.0; 315 alignStroke = 0.0;
319 context.beginPath(); 316 context.beginPath();
320 pointX = 56.548; 317 pointX = 56.548;
321 pointY = 29.984; 318 pointY = 29.984;
322 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 319 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
323 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 320 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
324 context.moveTo(pointX, pointY); 321 context.moveTo(pointX, pointY);
325 pointX = 53.206; 322 pointX = 53.206;
326 pointY = 26.642; 323 pointY = 26.642;
327 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 324 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
328 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 325 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
329 controlPoint1X = 56.548; 326 controlPoint1X = 56.548;
330 controlPoint1Y = 28.151; 327 controlPoint1Y = 28.151;
331 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 328 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
332 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 329 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
333 controlPoint2X = 55.039; 330 controlPoint2X = 55.039;
334 controlPoint2Y = 26.642; 331 controlPoint2Y = 26.642;
335 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 332 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
336 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 333 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
337 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 334 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
338 pointX = 49.863; 335 pointX = 49.863;
339 pointY = 29.984; 336 pointY = 29.984;
340 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 337 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
341 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 338 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
342 controlPoint1X = 51.372; 339 controlPoint1X = 51.372;
343 controlPoint1Y = 26.642; 340 controlPoint1Y = 26.642;
344 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 341 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
345 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 342 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
346 controlPoint2X = 49.863; 343 controlPoint2X = 49.863;
347 controlPoint2Y = 28.151; 344 controlPoint2Y = 28.151;
348 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 345 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
349 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 346 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
350 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 347 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
351 pointX = 53.206; 348 pointX = 53.206;
352 pointY = 33.326; 349 pointY = 33.326;
353 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 350 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
354 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 351 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
355 controlPoint1X = 49.863; 352 controlPoint1X = 49.863;
356 controlPoint1Y = 31.817; 353 controlPoint1Y = 31.817;
357 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 354 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
358 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 355 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
359 controlPoint2X = 51.372; 356 controlPoint2X = 51.372;
360 controlPoint2Y = 33.326; 357 controlPoint2Y = 33.326;
361 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 358 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
362 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 359 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
363 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 360 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
364 pointX = 56.548; 361 pointX = 56.548;
365 pointY = 29.984; 362 pointY = 29.984;
366 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 363 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
367 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 364 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
368 controlPoint1X = 55.039; 365 controlPoint1X = 55.039;
369 controlPoint1Y = 33.326; 366 controlPoint1Y = 33.326;
370 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 367 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
371 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 368 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
372 controlPoint2X = 56.548; 369 controlPoint2X = 56.548;
373 controlPoint2Y = 31.817; 370 controlPoint2Y = 31.817;
374 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 371 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
375 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 372 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
376 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 373 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
377 context.closePath(); 374 context.closePath();
378 context.fillStyle = aColor; 375 context.fillStyle = aColor;
379 context.fill(); 376 context.fill();
380 377
381 alignStroke = 0.0; 378 alignStroke = 0.0;
382 context.beginPath(); 379 context.beginPath();
383 pointX = 49.863; 380 pointX = 49.863;
384 pointY = 39.342; 381 pointY = 39.342;
385 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 382 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
386 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 383 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
387 context.moveTo(pointX, pointY); 384 context.moveTo(pointX, pointY);
388 pointX = 46.521; 385 pointX = 46.521;
389 pointY = 36.0; 386 pointY = 36.0;
390 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 387 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
391 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 388 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
392 controlPoint1X = 49.863; 389 controlPoint1X = 49.863;
393 controlPoint1Y = 37.509; 390 controlPoint1Y = 37.509;
394 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 391 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
395 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 392 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
396 controlPoint2X = 48.355; 393 controlPoint2X = 48.355;
397 controlPoint2Y = 36.0; 394 controlPoint2Y = 36.0;
398 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 395 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
399 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 396 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
400 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 397 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
401 pointX = 43.179; 398 pointX = 43.179;
402 pointY = 39.342; 399 pointY = 39.342;
403 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 400 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
404 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 401 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
405 controlPoint1X = 44.688; 402 controlPoint1X = 44.688;
406 controlPoint1Y = 36.0; 403 controlPoint1Y = 36.0;
407 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 404 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
408 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 405 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
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 eaeb7f1..572d9be 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Canvas/Features/store.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Canvas/Features/store.js
@@ -1,310 +1,307 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29// 26//
30 //store.js 27 //store.js
31 //store 28 //store
32// 29//
33 //Created by Giulio Cesare Solaroli on 3/7/10 30 //Created by Giulio Cesare Solaroli on 3/7/10
34 //Copyright 2010 Clipperz 31 //Copyright 2010 Clipperz
35 //This code was generated by Opacity. You may use or modify it in any way. 32 //This code was generated by Opacity. You may use or modify it in any way.
36// 33//
37 34
38var kClipperz_PM_UI_Canvas_Features_storeWidth = 76.0; 35var kClipperz_PM_UI_Canvas_Features_storeWidth = 76.0;
39var kClipperz_PM_UI_Canvas_Features_storeHeight = 76.0; 36var kClipperz_PM_UI_Canvas_Features_storeHeight = 76.0;
40 37
41function Clipperz_PM_UI_Canvas_Features_store(canvas, aColor, aBannerColor, aBannerBackgroundColor) 38function Clipperz_PM_UI_Canvas_Features_store(canvas, aColor, aBannerColor, aBannerBackgroundColor)
42{ 39{
43 var context = canvas.getContext("2d"); 40 var context = canvas.getContext("2d");
44 var alignStroke; 41 var alignStroke;
45 var resolution; 42 var resolution;
46 var path; 43 var path;
47 var pointX; 44 var pointX;
48 var pointY; 45 var pointY;
49 if (window.devicePixelRatio) 46 if (window.devicePixelRatio)
50 resolution = window.devicePixelRatio; 47 resolution = window.devicePixelRatio;
51 else 48 else
52 resolution = 1.0; 49 resolution = 1.0;
53 resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_Features_storeWidth + canvas.height / kClipperz_PM_UI_Canvas_Features_storeHeight); 50 resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_Features_storeWidth + canvas.height / kClipperz_PM_UI_Canvas_Features_storeHeight);
54 51
55 context.save(); 52 context.save();
56 context.scale(canvas.width / kClipperz_PM_UI_Canvas_Features_storeWidth, canvas.height / kClipperz_PM_UI_Canvas_Features_storeHeight); 53 context.scale(canvas.width / kClipperz_PM_UI_Canvas_Features_storeWidth, canvas.height / kClipperz_PM_UI_Canvas_Features_storeHeight);
57 context.clearRect(0.0, 0.0, kClipperz_PM_UI_Canvas_Features_storeWidth, 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);
58 55
59 // Layer 1 56 // Layer 1
60 57
61 alignStroke = 0.0; 58 alignStroke = 0.0;
62 context.beginPath(); 59 context.beginPath();
63 pointX = 27.0; 60 pointX = 27.0;
64 pointY = 29.5; 61 pointY = 29.5;
65 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 62 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
66 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 63 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
67 context.moveTo(pointX, pointY); 64 context.moveTo(pointX, pointY);
68 pointX = 27.0; 65 pointX = 27.0;
69 pointY = 24.5; 66 pointY = 24.5;
70 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 67 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
71 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 68 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
72 context.lineTo(pointX, pointY); 69 context.lineTo(pointX, pointY);
73 pointX = 22.0; 70 pointX = 22.0;
74 pointY = 24.5; 71 pointY = 24.5;
75 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 72 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
76 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 73 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
77 context.lineTo(pointX, pointY); 74 context.lineTo(pointX, pointY);
78 pointX = 22.0; 75 pointX = 22.0;
79 pointY = 29.5; 76 pointY = 29.5;
80 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 77 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
81 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 78 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
82 context.lineTo(pointX, pointY); 79 context.lineTo(pointX, pointY);
83 pointX = 27.0; 80 pointX = 27.0;
84 pointY = 29.5; 81 pointY = 29.5;
85 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 82 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
86 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 83 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
87 context.lineTo(pointX, pointY); 84 context.lineTo(pointX, pointY);
88 context.closePath(); 85 context.closePath();
89 context.fillStyle = aColor; 86 context.fillStyle = aColor;
90 context.fill(); 87 context.fill();
91 88
92 alignStroke = 0.0; 89 alignStroke = 0.0;
93 context.beginPath(); 90 context.beginPath();
94 pointX = 54.0; 91 pointX = 54.0;
95 pointY = 29.5; 92 pointY = 29.5;
96 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 93 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
97 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 94 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
98 context.moveTo(pointX, pointY); 95 context.moveTo(pointX, pointY);
99 pointX = 54.0; 96 pointX = 54.0;
100 pointY = 24.5; 97 pointY = 24.5;
101 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 98 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
102 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 99 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
103 context.lineTo(pointX, pointY); 100 context.lineTo(pointX, pointY);
104 pointX = 29.0; 101 pointX = 29.0;
105 pointY = 24.5; 102 pointY = 24.5;
106 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 103 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
107 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 104 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
108 context.lineTo(pointX, pointY); 105 context.lineTo(pointX, pointY);
109 pointX = 29.0; 106 pointX = 29.0;
110 pointY = 29.5; 107 pointY = 29.5;
111 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 108 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
112 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 109 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
113 context.lineTo(pointX, pointY); 110 context.lineTo(pointX, pointY);
114 pointX = 54.0; 111 pointX = 54.0;
115 pointY = 29.5; 112 pointY = 29.5;
116 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 113 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
117 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 114 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
118 context.lineTo(pointX, pointY); 115 context.lineTo(pointX, pointY);
119 context.closePath(); 116 context.closePath();
120 context.fillStyle = aColor; 117 context.fillStyle = aColor;
121 context.fill(); 118 context.fill();
122 119
123 alignStroke = 0.0; 120 alignStroke = 0.0;
124 context.beginPath(); 121 context.beginPath();
125 pointX = 43.0; 122 pointX = 43.0;
126 pointY = 37.0; 123 pointY = 37.0;
127 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 124 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
128 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 125 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
129 context.moveTo(pointX, pointY); 126 context.moveTo(pointX, pointY);
130 pointX = 43.0; 127 pointX = 43.0;
131 pointY = 32.0; 128 pointY = 32.0;
132 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 129 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
133 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 130 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
134 context.lineTo(pointX, pointY); 131 context.lineTo(pointX, pointY);
135 pointX = 29.0; 132 pointX = 29.0;
136 pointY = 32.0; 133 pointY = 32.0;
137 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 134 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
138 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 135 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
139 context.lineTo(pointX, pointY); 136 context.lineTo(pointX, pointY);
140 pointX = 29.0; 137 pointX = 29.0;
141 pointY = 37.0; 138 pointY = 37.0;
142 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 139 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
143 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 140 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
144 context.lineTo(pointX, pointY); 141 context.lineTo(pointX, pointY);
145 pointX = 43.0; 142 pointX = 43.0;
146 pointY = 37.0; 143 pointY = 37.0;
147 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 144 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
148 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 145 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
149 context.lineTo(pointX, pointY); 146 context.lineTo(pointX, pointY);
150 context.closePath(); 147 context.closePath();
151 context.fillStyle = aColor; 148 context.fillStyle = aColor;
152 context.fill(); 149 context.fill();
153 150
154 alignStroke = 0.0; 151 alignStroke = 0.0;
155 context.beginPath(); 152 context.beginPath();
156 pointX = 27.0; 153 pointX = 27.0;
157 pointY = 37.0; 154 pointY = 37.0;
158 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 155 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
159 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 156 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
160 context.moveTo(pointX, pointY); 157 context.moveTo(pointX, pointY);
161 pointX = 27.0; 158 pointX = 27.0;
162 pointY = 32.0; 159 pointY = 32.0;
163 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 160 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
164 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 161 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
165 context.lineTo(pointX, pointY); 162 context.lineTo(pointX, pointY);
166 pointX = 22.0; 163 pointX = 22.0;
167 pointY = 32.0; 164 pointY = 32.0;
168 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 165 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
169 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 166 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
170 context.lineTo(pointX, pointY); 167 context.lineTo(pointX, pointY);
171 pointX = 22.0; 168 pointX = 22.0;
172 pointY = 37.0; 169 pointY = 37.0;
173 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 170 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
174 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 171 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
175 context.lineTo(pointX, pointY); 172 context.lineTo(pointX, pointY);
176 pointX = 27.0; 173 pointX = 27.0;
177 pointY = 37.0; 174 pointY = 37.0;
178 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 175 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
179 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 176 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
180 context.lineTo(pointX, pointY); 177 context.lineTo(pointX, pointY);
181 context.closePath(); 178 context.closePath();
182 context.fillStyle = aColor; 179 context.fillStyle = aColor;
183 context.fill(); 180 context.fill();
184 181
185 alignStroke = 0.0; 182 alignStroke = 0.0;
186 context.beginPath(); 183 context.beginPath();
187 pointX = 27.0; 184 pointX = 27.0;
188 pointY = 44.0; 185 pointY = 44.0;
189 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 186 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
190 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 187 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
191 context.moveTo(pointX, pointY); 188 context.moveTo(pointX, pointY);
192 pointX = 27.0; 189 pointX = 27.0;
193 pointY = 39.0; 190 pointY = 39.0;
194 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 191 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
195 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 192 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
196 context.lineTo(pointX, pointY); 193 context.lineTo(pointX, pointY);
197 pointX = 22.0; 194 pointX = 22.0;
198 pointY = 39.0; 195 pointY = 39.0;
199 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 196 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
200 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 197 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
201 context.lineTo(pointX, pointY); 198 context.lineTo(pointX, pointY);
202 pointX = 22.0; 199 pointX = 22.0;
203 pointY = 44.0; 200 pointY = 44.0;
204 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 201 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
205 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 202 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
206 context.lineTo(pointX, pointY); 203 context.lineTo(pointX, pointY);
207 pointX = 27.0; 204 pointX = 27.0;
208 pointY = 44.0; 205 pointY = 44.0;
209 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 206 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
210 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 207 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
211 context.lineTo(pointX, pointY); 208 context.lineTo(pointX, pointY);
212 context.closePath(); 209 context.closePath();
213 context.fillStyle = aColor; 210 context.fillStyle = aColor;
214 context.fill(); 211 context.fill();
215 212
216 alignStroke = 0.0; 213 alignStroke = 0.0;
217 context.beginPath(); 214 context.beginPath();
218 pointX = 46.0; 215 pointX = 46.0;
219 pointY = 44.0; 216 pointY = 44.0;
220 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 217 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
221 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 218 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
222 context.moveTo(pointX, pointY); 219 context.moveTo(pointX, pointY);
223 pointX = 46.0; 220 pointX = 46.0;
224 pointY = 39.0; 221 pointY = 39.0;
225 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 222 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
226 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 223 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
227 context.lineTo(pointX, pointY); 224 context.lineTo(pointX, pointY);
228 pointX = 29.0; 225 pointX = 29.0;
229 pointY = 39.0; 226 pointY = 39.0;
230 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 227 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
231 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 228 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
232 context.lineTo(pointX, pointY); 229 context.lineTo(pointX, pointY);
233 pointX = 29.0; 230 pointX = 29.0;
234 pointY = 44.0; 231 pointY = 44.0;
235 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 232 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
236 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 233 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
237 context.lineTo(pointX, pointY); 234 context.lineTo(pointX, pointY);
238 pointX = 46.0; 235 pointX = 46.0;
239 pointY = 44.0; 236 pointY = 44.0;
240 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 237 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
241 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 238 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
242 context.lineTo(pointX, pointY); 239 context.lineTo(pointX, pointY);
243 context.closePath(); 240 context.closePath();
244 context.fillStyle = aColor; 241 context.fillStyle = aColor;
245 context.fill(); 242 context.fill();
246 243
247 alignStroke = 0.0; 244 alignStroke = 0.0;
248 context.beginPath(); 245 context.beginPath();
249 pointX = 40.0; 246 pointX = 40.0;
250 pointY = 51.0; 247 pointY = 51.0;
251 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 248 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
252 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 249 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
253 context.moveTo(pointX, pointY); 250 context.moveTo(pointX, pointY);
254 pointX = 40.0; 251 pointX = 40.0;
255 pointY = 46.0; 252 pointY = 46.0;
256 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 253 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
257 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 254 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
258 context.lineTo(pointX, pointY); 255 context.lineTo(pointX, pointY);
259 pointX = 29.0; 256 pointX = 29.0;
260 pointY = 46.0; 257 pointY = 46.0;
261 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 258 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
262 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 259 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
263 context.lineTo(pointX, pointY); 260 context.lineTo(pointX, pointY);
264 pointX = 29.0; 261 pointX = 29.0;
265 pointY = 51.0; 262 pointY = 51.0;
266 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 263 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
267 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 264 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
268 context.lineTo(pointX, pointY); 265 context.lineTo(pointX, pointY);
269 pointX = 40.0; 266 pointX = 40.0;
270 pointY = 51.0; 267 pointY = 51.0;
271 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 268 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
272 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 269 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
273 context.lineTo(pointX, pointY); 270 context.lineTo(pointX, pointY);
274 context.closePath(); 271 context.closePath();
275 context.fillStyle = aColor; 272 context.fillStyle = aColor;
276 context.fill(); 273 context.fill();
277 274
278 alignStroke = 0.0; 275 alignStroke = 0.0;
279 context.beginPath(); 276 context.beginPath();
280 pointX = 27.0; 277 pointX = 27.0;
281 pointY = 51.0; 278 pointY = 51.0;
282 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 279 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
283 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 280 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
284 context.moveTo(pointX, pointY); 281 context.moveTo(pointX, pointY);
285 pointX = 27.0; 282 pointX = 27.0;
286 pointY = 46.0; 283 pointY = 46.0;
287 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 284 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
288 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 285 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
289 context.lineTo(pointX, pointY); 286 context.lineTo(pointX, pointY);
290 pointX = 22.0; 287 pointX = 22.0;
291 pointY = 46.0; 288 pointY = 46.0;
292 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 289 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
293 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 290 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
294 context.lineTo(pointX, pointY); 291 context.lineTo(pointX, pointY);
295 pointX = 22.0; 292 pointX = 22.0;
296 pointY = 51.0; 293 pointY = 51.0;
297 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 294 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
298 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 295 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
299 context.lineTo(pointX, pointY); 296 context.lineTo(pointX, pointY);
300 pointX = 27.0; 297 pointX = 27.0;
301 pointY = 51.0; 298 pointY = 51.0;
302 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 299 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
303 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 300 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
304 context.lineTo(pointX, pointY); 301 context.lineTo(pointX, pointY);
305 context.closePath(); 302 context.closePath();
306 context.fillStyle = aColor; 303 context.fillStyle = aColor;
307 context.fill(); 304 context.fill();
308 305
309 context.restore(); 306 context.restore();
310} 307}
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Canvas/GraphicFunctions.js b/frontend/gamma/js/Clipperz/PM/UI/Canvas/GraphicFunctions.js
index 5de2e96..b9443bd 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Canvas/GraphicFunctions.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Canvas/GraphicFunctions.js
@@ -1,68 +1,65 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.PM.UI.Canvas'); 26Clipperz.Base.module('Clipperz.PM.UI.Canvas');
30 27
31MochiKit.Base.update(Clipperz.PM.UI.Canvas , { 28MochiKit.Base.update(Clipperz.PM.UI.Canvas , {
32 'marks': { 29 'marks': {
33 '!':Clipperz_PM_UI_Canvas_Marks_exclamationMark, 30 '!':Clipperz_PM_UI_Canvas_Marks_exclamationMark,
34 '?':Clipperz_PM_UI_Canvas_Marks_questionMark, 31 '?':Clipperz_PM_UI_Canvas_Marks_questionMark,
35 'i':Clipperz_PM_UI_Canvas_Marks_info 32 'i':Clipperz_PM_UI_Canvas_Marks_info
36 }, 33 },
37 34
38 'features': { 35 'features': {
39 'store': Clipperz_PM_UI_Canvas_Features_store, 36 'store': Clipperz_PM_UI_Canvas_Features_store,
40 'protect': Clipperz_PM_UI_Canvas_Features_protect, 37 'protect': Clipperz_PM_UI_Canvas_Features_protect,
41 'directLogin':Clipperz_PM_UI_Canvas_Features_directLogin, 38 'directLogin':Clipperz_PM_UI_Canvas_Features_directLogin,
42 'share': Clipperz_PM_UI_Canvas_Features_share 39 'share': Clipperz_PM_UI_Canvas_Features_share
43 }, 40 },
44 41
45 'tips': { 42 'tips': {
46 'open': Clipperz_PM_UI_Canvas_Tips_open, 43 'open': Clipperz_PM_UI_Canvas_Tips_open,
47 'close': Clipperz_PM_UI_Canvas_Tips_close 44 'close': Clipperz_PM_UI_Canvas_Tips_close
48 }, 45 },
49 46
50 'star': { 47 'star': {
51 'normal': Clipperz_PM_UI_Canvas_Star_normal 48 'normal': Clipperz_PM_UI_Canvas_Star_normal
52 }, 49 },
53 50
54 'coverActions': { 51 'coverActions': {
55 'look': Clipperz_PM_UI_Canvas_CoverActions_look, 52 'look': Clipperz_PM_UI_Canvas_CoverActions_look,
56 'download': Clipperz_PM_UI_Canvas_CoverActions_download 53 'download': Clipperz_PM_UI_Canvas_CoverActions_download
57 }, 54 },
58 55
59 'registerButton': { 56 'registerButton': {
60 'normal': Clipperz_PM_UI_Canvas_RegisterButton_normal 57 'normal': Clipperz_PM_UI_Canvas_RegisterButton_normal
61 }, 58 },
62 59
63 'logo': { 60 'logo': {
64 'normal': Clipperz_PM_UI_Canvas_Logo_normal 61 'normal': Clipperz_PM_UI_Canvas_Logo_normal
65 }, 62 },
66 63
67 __syntaxFix__: "syntax fix" 64 __syntaxFix__: "syntax fix"
68}); 65});
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 e0bea36..de9d3aa 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Canvas/Logo/normal.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Canvas/Logo/normal.js
@@ -1,65 +1,62 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29// 26//
30 //normal.js 27 //normal.js
31 //normal 28 //normal
32// 29//
33 //Created by Giulio Cesare Solaroli on 3/25/10 30 //Created by Giulio Cesare Solaroli on 3/25/10
34 //Copyright 2010 Clipperz 31 //Copyright 2010 Clipperz
35 //This code was generated by Opacity. You may use or modify it in any way. 32 //This code was generated by Opacity. You may use or modify it in any way.
36// 33//
37 34
38var kClipperz_PM_UI_Canvas_Logo_normalWidth = 150.0; 35var kClipperz_PM_UI_Canvas_Logo_normalWidth = 150.0;
39var kClipperz_PM_UI_Canvas_Logo_normalHeight = 39.0; 36var kClipperz_PM_UI_Canvas_Logo_normalHeight = 39.0;
40 37
41function Clipperz_PM_UI_Canvas_Logo_normal(canvas, aMainColor, aSecondaryColor) 38function Clipperz_PM_UI_Canvas_Logo_normal(canvas, aMainColor, aSecondaryColor)
42{ 39{
43 var context = canvas.getContext("2d"); 40 var context = canvas.getContext("2d");
44 var string; 41 var string;
45 42
46 context.save(); 43 context.save();
47 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);
48 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);
49 46
50 // clipper… 47 // clipper…
51 48
52 string = "clipper"; 49 string = "clipper";
53 context.font = "38.0pt Helvetica-Bold"; 50 context.font = "38.0pt Helvetica-Bold";
54 context.fillStyle = aMainColor; 51 context.fillStyle = aMainColor;
55 context.fillText(string, -9.0, -9.0); 52 context.fillText(string, -9.0, -9.0);
56 53
57 // …z 54 // …z
58 55
59 string = "z"; 56 string = "z";
60 context.font = "38.0pt Helvetica-Bold"; 57 context.font = "38.0pt Helvetica-Bold";
61 context.fillStyle = aSecondaryColor; 58 context.fillStyle = aSecondaryColor;
62 context.fillText(string, 125.0, -9.0); 59 context.fillText(string, 125.0, -9.0);
63 60
64 context.restore(); 61 context.restore();
65} 62}
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 f3ae04d..02f2f80 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Canvas/Marks/exclamationMark.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Canvas/Marks/exclamationMark.js
@@ -1,280 +1,277 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29// 26//
30 //exclamationMark.js 27 //exclamationMark.js
31 //! 28 //!
32// 29//
33 //Created by Giulio Cesare Solaroli on 3/7/10 30 //Created by Giulio Cesare Solaroli on 3/7/10
34 //Copyright 2010 Clipperz 31 //Copyright 2010 Clipperz
35 //This code was generated by Opacity. You may use or modify it in any way. 32 //This code was generated by Opacity. You may use or modify it in any way.
36// 33//
37 34
38var kClipperz_PM_UI_Canvas_Marks_exclamationMarkWidth = 50.0; 35var kClipperz_PM_UI_Canvas_Marks_exclamationMarkWidth = 50.0;
39var kClipperz_PM_UI_Canvas_Marks_exclamationMarkHeight = 50.0; 36var kClipperz_PM_UI_Canvas_Marks_exclamationMarkHeight = 50.0;
40 37
41function Clipperz_PM_UI_Canvas_Marks_exclamationMark(canvas, aColor) 38function Clipperz_PM_UI_Canvas_Marks_exclamationMark(canvas, aColor)
42{ 39{
43 var context = canvas.getContext("2d"); 40 var context = canvas.getContext("2d");
44 var alignStroke; 41 var alignStroke;
45 var resolution; 42 var resolution;
46 var path; 43 var path;
47 var pointX; 44 var pointX;
48 var pointY; 45 var pointY;
49 var controlPoint1X; 46 var controlPoint1X;
50 var controlPoint1Y; 47 var controlPoint1Y;
51 var controlPoint2X; 48 var controlPoint2X;
52 var controlPoint2Y; 49 var controlPoint2Y;
53 if (window.devicePixelRatio) 50 if (window.devicePixelRatio)
54 resolution = window.devicePixelRatio; 51 resolution = window.devicePixelRatio;
55 else 52 else
56 resolution = 1.0; 53 resolution = 1.0;
57 resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_Marks_exclamationMarkWidth + canvas.height / kClipperz_PM_UI_Canvas_Marks_exclamationMarkHeight); 54 resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_Marks_exclamationMarkWidth + canvas.height / kClipperz_PM_UI_Canvas_Marks_exclamationMarkHeight);
58 55
59 context.save(); 56 context.save();
60 context.scale(canvas.width / kClipperz_PM_UI_Canvas_Marks_exclamationMarkWidth, canvas.height / kClipperz_PM_UI_Canvas_Marks_exclamationMarkHeight); 57 context.scale(canvas.width / kClipperz_PM_UI_Canvas_Marks_exclamationMarkWidth, canvas.height / kClipperz_PM_UI_Canvas_Marks_exclamationMarkHeight);
61 context.clearRect(0.0, 0.0, kClipperz_PM_UI_Canvas_Marks_exclamationMarkWidth, 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);
62 59
63 // Layer 1 60 // Layer 1
64 61
65 alignStroke = 0.0; 62 alignStroke = 0.0;
66 context.beginPath(); 63 context.beginPath();
67 pointX = 26.499; 64 pointX = 26.499;
68 pointY = 10.848; 65 pointY = 10.848;
69 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 66 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
70 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 67 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
71 context.moveTo(pointX, pointY); 68 context.moveTo(pointX, pointY);
72 pointX = 20.887; 69 pointX = 20.887;
73 pointY = 11.584; 70 pointY = 11.584;
74 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 71 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
75 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 72 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
76 controlPoint1X = 25.395; 73 controlPoint1X = 25.395;
77 controlPoint1Y = 10.802; 74 controlPoint1Y = 10.802;
78 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 75 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
79 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 76 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
80 controlPoint2X = 22.175; 77 controlPoint2X = 22.175;
81 controlPoint2Y = 11.078; 78 controlPoint2Y = 11.078;
82 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 79 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
83 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 80 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
84 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 81 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
85 pointX = 20.013; 82 pointX = 20.013;
86 pointY = 13.194; 83 pointY = 13.194;
87 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 84 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
88 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 85 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
89 controlPoint1X = 20.335; 86 controlPoint1X = 20.335;
90 controlPoint1Y = 11.814; 87 controlPoint1Y = 11.814;
91 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 88 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
92 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 89 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
93 controlPoint2X = 19.921; 90 controlPoint2X = 19.921;
94 controlPoint2Y = 12.826; 91 controlPoint2Y = 12.826;
95 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 92 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
96 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 93 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
97 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 94 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
98 pointX = 23.049; 95 pointX = 23.049;
99 pointY = 28.788; 96 pointY = 28.788;
100 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 97 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
101 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 98 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
102 controlPoint1X = 20.243; 99 controlPoint1X = 20.243;
103 controlPoint1Y = 15.448; 100 controlPoint1Y = 15.448;
104 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 101 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
105 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 102 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
106 controlPoint2X = 22.589; 103 controlPoint2X = 22.589;
107 controlPoint2Y = 26.35; 104 controlPoint2Y = 26.35;
108 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 105 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
109 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 106 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
110 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 107 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
111 pointX = 25.027; 108 pointX = 25.027;
112 pointY = 29.156; 109 pointY = 29.156;
113 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 110 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
114 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 111 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
115 controlPoint1X = 23.279; 112 controlPoint1X = 23.279;
116 controlPoint1Y = 29.018; 113 controlPoint1Y = 29.018;
117 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 114 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
118 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 115 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
119 controlPoint2X = 24.705; 116 controlPoint2X = 24.705;
120 controlPoint2Y = 29.202; 117 controlPoint2Y = 29.202;
121 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 118 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
122 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 119 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
123 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 120 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
124 pointX = 27.971; 121 pointX = 27.971;
125 pointY = 11.354; 122 pointY = 11.354;
126 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 123 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
127 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 124 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
128 controlPoint1X = 25.809; 125 controlPoint1X = 25.809;
129 controlPoint1Y = 25.384; 126 controlPoint1Y = 25.384;
130 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 127 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
131 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 128 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
132 controlPoint2X = 27.971; 129 controlPoint2X = 27.971;
133 controlPoint2Y = 12.826; 130 controlPoint2Y = 12.826;
134 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 131 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
135 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 132 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
136 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 133 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
137 pointX = 26.499; 134 pointX = 26.499;
138 pointY = 10.848; 135 pointY = 10.848;
139 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 136 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
140 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 137 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
141 controlPoint1X = 27.557; 138 controlPoint1X = 27.557;
142 controlPoint1Y = 11.032; 139 controlPoint1Y = 11.032;
143 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 140 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
144 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 141 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
145 controlPoint2X = 26.913; 142 controlPoint2X = 26.913;
146 controlPoint2Y = 10.848; 143 controlPoint2Y = 10.848;
147 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 144 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
148 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 145 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
149 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 146 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
150 pointX = 26.499; 147 pointX = 26.499;
151 pointY = 10.848; 148 pointY = 10.848;
152 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 149 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
153 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 150 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
154 context.lineTo(pointX, pointY); 151 context.lineTo(pointX, pointY);
155 context.closePath(); 152 context.closePath();
156 pointX = 24.337; 153 pointX = 24.337;
157 pointY = 31.962; 154 pointY = 31.962;
158 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 155 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
159 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 156 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
160 context.moveTo(pointX, pointY); 157 context.moveTo(pointX, pointY);
161 pointX = 21.899; 158 pointX = 21.899;
162 pointY = 32.882; 159 pointY = 32.882;
163 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 160 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
164 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 161 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
165 controlPoint1X = 23.463; 162 controlPoint1X = 23.463;
166 controlPoint1Y = 31.962; 163 controlPoint1Y = 31.962;
167 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 164 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
168 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 165 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
169 controlPoint2X = 22.589; 166 controlPoint2X = 22.589;
170 controlPoint2Y = 32.284; 167 controlPoint2Y = 32.284;
171 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 168 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
172 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 169 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
173 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 170 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
174 pointX = 20.703; 171 pointX = 20.703;
175 pointY = 35.458; 172 pointY = 35.458;
176 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 173 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
177 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 174 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
178 controlPoint1X = 21.163; 175 controlPoint1X = 21.163;
179 controlPoint1Y = 33.572; 176 controlPoint1Y = 33.572;
180 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 177 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
181 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 178 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
182 controlPoint2X = 20.703; 179 controlPoint2X = 20.703;
183 controlPoint2Y = 34.538; 180 controlPoint2Y = 34.538;
184 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 181 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
185 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 182 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
186 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 183 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
187 pointX = 21.669; 184 pointX = 21.669;
188 pointY = 38.08; 185 pointY = 38.08;
189 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 186 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
190 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 187 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
191 controlPoint1X = 20.703; 188 controlPoint1X = 20.703;
192 controlPoint1Y = 36.47; 189 controlPoint1Y = 36.47;
193 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 190 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
194 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 191 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
195 controlPoint2X = 20.979; 192 controlPoint2X = 20.979;
196 controlPoint2Y = 37.344; 193 controlPoint2Y = 37.344;
197 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 194 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
198 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 195 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
199 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 196 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
200 pointX = 24.015; 197 pointX = 24.015;
201 pointY = 39.0; 198 pointY = 39.0;
202 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 199 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
203 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 200 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
204 controlPoint1X = 22.405; 201 controlPoint1X = 22.405;
205 controlPoint1Y = 38.77; 202 controlPoint1Y = 38.77;
206 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 203 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
207 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 204 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
208 controlPoint2X = 23.325; 205 controlPoint2X = 23.325;
209 controlPoint2Y = 39.0; 206 controlPoint2Y = 39.0;
210 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 207 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
211 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 208 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
212 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 209 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
213 pointX = 26.821; 210 pointX = 26.821;
214 pointY = 38.034; 211 pointY = 38.034;
215 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 212 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
216 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 213 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
217 controlPoint1X = 25.073; 214 controlPoint1X = 25.073;
218 controlPoint1Y = 39.0; 215 controlPoint1Y = 39.0;
219 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 216 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
220 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 217 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
221 controlPoint2X = 26.131; 218 controlPoint2X = 26.131;
222 controlPoint2Y = 38.724; 219 controlPoint2Y = 38.724;
223 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 220 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
224 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 221 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
225 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 222 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
226 pointX = 27.833; 223 pointX = 27.833;
227 pointY = 35.55; 224 pointY = 35.55;
228 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 225 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
229 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 226 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
230 controlPoint1X = 27.465; 227 controlPoint1X = 27.465;
231 controlPoint1Y = 37.344; 228 controlPoint1Y = 37.344;
232 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 229 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
233 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 230 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
234 controlPoint2X = 27.833; 231 controlPoint2X = 27.833;
235 controlPoint2Y = 36.194; 232 controlPoint2Y = 36.194;
236 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 233 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
237 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 234 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
238 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 235 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
239 pointX = 26.683; 236 pointX = 26.683;
240 pointY = 32.744; 237 pointY = 32.744;
241 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 238 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
242 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 239 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
243 controlPoint1X = 27.833; 240 controlPoint1X = 27.833;
244 controlPoint1Y = 34.676; 241 controlPoint1Y = 34.676;
245 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 242 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
246 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 243 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
247 controlPoint2X = 27.557; 244 controlPoint2X = 27.557;
248 controlPoint2Y = 33.572; 245 controlPoint2Y = 33.572;
249 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 246 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
250 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 247 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
251 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 248 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
252 pointX = 24.337; 249 pointX = 24.337;
253 pointY = 31.962; 250 pointY = 31.962;
254 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 251 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
255 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 252 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
256 controlPoint1X = 26.085; 253 controlPoint1X = 26.085;
257 controlPoint1Y = 32.238; 254 controlPoint1Y = 32.238;
258 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 255 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
259 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 256 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
260 controlPoint2X = 25.211; 257 controlPoint2X = 25.211;
261 controlPoint2Y = 31.962; 258 controlPoint2Y = 31.962;
262 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 259 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
263 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 260 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
264 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 261 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
265 pointX = 24.337; 262 pointX = 24.337;
266 pointY = 31.962; 263 pointY = 31.962;
267 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 264 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
268 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 265 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
269 context.lineTo(pointX, pointY); 266 context.lineTo(pointX, pointY);
270 context.closePath(); 267 context.closePath();
271 pointX = 30.639; 268 pointX = 30.639;
272 pointY = 38.402; 269 pointY = 38.402;
273 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 270 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
274 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 271 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
275 context.moveTo(pointX, pointY); 272 context.moveTo(pointX, pointY);
276 context.fillStyle = aColor; 273 context.fillStyle = aColor;
277 context.fill(); 274 context.fill();
278 275
279 context.restore(); 276 context.restore();
280} 277}
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 adab74f..fad5c10 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Canvas/Marks/info.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Canvas/Marks/info.js
@@ -1,391 +1,388 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29// 26//
30 //info.js 27 //info.js
31 //i 28 //i
32// 29//
33 //Created by Giulio Cesare Solaroli on 3/7/10 30 //Created by Giulio Cesare Solaroli on 3/7/10
34 //Copyright 2010 Clipperz 31 //Copyright 2010 Clipperz
35 //This code was generated by Opacity. You may use or modify it in any way. 32 //This code was generated by Opacity. You may use or modify it in any way.
36// 33//
37 34
38var kClipperz_PM_UI_Canvas_Marks_infoWidth = 50.0; 35var kClipperz_PM_UI_Canvas_Marks_infoWidth = 50.0;
39var kClipperz_PM_UI_Canvas_Marks_infoHeight = 50.0; 36var kClipperz_PM_UI_Canvas_Marks_infoHeight = 50.0;
40 37
41function Clipperz_PM_UI_Canvas_Marks_info(canvas, aColor) 38function Clipperz_PM_UI_Canvas_Marks_info(canvas, aColor)
42{ 39{
43 var context = canvas.getContext("2d"); 40 var context = canvas.getContext("2d");
44 var alignStroke; 41 var alignStroke;
45 var resolution; 42 var resolution;
46 var path; 43 var path;
47 var pointX; 44 var pointX;
48 var pointY; 45 var pointY;
49 var controlPoint1X; 46 var controlPoint1X;
50 var controlPoint1Y; 47 var controlPoint1Y;
51 var controlPoint2X; 48 var controlPoint2X;
52 var controlPoint2Y; 49 var controlPoint2Y;
53 var color; 50 var color;
54 if (window.devicePixelRatio) 51 if (window.devicePixelRatio)
55 resolution = window.devicePixelRatio; 52 resolution = window.devicePixelRatio;
56 else 53 else
57 resolution = 1.0; 54 resolution = 1.0;
58 resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_Marks_infoWidth + canvas.height / kClipperz_PM_UI_Canvas_Marks_infoHeight); 55 resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_Marks_infoWidth + canvas.height / kClipperz_PM_UI_Canvas_Marks_infoHeight);
59 56
60 context.save(); 57 context.save();
61 context.scale(canvas.width / kClipperz_PM_UI_Canvas_Marks_infoWidth, canvas.height / kClipperz_PM_UI_Canvas_Marks_infoHeight); 58 context.scale(canvas.width / kClipperz_PM_UI_Canvas_Marks_infoWidth, canvas.height / kClipperz_PM_UI_Canvas_Marks_infoHeight);
62 context.clearRect(0.0, 0.0, kClipperz_PM_UI_Canvas_Marks_infoWidth, 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);
63 60
64 // Layer 1 61 // Layer 1
65 62
66 alignStroke = 0.0; 63 alignStroke = 0.0;
67 context.beginPath(); 64 context.beginPath();
68 pointX = 30.253; 65 pointX = 30.253;
69 pointY = 37.436; 66 pointY = 37.436;
70 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 67 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
71 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 68 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
72 context.moveTo(pointX, pointY); 69 context.moveTo(pointX, pointY);
73 pointX = 28.505; 70 pointX = 28.505;
74 pointY = 37.022; 71 pointY = 37.022;
75 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 72 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
76 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 73 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
77 context.lineTo(pointX, pointY); 74 context.lineTo(pointX, pointY);
78 pointX = 27.677; 75 pointX = 27.677;
79 pointY = 35.09; 76 pointY = 35.09;
80 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 77 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
81 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 78 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
82 controlPoint1X = 27.953; 79 controlPoint1X = 27.953;
83 controlPoint1Y = 36.792; 80 controlPoint1Y = 36.792;
84 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 81 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
85 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 82 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
86 controlPoint2X = 27.677; 83 controlPoint2X = 27.677;
87 controlPoint2Y = 36.47; 84 controlPoint2Y = 36.47;
88 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 85 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
89 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 86 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
90 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 87 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
91 pointX = 27.631; 88 pointX = 27.631;
92 pointY = 27.546; 89 pointY = 27.546;
93 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 90 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
94 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 91 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
95 controlPoint1X = 27.631; 92 controlPoint1X = 27.631;
96 controlPoint1Y = 32.974; 93 controlPoint1Y = 32.974;
97 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 94 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
98 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 95 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
99 controlPoint2X = 27.631; 96 controlPoint2X = 27.631;
100 controlPoint2Y = 29.892; 97 controlPoint2Y = 29.892;
101 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 98 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
102 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 99 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
103 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 100 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
104 pointX = 27.677; 101 pointX = 27.677;
105 pointY = 19.726; 102 pointY = 19.726;
106 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 103 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
107 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 104 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
108 controlPoint1X = 27.631; 105 controlPoint1X = 27.631;
109 controlPoint1Y = 24.97; 106 controlPoint1Y = 24.97;
110 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 107 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
111 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 108 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
112 controlPoint2X = 27.677; 109 controlPoint2X = 27.677;
113 controlPoint2Y = 21.612; 110 controlPoint2Y = 21.612;
114 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 111 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
115 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 112 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
116 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 113 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
117 pointX = 19.535; 114 pointX = 19.535;
118 pointY = 21.336; 115 pointY = 21.336;
119 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 116 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
120 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 117 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
121 controlPoint1X = 25.331; 118 controlPoint1X = 25.331;
122 controlPoint1Y = 20.692; 119 controlPoint1Y = 20.692;
123 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 120 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
124 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 121 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
125 controlPoint2X = 20.593; 122 controlPoint2X = 20.593;
126 controlPoint2Y = 21.336; 123 controlPoint2Y = 21.336;
127 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 124 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
128 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 125 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
129 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 126 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
130 pointX = 19.443; 127 pointX = 19.443;
131 pointY = 22.762; 128 pointY = 22.762;
132 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 129 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
133 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 130 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
134 controlPoint1X = 19.397; 131 controlPoint1X = 19.397;
135 controlPoint1Y = 21.52; 132 controlPoint1Y = 21.52;
136 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 133 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
137 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 134 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
138 controlPoint2X = 19.305; 135 controlPoint2X = 19.305;
139 controlPoint2Y = 22.532; 136 controlPoint2Y = 22.532;
140 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 137 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
141 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 138 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
142 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 139 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
143 pointX = 21.283; 140 pointX = 21.283;
144 pointY = 23.82; 141 pointY = 23.82;
145 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 142 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
146 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 143 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
147 controlPoint1X = 20.639; 144 controlPoint1X = 20.639;
148 controlPoint1Y = 23.222; 145 controlPoint1Y = 23.222;
149 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 146 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
150 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 147 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
151 controlPoint2X = 20.961; 148 controlPoint2X = 20.961;
152 controlPoint2Y = 23.452; 149 controlPoint2Y = 23.452;
153 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 150 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
154 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 151 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
155 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 152 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
156 pointX = 21.605; 153 pointX = 21.605;
157 pointY = 24.97; 154 pointY = 24.97;
158 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 155 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
159 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 156 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
160 controlPoint1X = 21.513; 157 controlPoint1X = 21.513;
161 controlPoint1Y = 24.05; 158 controlPoint1Y = 24.05;
162 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 159 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
163 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 160 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
164 controlPoint2X = 21.605; 161 controlPoint2X = 21.605;
165 controlPoint2Y = 24.602; 162 controlPoint2Y = 24.602;
166 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 163 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
167 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 164 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
168 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 165 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
169 pointX = 21.651; 166 pointX = 21.651;
170 pointY = 29.156; 167 pointY = 29.156;
171 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 168 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
172 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 169 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
173 controlPoint1X = 21.651; 170 controlPoint1X = 21.651;
174 controlPoint1Y = 25.752; 171 controlPoint1Y = 25.752;
175 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 172 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
176 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 173 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
177 controlPoint2X = 21.651; 174 controlPoint2X = 21.651;
178 controlPoint2Y = 27.592; 175 controlPoint2Y = 27.592;
179 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 176 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
180 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 177 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
181 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 178 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
182 pointX = 21.605; 179 pointX = 21.605;
183 pointY = 35.228; 180 pointY = 35.228;
184 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 181 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
185 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 182 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
186 controlPoint1X = 21.651; 183 controlPoint1X = 21.651;
187 controlPoint1Y = 31.364; 184 controlPoint1Y = 31.364;
188 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 185 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
189 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 186 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
190 controlPoint2X = 21.651; 187 controlPoint2X = 21.651;
191 controlPoint2Y = 34.216; 188 controlPoint2Y = 34.216;
192 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 189 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
193 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 190 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
194 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 191 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
195 pointX = 20.823; 192 pointX = 20.823;
196 pointY = 37.022; 193 pointY = 37.022;
197 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 194 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
198 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 195 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
199 controlPoint1X = 21.559; 196 controlPoint1X = 21.559;
200 controlPoint1Y = 36.332; 197 controlPoint1Y = 36.332;
201 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 198 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
202 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 199 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
203 controlPoint2X = 21.467; 200 controlPoint2X = 21.467;
204 controlPoint2Y = 36.838; 201 controlPoint2Y = 36.838;
205 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 202 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
206 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 203 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
207 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 204 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
208 pointX = 19.121; 205 pointX = 19.121;
209 pointY = 37.436; 206 pointY = 37.436;
210 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 207 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
211 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 208 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
212 controlPoint1X = 20.363; 209 controlPoint1X = 20.363;
213 controlPoint1Y = 37.206; 210 controlPoint1Y = 37.206;
214 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 211 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
215 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 212 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
216 controlPoint2X = 19.857; 213 controlPoint2X = 19.857;
217 controlPoint2Y = 37.298; 214 controlPoint2Y = 37.298;
218 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 215 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
219 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 216 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
220 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 217 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
221 pointX = 19.121; 218 pointX = 19.121;
222 pointY = 39.0; 219 pointY = 39.0;
223 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 220 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
224 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 221 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
225 controlPoint1X = 18.937; 222 controlPoint1X = 18.937;
226 controlPoint1Y = 37.62; 223 controlPoint1Y = 37.62;
227 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 224 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
228 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 225 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
229 controlPoint2X = 18.983; 226 controlPoint2X = 18.983;
230 controlPoint2Y = 38.77; 227 controlPoint2Y = 38.77;
231 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 228 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
232 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 229 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
233 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 230 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
234 pointX = 24.503; 231 pointX = 24.503;
235 pointY = 38.862; 232 pointY = 38.862;
236 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 233 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
237 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 234 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
238 controlPoint1X = 20.271; 235 controlPoint1X = 20.271;
239 controlPoint1Y = 39.0; 236 controlPoint1Y = 39.0;
240 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 237 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
241 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 238 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
242 controlPoint2X = 21.927; 239 controlPoint2X = 21.927;
243 controlPoint2Y = 38.862; 240 controlPoint2Y = 38.862;
244 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 241 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
245 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 242 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
246 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 243 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
247 pointX = 30.023; 244 pointX = 30.023;
248 pointY = 39.0; 245 pointY = 39.0;
249 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 246 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
250 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 247 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
251 controlPoint1X = 27.401; 248 controlPoint1X = 27.401;
252 controlPoint1Y = 38.862; 249 controlPoint1Y = 38.862;
253 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 250 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
254 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 251 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
255 controlPoint2X = 29.149; 252 controlPoint2X = 29.149;
256 controlPoint2Y = 39.0; 253 controlPoint2Y = 39.0;
257 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 254 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
258 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 255 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
259 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 256 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
260 pointX = 30.253; 257 pointX = 30.253;
261 pointY = 37.436; 258 pointY = 37.436;
262 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 259 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
263 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 260 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
264 controlPoint1X = 30.299; 261 controlPoint1X = 30.299;
265 controlPoint1Y = 38.77; 262 controlPoint1Y = 38.77;
266 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 263 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
267 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 264 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
268 controlPoint2X = 30.391; 265 controlPoint2X = 30.391;
269 controlPoint2Y = 37.62; 266 controlPoint2Y = 37.62;
270 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 267 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
271 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 268 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
272 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 269 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
273 pointX = 30.253; 270 pointX = 30.253;
274 pointY = 37.436; 271 pointY = 37.436;
275 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 272 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
276 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 273 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
277 context.lineTo(pointX, pointY); 274 context.lineTo(pointX, pointY);
278 context.closePath(); 275 context.closePath();
279 pointX = 27.493; 276 pointX = 27.493;
280 pointY = 13.976; 277 pointY = 13.976;
281 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 278 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
282 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 279 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
283 context.moveTo(pointX, pointY); 280 context.moveTo(pointX, pointY);
284 pointX = 27.125; 281 pointX = 27.125;
285 pointY = 12.228; 282 pointY = 12.228;
286 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 283 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
287 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 284 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
288 controlPoint1X = 27.493; 285 controlPoint1X = 27.493;
289 controlPoint1Y = 13.608; 286 controlPoint1Y = 13.608;
290 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 287 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
291 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 288 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
292 controlPoint2X = 27.401; 289 controlPoint2X = 27.401;
293 controlPoint2Y = 12.688; 290 controlPoint2Y = 12.688;
294 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 291 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
295 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 292 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
296 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 293 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
297 pointX = 24.963; 294 pointX = 24.963;
298 pointY = 11.63; 295 pointY = 11.63;
299 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 296 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
300 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 297 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
301 controlPoint1X = 26.849; 298 controlPoint1X = 26.849;
302 controlPoint1Y = 11.998; 299 controlPoint1Y = 11.998;
303 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 300 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
304 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 301 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
305 controlPoint2X = 26.113; 302 controlPoint2X = 26.113;
306 controlPoint2Y = 11.63; 303 controlPoint2Y = 11.63;
307 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 304 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
308 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 305 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
309 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 306 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
310 pointX = 21.513; 307 pointX = 21.513;
311 pointY = 12.688; 308 pointY = 12.688;
312 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 309 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
313 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 310 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
314 controlPoint1X = 23.767; 311 controlPoint1X = 23.767;
315 controlPoint1Y = 11.63; 312 controlPoint1Y = 11.63;
316 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 313 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
317 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 314 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
318 controlPoint2X = 22.203; 315 controlPoint2X = 22.203;
319 controlPoint2Y = 12.09; 316 controlPoint2Y = 12.09;
320 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 317 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
321 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 318 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
322 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 319 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
323 pointX = 21.283; 320 pointX = 21.283;
324 pointY = 14.942; 321 pointY = 14.942;
325 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 322 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
326 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 323 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
327 controlPoint1X = 21.145; 324 controlPoint1X = 21.145;
328 controlPoint1Y = 13.148; 325 controlPoint1Y = 13.148;
329 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 326 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
330 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 327 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
331 controlPoint2X = 21.145; 328 controlPoint2X = 21.145;
332 controlPoint2Y = 14.436; 329 controlPoint2Y = 14.436;
333 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 330 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
334 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 331 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
335 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 332 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
336 pointX = 22.801; 333 pointX = 22.801;
337 pointY = 17.012; 334 pointY = 17.012;
338 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 335 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
339 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 336 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
340 controlPoint1X = 21.513; 337 controlPoint1X = 21.513;
341 controlPoint1Y = 15.908; 338 controlPoint1Y = 15.908;
342 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 339 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
343 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 340 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
344 controlPoint2X = 21.973; 341 controlPoint2X = 21.973;
345 controlPoint2Y = 16.69; 342 controlPoint2Y = 16.69;
346 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 343 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
347 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 344 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
348 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 345 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
349 pointX = 26.205; 346 pointX = 26.205;
350 pointY = 16.69; 347 pointY = 16.69;
351 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 348 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
352 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 349 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
353 controlPoint1X = 23.399; 350 controlPoint1X = 23.399;
354 controlPoint1Y = 17.288; 351 controlPoint1Y = 17.288;
355 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 352 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
356 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 353 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
357 controlPoint2X = 25.791; 354 controlPoint2X = 25.791;
358 controlPoint2Y = 17.058; 355 controlPoint2Y = 17.058;
359 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 356 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
360 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 357 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
361 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 358 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
362 pointX = 27.493; 359 pointX = 27.493;
363 pointY = 13.976; 360 pointY = 13.976;
364 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 361 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
365 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 362 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
366 controlPoint1X = 26.941; 363 controlPoint1X = 26.941;
367 controlPoint1Y = 16.046; 364 controlPoint1Y = 16.046;
368 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 365 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
369 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 366 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
370 controlPoint2X = 27.493; 367 controlPoint2X = 27.493;
371 controlPoint2Y = 14.896; 368 controlPoint2Y = 14.896;
372 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 369 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
373 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 370 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
374 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 371 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
375 pointX = 27.493; 372 pointX = 27.493;
376 pointY = 13.976; 373 pointY = 13.976;
377 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 374 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
378 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 375 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
379 context.lineTo(pointX, pointY); 376 context.lineTo(pointX, pointY);
380 context.closePath(); 377 context.closePath();
381 pointX = 30.851; 378 pointX = 30.851;
382 pointY = 38.862; 379 pointY = 38.862;
383 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 380 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
384 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 381 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
385 context.moveTo(pointX, pointY); 382 context.moveTo(pointX, pointY);
386 color = "#FFFFFF"; 383 color = "#FFFFFF";
387 context.fillStyle = color; 384 context.fillStyle = color;
388 context.fill(); 385 context.fill();
389 386
390 context.restore(); 387 context.restore();
391} 388}
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 003c4c2..5842828 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Canvas/Marks/questionMark.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Canvas/Marks/questionMark.js
@@ -1,408 +1,405 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29// 26//
30 //questionMark.js 27 //questionMark.js
31 //? 28 //?
32// 29//
33 //Created by Giulio Cesare Solaroli on 3/7/10 30 //Created by Giulio Cesare Solaroli on 3/7/10
34 //Copyright 2010 Clipperz 31 //Copyright 2010 Clipperz
35 //This code was generated by Opacity. You may use or modify it in any way. 32 //This code was generated by Opacity. You may use or modify it in any way.
36// 33//
37 34
38var kClipperz_PM_UI_Canvas_Marks_questionMarkWidth = 50.0; 35var kClipperz_PM_UI_Canvas_Marks_questionMarkWidth = 50.0;
39var kClipperz_PM_UI_Canvas_Marks_questionMarkHeight = 50.0; 36var kClipperz_PM_UI_Canvas_Marks_questionMarkHeight = 50.0;
40 37
41function Clipperz_PM_UI_Canvas_Marks_questionMark(canvas, aColor) 38function Clipperz_PM_UI_Canvas_Marks_questionMark(canvas, aColor)
42{ 39{
43 var context = canvas.getContext("2d"); 40 var context = canvas.getContext("2d");
44 var alignStroke; 41 var alignStroke;
45 var resolution; 42 var resolution;
46 var path; 43 var path;
47 var pointX; 44 var pointX;
48 var pointY; 45 var pointY;
49 var controlPoint1X; 46 var controlPoint1X;
50 var controlPoint1Y; 47 var controlPoint1Y;
51 var controlPoint2X; 48 var controlPoint2X;
52 var controlPoint2Y; 49 var controlPoint2Y;
53 var color; 50 var color;
54 if (window.devicePixelRatio) 51 if (window.devicePixelRatio)
55 resolution = window.devicePixelRatio; 52 resolution = window.devicePixelRatio;
56 else 53 else
57 resolution = 1.0; 54 resolution = 1.0;
58 resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_Marks_questionMarkWidth + canvas.height / kClipperz_PM_UI_Canvas_Marks_questionMarkHeight); 55 resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_Marks_questionMarkWidth + canvas.height / kClipperz_PM_UI_Canvas_Marks_questionMarkHeight);
59 56
60 context.save(); 57 context.save();
61 context.scale(canvas.width / kClipperz_PM_UI_Canvas_Marks_questionMarkWidth, canvas.height / kClipperz_PM_UI_Canvas_Marks_questionMarkHeight); 58 context.scale(canvas.width / kClipperz_PM_UI_Canvas_Marks_questionMarkWidth, canvas.height / kClipperz_PM_UI_Canvas_Marks_questionMarkHeight);
62 context.clearRect(0.0, 0.0, kClipperz_PM_UI_Canvas_Marks_questionMarkWidth, 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);
63 60
64 // Layer 1 61 // Layer 1
65 62
66 alignStroke = 0.0; 63 alignStroke = 0.0;
67 context.beginPath(); 64 context.beginPath();
68 pointX = 24.118; 65 pointX = 24.118;
69 pointY = 24.464; 66 pointY = 24.464;
70 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 67 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
71 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 68 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
72 context.moveTo(pointX, pointY); 69 context.moveTo(pointX, pointY);
73 pointX = 24.854; 70 pointX = 24.854;
74 pointY = 23.406; 71 pointY = 23.406;
75 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 72 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
76 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 73 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
77 controlPoint1X = 24.118; 74 controlPoint1X = 24.118;
78 controlPoint1Y = 24.05; 75 controlPoint1Y = 24.05;
79 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 76 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
80 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 77 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
81 controlPoint2X = 24.44; 78 controlPoint2X = 24.44;
82 controlPoint2Y = 23.636; 79 controlPoint2Y = 23.636;
83 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 80 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
84 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 81 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
85 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 82 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
86 pointX = 29.454; 83 pointX = 29.454;
87 pointY = 20.6; 84 pointY = 20.6;
88 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 85 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
89 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 86 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
90 controlPoint1X = 26.418; 87 controlPoint1X = 26.418;
91 controlPoint1Y = 22.532; 88 controlPoint1Y = 22.532;
92 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 89 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
93 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 90 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
94 controlPoint2X = 28.534; 91 controlPoint2X = 28.534;
95 controlPoint2Y = 21.566; 92 controlPoint2Y = 21.566;
96 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 93 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
97 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 94 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
98 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 95 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
99 pointX = 30.282; 96 pointX = 30.282;
100 pointY = 17.794; 97 pointY = 17.794;
101 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 98 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
102 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 99 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
103 controlPoint1X = 29.868; 100 controlPoint1X = 29.868;
104 controlPoint1Y = 20.232; 101 controlPoint1Y = 20.232;
105 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 102 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
106 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 103 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
107 controlPoint2X = 30.282; 104 controlPoint2X = 30.282;
108 controlPoint2Y = 19.082; 105 controlPoint2Y = 19.082;
109 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 106 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
110 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 107 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
111 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 108 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
112 pointX = 27.2; 109 pointX = 27.2;
113 pointY = 12.688; 110 pointY = 12.688;
114 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 111 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
115 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 112 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
116 controlPoint1X = 30.282; 113 controlPoint1X = 30.282;
117 controlPoint1Y = 16.322; 114 controlPoint1Y = 16.322;
118 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 115 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
119 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 116 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
120 controlPoint2X = 29.454; 117 controlPoint2X = 29.454;
121 controlPoint2Y = 14.344; 118 controlPoint2Y = 14.344;
122 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 119 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
123 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 120 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
124 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 121 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
125 pointX = 21.312; 122 pointX = 21.312;
126 pointY = 10.664; 123 pointY = 10.664;
127 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 124 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
128 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 125 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
129 controlPoint1X = 25.636; 126 controlPoint1X = 25.636;
130 controlPoint1Y = 11.492; 127 controlPoint1Y = 11.492;
131 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 128 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
132 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 129 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
133 controlPoint2X = 23.382; 130 controlPoint2X = 23.382;
134 controlPoint2Y = 10.664; 131 controlPoint2Y = 10.664;
135 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 132 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
136 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 133 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
137 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 134 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
138 pointX = 19.886; 135 pointX = 19.886;
139 pointY = 11.124; 136 pointY = 11.124;
140 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 137 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
141 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 138 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
142 controlPoint1X = 20.898; 139 controlPoint1X = 20.898;
143 controlPoint1Y = 10.664; 140 controlPoint1Y = 10.664;
144 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 141 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
145 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 142 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
146 controlPoint2X = 20.162; 143 controlPoint2X = 20.162;
147 controlPoint2Y = 10.894; 144 controlPoint2Y = 10.894;
148 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 145 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
149 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 146 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
150 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 147 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
151 pointX = 18.0; 148 pointX = 18.0;
152 pointY = 14.666; 149 pointY = 14.666;
153 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 150 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
154 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 151 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
155 controlPoint1X = 19.104; 152 controlPoint1X = 19.104;
156 controlPoint1Y = 11.676; 153 controlPoint1Y = 11.676;
157 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 154 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
158 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 155 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
159 controlPoint2X = 18.0; 156 controlPoint2X = 18.0;
160 controlPoint2Y = 14.068; 157 controlPoint2Y = 14.068;
161 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 158 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
162 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 159 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
163 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 160 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
164 pointX = 18.598; 161 pointX = 18.598;
165 pointY = 15.586; 162 pointY = 15.586;
166 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 163 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
167 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 164 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
168 controlPoint1X = 18.0; 165 controlPoint1X = 18.0;
169 controlPoint1Y = 14.896; 166 controlPoint1Y = 14.896;
170 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 167 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
171 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 168 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
172 controlPoint2X = 18.138; 169 controlPoint2X = 18.138;
173 controlPoint2Y = 15.494; 170 controlPoint2Y = 15.494;
174 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 171 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
175 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 172 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
176 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 173 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
177 pointX = 19.794; 174 pointX = 19.794;
178 pointY = 15.908; 175 pointY = 15.908;
179 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 176 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
180 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 177 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
181 controlPoint1X = 19.012; 178 controlPoint1X = 19.012;
182 controlPoint1Y = 15.678; 179 controlPoint1Y = 15.678;
183 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 180 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
184 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 181 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
185 controlPoint2X = 19.426; 182 controlPoint2X = 19.426;
186 controlPoint2Y = 15.77; 183 controlPoint2Y = 15.77;
187 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 184 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
188 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 185 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
189 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 186 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
190 pointX = 25.36; 187 pointX = 25.36;
191 pointY = 20.002; 188 pointY = 20.002;
192 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 189 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
193 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 190 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
194 controlPoint1X = 22.508; 191 controlPoint1X = 22.508;
195 controlPoint1Y = 16.644; 192 controlPoint1Y = 16.644;
196 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 193 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
197 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 194 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
198 controlPoint2X = 25.36; 195 controlPoint2X = 25.36;
199 controlPoint2Y = 17.886; 196 controlPoint2Y = 17.886;
200 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 197 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
201 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 198 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
202 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 199 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
203 pointX = 24.21; 200 pointX = 24.21;
204 pointY = 21.704; 201 pointY = 21.704;
205 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 202 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
206 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 203 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
207 controlPoint1X = 25.36; 204 controlPoint1X = 25.36;
208 controlPoint1Y = 20.738; 205 controlPoint1Y = 20.738;
209 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 206 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
210 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 207 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
211 controlPoint2X = 25.084; 208 controlPoint2X = 25.084;
212 controlPoint2Y = 21.198; 209 controlPoint2Y = 21.198;
213 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 210 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
214 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 211 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
215 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 212 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
216 pointX = 19.058; 213 pointX = 19.058;
217 pointY = 24.326; 214 pointY = 24.326;
218 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 215 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
219 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 216 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
220 controlPoint1X = 23.106; 217 controlPoint1X = 23.106;
221 controlPoint1Y = 22.348; 218 controlPoint1Y = 22.348;
222 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 219 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
223 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 220 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
224 controlPoint2X = 19.886; 221 controlPoint2X = 19.886;
225 controlPoint2Y = 23.774; 222 controlPoint2Y = 23.774;
226 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 223 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
227 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 224 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
228 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 225 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
229 pointX = 18.506; 226 pointX = 18.506;
230 pointY = 25.936; 227 pointY = 25.936;
231 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 228 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
232 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 229 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
233 controlPoint1X = 18.736; 230 controlPoint1X = 18.736;
234 controlPoint1Y = 24.556; 231 controlPoint1Y = 24.556;
235 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 232 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
236 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 233 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
237 controlPoint2X = 18.506; 234 controlPoint2X = 18.506;
238 controlPoint2Y = 25.338; 235 controlPoint2Y = 25.338;
239 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 236 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
240 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 237 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
241 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 238 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
242 pointX = 20.898; 239 pointX = 20.898;
243 pointY = 29.064; 240 pointY = 29.064;
244 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 241 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
245 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 242 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
246 controlPoint1X = 18.506; 243 controlPoint1X = 18.506;
247 controlPoint1Y = 26.948; 244 controlPoint1Y = 26.948;
248 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 245 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
249 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 246 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
250 controlPoint2X = 19.334; 247 controlPoint2X = 19.334;
251 controlPoint2Y = 28.42; 248 controlPoint2Y = 28.42;
252 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 249 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
253 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 250 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
254 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 251 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
255 pointX = 22.048; 252 pointX = 22.048;
256 pointY = 29.156; 253 pointY = 29.156;
257 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 254 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
258 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 255 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
259 controlPoint1X = 21.22; 256 controlPoint1X = 21.22;
260 controlPoint1Y = 29.156; 257 controlPoint1Y = 29.156;
261 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 258 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
262 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 259 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
263 controlPoint2X = 21.726; 260 controlPoint2X = 21.726;
264 controlPoint2Y = 29.202; 261 controlPoint2Y = 29.202;
265 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 262 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
266 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 263 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
267 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 264 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
268 pointX = 25.268; 265 pointX = 25.268;
269 pointY = 27.592; 266 pointY = 27.592;
270 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 267 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
271 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 268 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
272 controlPoint1X = 22.508; 269 controlPoint1X = 22.508;
273 controlPoint1Y = 29.064; 270 controlPoint1Y = 29.064;
274 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 271 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
275 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 272 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
276 controlPoint2X = 24.9; 273 controlPoint2X = 24.9;
277 controlPoint2Y = 27.96; 274 controlPoint2Y = 27.96;
278 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 275 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
279 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 276 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
280 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 277 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
281 pointX = 25.406; 278 pointX = 25.406;
282 pointY = 26.856; 279 pointY = 26.856;
283 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 280 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
284 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 281 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
285 controlPoint1X = 25.406; 282 controlPoint1X = 25.406;
286 controlPoint1Y = 27.454; 283 controlPoint1Y = 27.454;
287 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 284 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
288 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 285 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
289 controlPoint2X = 25.544; 286 controlPoint2X = 25.544;
290 controlPoint2Y = 26.994; 287 controlPoint2Y = 26.994;
291 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 288 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
292 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 289 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
293 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 290 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
294 pointX = 24.118; 291 pointX = 24.118;
295 pointY = 24.464; 292 pointY = 24.464;
296 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 293 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
297 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 294 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
298 controlPoint1X = 24.578; 295 controlPoint1X = 24.578;
299 controlPoint1Y = 25.936; 296 controlPoint1Y = 25.936;
300 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 297 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
301 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 298 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
302 controlPoint2X = 24.118; 299 controlPoint2X = 24.118;
303 controlPoint2Y = 24.786; 300 controlPoint2Y = 24.786;
304 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 301 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
305 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 302 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
306 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 303 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
307 pointX = 24.118; 304 pointX = 24.118;
308 pointY = 24.464; 305 pointY = 24.464;
309 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 306 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
310 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 307 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
311 context.lineTo(pointX, pointY); 308 context.lineTo(pointX, pointY);
312 context.closePath(); 309 context.closePath();
313 pointX = 23.06; 310 pointX = 23.06;
314 pointY = 31.962; 311 pointY = 31.962;
315 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 312 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
316 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 313 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
317 context.moveTo(pointX, pointY); 314 context.moveTo(pointX, pointY);
318 pointX = 20.53; 315 pointX = 20.53;
319 pointY = 32.928; 316 pointY = 32.928;
320 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 317 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
321 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 318 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
322 controlPoint1X = 22.186; 319 controlPoint1X = 22.186;
323 controlPoint1Y = 31.962; 320 controlPoint1Y = 31.962;
324 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 321 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
325 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 322 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
326 controlPoint2X = 21.22; 323 controlPoint2X = 21.22;
327 controlPoint2Y = 32.33; 324 controlPoint2Y = 32.33;
328 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 325 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
329 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 326 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
330 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 327 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
331 pointX = 19.426; 328 pointX = 19.426;
332 pointY = 35.458; 329 pointY = 35.458;
333 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 330 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
334 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 331 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
335 controlPoint1X = 19.794; 332 controlPoint1X = 19.794;
336 controlPoint1Y = 33.618; 333 controlPoint1Y = 33.618;
337 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 334 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
338 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 335 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
339 controlPoint2X = 19.426; 336 controlPoint2X = 19.426;
340 controlPoint2Y = 34.538; 337 controlPoint2Y = 34.538;
341 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 338 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
342 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 339 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
343 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 340 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
344 pointX = 20.392; 341 pointX = 20.392;
345 pointY = 38.08; 342 pointY = 38.08;
346 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 343 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
347 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 344 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
348 controlPoint1X = 19.426; 345 controlPoint1X = 19.426;
349 controlPoint1Y = 36.47; 346 controlPoint1Y = 36.47;
350 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 347 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
351 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 348 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
352 controlPoint2X = 19.702; 349 controlPoint2X = 19.702;
353 controlPoint2Y = 37.344; 350 controlPoint2Y = 37.344;
354 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 351 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
355 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 352 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
356 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 353 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
357 pointX = 22.738; 354 pointX = 22.738;
358 pointY = 39.0; 355 pointY = 39.0;
359 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 356 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
360 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 357 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
361 controlPoint1X = 21.128; 358 controlPoint1X = 21.128;
362 controlPoint1Y = 38.77; 359 controlPoint1Y = 38.77;
363 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 360 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
364 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 361 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
365 controlPoint2X = 22.048; 362 controlPoint2X = 22.048;
366 controlPoint2Y = 39.0; 363 controlPoint2Y = 39.0;
367 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 364 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
368 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 365 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
369 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 366 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
370 pointX = 25.544; 367 pointX = 25.544;
371 pointY = 38.034; 368 pointY = 38.034;
372 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 369 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
373 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 370 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
374 controlPoint1X = 23.796; 371 controlPoint1X = 23.796;
375 controlPoint1Y = 39.0; 372 controlPoint1Y = 39.0;
376 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 373 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
377 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 374 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
378 controlPoint2X = 24.854; 375 controlPoint2X = 24.854;
379 controlPoint2Y = 38.724; 376 controlPoint2Y = 38.724;
380 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 377 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
381 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 378 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
382 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 379 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
383 pointX = 26.556; 380 pointX = 26.556;
384 pointY = 35.55; 381 pointY = 35.55;
385 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 382 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
386 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 383 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
387 controlPoint1X = 26.188; 384 controlPoint1X = 26.188;
388 controlPoint1Y = 37.344; 385 controlPoint1Y = 37.344;
389 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 386 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
390 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 387 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
391 controlPoint2X = 26.556; 388 controlPoint2X = 26.556;
392 controlPoint2Y = 36.194; 389 controlPoint2Y = 36.194;
393 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 390 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
394 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 391 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
395 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 392 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
396 pointX = 25.452; 393 pointX = 25.452;
397 pointY = 32.744; 394 pointY = 32.744;
398 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 395 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
399 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 396 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
400 controlPoint1X = 26.556; 397 controlPoint1X = 26.556;
401 controlPoint1Y = 34.676; 398 controlPoint1Y = 34.676;
402 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 399 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
403 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 400 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
404 controlPoint2X = 26.326; 401 controlPoint2X = 26.326;
405 controlPoint2Y = 33.618; 402 controlPoint2Y = 33.618;
406 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 403 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
407 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 404 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
408 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 405 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
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 288e0be..2462d0e 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Canvas/RegisterButton/normal.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Canvas/RegisterButton/normal.js
@@ -1,403 +1,400 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29// 26//
30 //normal.js 27 //normal.js
31 //normal 28 //normal
32// 29//
33 //Created by Giulio Cesare Solaroli on 3/24/10 30 //Created by Giulio Cesare Solaroli on 3/24/10
34 //Copyright 2010 Clipperz 31 //Copyright 2010 Clipperz
35 //This code was generated by Opacity. You may use or modify it in any way. 32 //This code was generated by Opacity. You may use or modify it in any way.
36// 33//
37 34
38var kClipperz_PM_UI_Canvas_RegisterButton_normalWidth = 282.0; 35var kClipperz_PM_UI_Canvas_RegisterButton_normalWidth = 282.0;
39var kClipperz_PM_UI_Canvas_RegisterButton_normalHeight = 93.0; 36var kClipperz_PM_UI_Canvas_RegisterButton_normalHeight = 93.0;
40 37
41function Clipperz_PM_UI_Canvas_RegisterButton_normal(canvas, aBackgroundColor, aDarkBackgroundColor, aLightColor, aDarkColor, aStarColor) 38function Clipperz_PM_UI_Canvas_RegisterButton_normal(canvas, aBackgroundColor, aDarkBackgroundColor, aLightColor, aDarkColor, aStarColor)
42{ 39{
43 var context = canvas.getContext("2d"); 40 var context = canvas.getContext("2d");
44 var alignStroke; 41 var alignStroke;
45 var resolution; 42 var resolution;
46 var path; 43 var path;
47 var pointX; 44 var pointX;
48 var pointY; 45 var pointY;
49 var controlPoint1X; 46 var controlPoint1X;
50 var controlPoint1Y; 47 var controlPoint1Y;
51 var controlPoint2X; 48 var controlPoint2X;
52 var controlPoint2Y; 49 var controlPoint2Y;
53 var gradient; 50 var gradient;
54 var color; 51 var color;
55 if (window.devicePixelRatio) 52 if (window.devicePixelRatio)
56 resolution = window.devicePixelRatio; 53 resolution = window.devicePixelRatio;
57 else 54 else
58 resolution = 1.0; 55 resolution = 1.0;
59 resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_RegisterButton_normalWidth + canvas.height / kClipperz_PM_UI_Canvas_RegisterButton_normalHeight); 56 resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_RegisterButton_normalWidth + canvas.height / kClipperz_PM_UI_Canvas_RegisterButton_normalHeight);
60 57
61 context.save(); 58 context.save();
62 context.scale(canvas.width / kClipperz_PM_UI_Canvas_RegisterButton_normalWidth, canvas.height / kClipperz_PM_UI_Canvas_RegisterButton_normalHeight); 59 context.scale(canvas.width / kClipperz_PM_UI_Canvas_RegisterButton_normalWidth, canvas.height / kClipperz_PM_UI_Canvas_RegisterButton_normalHeight);
63 context.clearRect(0.0, 0.0, kClipperz_PM_UI_Canvas_RegisterButton_normalWidth, 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);
64 61
65 // background 62 // background
66 63
67 alignStroke = 0.0; 64 alignStroke = 0.0;
68 context.beginPath(); 65 context.beginPath();
69 pointX = 241.0; 66 pointX = 241.0;
70 pointY = 80.0; 67 pointY = 80.0;
71 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 68 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
72 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 69 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
73 context.moveTo(pointX, pointY); 70 context.moveTo(pointX, pointY);
74 pointX = 274.0; 71 pointX = 274.0;
75 pointY = 47.0; 72 pointY = 47.0;
76 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 73 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
77 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 74 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
78 controlPoint1X = 259.103; 75 controlPoint1X = 259.103;
79 controlPoint1Y = 80.0; 76 controlPoint1Y = 80.0;
80 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 77 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
81 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 78 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
82 controlPoint2X = 274.0; 79 controlPoint2X = 274.0;
83 controlPoint2Y = 65.103; 80 controlPoint2Y = 65.103;
84 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 81 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
85 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 82 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
86 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 83 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
87 pointX = 274.0; 84 pointX = 274.0;
88 pointY = 45.0; 85 pointY = 45.0;
89 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 86 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
90 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 87 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
91 context.lineTo(pointX, pointY); 88 context.lineTo(pointX, pointY);
92 pointX = 241.0; 89 pointX = 241.0;
93 pointY = 12.0; 90 pointY = 12.0;
94 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 91 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
95 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 92 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
96 controlPoint1X = 274.0; 93 controlPoint1X = 274.0;
97 controlPoint1Y = 26.897; 94 controlPoint1Y = 26.897;
98 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 95 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
99 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 96 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
100 controlPoint2X = 259.103; 97 controlPoint2X = 259.103;
101 controlPoint2Y = 12.0; 98 controlPoint2Y = 12.0;
102 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 99 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
103 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 100 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
104 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 101 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
105 pointX = 60.0; 102 pointX = 60.0;
106 pointY = 12.0; 103 pointY = 12.0;
107 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 104 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
108 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 105 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
109 context.lineTo(pointX, pointY); 106 context.lineTo(pointX, pointY);
110 pointX = 27.0; 107 pointX = 27.0;
111 pointY = 45.0; 108 pointY = 45.0;
112 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 109 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
113 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 110 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
114 controlPoint1X = 41.897; 111 controlPoint1X = 41.897;
115 controlPoint1Y = 12.0; 112 controlPoint1Y = 12.0;
116 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 113 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
117 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 114 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
118 controlPoint2X = 27.0; 115 controlPoint2X = 27.0;
119 controlPoint2Y = 26.897; 116 controlPoint2Y = 26.897;
120 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 117 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
121 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 118 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
122 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 119 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
123 pointX = 27.0; 120 pointX = 27.0;
124 pointY = 47.0; 121 pointY = 47.0;
125 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 122 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
126 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 123 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
127 context.lineTo(pointX, pointY); 124 context.lineTo(pointX, pointY);
128 pointX = 60.0; 125 pointX = 60.0;
129 pointY = 80.0; 126 pointY = 80.0;
130 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 127 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
131 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 128 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
132 controlPoint1X = 27.0; 129 controlPoint1X = 27.0;
133 controlPoint1Y = 65.103; 130 controlPoint1Y = 65.103;
134 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 131 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
135 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 132 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
136 controlPoint2X = 41.897; 133 controlPoint2X = 41.897;
137 controlPoint2Y = 80.0; 134 controlPoint2Y = 80.0;
138 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 135 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
139 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 136 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
140 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 137 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
141 pointX = 241.0; 138 pointX = 241.0;
142 pointY = 80.0; 139 pointY = 80.0;
143 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 140 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
144 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 141 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
145 context.lineTo(pointX, pointY); 142 context.lineTo(pointX, pointY);
146 context.closePath(); 143 context.closePath();
147 gradient = context.createLinearGradient(150.5, 12.0, 150.5, 80.0); 144 gradient = context.createLinearGradient(150.5, 12.0, 150.5, 80.0);
148 gradient.addColorStop(0.0, aBackgroundColor); 145 gradient.addColorStop(0.0, aBackgroundColor);
149 gradient.addColorStop(1.0, aDarkBackgroundColor); 146 gradient.addColorStop(1.0, aDarkBackgroundColor);
150 context.fillStyle = gradient; 147 context.fillStyle = gradient;
151 context.fill(); 148 context.fill();
152 149
153 // round 150 // round
154 151
155 alignStroke = 0.0; 152 alignStroke = 0.0;
156 context.beginPath(); 153 context.beginPath();
157 pointX = 44.103; 154 pointX = 44.103;
158 pointY = 4.014; 155 pointY = 4.014;
159 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 156 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
160 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 157 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
161 context.moveTo(pointX, pointY); 158 context.moveTo(pointX, pointY);
162 pointX = 65.629; 159 pointX = 65.629;
163 pointY = 10.515; 160 pointY = 10.515;
164 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 161 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
165 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 162 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
166 controlPoint1X = 51.706; 163 controlPoint1X = 51.706;
167 controlPoint1Y = 4.217; 164 controlPoint1Y = 4.217;
168 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 165 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
169 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 166 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
170 controlPoint2X = 59.185; 167 controlPoint2X = 59.185;
171 controlPoint2Y = 6.475; 168 controlPoint2Y = 6.475;
172 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 169 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
173 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 170 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
174 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 171 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
175 pointX = 78.65; 172 pointX = 78.65;
176 pointY = 70.918; 173 pointY = 70.918;
177 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 174 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
178 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 175 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
179 context.lineTo(pointX, pointY); 176 context.lineTo(pointX, pointY);
180 pointX = 43.0; 177 pointX = 43.0;
181 pointY = 90.0; 178 pointY = 90.0;
182 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 179 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
183 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 180 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
184 controlPoint1X = 70.676; 181 controlPoint1X = 70.676;
185 controlPoint1Y = 82.788; 182 controlPoint1Y = 82.788;
186 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 183 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
187 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 184 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
188 controlPoint2X = 57.23; 185 controlPoint2X = 57.23;
189 controlPoint2Y = 89.817; 186 controlPoint2Y = 89.817;
190 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 187 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
191 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 188 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
192 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 189 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
193 pointX = 0.056; 190 pointX = 0.056;
194 pointY = 44.801; 191 pointY = 44.801;
195 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 192 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
196 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 193 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
197 controlPoint1X = 18.834; 194 controlPoint1X = 18.834;
198 controlPoint1Y = 90.07; 195 controlPoint1Y = 90.07;
199 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 196 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
200 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 197 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
201 controlPoint2X = -1.18; 198 controlPoint2X = -1.18;
202 controlPoint2Y = 68.879; 199 controlPoint2Y = 68.879;
203 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 200 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
204 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 201 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
205 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 202 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
206 pointX = 44.103; 203 pointX = 44.103;
207 pointY = 4.014; 204 pointY = 4.014;
208 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 205 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
209 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 206 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
210 controlPoint1X = 1.242; 207 controlPoint1X = 1.242;
211 controlPoint1Y = 21.708; 208 controlPoint1Y = 21.708;
212 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 209 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
213 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 210 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
214 controlPoint2X = 21.202; 211 controlPoint2X = 21.202;
215 controlPoint2Y = 3.72; 212 controlPoint2Y = 3.72;
216 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 213 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
217 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 214 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
218 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 215 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
219 pointX = 44.103; 216 pointX = 44.103;
220 pointY = 4.014; 217 pointY = 4.014;
221 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 218 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
222 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 219 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
223 context.lineTo(pointX, pointY); 220 context.lineTo(pointX, pointY);
224 context.closePath(); 221 context.closePath();
225 gradient = context.createLinearGradient(39.326, 90, 39.326, 4.011); 222 gradient = context.createLinearGradient(39.326, 90, 39.326, 4.011);
226 gradient.addColorStop(0.0, aDarkColor); 223 gradient.addColorStop(0.0, aDarkColor);
227 gradient.addColorStop(1.0, aLightColor); 224 gradient.addColorStop(1.0, aLightColor);
228 context.fillStyle = gradient; 225 context.fillStyle = gradient;
229 context.fill(); 226 context.fill();
230 227
231 // * 228 // *
232 229
233 alignStroke = 0.0; 230 alignStroke = 0.0;
234 context.beginPath(); 231 context.beginPath();
235 pointX = 23.983; 232 pointX = 23.983;
236 pointY = 35.944; 233 pointY = 35.944;
237 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 234 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
238 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 235 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
239 context.moveTo(pointX, pointY); 236 context.moveTo(pointX, pointY);
240 pointX = 37.25; 237 pointX = 37.25;
241 pointY = 40.261; 238 pointY = 40.261;
242 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 239 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
243 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 240 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
244 context.lineTo(pointX, pointY); 241 context.lineTo(pointX, pointY);
245 pointX = 37.25; 242 pointX = 37.25;
246 pointY = 24.963; 243 pointY = 24.963;
247 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 244 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
248 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 245 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
249 context.lineTo(pointX, pointY); 246 context.lineTo(pointX, pointY);
250 pointX = 48.231; 247 pointX = 48.231;
251 pointY = 24.963; 248 pointY = 24.963;
252 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 249 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
253 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 250 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
254 context.lineTo(pointX, pointY); 251 context.lineTo(pointX, pointY);
255 pointX = 48.231; 252 pointX = 48.231;
256 pointY = 40.261; 253 pointY = 40.261;
257 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 254 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
258 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 255 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
259 context.lineTo(pointX, pointY); 256 context.lineTo(pointX, pointY);
260 pointX = 61.498; 257 pointX = 61.498;
261 pointY = 35.944; 258 pointY = 35.944;
262 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 259 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
263 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 260 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
264 context.lineTo(pointX, pointY); 261 context.lineTo(pointX, pointY);
265 pointX = 64.481; 262 pointX = 64.481;
266 pointY = 45.402; 263 pointY = 45.402;
267 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 264 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
268 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 265 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
269 context.lineTo(pointX, pointY); 266 context.lineTo(pointX, pointY);
270 pointX = 50.961; 267 pointX = 50.961;
271 pointY = 49.592; 268 pointY = 49.592;
272 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 269 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
273 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 270 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
274 context.lineTo(pointX, pointY); 271 context.lineTo(pointX, pointY);
275 pointX = 59.784; 272 pointX = 59.784;
276 pointY = 62.224; 273 pointY = 62.224;
277 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 274 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
278 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 275 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
279 context.lineTo(pointX, pointY); 276 context.lineTo(pointX, pointY);
280 pointX = 51.659; 277 pointX = 51.659;
281 pointY = 68.0; 278 pointY = 68.0;
282 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 279 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
283 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 280 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
284 context.lineTo(pointX, pointY); 281 context.lineTo(pointX, pointY);
285 pointX = 42.836; 282 pointX = 42.836;
286 pointY = 56.066; 283 pointY = 56.066;
287 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 284 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
288 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 285 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
289 context.lineTo(pointX, pointY); 286 context.lineTo(pointX, pointY);
290 pointX = 33.759; 287 pointX = 33.759;
291 pointY = 68.0; 288 pointY = 68.0;
292 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 289 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
293 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 290 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
294 context.lineTo(pointX, pointY); 291 context.lineTo(pointX, pointY);
295 pointX = 25.634; 292 pointX = 25.634;
296 pointY = 62.224; 293 pointY = 62.224;
297 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 294 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
298 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 295 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
299 context.lineTo(pointX, pointY); 296 context.lineTo(pointX, pointY);
300 pointX = 34.521; 297 pointX = 34.521;
301 pointY = 49.592; 298 pointY = 49.592;
302 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 299 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
303 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 300 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
304 context.lineTo(pointX, pointY); 301 context.lineTo(pointX, pointY);
305 pointX = 21.0; 302 pointX = 21.0;
306 pointY = 45.402; 303 pointY = 45.402;
307 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 304 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
308 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 305 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
309 context.lineTo(pointX, pointY); 306 context.lineTo(pointX, pointY);
310 pointX = 23.983; 307 pointX = 23.983;
311 pointY = 35.944; 308 pointY = 35.944;
312 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 309 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
313 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 310 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
314 context.lineTo(pointX, pointY); 311 context.lineTo(pointX, pointY);
315 context.closePath(); 312 context.closePath();
316 pointX = 68.607; 313 pointX = 68.607;
317 pointY = 119.099; 314 pointY = 119.099;
318 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 315 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
319 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 316 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
320 context.moveTo(pointX, pointY); 317 context.moveTo(pointX, pointY);
321 context.fillStyle = aStarColor; 318 context.fillStyle = aStarColor;
322 context.fill(); 319 context.fill();
323 320
324 alignStroke = 0.0; 321 alignStroke = 0.0;
325 context.beginPath(); 322 context.beginPath();
326 pointX = 212.0; 323 pointX = 212.0;
327 pointY = 125.0; 324 pointY = 125.0;
328 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 325 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
329 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 326 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
330 context.moveTo(pointX, pointY); 327 context.moveTo(pointX, pointY);
331 pointX = 213.0; 328 pointX = 213.0;
332 pointY = 125.0; 329 pointY = 125.0;
333 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 330 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
334 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 331 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
335 context.lineTo(pointX, pointY); 332 context.lineTo(pointX, pointY);
336 pointX = 212.5; 333 pointX = 212.5;
337 pointY = 124.0; 334 pointY = 124.0;
338 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 335 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
339 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 336 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
340 context.lineTo(pointX, pointY); 337 context.lineTo(pointX, pointY);
341 pointX = 212.0; 338 pointX = 212.0;
342 pointY = 125.0; 339 pointY = 125.0;
343 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 340 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
344 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 341 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
345 context.lineTo(pointX, pointY); 342 context.lineTo(pointX, pointY);
346 context.closePath(); 343 context.closePath();
347 gradient = context.createLinearGradient(212.5, 125.0, 212.5, 124.0); 344 gradient = context.createLinearGradient(212.5, 125.0, 212.5, 124.0);
348 color = "#FFFFFF"; 345 color = "#FFFFFF";
349 gradient.addColorStop(0.0, color); 346 gradient.addColorStop(0.0, color);
350 color = "#A9A9A9"; 347 color = "#A9A9A9";
351 gradient.addColorStop(1.0, color); 348 gradient.addColorStop(1.0, color);
352 context.fillStyle = gradient; 349 context.fillStyle = gradient;
353 context.fill(); 350 context.fill();
354 351
355 // flip 352 // flip
356 353
357 // Setup for Shadow Effect 354 // Setup for Shadow Effect
358 color = "rgba(0.0%, 0.0%, 0.0%, 0.5)"; 355 color = "rgba(0.0%, 0.0%, 0.0%, 0.5)";
359 context.save(); 356 context.save();
360 context.shadowColor = color; 357 context.shadowColor = color;
361 context.shadowBlur = 0.0; 358 context.shadowBlur = 0.0;
362 context.shadowOffsetX = 2.0 * Math.cos(8.377) * resolution; 359 context.shadowOffsetX = 2.0 * Math.cos(8.377) * resolution;
363 context.shadowOffsetY = 2.0 * Math.sin(8.377) * resolution; 360 context.shadowOffsetY = 2.0 * Math.sin(8.377) * resolution;
364 361
365 // round 362 // round
366 363
367 alignStroke = 0.0; 364 alignStroke = 0.0;
368 context.beginPath(); 365 context.beginPath();
369 pointX = 78.506; 366 pointX = 78.506;
370 pointY = 70.251; 367 pointY = 70.251;
371 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 368 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
372 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 369 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
373 context.moveTo(pointX, pointY); 370 context.moveTo(pointX, pointY);
374 pointX = 66.155; 371 pointX = 66.155;
375 pointY = 12.954; 372 pointY = 12.954;
376 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 373 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
377 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 374 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
378 controlPoint1X = 59.899; 375 controlPoint1X = 59.899;
379 controlPoint1Y = 57.427; 376 controlPoint1Y = 57.427;
380 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 377 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
381 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 378 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
382 controlPoint2X = 54.678; 379 controlPoint2X = 54.678;
383 controlPoint2Y = 32.277; 380 controlPoint2Y = 32.277;
384 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 381 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
385 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 382 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
386 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 383 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
387 pointX = 78.506; 384 pointX = 78.506;
388 pointY = 70.251; 385 pointY = 70.251;
389 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 386 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
390 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 387 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
391 context.lineTo(pointX, pointY); 388 context.lineTo(pointX, pointY);
392 context.closePath(); 389 context.closePath();
393 gradient = context.createLinearGradient(69.301, 70.251, 69.301, 12.954); 390 gradient = context.createLinearGradient(69.301, 70.251, 69.301, 12.954);
394 gradient.addColorStop(0.0, aDarkColor); 391 gradient.addColorStop(0.0, aDarkColor);
395 gradient.addColorStop(1.0, aLightColor); 392 gradient.addColorStop(1.0, aLightColor);
396 context.fillStyle = gradient; 393 context.fillStyle = gradient;
397 context.fill(); 394 context.fill();
398 395
399 // Shadow Effect 396 // Shadow Effect
400 context.restore(); 397 context.restore();
401 398
402 context.restore(); 399 context.restore();
403} 400}
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 e70e3b5..cf475c6 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Canvas/Star/normal.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Canvas/Star/normal.js
@@ -1,153 +1,150 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29// 26//
30 //normal.js 27 //normal.js
31 //normal 28 //normal
32// 29//
33 //Created by Giulio Cesare Solaroli on 3/15/10 30 //Created by Giulio Cesare Solaroli on 3/15/10
34 //Copyright 2010 Clipperz 31 //Copyright 2010 Clipperz
35 //This code was generated by Opacity. You may use or modify it in any way. 32 //This code was generated by Opacity. You may use or modify it in any way.
36// 33//
37 34
38var kClipperz_PM_UI_Canvas_Star_normalWidth = 46.0; 35var kClipperz_PM_UI_Canvas_Star_normalWidth = 46.0;
39var kClipperz_PM_UI_Canvas_Star_normalHeight = 46.0; 36var kClipperz_PM_UI_Canvas_Star_normalHeight = 46.0;
40 37
41function Clipperz_PM_UI_Canvas_Star_normal(canvas, aColor) 38function Clipperz_PM_UI_Canvas_Star_normal(canvas, aColor)
42{ 39{
43 var context = canvas.getContext("2d"); 40 var context = canvas.getContext("2d");
44 var alignStroke; 41 var alignStroke;
45 var resolution; 42 var resolution;
46 var path; 43 var path;
47 var pointX; 44 var pointX;
48 var pointY; 45 var pointY;
49 if (window.devicePixelRatio) 46 if (window.devicePixelRatio)
50 resolution = window.devicePixelRatio; 47 resolution = window.devicePixelRatio;
51 else 48 else
52 resolution = 1.0; 49 resolution = 1.0;
53 resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_Star_normalWidth + canvas.height / kClipperz_PM_UI_Canvas_Star_normalHeight); 50 resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_Star_normalWidth + canvas.height / kClipperz_PM_UI_Canvas_Star_normalHeight);
54 51
55 context.save(); 52 context.save();
56 context.scale(canvas.width / kClipperz_PM_UI_Canvas_Star_normalWidth, canvas.height / kClipperz_PM_UI_Canvas_Star_normalHeight); 53 context.scale(canvas.width / kClipperz_PM_UI_Canvas_Star_normalWidth, canvas.height / kClipperz_PM_UI_Canvas_Star_normalHeight);
57 context.clearRect(0.0, 0.0, kClipperz_PM_UI_Canvas_Star_normalWidth, 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);
58 55
59 // * 56 // *
60 57
61 alignStroke = 0.0; 58 alignStroke = 0.0;
62 context.beginPath(); 59 context.beginPath();
63 pointX = 8.613; 60 pointX = 8.613;
64 pointY = 15.583; 61 pointY = 15.583;
65 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 62 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
66 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 63 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
67 context.moveTo(pointX, pointY); 64 context.moveTo(pointX, pointY);
68 pointX = 18.563; 65 pointX = 18.563;
69 pointY = 18.821; 66 pointY = 18.821;
70 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 67 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
71 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 68 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
72 context.lineTo(pointX, pointY); 69 context.lineTo(pointX, pointY);
73 pointX = 18.563; 70 pointX = 18.563;
74 pointY = 7.347; 71 pointY = 7.347;
75 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 72 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
76 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 73 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
77 context.lineTo(pointX, pointY); 74 context.lineTo(pointX, pointY);
78 pointX = 26.799; 75 pointX = 26.799;
79 pointY = 7.347; 76 pointY = 7.347;
80 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 77 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
81 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 78 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
82 context.lineTo(pointX, pointY); 79 context.lineTo(pointX, pointY);
83 pointX = 26.799; 80 pointX = 26.799;
84 pointY = 18.821; 81 pointY = 18.821;
85 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 82 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
86 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 83 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
87 context.lineTo(pointX, pointY); 84 context.lineTo(pointX, pointY);
88 pointX = 36.749; 85 pointX = 36.749;
89 pointY = 15.583; 86 pointY = 15.583;
90 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 87 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
91 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 88 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
92 context.lineTo(pointX, pointY); 89 context.lineTo(pointX, pointY);
93 pointX = 38.986; 90 pointX = 38.986;
94 pointY = 22.677; 91 pointY = 22.677;
95 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 92 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
96 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 93 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
97 context.lineTo(pointX, pointY); 94 context.lineTo(pointX, pointY);
98 pointX = 28.846; 95 pointX = 28.846;
99 pointY = 25.819; 96 pointY = 25.819;
100 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 97 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
101 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 98 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
102 context.lineTo(pointX, pointY); 99 context.lineTo(pointX, pointY);
103 pointX = 35.463; 100 pointX = 35.463;
104 pointY = 35.293; 101 pointY = 35.293;
105 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 102 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
106 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 103 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
107 context.lineTo(pointX, pointY); 104 context.lineTo(pointX, pointY);
108 pointX = 29.369; 105 pointX = 29.369;
109 pointY = 39.625; 106 pointY = 39.625;
110 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 107 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
111 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 108 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
112 context.lineTo(pointX, pointY); 109 context.lineTo(pointX, pointY);
113 pointX = 22.752; 110 pointX = 22.752;
114 pointY = 30.675; 111 pointY = 30.675;
115 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 112 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
116 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 113 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
117 context.lineTo(pointX, pointY); 114 context.lineTo(pointX, pointY);
118 pointX = 15.944; 115 pointX = 15.944;
119 pointY = 39.625; 116 pointY = 39.625;
120 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 117 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
121 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 118 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
122 context.lineTo(pointX, pointY); 119 context.lineTo(pointX, pointY);
123 pointX = 9.85; 120 pointX = 9.85;
124 pointY = 35.293; 121 pointY = 35.293;
125 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 122 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
126 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 123 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
127 context.lineTo(pointX, pointY); 124 context.lineTo(pointX, pointY);
128 pointX = 16.515; 125 pointX = 16.515;
129 pointY = 25.819; 126 pointY = 25.819;
130 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 127 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
131 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 128 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
132 context.lineTo(pointX, pointY); 129 context.lineTo(pointX, pointY);
133 pointX = 6.375; 130 pointX = 6.375;
134 pointY = 22.677; 131 pointY = 22.677;
135 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 132 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
136 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 133 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
137 context.lineTo(pointX, pointY); 134 context.lineTo(pointX, pointY);
138 pointX = 8.613; 135 pointX = 8.613;
139 pointY = 15.583; 136 pointY = 15.583;
140 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 137 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
141 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 138 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
142 context.lineTo(pointX, pointY); 139 context.lineTo(pointX, pointY);
143 context.closePath(); 140 context.closePath();
144 pointX = 42.081; 141 pointX = 42.081;
145 pointY = 77.949; 142 pointY = 77.949;
146 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 143 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
147 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 144 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
148 context.moveTo(pointX, pointY); 145 context.moveTo(pointX, pointY);
149 context.fillStyle = aColor; 146 context.fillStyle = aColor;
150 context.fill(); 147 context.fill();
151 148
152 context.restore(); 149 context.restore();
153} 150}
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 216fd24..cd7ed90 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Canvas/Tips/close.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Canvas/Tips/close.js
@@ -1,156 +1,153 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29// 26//
30 //close.js 27 //close.js
31 //close 28 //close
32// 29//
33 //Created by Giulio Cesare Solaroli on 3/14/10 30 //Created by Giulio Cesare Solaroli on 3/14/10
34 //Copyright 2010 Clipperz 31 //Copyright 2010 Clipperz
35 //This code was generated by Opacity. You may use or modify it in any way. 32 //This code was generated by Opacity. You may use or modify it in any way.
36// 33//
37 34
38var kClipperz_PM_UI_Canvas_Tips_closeWidth = 310.0; 35var kClipperz_PM_UI_Canvas_Tips_closeWidth = 310.0;
39var kClipperz_PM_UI_Canvas_Tips_closeHeight = 6.0; 36var kClipperz_PM_UI_Canvas_Tips_closeHeight = 6.0;
40 37
41function Clipperz_PM_UI_Canvas_Tips_close(canvas, aColor, aBackgroundColor) 38function Clipperz_PM_UI_Canvas_Tips_close(canvas, aColor, aBackgroundColor)
42{ 39{
43 var context = canvas.getContext("2d"); 40 var context = canvas.getContext("2d");
44 var alignStroke; 41 var alignStroke;
45 var resolution; 42 var resolution;
46 var path; 43 var path;
47 var pointX; 44 var pointX;
48 var pointY; 45 var pointY;
49 if (window.devicePixelRatio) 46 if (window.devicePixelRatio)
50 resolution = window.devicePixelRatio; 47 resolution = window.devicePixelRatio;
51 else 48 else
52 resolution = 1.0; 49 resolution = 1.0;
53 resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_Tips_closeWidth + canvas.height / kClipperz_PM_UI_Canvas_Tips_closeHeight); 50 resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_Tips_closeWidth + canvas.height / kClipperz_PM_UI_Canvas_Tips_closeHeight);
54 51
55 context.save(); 52 context.save();
56 context.scale(canvas.width / kClipperz_PM_UI_Canvas_Tips_closeWidth, canvas.height / kClipperz_PM_UI_Canvas_Tips_closeHeight); 53 context.scale(canvas.width / kClipperz_PM_UI_Canvas_Tips_closeWidth, canvas.height / kClipperz_PM_UI_Canvas_Tips_closeHeight);
57 context.clearRect(0.0, 0.0, kClipperz_PM_UI_Canvas_Tips_closeWidth, 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);
58 55
59 // background 56 // background
60 57
61 alignStroke = 0.0; 58 alignStroke = 0.0;
62 context.beginPath(); 59 context.beginPath();
63 pointX = 310.0; 60 pointX = 310.0;
64 pointY = 6.0; 61 pointY = 6.0;
65 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 62 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
66 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 63 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
67 context.moveTo(pointX, pointY); 64 context.moveTo(pointX, pointY);
68 pointX = 310.0; 65 pointX = 310.0;
69 pointY = 0.0; 66 pointY = 0.0;
70 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 67 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
71 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 68 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
72 context.lineTo(pointX, pointY); 69 context.lineTo(pointX, pointY);
73 pointX = 0.0; 70 pointX = 0.0;
74 pointY = 0.0; 71 pointY = 0.0;
75 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 72 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
76 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 73 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
77 context.lineTo(pointX, pointY); 74 context.lineTo(pointX, pointY);
78 pointX = 0.0; 75 pointX = 0.0;
79 pointY = 6.0; 76 pointY = 6.0;
80 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 77 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
81 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 78 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
82 context.lineTo(pointX, pointY); 79 context.lineTo(pointX, pointY);
83 pointX = 310.0; 80 pointX = 310.0;
84 pointY = 6.0; 81 pointY = 6.0;
85 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 82 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
86 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 83 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
87 context.lineTo(pointX, pointY); 84 context.lineTo(pointX, pointY);
88 context.closePath(); 85 context.closePath();
89 context.fillStyle = aBackgroundColor; 86 context.fillStyle = aBackgroundColor;
90 context.fill(); 87 context.fill();
91 88
92 // grid 89 // grid
93 90
94 // background 91 // background
95 92
96 alignStroke = 0.0; 93 alignStroke = 0.0;
97 context.beginPath(); 94 context.beginPath();
98 pointX = 310.0; 95 pointX = 310.0;
99 pointY = 6.0; 96 pointY = 6.0;
100 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 97 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
101 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 98 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
102 context.moveTo(pointX, pointY); 99 context.moveTo(pointX, pointY);
103 pointX = 310.0; 100 pointX = 310.0;
104 pointY = 0.0; 101 pointY = 0.0;
105 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 102 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
106 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 103 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
107 context.lineTo(pointX, pointY); 104 context.lineTo(pointX, pointY);
108 pointX = 0.0; 105 pointX = 0.0;
109 pointY = 0.0; 106 pointY = 0.0;
110 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 107 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
111 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 108 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
112 context.lineTo(pointX, pointY); 109 context.lineTo(pointX, pointY);
113 pointX = 0.0; 110 pointX = 0.0;
114 pointY = 6.0; 111 pointY = 6.0;
115 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 112 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
116 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 113 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
117 context.lineTo(pointX, pointY); 114 context.lineTo(pointX, pointY);
118 pointX = 310.0; 115 pointX = 310.0;
119 pointY = 6.0; 116 pointY = 6.0;
120 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 117 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
121 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 118 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
122 context.lineTo(pointX, pointY); 119 context.lineTo(pointX, pointY);
123 context.closePath(); 120 context.closePath();
124 context.fillStyle = aBackgroundColor; 121 context.fillStyle = aBackgroundColor;
125 context.fill(); 122 context.fill();
126 123
127 // toggle 124 // toggle
128 125
129 alignStroke = 0.0; 126 alignStroke = 0.0;
130 context.beginPath(); 127 context.beginPath();
131 pointX = 149.0; 128 pointX = 149.0;
132 pointY = 6.0; 129 pointY = 6.0;
133 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 130 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
134 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 131 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
135 context.moveTo(pointX, pointY); 132 context.moveTo(pointX, pointY);
136 pointX = 161.0; 133 pointX = 161.0;
137 pointY = 6.0; 134 pointY = 6.0;
138 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 135 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
139 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 136 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
140 context.lineTo(pointX, pointY); 137 context.lineTo(pointX, pointY);
141 pointX = 155.0; 138 pointX = 155.0;
142 pointY = 0.0; 139 pointY = 0.0;
143 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 140 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
144 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 141 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
145 context.lineTo(pointX, pointY); 142 context.lineTo(pointX, pointY);
146 pointX = 149.0; 143 pointX = 149.0;
147 pointY = 6.0; 144 pointY = 6.0;
148 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 145 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
149 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 146 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
150 context.lineTo(pointX, pointY); 147 context.lineTo(pointX, pointY);
151 context.closePath(); 148 context.closePath();
152 context.fillStyle = aColor; 149 context.fillStyle = aColor;
153 context.fill(); 150 context.fill();
154 151
155 context.restore(); 152 context.restore();
156} 153}
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 f1bdaa9..30c1c69 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Canvas/Tips/open.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Canvas/Tips/open.js
@@ -1,163 +1,160 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29// 26//
30 //open.js 27 //open.js
31 //open 28 //open
32// 29//
33 //Created by Giulio Cesare Solaroli on 3/14/10 30 //Created by Giulio Cesare Solaroli on 3/14/10
34 //Copyright 2010 Clipperz 31 //Copyright 2010 Clipperz
35 //This code was generated by Opacity. You may use or modify it in any way. 32 //This code was generated by Opacity. You may use or modify it in any way.
36// 33//
37 34
38var kClipperz_PM_UI_Canvas_Tips_openWidth = 310.0; 35var kClipperz_PM_UI_Canvas_Tips_openWidth = 310.0;
39var kClipperz_PM_UI_Canvas_Tips_openHeight = 6.0; 36var kClipperz_PM_UI_Canvas_Tips_openHeight = 6.0;
40 37
41function Clipperz_PM_UI_Canvas_Tips_open(canvas, aColor, aBackgroundColor) 38function Clipperz_PM_UI_Canvas_Tips_open(canvas, aColor, aBackgroundColor)
42{ 39{
43 var context = canvas.getContext("2d"); 40 var context = canvas.getContext("2d");
44 var alignStroke; 41 var alignStroke;
45 var resolution; 42 var resolution;
46 var path; 43 var path;
47 var pointX; 44 var pointX;
48 var pointY; 45 var pointY;
49 var color; 46 var color;
50 if (window.devicePixelRatio) 47 if (window.devicePixelRatio)
51 resolution = window.devicePixelRatio; 48 resolution = window.devicePixelRatio;
52 else 49 else
53 resolution = 1.0; 50 resolution = 1.0;
54 resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_Tips_openWidth + canvas.height / kClipperz_PM_UI_Canvas_Tips_openHeight); 51 resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_Tips_openWidth + canvas.height / kClipperz_PM_UI_Canvas_Tips_openHeight);
55 52
56 context.save(); 53 context.save();
57 context.scale(canvas.width / kClipperz_PM_UI_Canvas_Tips_openWidth, canvas.height / kClipperz_PM_UI_Canvas_Tips_openHeight); 54 context.scale(canvas.width / kClipperz_PM_UI_Canvas_Tips_openWidth, canvas.height / kClipperz_PM_UI_Canvas_Tips_openHeight);
58 context.clearRect(0.0, 0.0, kClipperz_PM_UI_Canvas_Tips_openWidth, 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);
59 56
60 // background 57 // background
61 58
62 alignStroke = 0.0; 59 alignStroke = 0.0;
63 context.beginPath(); 60 context.beginPath();
64 pointX = 310.0; 61 pointX = 310.0;
65 pointY = 6.0; 62 pointY = 6.0;
66 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 63 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
67 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 64 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
68 context.moveTo(pointX, pointY); 65 context.moveTo(pointX, pointY);
69 pointX = 310.0; 66 pointX = 310.0;
70 pointY = 0.0; 67 pointY = 0.0;
71 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 68 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
72 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 69 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
73 context.lineTo(pointX, pointY); 70 context.lineTo(pointX, pointY);
74 pointX = 0.0; 71 pointX = 0.0;
75 pointY = 0.0; 72 pointY = 0.0;
76 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 73 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
77 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 74 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
78 context.lineTo(pointX, pointY); 75 context.lineTo(pointX, pointY);
79 pointX = 0.0; 76 pointX = 0.0;
80 pointY = 6.0; 77 pointY = 6.0;
81 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 78 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
82 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 79 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
83 context.lineTo(pointX, pointY); 80 context.lineTo(pointX, pointY);
84 pointX = 310.0; 81 pointX = 310.0;
85 pointY = 6.0; 82 pointY = 6.0;
86 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 83 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
87 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 84 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
88 context.lineTo(pointX, pointY); 85 context.lineTo(pointX, pointY);
89 context.closePath(); 86 context.closePath();
90 context.fillStyle = aBackgroundColor; 87 context.fillStyle = aBackgroundColor;
91 context.fill(); 88 context.fill();
92 89
93 // grid 90 // grid
94 91
95 // background 92 // background
96 93
97 alignStroke = 0.0; 94 alignStroke = 0.0;
98 context.beginPath(); 95 context.beginPath();
99 pointX = 310.0; 96 pointX = 310.0;
100 pointY = 6.0; 97 pointY = 6.0;
101 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 98 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
102 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 99 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
103 context.moveTo(pointX, pointY); 100 context.moveTo(pointX, pointY);
104 pointX = 310.0; 101 pointX = 310.0;
105 pointY = 0.0; 102 pointY = 0.0;
106 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 103 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
107 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 104 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
108 context.lineTo(pointX, pointY); 105 context.lineTo(pointX, pointY);
109 pointX = 0.0; 106 pointX = 0.0;
110 pointY = 0.0; 107 pointY = 0.0;
111 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 108 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
112 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 109 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
113 context.lineTo(pointX, pointY); 110 context.lineTo(pointX, pointY);
114 pointX = 0.0; 111 pointX = 0.0;
115 pointY = 6.0; 112 pointY = 6.0;
116 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 113 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
117 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 114 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
118 context.lineTo(pointX, pointY); 115 context.lineTo(pointX, pointY);
119 pointX = 310.0; 116 pointX = 310.0;
120 pointY = 6.0; 117 pointY = 6.0;
121 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 118 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
122 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 119 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
123 context.lineTo(pointX, pointY); 120 context.lineTo(pointX, pointY);
124 context.closePath(); 121 context.closePath();
125 context.fillStyle = aBackgroundColor; 122 context.fillStyle = aBackgroundColor;
126 context.fill(); 123 context.fill();
127 124
128 // Layer 1 125 // Layer 1
129 126
130 alignStroke = 0.0; 127 alignStroke = 0.0;
131 context.save(); 128 context.save();
132 context.translate(155.0, 3.0); 129 context.translate(155.0, 3.0);
133 context.rotate(-3.142); 130 context.rotate(-3.142);
134 context.translate(-155.0, -3.0); 131 context.translate(-155.0, -3.0);
135 context.beginPath(); 132 context.beginPath();
136 pointX = 149.0; 133 pointX = 149.0;
137 pointY = 6.0; 134 pointY = 6.0;
138 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 135 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
139 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 136 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
140 context.moveTo(pointX, pointY); 137 context.moveTo(pointX, pointY);
141 pointX = 161.0; 138 pointX = 161.0;
142 pointY = 6.0; 139 pointY = 6.0;
143 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 140 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
144 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 141 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
145 context.lineTo(pointX, pointY); 142 context.lineTo(pointX, pointY);
146 pointX = 155.0; 143 pointX = 155.0;
147 pointY = 0.0; 144 pointY = 0.0;
148 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 145 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
149 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 146 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
150 context.lineTo(pointX, pointY); 147 context.lineTo(pointX, pointY);
151 pointX = 149.0; 148 pointX = 149.0;
152 pointY = 6.0; 149 pointY = 6.0;
153 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 150 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
154 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 151 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
155 context.lineTo(pointX, pointY); 152 context.lineTo(pointX, pointY);
156 context.closePath(); 153 context.closePath();
157 color = "#FFFFFF"; 154 color = "#FFFFFF";
158 context.fillStyle = color; 155 context.fillStyle = color;
159 context.fill(); 156 context.fill();
160 context.restore(); 157 context.restore();
161 158
162 context.restore(); 159 context.restore();
163} 160}
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 26f2fc4..2a03fdf 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Common/Components/BaseComponent.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Common/Components/BaseComponent.js
@@ -1,408 +1,405 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.PM.UI.Common.Components'); 26Clipperz.Base.module('Clipperz.PM.UI.Common.Components');
30 27
31//############################################################################# 28//#############################################################################
32 29
33var _Clipperz_PM_Components_base_id_ = 0; 30var _Clipperz_PM_Components_base_id_ = 0;
34 31
35//############################################################################# 32//#############################################################################
36 33
37Clipperz.PM.UI.Common.Components.BaseComponent = function(args) { 34Clipperz.PM.UI.Common.Components.BaseComponent = function(args) {
38 args = args || {}; 35 args = args || {};
39 Clipperz.PM.UI.Common.Components.BaseComponent.superclass.constructor.call(this, args); 36 Clipperz.PM.UI.Common.Components.BaseComponent.superclass.constructor.call(this, args);
40 37
41 this._element = args.element || null; 38 this._element = args.element || null;
42 this._ids = {}; 39 this._ids = {};
43 40
44 this._slots = {}; 41 this._slots = {};
45 this._slotComponents = {}; 42 this._slotComponents = {};
46 43
47 this._components = {}; 44 this._components = {};
48 45
49 this._cachedSlots = {}; 46 this._cachedSlots = {};
50 47
51 this._isModal = false; 48 this._isModal = false;
52 49
53 this._isActive = false; 50 this._isActive = false;
54 this._elementUsedToEnterModalState; 51 this._elementUsedToEnterModalState;
55 52
56 this._isFullyRendered = false; 53 this._isFullyRendered = false;
57 this._renderingWaitingQueue = []; 54 this._renderingWaitingQueue = [];
58 55
59 //this._slots = { 56 //this._slots = {
60 // 'header':'header', 57 // 'header':'header',
61 // 'body': 'body', 58 // 'body': 'body',
62 // 'footer':'footer' 59 // 'footer':'footer'
63 //}; 60 //};
64 61
65 return this; 62 return this;
66} 63}
67 64
68//============================================================================= 65//=============================================================================
69 66
70//TODO get back to MochiKit.Base.update as we are not extending anything 67//TODO get back to MochiKit.Base.update as we are not extending anything
71//MochiKit.Base.update(Clipperz.PM.UI.Common.Components.BaseComponent.prototype, { 68//MochiKit.Base.update(Clipperz.PM.UI.Common.Components.BaseComponent.prototype, {
72Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.BaseComponent, /*Ext.Component*/ Object, { 69Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.BaseComponent, /*Ext.Component*/ Object, {
73 70
74 'isClipperzPMComponent': true, 71 'isClipperzPMComponent': true,
75 72
76 //------------------------------------------------------------------------- 73 //-------------------------------------------------------------------------
77 74
78 'toString': function () { 75 'toString': function () {
79 return "Clipperz.PM.UI.Common.Components.BaseComponent component"; 76 return "Clipperz.PM.UI.Common.Components.BaseComponent component";
80 }, 77 },
81 78
82 'componentId': function () { 79 'componentId': function () {
83 return this.getId('_id_'); 80 return this.getId('_id_');
84 }, 81 },
85 82
86 //------------------------------------------------------------------------- 83 //-------------------------------------------------------------------------
87/* 84/*
88 'slots': function() { 85 'slots': function() {
89 return this._slots; 86 return this._slots;
90 }, 87 },
91*/ 88*/
92 'slotComponents': function() { 89 'slotComponents': function() {
93 return this._slotComponents; 90 return this._slotComponents;
94 }, 91 },
95 92
96 //------------------------------------------------------------------------- 93 //-------------------------------------------------------------------------
97 94
98 'components': function () { 95 'components': function () {
99 return this._components; 96 return this._components;
100 }, 97 },
101 98
102 'addComponent': function (aComponent) { 99 'addComponent': function (aComponent) {
103 this.components()[aComponent.componentId()] = aComponent; 100 this.components()[aComponent.componentId()] = aComponent;
104 }, 101 },
105 102
106 'removeComponent': function (aComponent) { 103 'removeComponent': function (aComponent) {
107 var componentId; 104 var componentId;
108 105
109 componentId = aComponent.componentId(); 106 componentId = aComponent.componentId();
110 this.components()[componentId].remove(); 107 this.components()[componentId].remove();
111 delete this.components()[componentId]; 108 delete this.components()[componentId];
112 }, 109 },
113 110
114 //------------------------------------------------------------------------- 111 //-------------------------------------------------------------------------
115/* 112/*
116 'domHelper': function() { 113 'domHelper': function() {
117 return Clipperz.YUI.DomHelper; 114 return Clipperz.YUI.DomHelper;
118 }, 115 },
119 */ 116 */
120 //------------------------------------------------------------------------- 117 //-------------------------------------------------------------------------
121/* 118/*
122 'domHelperAppend': function(aValue) { 119 'domHelperAppend': function(aValue) {
123 Clipperz.YUI.DomHelper.append(this.element().dom, aValue); 120 Clipperz.YUI.DomHelper.append(this.element().dom, aValue);
124 }, 121 },
125 */ 122 */
126 //------------------------------------------------------------------------- 123 //-------------------------------------------------------------------------
127 124
128 'element': function() { 125 'element': function() {
129//MochiKit.Logging.logDebug(">>> BaseComponent.element"); 126//MochiKit.Logging.logDebug(">>> BaseComponent.element");
130 return MochiKit.DOM.getElement(this._element); 127 return MochiKit.DOM.getElement(this._element);
131 }, 128 },
132 129
133 'setElement': function(aNode) { 130 'setElement': function(aNode) {
134 this._element = aNode; 131 this._element = aNode;
135 }, 132 },
136 133
137 //----------------------------------------------------- 134 //-----------------------------------------------------
138 135
139 'displayElement': function() { 136 'displayElement': function() {
140 return this.element(); 137 return this.element();
141 }, 138 },
142 139
143 //------------------------------------------------------------------------- 140 //-------------------------------------------------------------------------
144 141
145 'renderInNode': function(aDomNode) { 142 'renderInNode': function(aDomNode) {
146 this.setElement(aDomNode); 143 this.setElement(aDomNode);
147 this.render(); 144 this.render();
148 }, 145 },
149 146
150 'render': function() { 147 'render': function() {
151 this.clear(); 148 this.clear();
152 this.renderSelf(); 149 this.renderSelf();
153 this.renderComponents(); 150 this.renderComponents();
154 if (this.shouldShowTranslationHints()) { 151 if (this.shouldShowTranslationHints()) {
155 this.renderTranslationHints(); 152 this.renderTranslationHints();
156 } 153 }
157 if (this.shouldShowElementWhileRendering()) { 154 if (this.shouldShowElementWhileRendering()) {
158 MochiKit.Style.showElement(this.displayElement()); 155 MochiKit.Style.showElement(this.displayElement());
159 }; 156 };
160 157
161 this._isFullyRendered = true; 158 this._isFullyRendered = true;
162 159
163 MochiKit.Iter.forEach(this.renderingWaitingQueue(), MochiKit.Base.methodcaller('callback')); 160 MochiKit.Iter.forEach(this.renderingWaitingQueue(), MochiKit.Base.methodcaller('callback'));
164 this.resetRenderingWaitingQueue(); 161 this.resetRenderingWaitingQueue();
165 }, 162 },
166 163
167 'renderSelf': function() { 164 'renderSelf': function() {
168 throw Clipperz.Base.exception.AbstractMethod; 165 throw Clipperz.Base.exception.AbstractMethod;
169 }, 166 },
170 167
171 'renderComponents': function() { 168 'renderComponents': function() {
172 varslotName; 169 varslotName;
173 170
174 for (slotName in this.slotComponents()) { 171 for (slotName in this.slotComponents()) {
175 this.slotComponents()[slotName].renderInNode(this.elementForSlotNamed(slotName)); 172 this.slotComponents()[slotName].renderInNode(this.elementForSlotNamed(slotName));
176 } 173 }
177 }, 174 },
178 175
179 //......................................................................... 176 //.........................................................................
180 177
181 'isFullyRendered': function () { 178 'isFullyRendered': function () {
182 return this._isFullyRendered; 179 return this._isFullyRendered;
183 }, 180 },
184 181
185 //......................................................................... 182 //.........................................................................
186 183
187 'renderingWaitingQueue': function () { 184 'renderingWaitingQueue': function () {
188 return this._renderingWaitingQueue; 185 return this._renderingWaitingQueue;
189 }, 186 },
190 187
191 'resetRenderingWaitingQueue': function () { 188 'resetRenderingWaitingQueue': function () {
192 this._renderingWaitingQueue = []; 189 this._renderingWaitingQueue = [];
193 }, 190 },
194 191
195 //......................................................................... 192 //.........................................................................
196 193
197 'waitUntilFullyRendered': function () { 194 'waitUntilFullyRendered': function () {
198 var deferredResult; 195 var deferredResult;
199 196
200 if (this.isFullyRendered() == true) { 197 if (this.isFullyRendered() == true) {
201 deferredResult = MochiKit.Async.succeed 198 deferredResult = MochiKit.Async.succeed
202 } else { 199 } else {
203 deferredResult = new Clipperz.Async.Deferred("BaseComponent.waitUntilFullyRendered", {trace:false}); 200 deferredResult = new Clipperz.Async.Deferred("BaseComponent.waitUntilFullyRendered", {trace:false});
204 this.renderingWaitingQueue().push(deferredResult); 201 this.renderingWaitingQueue().push(deferredResult);
205 } 202 }
206 203
207 return deferredResult; 204 return deferredResult;
208 }, 205 },
209 206
210 //----------------------------------------------------- 207 //-----------------------------------------------------
211 208
212 'renderTranslationHints': function () { 209 'renderTranslationHints': function () {
213 vartranslatableItems; 210 vartranslatableItems;
214 211
215 translatableItems = MochiKit.Selector.findChildElements(this.displayElement(), ['[stringID]']); 212 translatableItems = MochiKit.Selector.findChildElements(this.displayElement(), ['[stringID]']);
216 MochiKit.Iter.forEach(translatableItems, MochiKit.Base.method(this, 'enhanceTranslatableElement')) 213 MochiKit.Iter.forEach(translatableItems, MochiKit.Base.method(this, 'enhanceTranslatableElement'))
217 }, 214 },
218 215
219 'enhanceTranslatableElement': function (anElement) { 216 'enhanceTranslatableElement': function (anElement) {
220//Clipperz.log(">>> enhanceTranslatableElement", anElement); 217//Clipperz.log(">>> enhanceTranslatableElement", anElement);
221 // new Clipperz.PM.UI.Common.Components.TranslatorWidget({ 218 // new Clipperz.PM.UI.Common.Components.TranslatorWidget({
222 // 'element':anElement 219 // 'element':anElement
223 // }); 220 // });
224 221
225 MochiKit.Signal.connect(anElement, 'onmouseenter', MochiKit.Base.partial(Clipperz.PM.UI.Common.Components.TranslatorWidget.show, anElement, MochiKit.DOM.getNodeAttribute(anElement, 'stringID'))); 222 MochiKit.Signal.connect(anElement, 'onmouseenter', MochiKit.Base.partial(Clipperz.PM.UI.Common.Components.TranslatorWidget.show, anElement, MochiKit.DOM.getNodeAttribute(anElement, 'stringID')));
226 MochiKit.Signal.connect(anElement, 'onmouseleave', Clipperz.PM.UI.Common.Components.TranslatorWidget.hide); 223 MochiKit.Signal.connect(anElement, 'onmouseleave', Clipperz.PM.UI.Common.Components.TranslatorWidget.hide);
227//Clipperz.log("<<< enhanceTranslatableElement"); 224//Clipperz.log("<<< enhanceTranslatableElement");
228 }, 225 },
229 226
230 //----------------------------------------------------- 227 //-----------------------------------------------------
231 228
232 'update': function(args) { 229 'update': function(args) {
233 throw Clipperz.Base.exception.AbstractMethod; 230 throw Clipperz.Base.exception.AbstractMethod;
234 }, 231 },
235 232
236 'updateSelf': function(args) { 233 'updateSelf': function(args) {
237 throw Clipperz.Base.exception.AbstractMethod; 234 throw Clipperz.Base.exception.AbstractMethod;
238 }, 235 },
239 236
240 'updateComponents': function(args) { 237 'updateComponents': function(args) {
241 throw Clipperz.Base.exception.AbstractMethod; 238 throw Clipperz.Base.exception.AbstractMethod;
242 }, 239 },
243 240
244 //----------------------------------------------------- 241 //-----------------------------------------------------
245 242
246 'refresh': function() { 243 'refresh': function() {
247 throw Clipperz.Base.exception.AbstractMethod; 244 throw Clipperz.Base.exception.AbstractMethod;
248 }, 245 },
249 246
250 'refreshSelf': function() { 247 'refreshSelf': function() {
251 throw Clipperz.Base.exception.AbstractMethod; 248 throw Clipperz.Base.exception.AbstractMethod;
252 }, 249 },
253 250
254 'refreshComponents': function(args) { 251 'refreshComponents': function(args) {
255 throw Clipperz.Base.exception.AbstractMethod; 252 throw Clipperz.Base.exception.AbstractMethod;
256 }, 253 },
257 254
258 //----------------------------------------------------- 255 //-----------------------------------------------------
259 256
260 'checkSlotNamed': function(aSlotName) { 257 'checkSlotNamed': function(aSlotName) {
261 if (typeof(this._slots[aSlotName]) == 'undefined') { 258 if (typeof(this._slots[aSlotName]) == 'undefined') {
262 throw new Error("undefined slot"); 259 throw new Error("undefined slot");
263 }; 260 };
264 }, 261 },
265 262
266 //----------------------------------------------------- 263 //-----------------------------------------------------
267 264
268 'cachedSlots': function() { 265 'cachedSlots': function() {
269 return this._cachedSlots; 266 return this._cachedSlots;
270 }, 267 },
271 268
272 'slotNamed': function(aSlotName) { 269 'slotNamed': function(aSlotName) {
273 var result; 270 var result;
274 271
275 this.checkSlotNamed(aSlotName); 272 this.checkSlotNamed(aSlotName);
276 if (typeof(this.cachedSlots()[aSlotName]) == 'undefined') { 273 if (typeof(this.cachedSlots()[aSlotName]) == 'undefined') {
277 this.cachedSlots()[aSlotName] = new Clipperz.PM.UI.Common.Components.ComponentSlot(this,aSlotName); 274 this.cachedSlots()[aSlotName] = new Clipperz.PM.UI.Common.Components.ComponentSlot(this,aSlotName);
278 } 275 }
279 276
280 result = this.cachedSlots()[aSlotName]; 277 result = this.cachedSlots()[aSlotName];
281 278
282 return result; 279 return result;
283 }, 280 },
284 281
285 //----------------------------------------------------- 282 //-----------------------------------------------------
286 283
287 'elementForSlotNamed': function(aSlotName) { 284 'elementForSlotNamed': function(aSlotName) {
288 return MochiKit.DOM.getElement(this._slots[aSlotName]); 285 return MochiKit.DOM.getElement(this._slots[aSlotName]);
289 }, 286 },
290 287
291 //----------------------------------------------------- 288 //-----------------------------------------------------
292 289
293 'componentForSlotNamed': function(aSlotName) { 290 'componentForSlotNamed': function(aSlotName) {
294 return this.slotComponents()[aSlotName]; 291 return this.slotComponents()[aSlotName];
295 }, 292 },
296 293
297 'setComponentForSlotNamed': function(aComponent, aSlotName) { 294 'setComponentForSlotNamed': function(aComponent, aSlotName) {
298 var domNode; 295 var domNode;
299 296
300 this.checkSlotNamed(aSlotName); 297 this.checkSlotNamed(aSlotName);
301 298
302 if (this.slotComponents()[aSlotName] != null) { 299 if (this.slotComponents()[aSlotName] != null) {
303 this.slotComponents()[aSlotName].remove(); 300 this.slotComponents()[aSlotName].remove();
304 } 301 }
305 302
306 this.slotComponents()[aSlotName] = aComponent; 303 this.slotComponents()[aSlotName] = aComponent;
307 304
308 // domNode = MochiKit.DOM.getElement(this.slotNamed(aSlotName)); 305 // domNode = MochiKit.DOM.getElement(this.slotNamed(aSlotName));
309 domNode = this.elementForSlotNamed(aSlotName); 306 domNode = this.elementForSlotNamed(aSlotName);
310 307
311 if (domNode != null) { 308 if (domNode != null) {
312 aComponent.renderInNode(domNode); 309 aComponent.renderInNode(domNode);
313 } 310 }
314 }, 311 },
315 312
316 //----------------------------------------------------- 313 //-----------------------------------------------------
317/* 314/*
318 'purgeListeners': function() { 315 'purgeListeners': function() {
319//MochiKit.Logging.logDebug(">>> Clipperz.PM.UI.Common.Components.BaseComponent.purgeListeners [" + this + "]"); 316//MochiKit.Logging.logDebug(">>> Clipperz.PM.UI.Common.Components.BaseComponent.purgeListeners [" + this + "]");
320//MochiKit.Logging.logDebug("--- " + this + ".purgeListeners"); 317//MochiKit.Logging.logDebug("--- " + this + ".purgeListeners");
321 Clipperz.NotificationCenter.unregister(this); 318 Clipperz.NotificationCenter.unregister(this);
322 MochiKit.Signal.disconnectAllTo(this); 319 MochiKit.Signal.disconnectAllTo(this);
323//MochiKit.Logging.logDebug("<<< Clipperz.PM.UI.Common.Components.BaseComponent.purgeListeners"); 320//MochiKit.Logging.logDebug("<<< Clipperz.PM.UI.Common.Components.BaseComponent.purgeListeners");
324 }, 321 },
325 */ 322 */
326 //----------------------------------------------------- 323 //-----------------------------------------------------
327 324
328 'clear': function() { 325 'clear': function() {
329 varslotName; 326 varslotName;
330 var componentId; 327 var componentId;
331 328
332 MochiKit.Signal.disconnectAllTo(this); 329 MochiKit.Signal.disconnectAllTo(this);
333 330
334 for (slotName in this.slotComponents()) { 331 for (slotName in this.slotComponents()) {
335 this.slotComponents()[slotName].clear(); 332 this.slotComponents()[slotName].clear();
336 } 333 }
337 334
338 for (componentId in this.components()) { 335 for (componentId in this.components()) {
339 this.components()[componentId].clear(); 336 this.components()[componentId].clear();
340 } 337 }
341 338
342 // if (this.element() != null) { 339 // if (this.element() != null) {
343 // this.element().innerHTML = ""; 340 // this.element().innerHTML = "";
344 // } 341 // }
345 342
346 if (this.displayElement() != null) { 343 if (this.displayElement() != null) {
347 if (this.element() != this.displayElement()) { 344 if (this.element() != this.displayElement()) {
348 MochiKit.DOM.removeElement(this.displayElement()); 345 MochiKit.DOM.removeElement(this.displayElement());
349 } else { 346 } else {
350 this.displayElement().innerHTML = ""; 347 this.displayElement().innerHTML = "";
351 } 348 }
352 } 349 }
353 350
354 if (this.isModal()) { 351 if (this.isModal()) {
355 //TODO: cleanup when the closed element was shown modally. 352 //TODO: cleanup when the closed element was shown modally.
356 } 353 }
357 }, 354 },
358 355
359 356
360 'remove': function() { 357 'remove': function() {
361 varslotName; 358 varslotName;
362 var componentId; 359 var componentId;
363 360
364 for (slotName in this.slotComponents()) { 361 for (slotName in this.slotComponents()) {
365 this.slotComponents()[slotName].remove(); 362 this.slotComponents()[slotName].remove();
366 delete this.slotComponents()[slotName]; 363 delete this.slotComponents()[slotName];
367 } 364 }
368 365
369 for (componentId in this.components()) { 366 for (componentId in this.components()) {
370 this.components()[componentId].remove(); 367 this.components()[componentId].remove();
371 delete this.components()[componentId]; 368 delete this.components()[componentId];
372 } 369 }
373 370
374 this.clear(); 371 this.clear();
375 MochiKit.Signal.disconnectAll(this); 372 MochiKit.Signal.disconnectAll(this);
376 }, 373 },
377 374
378 'append': function(aNode, aValue) { 375 'append': function(aNode, aValue) {
379 return Clipperz.DOM.Helper.append(aNode, aValue); 376 return Clipperz.DOM.Helper.append(aNode, aValue);
380 }, 377 },
381 378
382 'insertBefore': function (aNode, aValue) { 379 'insertBefore': function (aNode, aValue) {
383 return Clipperz.DOM.Helper.insertBefore(aNode, aValue); 380 return Clipperz.DOM.Helper.insertBefore(aNode, aValue);
384 }, 381 },
385 382
386 'insertAfter': function (aNode, aValue) { 383 'insertAfter': function (aNode, aValue) {
387 return Clipperz.DOM.Helper.insertAfter(aNode, aValue); 384 return Clipperz.DOM.Helper.insertAfter(aNode, aValue);
388 }, 385 },
389 386
390 //------------------------------------------------------------------------- 387 //-------------------------------------------------------------------------
391 388
392 'getId': function(aValue) { 389 'getId': function(aValue) {
393 varresult; 390 varresult;
394 391
395 if (typeof(aValue) != 'undefined') { 392 if (typeof(aValue) != 'undefined') {
396 result = this._ids[aValue]; 393 result = this._ids[aValue];
397 394
398 if (typeof(result) == 'undefined') { 395 if (typeof(result) == 'undefined') {
399 _Clipperz_PM_Components_base_id_ ++; 396 _Clipperz_PM_Components_base_id_ ++;
400 397
401 result = "Clipperz_PM_Components_" + aValue + "_" + _Clipperz_PM_Components_base_id_; 398 result = "Clipperz_PM_Components_" + aValue + "_" + _Clipperz_PM_Components_base_id_;
402 this._ids[aValue] = result; 399 this._ids[aValue] = result;
403 } 400 }
404 } else { 401 } else {
405 // result = Clipperz.PM.UI.Common.Components.BaseComponent.superclass.getId.call(this); 402 // result = Clipperz.PM.UI.Common.Components.BaseComponent.superclass.getId.call(this);
406 throw "call to BaseComponent.getId with an undefined value"; 403 throw "call to BaseComponent.getId with an undefined value";
407 } 404 }
408 405
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 b2761ea..716d851 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Common/Components/Button.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Common/Components/Button.js
@@ -1,108 +1,105 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.PM.UI.Common.Components'); 26Clipperz.Base.module('Clipperz.PM.UI.Common.Components');
30 27
31Clipperz.PM.UI.Common.Components.Button = function(args) { 28Clipperz.PM.UI.Common.Components.Button = function(args) {
32 args = args || {}; 29 args = args || {};
33 30
34 Clipperz.PM.UI.Common.Components.Button.superclass.constructor.apply(this, arguments); 31 Clipperz.PM.UI.Common.Components.Button.superclass.constructor.apply(this, arguments);
35 32
36 this._element = args.element || Clipperz.Base.exception.raise('MandatoryParameter'); 33 this._element = args.element || Clipperz.Base.exception.raise('MandatoryParameter');
37 this._text = args.text || Clipperz.Base.exception.raise('MandatoryParameter'); 34 this._text = args.text || Clipperz.Base.exception.raise('MandatoryParameter');
38 this._isDefault = args.isDefault|| false; 35 this._isDefault = args.isDefault|| false;
39 36
40 this.render(); 37 this.render();
41 38
42 return this; 39 return this;
43} 40}
44 41
45//============================================================================= 42//=============================================================================
46 43
47Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.Button, Clipperz.PM.UI.Common.Components.BaseComponent, { 44Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.Button, Clipperz.PM.UI.Common.Components.BaseComponent, {
48 45
49 //------------------------------------------------------------------------- 46 //-------------------------------------------------------------------------
50 47
51 'toString': function () { 48 'toString': function () {
52 return "Clipperz.PM.UI.Common.Components.Button component"; 49 return "Clipperz.PM.UI.Common.Components.Button component";
53 }, 50 },
54 51
55 //------------------------------------------------------------------------- 52 //-------------------------------------------------------------------------
56 53
57 'text': function () { 54 'text': function () {
58 return this._text; 55 return this._text;
59 }, 56 },
60 57
61 'isDefault': function () { 58 'isDefault': function () {
62 return this._isDefault; 59 return this._isDefault;
63 }, 60 },
64 61
65 //------------------------------------------------------------------------- 62 //-------------------------------------------------------------------------
66 63
67 'renderSelf': function () { 64 'renderSelf': function () {
68 this.append(this.element(), {tag:'div', id:this.getId('wrapper'), cls:'button_wrapper', children:[ 65 this.append(this.element(), {tag:'div', id:this.getId('wrapper'), cls:'button_wrapper', children:[
69 {tag:'div', id:this.getId('bodyWrapper'), cls:'button_bodyWrapper', children:[ 66 {tag:'div', id:this.getId('bodyWrapper'), cls:'button_bodyWrapper', children:[
70 {tag:'div', id:this.getId('body'), cls:'button_body', children:[ 67 {tag:'div', id:this.getId('body'), cls:'button_body', children:[
71 {tag:'span', html:this.text()} 68 {tag:'span', html:this.text()}
72 ]}, 69 ]},
73 {tag:'div', id:this.getId('footer'), cls:'button_footer'} 70 {tag:'div', id:this.getId('footer'), cls:'button_footer'}
74 ]} 71 ]}
75 ]}); 72 ]});
76 73
77 if (this.isDefault()) { 74 if (this.isDefault()) {
78 MochiKit.DOM.addElementClass(this.getId('wrapper'), 'default'); 75 MochiKit.DOM.addElementClass(this.getId('wrapper'), 'default');
79 } 76 }
80 77
81 MochiKit.Signal.connect(this.getId('wrapper'), 'onmouseenter',this, 'handleOnMouseEnter'); 78 MochiKit.Signal.connect(this.getId('wrapper'), 'onmouseenter',this, 'handleOnMouseEnter');
82 MochiKit.Signal.connect(this.getId('wrapper'), 'onmouseleave',this, 'handleOnMouseLeave'); 79 MochiKit.Signal.connect(this.getId('wrapper'), 'onmouseleave',this, 'handleOnMouseLeave');
83 MochiKit.Signal.connect(this.getId('wrapper'), 'onmousedown',this, 'handleOnMouseDown'); 80 MochiKit.Signal.connect(this.getId('wrapper'), 'onmousedown',this, 'handleOnMouseDown');
84 MochiKit.Signal.connect(this.getId('wrapper'), 'onclick', this, 'handleOnClick'); 81 MochiKit.Signal.connect(this.getId('wrapper'), 'onclick', this, 'handleOnClick');
85 }, 82 },
86 83
87 //------------------------------------------------------------------------- 84 //-------------------------------------------------------------------------
88 85
89 'handleOnMouseEnter': function (anEvent) { 86 'handleOnMouseEnter': function (anEvent) {
90 MochiKit.DOM.addElementClass(this.getId('wrapper'), 'hover'); 87 MochiKit.DOM.addElementClass(this.getId('wrapper'), 'hover');
91 }, 88 },
92 89
93 'handleOnMouseLeave': function (anEvent) { 90 'handleOnMouseLeave': function (anEvent) {
94 MochiKit.DOM.removeElementClass(this.getId('wrapper'), 'hover'); 91 MochiKit.DOM.removeElementClass(this.getId('wrapper'), 'hover');
95 MochiKit.DOM.removeElementClass(this.getId('wrapper'), 'clicked'); 92 MochiKit.DOM.removeElementClass(this.getId('wrapper'), 'clicked');
96 }, 93 },
97 94
98 'handleOnMouseDown': function (anEvent) { 95 'handleOnMouseDown': function (anEvent) {
99 MochiKit.DOM.addElementClass(this.getId('wrapper'), 'clicked'); 96 MochiKit.DOM.addElementClass(this.getId('wrapper'), 'clicked');
100 }, 97 },
101 98
102 'handleOnClick': function (anEvent) { 99 'handleOnClick': function (anEvent) {
103 MochiKit.Signal.signal(this, 'onclick', anEvent); 100 MochiKit.Signal.signal(this, 'onclick', anEvent);
104 }, 101 },
105 102
106 //------------------------------------------------------------------------- 103 //-------------------------------------------------------------------------
107 __syntaxFix__: "syntax fix" 104 __syntaxFix__: "syntax fix"
108}); 105});
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 0c6e221..7f56c1e 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Common/Components/ComponentSlot.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Common/Components/ComponentSlot.js
@@ -1,64 +1,61 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.PM.UI.Common.Components'); 26Clipperz.Base.module('Clipperz.PM.UI.Common.Components');
30 27
31//############################################################################# 28//#############################################################################
32 29
33 30
34Clipperz.PM.UI.Common.Components.ComponentSlot = function(aComponent, aSlotName) { 31Clipperz.PM.UI.Common.Components.ComponentSlot = function(aComponent, aSlotName) {
35 this._component = aComponent; 32 this._component = aComponent;
36 this._slotName = aSlotName; 33 this._slotName = aSlotName;
37 34
38 return this; 35 return this;
39} 36}
40 37
41//============================================================================= 38//=============================================================================
42 39
43Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.ComponentSlot, Object, { 40Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.ComponentSlot, Object, {
44 41
45 //------------------------------------------------------------------------- 42 //-------------------------------------------------------------------------
46 43
47 'slotName': function() { 44 'slotName': function() {
48 return this._slotName; 45 return this._slotName;
49 }, 46 },
50 47
51 'component': function() { 48 'component': function() {
52 return this._component; 49 return this._component;
53 }, 50 },
54 51
55 //------------------------------------------------------------------------- 52 //-------------------------------------------------------------------------
56 53
57 'setContent': function(aComponent) { 54 'setContent': function(aComponent) {
58 this.component().setComponentForSlotNamed(aComponent, this.slotName()); 55 this.component().setComponentForSlotNamed(aComponent, this.slotName());
59 }, 56 },
60 57
61 //------------------------------------------------------------------------- 58 //-------------------------------------------------------------------------
62 __syntaxFix__: "syntax fix" 59 __syntaxFix__: "syntax fix"
63 60
64}); 61});
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 4735f5c..2db2489 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Common/Components/FaviconComponent.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Common/Components/FaviconComponent.js
@@ -1,91 +1,88 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.PM.UI.Common.Components'); 26Clipperz.Base.module('Clipperz.PM.UI.Common.Components');
30 27
31Clipperz.PM.UI.Common.Components.FaviconComponent = function(args) { 28Clipperz.PM.UI.Common.Components.FaviconComponent = function(args) {
32 args = args || {}; 29 args = args || {};
33 30
34 Clipperz.PM.UI.Common.Components.FaviconComponent.superclass.constructor.apply(this, arguments); 31 Clipperz.PM.UI.Common.Components.FaviconComponent.superclass.constructor.apply(this, arguments);
35 32
36 this.render(); 33 this.render();
37 this.setSrc(args.src); 34 this.setSrc(args.src);
38 35
39 return this; 36 return this;
40} 37}
41 38
42//============================================================================= 39//=============================================================================
43 40
44Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.FaviconComponent, Clipperz.PM.UI.Common.Components.BaseComponent, { 41Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.FaviconComponent, Clipperz.PM.UI.Common.Components.BaseComponent, {
45 42
46 //------------------------------------------------------------------------- 43 //-------------------------------------------------------------------------
47 44
48 'toString': function () { 45 'toString': function () {
49 return "Clipperz.PM.UI.Common.Components.FaviconComponent component"; 46 return "Clipperz.PM.UI.Common.Components.FaviconComponent component";
50 }, 47 },
51 48
52 //------------------------------------------------------------------------- 49 //-------------------------------------------------------------------------
53 50
54 'src': function () { 51 'src': function () {
55 return this.element().src; 52 return this.element().src;
56 }, 53 },
57 54
58 'setSrc': function (aValue) { 55 'setSrc': function (aValue) {
59 this.element().src = (aValue || Clipperz.PM.Strings.getValue('defaultFaviconUrl')); 56 this.element().src = (aValue || Clipperz.PM.Strings.getValue('defaultFaviconUrl'));
60 }, 57 },
61 58
62 //------------------------------------------------------------------------- 59 //-------------------------------------------------------------------------
63 60
64 'clear': function () {}, 61 'clear': function () {},
65 62
66 //------------------------------------------------------------------------- 63 //-------------------------------------------------------------------------
67 64
68 'renderSelf': function () { 65 'renderSelf': function () {
69 MochiKit.Signal.connect(this.element(), 'onerror',this, 'setDefaultFavicon'); 66 MochiKit.Signal.connect(this.element(), 'onerror',this, 'setDefaultFavicon');
70 MochiKit.Signal.connect(this.element(), 'onabort',this, 'setDefaultFavicon'); 67 MochiKit.Signal.connect(this.element(), 'onabort',this, 'setDefaultFavicon');
71 MochiKit.Signal.connect(this.element(), 'onload',this, 'handleOnLoad'); 68 MochiKit.Signal.connect(this.element(), 'onload',this, 'handleOnLoad');
72 }, 69 },
73 70
74 //------------------------------------------------------------------------- 71 //-------------------------------------------------------------------------
75 72
76 'setDefaultFavicon': function (anEvent) { 73 'setDefaultFavicon': function (anEvent) {
77 MochiKit.Signal.disconnectAll(anEvent.src()); 74 MochiKit.Signal.disconnectAll(anEvent.src());
78 this.setSrc(null); 75 this.setSrc(null);
79 }, 76 },
80 77
81 'handleOnLoad': function (anEvent) { 78 'handleOnLoad': function (anEvent) {
82 MochiKit.Signal.disconnectAll(anEvent.src()); 79 MochiKit.Signal.disconnectAll(anEvent.src());
83//console.log("HANDLE ON LOAD", anEvent, anEvent.src().src); 80//console.log("HANDLE ON LOAD", anEvent, anEvent.src().src);
84 if (anEvent.src().complete == false) { 81 if (anEvent.src().complete == false) {
85 this.setSrc(null); 82 this.setSrc(null);
86 } 83 }
87 }, 84 },
88 85
89 //------------------------------------------------------------------------- 86 //-------------------------------------------------------------------------
90 __syntaxFix__: "syntax fix" 87 __syntaxFix__: "syntax fix"
91}); 88});
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 275bbed..2788b79 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Common/Components/MessagePanelWithProgressBar.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Common/Components/MessagePanelWithProgressBar.js
@@ -1,164 +1,161 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.PM.UI.Common.Components'); 26Clipperz.Base.module('Clipperz.PM.UI.Common.Components');
30 27
31Clipperz.PM.UI.Common.Components.MessagePanelWithProgressBar = function(args) { 28Clipperz.PM.UI.Common.Components.MessagePanelWithProgressBar = function(args) {
32 args = args || {}; 29 args = args || {};
33 30
34 Clipperz.PM.UI.Common.Components.MessagePanelWithProgressBar.superclass.constructor.apply(this, arguments); 31 Clipperz.PM.UI.Common.Components.MessagePanelWithProgressBar.superclass.constructor.apply(this, arguments);
35 32
36 // this._openFromElement = args.openFromElement || null; 33 // this._openFromElement = args.openFromElement || null;
37 this._onOkCloseToElement = args.onOkCloseToElement || null; 34 this._onOkCloseToElement = args.onOkCloseToElement || null;
38 this._onCancelCloseToElement = args.onCancelCloseToElement|| null; 35 this._onCancelCloseToElement = args.onCancelCloseToElement|| null;
39 36
40 this._canCancelWhileProcessing= ((typeof(args.canCancelWhileProcessing) == 'undefined') ? true : args.canCancelWhileProcessing); 37 this._canCancelWhileProcessing= ((typeof(args.canCancelWhileProcessing) == 'undefined') ? true : args.canCancelWhileProcessing);
41 38
42 return this; 39 return this;
43} 40}
44 41
45//============================================================================= 42//=============================================================================
46 43
47Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.MessagePanelWithProgressBar, Clipperz.PM.UI.Common.Components.SimpleMessagePanel, { 44Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.MessagePanelWithProgressBar, Clipperz.PM.UI.Common.Components.SimpleMessagePanel, {
48 45
49 //------------------------------------------------------------------------- 46 //-------------------------------------------------------------------------
50 47
51 'toString': function () { 48 'toString': function () {
52 return "Clipperz.PM.UI.Common.Components.MessagePanelWithProgressBar component"; 49 return "Clipperz.PM.UI.Common.Components.MessagePanelWithProgressBar component";
53 }, 50 },
54 51
55 //------------------------------------------------------------------------- 52 //-------------------------------------------------------------------------
56/* 53/*
57 'openFromElement': function () { 54 'openFromElement': function () {
58 return this._openFromElement; 55 return this._openFromElement;
59 }, 56 },
60*/ 57*/
61 //------------------------------------------------------------------------- 58 //-------------------------------------------------------------------------
62 59
63 'onOkCloseToElement': function () { 60 'onOkCloseToElement': function () {
64 return this._onOkCloseToElement; 61 return this._onOkCloseToElement;
65 }, 62 },
66 63
67 'setOnOkCloseToElement': function (anElement) { 64 'setOnOkCloseToElement': function (anElement) {
68 this._onOkCloseToElement = anElement; 65 this._onOkCloseToElement = anElement;
69 }, 66 },
70 67
71 //------------------------------------------------------------------------- 68 //-------------------------------------------------------------------------
72 69
73 'onCancelCloseToElement': function () { 70 'onCancelCloseToElement': function () {
74 return this._onCancelCloseToElement; 71 return this._onCancelCloseToElement;
75 }, 72 },
76 73
77 'setOnCancelCloseToElement': function (anElement) { 74 'setOnCancelCloseToElement': function (anElement) {
78 this._onCancelCloseToElement = anElement; 75 this._onCancelCloseToElement = anElement;
79 }, 76 },
80 77
81 //------------------------------------------------------------------------- 78 //-------------------------------------------------------------------------
82 79
83 'canCancelWhileProcessing': function () { 80 'canCancelWhileProcessing': function () {
84 return this._canCancelWhileProcessing; 81 return this._canCancelWhileProcessing;
85 }, 82 },
86 83
87 //------------------------------------------------------------------------- 84 //-------------------------------------------------------------------------
88 85
89 'deferredShowModal': function (someArgs, aResult) { 86 'deferredShowModal': function (someArgs, aResult) {
90 if (someArgs['onOkCloseToElement'] != null) { 87 if (someArgs['onOkCloseToElement'] != null) {
91 this.setOnOkCloseToElement(someArgs['onOkCloseToElement']); 88 this.setOnOkCloseToElement(someArgs['onOkCloseToElement']);
92 } 89 }
93 90
94 if (someArgs['onCancelCloseToElement'] != null) { 91 if (someArgs['onCancelCloseToElement'] != null) {
95 this.setOnCancelCloseToElement(someArgs['onCancelCloseToElement']); 92 this.setOnCancelCloseToElement(someArgs['onCancelCloseToElement']);
96 } 93 }
97 94
98 Clipperz.PM.UI.Common.Components.MessagePanelWithProgressBar.superclass.deferredShowModal.apply(this, arguments); 95 Clipperz.PM.UI.Common.Components.MessagePanelWithProgressBar.superclass.deferredShowModal.apply(this, arguments);
99 return this.deferred(); 96 return this.deferred();
100 }, 97 },
101 98
102 //------------------------------------------------------------------------- 99 //-------------------------------------------------------------------------
103 100
104 'showProgressBar': function () { 101 'showProgressBar': function () {
105 varprogressBarElement; 102 varprogressBarElement;
106 103
107 this.getElement('container').innerHTML = ''; 104 this.getElement('container').innerHTML = '';
108 105
109 progressBarElement = this.append(this.getElement('container'), {tag:'div', cls:'progressBarWrapper'}); 106 progressBarElement = this.append(this.getElement('container'), {tag:'div', cls:'progressBarWrapper'});
110 this.addComponent(new Clipperz.PM.UI.Common.Components.ProgressBar({'element':progressBarElement})); 107 this.addComponent(new Clipperz.PM.UI.Common.Components.ProgressBar({'element':progressBarElement}));
111 108
112 if (this.canCancelWhileProcessing() == true) { 109 if (this.canCancelWhileProcessing() == true) {
113 this.setButtons([{text:"Cancel", result:'CANCEL'}]); 110 this.setButtons([{text:"Cancel", result:'CANCEL'}]);
114 } else { 111 } else {
115 this.setButtons([]); 112 this.setButtons([]);
116 } 113 }
117 }, 114 },
118 115
119 //------------------------------------------------------------------------- 116 //-------------------------------------------------------------------------
120 117
121 'showFailure': function (someParameters) { 118 'showFailure': function (someParameters) {
122 // this.setType('ALERT'); 119 // this.setType('ALERT');
123 this.setType(someParameters['type']); 120 this.setType(someParameters['type']);
124 // this.setTitle("Login failed"); 121 // this.setTitle("Login failed");
125 this.setTitle(someParameters['title']); 122 this.setTitle(someParameters['title']);
126 // this.setText("Wrong passphrase; the unlock has failed."); 123 // this.setText("Wrong passphrase; the unlock has failed.");
127 this.setText(someParameters['text']); 124 this.setText(someParameters['text']);
128 // this.getElement('container').innerHTML = ''; 125 // this.getElement('container').innerHTML = '';
129 this.getElement('container').innerHTML = ''; 126 this.getElement('container').innerHTML = '';
130 // this.setButtons([{text:"Close", result:'CANCEL', isDefault:true}]); 127 // this.setButtons([{text:"Close", result:'CANCEL', isDefault:true}]);
131 this.setButtons(someParameters['buttons']); 128 this.setButtons(someParameters['buttons']);
132 }, 129 },
133 130
134 //------------------------------------------------------------------------- 131 //-------------------------------------------------------------------------
135 132
136 'closeOk': function () { 133 'closeOk': function () {
137//console.log("=== closeOk"); 134//console.log("=== closeOk");
138 this.showProgressBar(); 135 this.showProgressBar();
139 MochiKit.Async.callLater(0.5, MochiKit.Base.method(this.deferred(), 'callback')); 136 MochiKit.Async.callLater(0.5, MochiKit.Base.method(this.deferred(), 'callback'));
140 this._deferred = null; 137 this._deferred = null;
141 }, 138 },
142 139
143 'closeCancel': function () { 140 'closeCancel': function () {
144//console.log("=== closeCancel"); 141//console.log("=== closeCancel");
145 this.deferredHideModal({closeToElement:this.onCancelCloseToElement()}); 142 this.deferredHideModal({closeToElement:this.onCancelCloseToElement()});
146 this.deferred().cancel(); 143 this.deferred().cancel();
147 this._deferred = null; 144 this._deferred = null;
148 }, 145 },
149 146
150 //------------------------------------------------------------------------- 147 //-------------------------------------------------------------------------
151 148
152 'deferredDone': function () { 149 'deferredDone': function () {
153//console.log("=== deferredDone"); 150//console.log("=== deferredDone");
154 return this.deferredHideModal({closeToElement:this.onOkCloseToElement()}); 151 return this.deferredHideModal({closeToElement:this.onOkCloseToElement()});
155 }, 152 },
156 153
157 'deferredError': function (someParameters) { 154 'deferredError': function (someParameters) {
158//console.log("=== deferredError"); 155//console.log("=== deferredError");
159 this.showFailure(someParameters); 156 this.showFailure(someParameters);
160 }, 157 },
161 158
162 //------------------------------------------------------------------------- 159 //-------------------------------------------------------------------------
163 __syntaxFix__: "syntax fix" 160 __syntaxFix__: "syntax fix"
164}); 161});
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 c1b4f13..089e3d4 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Common/Components/PasswordEntropyDisplay.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Common/Components/PasswordEntropyDisplay.js
@@ -1,140 +1,137 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.PM.UI.Common.Components'); 26Clipperz.Base.module('Clipperz.PM.UI.Common.Components');
30 27
31Clipperz.PM.UI.Common.Components.PasswordEntropyDisplay = function(anElement, args) { 28Clipperz.PM.UI.Common.Components.PasswordEntropyDisplay = function(anElement, args) {
32 args = args || {}; 29 args = args || {};
33 30
34//MochiKit.Logging.logDebug(">>> new TextFormField"); 31//MochiKit.Logging.logDebug(">>> new TextFormField");
35 Clipperz.PM.UI.Common.Components.PasswordEntropyDisplay.superclass.constructor.call(this, anElement, args); 32 Clipperz.PM.UI.Common.Components.PasswordEntropyDisplay.superclass.constructor.call(this, anElement, args);
36 33
37 this._wrapperElement = null; 34 this._wrapperElement = null;
38 this._entropyElement = null; 35 this._entropyElement = null;
39 36
40 this.render(); 37 this.render();
41//MochiKit.Logging.logDebug("<<< new TextFormField"); 38//MochiKit.Logging.logDebug("<<< new TextFormField");
42 39
43 return this; 40 return this;
44}; 41};
45 42
46Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.PasswordEntropyDisplay, Clipperz.PM.UI.Common.Components.BaseComponent, { 43Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.PasswordEntropyDisplay, Clipperz.PM.UI.Common.Components.BaseComponent, {
47 44
48 'toString': function() { 45 'toString': function() {
49 return "Clipperz.PM.UI.Common.Components.PasswordEntropyDisplay"; 46 return "Clipperz.PM.UI.Common.Components.PasswordEntropyDisplay";
50 }, 47 },
51 48
52 //----------------------------------------------------- 49 //-----------------------------------------------------
53 50
54 'wrapperElement': function() { 51 'wrapperElement': function() {
55 return this._wrapperElement; 52 return this._wrapperElement;
56 }, 53 },
57 54
58 'setWrapperElement': function(aValue) { 55 'setWrapperElement': function(aValue) {
59 this._wrapperElement = aValue; 56 this._wrapperElement = aValue;
60 }, 57 },
61 58
62 //----------------------------------------------------- 59 //-----------------------------------------------------
63 60
64 'passwordElement': function() { 61 'passwordElement': function() {
65 return this.element(); 62 return this.element();
66 }, 63 },
67 64
68 //----------------------------------------------------- 65 //-----------------------------------------------------
69 66
70 'entropyElement': function() { 67 'entropyElement': function() {
71 return this._entropyElement; 68 return this._entropyElement;
72 }, 69 },
73 70
74 'setEntropyElement': function(aValue) { 71 'setEntropyElement': function(aValue) {
75 this._entropyElement = aValue; 72 this._entropyElement = aValue;
76 }, 73 },
77 74
78 //----------------------------------------------------- 75 //-----------------------------------------------------
79 76
80 'render': function() { 77 'render': function() {
81/* 78/*
82 MochiKit.Signal.disconnectAllTo(this); 79 MochiKit.Signal.disconnectAllTo(this);
83 80
84 this.setWrapperElement(this.element().wrap({tag:'div'})); 81 this.setWrapperElement(this.element().wrap({tag:'div'}));
85 this.setEntropyElement(Clipperz.DOM.Helper.append(this.wrapperElement().dom, {tag:'div', cls:'passwordEntropy', html:"&nbsp;"}, true)); 82 this.setEntropyElement(Clipperz.DOM.Helper.append(this.wrapperElement().dom, {tag:'div', cls:'passwordEntropy', html:"&nbsp;"}, true));
86 // this.setEntropyElement(Clipperz.DOM.Helper.insertBefore(this.element(), {tag:'div', cls:'passwordEntropy', html:"&nbsp;"}, true)); 83 // this.setEntropyElement(Clipperz.DOM.Helper.insertBefore(this.element(), {tag:'div', cls:'passwordEntropy', html:"&nbsp;"}, true));
87 this.entropyElement().wrap({tag:'div', cls:'passwordEntropyWrapper'}); 84 this.entropyElement().wrap({tag:'div', cls:'passwordEntropyWrapper'});
88 85
89 this.updateEntropyElement(); 86 this.updateEntropyElement();
90 87
91 this.connect('onkeyup', 'updateEntropyElement'); 88 this.connect('onkeyup', 'updateEntropyElement');
92 this.connect('onchange', 'updateEntropyElement'); 89 this.connect('onchange', 'updateEntropyElement');
93 this.connect('onblur', 'updateEntropyElement'); 90 this.connect('onblur', 'updateEntropyElement');
94*/ 91*/
95 MochiKit.Signal.disconnectAllTo(this); 92 MochiKit.Signal.disconnectAllTo(this);
96 93
97 this.setEntropyElement(this.element()); 94 this.setEntropyElement(this.element());
98 this.entropyElement().addClass("entropyLevelIndicator"); 95 this.entropyElement().addClass("entropyLevelIndicator");
99 96
100 this.updateEntropyElement(); 97 this.updateEntropyElement();
101 98
102 this.connect('onkeyup', 'updateEntropyElement'); 99 this.connect('onkeyup', 'updateEntropyElement');
103 this.connect('onchange', 'updateEntropyElement'); 100 this.connect('onchange', 'updateEntropyElement');
104 this.connect('onblur', 'updateEntropyElement'); 101 this.connect('onblur', 'updateEntropyElement');
105 }, 102 },
106 103
107 //----------------------------------------------------- 104 //-----------------------------------------------------
108 105
109 'computeEntropyForString': function(aValue) { 106 'computeEntropyForString': function(aValue) {
110 return Clipperz.PM.Crypto.passwordEntropy(aValue); 107 return Clipperz.PM.Crypto.passwordEntropy(aValue);
111 }, 108 },
112 109
113 //----------------------------------------------------- 110 //-----------------------------------------------------
114 111
115 'updateEntropyElement': function(anEvent) { 112 'updateEntropyElement': function(anEvent) {
116/* 113/*
117//MochiKit.Logging.logDebug(">>> PasswordEntropyDisplay.updateEntropyElement"); 114//MochiKit.Logging.logDebug(">>> PasswordEntropyDisplay.updateEntropyElement");
118 varmaxExtent; 115 varmaxExtent;
119 varentropy; 116 varentropy;
120 117
121 entropy = Math.min(128, this.computeEntropyForString(this.passwordElement().dom.value)); 118 entropy = Math.min(128, this.computeEntropyForString(this.passwordElement().dom.value));
122//MochiKit.Logging.logDebug("--- PasswordEntropyDisplay.updateEntropyElement - entropy: " + entropy); 119//MochiKit.Logging.logDebug("--- PasswordEntropyDisplay.updateEntropyElement - entropy: " + entropy);
123 this.entropyElement().setStyle('background-position', "0px " + -entropy + "px"); 120 this.entropyElement().setStyle('background-position', "0px " + -entropy + "px");
124 this.entropyElement().setWidth(this.passwordElement().getWidth() * (entropy/128)); 121 this.entropyElement().setWidth(this.passwordElement().getWidth() * (entropy/128));
125//MochiKit.Logging.logDebug("<<< PasswordEntropyDisplay.updateEntropyElement"); 122//MochiKit.Logging.logDebug("<<< PasswordEntropyDisplay.updateEntropyElement");
126*/ 123*/
127 varentropy; 124 varentropy;
128 125
129 entropy = Math.min(128, this.computeEntropyForString(this.passwordElement().dom.value)); 126 entropy = Math.min(128, this.computeEntropyForString(this.passwordElement().dom.value));
130 127
131 if (entropy == 0) { 128 if (entropy == 0) {
132 this.entropyElement().setStyle('background-position', "0px 26px"); 129 this.entropyElement().setStyle('background-position', "0px 26px");
133 } else { 130 } else {
134 this.entropyElement().setStyle('background-position', "0px -" + (128-entropy)*26 + "px"); 131 this.entropyElement().setStyle('background-position', "0px -" + (128-entropy)*26 + "px");
135 } 132 }
136 }, 133 },
137 134
138 //----------------------------------------------------- 135 //-----------------------------------------------------
139 __syntaxFix__: '__syntaxFix__' 136 __syntaxFix__: '__syntaxFix__'
140}); 137});
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 7e7f8fe..5991530 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Common/Components/ProgressBar.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Common/Components/ProgressBar.js
@@ -1,73 +1,70 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.PM.UI.Common.Components'); 26Clipperz.Base.module('Clipperz.PM.UI.Common.Components');
30 27
31Clipperz.PM.UI.Common.Components.ProgressBar = function(args) { 28Clipperz.PM.UI.Common.Components.ProgressBar = function(args) {
32 args = args || {}; 29 args = args || {};
33 30
34 Clipperz.PM.UI.Common.Components.ProgressBar.superclass.constructor.apply(this, arguments); 31 Clipperz.PM.UI.Common.Components.ProgressBar.superclass.constructor.apply(this, arguments);
35 32
36 this._element = args.element|| Clipperz.Base.exception.raise('MandatoryParameter'); 33 this._element = args.element|| Clipperz.Base.exception.raise('MandatoryParameter');
37 34
38 this.renderSelf(); 35 this.renderSelf();
39 36
40 MochiKit.Signal.connect(Clipperz.PM.UI.Common.Controllers.ProgressBarController.defaultController, 'updateProgress', this, 'updateProgressHandler') 37 MochiKit.Signal.connect(Clipperz.PM.UI.Common.Controllers.ProgressBarController.defaultController, 'updateProgress', this, 'updateProgressHandler')
41 38
42 return this; 39 return this;
43} 40}
44 41
45//============================================================================= 42//=============================================================================
46 43
47Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.ProgressBar, Clipperz.PM.UI.Common.Components.BaseComponent, { 44Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.ProgressBar, Clipperz.PM.UI.Common.Components.BaseComponent, {
48 45
49 //------------------------------------------------------------------------- 46 //-------------------------------------------------------------------------
50 47
51 'toString': function () { 48 'toString': function () {
52 return "Clipperz.PM.UI.Common.Components.ProgressBar component"; 49 return "Clipperz.PM.UI.Common.Components.ProgressBar component";
53 }, 50 },
54 51
55 //------------------------------------------------------------------------- 52 //-------------------------------------------------------------------------
56 53
57 'renderSelf': function() { 54 'renderSelf': function() {
58 this.append(this.element(), {tag:'div', cls:'loadingBar', children:[ 55 this.append(this.element(), {tag:'div', cls:'loadingBar', children:[
59 {tag:'div', cls:'loadingBarProgressBox', children:[ 56 {tag:'div', cls:'loadingBarProgressBox', children:[
60 {tag:'div', id:this.getId('loadingBarProgress'), cls:'loadingBarProgress'} 57 {tag:'div', id:this.getId('loadingBarProgress'), cls:'loadingBarProgress'}
61 ]} 58 ]}
62 ]}); 59 ]});
63 }, 60 },
64 61
65 //------------------------------------------------------------------------- 62 //-------------------------------------------------------------------------
66 63
67 'updateProgressHandler': function (anEvent) { 64 'updateProgressHandler': function (anEvent) {
68 MochiKit.Style.setElementDimensions(this.getId('loadingBarProgress'), {w:anEvent}, '%'); 65 MochiKit.Style.setElementDimensions(this.getId('loadingBarProgress'), {w:anEvent}, '%');
69 }, 66 },
70 67
71 //------------------------------------------------------------------------- 68 //-------------------------------------------------------------------------
72 __syntaxFix__: "syntax fix" 69 __syntaxFix__: "syntax fix"
73}); 70});
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 b9bb850..1992154 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Common/Components/SimpleMessagePanel.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Common/Components/SimpleMessagePanel.js
@@ -1,282 +1,279 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 26Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
30 27
31Clipperz.PM.UI.Common.Components.SimpleMessagePanel = function(args) { 28Clipperz.PM.UI.Common.Components.SimpleMessagePanel = function(args) {
32 args = args || {}; 29 args = args || {};
33 30
34 Clipperz.PM.UI.Common.Components.SimpleMessagePanel.superclass.constructor.apply(this, arguments); 31 Clipperz.PM.UI.Common.Components.SimpleMessagePanel.superclass.constructor.apply(this, arguments);
35 32
36 this._title = args.title || Clipperz.Base.exception.raise('MandatoryParameter'); 33 this._title = args.title || Clipperz.Base.exception.raise('MandatoryParameter');
37 this._text = args.text || Clipperz.Base.exception.raise('MandatoryParameter'); 34 this._text = args.text || Clipperz.Base.exception.raise('MandatoryParameter');
38 this._type = args.type || Clipperz.Base.exception.raise('MandatoryParameter'); //ALERT, INFO, ERROR 35 this._type = args.type || Clipperz.Base.exception.raise('MandatoryParameter'); //ALERT, INFO, ERROR
39 this._buttons = args.buttons || Clipperz.Base.exception.raise('MandatoryParameter'); 36 this._buttons = args.buttons || Clipperz.Base.exception.raise('MandatoryParameter');
40 37
41 this._buttonComponents = []; 38 this._buttonComponents = [];
42 this._deferred = null; 39 this._deferred = null;
43 40
44 this.renderModalMask(); 41 this.renderModalMask();
45 42
46 return this; 43 return this;
47} 44}
48 45
49//============================================================================= 46//=============================================================================
50 47
51Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.SimpleMessagePanel, Clipperz.PM.UI.Common.Components.BaseComponent, { 48Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.SimpleMessagePanel, Clipperz.PM.UI.Common.Components.BaseComponent, {
52 49
53 //------------------------------------------------------------------------- 50 //-------------------------------------------------------------------------
54 51
55 'toString': function () { 52 'toString': function () {
56 return "Clipperz.PM.UI.Common.Components.SimpleMessagePanel component"; 53 return "Clipperz.PM.UI.Common.Components.SimpleMessagePanel component";
57 }, 54 },
58 55
59 //------------------------------------------------------------------------- 56 //-------------------------------------------------------------------------
60 57
61 'deferred': function() { 58 'deferred': function() {
62 if (this._deferred == null) { 59 if (this._deferred == null) {
63 this._deferred = new Clipperz.Async.Deferred("SimpleMessagePanel.deferred", {trace:false}); 60 this._deferred = new Clipperz.Async.Deferred("SimpleMessagePanel.deferred", {trace:false});
64 } 61 }
65 62
66 return this._deferred; 63 return this._deferred;
67 }, 64 },
68 65
69 //------------------------------------------------------------------------- 66 //-------------------------------------------------------------------------
70 67
71 'title': function () { 68 'title': function () {
72 return this._title; 69 return this._title;
73 }, 70 },
74 71
75 'setTitle': function (aValue) { 72 'setTitle': function (aValue) {
76 this._title = aValue; 73 this._title = aValue;
77 74
78 if (this.getElement('title') != null) { 75 if (this.getElement('title') != null) {
79 this.getElement('title').innerHTML = aValue; 76 this.getElement('title').innerHTML = aValue;
80 } 77 }
81 }, 78 },
82 79
83 //------------------------------------------------------------------------- 80 //-------------------------------------------------------------------------
84 81
85 'text': function () { 82 'text': function () {
86 return this._text; 83 return this._text;
87 }, 84 },
88 85
89 'setText': function (aValue) { 86 'setText': function (aValue) {
90 this._text = aValue; 87 this._text = aValue;
91 88
92 if (this.getElement('text') != null) { 89 if (this.getElement('text') != null) {
93 this.getElement('text').innerHTML = aValue; 90 this.getElement('text').innerHTML = aValue;
94 } 91 }
95 }, 92 },
96 93
97 //------------------------------------------------------------------------- 94 //-------------------------------------------------------------------------
98 95
99 'type': function () { 96 'type': function () {
100 return this._type; 97 return this._type;
101 }, 98 },
102 99
103 'setType': function (aValue) { 100 'setType': function (aValue) {
104 if (this.getElement('icon') != null) { 101 if (this.getElement('icon') != null) {
105 MochiKit.DOM.removeElementClass(this.getId('icon'), this._type); 102 MochiKit.DOM.removeElementClass(this.getId('icon'), this._type);
106 MochiKit.DOM.addElementClass(this.getId('icon'), aValue); 103 MochiKit.DOM.addElementClass(this.getId('icon'), aValue);
107 } 104 }
108 105
109 this._type = aValue; 106 this._type = aValue;
110 }, 107 },
111 108
112 //------------------------------------------------------------------------- 109 //-------------------------------------------------------------------------
113 110
114 'buttons': function () { 111 'buttons': function () {
115 return this._buttons; 112 return this._buttons;
116 }, 113 },
117 114
118 'setButtons': function (someValues) { 115 'setButtons': function (someValues) {
119 MochiKit.Iter.forEach(this.buttonComponents(), MochiKit.Base.methodcaller('clear')); 116 MochiKit.Iter.forEach(this.buttonComponents(), MochiKit.Base.methodcaller('clear'));
120 117
121 this._buttons = someValues; 118 this._buttons = someValues;
122 119
123 if (this.getElement('buttonArea') != null) { 120 if (this.getElement('buttonArea') != null) {
124 this.renderButtons(); 121 this.renderButtons();
125 } 122 }
126 }, 123 },
127 124
128 //......................................................................... 125 //.........................................................................
129 126
130 'buttonComponents': function () { 127 'buttonComponents': function () {
131 return this._buttonComponents; 128 return this._buttonComponents;
132 }, 129 },
133 130
134 //------------------------------------------------------------------------- 131 //-------------------------------------------------------------------------
135 132
136 'renderSelf': function() { 133 'renderSelf': function() {
137 this.append(this.element(), {tag:'div', cls:'SimpleMessagePanel', id:this.getId('panel'), children: [ 134 this.append(this.element(), {tag:'div', cls:'SimpleMessagePanel', id:this.getId('panel'), children: [
138 {tag:'div', cls:'header', children:[]}, 135 {tag:'div', cls:'header', children:[]},
139 {tag:'div', cls:'body', children:[ 136 {tag:'div', cls:'body', children:[
140 {tag:'div', id:this.getId('icon'),cls:'img ' + this.type(), children:[{tag:'div'}]}, 137 {tag:'div', id:this.getId('icon'),cls:'img ' + this.type(), children:[{tag:'div'}]},
141 {tag:'h3', id:this.getId('title'),html:this.title()}, 138 {tag:'h3', id:this.getId('title'),html:this.title()},
142 {tag:'p', id:this.getId('text'),html:this.text()}, 139 {tag:'p', id:this.getId('text'),html:this.text()},
143 {tag:'div', id:this.getId('container')}, 140 {tag:'div', id:this.getId('container')},
144 {tag:'div', id:this.getId('buttonArea'), cls:'buttonArea', children:[]} 141 {tag:'div', id:this.getId('buttonArea'), cls:'buttonArea', children:[]}
145 ]}, 142 ]},
146 {tag:'div', cls:'footer', children:[]} 143 {tag:'div', cls:'footer', children:[]}
147 ]}); 144 ]});
148 145
149 MochiKit.Signal.connect(this.getId('panel'), 'onkeydown', this, 'keyDownHandler'); 146 MochiKit.Signal.connect(this.getId('panel'), 'onkeydown', this, 'keyDownHandler');
150 147
151 this.renderButtons(); 148 this.renderButtons();
152 }, 149 },
153 150
154 //------------------------------------------------------------------------- 151 //-------------------------------------------------------------------------
155 152
156 'renderButtons': function () { 153 'renderButtons': function () {
157 this.getElement('buttonArea').innerHTML = ''; 154 this.getElement('buttonArea').innerHTML = '';
158 155
159 MochiKit.Base.map(MochiKit.Base.bind(function (aButton) { 156 MochiKit.Base.map(MochiKit.Base.bind(function (aButton) {
160 var buttonElement; 157 var buttonElement;
161 var buttonComponent; 158 var buttonComponent;
162 159
163 // element = this.append(this.getElement('buttonArea'), {tag:'div', cls:'button' + (aButton['isDefault'] === true ? ' default' : ''), children:[ 160 // element = this.append(this.getElement('buttonArea'), {tag:'div', cls:'button' + (aButton['isDefault'] === true ? ' default' : ''), children:[
164 // {tag:'a', href:'#'/*, id:this.getId('buttonLink')*/, html:aButton['text']} 161 // {tag:'a', href:'#'/*, id:this.getId('buttonLink')*/, html:aButton['text']}
165 // ]}); 162 // ]});
166 163
167 buttonElement = this.append(this.getElement('buttonArea'), {tag:'div'}); 164 buttonElement = this.append(this.getElement('buttonArea'), {tag:'div'});
168 buttonComponent = new Clipperz.PM.UI.Common.Components.Button({'element':buttonElement, 'text':aButton['text'], 'isDefault':aButton['isDefault']}); 165 buttonComponent = new Clipperz.PM.UI.Common.Components.Button({'element':buttonElement, 'text':aButton['text'], 'isDefault':aButton['isDefault']});
169 this.buttonComponents().push(buttonComponent); 166 this.buttonComponents().push(buttonComponent);
170 167
171 MochiKit.Signal.connect(buttonComponent, 'onclick', MochiKit.Base.method(this, 'buttonEventHandler', aButton)); 168 MochiKit.Signal.connect(buttonComponent, 'onclick', MochiKit.Base.method(this, 'buttonEventHandler', aButton));
172 }, this), MochiKit.Iter.reversed(this.buttons())); 169 }, this), MochiKit.Iter.reversed(this.buttons()));
173 }, 170 },
174 171
175 //------------------------------------------------------------------------- 172 //-------------------------------------------------------------------------
176 173
177 'displayElement': function() { 174 'displayElement': function() {
178 return this.getElement('panel'); 175 return this.getElement('panel');
179 }, 176 },
180 177
181 //------------------------------------------------------------------------- 178 //-------------------------------------------------------------------------
182 179
183 'closeOk': function () { 180 'closeOk': function () {
184 this.deferred().callback(); 181 this.deferred().callback();
185 this._deferred = null; 182 this._deferred = null;
186 }, 183 },
187 184
188 'closeCancel': function () { 185 'closeCancel': function () {
189 this.deferred().cancel(); 186 this.deferred().cancel();
190 this._deferred = null; 187 this._deferred = null;
191 }, 188 },
192 189
193 'closeError': function () { 190 'closeError': function () {
194 this.deferred().errback(); 191 this.deferred().errback();
195 this._deferred = null; 192 this._deferred = null;
196 }, 193 },
197 194
198 //------------------------------------------------------------------------- 195 //-------------------------------------------------------------------------
199 196
200 'buttonEventHandler': function(aButton, anEvent) { 197 'buttonEventHandler': function(aButton, anEvent) {
201 anEvent.preventDefault(); 198 anEvent.preventDefault();
202 199
203 // MochiKit.Signal.signal(this, 'cancelEvent'); 200 // MochiKit.Signal.signal(this, 'cancelEvent');
204 switch (aButton['result']) { 201 switch (aButton['result']) {
205 case 'OK': 202 case 'OK':
206//console.log("==> OK"); 203//console.log("==> OK");
207 this.closeOk(); 204 this.closeOk();
208 break; 205 break;
209 case 'CANCEL': 206 case 'CANCEL':
210//console.log("==> CANCEL"); 207//console.log("==> CANCEL");
211 this.closeCancel(); 208 this.closeCancel();
212 break; 209 break;
213 default: 210 default:
214//console.log("==> ????"); 211//console.log("==> ????");
215 this.closeError(); 212 this.closeError();
216 break; 213 break;
217 } 214 }
218//console.log("<=="); 215//console.log("<==");
219 }, 216 },
220 217
221 //------------------------------------------------------------------------- 218 //-------------------------------------------------------------------------
222 219
223 'deferredShow': function (someArgs, aResult) { 220 'deferredShow': function (someArgs, aResult) {
224 this.deferredShowModal(someArgs); 221 this.deferredShowModal(someArgs);
225 222
226 this.deferred().addMethod(this, 'deferredHideModal', {closeToElement:someArgs.onOkCloseToElement }); 223 this.deferred().addMethod(this, 'deferredHideModal', {closeToElement:someArgs.onOkCloseToElement });
227 this.deferred().addErrback (MochiKit.Base.method(this, 'deferredHideModal', {closeToElement:someArgs.onCancelCloseToElement })); 224 this.deferred().addErrback (MochiKit.Base.method(this, 'deferredHideModal', {closeToElement:someArgs.onCancelCloseToElement }));
228 this.deferred().addCallback(MochiKit.Async.succeed, aResult); 225 this.deferred().addCallback(MochiKit.Async.succeed, aResult);
229 226
230 return this.deferred(); 227 return this.deferred();
231 }, 228 },
232 229
233 //------------------------------------------------------------------------- 230 //-------------------------------------------------------------------------
234 231
235 'modalDialogMask': function () { 232 'modalDialogMask': function () {
236 return this.getId('modalDialogMask'); 233 return this.getId('modalDialogMask');
237 }, 234 },
238 235
239 'modalDialog': function () { 236 'modalDialog': function () {
240 return this.getId('modalDialog'); 237 return this.getId('modalDialog');
241 }, 238 },
242 239
243 'modalDialogFrame': function() { 240 'modalDialogFrame': function() {
244 return this.getId('modalDialogFrame'); 241 return this.getId('modalDialogFrame');
245 }, 242 },
246 243
247 //------------------------------------------------------------------------- 244 //-------------------------------------------------------------------------
248 245
249 'renderModalMask': function () { 246 'renderModalMask': function () {
250 Clipperz.DOM.Helper.append(MochiKit.DOM.currentDocument().body, 247 Clipperz.DOM.Helper.append(MochiKit.DOM.currentDocument().body,
251 {tag:'div', id:this.getId('modalDialogWrapper'), cls:'modalDialogWrapper simpleMessagePanelMask', children:[ 248 {tag:'div', id:this.getId('modalDialogWrapper'), cls:'modalDialogWrapper simpleMessagePanelMask', children:[
252 {tag:'div', id:this.getId('modalDialogMask'), cls:'modalDialogMask simpleMessagePanelMask'}, 249 {tag:'div', id:this.getId('modalDialogMask'), cls:'modalDialogMask simpleMessagePanelMask'},
253 {tag:'div', id:this.getId('modalDialogFrame'), cls:'modalDialogFrame simpleMessagePanelMask'}, 250 {tag:'div', id:this.getId('modalDialogFrame'), cls:'modalDialogFrame simpleMessagePanelMask'},
254 {tag:'div', id:this.getId('modalDialog'), cls:'modalDialog simpleMessagePanelMask'} 251 {tag:'div', id:this.getId('modalDialog'), cls:'modalDialog simpleMessagePanelMask'}
255 ]} 252 ]}
256 ); 253 );
257 254
258 MochiKit.Style.hideElement(this.getId('modalDialogMask')); 255 MochiKit.Style.hideElement(this.getId('modalDialogMask'));
259 MochiKit.Style.hideElement(this.getId('modalDialogFrame')); 256 MochiKit.Style.hideElement(this.getId('modalDialogFrame'));
260 }, 257 },
261 258
262 //------------------------------------------------------------------------- 259 //-------------------------------------------------------------------------
263 260
264 'keyDownHandler': function (anEvent) { 261 'keyDownHandler': function (anEvent) {
265 if (anEvent.key().string == 'KEY_ENTER') { 262 if (anEvent.key().string == 'KEY_ENTER') {
266 anEvent.preventDefault(); 263 anEvent.preventDefault();
267//console.log("13 - RETURN ?", this); 264//console.log("13 - RETURN ?", this);
268 this.closeOk(); 265 this.closeOk();
269//console.log('<<< 13') 266//console.log('<<< 13')
270 } 267 }
271 268
272 if (anEvent.key().string == 'KEY_ESCAPE') { 269 if (anEvent.key().string == 'KEY_ESCAPE') {
273 anEvent.preventDefault(); 270 anEvent.preventDefault();
274//console.log("27 - ESC ?", this); 271//console.log("27 - ESC ?", this);
275 this.closeCancel(); 272 this.closeCancel();
276//console.log("<<< 27"); 273//console.log("<<< 27");
277 } 274 }
278 }, 275 },
279 276
280 //------------------------------------------------------------------------- 277 //-------------------------------------------------------------------------
281 __syntaxFix__: "syntax fix" 278 __syntaxFix__: "syntax fix"
282}); 279});
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 afb3bf9..936514a 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Common/Components/TabPanelComponent.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Common/Components/TabPanelComponent.js
@@ -1,69 +1,66 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.PM.UI.Common.Components'); 26Clipperz.Base.module('Clipperz.PM.UI.Common.Components');
30 27
31Clipperz.PM.UI.Common.Components.TabPanelComponent = function(args) { 28Clipperz.PM.UI.Common.Components.TabPanelComponent = function(args) {
32 args = args || {}; 29 args = args || {};
33 Clipperz.PM.UI.Common.Components.TabPanelComponent.superclass.constructor.call(this, args); 30 Clipperz.PM.UI.Common.Components.TabPanelComponent.superclass.constructor.call(this, args);
34 31
35 this._tabPanelController = null; 32 this._tabPanelController = null;
36 33
37 return this; 34 return this;
38} 35}
39 36
40//============================================================================= 37//=============================================================================
41 38
42Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.TabPanelComponent, Clipperz.PM.UI.Common.Components.BaseComponent, { 39Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.TabPanelComponent, Clipperz.PM.UI.Common.Components.BaseComponent, {
43 40
44 'toString': function () { 41 'toString': function () {
45 return "Clipperz.PM.UI.Common.Components.TabPanelComponent component"; 42 return "Clipperz.PM.UI.Common.Components.TabPanelComponent component";
46 }, 43 },
47 44
48 //------------------------------------------------------------------------- 45 //-------------------------------------------------------------------------
49 46
50 'tabPanelControllerConfiguration': function() { 47 'tabPanelControllerConfiguration': function() {
51 return this._tabPanelControllerConfiguration; 48 return this._tabPanelControllerConfiguration;
52 }, 49 },
53 50
54 'tabPanelController': function() { 51 'tabPanelController': function() {
55 if (this._tabPanelController == null) { 52 if (this._tabPanelController == null) {
56 this._tabPanelController = new Clipperz.PM.UI.Common.Controllers.TabPanelController({component:this, configuration:this.tabPanelControllerConfiguration()}); 53 this._tabPanelController = new Clipperz.PM.UI.Common.Controllers.TabPanelController({component:this, configuration:this.tabPanelControllerConfiguration()});
57 } 54 }
58 55
59 return this._tabPanelController; 56 return this._tabPanelController;
60 }, 57 },
61 58
62 'initiallySelectedTab': function() { 59 'initiallySelectedTab': function() {
63 return this._initiallySelectedTab; 60 return this._initiallySelectedTab;
64 }, 61 },
65 62
66 //------------------------------------------------------------------------- 63 //-------------------------------------------------------------------------
67 __syntaxFix__: "syntax fix" 64 __syntaxFix__: "syntax fix"
68 65
69}); 66});
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 7507b86..095e8ed 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Common/Components/Tooltip.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Common/Components/Tooltip.js
@@ -1,216 +1,213 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.PM.UI.Common.Components'); 26Clipperz.Base.module('Clipperz.PM.UI.Common.Components');
30 27
31Clipperz.PM.UI.Common.Components.Tooltip = function(args) { 28Clipperz.PM.UI.Common.Components.Tooltip = function(args) {
32 args = args || {}; 29 args = args || {};
33 30
34 Clipperz.PM.UI.Common.Components.Tooltip.superclass.constructor.apply(this, arguments); 31 Clipperz.PM.UI.Common.Components.Tooltip.superclass.constructor.apply(this, arguments);
35 32
36 this._element = args.element|| Clipperz.Base.exception.raise('MandatoryParameter'); 33 this._element = args.element|| Clipperz.Base.exception.raise('MandatoryParameter');
37 this._text = args.text || Clipperz.Base.exception.raise('MandatoryParameter'); 34 this._text = args.text || Clipperz.Base.exception.raise('MandatoryParameter');
38 this._position = args.position || 'BELOW'; //'BELOW', 'ABOVE', 'LEFT', 'RIGHT' 35 this._position = args.position || 'BELOW'; //'BELOW', 'ABOVE', 'LEFT', 'RIGHT'
39 36
40 this._boxDimensions = null; 37 this._boxDimensions = null;
41 this._enabled = (typeof(args.enabled) == 'undefined' ? true : args.enabled); 38 this._enabled = (typeof(args.enabled) == 'undefined' ? true : args.enabled);
42 this._isVisible = false; 39 this._isVisible = false;
43 40
44 this.renderSelf(); 41 this.renderSelf();
45 42
46 return this; 43 return this;
47} 44}
48 45
49//============================================================================= 46//=============================================================================
50 47
51Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.Tooltip, Clipperz.PM.UI.Common.Components.BaseComponent, { 48Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.Tooltip, Clipperz.PM.UI.Common.Components.BaseComponent, {
52 49
53 //------------------------------------------------------------------------- 50 //-------------------------------------------------------------------------
54 51
55 'toString': function () { 52 'toString': function () {
56 return "Clipperz.PM.UI.Common.Components.Tooltip component"; 53 return "Clipperz.PM.UI.Common.Components.Tooltip component";
57 }, 54 },
58 55
59 //------------------------------------------------------------------------- 56 //-------------------------------------------------------------------------
60 57
61 'text': function () { 58 'text': function () {
62 return this._text; 59 return this._text;
63 }, 60 },
64 61
65 'setText': function (aValue) { 62 'setText': function (aValue) {
66 this._text = aValue; 63 this._text = aValue;
67 }, 64 },
68 65
69 //------------------------------------------------------------------------- 66 //-------------------------------------------------------------------------
70 67
71 'position': function () { 68 'position': function () {
72 return this._position; 69 return this._position;
73 }, 70 },
74 71
75 'setPosition': function (aValue) { 72 'setPosition': function (aValue) {
76 this._position = aValue; 73 this._position = aValue;
77 }, 74 },
78 75
79 //------------------------------------------------------------------------- 76 //-------------------------------------------------------------------------
80 77
81 'enabled': function () { 78 'enabled': function () {
82 return this._enabled; 79 return this._enabled;
83 }, 80 },
84 81
85 'setIsEnabled': function (aValue) { 82 'setIsEnabled': function (aValue) {
86 this._enabled = aValue; 83 this._enabled = aValue;
87 }, 84 },
88 85
89 //------------------------------------------------------------------------- 86 //-------------------------------------------------------------------------
90 87
91 'isVisible': function () { 88 'isVisible': function () {
92 return this._isVisible; 89 return this._isVisible;
93 }, 90 },
94 91
95 'setIsVisible': function (aValue) { 92 'setIsVisible': function (aValue) {
96 this._isVisible = aValue; 93 this._isVisible = aValue;
97 }, 94 },
98 95
99 //------------------------------------------------------------------------- 96 //-------------------------------------------------------------------------
100 97
101 'renderSelf': function() { 98 'renderSelf': function() {
102 // this.append(this.element(), {tag:'div', id:this.getId('tooltip'), cls:'tooltip ' + this.position(), children:[ 99 // this.append(this.element(), {tag:'div', id:this.getId('tooltip'), cls:'tooltip ' + this.position(), children:[
103 // this.append(MochiKit.DOM.currentDocument().body, {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:[
104 this.append(MochiKit.DOM.getElement('Clipperz_PM_UI_Common_Components_Tooltip_wrapperNode'), {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:[
105 {tag:'div', id:this.getId('body'), cls:'tooltip_body', children:[ 102 {tag:'div', id:this.getId('body'), cls:'tooltip_body', children:[
106 {tag:'div', cls:'tooltip_text', children:[ 103 {tag:'div', cls:'tooltip_text', children:[
107 {tag:'span', html:this.text()} 104 {tag:'span', html:this.text()}
108 ]}, 105 ]},
109 {tag:'div', id:this.getId('footer'), cls:'tooltip_footer'} 106 {tag:'div', id:this.getId('footer'), cls:'tooltip_footer'}
110 ]}, 107 ]},
111 {tag:'div', id:this.getId('arrow'), cls:'tooltip_arrow'} 108 {tag:'div', id:this.getId('arrow'), cls:'tooltip_arrow'}
112 ]}); 109 ]});
113 110
114 this._boxDimensions = MochiKit.Style.getElementDimensions(this.getId('body')); 111 this._boxDimensions = MochiKit.Style.getElementDimensions(this.getId('body'));
115 // this._boxDimensions.h += MochiKit.Style.getElementDimensions(this.getId('footer')).h; 112 // this._boxDimensions.h += MochiKit.Style.getElementDimensions(this.getId('footer')).h;
116 113
117 MochiKit.Style.hideElement(this.displayElement()); 114 MochiKit.Style.hideElement(this.displayElement());
118 MochiKit.Signal.connect(this.element(), 'onmouseenter', this, 'show'); 115 MochiKit.Signal.connect(this.element(), 'onmouseenter', this, 'show');
119 MochiKit.Signal.connect(this.element(), 'onmouseleave', this, 'hide'); 116 MochiKit.Signal.connect(this.element(), 'onmouseleave', this, 'hide');
120 }, 117 },
121 118
122 //----------------------------------------------------- 119 //-----------------------------------------------------
123 120
124 'displayElement': function() { 121 'displayElement': function() {
125 return this.getElement('tooltip'); 122 return this.getElement('tooltip');
126 }, 123 },
127 124
128 //------------------------------------------------------------------------- 125 //-------------------------------------------------------------------------
129 126
130 'boxDimensions': function () { 127 'boxDimensions': function () {
131 return this._boxDimensions; 128 return this._boxDimensions;
132 }, 129 },
133 130
134 //------------------------------------------------------------------------- 131 //-------------------------------------------------------------------------
135 132
136 'show': function () { 133 'show': function () {
137 var elementSizeAndPosition; 134 var elementSizeAndPosition;
138 var arrowPosition; 135 var arrowPosition;
139 var bodyPosition; 136 var bodyPosition;
140 137
141 if (this.isVisible() == false) { 138 if (this.isVisible() == false) {
142 arrowPosition = {}; 139 arrowPosition = {};
143 bodyPosition = {}; 140 bodyPosition = {};
144 141
145 this.setIsVisible(true); 142 this.setIsVisible(true);
146 elementSizeAndPosition = Clipperz.Style.getSizeAndPosition(this.element()); 143 elementSizeAndPosition = Clipperz.Style.getSizeAndPosition(this.element());
147//console.log("ELEMENT SIZE AND POSITION", Clipperz.Base.serializeJSON(elementSizeAndPosition)); 144//console.log("ELEMENT SIZE AND POSITION", Clipperz.Base.serializeJSON(elementSizeAndPosition));
148//console.log("BOX DIMENSIONS", Clipperz.Base.serializeJSON(this.boxDimensions())); 145//console.log("BOX DIMENSIONS", Clipperz.Base.serializeJSON(this.boxDimensions()));
149 switch (this.position()) { 146 switch (this.position()) {
150 case 'ABOVE': 147 case 'ABOVE':
151//console.log("ABOVE"); 148//console.log("ABOVE");
152 MochiKit.Style.setElementDimensions(this.getId('arrow'), {w:36, h:13}, 'px'); 149 MochiKit.Style.setElementDimensions(this.getId('arrow'), {w:36, h:13}, 'px');
153 bodyPosition.x = elementSizeAndPosition.position.x + (elementSizeAndPosition.dimensions.w/2 - this.boxDimensions().w/2); 150 bodyPosition.x = elementSizeAndPosition.position.x + (elementSizeAndPosition.dimensions.w/2 - this.boxDimensions().w/2);
154 bodyPosition.y = elementSizeAndPosition.position.y - this.boxDimensions().h - 13; 151 bodyPosition.y = elementSizeAndPosition.position.y - this.boxDimensions().h - 13;
155 152
156 arrowPosition.x = elementSizeAndPosition.position.x + (elementSizeAndPosition.dimensions.w/2 - 36/2); 153 arrowPosition.x = elementSizeAndPosition.position.x + (elementSizeAndPosition.dimensions.w/2 - 36/2);
157 arrowPosition.y = elementSizeAndPosition.position.y - 13; 154 arrowPosition.y = elementSizeAndPosition.position.y - 13;
158 break; 155 break;
159 case 'BELOW': 156 case 'BELOW':
160//console.log("BELOW"); 157//console.log("BELOW");
161 MochiKit.Style.setElementDimensions(this.getId('arrow'), {w:36, h:13}, 'px'); 158 MochiKit.Style.setElementDimensions(this.getId('arrow'), {w:36, h:13}, 'px');
162 bodyPosition.x = elementSizeAndPosition.position.x + (elementSizeAndPosition.dimensions.w/2 - this.boxDimensions().w/2); 159 bodyPosition.x = elementSizeAndPosition.position.x + (elementSizeAndPosition.dimensions.w/2 - this.boxDimensions().w/2);
163 bodyPosition.y = elementSizeAndPosition.position.y + elementSizeAndPosition.dimensions.h + 13; 160 bodyPosition.y = elementSizeAndPosition.position.y + elementSizeAndPosition.dimensions.h + 13;
164 161
165 arrowPosition.x = elementSizeAndPosition.position.x + (elementSizeAndPosition.dimensions.w/2 - 36/2); 162 arrowPosition.x = elementSizeAndPosition.position.x + (elementSizeAndPosition.dimensions.w/2 - 36/2);
166 arrowPosition.y = elementSizeAndPosition.position.y + elementSizeAndPosition.dimensions.h; 163 arrowPosition.y = elementSizeAndPosition.position.y + elementSizeAndPosition.dimensions.h;
167 break; 164 break;
168 case 'LEFT': 165 case 'LEFT':
169//console.log("LEFT"); 166//console.log("LEFT");
170 MochiKit.Style.setElementDimensions(this.getId('arrow'), {w:13, h:36}, 'px'); 167 MochiKit.Style.setElementDimensions(this.getId('arrow'), {w:13, h:36}, 'px');
171 bodyPosition.x = elementSizeAndPosition.position.x - this.boxDimensions().w - 13; 168 bodyPosition.x = elementSizeAndPosition.position.x - this.boxDimensions().w - 13;
172 bodyPosition.y = elementSizeAndPosition.position.y + (elementSizeAndPosition.dimensions.h/2 - this.boxDimensions().h/2); 169 bodyPosition.y = elementSizeAndPosition.position.y + (elementSizeAndPosition.dimensions.h/2 - this.boxDimensions().h/2);
173 170
174 arrowPosition.x = elementSizeAndPosition.position.x -13; 171 arrowPosition.x = elementSizeAndPosition.position.x -13;
175 arrowPosition.y = elementSizeAndPosition.position.y + (elementSizeAndPosition.dimensions.h/2 - 36/2); 172 arrowPosition.y = elementSizeAndPosition.position.y + (elementSizeAndPosition.dimensions.h/2 - 36/2);
176 break; 173 break;
177 case 'RIGHT': 174 case 'RIGHT':
178//console.log("RIGHT"); 175//console.log("RIGHT");
179 MochiKit.Style.setElementDimensions(this.getId('arrow'), {w:13, h:36}, 'px'); 176 MochiKit.Style.setElementDimensions(this.getId('arrow'), {w:13, h:36}, 'px');
180 bodyPosition.x = elementSizeAndPosition.position.x + elementSizeAndPosition.dimensions.w + 13; 177 bodyPosition.x = elementSizeAndPosition.position.x + elementSizeAndPosition.dimensions.w + 13;
181 bodyPosition.y = elementSizeAndPosition.position.y + (elementSizeAndPosition.dimensions.h/2 - this.boxDimensions().h/2); 178 bodyPosition.y = elementSizeAndPosition.position.y + (elementSizeAndPosition.dimensions.h/2 - this.boxDimensions().h/2);
182 179
183 arrowPosition.x = elementSizeAndPosition.position.x + elementSizeAndPosition.dimensions.w; 180 arrowPosition.x = elementSizeAndPosition.position.x + elementSizeAndPosition.dimensions.w;
184 arrowPosition.y = elementSizeAndPosition.position.y + (elementSizeAndPosition.dimensions.h/2 - 36/2); 181 arrowPosition.y = elementSizeAndPosition.position.y + (elementSizeAndPosition.dimensions.h/2 - 36/2);
185 break; 182 break;
186 } 183 }
187//console.log("X: " + bodyPosition.x + ", Y: " + bodyPosition.y); 184//console.log("X: " + bodyPosition.x + ", Y: " + bodyPosition.y);
188 185
189 MochiKit.Style.setElementPosition(this.getId('body'), bodyPosition); 186 MochiKit.Style.setElementPosition(this.getId('body'), bodyPosition);
190 MochiKit.Style.setElementPosition(this.getId('arrow'), arrowPosition); 187 MochiKit.Style.setElementPosition(this.getId('arrow'), arrowPosition);
191 MochiKit.Visual.appear(this.displayElement(), {duration:0.4}); 188 MochiKit.Visual.appear(this.displayElement(), {duration:0.4});
192 } 189 }
193 }, 190 },
194 191
195 'hide': function () { 192 'hide': function () {
196 if (this.isVisible() == true) { 193 if (this.isVisible() == true) {
197 MochiKit.Visual.fade(this.displayElement(), {duration:0.4}); 194 MochiKit.Visual.fade(this.displayElement(), {duration:0.4});
198 this.setIsVisible(false); 195 this.setIsVisible(false);
199 } 196 }
200 }, 197 },
201 198
202 //------------------------------------------------------------------------- 199 //-------------------------------------------------------------------------
203/* 200/*
204 'shouldRemoveElementWhenClearningUp': function () { 201 'shouldRemoveElementWhenClearningUp': function () {
205 return false; 202 return false;
206 }, 203 },
207*/ 204*/
208 //------------------------------------------------------------------------- 205 //-------------------------------------------------------------------------
209 __syntaxFix__: "syntax fix" 206 __syntaxFix__: "syntax fix"
210}); 207});
211 208
212Clipperz.PM.UI.Common.Components.Tooltip.initTooltips = function () { 209Clipperz.PM.UI.Common.Components.Tooltip.initTooltips = function () {
213 Clipperz.DOM.Helper.insertBefore(MochiKit.DOM.currentDocument().body.childNodes[0], {tag:'div', id:'Clipperz_PM_UI_Common_Components_Tooltip_wrapperNode'}); 210 Clipperz.DOM.Helper.insertBefore(MochiKit.DOM.currentDocument().body.childNodes[0], {tag:'div', id:'Clipperz_PM_UI_Common_Components_Tooltip_wrapperNode'});
214} 211}
215 212
216MochiKit.DOM.addLoadEvent(Clipperz.PM.UI.Common.Components.Tooltip.initTooltips); 213MochiKit.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 c31969e..c41fc7c 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Common/Components/TranslatorWidget.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Common/Components/TranslatorWidget.js
@@ -1,170 +1,167 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.PM.UI.Common.Components'); 26Clipperz.Base.module('Clipperz.PM.UI.Common.Components');
30 27
31Clipperz.PM.UI.Common.Components.TranslatorWidget = function(args) { 28Clipperz.PM.UI.Common.Components.TranslatorWidget = function(args) {
32Clipperz.log(">>> TranslatorWidget.new"); 29Clipperz.log(">>> TranslatorWidget.new");
33 args = args || {}; 30 args = args || {};
34 31
35 Clipperz.PM.UI.Common.Components.TranslatorWidget.superclass.constructor.apply(this, arguments); 32 Clipperz.PM.UI.Common.Components.TranslatorWidget.superclass.constructor.apply(this, arguments);
36 33
37 // this._element = args.element|| Clipperz.Base.exception.raise('MandatoryParameter'); 34 // this._element = args.element|| Clipperz.Base.exception.raise('MandatoryParameter');
38 // this._stringID = args.stringID || MochiKit.DOM.getNodeAttribute(this.element(), 'stringID')|| Clipperz.Base.exception.raise('MandatoryParameter'); 35 // this._stringID = args.stringID || MochiKit.DOM.getNodeAttribute(this.element(), 'stringID')|| Clipperz.Base.exception.raise('MandatoryParameter');
39 36
40 //MochiKit.Signal.connect(this.element(), 'onmouseenter', this, 'show'); 37 //MochiKit.Signal.connect(this.element(), 'onmouseenter', this, 'show');
41 //MochiKit.Signal.connect(this.element(), 'onmouseleave', this, 'hide'); 38 //MochiKit.Signal.connect(this.element(), 'onmouseleave', this, 'hide');
42 39
43Clipperz.log("<<< TranslatorWidget.new"); 40Clipperz.log("<<< TranslatorWidget.new");
44 return this; 41 return this;
45} 42}
46 43
47//============================================================================= 44//=============================================================================
48 45
49Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.TranslatorWidget, Clipperz.PM.UI.Common.Components.BaseComponent, { 46Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.TranslatorWidget, Clipperz.PM.UI.Common.Components.BaseComponent, {
50 47
51 //------------------------------------------------------------------------- 48 //-------------------------------------------------------------------------
52 49
53 'toString': function () { 50 'toString': function () {
54 return "Clipperz.PM.UI.Common.Components.TranslatorWidget component"; 51 return "Clipperz.PM.UI.Common.Components.TranslatorWidget component";
55 }, 52 },
56 53
57 //------------------------------------------------------------------------- 54 //-------------------------------------------------------------------------
58/* 55/*
59 'renderSelf': function() { 56 'renderSelf': function() {
60 this.append(this.element(), {tag:'div', id:this.getId('tooltip'), cls:'tooltip ' + this.position(), children:[ 57 this.append(this.element(), {tag:'div', id:this.getId('tooltip'), cls:'tooltip ' + this.position(), children:[
61 {tag:'div', id:this.getId('body'), cls:'tooltip_body', children:[ 58 {tag:'div', id:this.getId('body'), cls:'tooltip_body', children:[
62 {tag:'div', cls:'tooltip_text', children:[ 59 {tag:'div', cls:'tooltip_text', children:[
63 {tag:'span', html:this.text()} 60 {tag:'span', html:this.text()}
64 ]}, 61 ]},
65 {tag:'div', id:this.getId('footer'), cls:'tooltip_footer'} 62 {tag:'div', id:this.getId('footer'), cls:'tooltip_footer'}
66 ]}, 63 ]},
67 {tag:'div', id:this.getId('arrow'), cls:'tooltip_arrow'} 64 {tag:'div', id:this.getId('arrow'), cls:'tooltip_arrow'}
68 ]}); 65 ]});
69 66
70 this._boxDimensions = MochiKit.Style.getElementDimensions(this.getId('body')); 67 this._boxDimensions = MochiKit.Style.getElementDimensions(this.getId('body'));
71 // this._boxDimensions.h += MochiKit.Style.getElementDimensions(this.getId('footer')).h; 68 // this._boxDimensions.h += MochiKit.Style.getElementDimensions(this.getId('footer')).h;
72 69
73 MochiKit.Style.hideElement(this.displayElement()); 70 MochiKit.Style.hideElement(this.displayElement());
74 MochiKit.Signal.connect(this.element(), 'onmouseenter', this, 'show'); 71 MochiKit.Signal.connect(this.element(), 'onmouseenter', this, 'show');
75 MochiKit.Signal.connect(this.element(), 'onmouseleave', this, 'hide'); 72 MochiKit.Signal.connect(this.element(), 'onmouseleave', this, 'hide');
76 }, 73 },
77*/ 74*/
78 //----------------------------------------------------- 75 //-----------------------------------------------------
79/* 76/*
80 'displayElement': function() { 77 'displayElement': function() {
81 return this.getElement('tooltip'); 78 return this.getElement('tooltip');
82 }, 79 },
83*/ 80*/
84 //------------------------------------------------------------------------- 81 //-------------------------------------------------------------------------
85/* 82/*
86 'boxDimensions': function () { 83 'boxDimensions': function () {
87 return this._boxDimensions; 84 return this._boxDimensions;
88 }, 85 },
89*/ 86*/
90 //------------------------------------------------------------------------- 87 //-------------------------------------------------------------------------
91 88
92 'show': function (anElement, aStringID) { 89 'show': function (anElement, aStringID) {
93 Clipperz.log(">>> Clipperz.PM.UI.Common.Components.TranslatorWidget.show: " + aStringID); 90 Clipperz.log(">>> Clipperz.PM.UI.Common.Components.TranslatorWidget.show: " + aStringID);
94/* 91/*
95 var elementSizeAndPosition; 92 var elementSizeAndPosition;
96 var arrowPosition; 93 var arrowPosition;
97 var bodyPosition; 94 var bodyPosition;
98 95
99 arrowPosition = {}; 96 arrowPosition = {};
100 bodyPosition = {}; 97 bodyPosition = {};
101 98
102 elementSizeAndPosition = Clipperz.Style.getSizeAndPosition(this.element()); 99 elementSizeAndPosition = Clipperz.Style.getSizeAndPosition(this.element());
103 switch (this.position()) { 100 switch (this.position()) {
104 case 'ABOVE': 101 case 'ABOVE':
105 MochiKit.Style.setElementDimensions(this.getId('arrow'), {w:36, h:13}, 'px'); 102 MochiKit.Style.setElementDimensions(this.getId('arrow'), {w:36, h:13}, 'px');
106 bodyPosition.x = elementSizeAndPosition.position.x + (elementSizeAndPosition.dimensions.w/2 - this.boxDimensions().w/2); 103 bodyPosition.x = elementSizeAndPosition.position.x + (elementSizeAndPosition.dimensions.w/2 - this.boxDimensions().w/2);
107 bodyPosition.y = elementSizeAndPosition.position.y - this.boxDimensions().h - 13; 104 bodyPosition.y = elementSizeAndPosition.position.y - this.boxDimensions().h - 13;
108 105
109 arrowPosition.x = elementSizeAndPosition.position.x + (elementSizeAndPosition.dimensions.w/2 - 36/2); 106 arrowPosition.x = elementSizeAndPosition.position.x + (elementSizeAndPosition.dimensions.w/2 - 36/2);
110 arrowPosition.y = elementSizeAndPosition.position.y - 13; 107 arrowPosition.y = elementSizeAndPosition.position.y - 13;
111 break; 108 break;
112 case 'BELOW': 109 case 'BELOW':
113 MochiKit.Style.setElementDimensions(this.getId('arrow'), {w:36, h:13}, 'px'); 110 MochiKit.Style.setElementDimensions(this.getId('arrow'), {w:36, h:13}, 'px');
114 bodyPosition.x = elementSizeAndPosition.position.x + (elementSizeAndPosition.dimensions.w/2 - this.boxDimensions().w/2); 111 bodyPosition.x = elementSizeAndPosition.position.x + (elementSizeAndPosition.dimensions.w/2 - this.boxDimensions().w/2);
115 bodyPosition.y = elementSizeAndPosition.position.y + elementSizeAndPosition.dimensions.h + 13; 112 bodyPosition.y = elementSizeAndPosition.position.y + elementSizeAndPosition.dimensions.h + 13;
116 113
117 arrowPosition.x = elementSizeAndPosition.position.x + (elementSizeAndPosition.dimensions.w/2 - 36/2); 114 arrowPosition.x = elementSizeAndPosition.position.x + (elementSizeAndPosition.dimensions.w/2 - 36/2);
118 arrowPosition.y = elementSizeAndPosition.position.y + elementSizeAndPosition.dimensions.h; 115 arrowPosition.y = elementSizeAndPosition.position.y + elementSizeAndPosition.dimensions.h;
119 break; 116 break;
120 case 'LEFT': 117 case 'LEFT':
121 MochiKit.Style.setElementDimensions(this.getId('arrow'), {w:13, h:36}, 'px'); 118 MochiKit.Style.setElementDimensions(this.getId('arrow'), {w:13, h:36}, 'px');
122 bodyPosition.x = elementSizeAndPosition.position.x - this.boxDimensions().w - 13; 119 bodyPosition.x = elementSizeAndPosition.position.x - this.boxDimensions().w - 13;
123 bodyPosition.y = elementSizeAndPosition.position.y + (elementSizeAndPosition.dimensions.h/2 - this.boxDimensions().h/2); 120 bodyPosition.y = elementSizeAndPosition.position.y + (elementSizeAndPosition.dimensions.h/2 - this.boxDimensions().h/2);
124 121
125 arrowPosition.x = elementSizeAndPosition.position.x -13; 122 arrowPosition.x = elementSizeAndPosition.position.x -13;
126 arrowPosition.y = elementSizeAndPosition.position.y + (elementSizeAndPosition.dimensions.h/2 - 36/2); 123 arrowPosition.y = elementSizeAndPosition.position.y + (elementSizeAndPosition.dimensions.h/2 - 36/2);
127 break; 124 break;
128 case 'RIGHT': 125 case 'RIGHT':
129 MochiKit.Style.setElementDimensions(this.getId('arrow'), {w:13, h:36}, 'px'); 126 MochiKit.Style.setElementDimensions(this.getId('arrow'), {w:13, h:36}, 'px');
130 break; 127 break;
131 } 128 }
132 129
133 // MochiKit.Style.setElementPosition(this.getId('body'), bodyPosition); 130 // MochiKit.Style.setElementPosition(this.getId('body'), bodyPosition);
134 MochiKit.Style.setElementPosition(this.getId('body'), bodyPosition); 131 MochiKit.Style.setElementPosition(this.getId('body'), bodyPosition);
135 MochiKit.Style.setElementPosition(this.getId('arrow'), arrowPosition); 132 MochiKit.Style.setElementPosition(this.getId('arrow'), arrowPosition);
136 MochiKit.Visual.appear(this.displayElement(), {duration:0.4}); 133 MochiKit.Visual.appear(this.displayElement(), {duration:0.4});
137*/ 134*/
138 }, 135 },
139 136
140 //------------------------------------------------------------------------- 137 //-------------------------------------------------------------------------
141 138
142 'hide': function () { 139 'hide': function () {
143 Clipperz.log("<<< Clipperz.PM.UI.Common.Components.TranslatorWidget.hide"); 140 Clipperz.log("<<< Clipperz.PM.UI.Common.Components.TranslatorWidget.hide");
144 // MochiKit.Visual.fade(this.displayElement(), {duration:0.4}); 141 // MochiKit.Visual.fade(this.displayElement(), {duration:0.4});
145 }, 142 },
146 143
147 //------------------------------------------------------------------------- 144 //-------------------------------------------------------------------------
148 __syntaxFix__: "syntax fix" 145 __syntaxFix__: "syntax fix"
149}); 146});
150 147
151//############################################################################# 148//#############################################################################
152 149
153Clipperz.PM.UI.Common.Components.TranslatorWidget._widget = null; 150Clipperz.PM.UI.Common.Components.TranslatorWidget._widget = null;
154 151
155Clipperz.PM.UI.Common.Components.TranslatorWidget.widget = function () { 152Clipperz.PM.UI.Common.Components.TranslatorWidget.widget = function () {
156 if (Clipperz.PM.UI.Common.Components.TranslatorWidget._widget == null) { 153 if (Clipperz.PM.UI.Common.Components.TranslatorWidget._widget == null) {
157 Clipperz.PM.UI.Common.Components.TranslatorWidget._widget = new Clipperz.PM.UI.Common.Components.TranslatorWidget(); 154 Clipperz.PM.UI.Common.Components.TranslatorWidget._widget = new Clipperz.PM.UI.Common.Components.TranslatorWidget();
158 } 155 }
159 156
160 return Clipperz.PM.UI.Common.Components.TranslatorWidget._widget; 157 return Clipperz.PM.UI.Common.Components.TranslatorWidget._widget;
161} 158}
162Clipperz.PM.UI.Common.Components.TranslatorWidget.show = function (anElement, aStringID) { 159Clipperz.PM.UI.Common.Components.TranslatorWidget.show = function (anElement, aStringID) {
163 Clipperz.PM.UI.Common.Components.TranslatorWidget.widget().show(anElement, aStringID); 160 Clipperz.PM.UI.Common.Components.TranslatorWidget.widget().show(anElement, aStringID);
164} 161}
165 162
166Clipperz.PM.UI.Common.Components.TranslatorWidget.hide = function () { 163Clipperz.PM.UI.Common.Components.TranslatorWidget.hide = function () {
167 Clipperz.PM.UI.Common.Components.TranslatorWidget.widget().hide(); 164 Clipperz.PM.UI.Common.Components.TranslatorWidget.widget().hide();
168} 165}
169 166
170//############################################################################# 167//#############################################################################
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 e534435..5fd10f9 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Common/Controllers/DirectLoginRunner.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Common/Controllers/DirectLoginRunner.js
@@ -1,267 +1,264 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.PM.UI.Common.Controllers'); 26Clipperz.Base.module('Clipperz.PM.UI.Common.Controllers');
30 27
31Clipperz.PM.UI.Common.Controllers.DirectLoginRunner = function(args) { 28Clipperz.PM.UI.Common.Controllers.DirectLoginRunner = function(args) {
32 this._directLogin = args['directLogin'] || Clipperz.Base.exception.raise('MandatoryParameter'); 29 this._directLogin = args['directLogin'] || Clipperz.Base.exception.raise('MandatoryParameter');
33 this._target = Clipperz.PM.Crypto.randomKey(); 30 this._target = Clipperz.PM.Crypto.randomKey();
34 31
35 return this; 32 return this;
36} 33}
37 34
38MochiKit.Base.update(Clipperz.PM.UI.Common.Controllers.DirectLoginRunner.prototype, { 35MochiKit.Base.update(Clipperz.PM.UI.Common.Controllers.DirectLoginRunner.prototype, {
39 36
40 'toString': function() { 37 'toString': function() {
41 return "Clipperz.PM.UI.Common.Controllers.DirectLoginRunner"; 38 return "Clipperz.PM.UI.Common.Controllers.DirectLoginRunner";
42 }, 39 },
43 40
44 //----------------------------------------------------------------------------- 41 //-----------------------------------------------------------------------------
45 42
46 'directLogin': function () { 43 'directLogin': function () {
47 return this._directLogin; 44 return this._directLogin;
48 }, 45 },
49 46
50 //----------------------------------------------------------------------------- 47 //-----------------------------------------------------------------------------
51 48
52 'target': function () { 49 'target': function () {
53 return this._target; 50 return this._target;
54 }, 51 },
55 52
56 //============================================================================= 53 //=============================================================================
57 54
58 'setWindowTitle': function (aWindow, aTitle) { 55 'setWindowTitle': function (aWindow, aTitle) {
59 aWindow.document.title = aTitle; 56 aWindow.document.title = aTitle;
60 }, 57 },
61 58
62 'setWindowBody': function (aWindow, anHTML) { 59 'setWindowBody': function (aWindow, anHTML) {
63 aWindow.document.body.innerHTML = anHTML; 60 aWindow.document.body.innerHTML = anHTML;
64 }, 61 },
65 62
66 //============================================================================= 63 //=============================================================================
67 64
68 'initialWindowSetup': function (aWindow) { 65 'initialWindowSetup': function (aWindow) {
69 this.setWindowTitle(aWindow, "Loading Clipperz Direct Login"); 66 this.setWindowTitle(aWindow, "Loading Clipperz Direct Login");
70 this.setWindowBody (aWindow, MochiKit.DOM.toHTML(MochiKit.DOM.H3("Loading Clipperz Direct Login ..."))); 67 this.setWindowBody (aWindow, MochiKit.DOM.toHTML(MochiKit.DOM.H3("Loading Clipperz Direct Login ...")));
71 }, 68 },
72 69
73 //----------------------------------------------------------------------------- 70 //-----------------------------------------------------------------------------
74 71
75 'updateWindowWithDirectLoginLabel': function (aWindow, aLabel) { 72 'updateWindowWithDirectLoginLabel': function (aWindow, aLabel) {
76 var titleText; 73 var titleText;
77 var bodyText; 74 var bodyText;
78 75
79 titleText = "Loading '__label__' Direct Login".replace(/__label__/, aLabel) 76 titleText = "Loading '__label__' Direct Login".replace(/__label__/, aLabel)
80 bodyText = "Loading '__label__' Direct Login... ".replace(/__label__/, aLabel) 77 bodyText = "Loading '__label__' Direct Login... ".replace(/__label__/, aLabel)
81 78
82 this.setWindowTitle(aWindow, titleText); 79 this.setWindowTitle(aWindow, titleText);
83 this.setWindowBody (aWindow, MochiKit.DOM.toHTML(MochiKit.DOM.H3(bodyText))); 80 this.setWindowBody (aWindow, MochiKit.DOM.toHTML(MochiKit.DOM.H3(bodyText)));
84 }, 81 },
85 82
86 //----------------------------------------------------------------------------- 83 //-----------------------------------------------------------------------------
87 84
88 'updateWindowWithHTMLContent': function (aWindow, anHtml) { 85 'updateWindowWithHTMLContent': function (aWindow, anHtml) {
89 this.setWindowBody(aWindow, anHtml); 86 this.setWindowBody(aWindow, anHtml);
90 }, 87 },
91 88
92 //============================================================================= 89 //=============================================================================
93 90
94 'submitLoginForm': function(aWindow, aSubmitFunction) { 91 'submitLoginForm': function(aWindow, aSubmitFunction) {
95 MochiKit.DOM.withWindow(aWindow, MochiKit.Base.bind(function () { 92 MochiKit.DOM.withWindow(aWindow, MochiKit.Base.bind(function () {
96 var formElement; 93 var formElement;
97 var submitButtons; 94 var submitButtons;
98 95
99 formElement = MochiKit.DOM.getElement('directLoginForm'); 96 formElement = MochiKit.DOM.getElement('directLoginForm');
100 97
101 submitButtons = MochiKit.Base.filter(function(anInputElement) { 98 submitButtons = MochiKit.Base.filter(function(anInputElement) {
102 return ((anInputElement.tagName.toLowerCase() == 'input') && (anInputElement.getAttribute('type').toLowerCase() == 'submit')); 99 return ((anInputElement.tagName.toLowerCase() == 'input') && (anInputElement.getAttribute('type').toLowerCase() == 'submit'));
103 }, formElement.elements); 100 }, formElement.elements);
104 101
105 if (submitButtons.length == 0) { 102 if (submitButtons.length == 0) {
106 if (typeof(formElement.submit) == 'function') { 103 if (typeof(formElement.submit) == 'function') {
107 formElement.submit(); 104 formElement.submit();
108 } else { 105 } else {
109 aSubmitFunction.apply(formElement); 106 aSubmitFunction.apply(formElement);
110 } 107 }
111/* 108/*
112 varformSubmitFunction; 109 varformSubmitFunction;
113 110
114 formSubmitFunction = MochiKit.Base.method(formElement, 'submit'); 111 formSubmitFunction = MochiKit.Base.method(formElement, 'submit');
115 if (Clipperz_IEisBroken == true) { 112 if (Clipperz_IEisBroken == true) {
116 formElement.submit(); 113 formElement.submit();
117 } else { 114 } else {
118 formSubmitFunction(); 115 formSubmitFunction();
119 } 116 }
120*/ 117*/
121 } else { 118 } else {
122 submitButtons[0].click(); 119 submitButtons[0].click();
123 } 120 }
124 }, this)); 121 }, this));
125 }, 122 },
126 123
127 //------------------------------------------------------------------------- 124 //-------------------------------------------------------------------------
128 125
129 'runSubmitFormDirectLogin': function (aWindow, someAttributes) { 126 'runSubmitFormDirectLogin': function (aWindow, someAttributes) {
130 var html; 127 var html;
131 var formElement; 128 var formElement;
132 var submitFunction; 129 var submitFunction;
133 130
134 formElement = MochiKit.DOM.FORM({ 131 formElement = MochiKit.DOM.FORM({
135 'id':'directLoginForm', 132 'id':'directLoginForm',
136 'method':someAttributes['formAttributes']['method'], 133 'method':someAttributes['formAttributes']['method'],
137 'action':someAttributes['formAttributes']['action'] 134 'action':someAttributes['formAttributes']['action']
138 }); 135 });
139 136
140 submitFunction = formElement.submit; 137 submitFunction = formElement.submit;
141 138
142 MochiKit.DOM.appendChildNodes(formElement, MochiKit.Base.map(function (anInputAttributes) { 139 MochiKit.DOM.appendChildNodes(formElement, MochiKit.Base.map(function (anInputAttributes) {
143 return MochiKit.DOM.INPUT({'type':'hidden', 'name':anInputAttributes[0], 'value':anInputAttributes[1]}); 140 return MochiKit.DOM.INPUT({'type':'hidden', 'name':anInputAttributes[0], 'value':anInputAttributes[1]});
144 }, MochiKit.Base.items(someAttributes['inputValues']))); 141 }, MochiKit.Base.items(someAttributes['inputValues'])));
145 142
146 html =''; 143 html ='';
147 html += '<h3>Loading ' + someAttributes['label'] + ' ...</h3>'; 144 html += '<h3>Loading ' + someAttributes['label'] + ' ...</h3>';
148 html +=MochiKit.DOM.appendChildNodes(MochiKit.DOM.DIV(), MochiKit.DOM.appendChildNodes(MochiKit.DOM.DIV({style:'display:none; visibility:hidden;'}), formElement)).innerHTML; 145 html +=MochiKit.DOM.appendChildNodes(MochiKit.DOM.DIV(), MochiKit.DOM.appendChildNodes(MochiKit.DOM.DIV({style:'display:none; visibility:hidden;'}), formElement)).innerHTML;
149 146
150 this.updateWindowWithHTMLContent(aWindow, html); 147 this.updateWindowWithHTMLContent(aWindow, html);
151 this.submitLoginForm(aWindow, submitFunction); 148 this.submitLoginForm(aWindow, submitFunction);
152 }, 149 },
153 150
154 //------------------------------------------------------------------------- 151 //-------------------------------------------------------------------------
155 152
156 'runHttpAuthDirectLogin': function(aWindow, someAttributes) { 153 'runHttpAuthDirectLogin': function(aWindow, someAttributes) {
157 var completeUrl; 154 var completeUrl;
158 var url; 155 var url;
159 156
160//console.log("runHttpAuthDirectLogin", someAttributes); 157//console.log("runHttpAuthDirectLogin", someAttributes);
161 url = someAttributes['inputValues']['url']; 158 url = someAttributes['inputValues']['url'];
162 159
163 if (/^https?\:\/\//.test(url) == false) { 160 if (/^https?\:\/\//.test(url) == false) {
164 url = 'http://' + url; 161 url = 'http://' + url;
165 } 162 }
166 163
167 if (Clipperz_IEisBroken === true) { 164 if (Clipperz_IEisBroken === true) {
168 completeUrl = url; 165 completeUrl = url;
169 } else { 166 } else {
170 var username; 167 var username;
171 var password; 168 var password;
172 169
173 username = someAttributes['inputValues']['username']; 170 username = someAttributes['inputValues']['username'];
174 password = someAttributes['inputValues']['password']; 171 password = someAttributes['inputValues']['password'];
175 /(^https?\:\/\/)?(.*)/.test(url); 172 /(^https?\:\/\/)?(.*)/.test(url);
176 173
177 completeUrl = RegExp.$1 + username + ':' + password + '@' + RegExp.$2; 174 completeUrl = RegExp.$1 + username + ':' + password + '@' + RegExp.$2;
178 } 175 }
179 176
180 window.open(completeUrl, this.target()); 177 window.open(completeUrl, this.target());
181 }, 178 },
182 179
183 //============================================================================= 180 //=============================================================================
184 181
185 'runDirectLogin': function (aWindow) { 182 'runDirectLogin': function (aWindow) {
186 var deferredResult; 183 var deferredResult;
187 184
188//console.log(">>> runDirectLogin"); 185//console.log(">>> runDirectLogin");
189 deferredResult = new Clipperz.Async.Deferred("DirectLoginRunner.openDirectLogin", {trace:false}); 186 deferredResult = new Clipperz.Async.Deferred("DirectLoginRunner.openDirectLogin", {trace:false});
190 deferredResult.addMethod(this, 'initialWindowSetup', aWindow); 187 deferredResult.addMethod(this, 'initialWindowSetup', aWindow);
191 deferredResult.addMethod(this.directLogin(), 'label'); 188 deferredResult.addMethod(this.directLogin(), 'label');
192 deferredResult.addMethod(this, 'updateWindowWithDirectLoginLabel', aWindow); 189 deferredResult.addMethod(this, 'updateWindowWithDirectLoginLabel', aWindow);
193 deferredResult.collectResults({ 190 deferredResult.collectResults({
194 'type': MochiKit.Base.method(this.directLogin(), 'type'), 191 'type': MochiKit.Base.method(this.directLogin(), 'type'),
195 'label': MochiKit.Base.method(this.directLogin(), 'label'), 192 'label': MochiKit.Base.method(this.directLogin(), 'label'),
196 'formAttributes':MochiKit.Base.method(this.directLogin(), 'formAttributes'), 193 'formAttributes':MochiKit.Base.method(this.directLogin(), 'formAttributes'),
197 'inputValues': MochiKit.Base.method(this.directLogin(), 'inputValues') 194 'inputValues': MochiKit.Base.method(this.directLogin(), 'inputValues')
198 }); 195 });
199//deferredResult.addCallback(function (aValue) { console.log("SOME ATTRIBUTES", aValue); return aValue; }); 196//deferredResult.addCallback(function (aValue) { console.log("SOME ATTRIBUTES", aValue); return aValue; });
200 deferredResult.addCallback(MochiKit.Base.bind(function (someAttributes) { 197 deferredResult.addCallback(MochiKit.Base.bind(function (someAttributes) {
201//console.log("SOME ATTRIBUTES", someAttributes); 198//console.log("SOME ATTRIBUTES", someAttributes);
202 switch (someAttributes['type']) { 199 switch (someAttributes['type']) {
203 case 'http_auth': 200 case 'http_auth':
204 this.runHttpAuthDirectLogin(aWindow, someAttributes); 201 this.runHttpAuthDirectLogin(aWindow, someAttributes);
205 break; 202 break;
206 case 'simple_url': 203 case 'simple_url':
207 this.runSimpleUrlDirectLogin(aWindow, someAttributes); 204 this.runSimpleUrlDirectLogin(aWindow, someAttributes);
208 break; 205 break;
209 default: 206 default:
210 this.runSubmitFormDirectLogin(aWindow, someAttributes); 207 this.runSubmitFormDirectLogin(aWindow, someAttributes);
211 break; 208 break;
212 } 209 }
213 }, this)); 210 }, this));
214 deferredResult.callback(); 211 deferredResult.callback();
215//console.log("<<< runDirectLogin"); 212//console.log("<<< runDirectLogin");
216 213
217 return deferredResult; 214 return deferredResult;
218 }, 215 },
219 216
220 //============================================================================= 217 //=============================================================================
221 218
222 'run': function () { 219 'run': function () {
223 var newWindow; 220 var newWindow;
224 221
225 newWindow = window.open(Clipperz.PM.Strings.getValue('directLoginJumpPageUrl'), this.target()); 222 newWindow = window.open(Clipperz.PM.Strings.getValue('directLoginJumpPageUrl'), this.target());
226 223
227 return this.runDirectLogin(newWindow); 224 return this.runDirectLogin(newWindow);
228 }, 225 },
229 226
230 //============================================================================= 227 //=============================================================================
231 228
232 'test': function () { 229 'test': function () {
233 var iFrame; 230 var iFrame;
234 var newWindow; 231 var newWindow;
235 232
236 iFrame = MochiKit.DOM.createDOM('iframe'); 233 iFrame = MochiKit.DOM.createDOM('iframe');
237 MochiKit.DOM.appendChildNodes(MochiKit.DOM.currentDocument().body, iFrame); 234 MochiKit.DOM.appendChildNodes(MochiKit.DOM.currentDocument().body, iFrame);
238 235
239 newWindow = iFrame.contentWindow; 236 newWindow = iFrame.contentWindow;
240 237
241 return this.runDirectLogin(newWindow); 238 return this.runDirectLogin(newWindow);
242 }, 239 },
243 240
244 //============================================================================= 241 //=============================================================================
245 __syntaxFix__: "syntax fix" 242 __syntaxFix__: "syntax fix"
246}); 243});
247 244
248//----------------------------------------------------------------------------- 245//-----------------------------------------------------------------------------
249 246
250Clipperz.PM.UI.Common.Controllers.DirectLoginRunner.openDirectLogin = function (aDirectLogin) { 247Clipperz.PM.UI.Common.Controllers.DirectLoginRunner.openDirectLogin = function (aDirectLogin) {
251 varrunner; 248 varrunner;
252 249
253 runner = new Clipperz.PM.UI.Common.Controllers.DirectLoginRunner({directLogin:aDirectLogin}); 250 runner = new Clipperz.PM.UI.Common.Controllers.DirectLoginRunner({directLogin:aDirectLogin});
254 return runner.run(); 251 return runner.run();
255}; 252};
256 253
257//----------------------------------------------------------------------------- 254//-----------------------------------------------------------------------------
258 255
259Clipperz.PM.UI.Common.Controllers.DirectLoginRunner.testDirectLogin = function (aDirectLogin) { 256Clipperz.PM.UI.Common.Controllers.DirectLoginRunner.testDirectLogin = function (aDirectLogin) {
260 varrunner; 257 varrunner;
261 258
262//console.log(">>>>>> TESTING DIRECT LOGIN"); 259//console.log(">>>>>> TESTING DIRECT LOGIN");
263 runner = new Clipperz.PM.UI.Common.Controllers.DirectLoginRunner({directLogin:aDirectLogin}); 260 runner = new Clipperz.PM.UI.Common.Controllers.DirectLoginRunner({directLogin:aDirectLogin});
264 return runner.test(); 261 return runner.test();
265}; 262};
266 263
267//----------------------------------------------------------------------------- 264//-----------------------------------------------------------------------------
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 a4fa400..41fe17f 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Common/Controllers/ProgressBarController.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Common/Controllers/ProgressBarController.js
@@ -1,143 +1,140 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.PM.UI.Common.Controllers'); 26Clipperz.Base.module('Clipperz.PM.UI.Common.Controllers');
30 27
31Clipperz.PM.UI.Common.Controllers.ProgressBarController = function(args) { 28Clipperz.PM.UI.Common.Controllers.ProgressBarController = function(args) {
32 args = args || {}; 29 args = args || {};
33 30
34 this._numberOfSteps= 0; 31 this._numberOfSteps= 0;
35 this._currentStep= 0; 32 this._currentStep= 0;
36 33
37 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'initProgress', this, 'initProgressHandle'); 34 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'initProgress', this, 'initProgressHandle');
38 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'updateProgress',this, 'updateProgressHandle'); 35 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'updateProgress',this, 'updateProgressHandle');
39 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'advanceProgress',this, 'advanceProgressHandle'); 36 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'advanceProgress',this, 'advanceProgressHandle');
40 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'progressDone', this, 'progressDoneHandle'); 37 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'progressDone', this, 'progressDoneHandle');
41 38
42 return this; 39 return this;
43} 40}
44 41
45MochiKit.Base.update(Clipperz.PM.UI.Common.Controllers.ProgressBarController.prototype, { 42MochiKit.Base.update(Clipperz.PM.UI.Common.Controllers.ProgressBarController.prototype, {
46 43
47 'toString': function() { 44 'toString': function() {
48 return "Clipperz.PM.UI.Common.Controllers.ProgressBarController"; 45 return "Clipperz.PM.UI.Common.Controllers.ProgressBarController";
49 }, 46 },
50 47
51 //----------------------------------------------------------------------------- 48 //-----------------------------------------------------------------------------
52 49
53 'numberOfSteps': function() { 50 'numberOfSteps': function() {
54 return this._numberOfSteps; 51 return this._numberOfSteps;
55 }, 52 },
56 53
57 'setNumberOfSteps': function (aValue) { 54 'setNumberOfSteps': function (aValue) {
58 this._numberOfSteps = aValue; 55 this._numberOfSteps = aValue;
59 }, 56 },
60 57
61 'updateNumberOfSteps': function (aValue) { 58 'updateNumberOfSteps': function (aValue) {
62 this._numberOfSteps += aValue; 59 this._numberOfSteps += aValue;
63 }, 60 },
64 61
65 //----------------------------------------------------------------------------- 62 //-----------------------------------------------------------------------------
66 63
67 'currentStep': function() { 64 'currentStep': function() {
68 return this._currentStep; 65 return this._currentStep;
69 }, 66 },
70 67
71 'advanceCurrentStep': function () { 68 'advanceCurrentStep': function () {
72 this._currentStep ++; 69 this._currentStep ++;
73 }, 70 },
74 71
75 //----------------------------------------------------------------------------- 72 //-----------------------------------------------------------------------------
76 73
77 'completedPercentage': function () { 74 'completedPercentage': function () {
78 var result; 75 var result;
79//Clipperz.log(">>> completedPercentage" + this.currentStep() + "/" + this.numberOfSteps(), this.currentStep() / this.numberOfSteps()); 76//Clipperz.log(">>> completedPercentage" + this.currentStep() + "/" + this.numberOfSteps(), this.currentStep() / this.numberOfSteps());
80 if (this.numberOfSteps() == 0) { 77 if (this.numberOfSteps() == 0) {
81 result = 0; 78 result = 0;
82 } else { 79 } else {
83 result = (Math.min(100, 100 * (this.currentStep() / this.numberOfSteps()))); 80 result = (Math.min(100, 100 * (this.currentStep() / this.numberOfSteps())));
84 } 81 }
85//Clipperz.log("<<< completedPercentage", result); 82//Clipperz.log("<<< completedPercentage", result);
86 return result; 83 return result;
87 }, 84 },
88 85
89 //----------------------------------------------------------------------------- 86 //-----------------------------------------------------------------------------
90 87
91 'resetStatus': function () { 88 'resetStatus': function () {
92 this._numberOfSteps= 0; 89 this._numberOfSteps= 0;
93 this._currentStep= 0; 90 this._currentStep= 0;
94 }, 91 },
95 92
96 //----------------------------------------------------------------------------- 93 //-----------------------------------------------------------------------------
97 94
98 'updateProgress': function () { 95 'updateProgress': function () {
99//Clipperz.log(">>> updateProgress: " + this.completedPercentage() + "%"); 96//Clipperz.log(">>> updateProgress: " + this.completedPercentage() + "%");
100 MochiKit.Signal.signal(this, 'updateProgress', this.completedPercentage()); 97 MochiKit.Signal.signal(this, 'updateProgress', this.completedPercentage());
101 }, 98 },
102 99
103 //============================================================================= 100 //=============================================================================
104 101
105 'initProgressHandle': function (anEvent) { 102 'initProgressHandle': function (anEvent) {
106//Clipperz.log(">>> initProgressHandle - steps: " + (anEvent != null ? anEvent['steps'] : 0)); 103//Clipperz.log(">>> initProgressHandle - steps: " + (anEvent != null ? anEvent['steps'] : 0));
107 this.resetStatus(); 104 this.resetStatus();
108 if (anEvent != null) { 105 if (anEvent != null) {
109 this.setNumberOfSteps(anEvent['steps']); 106 this.setNumberOfSteps(anEvent['steps']);
110 } 107 }
111 MochiKit.Signal.signal(this, 'initProgress'); 108 MochiKit.Signal.signal(this, 'initProgress');
112 this.updateProgress(); 109 this.updateProgress();
113 }, 110 },
114 111
115 //............................................................................. 112 //.............................................................................
116 113
117 'updateProgressHandle': function (anEvent) { 114 'updateProgressHandle': function (anEvent) {
118 this.updateNumberOfSteps(anEvent['extraSteps']); 115 this.updateNumberOfSteps(anEvent['extraSteps']);
119//Clipperz.log("=== updateProgressHandle - steps: " + this.numberOfSteps() + " (extra " + anEvent['extraSteps'] + ")"); 116//Clipperz.log("=== updateProgressHandle - steps: " + this.numberOfSteps() + " (extra " + anEvent['extraSteps'] + ")");
120 this.updateProgress(); 117 this.updateProgress();
121 }, 118 },
122 119
123 //............................................................................. 120 //.............................................................................
124 121
125 'advanceProgressHandle': function (anEvent) { 122 'advanceProgressHandle': function (anEvent) {
126 this.advanceCurrentStep(); 123 this.advanceCurrentStep();
127//Clipperz.log("--- advanceProgressHandle: " + this.currentStep() + "/" + this.numberOfSteps()); 124//Clipperz.log("--- advanceProgressHandle: " + this.currentStep() + "/" + this.numberOfSteps());
128 this.updateProgress(); 125 this.updateProgress();
129 }, 126 },
130 127
131 //............................................................................. 128 //.............................................................................
132 129
133 'progressDoneHandle': function (anEvent) { 130 'progressDoneHandle': function (anEvent) {
134//Clipperz.log("<<< progressDoneHandle: " + this.currentStep() + "/" + this.numberOfSteps()); 131//Clipperz.log("<<< progressDoneHandle: " + this.currentStep() + "/" + this.numberOfSteps());
135 this.resetStatus(); 132 this.resetStatus();
136 MochiKit.Signal.signal(this, 'progressDone'); 133 MochiKit.Signal.signal(this, 'progressDone');
137 }, 134 },
138 135
139 //============================================================================= 136 //=============================================================================
140 __syntaxFix__: "syntax fix" 137 __syntaxFix__: "syntax fix"
141}); 138});
142 139
143Clipperz.PM.UI.Common.Controllers.ProgressBarController.defaultController = new Clipperz.PM.UI.Common.Controllers.ProgressBarController(); 140Clipperz.PM.UI.Common.Controllers.ProgressBarController.defaultController = new Clipperz.PM.UI.Common.Controllers.ProgressBarController();
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 fbc5929..341fde9 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Common/Controllers/TabPanelController.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Common/Controllers/TabPanelController.js
@@ -1,188 +1,185 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.PM.UI.Common.Controllers'); 26Clipperz.Base.module('Clipperz.PM.UI.Common.Controllers');
30 27
31Clipperz.PM.UI.Common.Controllers.TabPanelController = function(args) { 28Clipperz.PM.UI.Common.Controllers.TabPanelController = function(args) {
32 args = args || {}; 29 args = args || {};
33 30
34 this._component = args.component; 31 this._component = args.component;
35 this._configuration = args.configuration; 32 this._configuration = args.configuration;
36 this._isEnabled = args.enabled || true; 33 this._isEnabled = args.enabled || true;
37 34
38 this._selectedTab = null; 35 this._selectedTab = null;
39 return this; 36 return this;
40} 37}
41 38
42MochiKit.Base.update(Clipperz.PM.UI.Common.Controllers.TabPanelController.prototype, { 39MochiKit.Base.update(Clipperz.PM.UI.Common.Controllers.TabPanelController.prototype, {
43 40
44 'toString': function() { 41 'toString': function() {
45 return "Clipperz.PM.UI.Common.Controllers.TabPanelController"; 42 return "Clipperz.PM.UI.Common.Controllers.TabPanelController";
46 }, 43 },
47 44
48 //----------------------------------------------------------------------------- 45 //-----------------------------------------------------------------------------
49 46
50 'component': function() { 47 'component': function() {
51 return this._component; 48 return this._component;
52 }, 49 },
53 50
54 'configuration': function() { 51 'configuration': function() {
55 return this._configuration; 52 return this._configuration;
56 }, 53 },
57 54
58 //----------------------------------------------------------------------------- 55 //-----------------------------------------------------------------------------
59 56
60 'getElement': function(anElementID) { 57 'getElement': function(anElementID) {
61 return this.component().getElement(anElementID); 58 return this.component().getElement(anElementID);
62 }, 59 },
63 60
64 'tabForTabElement': function(anElement) { 61 'tabForTabElement': function(anElement) {
65 varresult; 62 varresult;
66 63
67 for (result in this.configuration()) { 64 for (result in this.configuration()) {
68 if (this.getElement(this.configuration()[result]['tab']) == anElement) { 65 if (this.getElement(this.configuration()[result]['tab']) == anElement) {
69 break; 66 break;
70 } 67 }
71 } 68 }
72 69
73 return result; 70 return result;
74 }, 71 },
75 72
76 //----------------------------------------------------------------------------- 73 //-----------------------------------------------------------------------------
77 74
78 'setupTab': function(aConfiguration) { 75 'setupTab': function(aConfiguration) {
79 vartabElement; 76 vartabElement;
80 77
81 tabElement = this.getElement(aConfiguration['tab']); 78 tabElement = this.getElement(aConfiguration['tab']);
82 79
83 MochiKit.DOM.removeElementClass(tabElement, 'selected'); 80 MochiKit.DOM.removeElementClass(tabElement, 'selected');
84 MochiKit.Signal.connect(tabElement, 'onclick', this, 'handleTabClick') 81 MochiKit.Signal.connect(tabElement, 'onclick', this, 'handleTabClick')
85 }, 82 },
86 83
87 'setupPanel': function(aConfiguration) { 84 'setupPanel': function(aConfiguration) {
88 this.hidePanel(aConfiguration['panel']); 85 this.hidePanel(aConfiguration['panel']);
89 }, 86 },
90 87
91 'setup': function(args) { 88 'setup': function(args) {
92 args = args || {}; 89 args = args || {};
93 90
94 MochiKit.Base.map(MochiKit.Base.method(this, 'setupTab'),MochiKit.Base.values(this.configuration())); 91 MochiKit.Base.map(MochiKit.Base.method(this, 'setupTab'),MochiKit.Base.values(this.configuration()));
95 MochiKit.Base.map(MochiKit.Base.method(this, 'setupPanel'),MochiKit.Base.values(this.configuration())); 92 MochiKit.Base.map(MochiKit.Base.method(this, 'setupPanel'),MochiKit.Base.values(this.configuration()));
96 this.selectTab(args.selected); 93 this.selectTab(args.selected);
97 }, 94 },
98 95
99 //----------------------------------------------------------------------------- 96 //-----------------------------------------------------------------------------
100 97
101 'hidePanel': function(aPanel) { 98 'hidePanel': function(aPanel) {
102 MochiKit.DOM.removeElementClass(this.getElement(aPanel), 'selected'); 99 MochiKit.DOM.removeElementClass(this.getElement(aPanel), 'selected');
103 }, 100 },
104 101
105 'selectTab': function(aTab) { 102 'selectTab': function(aTab) {
106 if ((aTab != this.selectedTab()) && (this.isEnabled())) { 103 if ((aTab != this.selectedTab()) && (this.isEnabled())) {
107 if (this.selectedTab() != null) { 104 if (this.selectedTab() != null) {
108 MochiKit.DOM.removeElementClass(this.getElement(this.configuration()[this.selectedTab()]['tab']),'selected'); 105 MochiKit.DOM.removeElementClass(this.getElement(this.configuration()[this.selectedTab()]['tab']),'selected');
109 MochiKit.DOM.removeElementClass(this.getElement(this.configuration()[this.selectedTab()]['panel']),'selected'); 106 MochiKit.DOM.removeElementClass(this.getElement(this.configuration()[this.selectedTab()]['panel']),'selected');
110 } 107 }
111 108
112 if (aTab != null) { 109 if (aTab != null) {
113 MochiKit.DOM.addElementClass(this.getElement(this.configuration()[aTab]['tab']),'selected'); 110 MochiKit.DOM.addElementClass(this.getElement(this.configuration()[aTab]['tab']),'selected');
114 MochiKit.DOM.addElementClass(this.getElement(this.configuration()[aTab]['panel']),'selected'); 111 MochiKit.DOM.addElementClass(this.getElement(this.configuration()[aTab]['panel']),'selected');
115 } 112 }
116 113
117 this.setSelectedTab(aTab); 114 this.setSelectedTab(aTab);
118 MochiKit.Signal.signal(this, 'tabSelected', aTab); 115 MochiKit.Signal.signal(this, 'tabSelected', aTab);
119 } 116 }
120 }, 117 },
121 118
122 //----------------------------------------------------------------------------- 119 //-----------------------------------------------------------------------------
123 120
124 'selectedTab': function() { 121 'selectedTab': function() {
125 return this._selectedTab; 122 return this._selectedTab;
126 }, 123 },
127 124
128 'setSelectedTab': function(aTab) { 125 'setSelectedTab': function(aTab) {
129 this._selectedTab = aTab; 126 this._selectedTab = aTab;
130 }, 127 },
131 128
132 //----------------------------------------------------------------------------- 129 //-----------------------------------------------------------------------------
133 130
134 'selectedTabElement': function() { 131 'selectedTabElement': function() {
135 var result; 132 var result;
136 133
137 if (this.selectedTab() != null) { 134 if (this.selectedTab() != null) {
138 result = this.getElement(this.configuration()[this.selectedTab()]['tab']); 135 result = this.getElement(this.configuration()[this.selectedTab()]['tab']);
139 } else { 136 } else {
140 result = null; 137 result = null;
141 } 138 }
142 139
143 return null; 140 return null;
144 }, 141 },
145 142
146 'selectedTabPanelElement': function() { 143 'selectedTabPanelElement': function() {
147 var result; 144 var result;
148 145
149 if (this.selectedTab() != null) { 146 if (this.selectedTab() != null) {
150 result = this.getElement(this.configuration()[this.selectedTab()]['panel']); 147 result = this.getElement(this.configuration()[this.selectedTab()]['panel']);
151 } else { 148 } else {
152 result = null; 149 result = null;
153 } 150 }
154 151
155 return result; 152 return result;
156 }, 153 },
157 154
158 //----------------------------------------------------------------------------- 155 //-----------------------------------------------------------------------------
159 156
160 'handleTabClick': function(anEvent) { 157 'handleTabClick': function(anEvent) {
161 this.selectTab(this.tabForTabElement(anEvent.src())); 158 this.selectTab(this.tabForTabElement(anEvent.src()));
162 anEvent.preventDefault(); 159 anEvent.preventDefault();
163 }, 160 },
164 161
165 //============================================================================= 162 //=============================================================================
166 163
167 'isEnabled': function () { 164 'isEnabled': function () {
168 return this._isEnabled; 165 return this._isEnabled;
169 }, 166 },
170 167
171 'enable': function () { 168 'enable': function () {
172 this._isEnabled = true; 169 this._isEnabled = true;
173 MochiKit.Base.map(MochiKit.Base.bind(function (aTabComponentID) { 170 MochiKit.Base.map(MochiKit.Base.bind(function (aTabComponentID) {
174 MochiKit.DOM.removeElementClass(this.getElement(this.configuration()[aTabComponentID]['tab']), 'disabled'); 171 MochiKit.DOM.removeElementClass(this.getElement(this.configuration()[aTabComponentID]['tab']), 'disabled');
175 }, this), MochiKit.Base.keys(this.configuration())); 172 }, this), MochiKit.Base.keys(this.configuration()));
176 }, 173 },
177 174
178 'disable': function () { 175 'disable': function () {
179 this._isEnabled = false; 176 this._isEnabled = false;
180 MochiKit.Base.map(MochiKit.Base.bind(function (aTabComponentID) { 177 MochiKit.Base.map(MochiKit.Base.bind(function (aTabComponentID) {
181 MochiKit.DOM.addElementClass(this.getElement(this.configuration()[aTabComponentID]['tab']), 'disabled'); 178 MochiKit.DOM.addElementClass(this.getElement(this.configuration()[aTabComponentID]['tab']), 'disabled');
182 }, this), MochiKit.Base.keys(this.configuration())); 179 }, this), MochiKit.Base.keys(this.configuration()));
183 }, 180 },
184 181
185 //============================================================================= 182 //=============================================================================
186 183
187 __syntaxFix__: "syntax fix" 184 __syntaxFix__: "syntax fix"
188}); 185});
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 868cea6..ef38bc6 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Common/Controllers/WizardController.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Common/Controllers/WizardController.js
@@ -1,31 +1,28 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29 //Still empty, but here it should be reasonable to factor in code duplicated between 26 //Still empty, but here it should be reasonable to factor in code duplicated between
30 //- DirectLoginWizardController 27 //- DirectLoginWizardController
31 //- NewUserWizardController \ No newline at end of file 28 //- 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 22258f6..ea987cd 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Compact/MainController.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Compact/MainController.js
@@ -1,59 +1,56 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.PM.UI.Compact'); 26Clipperz.Base.module('Clipperz.PM.UI.Compact');
30 27
31Clipperz.PM.UI.Compact.MainController = function() { 28Clipperz.PM.UI.Compact.MainController = function() {
32 //this._loginPanel = null; 29 //this._loginPanel = null;
33 //this._user = null; 30 //this._user = null;
34// 31//
35 //this._isRunningCompact = false; 32 //this._isRunningCompact = false;
36 // 33 //
37 //Clipperz.NotificationCenter.register(null, 'userConnected', this, 'userConnectedCallback'); 34 //Clipperz.NotificationCenter.register(null, 'userConnected', this, 'userConnectedCallback');
38 //Clipperz.NotificationCenter.register(null, 'switchLanguage', this, 'switchLanguageHandler'); 35 //Clipperz.NotificationCenter.register(null, 'switchLanguage', this, 'switchLanguageHandler');
39// 36//
40 //Clipperz.NotificationCenter.register(null, 'EXCEPTION', this, 'reportException'); 37 //Clipperz.NotificationCenter.register(null, 'EXCEPTION', this, 'reportException');
41 38
42 return this; 39 return this;
43} 40}
44 41
45MochiKit.Base.update(Clipperz.PM.UI.Compact.MainController.prototype, { 42MochiKit.Base.update(Clipperz.PM.UI.Compact.MainController.prototype, {
46 43
47 'toString': function() { 44 'toString': function() {
48 return "Clipperz.PM.UI.Compact.MainController"; 45 return "Clipperz.PM.UI.Compact.MainController";
49 }, 46 },
50 47
51 //----------------------------------------------------------------------------- 48 //-----------------------------------------------------------------------------
52 49
53 'run': function(shouldShowRegistrationForm) { 50 'run': function(shouldShowRegistrationForm) {
54MochiKit.Logging.logDebug("running " + this.toString()); 51MochiKit.Logging.logDebug("running " + this.toString());
55 }, 52 },
56 53
57 //----------------------------------------------------------------------------- 54 //-----------------------------------------------------------------------------
58 __syntaxFix__: "syntax fix" 55 __syntaxFix__: "syntax fix"
59}); \ No newline at end of file 56}); \ No newline at end of file
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 4378b19..ee6d7a3 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/AccountPanel.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/AccountPanel.js
@@ -1,148 +1,145 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 26Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
30 27
31Clipperz.PM.UI.Web.Components.AccountPanel = function(args) { 28Clipperz.PM.UI.Web.Components.AccountPanel = function(args) {
32 args = args || {}; 29 args = args || {};
33 30
34 Clipperz.PM.UI.Web.Components.AccountPanel.superclass.constructor.apply(this, arguments); 31 Clipperz.PM.UI.Web.Components.AccountPanel.superclass.constructor.apply(this, arguments);
35 32
36 //this._initiallySelectedTab = args.selected || 'ACCOUNT'; 33 //this._initiallySelectedTab = args.selected || 'ACCOUNT';
37 this._initiallySelectedTab = args.selected || 'PASSPHRASE'; 34 this._initiallySelectedTab = args.selected || 'PASSPHRASE';
38 this._tabPanelControllerConfiguration = { 35 this._tabPanelControllerConfiguration = {
39 // 'ACCOUNT': { 36 // 'ACCOUNT': {
40 // tab:'accountTab', 37 // tab:'accountTab',
41 // panel:'accountPanel' 38 // panel:'accountPanel'
42 // }, 39 // },
43 'PASSPHRASE': { 40 'PASSPHRASE': {
44 tab:'passphraseTab', 41 tab:'passphraseTab',
45 panel:'passphrasePanel' 42 panel:'passphrasePanel'
46 }, 43 },
47 'PREFERENCES': { 44 'PREFERENCES': {
48 tab:'preferencesTab', 45 tab:'preferencesTab',
49 panel:'preferencesPanel' 46 panel:'preferencesPanel'
50 }, 47 },
51 'LOGIN_HISTORY': { 48 'LOGIN_HISTORY': {
52 tab:'loginHistoryTab', 49 tab:'loginHistoryTab',
53 panel:'loginHistoryPanel' 50 panel:'loginHistoryPanel'
54 } 51 }
55 }; 52 };
56 53
57 return this; 54 return this;
58} 55}
59 56
60//============================================================================= 57//=============================================================================
61 58
62Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.AccountPanel, Clipperz.PM.UI.Common.Components.TabPanelComponent, { 59Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.AccountPanel, Clipperz.PM.UI.Common.Components.TabPanelComponent, {
63 60
64 //------------------------------------------------------------------------- 61 //-------------------------------------------------------------------------
65 62
66 'toString': function () { 63 'toString': function () {
67 return "Clipperz.PM.UI.Web.Components.AccountPanel component"; 64 return "Clipperz.PM.UI.Web.Components.AccountPanel component";
68 }, 65 },
69 66
70 //------------------------------------------------------------------------- 67 //-------------------------------------------------------------------------
71 68
72 'renderSelf': function(/*aContainer, aPosition*/) { 69 'renderSelf': function(/*aContainer, aPosition*/) {
73//Clipperz.log("AccountPanel.renderSelf element", this.element()); 70//Clipperz.log("AccountPanel.renderSelf element", this.element());
74 this.append(this.element(), [ 71 this.append(this.element(), [
75 {tag:'div', cls:'header', children:[ 72 {tag:'div', cls:'header', children:[
76 {tag:'div', cls:'subPanelTabs', children:[ 73 {tag:'div', cls:'subPanelTabs', children:[
77 {tag:'ul', children:[ 74 {tag:'ul', children:[
78 // {tag:'li', id:this.getId('accountTab'), children:[{tag:'a', href:'#', html:'Account'}], cls:'first'}, 75 // {tag:'li', id:this.getId('accountTab'), children:[{tag:'a', href:'#', html:'Account'}], cls:'first'},
79 {tag:'li', id:this.getId('passphraseTab'), children:[{tag:'a', href:'#', html:'Passphrase'}], cls:'first'}, 76 {tag:'li', id:this.getId('passphraseTab'), children:[{tag:'a', href:'#', html:'Passphrase'}], cls:'first'},
80 {tag:'li', id:this.getId('preferencesTab'), children:[{tag:'a', href:'#', html:'Preferences'}]}, 77 {tag:'li', id:this.getId('preferencesTab'), children:[{tag:'a', href:'#', html:'Preferences'}]},
81 {tag:'li', id:this.getId('loginHistoryTab'),children:[{tag:'a', href:'#', html:'Login history'}]} 78 {tag:'li', id:this.getId('loginHistoryTab'),children:[{tag:'a', href:'#', html:'Login history'}]}
82 ]} 79 ]}
83 ]} 80 ]}
84 ]}, 81 ]},
85 {tag:'div', cls:'body', children:[ 82 {tag:'div', cls:'body', children:[
86 {tag:'div', cls:'accountPanel', children:[ 83 {tag:'div', cls:'accountPanel', children:[
87 {tag:'div', cls:'subPanelContent', children:[ 84 {tag:'div', cls:'subPanelContent', children:[
88 {tag:'ul', children:[ 85 {tag:'ul', children:[
89 // {tag:'li', id:this.getId('accountPanel'),children:[ 86 // {tag:'li', id:this.getId('accountPanel'),children:[
90 // {tag:'h3', html:"-- Account --"} 87 // {tag:'h3', html:"-- Account --"}
91 // ]}, 88 // ]},
92 {tag:'li', id:this.getId('passphrasePanel'),children:[ 89 {tag:'li', id:this.getId('passphrasePanel'),children:[
93 {tag:'h3', cls:'changePassphrase', html:"Change passphrase"}, 90 {tag:'h3', cls:'changePassphrase', html:"Change passphrase"},
94 {tag:'form', id:this.getId('changePassphrase'), cls:'changePassphrase', children:[ 91 {tag:'form', id:this.getId('changePassphrase'), cls:'changePassphrase', children:[
95 {tag:'div', cls:'currentCredentials', children:[ 92 {tag:'div', cls:'currentCredentials', children:[
96 {tag:'div', cls:'field username', children:[ 93 {tag:'div', cls:'field username', children:[
97 {tag:'label', html:"username", 'for':this.getId('currentUsername')}, 94 {tag:'label', html:"username", 'for':this.getId('currentUsername')},
98 {tag:'input', id:this.getId('currentUsername')} 95 {tag:'input', id:this.getId('currentUsername')}
99 ]}, 96 ]},
100 {tag:'div', cls:'field passphrase', children:[ 97 {tag:'div', cls:'field passphrase', children:[
101 {tag:'label', html:"passphrase", 'for':this.getId('currentPassphrase')}, 98 {tag:'label', html:"passphrase", 'for':this.getId('currentPassphrase')},
102 {tag:'input', id:this.getId('currentPassphrase')} 99 {tag:'input', id:this.getId('currentPassphrase')}
103 ]} 100 ]}
104 ]}, 101 ]},
105 {tag:'div', cls:'newPassphrase', children:[ 102 {tag:'div', cls:'newPassphrase', children:[
106 {tag:'div', cls:'field', children:[ 103 {tag:'div', cls:'field', children:[
107 {tag:'label', html:"new passphrase", 'for':this.getId('newPassphrase')}, 104 {tag:'label', html:"new passphrase", 'for':this.getId('newPassphrase')},
108 {tag:'input', id:this.getId('newPassphrase')} 105 {tag:'input', id:this.getId('newPassphrase')}
109 ]}, 106 ]},
110 {tag:'div', cls:'field', children:[ 107 {tag:'div', cls:'field', children:[
111 {tag:'label', html:"re-new passphrase", 'for':this.getId('reNewPassphrase')}, 108 {tag:'label', html:"re-new passphrase", 'for':this.getId('reNewPassphrase')},
112 {tag:'input', id:this.getId('reNewPassphrase')} 109 {tag:'input', id:this.getId('reNewPassphrase')}
113 ]} 110 ]}
114 ]}, 111 ]},
115 {tag:'div', cls:'confirm', children:[ 112 {tag:'div', cls:'confirm', children:[
116 {tag:'input', type:'checkbox', id:this.getId('confirm')}, 113 {tag:'input', type:'checkbox', id:this.getId('confirm')},
117 {tag:'label', html:"I understand that Clipperz will not be able to recover a lost passphrase", 'for':this.getId('confirm')} 114 {tag:'label', html:"I understand that Clipperz will not be able to recover a lost passphrase", 'for':this.getId('confirm')}
118 ]} 115 ]}
119 ]}, 116 ]},
120 {tag:'div', cls:'clear'}, 117 {tag:'div', cls:'clear'},
121 {tag:'div', cls:'confirmButton', id:this.getId('confirmationButton'), children:[ 118 {tag:'div', cls:'confirmButton', id:this.getId('confirmationButton'), children:[
122 {tag:'span', html:"change passphrase"} 119 {tag:'span', html:"change passphrase"}
123 ]}, 120 ]},
124 121
125 {tag:'h3', cls:'manageOTP', html:"Manage One-Time Passphrases"}, 122 {tag:'h3', cls:'manageOTP', html:"Manage One-Time Passphrases"},
126 {} 123 {}
127 ]}, 124 ]},
128 {tag:'li', id:this.getId('preferencesPanel'), children:[ 125 {tag:'li', id:this.getId('preferencesPanel'), children:[
129 {tag:'h3', html:"-- Preferences --"} 126 {tag:'h3', html:"-- Preferences --"}
130 ]}, 127 ]},
131 {tag:'li', id:this.getId('loginHistoryPanel'), children:[ 128 {tag:'li', id:this.getId('loginHistoryPanel'), children:[
132 {tag:'h3', html:"-- Login History --"} 129 {tag:'h3', html:"-- Login History --"}
133 ]} 130 ]}
134 ]} 131 ]}
135 ]} 132 ]}
136 ]} 133 ]}
137 ]}, 134 ]},
138 {tag:'div', cls:'footer'} 135 {tag:'div', cls:'footer'}
139 ]); 136 ]);
140 137
141 this.tabPanelController().setup({selected:this.initiallySelectedTab()}); 138 this.tabPanelController().setup({selected:this.initiallySelectedTab()});
142 }, 139 },
143 140
144 //------------------------------------------------------------------------- 141 //-------------------------------------------------------------------------
145 142
146 143
147 __syntaxFix__: "syntax fix" 144 __syntaxFix__: "syntax fix"
148}); 145});
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 67247df..3b3c8b4 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/AppPage.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/AppPage.js
@@ -1,78 +1,75 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 26Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
30 27
31Clipperz.PM.UI.Web.Components.AppPage = function(args) { 28Clipperz.PM.UI.Web.Components.AppPage = function(args) {
32 args = args || {}; 29 args = args || {};
33 Clipperz.PM.UI.Web.Components.AppPage.superclass.constructor.call(this, args); 30 Clipperz.PM.UI.Web.Components.AppPage.superclass.constructor.call(this, args);
34 31
35 this._element = args.element || null; 32 this._element = args.element || null;
36 33
37 this._slots = { 34 this._slots = {
38 'cardGrid' : this.getId('cardGrid'), 35 'cardGrid' : this.getId('cardGrid'),
39 // 'directLoginGrid' : this.getId('directLoginGrid'), 36 // 'directLoginGrid' : this.getId('directLoginGrid'),
40 'accountPanel': this.getId('accountPanel'), 37 'accountPanel': this.getId('accountPanel'),
41 'dataPanel': this.getId('dataPanel'), 38 'dataPanel': this.getId('dataPanel'),
42 'toolsPanel': this.getId('toolsPanel'), 39 'toolsPanel': this.getId('toolsPanel'),
43 'userInfoBox': this.getId('userInfoBox'), 40 'userInfoBox': this.getId('userInfoBox'),
44 'tabSidePanel': this.getId('tabSidePanel') 41 'tabSidePanel': this.getId('tabSidePanel')
45 }; 42 };
46 43
47 return this; 44 return this;
48} 45}
49 46
50//============================================================================= 47//=============================================================================
51 48
52Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.AppPage, Clipperz.PM.UI.Common.Components.BaseComponent, { 49Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.AppPage, Clipperz.PM.UI.Common.Components.BaseComponent, {
53 50
54 //------------------------------------------------------------------------- 51 //-------------------------------------------------------------------------
55 52
56 'toString': function () { 53 'toString': function () {
57 return "Clipperz.PM.UI.Web.Components.AppPage component"; 54 return "Clipperz.PM.UI.Web.Components.AppPage component";
58 }, 55 },
59 56
60 //------------------------------------------------------------------------- 57 //-------------------------------------------------------------------------
61 58
62 'renderSelf': function(/*aContainer, aPosition*/) { 59 'renderSelf': function(/*aContainer, aPosition*/) {
63 this.append(this.element(), {tag:'div', id:this.getId('userInfoBox'), cls:'userInfoBox'}); 60 this.append(this.element(), {tag:'div', id:this.getId('userInfoBox'), cls:'userInfoBox'});
64 this.append(this.element(), {tag:'div', id:this.getId('sidePanels'), cls:'sidePanels'}); 61 this.append(this.element(), {tag:'div', id:this.getId('sidePanels'), cls:'sidePanels'});
65 this.append(this.getId('sidePanels'),{tag:'div', id:this.getId('tabSidePanel'), cls:'tabSidePanel', children:[]}); 62 this.append(this.getId('sidePanels'),{tag:'div', id:this.getId('tabSidePanel'), cls:'tabSidePanel', children:[]});
66 63
67 this.append(this.element(), {tag:'div', id:this.getId('mainPanels'), cls:'mainPanels'}); 64 this.append(this.element(), {tag:'div', id:this.getId('mainPanels'), cls:'mainPanels'});
68 this.append(this.getId('mainPanels'), {tag:'div', id:this.getId('cardGrid'), cls:'gridComponent cardGrid'}); 65 this.append(this.getId('mainPanels'), {tag:'div', id:this.getId('cardGrid'), cls:'gridComponent cardGrid'});
69 // this.append(this.getId('mainPanels'), {tag:'div', id:this.getId('directLoginGrid'), cls:'gridComponent directLoginGrid'}); 66 // this.append(this.getId('mainPanels'), {tag:'div', id:this.getId('directLoginGrid'), cls:'gridComponent directLoginGrid'});
70 this.append(this.getId('mainPanels'), {tag:'div', id:this.getId('accountPanel'), cls:'otherPanel'}); 67 this.append(this.getId('mainPanels'), {tag:'div', id:this.getId('accountPanel'), cls:'otherPanel'});
71 this.append(this.getId('mainPanels'), {tag:'div', id:this.getId('dataPanel'), cls:'otherPanel'}); 68 this.append(this.getId('mainPanels'), {tag:'div', id:this.getId('dataPanel'), cls:'otherPanel'});
72 this.append(this.getId('mainPanels'), {tag:'div', id:this.getId('toolsPanel'), cls:'otherPanel'}); 69 this.append(this.getId('mainPanels'), {tag:'div', id:this.getId('toolsPanel'), cls:'otherPanel'});
73 }, 70 },
74 71
75 //------------------------------------------------------------------------- 72 //-------------------------------------------------------------------------
76 73
77 __syntaxFix__: "syntax fix" 74 __syntaxFix__: "syntax fix"
78}); 75});
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 42a6052..1835ca9 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/BookmarkletComponent.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/BookmarkletComponent.js
@@ -1,109 +1,106 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 26Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
30 27
31Clipperz.PM.UI.Web.Components.BookmarkletComponent = function(args) { 28Clipperz.PM.UI.Web.Components.BookmarkletComponent = function(args) {
32 args = args || {}; 29 args = args || {};
33 30
34 Clipperz.PM.UI.Web.Components.BookmarkletComponent.superclass.constructor.apply(this, arguments); 31 Clipperz.PM.UI.Web.Components.BookmarkletComponent.superclass.constructor.apply(this, arguments);
35 MochiKit.Signal.connect(Clipperz.PM.Strings.Languages, 'switchLanguage', this, 'updateBookmarkletURLs'); 32 MochiKit.Signal.connect(Clipperz.PM.Strings.Languages, 'switchLanguage', this, 'updateBookmarkletURLs');
36 33
37 return this; 34 return this;
38} 35}
39 36
40//============================================================================= 37//=============================================================================
41 38
42Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.BookmarkletComponent, Clipperz.PM.UI.Common.Components.BaseComponent, { 39Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.BookmarkletComponent, Clipperz.PM.UI.Common.Components.BaseComponent, {
43 40
44 //------------------------------------------------------------------------- 41 //-------------------------------------------------------------------------
45 42
46 'toString': function () { 43 'toString': function () {
47 return "Clipperz.PM.UI.Web.Components.BookmarkletComponent component"; 44 return "Clipperz.PM.UI.Web.Components.BookmarkletComponent component";
48 }, 45 },
49 46
50 //------------------------------------------------------------------------- 47 //-------------------------------------------------------------------------
51 48
52 'renderSelf': function() { 49 'renderSelf': function() {
53 // var bookmarkletUrl; 50 // var bookmarkletUrl;
54// 51//
55 // if (Clipperz_IEisBroken == true) { 52 // if (Clipperz_IEisBroken == true) {
56 // bookmarkletUrl = bookmarklet_ie; 53 // bookmarkletUrl = bookmarklet_ie;
57 // } else { 54 // } else {
58 /// bookmarkletUrl = bookmarklet; 55 /// bookmarkletUrl = bookmarklet;
59 // bookmarkletUrl = Clipperz.PM.Strings['bookmarklet']; 56 // bookmarkletUrl = Clipperz.PM.Strings['bookmarklet'];
60 // } 57 // }
61 58
62 this.append(this.element(), {tag:'div', cls:'bookmarklet', children: [ 59 this.append(this.element(), {tag:'div', cls:'bookmarklet', children: [
63 {tag:'div', id:this.getId('linkBlock'), cls:'bookmarklet_link', children:[ 60 {tag:'div', id:this.getId('linkBlock'), cls:'bookmarklet_link', children:[
64 // {tag:'a', id:this.getId('link'), href:bookmarkletUrl, children:[ 61 // {tag:'a', id:this.getId('link'), href:bookmarkletUrl, children:[
65 {tag:'a', id:this.getId('link'), href:'#', children:[ 62 {tag:'a', id:this.getId('link'), href:'#', children:[
66 {tag:'div', cls:'icon'}, 63 {tag:'div', cls:'icon'},
67 {tag:'div', cls:'text', children:[ 64 {tag:'div', cls:'text', children:[
68 {tag:'span', html:"add to Clipperz"} 65 {tag:'span', html:"add to Clipperz"}
69 ]} 66 ]}
70 ]} 67 ]}
71 ]} 68 ]}
72 ]}); 69 ]});
73 70
74 new Clipperz.PM.UI.Common.Components.Tooltip({ 71 new Clipperz.PM.UI.Common.Components.Tooltip({
75 element:this.getElement('linkBlock'), 72 element:this.getElement('linkBlock'),
76 text: "Drag and drop the \"add to Clipperz\" link above to the bookmark bar.", 73 text: "Drag and drop the \"add to Clipperz\" link above to the bookmark bar.",
77 position:'BELOW' 74 position:'BELOW'
78 }); 75 });
79 76
80 MochiKit.Signal.connect(this.getId('link'), 'onclick', this, 'handleOnclick'); 77 MochiKit.Signal.connect(this.getId('link'), 'onclick', this, 'handleOnclick');
81 this.updateBookmarkletURLs(); 78 this.updateBookmarkletURLs();
82 }, 79 },
83 80
84 //------------------------------------------------------------------------- 81 //-------------------------------------------------------------------------
85 82
86 'handleOnclick': function (anEvent) { 83 'handleOnclick': function (anEvent) {
87 anEvent.preventDefault(); 84 anEvent.preventDefault();
88 85
89Clipperz.log("BOOKMARKLET CLICK"); 86Clipperz.log("BOOKMARKLET CLICK");
90 }, 87 },
91 88
92 //------------------------------------------------------------------------- 89 //-------------------------------------------------------------------------
93 90
94 'updateBookmarkletURLs': function () { 91 'updateBookmarkletURLs': function () {
95 var bookmarkletUrl; 92 var bookmarkletUrl;
96 93
97 if (Clipperz_IEisBroken == true) { 94 if (Clipperz_IEisBroken == true) {
98 bookmarkletUrl = bookmarklet_ie; 95 bookmarkletUrl = bookmarklet_ie;
99 } else { 96 } else {
100 // bookmarkletUrl = bookmarklet; 97 // bookmarkletUrl = bookmarklet;
101 bookmarkletUrl = Clipperz.PM.Strings.getValue('bookmarklet'); 98 bookmarkletUrl = Clipperz.PM.Strings.getValue('bookmarklet');
102 } 99 }
103 100
104 this.getElement('link').href = bookmarkletUrl; 101 this.getElement('link').href = bookmarkletUrl;
105 }, 102 },
106 103
107 //------------------------------------------------------------------------- 104 //-------------------------------------------------------------------------
108 __syntaxFix__: "syntax fix" 105 __syntaxFix__: "syntax fix"
109}); 106});
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 e3238ca..af33d85 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/CardDialogComponent.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/CardDialogComponent.js
@@ -1,408 +1,405 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 26Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
30 27
31Clipperz.PM.UI.Web.Components.CardDialogComponent = function(args) { 28Clipperz.PM.UI.Web.Components.CardDialogComponent = function(args) {
32 args = args || {}; 29 args = args || {};
33 30
34 Clipperz.PM.UI.Web.Components.CardDialogComponent.superclass.constructor.apply(this, arguments); 31 Clipperz.PM.UI.Web.Components.CardDialogComponent.superclass.constructor.apply(this, arguments);
35 32
36 this._tabPanelController = null; 33 this._tabPanelController = null;
37 34
38 this._tabPanelControllerConfiguration = { 35 this._tabPanelControllerConfiguration = {
39 'DETAILS': { 36 'DETAILS': {
40 tab:'detailTab', 37 tab:'detailTab',
41 panel:'detailTabpanel' 38 panel:'detailTabpanel'
42 }, 39 },
43 'DIRECT_LOGINS': { 40 'DIRECT_LOGINS': {
44 tab:'directLoginTab', 41 tab:'directLoginTab',
45 panel:'directLoginTabpanel' 42 panel:'directLoginTabpanel'
46 }, 43 },
47 'SHARING': { 44 'SHARING': {
48 tab:'sharingTab', 45 tab:'sharingTab',
49 panel:'sharingTabpanel' 46 panel:'sharingTabpanel'
50 } 47 }
51 }; 48 };
52 49
53 this._tooltips = null; 50 this._tooltips = null;
54 51
55 this._isSavingEnabled = false; 52 this._isSavingEnabled = false;
56 this._hintMode = 'OFF'; //'ON' 53 this._hintMode = 'OFF'; //'ON'
57 54
58 this._fieldComponents = {}; 55 this._fieldComponents = {};
59 this._directLoginComponents = {}; 56 this._directLoginComponents = {};
60 57
61 this._displayMode = 'fixed'; //'scrollable'; 58 this._displayMode = 'fixed'; //'scrollable';
62 59
63 return this; 60 return this;
64} 61}
65 62
66//============================================================================= 63//=============================================================================
67 64
68Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.CardDialogComponent, Clipperz.PM.UI.Common.Components.BaseComponent, { 65Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.CardDialogComponent, Clipperz.PM.UI.Common.Components.BaseComponent, {
69 66
70 //------------------------------------------------------------------------- 67 //-------------------------------------------------------------------------
71 68
72 'toString': function () { 69 'toString': function () {
73 return "Clipperz.PM.UI.Web.Components.CardDialogComponent component"; 70 return "Clipperz.PM.UI.Web.Components.CardDialogComponent component";
74 }, 71 },
75 72
76 //------------------------------------------------------------------------- 73 //-------------------------------------------------------------------------
77 74
78 'tabPanelController': function () { 75 'tabPanelController': function () {
79 if (this._tabPanelController == null) { 76 if (this._tabPanelController == null) {
80 this._tabPanelController = new Clipperz.PM.UI.Common.Controllers.TabPanelController({ 77 this._tabPanelController = new Clipperz.PM.UI.Common.Controllers.TabPanelController({
81 component:this, 78 component:this,
82 configuration:this._tabPanelControllerConfiguration 79 configuration:this._tabPanelControllerConfiguration
83 }); 80 });
84 81
85 MochiKit.Signal.connect(this._tabPanelController, 'tabSelected', this, 'handleTabSelected') 82 MochiKit.Signal.connect(this._tabPanelController, 'tabSelected', this, 'handleTabSelected')
86 } 83 }
87 84
88 return this._tabPanelController; 85 return this._tabPanelController;
89 }, 86 },
90 87
91 //------------------------------------------------------------------------- 88 //-------------------------------------------------------------------------
92 89
93 'renderSelf': function() { 90 'renderSelf': function() {
94 this.append(this.element(), {tag:'div', cls:'CardDialog mainDialog loading', id:this.getId('panel'), children: [ 91 this.append(this.element(), {tag:'div', cls:'CardDialog mainDialog loading', id:this.getId('panel'), children: [
95 {tag:'form', id:this.getId('form'), children:[ 92 {tag:'form', id:this.getId('form'), children:[
96 // {tag:'input', type:'text', id:this.getId('hidden'), cls:'hidden'}, 93 // {tag:'input', type:'text', id:this.getId('hidden'), cls:'hidden'},
97 {tag:'div', cls:'header', children:[ 94 {tag:'div', cls:'header', children:[
98 {tag:'div', cls:'title', children:[ 95 {tag:'div', cls:'title', children:[
99 {tag:'input', type:'text', id:this.getId('title')} 96 {tag:'input', type:'text', id:this.getId('title')}
100 ]} 97 ]}
101 ]}, 98 ]},
102 {tag:'div', id:this.getId('body'), cls:'body', children:[ 99 {tag:'div', id:this.getId('body'), cls:'body', children:[
103 {tag:'div', cls:'tabs', children:[ 100 {tag:'div', cls:'tabs', children:[
104 {tag:'ul', cls:'tabs', children:[ 101 {tag:'ul', cls:'tabs', children:[
105 {tag:'li', id:this.getId('detailTab'), children:[{tag:'span', html:"details"}]}, 102 {tag:'li', id:this.getId('detailTab'), children:[{tag:'span', html:"details"}]},
106 {tag:'li', id:this.getId('directLoginTab'), children:[ 103 {tag:'li', id:this.getId('directLoginTab'), children:[
107 {tag:'span', html:"direct logins"}//, 104 {tag:'span', html:"direct logins"}//,
108 // {tag:'div', id:this.getId('addDirectLoginButton'), cls:'addDirectLoginButton', children:[ 105 // {tag:'div', id:this.getId('addDirectLoginButton'), cls:'addDirectLoginButton', children:[
109 // {tag:'span', html:"+"} 106 // {tag:'span', html:"+"}
110 // ]} 107 // ]}
111 ]}, 108 ]},
112 {tag:'li', id:this.getId('sharingTab'), children:[{tag:'span', html:"sharing"}]} 109 {tag:'li', id:this.getId('sharingTab'), children:[{tag:'span', html:"sharing"}]}
113 ]} 110 ]}
114 ]}, 111 ]},
115 {tag:'div', cls:'tabPanels', children:[ 112 {tag:'div', cls:'tabPanels', children:[
116 {tag:'ul', cls:'tabPanels', children:[ 113 {tag:'ul', cls:'tabPanels', children:[
117 {tag:'li', id:this.getId('detailTabpanel'), cls:'tabPanel', children:[ 114 {tag:'li', id:this.getId('detailTabpanel'), cls:'tabPanel', children:[
118 {tag:'div', id:this.getId('recordFields'), children:[ 115 {tag:'div', id:this.getId('recordFields'), children:[
119 {tag:'table', cls:'fields', cellpadding:'0', id:this.getId('fieldTable'), cellspacing:'0', children:[ 116 {tag:'table', cls:'fields', cellpadding:'0', id:this.getId('fieldTable'), cellspacing:'0', children:[
120 {tag:'thead', children:[ 117 {tag:'thead', children:[
121 {tag:'tr', children:[ 118 {tag:'tr', children:[
122 {tag:'th', cls:'fieldStateTH',html:""}, 119 {tag:'th', cls:'fieldStateTH',html:""},
123 {tag:'th', cls:'fieldLabelTH',html:"label"}, 120 {tag:'th', cls:'fieldLabelTH',html:"label"},
124 {tag:'th', cls:'fieldLockTH',html:""}, 121 {tag:'th', cls:'fieldLockTH',html:""},
125 {tag:'th', cls:'fieldValueTH',html:"value"}, 122 {tag:'th', cls:'fieldValueTH',html:"value"},
126 {tag:'th', cls:'fieldActionTH',html:""}, 123 {tag:'th', cls:'fieldActionTH',html:""},
127 {tag:'th', cls:'fieldDeleteTH',html:""} 124 {tag:'th', cls:'fieldDeleteTH',html:""}
128 ]} 125 ]}
129 ]}, 126 ]},
130 {tag:'tfoot'}, 127 {tag:'tfoot'},
131 {tag:'tbody', id:this.getId('tableBody'), children:[ 128 {tag:'tbody', id:this.getId('tableBody'), children:[
132 {tag:'tr', id:this.getId('newFieldTR'), cls:'newFieldTR', children:[ 129 {tag:'tr', id:this.getId('newFieldTR'), cls:'newFieldTR', children:[
133 {tag:'td', cls:'fieldState'}, 130 {tag:'td', cls:'fieldState'},
134 {tag:'td', cls:'fieldLabel', children:[ 131 {tag:'td', cls:'fieldLabel', children:[
135 {tag:'input', cls:'label', id:this.getId('newFieldLabel')} 132 {tag:'input', cls:'label', id:this.getId('newFieldLabel')}
136 ]}, 133 ]},
137 {tag:'td', cls:'fieldLock', children:[ 134 {tag:'td', cls:'fieldLock', children:[
138 {tag:'div', cls:'unlocked', id:this.getId('newFieldIsLocked')} 135 {tag:'div', cls:'unlocked', id:this.getId('newFieldIsLocked')}
139 ]}, 136 ]},
140 {tag:'td', cls:'fieldValue', children:[ 137 {tag:'td', cls:'fieldValue', children:[
141 {tag:'div', cls:'unlocked', id:this.getId('newFieldValueWrapper'), children:[ 138 {tag:'div', cls:'unlocked', id:this.getId('newFieldValueWrapper'), children:[
142 {tag:'input',type:'text', cls:'value', id:this.getId('newFieldValue')} 139 {tag:'input',type:'text', cls:'value', id:this.getId('newFieldValue')}
143 ]} 140 ]}
144 ]}, 141 ]},
145 {tag:'td', cls:'fieldAction', children:[ 142 {tag:'td', cls:'fieldAction', children:[
146 {tag:'div', html:'&nbsp;'} 143 {tag:'div', html:'&nbsp;'}
147 ]}, 144 ]},
148 {tag:'td', cls:'fieldAddDelete', children:[ 145 {tag:'td', cls:'fieldAddDelete', children:[
149 {tag:'div', cls:'new', children:[ 146 {tag:'div', cls:'new', children:[
150 {tag:'span', children:[ 147 {tag:'span', children:[
151 {tag:'a', href:'#', id:this.getId('newFieldAddButton'), html:"add"} 148 {tag:'a', href:'#', id:this.getId('newFieldAddButton'), html:"add"}
152 ]} 149 ]}
153 ]} 150 ]}
154 ]} 151 ]}
155 ]} 152 ]}
156 ]} 153 ]}
157 ]} 154 ]}
158 ]}, 155 ]},
159 {tag:'div', cls:'notes', children:[ 156 {tag:'div', cls:'notes', children:[
160 {tag:'div', children:[ 157 {tag:'div', children:[
161 {tag:'textarea', id:this.getId('recordNote'), value:""} 158 {tag:'textarea', id:this.getId('recordNote'), value:""}
162 ]} 159 ]}
163 ]} 160 ]}
164 ]}, 161 ]},
165 {tag:'li', id:this.getId('directLoginTabpanel'), cls:'tabPanel', children:[ 162 {tag:'li', id:this.getId('directLoginTabpanel'), cls:'tabPanel', children:[
166 {tag:'div', id:this.getId('directLoginsComponentContainer'), cls:'directLoginsComponentContainer', children:[ 163 {tag:'div', id:this.getId('directLoginsComponentContainer'), cls:'directLoginsComponentContainer', children:[
167 {tag:'div', id:this.getId('directLogins'), cls:'directLogins', children:[ 164 {tag:'div', id:this.getId('directLogins'), cls:'directLogins', children:[
168 {tag:'div', id:this.getId('addNewDirectLoginSplash'), cls:'addNewDirectLoginSplash', children:[ 165 {tag:'div', id:this.getId('addNewDirectLoginSplash'), cls:'addNewDirectLoginSplash', children:[
169 {tag:'h3', html:"Here you can add a Direct Login for this card: instant access to your favorit website!"}, 166 {tag:'h3', html:"Here you can add a Direct Login for this card: instant access to your favorit website!"},
170 {tag:'a', href:'#', id:this.getId('addNewDirectLoginSplashButton'), children:[{tag:'span', html:"Add Direct Login"}]} 167 {tag:'a', href:'#', id:this.getId('addNewDirectLoginSplashButton'), children:[{tag:'span', html:"Add Direct Login"}]}
171 ]}, 168 ]},
172 {tag:'div', id:this.getId('directLoginsList')}, 169 {tag:'div', id:this.getId('directLoginsList')},
173 {tag:'div', cls:'addDirectLoginListItem', id:this.getId('addDirectLoginListItem'), children:[{tag:'a', href:'#', id:this.getId('addNewDirectLoginListItemButton'), children:[{tag:'span', html:"Add Direct Login"}]}]} 170 {tag:'div', cls:'addDirectLoginListItem', id:this.getId('addDirectLoginListItem'), children:[{tag:'a', href:'#', id:this.getId('addNewDirectLoginListItemButton'), children:[{tag:'span', html:"Add Direct Login"}]}]}
174 ]}, 171 ]},
175 {tag:'div', id:this.getId('directLoginEditDetail'), cls:'directLoginEditDetail'} 172 {tag:'div', id:this.getId('directLoginEditDetail'), cls:'directLoginEditDetail'}
176 ]} 173 ]}
177 ]}, 174 ]},
178 {tag:'li', id:this.getId('sharingTabpanel'), cls:'tabPanel', children:[ 175 {tag:'li', id:this.getId('sharingTabpanel'), cls:'tabPanel', children:[
179 {tag:'h2', html:"Coming soon!"} 176 {tag:'h2', html:"Coming soon!"}
180 ]} 177 ]}
181 ]} 178 ]}
182 ]}, 179 ]},
183 {tag:'div', cls:'mask', children:[ 180 {tag:'div', cls:'mask', children:[
184 {tag:'div', id:this.getId('progress'), children:[ 181 {tag:'div', id:this.getId('progress'), children:[
185 {tag:'h3', id:this.getId('progressDescription'), cls:'progressDescription', html:"Loading"}, 182 {tag:'h3', id:this.getId('progressDescription'), cls:'progressDescription', html:"Loading"},
186 {tag:'div', id:this.getId('progressBar')} 183 {tag:'div', id:this.getId('progressBar')}
187 ]}, 184 ]},
188 {tag:'div', id:this.getId('error'), cls:'error', children:[ 185 {tag:'div', id:this.getId('error'), cls:'error', children:[
189 {tag:'div', cls:'img'}, 186 {tag:'div', cls:'img'},
190 {tag:'p', id:this.getId('errorMessage')} 187 {tag:'p', id:this.getId('errorMessage')}
191 ]} 188 ]}
192 ]} 189 ]}
193 ]}, 190 ]},
194 {tag:'div', cls:'footer', children:[ 191 {tag:'div', cls:'footer', children:[
195 {tag:'div', cls:'buttonArea', children:[ 192 {tag:'div', cls:'buttonArea', children:[
196 {tag:'div', cls:'cancel', id:this.getId('cancelButton'), html:"cancel"}, 193 {tag:'div', cls:'cancel', id:this.getId('cancelButton'), html:"cancel"},
197 {tag:'div', cls:'save disabled', id:this.getId('saveButton'), html:"save"} 194 {tag:'div', cls:'save disabled', id:this.getId('saveButton'), html:"save"}
198 ]} 195 ]}
199 ]} 196 ]}
200 ]} 197 ]}
201 ]}); 198 ]});
202 199
203 200
204 this.insertAllTooltips(); 201 this.insertAllTooltips();
205 202
206 this.addComponent(new Clipperz.PM.UI.Common.Components.ProgressBar({'element':this.getElement('progressBar')})); 203 this.addComponent(new Clipperz.PM.UI.Common.Components.ProgressBar({'element':this.getElement('progressBar')}));
207 204
208 this.tabPanelController().setup({selected:'DETAILS'}); 205 this.tabPanelController().setup({selected:'DETAILS'});
209 // this.tabPanelController().setup({selected:'DIRECT_LOGINS'}); 206 // this.tabPanelController().setup({selected:'DIRECT_LOGINS'});
210 207
211 MochiKit.Style.hideElement(this.getId('error')); 208 MochiKit.Style.hideElement(this.getId('error'));
212 MochiKit.Style.hideElement(this.getElement('directLoginEditDetail')); 209 MochiKit.Style.hideElement(this.getElement('directLoginEditDetail'));
213 MochiKit.Style.hideElement(this.getElement('addDirectLoginListItem')); 210 MochiKit.Style.hideElement(this.getElement('addDirectLoginListItem'));
214 this.plumbDetailsPanel(); 211 this.plumbDetailsPanel();
215 212
216 MochiKit.Signal.connect(this.getId('cancelButton'), 'onclick', this, 'handleCancelEvent'); 213 MochiKit.Signal.connect(this.getId('cancelButton'), 'onclick', this, 'handleCancelEvent');
217 MochiKit.Signal.connect(this.getId('saveButton'), 'onclick', this, 'handleSaveEvent'); 214 MochiKit.Signal.connect(this.getId('saveButton'), 'onclick', this, 'handleSaveEvent');
218 215
219 MochiKit.Signal.connect(this.getId('addNewDirectLoginSplashButton'), 'onclick', this, 'handleAddDirectLogin'); 216 MochiKit.Signal.connect(this.getId('addNewDirectLoginSplashButton'), 'onclick', this, 'handleAddDirectLogin');
220 MochiKit.Signal.connect(this.getId('addNewDirectLoginListItemButton'), 'onclick', this, 'handleAddDirectLogin'); 217 MochiKit.Signal.connect(this.getId('addNewDirectLoginListItemButton'), 'onclick', this, 'handleAddDirectLogin');
221 218
222 MochiKit.Signal.connect(MochiKit.DOM.currentDocument().body, 'onkeydown',this, 'handleKeyEvent'); 219 MochiKit.Signal.connect(MochiKit.DOM.currentDocument().body, 'onkeydown',this, 'handleKeyEvent');
223 }, 220 },
224 221
225 //------------------------------------------------------------------------- 222 //-------------------------------------------------------------------------
226 223
227 'displayMode': function () { 224 'displayMode': function () {
228 return this._displayMode; 225 return this._displayMode;
229 }, 226 },
230 227
231 'setDisplayMode': function (aValue) { 228 'setDisplayMode': function (aValue) {
232 this._displayMode = aValue; 229 this._displayMode = aValue;
233 }, 230 },
234 231
235 //------------------------------------------------------------------------- 232 //-------------------------------------------------------------------------
236 233
237 'plumbDetailsPanel': function () { 234 'plumbDetailsPanel': function () {
238 MochiKit.Signal.connect(this.getId('title'), 'onfocus', MochiKit.Base.method(this, 'handleOnFocusEvent',this.getElement('title').parentNode)); 235 MochiKit.Signal.connect(this.getId('title'), 'onfocus', MochiKit.Base.method(this, 'handleOnFocusEvent',this.getElement('title').parentNode));
239 MochiKit.Signal.connect(this.getId('title'), 'onblur',MochiKit.Base.method(this, 'handleLooseFocusEvent', this.getElement('title').parentNode)); 236 MochiKit.Signal.connect(this.getId('title'), 'onblur',MochiKit.Base.method(this, 'handleLooseFocusEvent', this.getElement('title').parentNode));
240 MochiKit.Signal.connect(this.getId('title'), 'onchange',MochiKit.Base.partial(MochiKit.Signal.signal, this, 'changedValue')); 237 MochiKit.Signal.connect(this.getId('title'), 'onchange',MochiKit.Base.partial(MochiKit.Signal.signal, this, 'changedValue'));
241 MochiKit.Signal.connect(this.getId('title'), 'onkeyup',MochiKit.Base.partial(MochiKit.Signal.signal, this, 'changedValue')); 238 MochiKit.Signal.connect(this.getId('title'), 'onkeyup',MochiKit.Base.partial(MochiKit.Signal.signal, this, 'changedValue'));
242 239
243 MochiKit.Signal.connect(this.getId('recordNote'), 'onfocus', MochiKit.Base.method(this, 'handleOnFocusEvent',MochiKit.Selector.findChildElements(this.element(), ['div.notes'])[0])); 240 MochiKit.Signal.connect(this.getId('recordNote'), 'onfocus', MochiKit.Base.method(this, 'handleOnFocusEvent',MochiKit.Selector.findChildElements(this.element(), ['div.notes'])[0]));
244 MochiKit.Signal.connect(this.getId('recordNote'), 'onblur',MochiKit.Base.method(this, 'handleLooseFocusEvent', MochiKit.Selector.findChildElements(this.element(), ['div.notes'])[0])); 241 MochiKit.Signal.connect(this.getId('recordNote'), 'onblur',MochiKit.Base.method(this, 'handleLooseFocusEvent', MochiKit.Selector.findChildElements(this.element(), ['div.notes'])[0]));
245 MochiKit.Signal.connect(this.getId('recordNote'), 'onchange',MochiKit.Base.partial(MochiKit.Signal.signal, this, 'changedValue')); 242 MochiKit.Signal.connect(this.getId('recordNote'), 'onchange',MochiKit.Base.partial(MochiKit.Signal.signal, this, 'changedValue'));
246 MochiKit.Signal.connect(this.getId('recordNote'), 'onkeyup',MochiKit.Base.partial(MochiKit.Signal.signal, this, 'changedValue')); 243 MochiKit.Signal.connect(this.getId('recordNote'), 'onkeyup',MochiKit.Base.partial(MochiKit.Signal.signal, this, 'changedValue'));
247 244
248 MochiKit.Signal.connect(this.getId('newFieldValue'), 'onkeydown',this, 'handleKeyDownOnNewFieldValue'); 245 MochiKit.Signal.connect(this.getId('newFieldValue'), 'onkeydown',this, 'handleKeyDownOnNewFieldValue');
249 246
250 MochiKit.Signal.connect(this.getId('newFieldLabel'), 'onkeyup',MochiKit.Base.partial(MochiKit.Signal.signal, this, 'changedValue')); 247 MochiKit.Signal.connect(this.getId('newFieldLabel'), 'onkeyup',MochiKit.Base.partial(MochiKit.Signal.signal, this, 'changedValue'));
251 MochiKit.Signal.connect(this.getId('newFieldIsLocked'), 'onclick',this, 'toggleNewFieldIsHidden'); 248 MochiKit.Signal.connect(this.getId('newFieldIsLocked'), 'onclick',this, 'toggleNewFieldIsHidden');
252 MochiKit.Signal.connect(this.getId('newFieldValue'), 'onkeyup',MochiKit.Base.partial(MochiKit.Signal.signal, this, 'changedValue')); 249 MochiKit.Signal.connect(this.getId('newFieldValue'), 'onkeyup',MochiKit.Base.partial(MochiKit.Signal.signal, this, 'changedValue'));
253 250
254 MochiKit.Signal.connect(this.getId('newFieldAddButton'), 'onclick', this, 'handleAddClick'); 251 MochiKit.Signal.connect(this.getId('newFieldAddButton'), 'onclick', this, 'handleAddClick');
255 }, 252 },
256 253
257 //------------------------------------------------------------------------- 254 //-------------------------------------------------------------------------
258 255
259 'insertAllTooltips': function () { 256 'insertAllTooltips': function () {
260 var tooltips; 257 var tooltips;
261 var tooltipEnabled; 258 var tooltipEnabled;
262 259
263 tooltips = {}; 260 tooltips = {};
264 tooltipEnabled = (this.hintMode() == 'ON'); 261 tooltipEnabled = (this.hintMode() == 'ON');
265 262
266 tooltips['title'] = new Clipperz.PM.UI.Common.Components.Tooltip({ 263 tooltips['title'] = new Clipperz.PM.UI.Common.Components.Tooltip({
267 'element':this.getElement('title'), 264 'element':this.getElement('title'),
268 'text': "Insert here the title of the card", 265 'text': "Insert here the title of the card",
269 'position':'RIGHT' 266 'position':'RIGHT'
270 }); 267 });
271 this.addComponent(tooltips['title']); 268 this.addComponent(tooltips['title']);
272 MochiKit.Signal.connect(this.getId('title'), 'onfocus',MochiKit.Base.method(this, 'showTooltipOnFocus', 'title')); 269 MochiKit.Signal.connect(this.getId('title'), 'onfocus',MochiKit.Base.method(this, 'showTooltipOnFocus', 'title'));
273 MochiKit.Signal.connect(this.getId('title'), 'onblur', MochiKit.Base.method(this, 'hideTooltipOnBlur', 'title')); 270 MochiKit.Signal.connect(this.getId('title'), 'onblur', MochiKit.Base.method(this, 'hideTooltipOnBlur', 'title'));
274 271
275 tooltips['newFieldTR'] = new Clipperz.PM.UI.Common.Components.Tooltip({ 272 tooltips['newFieldTR'] = new Clipperz.PM.UI.Common.Components.Tooltip({
276 'element':this.getElement('newFieldTR'), 273 'element':this.getElement('newFieldTR'),
277 'text': "Insert your card new values here", 274 'text': "Insert your card new values here",
278 'position':'RIGHT' 275 'position':'RIGHT'
279 }); 276 });
280 this.addComponent(tooltips['newFieldTR']); 277 this.addComponent(tooltips['newFieldTR']);
281 MochiKit.Signal.connect(this.getId('newFieldLabel'), 'onfocus',MochiKit.Base.method(this, 'showTooltipOnFocus', 'newFieldTR')); 278 MochiKit.Signal.connect(this.getId('newFieldLabel'), 'onfocus',MochiKit.Base.method(this, 'showTooltipOnFocus', 'newFieldTR'));
282 MochiKit.Signal.connect(this.getId('newFieldValue'), 'onblur', MochiKit.Base.method(this, 'hideTooltipOnBlur', 'newFieldTR')); 279 MochiKit.Signal.connect(this.getId('newFieldValue'), 'onblur', MochiKit.Base.method(this, 'hideTooltipOnBlur', 'newFieldTR'));
283 280
284 tooltips['recordNote'] = new Clipperz.PM.UI.Common.Components.Tooltip({ 281 tooltips['recordNote'] = new Clipperz.PM.UI.Common.Components.Tooltip({
285 'element':this.getElement('recordNote'), 282 'element':this.getElement('recordNote'),
286 'text': "You can insert some notes here", 283 'text': "You can insert some notes here",
287 'position':'RIGHT' 284 'position':'RIGHT'
288 }); 285 });
289 this.addComponent(tooltips['recordNote']); 286 this.addComponent(tooltips['recordNote']);
290 MochiKit.Signal.connect(this.getId('recordNote'), 'onfocus',MochiKit.Base.method(this, 'showTooltipOnFocus', 'recordNote')); 287 MochiKit.Signal.connect(this.getId('recordNote'), 'onfocus',MochiKit.Base.method(this, 'showTooltipOnFocus', 'recordNote'));
291 MochiKit.Signal.connect(this.getId('recordNote'), 'onblur', MochiKit.Base.method(this, 'hideTooltipOnBlur', 'recordNote')); 288 MochiKit.Signal.connect(this.getId('recordNote'), 'onblur', MochiKit.Base.method(this, 'hideTooltipOnBlur', 'recordNote'));
292 289
293 this._tooltips = tooltips; 290 this._tooltips = tooltips;
294 }, 291 },
295 292
296 //......................................................................... 293 //.........................................................................
297 294
298 'updateAllTooltipsEnabledMode': function (aStatus) { 295 'updateAllTooltipsEnabledMode': function (aStatus) {
299 vartooltipLabel; 296 vartooltipLabel;
300 var tooltipEnabled; 297 var tooltipEnabled;
301 298
302 tooltipEnabled = (aStatus == 'ON') ? true : false; 299 tooltipEnabled = (aStatus == 'ON') ? true : false;
303 300
304 for (tooltipLabel in this.tooltips()) { 301 for (tooltipLabel in this.tooltips()) {
305 this.tooltips()[tooltipLabel].setIsEnabled(tooltipEnabled); 302 this.tooltips()[tooltipLabel].setIsEnabled(tooltipEnabled);
306 } 303 }
307 }, 304 },
308 305
309 //......................................................................... 306 //.........................................................................
310 307
311 'tooltips': function () { 308 'tooltips': function () {
312 return this._tooltips; 309 return this._tooltips;
313 }, 310 },
314 311
315 //......................................................................... 312 //.........................................................................
316 313
317 'showTooltipOnFocus': function (aTooltip, anEvent) { 314 'showTooltipOnFocus': function (aTooltip, anEvent) {
318 MochiKit.Async.callLater(0.5, MochiKit.Base.method(this.tooltips()[aTooltip], 'show')); 315 MochiKit.Async.callLater(0.5, MochiKit.Base.method(this.tooltips()[aTooltip], 'show'));
319 }, 316 },
320 317
321 //......................................................................... 318 //.........................................................................
322 319
323 'hideTooltipOnBlur': function (aTooltip, anEvent) { 320 'hideTooltipOnBlur': function (aTooltip, anEvent) {
324 this.tooltips()[aTooltip].hide(); 321 this.tooltips()[aTooltip].hide();
325 }, 322 },
326 323
327 //------------------------------------------------------------------------- 324 //-------------------------------------------------------------------------
328 325
329 'displayElement': function() { 326 'displayElement': function() {
330 return this.getElement('panel'); 327 return this.getElement('panel');
331 }, 328 },
332 329
333 //------------------------------------------------------------------------- 330 //-------------------------------------------------------------------------
334 331
335 'fieldComponents': function () { 332 'fieldComponents': function () {
336 return this._fieldComponents; 333 return this._fieldComponents;
337 }, 334 },
338 335
339 //------------------------------------------------------------------------- 336 //-------------------------------------------------------------------------
340 337
341 'directLoginComponents': function () { 338 'directLoginComponents': function () {
342 return this._directLoginComponents; 339 return this._directLoginComponents;
343 }, 340 },
344 341
345 //------------------------------------------------------------------------- 342 //-------------------------------------------------------------------------
346 343
347 'hintMode': function () { 344 'hintMode': function () {
348 return this._hintMode; 345 return this._hintMode;
349 }, 346 },
350 347
351 'setHintMode': function (aValue) { 348 'setHintMode': function (aValue) {
352 if (this._hintMode != aValue) { 349 if (this._hintMode != aValue) {
353 this._hintMode = aValue; 350 this._hintMode = aValue;
354 351
355 this.updateAllTooltipsEnabledMode(this._hintMode); 352 this.updateAllTooltipsEnabledMode(this._hintMode);
356 // if (this._hintMode == 'ON') { 353 // if (this._hintMode == 'ON') {
357 // this.enableHints(); 354 // this.enableHints();
358 // } 355 // }
359 } 356 }
360 }, 357 },
361 358
362 //------------------------------------------------------------------------- 359 //-------------------------------------------------------------------------
363 360
364 'focusOnNewFieldLabel': function () { 361 'focusOnNewFieldLabel': function () {
365 this.getElement('newFieldLabel').focus(); 362 this.getElement('newFieldLabel').focus();
366 }, 363 },
367 364
368 //========================================================================= 365 //=========================================================================
369 366
370 'isSavingEnabled': function () { 367 'isSavingEnabled': function () {
371 return this._isSavingEnabled; 368 return this._isSavingEnabled;
372 }, 369 },
373 370
374 'setShouldEnableSaving': function (aValue) { 371 'setShouldEnableSaving': function (aValue) {
375 this._isSavingEnabled = aValue || this.newFieldHasPendingChanges(); 372 this._isSavingEnabled = aValue || this.newFieldHasPendingChanges();
376 373
377 if (this._isSavingEnabled == true) { 374 if (this._isSavingEnabled == true) {
378 MochiKit.DOM.addElementClass(this.getElement('panel'), 'hasPendingChanges'); 375 MochiKit.DOM.addElementClass(this.getElement('panel'), 'hasPendingChanges');
379 MochiKit.DOM.removeElementClass(this.getId('saveButton'), 'disabled'); 376 MochiKit.DOM.removeElementClass(this.getId('saveButton'), 'disabled');
380 } else { 377 } else {
381 MochiKit.DOM.removeElementClass(this.getElement('panel'), 'hasPendingChanges'); 378 MochiKit.DOM.removeElementClass(this.getElement('panel'), 'hasPendingChanges');
382 MochiKit.DOM.addElementClass(this.getId('saveButton'), 'disabled'); 379 MochiKit.DOM.addElementClass(this.getId('saveButton'), 'disabled');
383 } 380 }
384 }, 381 },
385 382
386 //========================================================================= 383 //=========================================================================
387 384
388 'title': function () { 385 'title': function () {
389 return this.getElement('title').value; 386 return this.getElement('title').value;
390 }, 387 },
391 388
392 'setTitle': function (aValue) { 389 'setTitle': function (aValue) {
393 this.renderTitle(aValue); 390 this.renderTitle(aValue);
394 }, 391 },
395 392
396 //------------------------------------------------------------------------- 393 //-------------------------------------------------------------------------
397 394
398 'renderTitle': function (aValue) { 395 'renderTitle': function (aValue) {
399 this.getElement('title').value = Clipperz.Base.sanitizeString(aValue); 396 this.getElement('title').value = Clipperz.Base.sanitizeString(aValue);
400 }, 397 },
401 398
402 //------------------------------------------------------------------------- 399 //-------------------------------------------------------------------------
403 400
404 'setFocusOnTitleField': function () { 401 'setFocusOnTitleField': function () {
405 this.getElement('title').focus(); 402 this.getElement('title').focus();
406 }, 403 },
407 404
408 //------------------------------------------------------------------------- 405 //-------------------------------------------------------------------------
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 126c5b1..2e61f5f 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/CardDialogRecordDirectLoginComponent.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/CardDialogRecordDirectLoginComponent.js
@@ -1,182 +1,179 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 26Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
30 27
31Clipperz.PM.UI.Web.Components.CardDialogRecordDirectLoginComponent = function(args) { 28Clipperz.PM.UI.Web.Components.CardDialogRecordDirectLoginComponent = function(args) {
32 args = args || {}; 29 args = args || {};
33 30
34 Clipperz.PM.UI.Web.Components.CardDialogRecordDirectLoginComponent.superclass.constructor.apply(this, arguments); 31 Clipperz.PM.UI.Web.Components.CardDialogRecordDirectLoginComponent.superclass.constructor.apply(this, arguments);
35 32
36 this._reference = args.reference|| Clipperz.Base.exception.raise('MandatoryParameter'); 33 this._reference = args.reference|| Clipperz.Base.exception.raise('MandatoryParameter');
37 this._faviconComponent = null; 34 this._faviconComponent = null;
38 35
39 return this; 36 return this;
40} 37}
41 38
42//============================================================================= 39//=============================================================================
43 40
44Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.CardDialogRecordDirectLoginComponent, Clipperz.PM.UI.Common.Components.BaseComponent, { 41Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.CardDialogRecordDirectLoginComponent, Clipperz.PM.UI.Common.Components.BaseComponent, {
45 42
46 //------------------------------------------------------------------------- 43 //-------------------------------------------------------------------------
47 44
48 'toString': function () { 45 'toString': function () {
49 return "Clipperz.PM.UI.Web.Components.CardDialogRecordDirectLoginComponent component"; 46 return "Clipperz.PM.UI.Web.Components.CardDialogRecordDirectLoginComponent component";
50 }, 47 },
51 48
52 //------------------------------------------------------------------------- 49 //-------------------------------------------------------------------------
53 50
54 'reference': function () { 51 'reference': function () {
55 return this._reference; 52 return this._reference;
56 }, 53 },
57 54
58 //------------------------------------------------------------------------- 55 //-------------------------------------------------------------------------
59 56
60 'renderSelf': function() { 57 'renderSelf': function() {
61//console.log(">>> CardDialogRecordDirectLoginComponent.renderSelf"); 58//console.log(">>> CardDialogRecordDirectLoginComponent.renderSelf");
62 this.append(this.element(), [ 59 this.append(this.element(), [
63 {tag:'div', cls:'cardDialogRecordDirectLoginComponent_favicon', children:[ 60 {tag:'div', cls:'cardDialogRecordDirectLoginComponent_favicon', children:[
64 {tag:'img', cls:'favicon', id:this.getId('favicon')} 61 {tag:'img', cls:'favicon', id:this.getId('favicon')}
65 ]}, 62 ]},
66 {tag:'div', cls:'cardDialogRecordDirectLoginComponent_label', children:[ 63 {tag:'div', cls:'cardDialogRecordDirectLoginComponent_label', children:[
67 {tag:'input', id:this.getId('label'), type:'text'} 64 {tag:'input', id:this.getId('label'), type:'text'}
68 ]}, 65 ]},
69 {tag:'div', cls:'open', children:[ 66 {tag:'div', cls:'open', children:[
70 {tag:'span', children:[ 67 {tag:'span', children:[
71 {tag:'a', href:'open', id:this.getId('open'), html:'&nbsp;'} 68 {tag:'a', href:'open', id:this.getId('open'), html:'&nbsp;'}
72 ]} 69 ]}
73 ]}, 70 ]},
74 {tag:'div', cls:'edit', children:[ 71 {tag:'div', cls:'edit', children:[
75 {tag:'span', children:[ 72 {tag:'span', children:[
76 {tag:'a', href:'edit', id:this.getId('edit'), html:"edit"} 73 {tag:'a', href:'edit', id:this.getId('edit'), html:"edit"}
77 ]} 74 ]}
78 ]}, 75 ]},
79 {tag:'div', cls:'delete', children:[ 76 {tag:'div', cls:'delete', children:[
80 {tag:'span', children:[ 77 {tag:'span', children:[
81 {tag:'a', href:'delete', id:this.getId('delete'), html:"delete"} 78 {tag:'a', href:'delete', id:this.getId('delete'), html:"delete"}
82 ]} 79 ]}
83 ]} 80 ]}
84/* 81/*
85 {tag:'td', cls:'fieldState'}, 82 {tag:'td', cls:'fieldState'},
86 {tag:'td', cls:'fieldLabel', children:[ 83 {tag:'td', cls:'fieldLabel', children:[
87 {tag:'input', cls:'label', id:this.getId('label')} 84 {tag:'input', cls:'label', id:this.getId('label')}
88 ]}, 85 ]},
89 {tag:'td', cls:'fieldLock', children:[ 86 {tag:'td', cls:'fieldLock', children:[
90 {tag:'div', cls:'unlocked', id:this.getId('isHidden')} 87 {tag:'div', cls:'unlocked', id:this.getId('isHidden')}
91 ]}, 88 ]},
92 {tag:'td', cls:'fieldValue', children:[ 89 {tag:'td', cls:'fieldValue', children:[
93 {tag:'div', cls:'unlocked', id:this.getId('valueWrapper'), children:[ 90 {tag:'div', cls:'unlocked', id:this.getId('valueWrapper'), children:[
94 {tag:'input', type:'text', cls:'value', id:this.getId('value')} 91 {tag:'input', type:'text', cls:'value', id:this.getId('value')}
95 ]} 92 ]}
96 ]}, 93 ]},
97 {tag:'td', cls:'fieldAddDelete', children:[ 94 {tag:'td', cls:'fieldAddDelete', children:[
98 {tag:'div', cls:'delete', children:[ 95 {tag:'div', cls:'delete', children:[
99 {tag:'span', children:[ 96 {tag:'span', children:[
100 {tag:'a', href:'#', id:this.getId('delete'), html:"delete"} 97 {tag:'a', href:'#', id:this.getId('delete'), html:"delete"}
101 ]} 98 ]}
102 ]} 99 ]}
103 ]} 100 ]}
104*/ 101*/
105 ]); 102 ]);
106 103
107 MochiKit.Signal.connect(this.getId('label'), 'onkeyup',MochiKit.Base.partial(MochiKit.Signal.signal, this, 'changedValue')); 104 MochiKit.Signal.connect(this.getId('label'), 'onkeyup',MochiKit.Base.partial(MochiKit.Signal.signal, this, 'changedValue'));
108 MochiKit.Signal.connect(this.getId('open'), 'onclick',this, 'openDirectLogin'); 105 MochiKit.Signal.connect(this.getId('open'), 'onclick',this, 'openDirectLogin');
109 MochiKit.Signal.connect(this.getId('edit'), 'onclick',this, 'editDirectLogin'); 106 MochiKit.Signal.connect(this.getId('edit'), 'onclick',this, 'editDirectLogin');
110 MochiKit.Signal.connect(this.getId('delete'), 'onclick',this, 'deleteDirectLogin'); 107 MochiKit.Signal.connect(this.getId('delete'), 'onclick',this, 'deleteDirectLogin');
111 }, 108 },
112 109
113 //------------------------------------------------------------------------- 110 //-------------------------------------------------------------------------
114 111
115 'shouldShowElementWhileRendering': function () { 112 'shouldShowElementWhileRendering': function () {
116 return false; 113 return false;
117 }, 114 },
118 115
119 //------------------------------------------------------------------------- 116 //-------------------------------------------------------------------------
120 117
121 'faviconComponent': function () { 118 'faviconComponent': function () {
122 if (this._faviconComponent == null) { 119 if (this._faviconComponent == null) {
123//console.log("created the FAVICON component"); 120//console.log("created the FAVICON component");
124 this._faviconComponent = new Clipperz.PM.UI.Common.Components.FaviconComponent({element:this.getId('favicon')}); 121 this._faviconComponent = new Clipperz.PM.UI.Common.Components.FaviconComponent({element:this.getId('favicon')});
125 } 122 }
126 123
127 return this._faviconComponent; 124 return this._faviconComponent;
128 }, 125 },
129 126
130 //========================================================================= 127 //=========================================================================
131 128
132 'label': function () { 129 'label': function () {
133 return this.getElement('label').value; 130 return this.getElement('label').value;
134 }, 131 },
135 132
136 'setLabel': function (aValue) { 133 'setLabel': function (aValue) {
137 this.getElement('label').value = Clipperz.Base.sanitizeString(aValue); 134 this.getElement('label').value = Clipperz.Base.sanitizeString(aValue);
138 }, 135 },
139 136
140 //------------------------------------------------------------------------- 137 //-------------------------------------------------------------------------
141 138
142 'favicon': function () { 139 'favicon': function () {
143 // return this.getElement('favicon').src; 140 // return this.getElement('favicon').src;
144 return this.faviconComponent().src(); 141 return this.faviconComponent().src();
145 }, 142 },
146 143
147 'setFavicon': function (aValue) { 144 'setFavicon': function (aValue) {
148 // this.getElement('favicon').src = Clipperz.Base.sanitizeString(aValue); 145 // this.getElement('favicon').src = Clipperz.Base.sanitizeString(aValue);
149 this.faviconComponent().setSrc(Clipperz.Base.sanitizeString(aValue)); 146 this.faviconComponent().setSrc(Clipperz.Base.sanitizeString(aValue));
150 }, 147 },
151 148
152 //========================================================================= 149 //=========================================================================
153 150
154 'openDirectLogin': function (anEvent) { 151 'openDirectLogin': function (anEvent) {
155 anEvent.preventDefault(); 152 anEvent.preventDefault();
156 153
157 MochiKit.Signal.signal(this, 'openDirectLogin', this.reference()); 154 MochiKit.Signal.signal(this, 'openDirectLogin', this.reference());
158 }, 155 },
159 156
160 //------------------------------------------------------------------------- 157 //-------------------------------------------------------------------------
161 158
162 'editDirectLogin': function (anEvent) { 159 'editDirectLogin': function (anEvent) {
163 anEvent.preventDefault(); 160 anEvent.preventDefault();
164 161
165 MochiKit.Signal.signal(this, 'editDirectLogin', this.reference()); 162 MochiKit.Signal.signal(this, 'editDirectLogin', this.reference());
166//console.log("EDIT DIRECT LOGIN"); 163//console.log("EDIT DIRECT LOGIN");
167 }, 164 },
168 165
169 //------------------------------------------------------------------------- 166 //-------------------------------------------------------------------------
170 167
171 'deleteDirectLogin': function (anEvent) { 168 'deleteDirectLogin': function (anEvent) {
172 anEvent.preventDefault(); 169 anEvent.preventDefault();
173 170
174 MochiKit.Signal.signal(this, 'deleteDirectLogin', this.reference()); 171 MochiKit.Signal.signal(this, 'deleteDirectLogin', this.reference());
175//console.log("DELETE DIRECT LOGIN"); 172//console.log("DELETE DIRECT LOGIN");
176 }, 173 },
177 174
178 175
179 176
180 //========================================================================= 177 //=========================================================================
181 __syntaxFix__: "syntax fix" 178 __syntaxFix__: "syntax fix"
182}); 179});
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 c1a7c13..b58062c 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/CardDialogRecordFieldComponent.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/CardDialogRecordFieldComponent.js
@@ -1,190 +1,187 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 26Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
30 27
31Clipperz.PM.UI.Web.Components.CardDialogRecordFieldComponent = function(args) { 28Clipperz.PM.UI.Web.Components.CardDialogRecordFieldComponent = function(args) {
32 args = args || {}; 29 args = args || {};
33 30
34 Clipperz.PM.UI.Web.Components.CardDialogRecordFieldComponent.superclass.constructor.apply(this, arguments); 31 Clipperz.PM.UI.Web.Components.CardDialogRecordFieldComponent.superclass.constructor.apply(this, arguments);
35 32
36 this._reference = args.reference|| Clipperz.Base.exception.raise('MandatoryParameter'); 33 this._reference = args.reference|| Clipperz.Base.exception.raise('MandatoryParameter');
37 this._actionType = null; 34 this._actionType = null;
38 35
39 return this; 36 return this;
40} 37}
41 38
42//============================================================================= 39//=============================================================================
43 40
44Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.CardDialogRecordFieldComponent, Clipperz.PM.UI.Common.Components.BaseComponent, { 41Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.CardDialogRecordFieldComponent, Clipperz.PM.UI.Common.Components.BaseComponent, {
45 42
46 //------------------------------------------------------------------------- 43 //-------------------------------------------------------------------------
47 44
48 'toString': function () { 45 'toString': function () {
49 return "Clipperz.PM.UI.Web.Components.CardDialogRecordFieldComponent component"; 46 return "Clipperz.PM.UI.Web.Components.CardDialogRecordFieldComponent component";
50 }, 47 },
51 48
52 //------------------------------------------------------------------------- 49 //-------------------------------------------------------------------------
53 50
54 'renderSelf': function() { 51 'renderSelf': function() {
55 this.append(this.element(), [ 52 this.append(this.element(), [
56 {tag:'td', cls:'fieldState'}, 53 {tag:'td', cls:'fieldState'},
57 {tag:'td', cls:'fieldLabel', children:[ 54 {tag:'td', cls:'fieldLabel', children:[
58 {tag:'input', cls:'label', id:this.getId('label')} 55 {tag:'input', cls:'label', id:this.getId('label')}
59 ]}, 56 ]},
60 {tag:'td', cls:'fieldLock', children:[ 57 {tag:'td', cls:'fieldLock', children:[
61 {tag:'div', cls:'unlocked', id:this.getId('isHidden')} 58 {tag:'div', cls:'unlocked', id:this.getId('isHidden')}
62 ]}, 59 ]},
63 {tag:'td', cls:'fieldValue', children:[ 60 {tag:'td', cls:'fieldValue', children:[
64 {tag:'div', cls:'unlocked', id:this.getId('valueWrapper'), children:[ 61 {tag:'div', cls:'unlocked', id:this.getId('valueWrapper'), children:[
65 {tag:'input', type:'text', cls:'value', id:this.getId('value')} 62 {tag:'input', type:'text', cls:'value', id:this.getId('value')}
66 ]} 63 ]}
67 ]}, 64 ]},
68 {tag:'td', cls:'fieldAction', children:[ 65 {tag:'td', cls:'fieldAction', children:[
69 {tag:'a', href:'#', id:this.getId('actionLink'), html:'&nbsp;'} 66 {tag:'a', href:'#', id:this.getId('actionLink'), html:'&nbsp;'}
70 ]}, 67 ]},
71 {tag:'td', cls:'fieldAddDelete', children:[ 68 {tag:'td', cls:'fieldAddDelete', children:[
72 {tag:'div', cls:'delete', children:[ 69 {tag:'div', cls:'delete', children:[
73 {tag:'span', children:[ 70 {tag:'span', children:[
74 {tag:'a', href:'#', id:this.getId('delete'), html:"delete"} 71 {tag:'a', href:'#', id:this.getId('delete'), html:"delete"}
75 ]} 72 ]}
76 ]} 73 ]}
77 ]} 74 ]}
78 ]); 75 ]);
79 76
80 MochiKit.Signal.connect(this.getId('label'), 'onkeyup',MochiKit.Base.partial(MochiKit.Signal.signal, this, 'changedValue')); 77 MochiKit.Signal.connect(this.getId('label'), 'onkeyup',MochiKit.Base.partial(MochiKit.Signal.signal, this, 'changedValue'));
81 MochiKit.Signal.connect(this.getId('isHidden'), 'onclick',this, 'toggleIsHidden'); 78 MochiKit.Signal.connect(this.getId('isHidden'), 'onclick',this, 'toggleIsHidden');
82 MochiKit.Signal.connect(this.getId('value'), 'onkeyup',MochiKit.Base.partial(MochiKit.Signal.signal, this, 'changedValue')); 79 MochiKit.Signal.connect(this.getId('value'), 'onkeyup',MochiKit.Base.partial(MochiKit.Signal.signal, this, 'changedValue'));
83 MochiKit.Signal.connect(this.getId('actionLink'), 'onclick',this, 'handleActionLink'); 80 MochiKit.Signal.connect(this.getId('actionLink'), 'onclick',this, 'handleActionLink');
84 MochiKit.Signal.connect(this.getId('delete'), 'onclick',this, 'deleteField'); 81 MochiKit.Signal.connect(this.getId('delete'), 'onclick',this, 'deleteField');
85 // MochiKit.Signal.connect(this.getId('delete'), 'onclick',MochiKit.Base.partial(MochiKit.Signal.signal, this, 'deleteField', this.reference())); 82 // MochiKit.Signal.connect(this.getId('delete'), 'onclick',MochiKit.Base.partial(MochiKit.Signal.signal, this, 'deleteField', this.reference()));
86 }, 83 },
87 84
88 //------------------------------------------------------------------------- 85 //-------------------------------------------------------------------------
89 86
90 'shouldShowElementWhileRendering': function () { 87 'shouldShowElementWhileRendering': function () {
91 return false; 88 return false;
92 }, 89 },
93 90
94 //========================================================================= 91 //=========================================================================
95 92
96 'reference': function () { 93 'reference': function () {
97 return this._reference; 94 return this._reference;
98 }, 95 },
99 96
100 //========================================================================= 97 //=========================================================================
101 98
102 'label': function () { 99 'label': function () {
103 return this.getElement('label').value; 100 return this.getElement('label').value;
104 }, 101 },
105 102
106 'setLabel': function (aValue) { 103 'setLabel': function (aValue) {
107 // this.getElement('label').value = Clipperz.Base.sanitizeString(aValue); 104 // this.getElement('label').value = Clipperz.Base.sanitizeString(aValue);
108 this.getElement('label').value = aValue; 105 this.getElement('label').value = aValue;
109 }, 106 },
110 107
111 //========================================================================= 108 //=========================================================================
112 109
113 'value': function () { 110 'value': function () {
114 return this.getElement('value').value; 111 return this.getElement('value').value;
115 }, 112 },
116 113
117 'setValue': function (aValue) { 114 'setValue': function (aValue) {
118 // this.getElement('value').value = Clipperz.Base.sanitizeString(aValue); 115 // this.getElement('value').value = Clipperz.Base.sanitizeString(aValue);
119 this.getElement('value').value = aValue; 116 this.getElement('value').value = aValue;
120 }, 117 },
121 118
122 //------------------------------------------------------------------------- 119 //-------------------------------------------------------------------------
123 120
124 'actionType': function () { 121 'actionType': function () {
125 return this._actionType; 122 return this._actionType;
126 }, 123 },
127 124
128 'setActionType': function (anActionType) { 125 'setActionType': function (anActionType) {
129 this._actionType = anActionType; 126 this._actionType = anActionType;
130 127
131 switch (this._actionType) { 128 switch (this._actionType) {
132 case 'NONE': 129 case 'NONE':
133 MochiKit.Style.hideElement(this.getId('actionLink')); 130 MochiKit.Style.hideElement(this.getId('actionLink'));
134 MochiKit.DOM.setElementClass(this.getId('actionLink'), ''); 131 MochiKit.DOM.setElementClass(this.getId('actionLink'), '');
135 break; 132 break;
136 case 'URL': 133 case 'URL':
137 MochiKit.Style.showElement(this.getId('actionLink')); 134 MochiKit.Style.showElement(this.getId('actionLink'));
138 MochiKit.DOM.setElementClass(this.getId('actionLink'), 'url'); 135 MochiKit.DOM.setElementClass(this.getId('actionLink'), 'url');
139 break; 136 break;
140 case 'EMAIL': 137 case 'EMAIL':
141 MochiKit.Style.showElement(this.getId('actionLink')); 138 MochiKit.Style.showElement(this.getId('actionLink'));
142 MochiKit.DOM.setElementClass(this.getId('actionLink'), 'email'); 139 MochiKit.DOM.setElementClass(this.getId('actionLink'), 'email');
143 break; 140 break;
144 case 'PASSWORD': 141 case 'PASSWORD':
145 MochiKit.Style.showElement(this.getId('actionLink')); 142 MochiKit.Style.showElement(this.getId('actionLink'));
146 MochiKit.DOM.setElementClass(this.getId('actionLink'), 'password'); 143 MochiKit.DOM.setElementClass(this.getId('actionLink'), 'password');
147 break; 144 break;
148 } 145 }
149 }, 146 },
150 147
151 //========================================================================= 148 //=========================================================================
152 149
153 'isHidden': function () { 150 'isHidden': function () {
154 // return this.getElement('value').value; 151 // return this.getElement('value').value;
155 return MochiKit.DOM.hasElementClass(this.getElement('isHidden'), 'locked'); 152 return MochiKit.DOM.hasElementClass(this.getElement('isHidden'), 'locked');
156 }, 153 },
157 154
158 'setIsHidden': function (aValue) { 155 'setIsHidden': function (aValue) {
159 // this.getElement('value').value = Clipperz.Base.sanitizeString(aValue); 156 // this.getElement('value').value = Clipperz.Base.sanitizeString(aValue);
160 MochiKit.DOM.setElementClass(this.getElement('isHidden'), (aValue ? 'locked': 'unlocked')); 157 MochiKit.DOM.setElementClass(this.getElement('isHidden'), (aValue ? 'locked': 'unlocked'));
161 MochiKit.DOM.setElementClass(this.getElement('valueWrapper'), (aValue ? 'locked': 'unlocked')); 158 MochiKit.DOM.setElementClass(this.getElement('valueWrapper'), (aValue ? 'locked': 'unlocked'));
162 }, 159 },
163 160
164 'toggleIsHidden': function (anEvent) { 161 'toggleIsHidden': function (anEvent) {
165 anEvent.preventDefault(); 162 anEvent.preventDefault();
166 163
167 this.setIsHidden(! this.isHidden()); 164 this.setIsHidden(! this.isHidden());
168 MochiKit.Signal.signal(this, 'changedValue'); 165 MochiKit.Signal.signal(this, 'changedValue');
169 }, 166 },
170 167
171 //========================================================================= 168 //=========================================================================
172 169
173 'handleActionLink': function (anEvent) { 170 'handleActionLink': function (anEvent) {
174 anEvent.preventDefault(); 171 anEvent.preventDefault();
175 172
176//console.log("ACTION LINK - " + this.actionType()); 173//console.log("ACTION LINK - " + this.actionType());
177 MochiKit.Signal.signal(this, 'performAction', this.reference(), anEvent.target()); 174 MochiKit.Signal.signal(this, 'performAction', this.reference(), anEvent.target());
178 }, 175 },
179 176
180 //========================================================================= 177 //=========================================================================
181 178
182 'deleteField': function (anEvent) { 179 'deleteField': function (anEvent) {
183 anEvent.preventDefault(); 180 anEvent.preventDefault();
184 181
185 MochiKit.Signal.signal(this, 'deleteField', this.reference()); 182 MochiKit.Signal.signal(this, 'deleteField', this.reference());
186 }, 183 },
187 184
188 //========================================================================= 185 //=========================================================================
189 __syntaxFix__: "syntax fix" 186 __syntaxFix__: "syntax fix"
190}); 187});
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 bfc7e61..391c379 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/ColumnManager.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/ColumnManager.js
@@ -1,203 +1,200 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 26Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
30 27
31//############################################################################# 28//#############################################################################
32 29
33Clipperz.PM.UI.Web.Components.ColumnManager = function(args) { 30Clipperz.PM.UI.Web.Components.ColumnManager = function(args) {
34 args = args || {}; 31 args = args || {};
35 Clipperz.PM.UI.Web.Components.ColumnManager.superclass.constructor.call(this, args); 32 Clipperz.PM.UI.Web.Components.ColumnManager.superclass.constructor.call(this, args);
36 33
37 this._name = args.name || Clipperz.Base.exception.raise('MandatoryParameter'); 34 this._name = args.name || Clipperz.Base.exception.raise('MandatoryParameter');
38 this._selector = args.selector|| Clipperz.Base.exception.raise('MandatoryParameter');; 35 this._selector = args.selector|| Clipperz.Base.exception.raise('MandatoryParameter');;
39 this._label = args.label || null; 36 this._label = args.label || null;
40 this._isSortable = args.sortable|| false; 37 this._isSortable = args.sortable|| false;
41 this._comparator = args.comparator|| null; 38 this._comparator = args.comparator|| null;
42 this._sorted = args.sorted || 'UNSORTED'; //'ASCENDING' | 'DESCENDING' | 'UNSORTED' 39 this._sorted = args.sorted || 'UNSORTED'; //'ASCENDING' | 'DESCENDING' | 'UNSORTED'
43 this._cssClass = args.cssClass|| ''; 40 this._cssClass = args.cssClass|| '';
44 41
45 this._signalIdentifiers = []; 42 this._signalIdentifiers = [];
46 43
47 return this; 44 return this;
48} 45}
49 46
50//============================================================================= 47//=============================================================================
51 48
52Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.ColumnManager, Clipperz.PM.UI.Common.Components.BaseComponent, { 49Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.ColumnManager, Clipperz.PM.UI.Common.Components.BaseComponent, {
53 50
54 'toString': function () { 51 'toString': function () {
55 return "Clipperz.PM.UI.Web.Components.ColumnManager - " + this._name; 52 return "Clipperz.PM.UI.Web.Components.ColumnManager - " + this._name;
56 }, 53 },
57 54
58 'name': function () { 55 'name': function () {
59 return this._name; 56 return this._name;
60 }, 57 },
61 58
62 'label': function () { 59 'label': function () {
63 return this._label; 60 return this._label;
64 }, 61 },
65 62
66 'selector': function () { 63 'selector': function () {
67 return this._selector; 64 return this._selector;
68 }, 65 },
69 66
70 'comparator': function() { 67 'comparator': function() {
71 return this._comparator; 68 return this._comparator;
72 }, 69 },
73 70
74 'cssClass': function() { 71 'cssClass': function() {
75 return this._cssClass; 72 return this._cssClass;
76 }, 73 },
77 74
78 //------------------------------------------------------------------------- 75 //-------------------------------------------------------------------------
79 76
80 'isSortable': function () { 77 'isSortable': function () {
81 return this._isSortable; 78 return this._isSortable;
82 }, 79 },
83 80
84 //------------------------------------------------------------------------- 81 //-------------------------------------------------------------------------
85 82
86 'sorted': function () { 83 'sorted': function () {
87 return this._sorted; 84 return this._sorted;
88 }, 85 },
89 86
90 'isSorted': function () { 87 'isSorted': function () {
91 return (this.sorted() != 'UNSORTED'); 88 return (this.sorted() != 'UNSORTED');
92 }, 89 },
93 90
94 'setSorted': function(aValue) { 91 'setSorted': function(aValue) {
95 this._sorted = aValue; 92 this._sorted = aValue;
96 this.updateSortIcon(); 93 this.updateSortIcon();
97 }, 94 },
98 95
99 //------------------------------------------------------------------------- 96 //-------------------------------------------------------------------------
100 97
101 'signalIdentifiers': function () { 98 'signalIdentifiers': function () {
102 return this._signalIdentifiers; 99 return this._signalIdentifiers;
103 }, 100 },
104 101
105 'resetSignalIdentifiers': function () { 102 'resetSignalIdentifiers': function () {
106 this._signalIdentifiers = []; 103 this._signalIdentifiers = [];
107 }, 104 },
108 105
109 //------------------------------------------------------------------------- 106 //-------------------------------------------------------------------------
110 107
111 'disconnectRowsSignals': function () { 108 'disconnectRowsSignals': function () {
112 MochiKit.Base.map(MochiKit.Signal.disconnect, this.signalIdentifiers()); 109 MochiKit.Base.map(MochiKit.Signal.disconnect, this.signalIdentifiers());
113 this.resetSignalIdentifiers(); 110 this.resetSignalIdentifiers();
114 }, 111 },
115 112
116 'connectEvent': function () { 113 'connectEvent': function () {
117 var ident; 114 var ident;
118 115
119 ident = MochiKit.Signal.connect.apply(null, arguments); 116 ident = MochiKit.Signal.connect.apply(null, arguments);
120 this.signalIdentifiers().push(ident); 117 this.signalIdentifiers().push(ident);
121 }, 118 },
122 119
123 //------------------------------------------------------------------------- 120 //-------------------------------------------------------------------------
124 121
125 'renderHeader': function(aTRElement) { 122 'renderHeader': function(aTRElement) {
126 varthElement; 123 varthElement;
127 124
128 thElement = Clipperz.DOM.Helper.append(aTRElement, {tag:'th', cls:(this.cssClass() + 'TH'), id:this.getId('sortLink'), children:[ 125 thElement = Clipperz.DOM.Helper.append(aTRElement, {tag:'th', cls:(this.cssClass() + 'TH'), id:this.getId('sortLink'), children:[
129 {tag:'span', html:this.label() ? this.label() : '&nbsp;'} 126 {tag:'span', html:this.label() ? this.label() : '&nbsp;'}
130 ]}); 127 ]});
131 128
132 if (this.isSortable()) { 129 if (this.isSortable()) {
133 Clipperz.DOM.Helper.append(thElement, {tag:'span', cls:'sortable', children:[ 130 Clipperz.DOM.Helper.append(thElement, {tag:'span', cls:'sortable', children:[
134 {tag:'a', href:'#'/*, id:this.getId('sortLink')*/, html:'&nbsp;'} 131 {tag:'a', href:'#'/*, id:this.getId('sortLink')*/, html:'&nbsp;'}
135 ]}); 132 ]});
136 133
137 MochiKit.DOM.addElementClass(thElement, 'sortable'); 134 MochiKit.DOM.addElementClass(thElement, 'sortable');
138 MochiKit.Signal.connect(thElement, 'onclick', this, 'handleClickOnSortingCriteria'); 135 MochiKit.Signal.connect(thElement, 'onclick', this, 'handleClickOnSortingCriteria');
139 }; 136 };
140 137
141 this.updateSortIcon(); 138 this.updateSortIcon();
142 }, 139 },
143 140
144 //------------------------------------------------------------------------- 141 //-------------------------------------------------------------------------
145 142
146 'toggleSorting': function () { 143 'toggleSorting': function () {
147 var result; 144 var result;
148 switch (this.sorted()) { 145 switch (this.sorted()) {
149 case 'UNSORTED': 146 case 'UNSORTED':
150 result = 'ASCENDING'; 147 result = 'ASCENDING';
151 break; 148 break;
152 case 'ASCENDING': 149 case 'ASCENDING':
153 result = 'DESCENDING'; 150 result = 'DESCENDING';
154 break; 151 break;
155 case 'DESCENDING': 152 case 'DESCENDING':
156 result = 'ASCENDING'; 153 result = 'ASCENDING';
157 break; 154 break;
158 default: 155 default:
159 result = 'UNSORTED'; 156 result = 'UNSORTED';
160 break; 157 break;
161 } 158 }
162 159
163 this.setSorted(result); 160 this.setSorted(result);
164 161
165 return result; 162 return result;
166 }, 163 },
167 164
168 //------------------------------------------------------------------------- 165 //-------------------------------------------------------------------------
169 166
170 'sortElementClass': function () { 167 'sortElementClass': function () {
171 return this.sorted().toLowerCase(); 168 return this.sorted().toLowerCase();
172 }, 169 },
173 170
174 //------------------------------------------------------------------------- 171 //-------------------------------------------------------------------------
175 172
176 'updateSortIcon': function () { 173 'updateSortIcon': function () {
177 if (this.isSortable()) { 174 if (this.isSortable()) {
178 MochiKit.DOM.removeElementClass(this.getId('sortLink'), 'ascending'); 175 MochiKit.DOM.removeElementClass(this.getId('sortLink'), 'ascending');
179 MochiKit.DOM.removeElementClass(this.getId('sortLink'), 'descending'); 176 MochiKit.DOM.removeElementClass(this.getId('sortLink'), 'descending');
180 MochiKit.DOM.removeElementClass(this.getId('sortLink'), 'unsorted'); 177 MochiKit.DOM.removeElementClass(this.getId('sortLink'), 'unsorted');
181 178
182 MochiKit.DOM.addElementClass(this.getId('sortLink'), this.sortElementClass()); 179 MochiKit.DOM.addElementClass(this.getId('sortLink'), this.sortElementClass());
183 } 180 }
184 }, 181 },
185 182
186 //------------------------------------------------------------------------- 183 //-------------------------------------------------------------------------
187 184
188 'renderCell': function(aRowElement, anObject) { 185 'renderCell': function(aRowElement, anObject) {
189 Clipperz.DOM.Helper.append(aRowElement, {tag:'td', cls:this.cssClass(), children:[{tag:'span', html:anObject[this.name()]}]}); 186 Clipperz.DOM.Helper.append(aRowElement, {tag:'td', cls:this.cssClass(), children:[{tag:'span', html:anObject[this.name()]}]});
190 }, 187 },
191 188
192 //----------------------------------------------------- 189 //-----------------------------------------------------
193 190
194 'handleClickOnSortingCriteria': function (anEvent) { 191 'handleClickOnSortingCriteria': function (anEvent) {
195 anEvent.preventDefault(); 192 anEvent.preventDefault();
196 MochiKit.Signal.signal(this, 'sort', this); 193 MochiKit.Signal.signal(this, 'sort', this);
197 }, 194 },
198 195
199 //----------------------------------------------------- 196 //-----------------------------------------------------
200 '__syntax_fix__' : 'syntax fix' 197 '__syntax_fix__' : 'syntax fix'
201 198
202}); 199});
203 200
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 61d6ead..d3aa175 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/CreateNewCardSplashComponent.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/CreateNewCardSplashComponent.js
@@ -1,71 +1,68 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 26Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
30 27
31Clipperz.PM.UI.Web.Components.CreateNewCardSplashComponent = function(args) { 28Clipperz.PM.UI.Web.Components.CreateNewCardSplashComponent = function(args) {
32 args = args || {}; 29 args = args || {};
33 30
34 Clipperz.PM.UI.Web.Components.CreateNewCardSplashComponent.superclass.constructor.apply(this, arguments); 31 Clipperz.PM.UI.Web.Components.CreateNewCardSplashComponent.superclass.constructor.apply(this, arguments);
35 32
36 return this; 33 return this;
37} 34}
38 35
39//============================================================================= 36//=============================================================================
40 37
41Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.CreateNewCardSplashComponent, Clipperz.PM.UI.Common.Components.BaseComponent, { 38Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.CreateNewCardSplashComponent, Clipperz.PM.UI.Common.Components.BaseComponent, {
42 39
43 //------------------------------------------------------------------------- 40 //-------------------------------------------------------------------------
44 41
45 'toString': function () { 42 'toString': function () {
46 return "Clipperz.PM.UI.Web.Components.CreateNewCardSplashComponent component"; 43 return "Clipperz.PM.UI.Web.Components.CreateNewCardSplashComponent component";
47 }, 44 },
48 45
49 //------------------------------------------------------------------------- 46 //-------------------------------------------------------------------------
50 47
51 'renderSelf': function() { 48 'renderSelf': function() {
52 this.append(this.element(), [ 49 this.append(this.element(), [
53 {tag:'div', cls:'createNewCardSplash', id:this.getId('button'), children:[ 50 {tag:'div', cls:'createNewCardSplash', id:this.getId('button'), children:[
54 {tag:'span', html:"Create New Card"} 51 {tag:'span', html:"Create New Card"}
55 ]} 52 ]}
56 ]); 53 ]);
57 54
58 MochiKit.Signal.connect(this.getElement('button'), 'onclick', this, 'handleClick'); 55 MochiKit.Signal.connect(this.getElement('button'), 'onclick', this, 'handleClick');
59 }, 56 },
60 57
61 //------------------------------------------------------------------------- 58 //-------------------------------------------------------------------------
62 59
63 'handleClick': function (anEvent) { 60 'handleClick': function (anEvent) {
64 anEvent.preventDefault(); 61 anEvent.preventDefault();
65 MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'addCard', this.element()); 62 MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'addCard', this.element());
66 }, 63 },
67 64
68 //------------------------------------------------------------------------- 65 //-------------------------------------------------------------------------
69 66
70 __syntaxFix__: "syntax fix" 67 __syntaxFix__: "syntax fix"
71}); 68});
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 91d99e3..d2f1045 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DataPanel.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DataPanel.js
@@ -1,111 +1,108 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 26Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
30 27
31Clipperz.PM.UI.Web.Components.DataPanel = function(args) { 28Clipperz.PM.UI.Web.Components.DataPanel = function(args) {
32 args = args || {}; 29 args = args || {};
33 30
34 Clipperz.PM.UI.Web.Components.DataPanel.superclass.constructor.apply(this, arguments); 31 Clipperz.PM.UI.Web.Components.DataPanel.superclass.constructor.apply(this, arguments);
35 32
36 this._initiallySelectedTab = args.selected || 'OFFLINE_COPY'; 33 this._initiallySelectedTab = args.selected || 'OFFLINE_COPY';
37 this._tabPanelControllerConfiguration = { 34 this._tabPanelControllerConfiguration = {
38 'OFFLINE_COPY': { 35 'OFFLINE_COPY': {
39 tab:'offlineCopyTab', 36 tab:'offlineCopyTab',
40 panel:'offlineCopyPanel' 37 panel:'offlineCopyPanel'
41 }, 38 },
42 'SHARING': { 39 'SHARING': {
43 tab:'sharingTab', 40 tab:'sharingTab',
44 panel:'sharingPanel' 41 panel:'sharingPanel'
45 }, 42 },
46 'IMPORT': { 43 'IMPORT': {
47 tab:'importTab', 44 tab:'importTab',
48 panel:'importPanel' 45 panel:'importPanel'
49 }, 46 },
50 'EXPORT': { 47 'EXPORT': {
51 tab:'exportTab', 48 tab:'exportTab',
52 panel:'exportPanel' 49 panel:'exportPanel'
53 } 50 }
54 }; 51 };
55 52
56 return this; 53 return this;
57} 54}
58 55
59//============================================================================= 56//=============================================================================
60 57
61Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DataPanel, Clipperz.PM.UI.Common.Components.TabPanelComponent, { 58Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DataPanel, Clipperz.PM.UI.Common.Components.TabPanelComponent, {
62 59
63 //------------------------------------------------------------------------- 60 //-------------------------------------------------------------------------
64 61
65 'toString': function () { 62 'toString': function () {
66 return "Clipperz.PM.UI.Web.Components.DataPanel component"; 63 return "Clipperz.PM.UI.Web.Components.DataPanel component";
67 }, 64 },
68 65
69 //------------------------------------------------------------------------- 66 //-------------------------------------------------------------------------
70 67
71 'renderSelf': function(/*aContainer, aPosition*/) { 68 'renderSelf': function(/*aContainer, aPosition*/) {
72 this.append(this.element(), [ 69 this.append(this.element(), [
73 {tag:'div', cls:'header', children:[ 70 {tag:'div', cls:'header', children:[
74 {tag:'div', cls:'subPanelTabs', children:[ 71 {tag:'div', cls:'subPanelTabs', children:[
75 {tag:'ul', children:[ 72 {tag:'ul', children:[
76 {tag:'li', id:this.getId('offlineCopyTab'),children:[{tag:'a', href:'#', html:'Offline copy'}], cls:'first'}, 73 {tag:'li', id:this.getId('offlineCopyTab'),children:[{tag:'a', href:'#', html:'Offline copy'}], cls:'first'},
77 {tag:'li', id:this.getId('sharingTab'), children:[{tag:'a', href:'#', html:'Sharing'}]}, 74 {tag:'li', id:this.getId('sharingTab'), children:[{tag:'a', href:'#', html:'Sharing'}]},
78 {tag:'li', id:this.getId('importTab'), children:[{tag:'a', href:'#', html:'Import'}]}, 75 {tag:'li', id:this.getId('importTab'), children:[{tag:'a', href:'#', html:'Import'}]},
79 {tag:'li', id:this.getId('exportTab'), children:[{tag:'a', href:'#', html:'Export'}]} 76 {tag:'li', id:this.getId('exportTab'), children:[{tag:'a', href:'#', html:'Export'}]}
80 ]} 77 ]}
81 ]} 78 ]}
82 ]}, 79 ]},
83 {tag:'div', cls:'body', children:[ 80 {tag:'div', cls:'body', children:[
84 {tag:'div', cls:'accountPanel', children:[ 81 {tag:'div', cls:'accountPanel', children:[
85 {tag:'div', cls:'subPanelContent', children:[ 82 {tag:'div', cls:'subPanelContent', children:[
86 {tag:'ul', children:[ 83 {tag:'ul', children:[
87 {tag:'li', id:this.getId('offlineCopyPanel'),children:[ 84 {tag:'li', id:this.getId('offlineCopyPanel'),children:[
88 {tag:'h3', html:"Offline copy"} 85 {tag:'h3', html:"Offline copy"}
89 ]}, 86 ]},
90 {tag:'li', id:this.getId('sharingPanel'),children:[ 87 {tag:'li', id:this.getId('sharingPanel'),children:[
91 {tag:'h3', html:"Sharing"} 88 {tag:'h3', html:"Sharing"}
92 ]}, 89 ]},
93 {tag:'li', id:this.getId('importPanel'), children:[ 90 {tag:'li', id:this.getId('importPanel'), children:[
94 {tag:'h3', html:"Import"} 91 {tag:'h3', html:"Import"}
95 ]}, 92 ]},
96 {tag:'li', id:this.getId('exportPanel'), children:[ 93 {tag:'li', id:this.getId('exportPanel'), children:[
97 {tag:'h3', html:"Export"} 94 {tag:'h3', html:"Export"}
98 ]} 95 ]}
99 ]} 96 ]}
100 ]} 97 ]}
101 ]} 98 ]}
102 ]}, 99 ]},
103 {tag:'div', cls:'footer'} 100 {tag:'div', cls:'footer'}
104 ]); 101 ]);
105 102
106 this.tabPanelController().setup({selected:this.initiallySelectedTab()}); 103 this.tabPanelController().setup({selected:this.initiallySelectedTab()});
107 }, 104 },
108 105
109 //------------------------------------------------------------------------- 106 //-------------------------------------------------------------------------
110 __syntaxFix__: "syntax fix" 107 __syntaxFix__: "syntax fix"
111}); 108});
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 3f8aa88..ea55ba4 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DateColumnManager.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DateColumnManager.js
@@ -1,72 +1,69 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 26Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
30 27
31//############################################################################# 28//#############################################################################
32 29
33Clipperz.PM.UI.Web.Components.DateColumnManager = function(args) { 30Clipperz.PM.UI.Web.Components.DateColumnManager = function(args) {
34 args = args || {}; 31 args = args || {};
35 Clipperz.PM.UI.Web.Components.DateColumnManager.superclass.constructor.call(this, args); 32 Clipperz.PM.UI.Web.Components.DateColumnManager.superclass.constructor.call(this, args);
36 33
37 this._format = args.format|| Clipperz.Base.exception.raise('MandatoryParameter'); 34 this._format = args.format|| Clipperz.Base.exception.raise('MandatoryParameter');
38 35
39 return this; 36 return this;
40} 37}
41 38
42//============================================================================= 39//=============================================================================
43 40
44Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DateColumnManager, Clipperz.PM.UI.Web.Components.ColumnManager, { 41Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DateColumnManager, Clipperz.PM.UI.Web.Components.ColumnManager, {
45 42
46 'toString': function () { 43 'toString': function () {
47 return "Clipperz.PM.UI.Web.Components.DateColumnManager component"; 44 return "Clipperz.PM.UI.Web.Components.DateColumnManager component";
48 }, 45 },
49 46
50 //------------------------------------------------------------------------- 47 //-------------------------------------------------------------------------
51 48
52 'format': function () { 49 'format': function () {
53 return this._format; 50 return this._format;
54 }, 51 },
55 52
56 //------------------------------------------------------------------------- 53 //-------------------------------------------------------------------------
57 54
58 'renderCell': function(aRowElement, anObject) { 55 'renderCell': function(aRowElement, anObject) {
59 Clipperz.DOM.Helper.append(aRowElement, {tag:'td', cls:this.cssClass(), children:[ 56 Clipperz.DOM.Helper.append(aRowElement, {tag:'td', cls:this.cssClass(), children:[
60 { 57 {
61 tag:'span', 58 tag:'span',
62 title:Clipperz.PM.Date.formatDateWithTemplate(anObject[this.name()], "D, d M Y H:i:s"), 59 title:Clipperz.PM.Date.formatDateWithTemplate(anObject[this.name()], "D, d M Y H:i:s"),
63 html:Clipperz.PM.Date.formatDateWithTemplate(anObject[this.name()], this.format()) 60 html:Clipperz.PM.Date.formatDateWithTemplate(anObject[this.name()], this.format())
64 } 61 }
65 ]}); 62 ]});
66 }, 63 },
67 64
68 //----------------------------------------------------- 65 //-----------------------------------------------------
69 66
70 '__syntax_fix__' : 'syntax fix' 67 '__syntax_fix__' : 'syntax fix'
71}); 68});
72 69
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 ee60f2f..fe59494 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DeleteObjectColumnManager.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DeleteObjectColumnManager.js
@@ -1,70 +1,67 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 26Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
30 27
31//############################################################################# 28//#############################################################################
32 29
33Clipperz.PM.UI.Web.Components.DeleteObjectColumnManager = function(args) { 30Clipperz.PM.UI.Web.Components.DeleteObjectColumnManager = function(args) {
34 args = args || {}; 31 args = args || {};
35 Clipperz.PM.UI.Web.Components.DeleteObjectColumnManager.superclass.constructor.call(this, args); 32 Clipperz.PM.UI.Web.Components.DeleteObjectColumnManager.superclass.constructor.call(this, args);
36 33
37 return this; 34 return this;
38} 35}
39 36
40//============================================================================= 37//=============================================================================
41 38
42Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DeleteObjectColumnManager, Clipperz.PM.UI.Web.Components.LinkColumnManager, { 39Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DeleteObjectColumnManager, Clipperz.PM.UI.Web.Components.LinkColumnManager, {
43 40
44 'toString': function () { 41 'toString': function () {
45 return "Clipperz.PM.UI.Web.Components.DeleteObjectColumnManager component"; 42 return "Clipperz.PM.UI.Web.Components.DeleteObjectColumnManager component";
46 }, 43 },
47 44
48 //------------------------------------------------------------------------- 45 //-------------------------------------------------------------------------
49 46
50 'renderCell': function(aRowElement, anObject) { 47 'renderCell': function(aRowElement, anObject) {
51 var tdElement; 48 var tdElement;
52 var linkElement; 49 var linkElement;
53 50
54 tdElement = Clipperz.DOM.Helper.append(aRowElement, {tag:'td', cls:this.cssClass(), children:[ 51 tdElement = Clipperz.DOM.Helper.append(aRowElement, {tag:'td', cls:this.cssClass(), children:[
55 {tag:'div', cls:'delete', children:[ 52 {tag:'div', cls:'delete', children:[
56 {tag:'span', children:[ 53 {tag:'span', children:[
57 {tag:'a', href:'delete', html:"delete"} 54 {tag:'a', href:'delete', html:"delete"}
58 ]} 55 ]}
59 ]} 56 ]}
60 ]}); 57 ]});
61 58
62 linkElement = MochiKit.DOM.getFirstElementByTagAndClassName('a', null, tdElement); 59 linkElement = MochiKit.DOM.getFirstElementByTagAndClassName('a', null, tdElement);
63 // MochiKit.Signal.connect(linkElement, 'onclick', MochiKit.Base.method(this, 'handleLinkClick', anObject['_rowObject'])); 60 // MochiKit.Signal.connect(linkElement, 'onclick', MochiKit.Base.method(this, 'handleLinkClick', anObject['_rowObject']));
64 this.connectEvent(linkElement, 'onclick', MochiKit.Base.method(this, 'handleLinkClick', anObject['_rowObject'])); 61 this.connectEvent(linkElement, 'onclick', MochiKit.Base.method(this, 'handleLinkClick', anObject['_rowObject']));
65 }, 62 },
66 63
67 //----------------------------------------------------- 64 //-----------------------------------------------------
68 '__syntax_fix__' : 'syntax fix' 65 '__syntax_fix__' : 'syntax fix'
69}); 66});
70 67
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 4bf9020..a1f0f9f 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginColumnManager.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginColumnManager.js
@@ -1,90 +1,87 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29/* 26/*
30Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 27Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
31 28
32//############################################################################# 29//#############################################################################
33 30
34Clipperz.PM.UI.Web.Components.DirectLoginColumnManager = function(args) { 31Clipperz.PM.UI.Web.Components.DirectLoginColumnManager = function(args) {
35 args = args || {}; 32 args = args || {};
36 Clipperz.PM.UI.Web.Components.DirectLoginColumnManager.superclass.constructor.call(this, args); 33 Clipperz.PM.UI.Web.Components.DirectLoginColumnManager.superclass.constructor.call(this, args);
37 34
38 this._actionMethod = args.actionMethod || null; 35 this._actionMethod = args.actionMethod || null;
39 36
40 return this; 37 return this;
41} 38}
42 39
43//============================================================================= 40//=============================================================================
44 41
45Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DirectLoginColumnManager, Clipperz.PM.UI.Web.Components.ColumnManager, { 42Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DirectLoginColumnManager, Clipperz.PM.UI.Web.Components.ColumnManager, {
46 43
47 'toString': function () { 44 'toString': function () {
48 return "Clipperz.PM.UI.Web.Components.DateColumnManager component"; 45 return "Clipperz.PM.UI.Web.Components.DateColumnManager component";
49 }, 46 },
50 47
51 //------------------------------------------------------------------------- 48 //-------------------------------------------------------------------------
52 49
53 'actionMethod': function () { 50 'actionMethod': function () {
54 return this._actionMethod; 51 return this._actionMethod;
55 }, 52 },
56 53
57 //------------------------------------------------------------------------- 54 //-------------------------------------------------------------------------
58 55
59 'renderCell': function(aRowElement, anObject) { 56 'renderCell': function(aRowElement, anObject) {
60 vartdElement; 57 vartdElement;
61 varlinkElement; 58 varlinkElement;
62 59
63 tdElement = Clipperz.DOM.Helper.append(aRowElement, {tag:'td', cls:this.cssClass(), children:[ 60 tdElement = Clipperz.DOM.Helper.append(aRowElement, {tag:'td', cls:this.cssClass(), children:[
64 {tag:'div', cls:'directLogin_directLogin', children:[ 61 {tag:'div', cls:'directLogin_directLogin', children:[
65 {tag:'div', cls:'directLogin_directLogin_body', children:[ 62 {tag:'div', cls:'directLogin_directLogin_body', children:[
66 {tag:'a', href:'#', html:anObject[this.name()]} 63 {tag:'a', href:'#', html:anObject[this.name()]}
67 ]} 64 ]}
68 ]} 65 ]}
69 ]}); 66 ]});
70 67
71 linkElement = MochiKit.DOM.getFirstElementByTagAndClassName('a', null, tdElement); 68 linkElement = MochiKit.DOM.getFirstElementByTagAndClassName('a', null, tdElement);
72 // MochiKit.Signal.connect(linkElement, 'onclick', MochiKit.Base.method(this, 'handleLinkClick', anObject['_rowObject'])); 69 // MochiKit.Signal.connect(linkElement, 'onclick', MochiKit.Base.method(this, 'handleLinkClick', anObject['_rowObject']));
73 this.connectEvent(linkElement, 'onclick', MochiKit.Base.method(this, 'handleLinkClick', anObject['_rowObject'])); 70 this.connectEvent(linkElement, 'onclick', MochiKit.Base.method(this, 'handleLinkClick', anObject['_rowObject']));
74 }, 71 },
75 72
76 //----------------------------------------------------- 73 //-----------------------------------------------------
77 74
78 'handleLinkClick': function (anObject, anEvent) { 75 'handleLinkClick': function (anObject, anEvent) {
79 anEvent.preventDefault(); 76 anEvent.preventDefault();
80 77
81 if (this.actionMethod() != null) { 78 if (this.actionMethod() != null) {
82 this.actionMethod()(anObject, anEvent); 79 this.actionMethod()(anObject, anEvent);
83 } 80 }
84 }, 81 },
85 82
86 //----------------------------------------------------- 83 //-----------------------------------------------------
87 '__syntax_fix__' : 'syntax fix' 84 '__syntax_fix__' : 'syntax fix'
88}); 85});
89 86
90*/ \ No newline at end of file 87*/ \ 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 9a9c0b2..1a76b0c 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginEditingBindingComponent.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginEditingBindingComponent.js
@@ -1,168 +1,165 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 26Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
30 27
31Clipperz.PM.UI.Web.Components.DirectLoginEditingBindingComponent = function(args) { 28Clipperz.PM.UI.Web.Components.DirectLoginEditingBindingComponent = function(args) {
32 args = args || {}; 29 args = args || {};
33 30
34 Clipperz.PM.UI.Web.Components.DirectLoginEditingBindingComponent.superclass.constructor.apply(this, arguments); 31 Clipperz.PM.UI.Web.Components.DirectLoginEditingBindingComponent.superclass.constructor.apply(this, arguments);
35 32
36 this._formFieldName = args.formFieldName|| Clipperz.Base.exception.raise('MandatoryParameter'); 33 this._formFieldName = args.formFieldName|| Clipperz.Base.exception.raise('MandatoryParameter');
37 this._fields = args.fields || Clipperz.Base.exception.raise('MandatoryParameter'); 34 this._fields = args.fields || Clipperz.Base.exception.raise('MandatoryParameter');
38 this._initiallySelectedFieldKey = args.selectedFieldKey|| null; 35 this._initiallySelectedFieldKey = args.selectedFieldKey|| null;
39 36
40 return this; 37 return this;
41} 38}
42 39
43//============================================================================= 40//=============================================================================
44 41
45Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DirectLoginEditingBindingComponent, Clipperz.PM.UI.Common.Components.BaseComponent, { 42Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DirectLoginEditingBindingComponent, Clipperz.PM.UI.Common.Components.BaseComponent, {
46 43
47 //------------------------------------------------------------------------- 44 //-------------------------------------------------------------------------
48 45
49 'toString': function () { 46 'toString': function () {
50 return "Clipperz.PM.UI.Web.Components.DirectLoginEditingBindingComponent component"; 47 return "Clipperz.PM.UI.Web.Components.DirectLoginEditingBindingComponent component";
51 }, 48 },
52 49
53 //------------------------------------------------------------------------- 50 //-------------------------------------------------------------------------
54 51
55 'formFieldName': function () { 52 'formFieldName': function () {
56 return this._formFieldName; 53 return this._formFieldName;
57 }, 54 },
58 55
59 //------------------------------------------------------------------------- 56 //-------------------------------------------------------------------------
60 57
61 'fields': function () { 58 'fields': function () {
62 return this._fields; 59 return this._fields;
63 }, 60 },
64 61
65 //------------------------------------------------------------------------- 62 //-------------------------------------------------------------------------
66 63
67 'selectedValue': function () { 64 'selectedValue': function () {
68 var result; 65 var result;
69 66
70 result = this.getElement('select').value; 67 result = this.getElement('select').value;
71 68
72 if (result == '---') { 69 if (result == '---') {
73 result = null; 70 result = null;
74 } 71 }
75 72
76 return result; 73 return result;
77 }, 74 },
78 75
79 'initiallySelectedFieldKey': function () { 76 'initiallySelectedFieldKey': function () {
80 return this._initiallySelectedFieldKey; 77 return this._initiallySelectedFieldKey;
81 }, 78 },
82 79
83 //========================================================================= 80 //=========================================================================
84 81
85 'renderSelf': function() { 82 'renderSelf': function() {
86 var initiallySelectedOptions; 83 var initiallySelectedOptions;
87 84
88 this.append(this.element(), {tag:'div', id:this.getId('div'), cls:'binding', children:[ 85 this.append(this.element(), {tag:'div', id:this.getId('div'), cls:'binding', children:[
89 {tag:'span', cls:'formFieldName', html:this.formFieldName()}, 86 {tag:'span', cls:'formFieldName', html:this.formFieldName()},
90 {tag:'span', cls:'fieldLock', id:this.getId('isHidden'), children:[ 87 {tag:'span', cls:'fieldLock', id:this.getId('isHidden'), children:[
91 {tag:'a', href:'#', id:this.getId('showHide'), html:'&nbsp;'} 88 {tag:'a', href:'#', id:this.getId('showHide'), html:'&nbsp;'}
92 ]}, 89 ]},
93 {tag:'input', id:this.getId('input'), cls:'formFieldExampleValue', disabled:true, value:''}, 90 {tag:'input', id:this.getId('input'), cls:'formFieldExampleValue', disabled:true, value:''},
94 {tag:'select', name:this.formFieldName(), id:this.getId('select'), cls:'formFieldMatchinCardField', children: 91 {tag:'select', name:this.formFieldName(), id:this.getId('select'), cls:'formFieldMatchinCardField', children:
95 MochiKit.Base.flattenArguments( 92 MochiKit.Base.flattenArguments(
96 {tag:'option', value:'---', html:"---"}, 93 {tag:'option', value:'---', html:"---"},
97 MochiKit.Base.map( 94 MochiKit.Base.map(
98 MochiKit.Base.bind(function (aField) { return {tag:'option', value:aField['reference'], html:aField['label']}; }, this), 95 MochiKit.Base.bind(function (aField) { return {tag:'option', value:aField['reference'], html:aField['label']}; }, this),
99 this.fields() 96 this.fields()
100 ) 97 )
101 ) 98 )
102 } 99 }
103 ]}); 100 ]});
104 101
105 MochiKit.Signal.connect(this.getElement('select'), 'onchange', this, 'handleSelectChange'); 102 MochiKit.Signal.connect(this.getElement('select'), 'onchange', this, 'handleSelectChange');
106 MochiKit.Signal.connect(this.getElement('showHide'), 'onclick', this, 'handleShowHide'); 103 MochiKit.Signal.connect(this.getElement('showHide'), 'onclick', this, 'handleShowHide');
107 104
108 if (! MochiKit.Base.isUndefinedOrNull(this.initiallySelectedFieldKey())) { 105 if (! MochiKit.Base.isUndefinedOrNull(this.initiallySelectedFieldKey())) {
109 initiallySelectedOptions = MochiKit.Selector.findChildElements(this.element(), ['option[value=' + this.initiallySelectedFieldKey() + ']']); 106 initiallySelectedOptions = MochiKit.Selector.findChildElements(this.element(), ['option[value=' + this.initiallySelectedFieldKey() + ']']);
110 if (initiallySelectedOptions.length == 1) { 107 if (initiallySelectedOptions.length == 1) {
111 MochiKit.DOM.updateNodeAttributes(initiallySelectedOptions[0], {selected:true}); 108 MochiKit.DOM.updateNodeAttributes(initiallySelectedOptions[0], {selected:true});
112 this.handleSelectChange(); 109 this.handleSelectChange();
113 } 110 }
114 } 111 }
115 }, 112 },
116 113
117 //------------------------------------------------------------------------- 114 //-------------------------------------------------------------------------
118 115
119 'setFieldValue': function (aValue) { 116 'setFieldValue': function (aValue) {
120 this.getElement('input').value = aValue; 117 this.getElement('input').value = aValue;
121 }, 118 },
122 119
123 'isHidden': function () { 120 'isHidden': function () {
124 return MochiKit.DOM.hasElementClass(this.getElement('div'), 'locked'); 121 return MochiKit.DOM.hasElementClass(this.getElement('div'), 'locked');
125 }, 122 },
126 123
127 'setIsHidden': function (aValue) { 124 'setIsHidden': function (aValue) {
128 if (aValue == true) { 125 if (aValue == true) {
129 MochiKit.DOM.addElementClass(this.getElement('div'), 'locked'); 126 MochiKit.DOM.addElementClass(this.getElement('div'), 'locked');
130 MochiKit.DOM.addElementClass(this.getElement('div'), 'showLocked'); 127 MochiKit.DOM.addElementClass(this.getElement('div'), 'showLocked');
131 } else { 128 } else {
132 MochiKit.DOM.removeElementClass(this.getElement('div'), 'locked'); 129 MochiKit.DOM.removeElementClass(this.getElement('div'), 'locked');
133 MochiKit.DOM.removeElementClass(this.getElement('div'), 'showLocked'); 130 MochiKit.DOM.removeElementClass(this.getElement('div'), 'showLocked');
134 } 131 }
135 }, 132 },
136 133
137 'isShowLocked': function () { 134 'isShowLocked': function () {
138 return MochiKit.DOM.hasElementClass(this.getElement('div'), 'showLocked'); 135 return MochiKit.DOM.hasElementClass(this.getElement('div'), 'showLocked');
139 }, 136 },
140 137
141 //------------------------------------------------------------------------- 138 //-------------------------------------------------------------------------
142 139
143 'handleSelectChange': function (anEvent) { 140 'handleSelectChange': function (anEvent) {
144 // this.getElement('input').value = this.valueOfField(anEvent.src().value); 141 // this.getElement('input').value = this.valueOfField(anEvent.src().value);
145 MochiKit.Signal.signal(this, 'bindChange', this); 142 MochiKit.Signal.signal(this, 'bindChange', this);
146 }, 143 },
147 144
148 'handleShowHide': function (anEvent) { 145 'handleShowHide': function (anEvent) {
149 anEvent.preventDefault(); 146 anEvent.preventDefault();
150 147
151 if (this.isShowLocked()) { 148 if (this.isShowLocked()) {
152 MochiKit.DOM.removeElementClass(this.getElement('div'), 'showLocked'); 149 MochiKit.DOM.removeElementClass(this.getElement('div'), 'showLocked');
153 } else { 150 } else {
154 MochiKit.DOM.addElementClass(this.getElement('div'), 'showLocked'); 151 MochiKit.DOM.addElementClass(this.getElement('div'), 'showLocked');
155 } 152 }
156 }, 153 },
157 154
158 //========================================================================= 155 //=========================================================================
159 __syntaxFix__: "syntax fix" 156 __syntaxFix__: "syntax fix"
160}); 157});
161 158
162 159
163 160
164 161
165 162
166 163
167 164
168 165
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 d254c29..5114b1d 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginEditingComponent.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginEditingComponent.js
@@ -1,408 +1,405 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 26Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
30 27
31Clipperz.PM.UI.Web.Components.DirectLoginEditingComponent = function(args) { 28Clipperz.PM.UI.Web.Components.DirectLoginEditingComponent = function(args) {
32 args = args || {}; 29 args = args || {};
33 30
34 Clipperz.PM.UI.Web.Components.DirectLoginEditingComponent.superclass.constructor.apply(this, arguments); 31 Clipperz.PM.UI.Web.Components.DirectLoginEditingComponent.superclass.constructor.apply(this, arguments);
35 32
36 this._tabPanelController = null; 33 this._tabPanelController = null;
37 34
38 this._initiallySelectedTab = args.selected || 'TYPE'; 35 this._initiallySelectedTab = args.selected || 'TYPE';
39 this._tabPanelControllerConfiguration = { 36 this._tabPanelControllerConfiguration = {
40 'LABEL': { 37 'LABEL': {
41 tab:'labelTab', 38 tab:'labelTab',
42 panel:'labelTabpanel' 39 panel:'labelTabpanel'
43 }, 40 },
44 'TYPE': { 41 'TYPE': {
45 tab:'typeTab', 42 tab:'typeTab',
46 panel:'typeTabpanel' 43 panel:'typeTabpanel'
47 }, 44 },
48 'CONFIGURATION': { 45 'CONFIGURATION': {
49 tab:'configurationTab', 46 tab:'configurationTab',
50 panel:'configurationTabpanel' 47 panel:'configurationTabpanel'
51 }, 48 },
52 'BINDINGS': { 49 'BINDINGS': {
53 tab:'bindingsTab', 50 tab:'bindingsTab',
54 panel:'bindingsTabpanel' 51 panel:'bindingsTabpanel'
55 }, 52 },
56 'FAVICON': { 53 'FAVICON': {
57 tab:'faviconTab', 54 tab:'faviconTab',
58 panel:'faviconTabpanel' 55 panel:'faviconTabpanel'
59 }, 56 },
60 'DONE': { 57 'DONE': {
61 tab:'doneTab', 58 tab:'doneTab',
62 panel:'doneTabpanel' 59 panel:'doneTabpanel'
63 } 60 }
64 }; 61 };
65 62
66 this._directLoginReference = null; 63 this._directLoginReference = null;
67 64
68 this._directLoginFavicon = null; 65 this._directLoginFavicon = null;
69 66
70 this._updateFaviconCounter = 0; 67 this._updateFaviconCounter = 0;
71 this._faviconComponent = null; 68 this._faviconComponent = null;
72 69
73 this._bindingComponents= []; 70 this._bindingComponents= [];
74 this._formValueComponents = []; 71 this._formValueComponents = [];
75 72
76 return this; 73 return this;
77} 74}
78 75
79//============================================================================= 76//=============================================================================
80 77
81//Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DirectLoginEditingComponent, Clipperz.PM.UI.Common.Components.BaseComponent, { 78//Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DirectLoginEditingComponent, Clipperz.PM.UI.Common.Components.BaseComponent, {
82Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DirectLoginEditingComponent, Clipperz.PM.UI.Common.Components.TabPanelComponent, { 79Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DirectLoginEditingComponent, Clipperz.PM.UI.Common.Components.TabPanelComponent, {
83 80
84 //------------------------------------------------------------------------- 81 //-------------------------------------------------------------------------
85 82
86 'toString': function () { 83 'toString': function () {
87 return "Clipperz.PM.UI.Web.Components.DirectLoginEditingComponent component"; 84 return "Clipperz.PM.UI.Web.Components.DirectLoginEditingComponent component";
88 }, 85 },
89 86
90 //========================================================================= 87 //=========================================================================
91 88
92 'directLoginReference': function () { 89 'directLoginReference': function () {
93 return this._directLoginReference; 90 return this._directLoginReference;
94 }, 91 },
95 92
96 //------------------------------------------------------------------------- 93 //-------------------------------------------------------------------------
97 94
98 'setDirectLoginReference': function (aDirectLoginReference) { 95 'setDirectLoginReference': function (aDirectLoginReference) {
99 this._directLoginReference = aDirectLoginReference; 96 this._directLoginReference = aDirectLoginReference;
100 97
101 return this._directLoginReference; 98 return this._directLoginReference;
102 }, 99 },
103 100
104 //========================================================================= 101 //=========================================================================
105 102
106 'label': function () { 103 'label': function () {
107 return this.getElement('label').value 104 return this.getElement('label').value
108 }, 105 },
109 106
110 'setLabel': function (aValue) { 107 'setLabel': function (aValue) {
111//console.log("##> LABEL: " + aValue); 108//console.log("##> LABEL: " + aValue);
112 this.getElement('label').value = (aValue ? aValue : ''); 109 this.getElement('label').value = (aValue ? aValue : '');
113 }, 110 },
114 111
115 //------------------------------------------------------------------------- 112 //-------------------------------------------------------------------------
116 113
117 'favicon': function () { 114 'favicon': function () {
118 return this.getElement('faviconURL').value; 115 return this.getElement('faviconURL').value;
119 }, 116 },
120 117
121 'setFavicon': function (aValue) { 118 'setFavicon': function (aValue) {
122 var regexp; 119 var regexp;
123 var displayValue; 120 var displayValue;
124 121
125 regexp = new RegExp('^data\:\/\/.*', 'i'); 122 regexp = new RegExp('^data\:\/\/.*', 'i');
126 if (regexp.test(aValue)) { 123 if (regexp.test(aValue)) {
127 displayValue = '' 124 displayValue = ''
128 } else { 125 } else {
129 displayValue = (aValue ? aValue : ''); 126 displayValue = (aValue ? aValue : '');
130 } 127 }
131 128
132 this.getElement('faviconURL').value = displayValue; 129 this.getElement('faviconURL').value = displayValue;
133 this.faviconComponent().setSrc(aValue); 130 this.faviconComponent().setSrc(aValue);
134 }, 131 },
135 132
136 //'setFaviconData': function (aValue) { 133 //'setFaviconData': function (aValue) {
137 // this.getElement('faviconIcon').src = aValue; 134 // this.getElement('faviconIcon').src = aValue;
138 //}, 135 //},
139 136
140 'directLoginFavicon': function () { 137 'directLoginFavicon': function () {
141 return this._directLoginFavicon; 138 return this._directLoginFavicon;
142 }, 139 },
143 140
144 'setDirectLoginFavicon': function (aValue) { 141 'setDirectLoginFavicon': function (aValue) {
145 this._directLoginFavicon = aValue; 142 this._directLoginFavicon = aValue;
146 this.setFavicon(aValue); 143 this.setFavicon(aValue);
147 }, 144 },
148 145
149 //------------------------------------------------------------------------- 146 //-------------------------------------------------------------------------
150 147
151 'bookmarkletConfiguration': function () { 148 'bookmarkletConfiguration': function () {
152 return this.getElement('bookmarkletConfiguration').value 149 return this.getElement('bookmarkletConfiguration').value
153 }, 150 },
154 151
155 'setBookmarkletConfiguration': function (aValue) { 152 'setBookmarkletConfiguration': function (aValue) {
156 this.getElement('bookmarkletConfiguration').value = aValue; 153 this.getElement('bookmarkletConfiguration').value = aValue;
157 }, 154 },
158 155
159 'highlightConfigurationSyntaxError': function () { 156 'highlightConfigurationSyntaxError': function () {
160 MochiKit.DOM.addElementClass(this.getElement('bookmarkletConfiguration'), 'error'); 157 MochiKit.DOM.addElementClass(this.getElement('bookmarkletConfiguration'), 'error');
161 }, 158 },
162 159
163 'removeHighlightConfigurationSyntaxError': function () { 160 'removeHighlightConfigurationSyntaxError': function () {
164 MochiKit.DOM.removeElementClass(this.getElement('bookmarkletConfiguration'), 'error'); 161 MochiKit.DOM.removeElementClass(this.getElement('bookmarkletConfiguration'), 'error');
165 }, 162 },
166 163
167 //========================================================================= 164 //=========================================================================
168 165
169 'disableAllPanels': function () { 166 'disableAllPanels': function () {
170 this.getElement('label').disabled = true; 167 this.getElement('label').disabled = true;
171 MochiKit.DOM.addElementClass(this.getElement('label').parentNode, 'disabled'); 168 MochiKit.DOM.addElementClass(this.getElement('label').parentNode, 'disabled');
172 169
173 this.tabPanelController().selectTab(null); 170 this.tabPanelController().selectTab(null);
174 }, 171 },
175 172
176 //------------------------------------------------------------------------- 173 //-------------------------------------------------------------------------
177 174
178 //'disableLabelField': function () { 175 //'disableLabelField': function () {
179 // this.getElement('label').disabled = true; 176 // this.getElement('label').disabled = true;
180 // MochiKit.DOM.addElementClass(this.getElement('label').parentNode, 'disabled'); 177 // MochiKit.DOM.addElementClass(this.getElement('label').parentNode, 'disabled');
181 //}, 178 //},
182 179
183 'enableLabelField': function () { 180 'enableLabelField': function () {
184 this.getElement('label').disabled = false; 181 this.getElement('label').disabled = false;
185 MochiKit.DOM.removeElementClass(this.getElement('label').parentNode, 'disabled'); 182 MochiKit.DOM.removeElementClass(this.getElement('label').parentNode, 'disabled');
186 this.tabPanelController().selectTab('LABEL'); 183 this.tabPanelController().selectTab('LABEL');
187 }, 184 },
188 185
189 //------------------------------------------------------------------------- 186 //-------------------------------------------------------------------------
190 187
191 //'disableTypeField': function () { 188 //'disableTypeField': function () {
192 // this.tabPanelController().selectTab(null); 189 // this.tabPanelController().selectTab(null);
193 //}, 190 //},
194 191
195 'enableTypeField': function () { 192 'enableTypeField': function () {
196 this.tabPanelController().selectTab('TYPE'); 193 this.tabPanelController().selectTab('TYPE');
197 }, 194 },
198 195
199 //------------------------------------------------------------------------- 196 //-------------------------------------------------------------------------
200 197
201 //'disableConfigurationField': function () { 198 //'disableConfigurationField': function () {
202 // this.tabPanelController().selectTab(null); 199 // this.tabPanelController().selectTab(null);
203 //}, 200 //},
204 201
205 'enableConfigurationField': function () { 202 'enableConfigurationField': function () {
206 this.tabPanelController().selectTab('CONFIGURATION'); 203 this.tabPanelController().selectTab('CONFIGURATION');
207 }, 204 },
208 205
209 //------------------------------------------------------------------------- 206 //-------------------------------------------------------------------------
210 207
211 //'disableBindingFields': function () { 208 //'disableBindingFields': function () {
212 // this.tabPanelController().selectTab(null); 209 // this.tabPanelController().selectTab(null);
213 //}, 210 //},
214 211
215 'enableBindingFields': function () { 212 'enableBindingFields': function () {
216 this.tabPanelController().selectTab('BINDINGS'); 213 this.tabPanelController().selectTab('BINDINGS');
217 }, 214 },
218 215
219 //------------------------------------------------------------------------- 216 //-------------------------------------------------------------------------
220 217
221 //'disableFaviconField': function () { 218 //'disableFaviconField': function () {
222 // this.tabPanelController().selectTab(null); 219 // this.tabPanelController().selectTab(null);
223 //}, 220 //},
224 221
225 'enableFaviconField': function () { 222 'enableFaviconField': function () {
226 this.tabPanelController().selectTab('FAVICON'); 223 this.tabPanelController().selectTab('FAVICON');
227 }, 224 },
228 225
229 //------------------------------------------------------------------------- 226 //-------------------------------------------------------------------------
230 227
231 'enableDonePanel': function () { 228 'enableDonePanel': function () {
232 this.tabPanelController().selectTab('DONE'); 229 this.tabPanelController().selectTab('DONE');
233 }, 230 },
234 231
235 //========================================================================= 232 //=========================================================================
236 233
237 'shouldShowElementWhileRendering': function() { 234 'shouldShowElementWhileRendering': function() {
238 return false; 235 return false;
239 }, 236 },
240 237
241 //========================================================================= 238 //=========================================================================
242 239
243 'faviconComponent': function () { 240 'faviconComponent': function () {
244 if (this._faviconComponent == null) { 241 if (this._faviconComponent == null) {
245 this._faviconComponent = new Clipperz.PM.UI.Common.Components.FaviconComponent({element:this.getId('favicon')}); 242 this._faviconComponent = new Clipperz.PM.UI.Common.Components.FaviconComponent({element:this.getId('favicon')});
246 } 243 }
247 244
248 return this._faviconComponent; 245 return this._faviconComponent;
249 }, 246 },
250 247
251 //========================================================================= 248 //=========================================================================
252 249
253 'tabPanelController': function () { 250 'tabPanelController': function () {
254 if (this._tabPanelController == null) { 251 if (this._tabPanelController == null) {
255 this._tabPanelController = new Clipperz.PM.UI.Common.Controllers.TabPanelController({ 252 this._tabPanelController = new Clipperz.PM.UI.Common.Controllers.TabPanelController({
256 component:this, 253 component:this,
257 configuration:this._tabPanelControllerConfiguration 254 configuration:this._tabPanelControllerConfiguration
258 }); 255 });
259 256
260 MochiKit.Signal.connect(this._tabPanelController, 'tabSelected', this, 'handleTabSelected') 257 MochiKit.Signal.connect(this._tabPanelController, 'tabSelected', this, 'handleTabSelected')
261 } 258 }
262 259
263 return this._tabPanelController; 260 return this._tabPanelController;
264 }, 261 },
265 262
266 //------------------------------------------------------------------------- 263 //-------------------------------------------------------------------------
267 264
268 'renderSelf': function() { 265 'renderSelf': function() {
269 varbookmarkletComponent; 266 varbookmarkletComponent;
270 267
271 this.append(this.element(), {tag:'div', cls:'directLoginEditing', id:this.getId('panel'), children: [ 268 this.append(this.element(), {tag:'div', cls:'directLoginEditing', id:this.getId('panel'), children: [
272 // {tag:'div', cls:'back', children:[ 269 // {tag:'div', cls:'back', children:[
273 // {tag:'a', href:'#', id:this.getId('back'), html:"&nbsp;"} 270 // {tag:'a', href:'#', id:this.getId('back'), html:"&nbsp;"}
274 // ]}, 271 // ]},
275 {tag:'form', id:this.getId('form'), cls:'directLoginEditingForm', children:[ 272 {tag:'form', id:this.getId('form'), cls:'directLoginEditingForm', children:[
276 {tag:'div', cls:'title', children:[ 273 {tag:'div', cls:'title', children:[
277 {tag:'img', id:this.getId('favicon'), cls:'favicon'}, 274 {tag:'img', id:this.getId('favicon'), cls:'favicon'},
278 {tag:'input', type:'text', id:this.getId('label')}//, 275 {tag:'input', type:'text', id:this.getId('label')}//,
279 // {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.DirectLoginWizard.LABEL.description')}]}, 276 // {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.DirectLoginWizard.LABEL.description')}]},
280 ]}, 277 ]},
281 {tag:'div', cls:'tabContainer', children:[ 278 {tag:'div', cls:'tabContainer', children:[
282 {tag:'ul', cls:'tabs', children:[ 279 {tag:'ul', cls:'tabs', children:[
283 {tag:'li', id:this.getId('labelTab'), children:[{tag:'span', html:"label"}]}, 280 {tag:'li', id:this.getId('labelTab'), children:[{tag:'span', html:"label"}]},
284 {tag:'li', id:this.getId('typeTab'), children:[{tag:'span', html:"type"}]}, 281 {tag:'li', id:this.getId('typeTab'), children:[{tag:'span', html:"type"}]},
285 {tag:'li', id:this.getId('configurationTab'),children:[{tag:'span', html:"configuration"}]}, 282 {tag:'li', id:this.getId('configurationTab'),children:[{tag:'span', html:"configuration"}]},
286 {tag:'li', id:this.getId('bindingsTab'), children:[{tag:'span', html:"bindings"}]}, 283 {tag:'li', id:this.getId('bindingsTab'), children:[{tag:'span', html:"bindings"}]},
287 {tag:'li', id:this.getId('faviconTab'), children:[{tag:'span', html:"favicon"}]}, 284 {tag:'li', id:this.getId('faviconTab'), children:[{tag:'span', html:"favicon"}]},
288 {tag:'li', id:this.getId('doneTab'), children:[{tag:'span', html:"done"}]} 285 {tag:'li', id:this.getId('doneTab'), children:[{tag:'span', html:"done"}]}
289 ]}, 286 ]},
290 {tag:'ul', cls:'tabPanels', children:[ 287 {tag:'ul', cls:'tabPanels', children:[
291 {tag:'li', id:this.getId('labelTabpanel'), cls:'tabPanel label', children:[ 288 {tag:'li', id:this.getId('labelTabpanel'), cls:'tabPanel label', children:[
292 {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.DirectLoginWizard.LABEL.description')}]} 289 {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.DirectLoginWizard.LABEL.description')}]}
293 ]}, 290 ]},
294 {tag:'li', id:this.getId('typeTabpanel'), cls:'tabPanel type', children:[ 291 {tag:'li', id:this.getId('typeTabpanel'), cls:'tabPanel type', children:[
295 {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.DirectLoginWizard.TYPE.description')}]}, 292 {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.DirectLoginWizard.TYPE.description')}]},
296 {tag:'h2', html:"type"} 293 {tag:'h2', html:"type"}
297 ]}, 294 ]},
298 {tag:'li', id:this.getId('configurationTabpanel'), cls:'tabPanel configuration', children:[ 295 {tag:'li', id:this.getId('configurationTabpanel'), cls:'tabPanel configuration', children:[
299 {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.DirectLoginWizard.CONFIGURATION.description')}]}, 296 {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.DirectLoginWizard.CONFIGURATION.description')}]},
300 {tag:'div', cls:'bookmarkletConfigurationWrapper', children:[ 297 {tag:'div', cls:'bookmarkletConfigurationWrapper', children:[
301 {tag:'textarea', id:this.getId('bookmarkletConfiguration'), value:""}, 298 {tag:'textarea', id:this.getId('bookmarkletConfiguration'), value:""},
302 // {tag:'div', cls:'bookmarkletComponentWrapper', children:[{tag:'div', id:this.getId('bookmarkletComponent'), cls:'bookmarkletComponent'}]} 299 // {tag:'div', cls:'bookmarkletComponentWrapper', children:[{tag:'div', id:this.getId('bookmarkletComponent'), cls:'bookmarkletComponent'}]}
303 {tag:'div', id:this.getId('bookmarkletComponent'), cls:'bookmarkletComponent'} 300 {tag:'div', id:this.getId('bookmarkletComponent'), cls:'bookmarkletComponent'}
304 ]} 301 ]}
305 ]}, 302 ]},
306 {tag:'li', id:this.getId('bindingsTabpanel'), cls:'tabPanel bindings', children:[ 303 {tag:'li', id:this.getId('bindingsTabpanel'), cls:'tabPanel bindings', children:[
307 {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.DirectLoginWizard.BINDINGS.description')}]}, 304 {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.DirectLoginWizard.BINDINGS.description')}]},
308 {tag:'div', cls:'bindings', id:this.getId('bindings'), children:[]}, 305 {tag:'div', cls:'bindings', id:this.getId('bindings'), children:[]},
309 {tag:'div', cls:'formValues', id:this.getId('formValues'), children:[]} 306 {tag:'div', cls:'formValues', id:this.getId('formValues'), children:[]}
310 ]}, 307 ]},
311 {tag:'li', id:this.getId('faviconTabpanel'), cls:'tabPanel favicon', children:[ 308 {tag:'li', id:this.getId('faviconTabpanel'), cls:'tabPanel favicon', children:[
312 {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.DirectLoginWizard.FAVICON.description')}]}, 309 {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.DirectLoginWizard.FAVICON.description')}]},
313 {tag:'div', cls:'favicon', children:[ 310 {tag:'div', cls:'favicon', children:[
314 {tag:'input', type:'text', id:this.getId('faviconURL')} 311 {tag:'input', type:'text', id:this.getId('faviconURL')}
315 ]} 312 ]}
316 ]}, 313 ]},
317 {tag:'li', id:this.getId('doneTabpanel'), cls:'tabPanel done', children:[ 314 {tag:'li', id:this.getId('doneTabpanel'), cls:'tabPanel done', children:[
318 {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', id:this.getId('doneDescription')/*, html:Clipperz.PM.Strings.getValue('Wizards.DirectLoginWizard.DONE.description')*/}]} 315 {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', id:this.getId('doneDescription')/*, html:Clipperz.PM.Strings.getValue('Wizards.DirectLoginWizard.DONE.description')*/}]}
319 ]} 316 ]}
320 ]} 317 ]}
321 ]} 318 ]}
322 ]}, 319 ]},
323 {tag:'div', cls:'clear'} 320 {tag:'div', cls:'clear'}
324 ]}); 321 ]});
325 322
326 bookmarkletComponent = new Clipperz.PM.UI.Web.Components.BookmarkletComponent({element:this.getElement('bookmarkletComponent')}); 323 bookmarkletComponent = new Clipperz.PM.UI.Web.Components.BookmarkletComponent({element:this.getElement('bookmarkletComponent')});
327 bookmarkletComponent.render(); 324 bookmarkletComponent.render();
328 325
329 this.tabPanelController().setup(/*{selected:this.initiallySelectedTab()}*/); 326 this.tabPanelController().setup(/*{selected:this.initiallySelectedTab()}*/);
330 327
331 MochiKit.Signal.connect(this.getId('label'), 'onchange', this, 'changedValue'); 328 MochiKit.Signal.connect(this.getId('label'), 'onchange', this, 'changedValue');
332 MochiKit.Signal.connect(this.getId('label'), 'onkeyup', this, 'changedValue'); 329 MochiKit.Signal.connect(this.getId('label'), 'onkeyup', this, 'changedValue');
333 330
334 MochiKit.Signal.connect(this.getId('bookmarkletConfiguration'),'onchange', this, 'changedValue'); 331 MochiKit.Signal.connect(this.getId('bookmarkletConfiguration'),'onchange', this, 'changedValue');
335 MochiKit.Signal.connect(this.getId('bookmarkletConfiguration'),'onkeyup', this, 'changedValue'); 332 MochiKit.Signal.connect(this.getId('bookmarkletConfiguration'),'onkeyup', this, 'changedValue');
336 333
337 MochiKit.Signal.connect(this.getId('faviconURL'), 'onchange', this, 'changedValue'); 334 MochiKit.Signal.connect(this.getId('faviconURL'), 'onchange', this, 'changedValue');
338 MochiKit.Signal.connect(this.getId('faviconURL'), 'onkeyup', this, 'changedValue'); 335 MochiKit.Signal.connect(this.getId('faviconURL'), 'onkeyup', this, 'changedValue');
339 336
340 MochiKit.Signal.connect(this.getId('panel'), 'onkeydown',this, 'handleKeyEvent'); 337 MochiKit.Signal.connect(this.getId('panel'), 'onkeydown',this, 'handleKeyEvent');
341 }, 338 },
342 339
343 //------------------------------------------------------------------------- 340 //-------------------------------------------------------------------------
344 341
345 'handleTabSelected': function (aSelectedTab) { 342 'handleTabSelected': function (aSelectedTab) {
346 switch (aSelectedTab) { 343 switch (aSelectedTab) {
347 case 'DETAILS': 344 case 'DETAILS':
348 break; 345 break;
349 case 'DIRECT_LOGINS': 346 case 'DIRECT_LOGINS':
350 MochiKit.Style.hideElement(this.getElement('backToDirectLoginList')); 347 MochiKit.Style.hideElement(this.getElement('backToDirectLoginList'));
351 break; 348 break;
352 case 'SHARING': 349 case 'SHARING':
353 break; 350 break;
354 } 351 }
355 }, 352 },
356 353
357 //========================================================================= 354 //=========================================================================
358 355
359 'incrementUpdateFaviconCounter': function () { 356 'incrementUpdateFaviconCounter': function () {
360 this._updateFaviconCounter ++; 357 this._updateFaviconCounter ++;
361 }, 358 },
362 359
363 'decrementUpdateFaviconCounter': function () { 360 'decrementUpdateFaviconCounter': function () {
364 this._updateFaviconCounter --; 361 this._updateFaviconCounter --;
365 }, 362 },
366 363
367 'updateFaviconCounter': function () { 364 'updateFaviconCounter': function () {
368 return this._updateFaviconCounter; 365 return this._updateFaviconCounter;
369 }, 366 },
370 367
371 //------------------------------------------------------------------------- 368 //-------------------------------------------------------------------------
372 369
373 'updateFavicon': function () { 370 'updateFavicon': function () {
374 this.decrementUpdateFaviconCounter(); 371 this.decrementUpdateFaviconCounter();
375 372
376 if (this.updateFaviconCounter() == 0) { 373 if (this.updateFaviconCounter() == 0) {
377 this.setFavicon(this.favicon()); 374 this.setFavicon(this.favicon());
378 } 375 }
379 }, 376 },
380 377
381 //========================================================================= 378 //=========================================================================
382 379
383 'bindingComponents': function () { 380 'bindingComponents': function () {
384 return this._bindingComponents; 381 return this._bindingComponents;
385 }, 382 },
386 383
387 'clearAllBindingsComponents': function () { 384 'clearAllBindingsComponents': function () {
388 MochiKit.Iter.forEach(this.bindingComponents(), MochiKit.Base.methodcaller('remove')); 385 MochiKit.Iter.forEach(this.bindingComponents(), MochiKit.Base.methodcaller('remove'));
389 this._bindingComponents = []; 386 this._bindingComponents = [];
390 this.getElement('bindings').innerHTML = ''; 387 this.getElement('bindings').innerHTML = '';
391 }, 388 },
392 389
393 'addBindingComponent': function (aBindingComponent) { 390 'addBindingComponent': function (aBindingComponent) {
394 this.bindingComponents().push(aBindingComponent); 391 this.bindingComponents().push(aBindingComponent);
395 aBindingComponent.renderInNode(this.append(this.getElement('bindings'), {tag:'div'})); 392 aBindingComponent.renderInNode(this.append(this.getElement('bindings'), {tag:'div'}));
396 }, 393 },
397 394
398 //========================================================================= 395 //=========================================================================
399 396
400 'formValueComponents': function () { 397 'formValueComponents': function () {
401 return this._formValueComponents; 398 return this._formValueComponents;
402 }, 399 },
403 400
404 'clearAllFormValueComponents': function () { 401 'clearAllFormValueComponents': function () {
405 MochiKit.Iter.forEach(this.formValueComponents(), MochiKit.Base.methodcaller('remove')); 402 MochiKit.Iter.forEach(this.formValueComponents(), MochiKit.Base.methodcaller('remove'));
406 this._formValueComponents = []; 403 this._formValueComponents = [];
407 this.getElement('formValues').innerHTML = ''; 404 this.getElement('formValues').innerHTML = '';
408 }, 405 },
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 b91eb98..fa57233 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginEditingFormValueComponent.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginEditingFormValueComponent.js
@@ -1,179 +1,176 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 26Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
30 27
31Clipperz.PM.UI.Web.Components.DirectLoginEditingFormValueComponent = function(args) { 28Clipperz.PM.UI.Web.Components.DirectLoginEditingFormValueComponent = function(args) {
32 args = args || {}; 29 args = args || {};
33 30
34 Clipperz.PM.UI.Web.Components.DirectLoginEditingFormValueComponent.superclass.constructor.apply(this, arguments); 31 Clipperz.PM.UI.Web.Components.DirectLoginEditingFormValueComponent.superclass.constructor.apply(this, arguments);
35 32
36 this._formFieldName = args.formFieldName|| Clipperz.Base.exception.raise('MandatoryParameter'); 33 this._formFieldName = args.formFieldName|| Clipperz.Base.exception.raise('MandatoryParameter');
37 this._fieldOptions = args.fieldOptions || Clipperz.Base.exception.raise('MandatoryParameter'); 34 this._fieldOptions = args.fieldOptions || Clipperz.Base.exception.raise('MandatoryParameter');
38 this._initialValue = args.initialValue || null; 35 this._initialValue = args.initialValue || null;
39 36
40 return this; 37 return this;
41} 38}
42 39
43//============================================================================= 40//=============================================================================
44 41
45Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DirectLoginEditingFormValueComponent, Clipperz.PM.UI.Common.Components.BaseComponent, { 42Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DirectLoginEditingFormValueComponent, Clipperz.PM.UI.Common.Components.BaseComponent, {
46 43
47 //------------------------------------------------------------------------- 44 //-------------------------------------------------------------------------
48 45
49 'toString': function () { 46 'toString': function () {
50 return "Clipperz.PM.UI.Web.Components.DirectLoginEditingFormValueComponent component"; 47 return "Clipperz.PM.UI.Web.Components.DirectLoginEditingFormValueComponent component";
51 }, 48 },
52 49
53 //------------------------------------------------------------------------- 50 //-------------------------------------------------------------------------
54 51
55 'formFieldName': function () { 52 'formFieldName': function () {
56 return this._formFieldName; 53 return this._formFieldName;
57 }, 54 },
58 55
59 //------------------------------------------------------------------------- 56 //-------------------------------------------------------------------------
60 57
61 'fieldOptions': function () { 58 'fieldOptions': function () {
62 return this._fieldOptions; 59 return this._fieldOptions;
63 }, 60 },
64 61
65 'fieldType': function () { 62 'fieldType': function () {
66 return this.fieldOptions()['type']; 63 return this.fieldOptions()['type'];
67 }, 64 },
68 65
69 'optionValues': function () { 66 'optionValues': function () {
70 return MochiKit.Base.map(function (anOptionValue) { 67 return MochiKit.Base.map(function (anOptionValue) {
71 return { 68 return {
72 'label': anOptionValue['label'] || anOptionValue['value'], 69 'label': anOptionValue['label'] || anOptionValue['value'],
73 'value': anOptionValue['value'] 70 'value': anOptionValue['value']
74 } 71 }
75 }, this.fieldOptions()['options']); 72 }, this.fieldOptions()['options']);
76 }, 73 },
77 74
78 //------------------------------------------------------------------------- 75 //-------------------------------------------------------------------------
79 76
80 'selectedValue': function () { 77 'selectedValue': function () {
81 var result; 78 var result;
82 79
83 result = this.getElement('select').value; 80 result = this.getElement('select').value;
84 81
85 if (result == '---') { 82 if (result == '---') {
86 result = null; 83 result = null;
87 } 84 }
88 85
89 return result; 86 return result;
90 }, 87 },
91 88
92 'initialValue': function () { 89 'initialValue': function () {
93 return this._initialValue; 90 return this._initialValue;
94 }, 91 },
95 92
96 //========================================================================= 93 //=========================================================================
97 94
98 'renderSelf': function() { 95 'renderSelf': function() {
99//console.log(">>> DirectLoginEditingFormValueComponent.renderSelf"); 96//console.log(">>> DirectLoginEditingFormValueComponent.renderSelf");
100//console.log("FIELD OPTIONS", this.fieldOptions()); 97//console.log("FIELD OPTIONS", this.fieldOptions());
101//console.log("OPTION VALUES", this.optionValues()); 98//console.log("OPTION VALUES", this.optionValues());
102 this.append(this.element(), {tag:'div', id:this.getId('div'), cls:'formValue', children:[ 99 this.append(this.element(), {tag:'div', id:this.getId('div'), cls:'formValue', children:[
103 {tag:'span', cls:'formFieldName', html:this.formFieldName()}, 100 {tag:'span', cls:'formFieldName', html:this.formFieldName()},
104 {tag:'div', id:this.getId('values')} 101 {tag:'div', id:this.getId('values')}
105 ]}); 102 ]});
106 103
107 if ((this.fieldType() == 'radio') || (this.fieldType() == 'select')) { 104 if ((this.fieldType() == 'radio') || (this.fieldType() == 'select')) {
108 this.append(this.getElement('values'), 105 this.append(this.getElement('values'),
109 {tag:'select', name:this.formFieldName(), id:this.getId('select'), cls:'formFieldMatchinCardField', children: 106 {tag:'select', name:this.formFieldName(), id:this.getId('select'), cls:'formFieldMatchinCardField', children:
110 MochiKit.Base.flattenArguments( 107 MochiKit.Base.flattenArguments(
111 // {tag:'option', value:'---', html:"---"}, 108 // {tag:'option', value:'---', html:"---"},
112 MochiKit.Base.map( 109 MochiKit.Base.map(
113 MochiKit.Base.bind(function (aValue) { return {tag:'option', value:aValue['value'], html:aValue['label']}; }, this), 110 MochiKit.Base.bind(function (aValue) { return {tag:'option', value:aValue['value'], html:aValue['label']}; }, this),
114 this.optionValues() 111 this.optionValues()
115 ) 112 )
116 ) 113 )
117 } 114 }
118 ); 115 );
119 116
120 MochiKit.Signal.connect(this.getElement('select'), 'onchange', this, 'handleSelectChange'); 117 MochiKit.Signal.connect(this.getElement('select'), 'onchange', this, 'handleSelectChange');
121 118
122 if (! MochiKit.Base.isUndefinedOrNull(this.initialValue())) { 119 if (! MochiKit.Base.isUndefinedOrNull(this.initialValue())) {
123 var initiallySelectedOptions; 120 var initiallySelectedOptions;
124 initiallySelectedOptions = MochiKit.Selector.findChildElements(this.element(), ['option[value=' + this.initialValue() + ']']); 121 initiallySelectedOptions = MochiKit.Selector.findChildElements(this.element(), ['option[value=' + this.initialValue() + ']']);
125 if (initiallySelectedOptions.length == 1) { 122 if (initiallySelectedOptions.length == 1) {
126 MochiKit.DOM.updateNodeAttributes(initiallySelectedOptions[0], {selected:true}); 123 MochiKit.DOM.updateNodeAttributes(initiallySelectedOptions[0], {selected:true});
127 this.handleSelectChange(); 124 this.handleSelectChange();
128 } else { 125 } else {
129 Clipperz.DOM.Helper.insertBefore(this.getElement('select').childNodes[0], {tag:'option', value:'---', html:"", selected:true}); 126 Clipperz.DOM.Helper.insertBefore(this.getElement('select').childNodes[0], {tag:'option', value:'---', html:"", selected:true});
130 } 127 }
131 } else { 128 } else {
132 Clipperz.DOM.Helper.insertBefore(this.getElement('select').childNodes[0], {tag:'option', value:'---', html:"", selected:true}); 129 Clipperz.DOM.Helper.insertBefore(this.getElement('select').childNodes[0], {tag:'option', value:'---', html:"", selected:true});
133 } 130 }
134 } else if (this.fieldType() == 'checkbox') { 131 } else if (this.fieldType() == 'checkbox') {
135 this.append(this.getElement('values'), 132 this.append(this.getElement('values'),
136 {tag:'input', type:'checkbox', name:this.formFieldName(), id:this.getId('checkbox'), cls:'formFieldMatchinCardField'} 133 {tag:'input', type:'checkbox', name:this.formFieldName(), id:this.getId('checkbox'), cls:'formFieldMatchinCardField'}
137 ); 134 );
138 135
139 MochiKit.Signal.connect(this.getElement('checkbox'), 'onchange', this, 'handleSelectChange'); 136 MochiKit.Signal.connect(this.getElement('checkbox'), 'onchange', this, 'handleSelectChange');
140 137
141 if (this.initialValue()) { 138 if (this.initialValue()) {
142 MochiKit.DOM.updateNodeAttributes(this.getElement('checkbox'), {checked:true}); 139 MochiKit.DOM.updateNodeAttributes(this.getElement('checkbox'), {checked:true});
143 } 140 }
144 } else { 141 } else {
145 WTF = TODO; 142 WTF = TODO;
146 } 143 }
147//console.log("<<< DirectLoginEditingFormValueComponent.renderSelf"); 144//console.log("<<< DirectLoginEditingFormValueComponent.renderSelf");
148 }, 145 },
149 146
150 //========================================================================= 147 //=========================================================================
151 148
152 'handleSelectChange': function (anEvent) { 149 'handleSelectChange': function (anEvent) {
153//console.log("handleSelectChange", anEvent, anEvent.src(), anEvent.src().value); 150//console.log("handleSelectChange", anEvent, anEvent.src(), anEvent.src().value);
154 var options; 151 var options;
155 152
156 options = {}; 153 options = {};
157 154
158 options['fieldName'] = this.formFieldName(); 155 options['fieldName'] = this.formFieldName();
159 156
160 if (this.fieldType() == 'checkbox') { 157 if (this.fieldType() == 'checkbox') {
161 options['selectedValue'] = (this.getElement('checkbox').checked ? 1 : null); 158 options['selectedValue'] = (this.getElement('checkbox').checked ? 1 : null);
162 } else { 159 } else {
163 options['selectedValue'] = this.selectedValue(); 160 options['selectedValue'] = this.selectedValue();
164 } 161 }
165 162
166 MochiKit.Signal.signal(this, 'formValueChange', options); 163 MochiKit.Signal.signal(this, 'formValueChange', options);
167 }, 164 },
168 165
169 //========================================================================= 166 //=========================================================================
170 __syntaxFix__: "syntax fix" 167 __syntaxFix__: "syntax fix"
171}); 168});
172 169
173 170
174 171
175 172
176 173
177 174
178 175
179 176
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 1f49575..d8dc941 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginsColumnManager.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginsColumnManager.js
@@ -1,271 +1,268 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 26Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
30 27
31//############################################################################# 28//#############################################################################
32 29
33Clipperz.PM.UI.Web.Components.DirectLoginsColumnManager = function(args) { 30Clipperz.PM.UI.Web.Components.DirectLoginsColumnManager = function(args) {
34 args = args || {}; 31 args = args || {};
35 Clipperz.PM.UI.Web.Components.DirectLoginsColumnManager.superclass.constructor.call(this, args); 32 Clipperz.PM.UI.Web.Components.DirectLoginsColumnManager.superclass.constructor.call(this, args);
36 33
37 this._enterLeaveCounter = 0; 34 this._enterLeaveCounter = 0;
38 this._selectedRowObject = null; 35 this._selectedRowObject = null;
39 36
40 return this; 37 return this;
41} 38}
42 39
43//============================================================================= 40//=============================================================================
44 41
45Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DirectLoginsColumnManager, Clipperz.PM.UI.Web.Components.ColumnManager, { 42Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DirectLoginsColumnManager, Clipperz.PM.UI.Web.Components.ColumnManager, {
46 43
47 'toString': function () { 44 'toString': function () {
48 return "Clipperz.PM.UI.Web.Components.DirectLoginsColumnManager component"; 45 return "Clipperz.PM.UI.Web.Components.DirectLoginsColumnManager component";
49 }, 46 },
50 47
51 //------------------------------------------------------------------------- 48 //-------------------------------------------------------------------------
52 49
53 'renderHeader': function(aTRElement) { 50 'renderHeader': function(aTRElement) {
54 Clipperz.PM.UI.Web.Components.DirectLoginsColumnManager.superclass.renderHeader.call(this, aTRElement); 51 Clipperz.PM.UI.Web.Components.DirectLoginsColumnManager.superclass.renderHeader.call(this, aTRElement);
55 52
56 Clipperz.DOM.Helper.append(MochiKit.DOM.currentDocument().body, {tag:'div', cls:'DirectLoginListPopup', id:this.getId('DirectLoginListPopup'), children:[ 53 Clipperz.DOM.Helper.append(MochiKit.DOM.currentDocument().body, {tag:'div', cls:'DirectLoginListPopup', id:this.getId('DirectLoginListPopup'), children:[
57 {tag:'div', cls:'DirectLoginListPopup_body', children:[ 54 {tag:'div', cls:'DirectLoginListPopup_body', children:[
58 {tag:'ul', id:this.getId('DirectLoginListPopup_list'), children:[ 55 {tag:'ul', id:this.getId('DirectLoginListPopup_list'), children:[
59 // {tag:'li', children:[ 56 // {tag:'li', children:[
60 // {tag:'img', cls:'favicon', src:'http://www.microsoft.com/favicon.ico'}, 57 // {tag:'img', cls:'favicon', src:'http://www.microsoft.com/favicon.ico'},
61 // {tag:'a', href:'#', html:"Google Mail"} 58 // {tag:'a', href:'#', html:"Google Mail"}
62 // ]}, 59 // ]},
63 // ... 60 // ...
64 ]} 61 ]}
65 ]}, 62 ]},
66 {tag:'div', cls:'DirectLoginListPopup_footer'} 63 {tag:'div', cls:'DirectLoginListPopup_footer'}
67 ]}); 64 ]});
68 65
69 MochiKit.Style.hideElement(this.getId('DirectLoginListPopup')); 66 MochiKit.Style.hideElement(this.getId('DirectLoginListPopup'));
70 67
71 //BEWARE: use MochiKit.Signal.connect instead of this.connectEvent, as the HEADER is NOT redrawn after each refresh 68 //BEWARE: use MochiKit.Signal.connect instead of this.connectEvent, as the HEADER is NOT redrawn after each refresh
72 MochiKit.Signal.connect(this.getId('DirectLoginListPopup'), 'onmouseenter', this, 'handleDirectLoginListPopupEnter'); 69 MochiKit.Signal.connect(this.getId('DirectLoginListPopup'), 'onmouseenter', this, 'handleDirectLoginListPopupEnter');
73 MochiKit.Signal.connect(this.getId('DirectLoginListPopup'), 'onmouseleave', this, 'handleDirectLoginListPopupLeave'); 70 MochiKit.Signal.connect(this.getId('DirectLoginListPopup'), 'onmouseleave', this, 'handleDirectLoginListPopupLeave');
74 }, 71 },
75 72
76 //------------------------------------------------------------------------- 73 //-------------------------------------------------------------------------
77 74
78 'renderCell': function(aRowElement, anObject) { 75 'renderCell': function(aRowElement, anObject) {
79 var i,c; 76 var i,c;
80 var directLoginsInfo; 77 var directLoginsInfo;
81 78
82 directLoginsInfo = anObject[this.name()]; 79 directLoginsInfo = anObject[this.name()];
83 80
84 TDElement = Clipperz.DOM.Helper.append(aRowElement, {tag:'td', cls:'card_directLogins'}); 81 TDElement = Clipperz.DOM.Helper.append(aRowElement, {tag:'td', cls:'card_directLogins'});
85 82
86 c = Math.min(2, directLoginsInfo.length); 83 c = Math.min(2, directLoginsInfo.length);
87 for (i=0; i<c; i++) { 84 for (i=0; i<c; i++) {
88 var elementID; 85 var elementID;
89 86
90 elementID = 'directLogin_' + directLoginsInfo[i]['_reference']; 87 elementID = 'directLogin_' + directLoginsInfo[i]['_reference'];
91 88
92 Clipperz.DOM.Helper.append(TDElement, {tag:'div', cls:'card_directLogin', children:[ 89 Clipperz.DOM.Helper.append(TDElement, {tag:'div', cls:'card_directLogin', children:[
93 {tag:'div', cls:'card_directLogin_body', children:[ 90 {tag:'div', cls:'card_directLogin_body', children:[
94 {tag:'a', href:'#', id:elementID, html:directLoginsInfo[i]['label']} 91 {tag:'a', href:'#', id:elementID, html:directLoginsInfo[i]['label']}
95 ]} 92 ]}
96 ]}); 93 ]});
97 // MochiKit.Signal.connect(elementID, 'onclick', MochiKit.Base.method(this, 'handleDirectLoginClick', directLoginsInfo[i]['_rowObject'])); 94 // MochiKit.Signal.connect(elementID, 'onclick', MochiKit.Base.method(this, 'handleDirectLoginClick', directLoginsInfo[i]['_rowObject']));
98 this.connectEvent(elementID, 'onclick', MochiKit.Base.method(this, 'handleDirectLoginClick', directLoginsInfo[i]['_rowObject'])); 95 this.connectEvent(elementID, 'onclick', MochiKit.Base.method(this, 'handleDirectLoginClick', directLoginsInfo[i]['_rowObject']));
99 } 96 }
100 97
101 if (directLoginsInfo.length > 2) { 98 if (directLoginsInfo.length > 2) {
102 var ellipsesElement; 99 var ellipsesElement;
103 100
104 ellipsesElement = Clipperz.DOM.Helper.append(TDElement, {tag:'div', cls:'card_directLogin_ellipses', children:[ 101 ellipsesElement = Clipperz.DOM.Helper.append(TDElement, {tag:'div', cls:'card_directLogin_ellipses', children:[
105 {tag:'div', cls:'card_directLogin_ellipses_body', children:[ 102 {tag:'div', cls:'card_directLogin_ellipses_body', children:[
106 {tag:'span', html:'&hellip;'} 103 {tag:'span', html:'&hellip;'}
107 ]} 104 ]}
108 ]}); 105 ]});
109 106
110 /// MochiKit.Signal.connect(ellipsesElement, 'onmouseenter', MochiKit.Base.method(this, 'handleEllipsesEnter', anObject)); 107 /// MochiKit.Signal.connect(ellipsesElement, 'onmouseenter', MochiKit.Base.method(this, 'handleEllipsesEnter', anObject));
111 /// MochiKit.Signal.connect(ellipsesElement, 'onmouseleave', MochiKit.Base.method(this, 'handleEllipsesLeave')); 108 /// MochiKit.Signal.connect(ellipsesElement, 'onmouseleave', MochiKit.Base.method(this, 'handleEllipsesLeave'));
112 // MochiKit.Signal.connect(TDElement, 'onmouseleave', MochiKit.Base.method(this, 'handleTDLeave')); 109 // MochiKit.Signal.connect(TDElement, 'onmouseleave', MochiKit.Base.method(this, 'handleTDLeave'));
113 this.connectEvent(TDElement, 'onmouseleave', MochiKit.Base.method(this, 'handleTDLeave')); 110 this.connectEvent(TDElement, 'onmouseleave', MochiKit.Base.method(this, 'handleTDLeave'));
114 } 111 }
115 // MochiKit.Signal.connect(TDElement, 'onmouseenter', MochiKit.Base.method(this, 'handleTDEnter', anObject)); 112 // MochiKit.Signal.connect(TDElement, 'onmouseenter', MochiKit.Base.method(this, 'handleTDEnter', anObject));
116 this.connectEvent(TDElement, 'onmouseenter', MochiKit.Base.method(this, 'handleTDEnter', anObject)); 113 this.connectEvent(TDElement, 'onmouseenter', MochiKit.Base.method(this, 'handleTDEnter', anObject));
117 114
118 }, 115 },
119 116
120 //========================================================================= 117 //=========================================================================
121/* 118/*
122 'handleEllipsesEnter': function (aRecordInfo, anEvent) { 119 'handleEllipsesEnter': function (aRecordInfo, anEvent) {
123 this._enterLeaveCounter ++; 120 this._enterLeaveCounter ++;
124 if (this._enterLeaveCounter > 2) { 121 if (this._enterLeaveCounter > 2) {
125 this._enterLeaveCounter = 2; 122 this._enterLeaveCounter = 2;
126 } 123 }
127 124
128 if (this._enterLeaveCounter == 1) { 125 if (this._enterLeaveCounter == 1) {
129 this.showDirectLoginListPopup(aRecordInfo, anEvent.src()); 126 this.showDirectLoginListPopup(aRecordInfo, anEvent.src());
130 } 127 }
131 }, 128 },
132 129
133 'handleEllipsesLeave': function (anEvent) { 130 'handleEllipsesLeave': function (anEvent) {
134 this._enterLeaveCounter --; 131 this._enterLeaveCounter --;
135 132
136 MochiKit.Async.callLater(0.3, MochiKit.Base.bind(function () { 133 MochiKit.Async.callLater(0.3, MochiKit.Base.bind(function () {
137 if (this._enterLeaveCounter == 0) { 134 if (this._enterLeaveCounter == 0) {
138 this.hideDirectLoginListPopup(); 135 this.hideDirectLoginListPopup();
139 } 136 }
140 }, this)) 137 }, this))
141 }, 138 },
142*/ 139*/
143 //------------------------------------------------------------------------- 140 //-------------------------------------------------------------------------
144 141
145 'handleTDEnter': function (aRecordInfo, anEvent) { 142 'handleTDEnter': function (aRecordInfo, anEvent) {
146 if (MochiKit.Selector.findChildElements(anEvent.src(), ['div.card_directLogin_ellipses']).length > 0) { 143 if (MochiKit.Selector.findChildElements(anEvent.src(), ['div.card_directLogin_ellipses']).length > 0) {
147 this._enterLeaveCounter ++; 144 this._enterLeaveCounter ++;
148 if (this._enterLeaveCounter > 2) { 145 if (this._enterLeaveCounter > 2) {
149 this._enterLeaveCounter = 2; 146 this._enterLeaveCounter = 2;
150 } 147 }
151 148
152 if (this._enterLeaveCounter == 1) { 149 if (this._enterLeaveCounter == 1) {
153 this.showDirectLoginListPopup(aRecordInfo, anEvent.src()); 150 this.showDirectLoginListPopup(aRecordInfo, anEvent.src());
154 } 151 }
155 } else { 152 } else {
156 if (this._selectedRowObject != null) { 153 if (this._selectedRowObject != null) {
157 this.hideDirectLoginListPopup(); 154 this.hideDirectLoginListPopup();
158 } 155 }
159 } 156 }
160 }, 157 },
161 158
162 'handleTDLeave': function (anEvent) { 159 'handleTDLeave': function (anEvent) {
163 this._enterLeaveCounter --; 160 this._enterLeaveCounter --;
164 if (this._enterLeaveCounter < 0) { 161 if (this._enterLeaveCounter < 0) {
165 this._enterLeaveCounter = 0; 162 this._enterLeaveCounter = 0;
166 } 163 }
167 164
168 MochiKit.Async.callLater(0.3, MochiKit.Base.bind(function () { 165 MochiKit.Async.callLater(0.3, MochiKit.Base.bind(function () {
169 if (this._enterLeaveCounter == 0) { 166 if (this._enterLeaveCounter == 0) {
170 this.hideDirectLoginListPopup(); 167 this.hideDirectLoginListPopup();
171 } 168 }
172 }, this)) 169 }, this))
173 }, 170 },
174 171
175 //------------------------------------------------------------------------- 172 //-------------------------------------------------------------------------
176 173
177 'handleDirectLoginListPopupEnter': function (anEvent) { 174 'handleDirectLoginListPopupEnter': function (anEvent) {
178 this._enterLeaveCounter ++; 175 this._enterLeaveCounter ++;
179 if (this._enterLeaveCounter > 2) { 176 if (this._enterLeaveCounter > 2) {
180 this._enterLeaveCounter = 2; 177 this._enterLeaveCounter = 2;
181 } 178 }
182 }, 179 },
183 180
184 'handleDirectLoginListPopupLeave': function (anEvent) { 181 'handleDirectLoginListPopupLeave': function (anEvent) {
185 this._enterLeaveCounter --; 182 this._enterLeaveCounter --;
186 if (this._enterLeaveCounter < 0) { 183 if (this._enterLeaveCounter < 0) {
187 this._enterLeaveCounter = 0; 184 this._enterLeaveCounter = 0;
188 } 185 }
189 186
190 MochiKit.Async.callLater(0.3, MochiKit.Base.bind(function () { 187 MochiKit.Async.callLater(0.3, MochiKit.Base.bind(function () {
191 if (this._enterLeaveCounter == 0) { 188 if (this._enterLeaveCounter == 0) {
192 this.hideDirectLoginListPopup(); 189 this.hideDirectLoginListPopup();
193 } 190 }
194 }, this)) 191 }, this))
195 }, 192 },
196 193
197 //========================================================================= 194 //=========================================================================
198 195
199 'showDirectLoginListPopup': function (aRecordInfo, anElement) { 196 'showDirectLoginListPopup': function (aRecordInfo, anElement) {
200 var position; 197 var position;
201 var directLoginsInfo; 198 var directLoginsInfo;
202 var directLoginsListElement; 199 var directLoginsListElement;
203 var ellipsesElement; 200 var ellipsesElement;
204 201
205 202
206 ellipsesElement = MochiKit.Selector.findChildElements(anElement, ['div.card_directLogin_ellipses'])[0]; 203 ellipsesElement = MochiKit.Selector.findChildElements(anElement, ['div.card_directLogin_ellipses'])[0];
207 position = MochiKit.Style.getElementPosition(ellipsesElement); 204 position = MochiKit.Style.getElementPosition(ellipsesElement);
208 // position = MochiKit.Style.getElementPosition(anElement); 205 // position = MochiKit.Style.getElementPosition(anElement);
209 position.x += 14; 206 position.x += 14;
210 position.y -= 26; 207 position.y -= 26;
211 208
212 MochiKit.Style.setElementPosition(this.getId('DirectLoginListPopup'), position /*[, units='px'] */); 209 MochiKit.Style.setElementPosition(this.getId('DirectLoginListPopup'), position /*[, units='px'] */);
213 210
214 directLoginsListElement = this.getElement('DirectLoginListPopup_list'); 211 directLoginsListElement = this.getElement('DirectLoginListPopup_list');
215 directLoginsListElement.innerHTML = ''; 212 directLoginsListElement.innerHTML = '';
216 213
217 directLoginsInfo = aRecordInfo[this.name()]; 214 directLoginsInfo = aRecordInfo[this.name()];
218 c = directLoginsInfo.length; 215 c = directLoginsInfo.length;
219 for (i=0; i<c; i++) { 216 for (i=0; i<c; i++) {
220 varelementID; 217 varelementID;
221 varlabel; 218 varlabel;
222 var trunkedLabel; 219 var trunkedLabel;
223 220
224 label = directLoginsInfo[i]['label']; 221 label = directLoginsInfo[i]['label'];
225 trunkedLabel = (label.length > 20 ? label.slice(0,20) + '&hellip;' : label); 222 trunkedLabel = (label.length > 20 ? label.slice(0,20) + '&hellip;' : label);
226 223
227 elementID = this.getId('directLoginList_' + directLoginsInfo[i]['_reference']); 224 elementID = this.getId('directLoginList_' + directLoginsInfo[i]['_reference']);
228 225
229 Clipperz.DOM.Helper.append(directLoginsListElement, {tag:'li', children:[ 226 Clipperz.DOM.Helper.append(directLoginsListElement, {tag:'li', children:[
230 {tag:'div', children:[ 227 {tag:'div', children:[
231 {tag:'img', cls:'favicon', src:directLoginsInfo[i]['favicon']}, 228 {tag:'img', cls:'favicon', src:directLoginsInfo[i]['favicon']},
232 (label == trunkedLabel ? {tag:'a', href:'#', id:elementID, html:trunkedLabel} : {tag:'a', href:'#', id:elementID, title:label, html:trunkedLabel}) 229 (label == trunkedLabel ? {tag:'a', href:'#', id:elementID, html:trunkedLabel} : {tag:'a', href:'#', id:elementID, title:label, html:trunkedLabel})
233 ]} 230 ]}
234 ]}); 231 ]});
235 232
236 // MochiKit.Signal.connect(elementID, 'onclick', MochiKit.Base.method(this, 'handleDirectLoginClick', directLoginsInfo[i]['_rowObject'])); 233 // MochiKit.Signal.connect(elementID, 'onclick', MochiKit.Base.method(this, 'handleDirectLoginClick', directLoginsInfo[i]['_rowObject']));
237 this.connectEvent(elementID, 'onclick', MochiKit.Base.method(this, 'handleDirectLoginClick', directLoginsInfo[i]['_rowObject'])); 234 this.connectEvent(elementID, 'onclick', MochiKit.Base.method(this, 'handleDirectLoginClick', directLoginsInfo[i]['_rowObject']));
238 } 235 }
239 236
240 // MochiKit.Style.showElement(this.getId('DirectLoginListPopup')); 237 // MochiKit.Style.showElement(this.getId('DirectLoginListPopup'));
241 MochiKit.Visual.appear(this.getId('DirectLoginListPopup'), {duration:0.5}); 238 MochiKit.Visual.appear(this.getId('DirectLoginListPopup'), {duration:0.5});
242 MochiKit.Signal.signal(this, 'selectRow', aRecordInfo); 239 MochiKit.Signal.signal(this, 'selectRow', aRecordInfo);
243 240
244 this._selectedRowObject = aRecordInfo; 241 this._selectedRowObject = aRecordInfo;
245 }, 242 },
246 243
247 //------------------------------------------------------------------------- 244 //-------------------------------------------------------------------------
248 245
249 'hideDirectLoginListPopup': function () { 246 'hideDirectLoginListPopup': function () {
250 if (this._selectedRowObject != null) { 247 if (this._selectedRowObject != null) {
251 MochiKit.Signal.signal(this, 'unselectRow', this._selectedRowObject); 248 MochiKit.Signal.signal(this, 'unselectRow', this._selectedRowObject);
252 MochiKit.Visual.fade(this.getId('DirectLoginListPopup'), {duration:0.5}); 249 MochiKit.Visual.fade(this.getId('DirectLoginListPopup'), {duration:0.5});
253 this._selectedRowObject = null; 250 this._selectedRowObject = null;
254 this._enterLeaveCounter = 0; 251 this._enterLeaveCounter = 0;
255 } 252 }
256 }, 253 },
257 254
258 //========================================================================= 255 //=========================================================================
259 256
260 'handleDirectLoginClick': function (aDirectLogin, anEvent) { 257 'handleDirectLoginClick': function (aDirectLogin, anEvent) {
261 anEvent.preventDefault(); 258 anEvent.preventDefault();
262 // aDirectLogin.runDirectLogin(); 259 // aDirectLogin.runDirectLogin();
263 Clipperz.PM.UI.Common.Controllers.DirectLoginRunner.openDirectLogin(aDirectLogin); 260 Clipperz.PM.UI.Common.Controllers.DirectLoginRunner.openDirectLogin(aDirectLogin);
264 }, 261 },
265 262
266 //------------------------------------------------------------------------- 263 //-------------------------------------------------------------------------
267 264
268 '__syntax_fix__' : 'syntax fix' 265 '__syntax_fix__' : 'syntax fix'
269 266
270}); 267});
271 268
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 19d1635..6297002 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/FaviconColumnManager.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/FaviconColumnManager.js
@@ -1,89 +1,86 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 26Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
30 27
31//############################################################################# 28//#############################################################################
32 29
33Clipperz.PM.UI.Web.Components.FaviconColumnManager = function(args) { 30Clipperz.PM.UI.Web.Components.FaviconColumnManager = function(args) {
34 args = args || {}; 31 args = args || {};
35 Clipperz.PM.UI.Web.Components.FaviconColumnManager.superclass.constructor.call(this, args); 32 Clipperz.PM.UI.Web.Components.FaviconColumnManager.superclass.constructor.call(this, args);
36 33
37 return this; 34 return this;
38} 35}
39 36
40//============================================================================= 37//=============================================================================
41 38
42Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.FaviconColumnManager, Clipperz.PM.UI.Web.Components.ColumnManager, { 39Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.FaviconColumnManager, Clipperz.PM.UI.Web.Components.ColumnManager, {
43 40
44 'toString': function () { 41 'toString': function () {
45 return "Clipperz.PM.UI.Web.Components.FaviconColumnManager component"; 42 return "Clipperz.PM.UI.Web.Components.FaviconColumnManager component";
46 }, 43 },
47 44
48 //------------------------------------------------------------------------- 45 //-------------------------------------------------------------------------
49 46
50 'renderCell': function(aRowElement, anObject) { 47 'renderCell': function(aRowElement, anObject) {
51 varfaviconImageElement; 48 varfaviconImageElement;
52 var faviconUrl; 49 var faviconUrl;
53 50
54 faviconImageElement = this.getId('favicon'); 51 faviconImageElement = this.getId('favicon');
55 faviconUrl = anObject[this.name()]; 52 faviconUrl = anObject[this.name()];
56 53
57 if (faviconUrl == null) { 54 if (faviconUrl == null) {
58 faviconUrl = Clipperz.PM.Strings.getValue('defaultFaviconUrl'); 55 faviconUrl = Clipperz.PM.Strings.getValue('defaultFaviconUrl');
59 } 56 }
60 57
61 Clipperz.DOM.Helper.append(aRowElement, {tag:'td', cls:this.cssClass(), children:[ 58 Clipperz.DOM.Helper.append(aRowElement, {tag:'td', cls:this.cssClass(), children:[
62 {tag:'img', id:faviconImageElement, src:faviconUrl} 59 {tag:'img', id:faviconImageElement, src:faviconUrl}
63 ]}); 60 ]});
64 61
65 MochiKit.Signal.connect(faviconImageElement, 'onload', this, 'handleLoadedFaviconImage'); 62 MochiKit.Signal.connect(faviconImageElement, 'onload', this, 'handleLoadedFaviconImage');
66 MochiKit.Signal.connect(faviconImageElement, 'onerror', this, 'handleMissingFaviconImage'); 63 MochiKit.Signal.connect(faviconImageElement, 'onerror', this, 'handleMissingFaviconImage');
67 MochiKit.Signal.connect(faviconImageElement, 'onabort', this, 'handleMissingFaviconImage'); 64 MochiKit.Signal.connect(faviconImageElement, 'onabort', this, 'handleMissingFaviconImage');
68 }, 65 },
69 66
70 //----------------------------------------------------- 67 //-----------------------------------------------------
71 68
72 'handleLoadedFaviconImage': function(anEvent) { 69 'handleLoadedFaviconImage': function(anEvent) {
73 MochiKit.Signal.disconnectAllTo(anEvent.src()); 70 MochiKit.Signal.disconnectAllTo(anEvent.src());
74 if (anEvent.src().complete == false) { 71 if (anEvent.src().complete == false) {
75 anEvent.src().src = Clipperz.PM.Strings.getValue('defaultFaviconUrl'); 72 anEvent.src().src = Clipperz.PM.Strings.getValue('defaultFaviconUrl');
76 } 73 }
77 }, 74 },
78 75
79 //----------------------------------------------------- 76 //-----------------------------------------------------
80 77
81 'handleMissingFaviconImage': function(anEvent) { 78 'handleMissingFaviconImage': function(anEvent) {
82 MochiKit.Signal.disconnectAllTo(anEvent.src()); 79 MochiKit.Signal.disconnectAllTo(anEvent.src());
83 anEvent.src().src = Clipperz.PM.Strings.getValue('defaultFaviconUrl'); 80 anEvent.src().src = Clipperz.PM.Strings.getValue('defaultFaviconUrl');
84 }, 81 },
85 82
86 //----------------------------------------------------- 83 //-----------------------------------------------------
87 '__syntax_fix__' : 'syntax fix' 84 '__syntax_fix__' : 'syntax fix'
88}); 85});
89 86
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 8b3e6c9..51d55f4 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/GridComponent.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/GridComponent.js
@@ -1,262 +1,259 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 26Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
30 27
31Clipperz.PM.UI.Web.Components.GridComponent = function(args) { 28Clipperz.PM.UI.Web.Components.GridComponent = function(args) {
32 args = args || {}; 29 args = args || {};
33 30
34 Clipperz.PM.UI.Web.Components.GridComponent.superclass.constructor.apply(this, arguments); 31 Clipperz.PM.UI.Web.Components.GridComponent.superclass.constructor.apply(this, arguments);
35 32
36 this._columnsManagers = args.columnsManagers; 33 this._columnsManagers = args.columnsManagers;
37 34
38 this._rowsObjects = []; 35 this._rowsObjects = [];
39 this._noRowsGridComponent = null; 36 this._noRowsGridComponent = null;
40 37
41 this._slots = { 38 this._slots = {
42 'headerSlot':this.getId('headerSlot') 39 'headerSlot':this.getId('headerSlot')
43 }; 40 };
44 41
45 return this; 42 return this;
46} 43}
47 44
48//============================================================================= 45//=============================================================================
49 46
50Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.GridComponent, Clipperz.PM.UI.Common.Components.BaseComponent, { 47Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.GridComponent, Clipperz.PM.UI.Common.Components.BaseComponent, {
51 48
52 //------------------------------------------------------------------------- 49 //-------------------------------------------------------------------------
53 50
54 'toString': function () { 51 'toString': function () {
55 return "Clipperz.PM.UI.Web.Components.GridComponent component"; 52 return "Clipperz.PM.UI.Web.Components.GridComponent component";
56 }, 53 },
57 54
58 //------------------------------------------------------------------------- 55 //-------------------------------------------------------------------------
59 56
60 'rows': function () { 57 'rows': function () {
61 throw Clipperz.Base.exception.AbstractMethod; 58 throw Clipperz.Base.exception.AbstractMethod;
62 // return this._rows; 59 // return this._rows;
63 }, 60 },
64 61
65 //------------------------------------------------------------------------- 62 //-------------------------------------------------------------------------
66 63
67 'columnsManagers': function () { 64 'columnsManagers': function () {
68 return this._columnsManagers; 65 return this._columnsManagers;
69 }, 66 },
70 67
71 //------------------------------------------------------------------------- 68 //-------------------------------------------------------------------------
72 69
73 'renderSelf': function(/*aContainer, aPosition*/) { 70 'renderSelf': function(/*aContainer, aPosition*/) {
74 this.append(this.element(), [ 71 this.append(this.element(), [
75 {tag:'div', cls:'header', children:[ 72 {tag:'div', cls:'header', children:[
76 {tag:'form', id:this.getId('searchForm'), cls:'search', children:[ 73 {tag:'form', id:this.getId('searchForm'), cls:'search', children:[
77 {tag:'div', cls:'search', children:[ 74 {tag:'div', cls:'search', children:[
78 {tag:'input', type:'text', id:this.getId('search'), cls:'search', placeholder:"search", name:'textToSearch'/*, value:"clipperz"*/} 75 {tag:'input', type:'text', id:this.getId('search'), cls:'search', placeholder:"search", name:'textToSearch'/*, value:"clipperz"*/}
79 ]}, 76 ]},
80 {tag:'div', cls:'clearSearchButton', id:this.getId('clearSearch')}, 77 {tag:'div', cls:'clearSearchButton', id:this.getId('clearSearch')},
81 // {tag:'input', type:'button', cls:'searchButton', name:'searchButton', value:"search"}, 78 // {tag:'input', type:'button', cls:'searchButton', name:'searchButton', value:"search"},
82 {tag:'div', cls:'headerSlot', id:this.getId('headerSlot')} 79 {tag:'div', cls:'headerSlot', id:this.getId('headerSlot')}
83 ]} 80 ]}
84 ]}, 81 ]},
85 {tag:'div', cls:'body', children:[ 82 {tag:'div', cls:'body', children:[
86 {tag:'div', cls:'rows', id:this.getId('rows'), children:[ 83 {tag:'div', cls:'rows', id:this.getId('rows'), children:[
87 {tag:'table', cellpadding:'0', cellspacing:'0', cls:'rows', children:[ 84 {tag:'table', cellpadding:'0', cellspacing:'0', cls:'rows', children:[
88 {tag:'thead', children:[ 85 {tag:'thead', children:[
89 {tag:'tr', id:this.getId('thead_tr'), children:[]} 86 {tag:'tr', id:this.getId('thead_tr'), children:[]}
90 ]}, 87 ]},
91 {tag:'tbody', id:this.getId('gridRows'), children:[]} 88 {tag:'tbody', id:this.getId('gridRows'), children:[]}
92 ]} 89 ]}
93 ]}, 90 ]},
94 {tag:'div', cls:'noRowsBlock', id:this.getId('noRowsBlock'), children:[]} 91 {tag:'div', cls:'noRowsBlock', id:this.getId('noRowsBlock'), children:[]}
95 ]}, 92 ]},
96 {tag:'div', cls:'footer'} 93 {tag:'div', cls:'footer'}
97 ]); 94 ]);
98 95
99 this.renderHeader(); 96 this.renderHeader();
100 MochiKit.Signal.connect(this.getId('clearSearch'), 'onclick', this, 'clearSearchHandler'); 97 MochiKit.Signal.connect(this.getId('clearSearch'), 'onclick', this, 'clearSearchHandler');
101 }, 98 },
102 99
103 //------------------------------------------------------------------------- 100 //-------------------------------------------------------------------------
104 101
105 'renderHeader': function () { 102 'renderHeader': function () {
106 var headerElement; 103 var headerElement;
107 104
108 headerElement = this.getElement('thead_tr'); 105 headerElement = this.getElement('thead_tr');
109 headerElement.innerHTML = ""; 106 headerElement.innerHTML = "";
110 107
111 MochiKit.Iter.forEach(this.columnsManagers(), function (aColumnManager) { 108 MochiKit.Iter.forEach(this.columnsManagers(), function (aColumnManager) {
112 aColumnManager.renderHeader(headerElement); 109 aColumnManager.renderHeader(headerElement);
113 }); 110 });
114 }, 111 },
115 112
116 //------------------------------------------------------------------------- 113 //-------------------------------------------------------------------------
117 114
118 'update': function (someObjects) { 115 'update': function (someObjects) {
119 this._rowsObjects = someObjects 116 this._rowsObjects = someObjects
120 this.refresh(); 117 this.refresh();
121 this.focus(); 118 this.focus();
122 }, 119 },
123 120
124 'focus': function () { 121 'focus': function () {
125 this.getElement('search').focus(); 122 this.getElement('search').focus();
126 }, 123 },
127 124
128 //------------------------------------------------------------------------- 125 //-------------------------------------------------------------------------
129 126
130 'startSearch': function () { 127 'startSearch': function () {
131//console.log("--> startSearch"); 128//console.log("--> startSearch");
132 MochiKit.DOM.addElementClass(this.getElement('search'), 'running'); 129 MochiKit.DOM.addElementClass(this.getElement('search'), 'running');
133 }, 130 },
134 131
135 'endSearch': function () { 132 'endSearch': function () {
136 MochiKit.DOM.removeElementClass(this.getElement('search'), 'running'); 133 MochiKit.DOM.removeElementClass(this.getElement('search'), 'running');
137//console.log("<-- startSearch"); 134//console.log("<-- startSearch");
138 }, 135 },
139 136
140 //------------------------------------------------------------------------- 137 //-------------------------------------------------------------------------
141 138
142 'disconnectColumnManagersRowsSignals': function () { 139 'disconnectColumnManagersRowsSignals': function () {
143 MochiKit.Iter.forEach(this.columnsManagers(), function (aColumnManager) { 140 MochiKit.Iter.forEach(this.columnsManagers(), function (aColumnManager) {
144 aColumnManager.disconnectRowsSignals(); 141 aColumnManager.disconnectRowsSignals();
145 }); 142 });
146 }, 143 },
147 144
148 //------------------------------------------------------------------------- 145 //-------------------------------------------------------------------------
149 146
150 'refresh': function () { 147 'refresh': function () {
151 var gridRowsElement; 148 var gridRowsElement;
152 var rowClass; 149 var rowClass;
153 150
154 this.disconnectColumnManagersRowsSignals(); 151 this.disconnectColumnManagersRowsSignals();
155 152
156 { 153 {
157 MochiKit.DOM.removeElementClass(this.getElement('search'), 'disabled'); 154 MochiKit.DOM.removeElementClass(this.getElement('search'), 'disabled');
158 // MochiKit.DOM.setNodeAttribute(this.getElement('search'), 'disabled', null); 155 // MochiKit.DOM.setNodeAttribute(this.getElement('search'), 'disabled', null);
159 MochiKit.DOM.removeElementClass(this.element(), 'empty'); 156 MochiKit.DOM.removeElementClass(this.element(), 'empty');
160 MochiKit.DOM.removeElementClass(this.element(), 'noRows'); 157 MochiKit.DOM.removeElementClass(this.element(), 'noRows');
161 } 158 }
162 159
163 160
164 gridRowsElement = this.getElement('gridRows'); 161 gridRowsElement = this.getElement('gridRows');
165 gridRowsElement.innerHTML = ""; 162 gridRowsElement.innerHTML = "";
166 163
167 MochiKit.DOM.removeElementClass(this.element(), 'empty'); 164 MochiKit.DOM.removeElementClass(this.element(), 'empty');
168 165
169 rowClass = 'odd'; 166 rowClass = 'odd';
170 MochiKit.Iter.forEach(this._rowsObjects, MochiKit.Base.bind(function (aRowObject) { 167 MochiKit.Iter.forEach(this._rowsObjects, MochiKit.Base.bind(function (aRowObject) {
171 var cardRowElement; 168 var cardRowElement;
172 169
173 cardRowElement = this.append(gridRowsElement, {tag:'tr', id:this.getId(aRowObject['_reference']), cls:rowClass}); 170 cardRowElement = this.append(gridRowsElement, {tag:'tr', id:this.getId(aRowObject['_reference']), cls:rowClass});
174 MochiKit.Iter.forEach(this.columnsManagers(), function (aColumnManager) { 171 MochiKit.Iter.forEach(this.columnsManagers(), function (aColumnManager) {
175 aColumnManager.renderCell(cardRowElement, aRowObject); 172 aColumnManager.renderCell(cardRowElement, aRowObject);
176 }); 173 });
177 174
178 rowClass = (rowClass == 'odd') ? 'even' : 'odd'; 175 rowClass = (rowClass == 'odd') ? 'even' : 'odd';
179 }, this)); 176 }, this));
180 }, 177 },
181 178
182 //----------------------------------------------------------------------------- 179 //-----------------------------------------------------------------------------
183 180
184 'filterElement': function () { 181 'filterElement': function () {
185 return this.getElement('search'); 182 return this.getElement('search');
186 }, 183 },
187 184
188 //------------------------------------------------------------------------- 185 //-------------------------------------------------------------------------
189 186
190 'shouldShowElementWhileRendering': function () { 187 'shouldShowElementWhileRendering': function () {
191 return false; 188 return false;
192 }, 189 },
193 190
194 //------------------------------------------------------------------------- 191 //-------------------------------------------------------------------------
195 192
196 'selectRow': function (aRowObject) { 193 'selectRow': function (aRowObject) {
197 MochiKit.DOM.addElementClass(this.getId(aRowObject['_reference']), 'selected'); 194 MochiKit.DOM.addElementClass(this.getId(aRowObject['_reference']), 'selected');
198 }, 195 },
199 196
200 'unselectRow': function (aRowObject) { 197 'unselectRow': function (aRowObject) {
201 MochiKit.DOM.removeElementClass(this.getId(aRowObject['_reference']), 'selected'); 198 MochiKit.DOM.removeElementClass(this.getId(aRowObject['_reference']), 'selected');
202 }, 199 },
203 200
204 //------------------------------------------------------------------------- 201 //-------------------------------------------------------------------------
205 /* 202 /*
206 'passOpenDirectLogin': function(aDirectLoginReferenceId) { 203 'passOpenDirectLogin': function(aDirectLoginReferenceId) {
207 MochiKit.Signal.signal(this, 'openDirectLogin', aDirectLoginReferenceId); 204 MochiKit.Signal.signal(this, 'openDirectLogin', aDirectLoginReferenceId);
208 }, 205 },
209 */ 206 */
210 //------------------------------------------------------------------------- 207 //-------------------------------------------------------------------------
211 208
212 'clearSearchHandler': function (anEvent) { 209 'clearSearchHandler': function (anEvent) {
213 var searchElement; 210 var searchElement;
214 211
215 anEvent.preventDefault(); 212 anEvent.preventDefault();
216 213
217 searchElement = this.getElement('search'); 214 searchElement = this.getElement('search');
218 searchElement.value = ""; 215 searchElement.value = "";
219 searchElement.focus(); 216 searchElement.focus();
220 }, 217 },
221 218
222 //------------------------------------------------------------------------- 219 //-------------------------------------------------------------------------
223 220
224 'drawEmpty': function () { 221 'drawEmpty': function () {
225 this.disconnectColumnManagersRowsSignals(); 222 this.disconnectColumnManagersRowsSignals();
226 MochiKit.DOM.addElementClass(this.getElement('search'), 'disabled'); 223 MochiKit.DOM.addElementClass(this.getElement('search'), 'disabled');
227 // MochiKit.DOM.setNodeAttribute(this.getElement('search'), 'disabled', 'disabled'); 224 // MochiKit.DOM.setNodeAttribute(this.getElement('search'), 'disabled', 'disabled');
228 225
229 gridRowsElement = this.getElement('gridRows'); 226 gridRowsElement = this.getElement('gridRows');
230 gridRowsElement.innerHTML = ""; 227 gridRowsElement.innerHTML = "";
231 MochiKit.DOM.addElementClass(this.element(), 'empty'); 228 MochiKit.DOM.addElementClass(this.element(), 'empty');
232 }, 229 },
233 230
234 //------------------------------------------------------------------------- 231 //-------------------------------------------------------------------------
235 232
236 'setNoRowsGridComponent': function (aComponent) { 233 'setNoRowsGridComponent': function (aComponent) {
237 this.removeNoRowsGridComponent(); 234 this.removeNoRowsGridComponent();
238 this._noRowsGridComponent = aComponent; 235 this._noRowsGridComponent = aComponent;
239 236
240 this.disconnectColumnManagersRowsSignals(); 237 this.disconnectColumnManagersRowsSignals();
241 MochiKit.DOM.addElementClass(this.getElement('search'), 'disabled'); 238 MochiKit.DOM.addElementClass(this.getElement('search'), 'disabled');
242 // MochiKit.DOM.setNodeAttribute(this.getElement('search'), 'disabled', 'disabled'); 239 // MochiKit.DOM.setNodeAttribute(this.getElement('search'), 'disabled', 'disabled');
243 240
244 gridRowsElement = this.getElement('gridRows'); 241 gridRowsElement = this.getElement('gridRows');
245 gridRowsElement.innerHTML = ""; 242 gridRowsElement.innerHTML = "";
246 MochiKit.DOM.addElementClass(this.element(), 'noRows'); 243 MochiKit.DOM.addElementClass(this.element(), 'noRows');
247 244
248 if (aComponent != null) { 245 if (aComponent != null) {
249 aComponent.renderInNode(this.getElement('noRowsBlock')); 246 aComponent.renderInNode(this.getElement('noRowsBlock'));
250 } 247 }
251 }, 248 },
252 249
253 'removeNoRowsGridComponent': function () { 250 'removeNoRowsGridComponent': function () {
254 if (this._noRowsGridComponent != null) { 251 if (this._noRowsGridComponent != null) {
255 this._noRowsGridComponent.remove(); 252 this._noRowsGridComponent.remove();
256 this._noRowsGridComponent = null; 253 this._noRowsGridComponent = null;
257 } 254 }
258 }, 255 },
259 256
260 //------------------------------------------------------------------------- 257 //-------------------------------------------------------------------------
261 __syntaxFix__: "syntax fix" 258 __syntaxFix__: "syntax fix"
262}); 259});
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 07b8dcc..3e03fcf 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/ImageColumnManager.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/ImageColumnManager.js
@@ -1,68 +1,65 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 26Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
30 27
31//############################################################################# 28//#############################################################################
32 29
33Clipperz.PM.UI.Web.Components.ImageColumnManager = function(args) { 30Clipperz.PM.UI.Web.Components.ImageColumnManager = function(args) {
34 args = args || {}; 31 args = args || {};
35 Clipperz.PM.UI.Web.Components.ImageColumnManager.superclass.constructor.call(this, args); 32 Clipperz.PM.UI.Web.Components.ImageColumnManager.superclass.constructor.call(this, args);
36 33
37 return this; 34 return this;
38} 35}
39 36
40//============================================================================= 37//=============================================================================
41 38
42Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.ImageColumnManager, Clipperz.PM.UI.Web.Components.ColumnManager, { 39Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.ImageColumnManager, Clipperz.PM.UI.Web.Components.ColumnManager, {
43 40
44 'toString': function () { 41 'toString': function () {
45 return "Clipperz.PM.UI.Web.Components.ImageColumnManager component"; 42 return "Clipperz.PM.UI.Web.Components.ImageColumnManager component";
46 }, 43 },
47 44
48 //------------------------------------------------------------------------- 45 //-------------------------------------------------------------------------
49 46
50 'renderCell': function(aRowElement, anObject) { 47 'renderCell': function(aRowElement, anObject) {
51 Clipperz.DOM.Helper.append(aRowElement, {tag:'td', cls:this.cssClass(), children:[ 48 Clipperz.DOM.Helper.append(aRowElement, {tag:'td', cls:this.cssClass(), children:[
52 {tag:'img', src:anObject[this.name()]} 49 {tag:'img', src:anObject[this.name()]}
53 ]}); 50 ]});
54 51
55 // return Clipperz.Async.callbacks("ImageColumnManager.renderCell", [ 52 // return Clipperz.Async.callbacks("ImageColumnManager.renderCell", [
56 // this.selector(), 53 // this.selector(),
57 // MochiKit.Base.bind(function (aValue) { 54 // MochiKit.Base.bind(function (aValue) {
58 // Clipperz.DOM.Helper.append(aRowElement, {tag:'td', cls:this.cssClass(), children:[ 55 // Clipperz.DOM.Helper.append(aRowElement, {tag:'td', cls:this.cssClass(), children:[
59 // {tag:'img', src:aValue} 56 // {tag:'img', src:aValue}
60 // ]}); 57 // ]});
61 // }, this) 58 // }, this)
62 // ], {trace:false}, anObject); 59 // ], {trace:false}, anObject);
63 }, 60 },
64 61
65 //----------------------------------------------------- 62 //-----------------------------------------------------
66 '__syntax_fix__' : 'syntax fix' 63 '__syntax_fix__' : 'syntax fix'
67}); 64});
68 65
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 e833190..f3f9cd5 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/LinkColumnManager.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/LinkColumnManager.js
@@ -1,92 +1,89 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 26Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
30 27
31//############################################################################# 28//#############################################################################
32 29
33Clipperz.PM.UI.Web.Components.LinkColumnManager = function(args) { 30Clipperz.PM.UI.Web.Components.LinkColumnManager = function(args) {
34 args = args || {}; 31 args = args || {};
35 Clipperz.PM.UI.Web.Components.LinkColumnManager.superclass.constructor.call(this, args); 32 Clipperz.PM.UI.Web.Components.LinkColumnManager.superclass.constructor.call(this, args);
36 33
37 this._actionMethod = args.actionMethod || null; 34 this._actionMethod = args.actionMethod || null;
38 35
39 return this; 36 return this;
40} 37}
41 38
42//============================================================================= 39//=============================================================================
43 40
44Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.LinkColumnManager, Clipperz.PM.UI.Web.Components.ColumnManager, { 41Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.LinkColumnManager, Clipperz.PM.UI.Web.Components.ColumnManager, {
45 42
46 'toString': function () { 43 'toString': function () {
47 return "Clipperz.PM.UI.Web.Components.DateColumnManager component"; 44 return "Clipperz.PM.UI.Web.Components.DateColumnManager component";
48 }, 45 },
49 46
50 //------------------------------------------------------------------------- 47 //-------------------------------------------------------------------------
51 48
52 'actionMethod': function () { 49 'actionMethod': function () {
53 return this._actionMethod; 50 return this._actionMethod;
54 }, 51 },
55 52
56 //------------------------------------------------------------------------- 53 //-------------------------------------------------------------------------
57 54
58 'renderCell': function(aRowElement, anObject) { 55 'renderCell': function(aRowElement, anObject) {
59 vartdElement; 56 vartdElement;
60 varlinkElement; 57 varlinkElement;
61 58
62 tdElement = Clipperz.DOM.Helper.append(aRowElement, {tag:'td', cls:this.cssClass(), children:[ 59 tdElement = Clipperz.DOM.Helper.append(aRowElement, {tag:'td', cls:this.cssClass(), children:[
63 {tag:'span', children:[ 60 {tag:'span', children:[
64 {tag:'a', href:'#', html:anObject[this.name()]} 61 {tag:'a', href:'#', html:anObject[this.name()]}
65 ]} 62 ]}
66 ]}); 63 ]});
67 64
68 linkElement = MochiKit.DOM.getFirstElementByTagAndClassName('a', null, tdElement); 65 linkElement = MochiKit.DOM.getFirstElementByTagAndClassName('a', null, tdElement);
69 // MochiKit.Signal.connect(linkElement, 'onclick', MochiKit.Base.method(this, 'handleLinkClick', anObject['_rowObject'])); 66 // MochiKit.Signal.connect(linkElement, 'onclick', MochiKit.Base.method(this, 'handleLinkClick', anObject['_rowObject']));
70 this.connectEvent(linkElement, 'onclick', MochiKit.Base.method(this, 'handleLinkClick', anObject['_rowObject'])); 67 this.connectEvent(linkElement, 'onclick', MochiKit.Base.method(this, 'handleLinkClick', anObject['_rowObject']));
71 }, 68 },
72 69
73 //----------------------------------------------------- 70 //-----------------------------------------------------
74 71
75 'handleLinkClick': function (anObject, anEvent) { 72 'handleLinkClick': function (anObject, anEvent) {
76 anEvent.preventDefault(); 73 anEvent.preventDefault();
77 74
78 if (this.actionMethod() != null) { 75 if (this.actionMethod() != null) {
79 var deferredResult; 76 var deferredResult;
80 77
81 deferredResult = new Clipperz.Async.Deferred("LinkColumnManager.handleLinkClick", {trace:false}); 78 deferredResult = new Clipperz.Async.Deferred("LinkColumnManager.handleLinkClick", {trace:false});
82 // deferredResult.addCallbackPass(MochiKit.Signal.signal, this, 'selectRow', anObject); 79 // deferredResult.addCallbackPass(MochiKit.Signal.signal, this, 'selectRow', anObject);
83 deferredResult.addCallback(this.actionMethod(), anObject, anEvent); 80 deferredResult.addCallback(this.actionMethod(), anObject, anEvent);
84 // deferredResult.addBothPass(MochiKit.Signal.signal, this, 'unselectRow', anObject); 81 // deferredResult.addBothPass(MochiKit.Signal.signal, this, 'unselectRow', anObject);
85 deferredResult.callback(); 82 deferredResult.callback();
86 } 83 }
87 }, 84 },
88 85
89 //----------------------------------------------------- 86 //-----------------------------------------------------
90 '__syntax_fix__' : 'syntax fix' 87 '__syntax_fix__' : 'syntax fix'
91}); 88});
92 89
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 de20853..389d876 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/LoginForm.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/LoginForm.js
@@ -1,203 +1,200 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 26Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
30 27
31Clipperz.PM.UI.Web.Components.LoginForm = function(args) { 28Clipperz.PM.UI.Web.Components.LoginForm = function(args) {
32 args = args || {}; 29 args = args || {};
33 30
34 this._autocomplete = args.autocomplete || 'off'; 31 this._autocomplete = args.autocomplete || 'off';
35 32
36 Clipperz.PM.UI.Web.Components.LoginForm.superclass.constructor.apply(this, arguments); 33 Clipperz.PM.UI.Web.Components.LoginForm.superclass.constructor.apply(this, arguments);
37 34
38 this._slots = { 35 this._slots = {
39 'passphraseEntropy':this.getId('passphraseEntropy') 36 'passphraseEntropy':this.getId('passphraseEntropy')
40 }; 37 };
41 38
42 return this; 39 return this;
43} 40}
44 41
45//============================================================================= 42//=============================================================================
46 43
47Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.LoginForm, Clipperz.PM.UI.Common.Components.BaseComponent, { 44Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.LoginForm, Clipperz.PM.UI.Common.Components.BaseComponent, {
48 45
49 //------------------------------------------------------------------------- 46 //-------------------------------------------------------------------------
50 47
51 'toString': function () { 48 'toString': function () {
52 return "Clipperz.PM.UI.Web.Components.LoginForm component"; 49 return "Clipperz.PM.UI.Web.Components.LoginForm component";
53 }, 50 },
54 51
55 'autocomplete': function () { 52 'autocomplete': function () {
56 return this._autocomplete; 53 return this._autocomplete;
57 }, 54 },
58 55
59 //------------------------------------------------------------------------- 56 //-------------------------------------------------------------------------
60 57
61 'renderSelf': function() { 58 'renderSelf': function() {
62 this.append(this.element(), {tag:'div', id:'loginBox', children:[ 59 this.append(this.element(), {tag:'div', id:'loginBox', children:[
63 {tag:'div', cls:'header'}, 60 {tag:'div', cls:'header'},
64 {tag:'div', cls:'body', id:this.getId('body'), children:[ 61 {tag:'div', cls:'body', id:this.getId('body'), children:[
65 {tag:'div', id:this.getId('loginForm'), children:[ 62 {tag:'div', id:this.getId('loginForm'), children:[
66 {tag:'div', children:[ 63 {tag:'div', children:[
67 {tag:'h4', html:'Login'}, 64 {tag:'h4', html:'Login'},
68 // {tag:'form', cls:'loginForm', autocomplete:this.autocomplete(), children:[ 65 // {tag:'form', cls:'loginForm', autocomplete:this.autocomplete(), children:[
69 {tag:'form', id:this.getId('form'), cls:'loginForm', children:[ 66 {tag:'form', id:this.getId('form'), cls:'loginForm', children:[
70 {tag:'label', html:'username', 'for':this.getId('usernameField')}, 67 {tag:'label', html:'username', 'for':this.getId('usernameField')},
71 {tag:'input', id:this.getId('usernameField'), type:'text', cls:'username'/*, value:'joe'*/}, 68 {tag:'input', id:this.getId('usernameField'), type:'text', cls:'username'/*, value:'joe'*/},
72 {tag:'ul', id:this.getId('passwordOptions'), children:[ 69 {tag:'ul', id:this.getId('passwordOptions'), children:[
73 {tag:'li', id:this.getId('passphraseOption'), children:[ 70 {tag:'li', id:this.getId('passphraseOption'), children:[
74 {tag:'label', html:'passphrase / OTP', 'for':this.getId('passphraseField')}, 71 {tag:'label', html:'passphrase / OTP', 'for':this.getId('passphraseField')},
75 {tag:'input', id:this.getId('passphraseField'), type:'password', cls:'password'/*, value:'clipperz'*/} 72 {tag:'input', id:this.getId('passphraseField'), type:'password', cls:'password'/*, value:'clipperz'*/}
76 ]} //, 73 ]} //,
77/* 74/*
78 {tag:'li', id:this.getId('otpOption'), children:[ 75 {tag:'li', id:this.getId('otpOption'), children:[
79 {tag:'label', html:'one-time password', 'for':this.getId('otpField_1')}, 76 {tag:'label', html:'one-time password', 'for':this.getId('otpField_1')},
80 {tag:'input', id:this.getId('otpField_1'), type:'text', cls:'otp', value:'abcd-efgh'}, 77 {tag:'input', id:this.getId('otpField_1'), type:'text', cls:'otp', value:'abcd-efgh'},
81 {tag:'input', id:this.getId('otpField_2'), type:'text', cls:'otp', value:'abcd-efgh'}, 78 {tag:'input', id:this.getId('otpField_2'), type:'text', cls:'otp', value:'abcd-efgh'},
82 {tag:'input', id:this.getId('otpField_3'), type:'text', cls:'otp', value:'abcd-efgh'}, 79 {tag:'input', id:this.getId('otpField_3'), type:'text', cls:'otp', value:'abcd-efgh'},
83 {tag:'input', id:this.getId('otpField_4'), type:'text', cls:'otp', value:'abcd-efgh'} 80 {tag:'input', id:this.getId('otpField_4'), type:'text', cls:'otp', value:'abcd-efgh'}
84 ]} 81 ]}
85*/ 82*/
86 ]}, 83 ]},
87 // {tag:'input', id:this.getId('otpCheckbox'), type:'checkbox', cls:'checkbox'}, 84 // {tag:'input', id:this.getId('otpCheckbox'), type:'checkbox', cls:'checkbox'},
88 // {tag:'label', html:'use a one-time passphrase', 'for':this.getId('otpCheckbox'), cls:'checkbox'}, 85 // {tag:'label', html:'use a one-time passphrase', 'for':this.getId('otpCheckbox'), cls:'checkbox'},
89 86
90 {tag:'div', cls:'translations', children:[ 87 {tag:'div', cls:'translations', children:[
91 {tag:'h4', html:'choose your language'}, 88 {tag:'h4', html:'choose your language'},
92 {tag:'ul', children:[ 89 {tag:'ul', children:[
93 {tag:'li', cls:'selected', html:'english'}, 90 {tag:'li', cls:'selected', html:'english'},
94 {tag:'li', html:'italiano'}, 91 {tag:'li', html:'italiano'},
95 {tag:'li', html:'dutch'}, 92 {tag:'li', html:'dutch'},
96 {tag:'li', html:'french'}, 93 {tag:'li', html:'french'},
97 {tag:'li', html:'spanish'}, 94 {tag:'li', html:'spanish'},
98 {tag:'li', html:'chinese'}, 95 {tag:'li', html:'chinese'},
99 {tag:'li', html:'japanese'}, 96 {tag:'li', html:'japanese'},
100 {tag:'li', html:'portugal'}, 97 {tag:'li', html:'portugal'},
101 {tag:'li', html:'arabic'} 98 {tag:'li', html:'arabic'}
102 ]} 99 ]}
103 ]}, 100 ]},
104 101
105 {tag:'input', id:this.getId('submitButton'), type:'submit', value:'login', cls:'submit'} 102 {tag:'input', id:this.getId('submitButton'), type:'submit', value:'login', cls:'submit'}
106 ]} 103 ]}
107 ]} 104 ]}
108 ]} 105 ]}
109 ]}, 106 ]},
110 {tag:'div', cls:'footer'} 107 {tag:'div', cls:'footer'}
111 ]}); 108 ]});
112 109
113 if (this.autocomplete() == 'off') { 110 if (this.autocomplete() == 'off') {
114 MochiKit.DOM.updateNodeAttributes(this.getElement('form'), {autocomplete:'off'}); 111 MochiKit.DOM.updateNodeAttributes(this.getElement('form'), {autocomplete:'off'});
115 } 112 }
116 113
117 // Clipperz.Style.setBackgroundGradient(this.getElement('body'), {from:"#ff9955", to:"#ff6622"}) 114 // Clipperz.Style.setBackgroundGradient(this.getElement('body'), {from:"#ff9955", to:"#ff6622"})
118 115
119 // this.setEntropyDisplay(new Clipperz.PM.UI.Common.Components.PasswordEntropyDisplay(this.getElement('passphraseField'))); 116 // this.setEntropyDisplay(new Clipperz.PM.UI.Common.Components.PasswordEntropyDisplay(this.getElement('passphraseField')));
120 117
121 // MochiKit.Signal.connect(this.getId('otpCheckbox'), 'onclick', this, 'togglePasswordFields'); 118 // MochiKit.Signal.connect(this.getId('otpCheckbox'), 'onclick', this, 'togglePasswordFields');
122 // this.showPassphraseField(); 119 // this.showPassphraseField();
123 120
124 this.getElement('usernameField').focus(); 121 this.getElement('usernameField').focus();
125 122
126 MochiKit.Signal.connect(this.getElement('loginForm'), 'onsubmit', this, 'loginEventHandler'); 123 MochiKit.Signal.connect(this.getElement('loginForm'), 'onsubmit', this, 'loginEventHandler');
127 }, 124 },
128 125
129 //----------------------------------------------------------------------------- 126 //-----------------------------------------------------------------------------
130/* 127/*
131 'togglePasswordFields': function(anEvent) { 128 'togglePasswordFields': function(anEvent) {
132 var shouldUseOTP; 129 var shouldUseOTP;
133 130
134 shouldUseOTP = this.getElement('otpCheckbox').checked; 131 shouldUseOTP = this.getElement('otpCheckbox').checked;
135 132
136 if (shouldUseOTP == false) { 133 if (shouldUseOTP == false) {
137 this.showPassphraseField(); 134 this.showPassphraseField();
138 } else { 135 } else {
139 this.showOTPFields(); 136 this.showOTPFields();
140 } 137 }
141 }, 138 },
142*/ 139*/
143 //----------------------------------------------------------------------------- 140 //-----------------------------------------------------------------------------
144/* 141/*
145 'showPassphraseField': function() { 142 'showPassphraseField': function() {
146 this.showElement('passphraseOption'); 143 this.showElement('passphraseOption');
147 this.hideElement('otpOption'); 144 this.hideElement('otpOption');
148 }, 145 },
149*/ 146*/
150 //----------------------------------------------------------------------------- 147 //-----------------------------------------------------------------------------
151 148
152 'focusOnPassphraseField': function () { 149 'focusOnPassphraseField': function () {
153 this.getElement('passphraseField').focus(); 150 this.getElement('passphraseField').focus();
154 this.getElement('passphraseField').select(); 151 this.getElement('passphraseField').select();
155 }, 152 },
156 153
157 //----------------------------------------------------------------------------- 154 //-----------------------------------------------------------------------------
158/* 155/*
159 'showOTPFields': function() { 156 'showOTPFields': function() {
160 this.hideElement('passphraseOption'); 157 this.hideElement('passphraseOption');
161 this.showElement('otpOption'); 158 this.showElement('otpOption');
162 }, 159 },
163*/ 160*/
164 //------------------------------------------------------------------------- 161 //-------------------------------------------------------------------------
165 162
166 'loginEventHandler': function(anEvent) { 163 'loginEventHandler': function(anEvent) {
167 varusername; 164 varusername;
168 var passphrase; 165 var passphrase;
169 // var shouldUseOTP; 166 // var shouldUseOTP;
170 // var otp; 167 // var otp;
171 var signalArguments; 168 var signalArguments;
172 169
173 anEvent.preventDefault(); 170 anEvent.preventDefault();
174 171
175 username = this.getElement('usernameField').value; 172 username = this.getElement('usernameField').value;
176 passphrase = this.getElement('passphraseField').value; 173 passphrase = this.getElement('passphraseField').value;
177 // otp =this.getElement('otpField_1').value + 174 // otp =this.getElement('otpField_1').value +
178 // this.getElement('otpField_2').value + 175 // this.getElement('otpField_2').value +
179 // this.getElement('otpField_3').value + 176 // this.getElement('otpField_3').value +
180 // this.getElement('otpField_4').value; 177 // this.getElement('otpField_4').value;
181 // shouldUseOTP = this.getElement('otpCheckbox').checked; 178 // shouldUseOTP = this.getElement('otpCheckbox').checked;
182 179
183 signalArguments = {username:username}; 180 signalArguments = {username:username};
184 181
185 // if (shouldUseOTP) { 182 // if (shouldUseOTP) {
186 // signalArguments.otp = otp; 183 // signalArguments.otp = otp;
187 // } else { 184 // } else {
188 signalArguments.passphrase = passphrase; 185 signalArguments.passphrase = passphrase;
189 // } 186 // }
190 187
191 MochiKit.Signal.signal(this, 'doLogin', signalArguments); 188 MochiKit.Signal.signal(this, 'doLogin', signalArguments);
192 }, 189 },
193 190
194 //------------------------------------------------------------------------- 191 //-------------------------------------------------------------------------
195 192
196 'submitButtonElement': function() { 193 'submitButtonElement': function() {
197 return this.getElement('submitButton'); 194 return this.getElement('submitButton');
198 }, 195 },
199 196
200 //------------------------------------------------------------------------- 197 //-------------------------------------------------------------------------
201 198
202 __syntaxFix__: "syntax fix" 199 __syntaxFix__: "syntax fix"
203}); 200});
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 49c030d..2894af8 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/LoginPage.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/LoginPage.js
@@ -1,206 +1,203 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 26Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
30 27
31Clipperz.PM.UI.Web.Components.LoginPage = function(args) { 28Clipperz.PM.UI.Web.Components.LoginPage = function(args) {
32 args = args || {}; 29 args = args || {};
33 30
34 Clipperz.PM.UI.Web.Components.LoginPage.superclass.constructor.apply(this, arguments); 31 Clipperz.PM.UI.Web.Components.LoginPage.superclass.constructor.apply(this, arguments);
35 32
36 this._slots = { 33 this._slots = {
37 'loginForm':this.getId('loginBoxSlot') 34 'loginForm':this.getId('loginBoxSlot')
38 }; 35 };
39 36
40 return this; 37 return this;
41} 38}
42 39
43//============================================================================= 40//=============================================================================
44 41
45Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.LoginPage, Clipperz.PM.UI.Common.Components.BaseComponent, { 42Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.LoginPage, Clipperz.PM.UI.Common.Components.BaseComponent, {
46 43
47 //------------------------------------------------------------------------- 44 //-------------------------------------------------------------------------
48 45
49 'toString': function () { 46 'toString': function () {
50 return "Clipperz.PM.UI.Web.Components.LoginPage component"; 47 return "Clipperz.PM.UI.Web.Components.LoginPage component";
51 }, 48 },
52 49
53 //------------------------------------------------------------------------- 50 //-------------------------------------------------------------------------
54 51
55 'renderSelf': function(/*aContainer, aPosition*/) { 52 'renderSelf': function(/*aContainer, aPosition*/) {
56 this.append(this.element(), [ 53 this.append(this.element(), [
57 {tag:'div', id:this.getId('loginBoxSlot')}, 54 {tag:'div', id:this.getId('loginBoxSlot')},
58 {tag:'div', id:'main', children:[ 55 {tag:'div', id:'main', children:[
59 {tag:'div', id:'featurePoints', children:[ 56 {tag:'div', id:'featurePoints', children:[
60 {tag:'table', children:[ 57 {tag:'table', children:[
61 {tag:'tr', children:[ 58 {tag:'tr', children:[
62 {tag:'td', children:[ 59 {tag:'td', children:[
63 {tag:'div', cls:'block', children:[ 60 {tag:'div', cls:'block', children:[
64 {tag:'h3', html:'Clipperz is:'}, 61 {tag:'h3', html:'Clipperz is:'},
65 {tag:'ul', children:[ 62 {tag:'ul', children:[
66 {tag:'li', html:'a secure and simple password manager'}, 63 {tag:'li', html:'a secure and simple password manager'},
67 {tag:'li', html:'an effective single sign-on solution'}, 64 {tag:'li', html:'an effective single sign-on solution'},
68 {tag:'li', html:'a digital vault for your personal data'} 65 {tag:'li', html:'a digital vault for your personal data'}
69 ]} 66 ]}
70 ]}, 67 ]},
71 {tag:'div', cls:'block', children:[ 68 {tag:'div', cls:'block', children:[
72 {tag:'h3', html:'Clipperz benefits:'}, 69 {tag:'h3', html:'Clipperz benefits:'},
73 {tag:'ul', children:[ 70 {tag:'ul', children:[
74 {tag:'li', html:'free and completely anonymous'}, 71 {tag:'li', html:'free and completely anonymous'},
75 {tag:'li', html:'access it any time from any computer'}, 72 {tag:'li', html:'access it any time from any computer'},
76 {tag:'li', html:'no software to download and nothing to install'}, 73 {tag:'li', html:'no software to download and nothing to install'},
77 {tag:'li', html:'avoid keeping secrets on your PC or on paper'} 74 {tag:'li', html:'avoid keeping secrets on your PC or on paper'}
78 ]} 75 ]}
79 ]} 76 ]}
80 ]}, {tag:'td', children:[ 77 ]}, {tag:'td', children:[
81 {tag:'div', cls:'block', children:[ 78 {tag:'div', cls:'block', children:[
82 {tag:'h3', html:'Clipperz security:'}, 79 {tag:'h3', html:'Clipperz security:'},
83 {tag:'ul', children:[ 80 {tag:'ul', children:[
84 {tag:'li', html:'your secretes are locally encrypted by your browser before being uploaded to Clipperz'}, 81 {tag:'li', html:'your secretes are locally encrypted by your browser before being uploaded to Clipperz'},
85 {tag:'li', html:'the encryption key is a passphrase known only to you'}, 82 {tag:'li', html:'the encryption key is a passphrase known only to you'},
86 {tag:'li', html:'Clipperz hosts your sensitive data in an encrypted form and could never access the data in its plain form'}, 83 {tag:'li', html:'Clipperz hosts your sensitive data in an encrypted form and could never access the data in its plain form'},
87 {tag:'li', html:'Clipperz is built upon standard encryption schemes, nothing fancies of homemade'}, 84 {tag:'li', html:'Clipperz is built upon standard encryption schemes, nothing fancies of homemade'},
88 {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!'} 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!'}
89 ]} 86 ]}
90 ]} 87 ]}
91 ]} 88 ]}
92 ]} 89 ]}
93 ]} 90 ]}
94 ]}, 91 ]},
95 {tag:'div', cls:'activeFeatures', children:[ 92 {tag:'div', cls:'activeFeatures', children:[
96 {tag:'div', id:this.getId('registerButton'), cls:'createAccountLink', children:[ 93 {tag:'div', id:this.getId('registerButton'), cls:'createAccountLink', children:[
97 {tag:'canvas', id:this.getId('registerButtonIcon')}, 94 {tag:'canvas', id:this.getId('registerButtonIcon')},
98 {tag:'a', href:'#', id:this.getId('createAccountLink'), cls:'createAccountLink', children:[ 95 {tag:'a', href:'#', id:this.getId('createAccountLink'), cls:'createAccountLink', children:[
99 {tag:'span', cls:'payoff', html:"Free sign up!"}, 96 {tag:'span', cls:'payoff', html:"Free sign up!"},
100 {tag:'span', cls:'link', html:"Create account >>"} 97 {tag:'span', cls:'link', html:"Create account >>"}
101 ]} 98 ]}
102 ]}, 99 ]},
103 {tag:'div', cls:'keepTogether', children:[ 100 {tag:'div', cls:'keepTogether', children:[
104 {tag:'div', id:this.getId('screenshotLink'), cls:'screenshotLink', children:[ 101 {tag:'div', id:this.getId('screenshotLink'), cls:'screenshotLink', children:[
105 {tag:'canvas', id:this.getId('lookIcon')}, 102 {tag:'canvas', id:this.getId('lookIcon')},
106 {tag:'a', href:'#', cls:'screenshotLink', children:[ 103 {tag:'a', href:'#', cls:'screenshotLink', children:[
107 {tag:'span', cls:'payoff', html:"Look Clipperz!"}, 104 {tag:'span', cls:'payoff', html:"Look Clipperz!"},
108 {tag:'span', cls:'link', html:"screenshot tour >>"} 105 {tag:'span', cls:'link', html:"screenshot tour >>"}
109 ]} 106 ]}
110 ]}, 107 ]},
111 {tag:'div', id:this.getId('offlineLink'), cls:'offlineLink', children:[ 108 {tag:'div', id:this.getId('offlineLink'), cls:'offlineLink', children:[
112 {tag:'canvas', id:this.getId('downloadIcon')}, 109 {tag:'canvas', id:this.getId('downloadIcon')},
113 {tag:'a', href:'#', cls:'offlineLink', children:[ 110 {tag:'a', href:'#', cls:'offlineLink', children:[
114 {tag:'span', cls:'payoff', html:"Download!"}, 111 {tag:'span', cls:'payoff', html:"Download!"},
115 {tag:'span', cls:'link', html:"Offline version >>"} 112 {tag:'span', cls:'link', html:"Offline version >>"}
116 ]} 113 ]}
117 ]} 114 ]}
118 ]} 115 ]}
119 ]} 116 ]}
120 ]} 117 ]}
121 ]); 118 ]);
122 119
123 this.setRegistrationButtonIconDefaultColors(); 120 this.setRegistrationButtonIconDefaultColors();
124 this.setLookIconDefaultColors(); 121 this.setLookIconDefaultColors();
125 this.setDownloadIconDefaultColors(); 122 this.setDownloadIconDefaultColors();
126 123
127 // MochiKit.Signal.connect(this.getElement('createAccountLink'), 'onclick', this, 'handleCreateAccountLink') 124 // MochiKit.Signal.connect(this.getElement('createAccountLink'), 'onclick', this, 'handleCreateAccountLink')
128 125
129 MochiKit.Signal.connect(this.getElement('registerButton'), 'onmouseenter', this, 'handleMouseEnterOnRegisterButtonIcon'); 126 MochiKit.Signal.connect(this.getElement('registerButton'), 'onmouseenter', this, 'handleMouseEnterOnRegisterButtonIcon');
130 MochiKit.Signal.connect(this.getElement('registerButton'), 'onmouseleave', this, 'handleMouseLeaveOnRegisterButtonIcon'); 127 MochiKit.Signal.connect(this.getElement('registerButton'), 'onmouseleave', this, 'handleMouseLeaveOnRegisterButtonIcon');
131 128
132 MochiKit.Signal.connect(this.getElement('screenshotLink'), 'onmouseenter', this, 'handleMouseEnterOnLookIcon'); 129 MochiKit.Signal.connect(this.getElement('screenshotLink'), 'onmouseenter', this, 'handleMouseEnterOnLookIcon');
133 MochiKit.Signal.connect(this.getElement('screenshotLink'), 'onmouseleave', this, 'handleMouseLeaveOnLookIcon'); 130 MochiKit.Signal.connect(this.getElement('screenshotLink'), 'onmouseleave', this, 'handleMouseLeaveOnLookIcon');
134 131
135 MochiKit.Signal.connect(this.getElement('offlineLink'), 'onmouseenter', this, 'handleMouseEnterOnDownloadIcon'); 132 MochiKit.Signal.connect(this.getElement('offlineLink'), 'onmouseenter', this, 'handleMouseEnterOnDownloadIcon');
136 MochiKit.Signal.connect(this.getElement('offlineLink'), 'onmouseleave', this, 'handleMouseLeaveOnDownloadIcon'); 133 MochiKit.Signal.connect(this.getElement('offlineLink'), 'onmouseleave', this, 'handleMouseLeaveOnDownloadIcon');
137 134
138 MochiKit.Signal.connect(this.getElement('createAccountLink'), 'onclick', this, 'handleCreateAccountLink') 135 MochiKit.Signal.connect(this.getElement('createAccountLink'), 'onclick', this, 'handleCreateAccountLink')
139 }, 136 },
140 137
141 //------------------------------------------------------------------------- 138 //-------------------------------------------------------------------------
142 139
143 'setRegistrationButtonIconDefaultColors': function () { 140 'setRegistrationButtonIconDefaultColors': function () {
144 Clipperz.PM.UI.Canvas.registerButton.normal(this.getElement('registerButtonIcon'), "#eeeeee", "#eeeeee", "#ecab12", "#e14624", "#ffffff"); 141 Clipperz.PM.UI.Canvas.registerButton.normal(this.getElement('registerButtonIcon'), "#eeeeee", "#eeeeee", "#ecab12", "#e14624", "#ffffff");
145 }, 142 },
146 143
147 'setRegistrationButtonIconHoverColors': function () { 144 'setRegistrationButtonIconHoverColors': function () {
148 Clipperz.PM.UI.Canvas.registerButton.normal(this.getElement('registerButtonIcon'), "#cccccc", "#999999", "#ffb710", "#ff4d27", "#ffffff"); 145 Clipperz.PM.UI.Canvas.registerButton.normal(this.getElement('registerButtonIcon'), "#cccccc", "#999999", "#ffb710", "#ff4d27", "#ffffff");
149 }, 146 },
150 147
151 'handleMouseEnterOnRegisterButtonIcon': function (anEvent) { 148 'handleMouseEnterOnRegisterButtonIcon': function (anEvent) {
152 this.setRegistrationButtonIconHoverColors(); 149 this.setRegistrationButtonIconHoverColors();
153 }, 150 },
154 151
155 'handleMouseLeaveOnRegisterButtonIcon': function (anEvent) { 152 'handleMouseLeaveOnRegisterButtonIcon': function (anEvent) {
156 this.setRegistrationButtonIconDefaultColors(); 153 this.setRegistrationButtonIconDefaultColors();
157 }, 154 },
158 155
159 //------------------------------------------------------------------------- 156 //-------------------------------------------------------------------------
160 157
161 'setLookIconDefaultColors': function () { 158 'setLookIconDefaultColors': function () {
162 Clipperz.PM.UI.Canvas.coverActions.look(this.getElement('lookIcon'), "#7e7e7e", "#ffffff", 1); 159 Clipperz.PM.UI.Canvas.coverActions.look(this.getElement('lookIcon'), "#7e7e7e", "#ffffff", 1);
163 }, 160 },
164 161
165 'setLookIconHoverColors': function () { 162 'setLookIconHoverColors': function () {
166 Clipperz.PM.UI.Canvas.coverActions.look(this.getElement('lookIcon'), "#666666", "#ffffff", 2); 163 Clipperz.PM.UI.Canvas.coverActions.look(this.getElement('lookIcon'), "#666666", "#ffffff", 2);
167 }, 164 },
168 165
169 'handleMouseEnterOnLookIcon': function (anEvent) { 166 'handleMouseEnterOnLookIcon': function (anEvent) {
170 this.setLookIconHoverColors(); 167 this.setLookIconHoverColors();
171 }, 168 },
172 169
173 'handleMouseLeaveOnLookIcon': function (anEvent) { 170 'handleMouseLeaveOnLookIcon': function (anEvent) {
174 this.setLookIconDefaultColors(); 171 this.setLookIconDefaultColors();
175 }, 172 },
176 173
177 //------------------------------------------------------------------------- 174 //-------------------------------------------------------------------------
178 175
179 'setDownloadIconDefaultColors': function () { 176 'setDownloadIconDefaultColors': function () {
180 Clipperz.PM.UI.Canvas.coverActions.download(this.getElement('downloadIcon'), "#7e7e7e", "#ffffff", 1); 177 Clipperz.PM.UI.Canvas.coverActions.download(this.getElement('downloadIcon'), "#7e7e7e", "#ffffff", 1);
181 }, 178 },
182 179
183 'setDownloadIconHoverColors': function () { 180 'setDownloadIconHoverColors': function () {
184 Clipperz.PM.UI.Canvas.coverActions.download(this.getElement('downloadIcon'), "#666666", "#ffffff", 2); 181 Clipperz.PM.UI.Canvas.coverActions.download(this.getElement('downloadIcon'), "#666666", "#ffffff", 2);
185 }, 182 },
186 183
187 'handleMouseEnterOnDownloadIcon': function (anEvent) { 184 'handleMouseEnterOnDownloadIcon': function (anEvent) {
188 this.setDownloadIconHoverColors(); 185 this.setDownloadIconHoverColors();
189 }, 186 },
190 187
191 'handleMouseLeaveOnDownloadIcon': function (anEvent) { 188 'handleMouseLeaveOnDownloadIcon': function (anEvent) {
192 this.setDownloadIconDefaultColors(); 189 this.setDownloadIconDefaultColors();
193 }, 190 },
194 191
195 //------------------------------------------------------------------------- 192 //-------------------------------------------------------------------------
196 193
197 'handleCreateAccountLink': function (anEvent) { 194 'handleCreateAccountLink': function (anEvent) {
198 anEvent.preventDefault(); 195 anEvent.preventDefault();
199 196
200 MochiKit.Signal.signal(this, 'createNewAccountClick', anEvent.src()); 197 MochiKit.Signal.signal(this, 'createNewAccountClick', anEvent.src());
201 }, 198 },
202 199
203 //------------------------------------------------------------------------- 200 //-------------------------------------------------------------------------
204 201
205 __syntaxFix__: "syntax fix" 202 __syntaxFix__: "syntax fix"
206}); 203});
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 03c7b9e..5d082b5 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/LoginProgress.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/LoginProgress.js
@@ -1,155 +1,152 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 26Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
30 27
31Clipperz.PM.UI.Web.Components.LoginProgress = function(args) { 28Clipperz.PM.UI.Web.Components.LoginProgress = function(args) {
32 args = args || {}; 29 args = args || {};
33 30
34 Clipperz.PM.UI.Web.Components.LoginProgress.superclass.constructor.apply(this, arguments); 31 Clipperz.PM.UI.Web.Components.LoginProgress.superclass.constructor.apply(this, arguments);
35 32
36 this._deferred = null; 33 this._deferred = null;
37 34
38 return this; 35 return this;
39} 36}
40 37
41//============================================================================= 38//=============================================================================
42 39
43Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.LoginProgress, Clipperz.PM.UI.Common.Components.BaseComponent, { 40Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.LoginProgress, Clipperz.PM.UI.Common.Components.BaseComponent, {
44 41
45 //------------------------------------------------------------------------- 42 //-------------------------------------------------------------------------
46 43
47 'toString': function () { 44 'toString': function () {
48 return "Clipperz.PM.UI.Web.Components.LoginProgress component"; 45 return "Clipperz.PM.UI.Web.Components.LoginProgress component";
49 }, 46 },
50 47
51 //------------------------------------------------------------------------- 48 //-------------------------------------------------------------------------
52 49
53 'deferred': function() { 50 'deferred': function() {
54 return this._deferred; 51 return this._deferred;
55 }, 52 },
56 53
57 'setDeferred': function(aValue) { 54 'setDeferred': function(aValue) {
58 this._deferred = aValue; 55 this._deferred = aValue;
59 }, 56 },
60 57
61 //------------------------------------------------------------------------- 58 //-------------------------------------------------------------------------
62 59
63 'renderSelf': function() { 60 'renderSelf': function() {
64 // var loginProgressElement; 61 // var loginProgressElement;
65 // 62 //
66 // loginProgressElement = MochiKit.DOM.getElement('loginProgress'); 63 // loginProgressElement = MochiKit.DOM.getElement('loginProgress');
67 // 64 //
68 // if (loginProgressElement == null) { 65 // if (loginProgressElement == null) {
69 // loginProgressElement = this.append(this.element(), {tag:'div', id:'loginProgress', cls:'LoginProgress'}, true); 66 // loginProgressElement = this.append(this.element(), {tag:'div', id:'loginProgress', cls:'LoginProgress'}, true);
70 // } 67 // }
71 68
72//console.log(">> LoginProgress.renderSelf", this.element()); 69//console.log(">> LoginProgress.renderSelf", this.element());
73 this.append(this.element(), {tag:'div', id:'loginProgress', cls:'LoginProgress', children: [ 70 this.append(this.element(), {tag:'div', id:'loginProgress', cls:'LoginProgress', children: [
74 // this.append(loginProgressElement, [ 71 // this.append(loginProgressElement, [
75 {tag:'div', cls:'header', children:[ 72 {tag:'div', cls:'header', children:[
76 {tag:'h3', id:this.getId('title'), html:"login progress"} 73 {tag:'h3', id:this.getId('title'), html:"login progress"}
77 ]}, 74 ]},
78 {tag:'div', cls:'body', children:[ 75 {tag:'div', cls:'body', children:[
79 {tag:'div', id:this.getId('progressBar')}, 76 {tag:'div', id:this.getId('progressBar')},
80 {tag:'div', id:this.getId('errorBox'), cls:'errorBox', children:[ 77 {tag:'div', id:this.getId('errorBox'), cls:'errorBox', children:[
81 // {tag:'div',cls:'img ALERT', children:[{tag:'div'}]}, 78 // {tag:'div',cls:'img ALERT', children:[{tag:'div'}]},
82 {tag:'div',cls:'img ALERT', children:[{tag:'canvas', id:this.getId('canvas')}]}, 79 {tag:'div',cls:'img ALERT', children:[{tag:'canvas', id:this.getId('canvas')}]},
83 {tag:'p', html:"Login failed"} 80 {tag:'p', html:"Login failed"}
84 ]} 81 ]}
85 ]}, 82 ]},
86 {tag:'div', cls:'footer', children:[ 83 {tag:'div', cls:'footer', children:[
87 {tag:'div', cls:'buttonArea', id:this.getId('buttonArea'), children:[ 84 {tag:'div', cls:'buttonArea', id:this.getId('buttonArea'), children:[
88 {tag:'div', cls:'button', id:this.getId('button'), children:[ 85 {tag:'div', cls:'button', id:this.getId('button'), children:[
89 {tag:'a', href:'#', id:this.getId('buttonLink'), html:"cancel"} 86 {tag:'a', href:'#', id:this.getId('buttonLink'), html:"cancel"}
90 ]} 87 ]}
91 ]} 88 ]}
92 ]} 89 ]}
93 ]}); 90 ]});
94 // ]); 91 // ]);
95 92
96 Clipperz.PM.UI.Canvas.marks['!'](this.getElement('canvas'), "#ffffff"); 93 Clipperz.PM.UI.Canvas.marks['!'](this.getElement('canvas'), "#ffffff");
97 94
98 this.addComponent(new Clipperz.PM.UI.Common.Components.ProgressBar({'element':this.getElement('progressBar')})); 95 this.addComponent(new Clipperz.PM.UI.Common.Components.ProgressBar({'element':this.getElement('progressBar')}));
99 MochiKit.Style.hideElement(this.getElement('errorBox')); 96 MochiKit.Style.hideElement(this.getElement('errorBox'));
100 97
101 MochiKit.Signal.connect(this.getId('buttonLink'), 'onclick', this, 'cancelEventHandler'); 98 MochiKit.Signal.connect(this.getId('buttonLink'), 'onclick', this, 'cancelEventHandler');
102 }, 99 },
103 100
104 //------------------------------------------------------------------------- 101 //-------------------------------------------------------------------------
105 102
106 'displayElement': function() { 103 'displayElement': function() {
107 return MochiKit.DOM.getElement('loginProgress'); 104 return MochiKit.DOM.getElement('loginProgress');
108 }, 105 },
109 106
110 //------------------------------------------------------------------------- 107 //-------------------------------------------------------------------------
111 108
112 'cancelEventHandler': function(anEvent) { 109 'cancelEventHandler': function(anEvent) {
113 anEvent.preventDefault(); 110 anEvent.preventDefault();
114 111
115 MochiKit.Signal.signal(this, 'cancelEvent'); 112 MochiKit.Signal.signal(this, 'cancelEvent');
116 }, 113 },
117 114
118 //------------------------------------------------------------------------- 115 //-------------------------------------------------------------------------
119 116
120 'disableCancel': function() { 117 'disableCancel': function() {
121 MochiKit.Style.hideElement(this.getElement('buttonArea')); 118 MochiKit.Style.hideElement(this.getElement('buttonArea'));
122 }, 119 },
123 120
124 //------------------------------------------------------------------------- 121 //-------------------------------------------------------------------------
125 122
126 'showErrorMessage': function() { 123 'showErrorMessage': function() {
127 this.getElement('buttonLink').innerHTML = "close"; 124 this.getElement('buttonLink').innerHTML = "close";
128 125
129 MochiKit.Style.hideElement(this.getElement('progressBar')); 126 MochiKit.Style.hideElement(this.getElement('progressBar'));
130 127
131 this.getElement('title').innerHTML = "Error"; 128 this.getElement('title').innerHTML = "Error";
132 MochiKit.Style.showElement(this.getElement('errorBox')); 129 MochiKit.Style.showElement(this.getElement('errorBox'));
133 MochiKit.Style.showElement(this.getElement('buttonArea')); 130 MochiKit.Style.showElement(this.getElement('buttonArea'));
134 }, 131 },
135 132
136 //------------------------------------------------------------------------- 133 //-------------------------------------------------------------------------
137 134
138 'deferredHideModalAndRemove': function(someParameters, aResult) { 135 'deferredHideModalAndRemove': function(someParameters, aResult) {
139 vardeferredResult; 136 vardeferredResult;
140 137
141 deferredResult = new Clipperz.Async.Deferred("LoginProgress.deferredHideModalAndRemove", {trace:false}); 138 deferredResult = new Clipperz.Async.Deferred("LoginProgress.deferredHideModalAndRemove", {trace:false});
142 deferredResult.addMethod(this, 'deferredHideModal'); 139 deferredResult.addMethod(this, 'deferredHideModal');
143 deferredResult.addMethod(this, 'remove'); 140 deferredResult.addMethod(this, 'remove');
144 deferredResult.addCallback(function () { 141 deferredResult.addCallback(function () {
145 return aResult; 142 return aResult;
146 }); 143 });
147 deferredResult.callback(someParameters); 144 deferredResult.callback(someParameters);
148 145
149 return deferredResult; 146 return deferredResult;
150 }, 147 },
151 148
152 //------------------------------------------------------------------------- 149 //-------------------------------------------------------------------------
153 150
154 __syntaxFix__: "syntax fix" 151 __syntaxFix__: "syntax fix"
155}); 152});
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 b40d1f3..feb16ad 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/NewUserCreationComponent.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/NewUserCreationComponent.js
@@ -1,408 +1,405 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 26Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
30 27
31Clipperz.PM.UI.Web.Components.NewUserCreationComponent = function(args) { 28Clipperz.PM.UI.Web.Components.NewUserCreationComponent = function(args) {
32 args = args || {}; 29 args = args || {};
33 30
34 Clipperz.PM.UI.Web.Components.NewUserCreationComponent.superclass.constructor.apply(this, arguments); 31 Clipperz.PM.UI.Web.Components.NewUserCreationComponent.superclass.constructor.apply(this, arguments);
35 32
36 this._tabPanelController = null; 33 this._tabPanelController = null;
37 34
38 this._initiallySelectedTab = args.selected || 'CREDENTIALS'; 35 this._initiallySelectedTab = args.selected || 'CREDENTIALS';
39 this._tabPanelControllerConfiguration = { 36 this._tabPanelControllerConfiguration = {
40 'CREDENTIALS': { 37 'CREDENTIALS': {
41 tab:'credentialsTab', 38 tab:'credentialsTab',
42 panel:'credentialsTabpanel' 39 panel:'credentialsTabpanel'
43 }, 40 },
44 'CHECK_CREDENTIALS': { 41 'CHECK_CREDENTIALS': {
45 tab:'checkCredentialsTab', 42 tab:'checkCredentialsTab',
46 panel:'checkCredentialsTabpanel' 43 panel:'checkCredentialsTabpanel'
47 }, 44 },
48 'TERMS_OF_SERVICE': { 45 'TERMS_OF_SERVICE': {
49 tab:'termsOfServiceTab', 46 tab:'termsOfServiceTab',
50 panel:'termsOfServiceTabpanel' 47 panel:'termsOfServiceTabpanel'
51 }, 48 },
52 'CREATE_USER': { 49 'CREATE_USER': {
53 tab:'createUserTab', 50 tab:'createUserTab',
54 panel:'createUserTabpanel' 51 panel:'createUserTabpanel'
55 }//, 52 }//,
56/* 53/*
57 'LOGIN': { 54 'LOGIN': {
58 tab:'loginTab', 55 tab:'loginTab',
59 panel:'loginTabpanel' 56 panel:'loginTabpanel'
60 } 57 }
61*/ 58*/
62 }; 59 };
63 60
64 return this; 61 return this;
65} 62}
66 63
67//============================================================================= 64//=============================================================================
68 65
69Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.NewUserCreationComponent, Clipperz.PM.UI.Common.Components.TabPanelComponent, { 66Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.NewUserCreationComponent, Clipperz.PM.UI.Common.Components.TabPanelComponent, {
70 67
71 //------------------------------------------------------------------------- 68 //-------------------------------------------------------------------------
72 69
73 'toString': function () { 70 'toString': function () {
74 return "Clipperz.PM.UI.Web.Components.NewUserCreationComponent component"; 71 return "Clipperz.PM.UI.Web.Components.NewUserCreationComponent component";
75 }, 72 },
76 73
77 //========================================================================= 74 //=========================================================================
78 75
79 'disableAllPanels': function () { 76 'disableAllPanels': function () {
80 this.tabPanelController().selectTab(null); 77 this.tabPanelController().selectTab(null);
81 }, 78 },
82 79
83 //------------------------------------------------------------------------- 80 //-------------------------------------------------------------------------
84 81
85 'enableCredentialsPanel': function () { 82 'enableCredentialsPanel': function () {
86 this.tabPanelController().selectTab('CREDENTIALS'); 83 this.tabPanelController().selectTab('CREDENTIALS');
87 }, 84 },
88 85
89 'enableCheckCredentialsPanel': function () { 86 'enableCheckCredentialsPanel': function () {
90 this.tabPanelController().selectTab('CHECK_CREDENTIALS'); 87 this.tabPanelController().selectTab('CHECK_CREDENTIALS');
91 }, 88 },
92 89
93 'enableTermsOfServicePanel': function () { 90 'enableTermsOfServicePanel': function () {
94 this.tabPanelController().selectTab('TERMS_OF_SERVICE'); 91 this.tabPanelController().selectTab('TERMS_OF_SERVICE');
95 }, 92 },
96 93
97 'enableCreateUserPanel': function () { 94 'enableCreateUserPanel': function () {
98 this.tabPanelController().selectTab('CREATE_USER'); 95 this.tabPanelController().selectTab('CREATE_USER');
99 }, 96 },
100 97
101 //'enableLoginPanel': function () { 98 //'enableLoginPanel': function () {
102 // this.tabPanelController().selectTab('LOGIN'); 99 // this.tabPanelController().selectTab('LOGIN');
103 //}, 100 //},
104 101
105 //========================================================================= 102 //=========================================================================
106 103
107 'shouldShowElementWhileRendering': function() { 104 'shouldShowElementWhileRendering': function() {
108 return false; 105 return false;
109 }, 106 },
110 107
111 //========================================================================= 108 //=========================================================================
112 109
113 'tabPanelController': function () { 110 'tabPanelController': function () {
114 if (this._tabPanelController == null) { 111 if (this._tabPanelController == null) {
115 this._tabPanelController = new Clipperz.PM.UI.Common.Controllers.TabPanelController({ 112 this._tabPanelController = new Clipperz.PM.UI.Common.Controllers.TabPanelController({
116 component:this, 113 component:this,
117 configuration:this._tabPanelControllerConfiguration 114 configuration:this._tabPanelControllerConfiguration
118 }); 115 });
119 116
120 MochiKit.Signal.connect(this._tabPanelController, 'tabSelected', this, 'handleTabSelected') 117 MochiKit.Signal.connect(this._tabPanelController, 'tabSelected', this, 'handleTabSelected')
121 } 118 }
122 119
123 return this._tabPanelController; 120 return this._tabPanelController;
124 }, 121 },
125 122
126 //------------------------------------------------------------------------- 123 //-------------------------------------------------------------------------
127 124
128 'renderSelf': function() { 125 'renderSelf': function() {
129//console.log('** Clipperz.targetModalDimensionsAndPosition', Clipperz.Base.serializeJSON(Clipperz.PM.UI.Common.Components.BaseComponent.targetModalDimensionsAndPosition)); 126//console.log('** Clipperz.targetModalDimensionsAndPosition', Clipperz.Base.serializeJSON(Clipperz.PM.UI.Common.Components.BaseComponent.targetModalDimensionsAndPosition));
130 127
131 this.append(this.element(), {tag:'div', cls:'NewUserCreation mainDialog', id:this.getId('panel'), children: [ 128 this.append(this.element(), {tag:'div', cls:'NewUserCreation mainDialog', id:this.getId('panel'), children: [
132 {tag:'form', id:this.getId('form'), cls:'newUserCreationForm', children:[ 129 {tag:'form', id:this.getId('form'), cls:'newUserCreationForm', children:[
133 {tag:'div', cls:'header', children:[ 130 {tag:'div', cls:'header', children:[
134 {tag:'div', cls:'title', children:[ 131 {tag:'div', cls:'title', children:[
135 {tag:'h3', id:this.getId('title'), html:"Create new user"} 132 {tag:'h3', id:this.getId('title'), html:"Create new user"}
136 ]} 133 ]}
137 ]}, 134 ]},
138 {tag:'div', id:this.getId('body'), cls:'body', children:[ 135 {tag:'div', id:this.getId('body'), cls:'body', children:[
139 {tag:'div', cls:'tabContainer', children:[ 136 {tag:'div', cls:'tabContainer', children:[
140 {tag:'ul', cls:'tabs', children:[ 137 {tag:'ul', cls:'tabs', children:[
141 {tag:'li', id:this.getId('credentialsTab'), children:[{tag:'span', html:"credentials"}]}, 138 {tag:'li', id:this.getId('credentialsTab'), children:[{tag:'span', html:"credentials"}]},
142 {tag:'li', id:this.getId('checkCredentialsTab'),children:[{tag:'span', html:"credentials check"}]}, 139 {tag:'li', id:this.getId('checkCredentialsTab'),children:[{tag:'span', html:"credentials check"}]},
143 {tag:'li', id:this.getId('termsOfServiceTab'), children:[{tag:'span', html:"terms of service"}]}, 140 {tag:'li', id:this.getId('termsOfServiceTab'), children:[{tag:'span', html:"terms of service"}]},
144 {tag:'li', id:this.getId('createUserTab'), children:[{tag:'span', html:"create user"}]}//, 141 {tag:'li', id:this.getId('createUserTab'), children:[{tag:'span', html:"create user"}]}//,
145 // {tag:'li', id:this.getId('loginTab'), children:[{tag:'span', html:"login"}]}, 142 // {tag:'li', id:this.getId('loginTab'), children:[{tag:'span', html:"login"}]},
146 ]}, 143 ]},
147 {tag:'ul', cls:'tabPanels', children:[ 144 {tag:'ul', cls:'tabPanels', children:[
148 {tag:'li', id:this.getId('credentialsTabpanel'), cls:'tabPanel credentials', children:[ 145 {tag:'li', id:this.getId('credentialsTabpanel'), cls:'tabPanel credentials', children:[
149 {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.NewUserWizard.CREDENTIALS.description')}]}, 146 {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.NewUserWizard.CREDENTIALS.description')}]},
150 {tag:'ul', cls:'credentials', children:[ 147 {tag:'ul', cls:'credentials', children:[
151 {tag:'li', children:[{tag:'span', cls:'label', html:"username"},{tag:'input', type:'text', id:this.getId('username')/*, value:'test'*/}]}, 148 {tag:'li', children:[{tag:'span', cls:'label', html:"username"},{tag:'input', type:'text', id:this.getId('username')/*, value:'test'*/}]},
152 {tag:'li', children:[{tag:'span', cls:'label', html:"passphrase"},{tag:'input', type:'password', id:this.getId('passphrase')/*, value:'test'*/}]} 149 {tag:'li', children:[{tag:'span', cls:'label', html:"passphrase"},{tag:'input', type:'password', id:this.getId('passphrase')/*, value:'test'*/}]}
153 ]} 150 ]}
154 ]}, 151 ]},
155 {tag:'li', id:this.getId('checkCredentialsTabpanel'), cls:'tabPanel checkCredentials', children:[ 152 {tag:'li', id:this.getId('checkCredentialsTabpanel'), cls:'tabPanel checkCredentials', children:[
156 {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.NewUserWizard.CHECK_CREDENTIALS.description')}]}, 153 {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.NewUserWizard.CHECK_CREDENTIALS.description')}]},
157 {tag:'ul', cls:'credentials', children:[ 154 {tag:'ul', cls:'credentials', children:[
158 {tag:'li', children:[{tag:'span', cls:'label', html:"re-passphrase"},{tag:'input', type:'password', id:this.getId('re-passphrase')/*, value:'test'*/}]} 155 {tag:'li', children:[{tag:'span', cls:'label', html:"re-passphrase"},{tag:'input', type:'password', id:this.getId('re-passphrase')/*, value:'test'*/}]}
159 ]} 156 ]}
160 ]}, 157 ]},
161 {tag:'li', id:this.getId('termsOfServiceTabpanel'), cls:'tabPanel termsOfService', children:[ 158 {tag:'li', id:this.getId('termsOfServiceTabpanel'), cls:'tabPanel termsOfService', children:[
162 {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.NewUserWizard.TERMS_OF_SERVICE.description')}]}, 159 {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.NewUserWizard.TERMS_OF_SERVICE.description')}]},
163 {tag:'ul', cls:'termsOfService', children:[ 160 {tag:'ul', cls:'termsOfService', children:[
164 {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."}]}, 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."}]},
165 {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>."}]} 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>."}]}
166 ]} 163 ]}
167 ]}, 164 ]},
168 {tag:'li', id:this.getId('createUserTabpanel'), cls:'tabPanel createUser', children:[ 165 {tag:'li', id:this.getId('createUserTabpanel'), cls:'tabPanel createUser', children:[
169 {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.NewUserWizard.CREATE_USER.description')}]}, 166 {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.NewUserWizard.CREATE_USER.description')}]},
170 {tag:'ul', cls:'createUserStates', children:[ 167 {tag:'ul', cls:'createUserStates', children:[
171 {tag:'li', cls:'creating', id:this.getId('creatingRegistering'), children:[{tag:'span', html:"registering user"}]}, 168 {tag:'li', cls:'creating', id:this.getId('creatingRegistering'), children:[{tag:'span', html:"registering user"}]},
172 {tag:'li', cls:'done', id:this.getId('creatingDone'), children:[{tag:'span', html:"done"}]}, 169 {tag:'li', cls:'done', id:this.getId('creatingDone'), children:[{tag:'span', html:"done"}]},
173 {tag:'li', cls:'fail', id:this.getId('creatingFailed'), children:[{tag:'span', html:"fail"}]} 170 {tag:'li', cls:'fail', id:this.getId('creatingFailed'), children:[{tag:'span', html:"fail"}]}
174 ]} 171 ]}
175 ]}//, 172 ]}//,
176 // {tag:'li', id:this.getId('loginTabpanel'), cls:'tabPanel login', children:[ 173 // {tag:'li', id:this.getId('loginTabpanel'), cls:'tabPanel login', children:[
177 // {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.NewUserWizard.LOGIN.description')}]}, 174 // {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.NewUserWizard.LOGIN.description')}]},
178 // ]} 175 // ]}
179 ]} 176 ]}
180 ]} 177 ]}
181 ]}, 178 ]},
182 {tag:'div', id:this.getId('footer'), cls:'footer', children:[ 179 {tag:'div', id:this.getId('footer'), cls:'footer', children:[
183 {tag:'div', cls:'buttonArea', children:[ 180 {tag:'div', cls:'buttonArea', children:[
184 // {tag:'div', cls:'cancel', id:this.getId('cancelButton'), html:"cancel"}, 181 // {tag:'div', cls:'cancel', id:this.getId('cancelButton'), html:"cancel"},
185 // {tag:'div', cls:'save disabled', id:this.getId('saveButton'), html:"save"} 182 // {tag:'div', cls:'save disabled', id:this.getId('saveButton'), html:"save"}
186 ]} 183 ]}
187 ]} 184 ]}
188 ]}, 185 ]},
189 {tag:'div', cls:'clear'} 186 {tag:'div', cls:'clear'}
190 ]}); 187 ]});
191 188
192 this.tabPanelController().setup(); 189 this.tabPanelController().setup();
193 // MochiKit.Signal.connect(this.getId('panel'), 'onkeydown', this, 'handleKeyEvent'); 190 // MochiKit.Signal.connect(this.getId('panel'), 'onkeydown', this, 'handleKeyEvent');
194 MochiKit.Signal.connect(MochiKit.DOM.currentDocument().body, 'onkeydown', this, 'handleKeyEvent'); 191 MochiKit.Signal.connect(MochiKit.DOM.currentDocument().body, 'onkeydown', this, 'handleKeyEvent');
195 MochiKit.Signal.connect(this.getId('awareOfUnrecoverablePassphrase'), 'onchange', this, 'handleTermsOfServiceCheckboxChange'); 192 MochiKit.Signal.connect(this.getId('awareOfUnrecoverablePassphrase'), 'onchange', this, 'handleTermsOfServiceCheckboxChange');
196 MochiKit.Signal.connect(this.getId('readTermsOfService'), 'onchange', this, 'handleTermsOfServiceCheckboxChange'); 193 MochiKit.Signal.connect(this.getId('readTermsOfService'), 'onchange', this, 'handleTermsOfServiceCheckboxChange');
197 }, 194 },
198 195
199 //------------------------------------------------------------------------- 196 //-------------------------------------------------------------------------
200/* 197/*
201 'resetContent': function () { 198 'resetContent': function () {
202 this.getElement('username').value = ''; 199 this.getElement('username').value = '';
203 this.getElement('passphrase').value = ''; 200 this.getElement('passphrase').value = '';
204 }, 201 },
205*/ 202*/
206 //------------------------------------------------------------------------- 203 //-------------------------------------------------------------------------
207 204
208 'displayElement': function() { 205 'displayElement': function() {
209 return this.getElement('panel'); 206 return this.getElement('panel');
210 }, 207 },
211 208
212 //------------------------------------------------------------------------- 209 //-------------------------------------------------------------------------
213 210
214 'handleTabSelected': function (aSelectedTab) { 211 'handleTabSelected': function (aSelectedTab) {
215/* 212/*
216 switch (aSelectedTab) { 213 switch (aSelectedTab) {
217 case 'DETAILS': 214 case 'DETAILS':
218 break; 215 break;
219 case 'DIRECT_LOGINS': 216 case 'DIRECT_LOGINS':
220 MochiKit.Style.hideElement(this.getElement('backToDirectLoginList')); 217 MochiKit.Style.hideElement(this.getElement('backToDirectLoginList'));
221 break; 218 break;
222 case 'SHARING': 219 case 'SHARING':
223 break; 220 break;
224 } 221 }
225*/ 222*/
226 }, 223 },
227 224
228 //========================================================================= 225 //=========================================================================
229 226
230 'username': function () { 227 'username': function () {
231 return this.getElement('username').value; 228 return this.getElement('username').value;
232 }, 229 },
233 230
234 'usernameElement': function () { 231 'usernameElement': function () {
235 return this.getElement('username'); 232 return this.getElement('username');
236 }, 233 },
237 234
238 'passphrase': function () { 235 'passphrase': function () {
239 return this.getElement('passphrase').value; 236 return this.getElement('passphrase').value;
240 }, 237 },
241 238
242 'rePassphrase': function () { 239 'rePassphrase': function () {
243 return this.getElement('re-passphrase').value; 240 return this.getElement('re-passphrase').value;
244 }, 241 },
245 242
246 'awareOfUnrecoverablePassphrase': function () { 243 'awareOfUnrecoverablePassphrase': function () {
247 return this.getElement('awareOfUnrecoverablePassphrase').value; 244 return this.getElement('awareOfUnrecoverablePassphrase').value;
248 }, 245 },
249 246
250 'readTermsOfService': function () { 247 'readTermsOfService': function () {
251 return this.getElement('readTermsOfService').value; 248 return this.getElement('readTermsOfService').value;
252 }, 249 },
253 250
254 //========================================================================= 251 //=========================================================================
255/* 252/*
256 'incrementUpdateFaviconCounter': function () { 253 'incrementUpdateFaviconCounter': function () {
257 this._updateFaviconCounter ++; 254 this._updateFaviconCounter ++;
258 }, 255 },
259 256
260 'decrementUpdateFaviconCounter': function () { 257 'decrementUpdateFaviconCounter': function () {
261 this._updateFaviconCounter --; 258 this._updateFaviconCounter --;
262 }, 259 },
263 260
264 'updateFaviconCounter': function () { 261 'updateFaviconCounter': function () {
265 return this._updateFaviconCounter; 262 return this._updateFaviconCounter;
266 }, 263 },
267 */ 264 */
268 //------------------------------------------------------------------------- 265 //-------------------------------------------------------------------------
269/* 266/*
270 'updateFavicon': function () { 267 'updateFavicon': function () {
271 this.decrementUpdateFaviconCounter(); 268 this.decrementUpdateFaviconCounter();
272 269
273 if (this.updateFaviconCounter() == 0) { 270 if (this.updateFaviconCounter() == 0) {
274 this.setFavicon(this.favicon()); 271 this.setFavicon(this.favicon());
275 } 272 }
276 }, 273 },
277*/ 274*/
278 //========================================================================= 275 //=========================================================================
279/* 276/*
280 'bindingComponents': function () { 277 'bindingComponents': function () {
281 return this._bindingComponents; 278 return this._bindingComponents;
282 }, 279 },
283 280
284 'clearAllBindingsComponents': function () { 281 'clearAllBindingsComponents': function () {
285 MochiKit.Iter.forEach(this.bindingComponents(), MochiKit.Base.methodcaller('remove')); 282 MochiKit.Iter.forEach(this.bindingComponents(), MochiKit.Base.methodcaller('remove'));
286 this._bindingComponents = []; 283 this._bindingComponents = [];
287 this.getElement('bindings').innerHTML = ''; 284 this.getElement('bindings').innerHTML = '';
288 }, 285 },
289 286
290 'addBindingComponent': function (aBindingComponent) { 287 'addBindingComponent': function (aBindingComponent) {
291 this.bindingComponents().push(aBindingComponent); 288 this.bindingComponents().push(aBindingComponent);
292 aBindingComponent.renderInNode(this.append(this.getElement('bindings'), {tag:'div'})); 289 aBindingComponent.renderInNode(this.append(this.getElement('bindings'), {tag:'div'}));
293 }, 290 },
294*/ 291*/
295 //========================================================================= 292 //=========================================================================
296/* 293/*
297 'formValueComponents': function () { 294 'formValueComponents': function () {
298 return this._formValueComponents; 295 return this._formValueComponents;
299 }, 296 },
300 297
301 'clearAllFormValueComponents': function () { 298 'clearAllFormValueComponents': function () {
302 MochiKit.Iter.forEach(this.formValueComponents(), MochiKit.Base.methodcaller('remove')); 299 MochiKit.Iter.forEach(this.formValueComponents(), MochiKit.Base.methodcaller('remove'));
303 this._formValueComponents = []; 300 this._formValueComponents = [];
304 this.getElement('formValues').innerHTML = ''; 301 this.getElement('formValues').innerHTML = '';
305 }, 302 },
306 303
307 'addFormValueComponent': function (aFormValueComponent) { 304 'addFormValueComponent': function (aFormValueComponent) {
308 this.formValueComponents().push(aFormValueComponent); 305 this.formValueComponents().push(aFormValueComponent);
309 aFormValueComponent.renderInNode(this.append(this.getElement('formValues'), {tag:'div'})); 306 aFormValueComponent.renderInNode(this.append(this.getElement('formValues'), {tag:'div'}));
310 }, 307 },
311*/ 308*/
312 //========================================================================= 309 //=========================================================================
313 310
314 'changedValue': function (anEvent) { 311 'changedValue': function (anEvent) {
315 MochiKit.Signal.signal(this, 'changedValue', anEvent); 312 MochiKit.Signal.signal(this, 'changedValue', anEvent);
316 313
317 this.incrementUpdateFaviconCounter(); 314 this.incrementUpdateFaviconCounter();
318 MochiKit.Async.callLater(1, MochiKit.Base.method(this, 'updateFavicon')); 315 MochiKit.Async.callLater(1, MochiKit.Base.method(this, 'updateFavicon'));
319 }, 316 },
320 317
321 //------------------------------------------------------------------------- 318 //-------------------------------------------------------------------------
322 319
323 'handleBackClick': function (anEvent) { 320 'handleBackClick': function (anEvent) {
324 anEvent.preventDefault(); 321 anEvent.preventDefault();
325 322
326 MochiKit.Signal.signal(this, 'back'); 323 MochiKit.Signal.signal(this, 'back');
327 }, 324 },
328 325
329 //========================================================================= 326 //=========================================================================
330 327
331 'bottomMargin': function () { 328 'bottomMargin': function () {
332 var result; 329 var result;
333 330
334 //TODO: WTF!!! 331 //TODO: WTF!!!
335 // result =MochiKit.Style.getElementPosition(this.element())['y'] + 332 // result =MochiKit.Style.getElementPosition(this.element())['y'] +
336 // MochiKit.Style.getElementDimensions(this.element())['h']; 333 // MochiKit.Style.getElementDimensions(this.element())['h'];
337 334
338 // result =MochiKit.Style.getElementPosition(this.getElement('footer'))['y']; 335 // result =MochiKit.Style.getElementPosition(this.getElement('footer'))['y'];
339//console.log("### bottomMargin"); 336//console.log("### bottomMargin");
340//console.log('displayElement', this.displayElement()); 337//console.log('displayElement', this.displayElement());
341//console.log('-- Clipperz.targetModalDimensionsAndPosition', Clipperz.Base.serializeJSON(Clipperz.PM.UI.Common.Components.BaseComponent.targetModalDimensionsAndPosition)); 338//console.log('-- Clipperz.targetModalDimensionsAndPosition', Clipperz.Base.serializeJSON(Clipperz.PM.UI.Common.Components.BaseComponent.targetModalDimensionsAndPosition));
342//console.log('element', MochiKit.Style.getElementPosition('modalDialog') ['y'], MochiKit.Style.getElementDimensions('modalDialog')['h']); 339//console.log('element', MochiKit.Style.getElementPosition('modalDialog') ['y'], MochiKit.Style.getElementDimensions('modalDialog')['h']);
343 // result = 450; 340 // result = 450;
344 341
345 result =Clipperz.PM.UI.Common.Components.BaseComponent.targetModalDimensionsAndPosition['position']['y'] + 342 result =Clipperz.PM.UI.Common.Components.BaseComponent.targetModalDimensionsAndPosition['position']['y'] +
346 Clipperz.PM.UI.Common.Components.BaseComponent.targetModalDimensionsAndPosition['dimensions']['h'] - 343 Clipperz.PM.UI.Common.Components.BaseComponent.targetModalDimensionsAndPosition['dimensions']['h'] -
347 60; 344 60;
348 345
349 return result; 346 return result;
350 }, 347 },
351 348
352 //========================================================================= 349 //=========================================================================
353 350
354 'focusOnUsernameElement': function () { 351 'focusOnUsernameElement': function () {
355 MochiKit.Async.callLater(0.1, MochiKit.Base.method(this.getElement('username'), 'focus')); 352 MochiKit.Async.callLater(0.1, MochiKit.Base.method(this.getElement('username'), 'focus'));
356 }, 353 },
357 354
358 'focusOnRePassphraseElement': function () { 355 'focusOnRePassphraseElement': function () {
359 this.getElement('re-passphrase').focus(); 356 this.getElement('re-passphrase').focus();
360 }, 357 },
361 /* 358 /*
362 'focusOnBookmarkletConfigurationElement': function () { 359 'focusOnBookmarkletConfigurationElement': function () {
363 this.getElement('bookmarkletConfiguration').focus(); 360 this.getElement('bookmarkletConfiguration').focus();
364 }, 361 },
365 362
366 'focusOnFaviconElement': function () { 363 'focusOnFaviconElement': function () {
367 this.getElement('faviconURL').focus(); 364 this.getElement('faviconURL').focus();
368 }, 365 },
369*/ 366*/
370 367
371 //========================================================================= 368 //=========================================================================
372 369
373 'hideAllProgeressStates': function () { 370 'hideAllProgeressStates': function () {
374 MochiKit.Style.hideElement(this.getElement('creatingRegistering')); 371 MochiKit.Style.hideElement(this.getElement('creatingRegistering'));
375 MochiKit.Style.hideElement(this.getElement('creatingDone')); 372 MochiKit.Style.hideElement(this.getElement('creatingDone'));
376 MochiKit.Style.hideElement(this.getElement('creatingFailed')); 373 MochiKit.Style.hideElement(this.getElement('creatingFailed'));
377 }, 374 },
378 375
379 'showProgressOnUserCreation': function () { 376 'showProgressOnUserCreation': function () {
380//Clipperz.log(">>> NewUserCreationComponent.showProgressOnUserCreation"); 377//Clipperz.log(">>> NewUserCreationComponent.showProgressOnUserCreation");
381 this.hideAllProgeressStates(); 378 this.hideAllProgeressStates();
382 MochiKit.Style.showElement(this.getElement('creatingRegistering')); 379 MochiKit.Style.showElement(this.getElement('creatingRegistering'));
383 }, 380 },
384 381
385 'showUserCreationDone': function () { 382 'showUserCreationDone': function () {
386//Clipperz.log(">>> NewUserCreationComponent.showUserCreationDone"); 383//Clipperz.log(">>> NewUserCreationComponent.showUserCreationDone");
387 this.hideAllProgeressStates(); 384 this.hideAllProgeressStates();
388 MochiKit.Style.showElement(this.getElement('creatingDone')); 385 MochiKit.Style.showElement(this.getElement('creatingDone'));
389//Clipperz.log("<<< NewUserCreationComponent.showUserCreationDone"); 386//Clipperz.log("<<< NewUserCreationComponent.showUserCreationDone");
390 }, 387 },
391 388
392 'showUserCreationFailed': function () { 389 'showUserCreationFailed': function () {
393//Clipperz.log(">>> NewUserCreationComponent.showUserCreationFailed"); 390//Clipperz.log(">>> NewUserCreationComponent.showUserCreationFailed");
394 this.hideAllProgeressStates(); 391 this.hideAllProgeressStates();
395 MochiKit.Style.showElement(this.getElement('creatingFailed')); 392 MochiKit.Style.showElement(this.getElement('creatingFailed'));
396 }, 393 },
397 394
398 //========================================================================= 395 //=========================================================================
399 396
400 'handleKeyEvent': function (anEvent) { 397 'handleKeyEvent': function (anEvent) {
401 MochiKit.Signal.signal(this, 'keyPressed', anEvent); 398 MochiKit.Signal.signal(this, 'keyPressed', anEvent);
402/* 399/*
403 if (anEvent.key().string == 'KEY_ENTER') { 400 if (anEvent.key().string == 'KEY_ENTER') {
404 if (anEvent.target().nodeName != 'TEXTAREA') { 401 if (anEvent.target().nodeName != 'TEXTAREA') {
405 MochiKit.Signal.signal(this, 'moveForward'); 402 MochiKit.Signal.signal(this, 'moveForward');
406 anEvent.preventDefault(); 403 anEvent.preventDefault();
407 } 404 }
408 } else if (anEvent.key().string == 'KEY_TAB') { 405 } else if (anEvent.key().string == 'KEY_TAB') {
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 bed6675..3cc5a37 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/Page.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/Page.js
@@ -1,71 +1,68 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 26Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
30 27
31Clipperz.PM.UI.Web.Components.Page = function(args) { 28Clipperz.PM.UI.Web.Components.Page = function(args) {
32 args = args || {}; 29 args = args || {};
33 30
34 Clipperz.PM.UI.Web.Components.Page.superclass.constructor.apply(this, arguments); 31 Clipperz.PM.UI.Web.Components.Page.superclass.constructor.apply(this, arguments);
35 32
36 this._slots = { 33 this._slots = {
37 'header':'pageHeader', 34 'header':'pageHeader',
38 'body': 'pageBody', 35 'body': 'pageBody',
39 'footer':'pageFooter' 36 'footer':'pageFooter'
40 }; 37 };
41 38
42 return this; 39 return this;
43} 40}
44 41
45//============================================================================= 42//=============================================================================
46 43
47Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.Page, Clipperz.PM.UI.Common.Components.BaseComponent, { 44Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.Page, Clipperz.PM.UI.Common.Components.BaseComponent, {
48 45
49 //------------------------------------------------------------------------- 46 //-------------------------------------------------------------------------
50 47
51 'toString': function () { 48 'toString': function () {
52 return "Clipperz.PM.UI.Web.Components.Page component"; 49 return "Clipperz.PM.UI.Web.Components.Page component";
53 }, 50 },
54 51
55 //------------------------------------------------------------------------- 52 //-------------------------------------------------------------------------
56 53
57 'renderSelf': function(/*aContainer, aPosition*/) { 54 'renderSelf': function(/*aContainer, aPosition*/) {
58 this.append(this.element(), [ 55 this.append(this.element(), [
59 {tag:'div', id:'pageHeaderAndBody', cls:'pageHeaderAndBody', children:[ 56 {tag:'div', id:'pageHeaderAndBody', cls:'pageHeaderAndBody', children:[
60 {tag:'div', id:'pageHeader', cls:'pageHeader'}, 57 {tag:'div', id:'pageHeader', cls:'pageHeader'},
61 {tag:'div', id:'pageBody', cls:'pageBody'} 58 {tag:'div', id:'pageBody', cls:'pageBody'}
62 ]}, 59 ]},
63 {tag:'div', id:'pageFooter', cls:'pageFooter'} 60 {tag:'div', id:'pageFooter', cls:'pageFooter'}
64 ]); 61 ]);
65 62
66 }, 63 },
67 64
68 //------------------------------------------------------------------------- 65 //-------------------------------------------------------------------------
69 66
70 __syntaxFix__: "syntax fix" 67 __syntaxFix__: "syntax fix"
71}); 68});
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 11135d8..5e8cd7f 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/PageFooter.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/PageFooter.js
@@ -1,71 +1,68 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 26Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
30 27
31Clipperz.PM.UI.Web.Components.PageFooter = function(args) { 28Clipperz.PM.UI.Web.Components.PageFooter = function(args) {
32 args = args || {}; 29 args = args || {};
33 30
34 Clipperz.PM.UI.Web.Components.PageFooter.superclass.constructor.apply(this, arguments); 31 Clipperz.PM.UI.Web.Components.PageFooter.superclass.constructor.apply(this, arguments);
35 32
36 return this; 33 return this;
37} 34}
38 35
39//============================================================================= 36//=============================================================================
40 37
41Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.PageFooter, Clipperz.PM.UI.Common.Components.BaseComponent, { 38Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.PageFooter, Clipperz.PM.UI.Common.Components.BaseComponent, {
42 39
43 //------------------------------------------------------------------------- 40 //-------------------------------------------------------------------------
44 41
45 'toString': function () { 42 'toString': function () {
46 return "Clipperz.PM.UI.Web.Components.PageFooter component"; 43 return "Clipperz.PM.UI.Web.Components.PageFooter component";
47 }, 44 },
48 45
49 //------------------------------------------------------------------------- 46 //-------------------------------------------------------------------------
50 47
51 'renderSelf': function(/*aContainer, aPosition*/) { 48 'renderSelf': function(/*aContainer, aPosition*/) {
52 this.append(this.element(), [ 49 this.append(this.element(), [
53 {tag:'div', cls:'footerWrapper', children:[ 50 {tag:'div', cls:'footerWrapper', children:[
54 {tag:'div', cls:'footerContent', children:[ 51 {tag:'div', cls:'footerContent', children:[
55 // {tag:'div', cls:'footerStarIcon'}, 52 // {tag:'div', cls:'footerStarIcon'},
56 {tag:'canvas', id:this.getId('footerStarIcon'), cls:'footerStarIcon'}, 53 {tag:'canvas', id:this.getId('footerStarIcon'), cls:'footerStarIcon'},
57 {tag:'span', cls:'copyright', html:'Copyright &copy; 2009 Clipperz Srl'}, 54 {tag:'span', cls:'copyright', html:'Copyright &copy; 2009 Clipperz Srl'},
58 {tag:'a', href:'http://www.clipperz.com/terms_of_service',target:'_blank', html:'terms of service'}, 55 {tag:'a', href:'http://www.clipperz.com/terms_of_service',target:'_blank', html:'terms of service'},
59 {tag:'a', href:'http://www.clipperz.com/privacy_policy',target:'_blank', html:'privacy policy'}, 56 {tag:'a', href:'http://www.clipperz.com/privacy_policy',target:'_blank', html:'privacy policy'},
60 {tag:'span', cls:'applicationVersion', html:'application version: [1992]'} 57 {tag:'span', cls:'applicationVersion', html:'application version: [1992]'}
61 ]} 58 ]}
62 ]} 59 ]}
63 ]); 60 ]);
64 61
65 Clipperz.PM.UI.Canvas.star.normal(this.getElement('footerStarIcon'), "#7e7e7e"); 62 Clipperz.PM.UI.Canvas.star.normal(this.getElement('footerStarIcon'), "#7e7e7e");
66 }, 63 },
67 64
68 //------------------------------------------------------------------------- 65 //-------------------------------------------------------------------------
69 66
70 __syntaxFix__: "syntax fix" 67 __syntaxFix__: "syntax fix"
71}); 68});
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 3924434..bce8395 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/PageHeader.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/PageHeader.js
@@ -1,184 +1,181 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 26Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
30 27
31Clipperz.PM.UI.Web.Components.PageHeader = function(args) { 28Clipperz.PM.UI.Web.Components.PageHeader = function(args) {
32 args = args || {}; 29 args = args || {};
33 30
34 Clipperz.PM.UI.Web.Components.PageHeader.superclass.constructor.apply(this, arguments); 31 Clipperz.PM.UI.Web.Components.PageHeader.superclass.constructor.apply(this, arguments);
35 this._newsIsOpen = args.newsIsOpen || false; 32 this._newsIsOpen = args.newsIsOpen || false;
36 this._animationDuration = args.animationDuration || 0.5; 33 this._animationDuration = args.animationDuration || 0.5;
37 34
38 this._offset = 82; 35 this._offset = 82;
39 36
40 return this; 37 return this;
41} 38}
42 39
43//============================================================================= 40//=============================================================================
44 41
45Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.PageHeader, Clipperz.PM.UI.Common.Components.BaseComponent, { 42Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.PageHeader, Clipperz.PM.UI.Common.Components.BaseComponent, {
46 43
47 //------------------------------------------------------------------------- 44 //-------------------------------------------------------------------------
48 45
49 'toString': function () { 46 'toString': function () {
50 return "Clipperz.PM.UI.Web.Components.PageHeader component"; 47 return "Clipperz.PM.UI.Web.Components.PageHeader component";
51 }, 48 },
52 49
53 //------------------------------------------------------------------------- 50 //-------------------------------------------------------------------------
54 51
55 'iframeURL': function () { 52 'iframeURL': function () {
56 // return './rss_view.html'; 53 // return './rss_view.html';
57 return 'http://www.clipperz.com/files/clipperz.com/appTips/index.html'; 54 return 'http://www.clipperz.com/files/clipperz.com/appTips/index.html';
58 }, 55 },
59 56
60 //------------------------------------------------------------------------- 57 //-------------------------------------------------------------------------
61 58
62 'renderSelf': function(/*aContainer, aPosition*/) { 59 'renderSelf': function(/*aContainer, aPosition*/) {
63 this.append(this.element(), [ 60 this.append(this.element(), [
64 {tag:'div', id:'miscLinks', children:[ 61 {tag:'div', id:'miscLinks', children:[
65 {tag:'ul', children:[ 62 {tag:'ul', children:[
66 {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')}]}, 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')}]},
67 {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')}]}, 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')}]},
68 {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')}]}, 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')}]},
69 {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')}]}, 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')}]},
70 {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')}]} 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')}]}
71 ]} 68 ]}
72 ]}, 69 ]},
73 {tag:'div', id:'logoFrame', children:[ 70 {tag:'div', id:'logoFrame', children:[
74 {tag:'a', href:'http://www.clipperz.com', target:'_blank', children:[{tag:'div', id:'logo'}]}, 71 {tag:'a', href:'http://www.clipperz.com', target:'_blank', children:[{tag:'div', id:'logo'}]},
75 {tag:'h5', cls:'clipperzPayoff', html:'keep it to yourself!'} 72 {tag:'h5', cls:'clipperzPayoff', html:'keep it to yourself!'}
76 ]}, 73 ]},
77 {tag:'div', id:'news', cls:'hidden', children:[ 74 {tag:'div', id:'news', cls:'hidden', children:[
78 // {tag:'div', cls:'close', children:[ 75 // {tag:'div', cls:'close', children:[
79 // {tag:'a', href:'#', id:this.getId('closeTips'), html:'x'} 76 // {tag:'a', href:'#', id:this.getId('closeTips'), html:'x'}
80 // ]}, 77 // ]},
81 {tag:'div', id:'newsframe', children:[ 78 {tag:'div', id:'newsframe', children:[
82 {tag:'iframe', id:this.getId('iframe'), src:this.iframeURL()} 79 {tag:'iframe', id:this.getId('iframe'), src:this.iframeURL()}
83 ]}, 80 ]},
84 {tag:'div', id:this.getId('newsGrip'), cls:'grip', children:[]} 81 {tag:'div', id:this.getId('newsGrip'), cls:'grip', children:[]}
85 ]}, 82 ]},
86 {tag:'div', id:'featureTabs', children:[ 83 {tag:'div', id:'featureTabs', children:[
87 {tag:'table', children:[{tag:'tr', children:[ 84 {tag:'table', children:[{tag:'tr', children:[
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"}]}]}, 85 {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"}]}]},
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"}]}]}, 86 {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"}]}]},
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"}]}]}, 87 {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"}]}]},
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"}]}]} 88 {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"}]}]}
92 ]}]} 89 ]}]}
93 ]} 90 ]}
94 ]); 91 ]);
95 92
96 Clipperz.PM.UI.Canvas.features.store(this.getElement('storeIcon'), "#ffffff"); 93 Clipperz.PM.UI.Canvas.features.store(this.getElement('storeIcon'), "#ffffff");
97 Clipperz.PM.UI.Canvas.features.protect(this.getElement('protectIcon'), "#ffffff"); 94 Clipperz.PM.UI.Canvas.features.protect(this.getElement('protectIcon'), "#ffffff");
98 Clipperz.PM.UI.Canvas.features.directLogin(this.getElement('directLoginIcon'), "#ffffff"); 95 Clipperz.PM.UI.Canvas.features.directLogin(this.getElement('directLoginIcon'), "#ffffff");
99 Clipperz.PM.UI.Canvas.features.share(this.getElement('shareIcon'), "#ffffff", "#ffffff", "#ff0000"); 96 Clipperz.PM.UI.Canvas.features.share(this.getElement('shareIcon'), "#ffffff", "#ffffff", "#ff0000");
100 97
101 MochiKit.Signal.connect(this.getElement('newsGrip'), 'onclick', this, 'toggleTips'); 98 MochiKit.Signal.connect(this.getElement('newsGrip'), 'onclick', this, 'toggleTips');
102 MochiKit.Signal.connect(this.getElement('iframe'), 'onload', this, 'handleIframeDidLoad'); 99 MochiKit.Signal.connect(this.getElement('iframe'), 'onload', this, 'handleIframeDidLoad');
103 }, 100 },
104 101
105 //------------------------------------------------------------------------- 102 //-------------------------------------------------------------------------
106 103
107 'switchToLoggedMode': function() { 104 'switchToLoggedMode': function() {
108 // MochiKit.Style.addElementClass(this.element(), 'logged'); 105 // MochiKit.Style.addElementClass(this.element(), 'logged');
109 MochiKit.Style.hideElement('featureTabs'); 106 MochiKit.Style.hideElement('featureTabs');
110 }, 107 },
111 108
112 //------------------------------------------------------------------------- 109 //-------------------------------------------------------------------------
113 110
114 'animationDuration': function () { 111 'animationDuration': function () {
115 return this._animationDuration; 112 return this._animationDuration;
116 }, 113 },
117 114
118 'offset': function () { 115 'offset': function () {
119 return this._offset; 116 return this._offset;
120 }, 117 },
121 118
122 //------------------------------------------------------------------------- 119 //-------------------------------------------------------------------------
123 120
124 'isNewsOpen': function () { 121 'isNewsOpen': function () {
125 return this._newsIsOpen; 122 return this._newsIsOpen;
126 }, 123 },
127 124
128 'toggleNewsIsOpen': function () { 125 'toggleNewsIsOpen': function () {
129 this._newsIsOpen = !this._newsIsOpen; 126 this._newsIsOpen = !this._newsIsOpen;
130 }, 127 },
131 128
132 'toggleTips': function(anEvent) { 129 'toggleTips': function(anEvent) {
133 anEvent.preventDefault(); 130 anEvent.preventDefault();
134 131
135 if (this.isNewsOpen() == true) { 132 if (this.isNewsOpen() == true) {
136 MochiKit.Visual.Move(Clipperz.DOM.get('news'), { 133 MochiKit.Visual.Move(Clipperz.DOM.get('news'), {
137 x: 0, 134 x: 0,
138 y: -this.offset(), 135 y: -this.offset(),
139 mode: 'relative', 136 mode: 'relative',
140 duration: this.animationDuration(), 137 duration: this.animationDuration(),
141 beforeStart: function () { 138 beforeStart: function () {
142 MochiKit.DOM.setElementClass(Clipperz.DOM.get('news'), 'hiding'); 139 MochiKit.DOM.setElementClass(Clipperz.DOM.get('news'), 'hiding');
143 }, 140 },
144 afterFinish: function () { 141 afterFinish: function () {
145 Clipperz.DOM.get('newsframe').innerHTML = ""; 142 Clipperz.DOM.get('newsframe').innerHTML = "";
146 MochiKit.DOM.setElementClass(Clipperz.DOM.get('news'), 'hidden'); 143 MochiKit.DOM.setElementClass(Clipperz.DOM.get('news'), 'hidden');
147 } 144 }
148 }) 145 })
149 this.toggleNewsIsOpen(); 146 this.toggleNewsIsOpen();
150 } else { 147 } else {
151 MochiKit.DOM.addElementClass('newsframe', 'loading'); 148 MochiKit.DOM.addElementClass('newsframe', 'loading');
152 MochiKit.Visual.Move(Clipperz.DOM.get('news'), { 149 MochiKit.Visual.Move(Clipperz.DOM.get('news'), {
153 x: 0, 150 x: 0,
154 y: this.offset(), 151 y: this.offset(),
155 mode: 'relative', 152 mode: 'relative',
156 duration: this.animationDuration(), 153 duration: this.animationDuration(),
157 beforeStart: MochiKit.Base.bind(function () { 154 beforeStart: MochiKit.Base.bind(function () {
158 this.append(Clipperz.DOM.get('newsframe'), {tag:'iframe', id:this.getId('iframe'), src:this.iframeURL()}); 155 this.append(Clipperz.DOM.get('newsframe'), {tag:'iframe', id:this.getId('iframe'), src:this.iframeURL()});
159 156
160 MochiKit.Signal.connect(this.getElement('iframe'), 'onload', this, 'handleIframeDidLoad'); 157 MochiKit.Signal.connect(this.getElement('iframe'), 'onload', this, 'handleIframeDidLoad');
161 MochiKit.DOM.setElementClass(Clipperz.DOM.get('news'), 'opening'); 158 MochiKit.DOM.setElementClass(Clipperz.DOM.get('news'), 'opening');
162 }, this), 159 }, this),
163 afterFinish: function () { 160 afterFinish: function () {
164 MochiKit.DOM.setElementClass(Clipperz.DOM.get('news'), 'open'); 161 MochiKit.DOM.setElementClass(Clipperz.DOM.get('news'), 'open');
165 } 162 }
166 }) 163 })
167 this.toggleNewsIsOpen(); 164 this.toggleNewsIsOpen();
168 } 165 }
169 }, 166 },
170 167
171 //------------------------------------------------------------------------- 168 //-------------------------------------------------------------------------
172 169
173 'handleIframeDidLoad': function (anEvent) { 170 'handleIframeDidLoad': function (anEvent) {
174 if (this.isNewsOpen() == false) { 171 if (this.isNewsOpen() == false) {
175 this.toggleTips(anEvent); 172 this.toggleTips(anEvent);
176 } 173 }
177 174
178 MochiKit.DOM.removeElementClass('newsframe', 'loading'); 175 MochiKit.DOM.removeElementClass('newsframe', 'loading');
179 MochiKit.Signal.disconnectAllTo(this.getElement('iframe')); 176 MochiKit.Signal.disconnectAllTo(this.getElement('iframe'));
180 }, 177 },
181 178
182 //------------------------------------------------------------------------- 179 //-------------------------------------------------------------------------
183 __syntaxFix__: "syntax fix" 180 __syntaxFix__: "syntax fix"
184}); 181});
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 79c8d4f..987e51e 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/PasswordTooltip.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/PasswordTooltip.js
@@ -1,164 +1,161 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.PM.UI.Common.Components'); 26Clipperz.Base.module('Clipperz.PM.UI.Common.Components');
30 27
31Clipperz.PM.UI.Web.Components.PasswordTooltip = function(args) { 28Clipperz.PM.UI.Web.Components.PasswordTooltip = function(args) {
32 args = args || {}; 29 args = args || {};
33 30
34 Clipperz.PM.UI.Web.Components.PasswordTooltip.superclass.constructor.apply(this, arguments); 31 Clipperz.PM.UI.Web.Components.PasswordTooltip.superclass.constructor.apply(this, arguments);
35 32
36 this._referenceElement = args.referenceElement|| Clipperz.Base.exception.raise('MandatoryParameter'); 33 this._referenceElement = args.referenceElement|| Clipperz.Base.exception.raise('MandatoryParameter');
37 this._text = args.text || Clipperz.Base.exception.raise('MandatoryParameter'); 34 this._text = args.text || Clipperz.Base.exception.raise('MandatoryParameter');
38 35
39 this._boxDimensions = null; 36 this._boxDimensions = null;
40 this._isVisible = false; 37 this._isVisible = false;
41 38
42 this.renderSelf(); 39 this.renderSelf();
43 40
44 return this; 41 return this;
45} 42}
46 43
47//============================================================================= 44//=============================================================================
48 45
49Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.PasswordTooltip, Clipperz.PM.UI.Common.Components.BaseComponent, { 46Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.PasswordTooltip, Clipperz.PM.UI.Common.Components.BaseComponent, {
50 47
51 //------------------------------------------------------------------------- 48 //-------------------------------------------------------------------------
52 49
53 'toString': function () { 50 'toString': function () {
54 return "Clipperz.PM.UI.Web.Components.PasswordTooltip component"; 51 return "Clipperz.PM.UI.Web.Components.PasswordTooltip component";
55 }, 52 },
56 53
57 //------------------------------------------------------------------------- 54 //-------------------------------------------------------------------------
58 55
59 'referenceElement': function () { 56 'referenceElement': function () {
60 return this._referenceElement; 57 return this._referenceElement;
61 }, 58 },
62 59
63 //------------------------------------------------------------------------- 60 //-------------------------------------------------------------------------
64 61
65 'text': function () { 62 'text': function () {
66 return this._text; 63 return this._text;
67 }, 64 },
68 65
69 'setText': function (aValue) { 66 'setText': function (aValue) {
70 this._text = aValue; 67 this._text = aValue;
71 }, 68 },
72 69
73 //------------------------------------------------------------------------- 70 //-------------------------------------------------------------------------
74 71
75 'isVisible': function () { 72 'isVisible': function () {
76 return this._isVisible; 73 return this._isVisible;
77 }, 74 },
78 75
79 'setIsVisible': function (aValue) { 76 'setIsVisible': function (aValue) {
80 this._isVisible = aValue; 77 this._isVisible = aValue;
81 }, 78 },
82 79
83 //------------------------------------------------------------------------- 80 //-------------------------------------------------------------------------
84 81
85 'renderSelf': function() { 82 'renderSelf': function() {
86 this.append(MochiKit.DOM.getElement('Clipperz_PM_UI_Common_Components_Tooltip_wrapperNode'), {tag:'div', id:this.getId('tooltip'), cls:'passwordTooltip', children:[ 83 this.append(MochiKit.DOM.getElement('Clipperz_PM_UI_Common_Components_Tooltip_wrapperNode'), {tag:'div', id:this.getId('tooltip'), cls:'passwordTooltip', children:[
87 {tag:'div', id:this.getId('body'), cls:'passwordTooltip_body', children:[ 84 {tag:'div', id:this.getId('body'), cls:'passwordTooltip_body', children:[
88 {tag:'div', cls:'passwordTooltip_text', children:[ 85 {tag:'div', cls:'passwordTooltip_text', children:[
89 {tag:'span', html:this.text()} 86 {tag:'span', html:this.text()}
90 ]}, 87 ]},
91 {tag:'div', id:this.getId('footer'), cls:'passwordTooltip_footer'} 88 {tag:'div', id:this.getId('footer'), cls:'passwordTooltip_footer'}
92 ]}, 89 ]},
93 {tag:'div', id:this.getId('arrow'), cls:'passwordTooltip_arrow'} 90 {tag:'div', id:this.getId('arrow'), cls:'passwordTooltip_arrow'}
94 ]}); 91 ]});
95 92
96 this._boxDimensions = MochiKit.Style.getElementDimensions(this.getId('body')); 93 this._boxDimensions = MochiKit.Style.getElementDimensions(this.getId('body'));
97 // this._boxDimensions.h += MochiKit.Style.getElementDimensions(this.getId('footer')).h; 94 // this._boxDimensions.h += MochiKit.Style.getElementDimensions(this.getId('footer')).h;
98 95
99 MochiKit.Style.hideElement(this.displayElement()); 96 MochiKit.Style.hideElement(this.displayElement());
100 MochiKit.Signal.connect(this.element(), 'onmouseenter', this, 'show'); 97 MochiKit.Signal.connect(this.element(), 'onmouseenter', this, 'show');
101 MochiKit.Signal.connect(this.element(), 'onmouseleave', this, 'hide'); 98 MochiKit.Signal.connect(this.element(), 'onmouseleave', this, 'hide');
102 }, 99 },
103 100
104 //----------------------------------------------------- 101 //-----------------------------------------------------
105 102
106 'displayElement': function() { 103 'displayElement': function() {
107 return this.getElement('tooltip'); 104 return this.getElement('tooltip');
108 }, 105 },
109 106
110 //------------------------------------------------------------------------- 107 //-------------------------------------------------------------------------
111 108
112 'boxDimensions': function () { 109 'boxDimensions': function () {
113 return this._boxDimensions; 110 return this._boxDimensions;
114 }, 111 },
115 112
116 //------------------------------------------------------------------------- 113 //-------------------------------------------------------------------------
117 114
118 'show': function () { 115 'show': function () {
119 var elementSizeAndPosition; 116 var elementSizeAndPosition;
120 var arrowPosition; 117 var arrowPosition;
121 var bodyPosition; 118 var bodyPosition;
122 119
123 if (this.isVisible() == false) { 120 if (this.isVisible() == false) {
124 arrowPosition = {}; 121 arrowPosition = {};
125 bodyPosition = {}; 122 bodyPosition = {};
126 123
127 this.setIsVisible(true); 124 this.setIsVisible(true);
128 elementSizeAndPosition = Clipperz.Style.getSizeAndPosition(this.element()); 125 elementSizeAndPosition = Clipperz.Style.getSizeAndPosition(this.element());
129 126
130 MochiKit.Style.setElementDimensions(this.getId('arrow'), {w:36, h:13}, 'px'); 127 MochiKit.Style.setElementDimensions(this.getId('arrow'), {w:36, h:13}, 'px');
131 bodyPosition.x = elementSizeAndPosition.position.x + (elementSizeAndPosition.dimensions.w/2 - this.boxDimensions().w/2); 128 bodyPosition.x = elementSizeAndPosition.position.x + (elementSizeAndPosition.dimensions.w/2 - this.boxDimensions().w/2);
132 bodyPosition.y = elementSizeAndPosition.position.y - this.boxDimensions().h - 13; 129 bodyPosition.y = elementSizeAndPosition.position.y - this.boxDimensions().h - 13;
133 130
134 arrowPosition.x = elementSizeAndPosition.position.x + (elementSizeAndPosition.dimensions.w/2 - 36/2); 131 arrowPosition.x = elementSizeAndPosition.position.x + (elementSizeAndPosition.dimensions.w/2 - 36/2);
135 arrowPosition.y = elementSizeAndPosition.position.y - 13; 132 arrowPosition.y = elementSizeAndPosition.position.y - 13;
136 133
137 MochiKit.Style.setElementPosition(this.getId('body'), bodyPosition); 134 MochiKit.Style.setElementPosition(this.getId('body'), bodyPosition);
138 MochiKit.Style.setElementPosition(this.getId('arrow'), arrowPosition); 135 MochiKit.Style.setElementPosition(this.getId('arrow'), arrowPosition);
139 MochiKit.Visual.appear(this.displayElement(), {duration:0.4}); 136 MochiKit.Visual.appear(this.displayElement(), {duration:0.4});
140 } 137 }
141 }, 138 },
142 139
143 'hide': function () { 140 'hide': function () {
144 if (this.isVisible() == true) { 141 if (this.isVisible() == true) {
145 MochiKit.Visual.fade(this.displayElement(), {duration:0.4}); 142 MochiKit.Visual.fade(this.displayElement(), {duration:0.4});
146 this.setIsVisible(false); 143 this.setIsVisible(false);
147 } 144 }
148 }, 145 },
149 146
150 //------------------------------------------------------------------------- 147 //-------------------------------------------------------------------------
151/* 148/*
152 'shouldRemoveElementWhenClearningUp': function () { 149 'shouldRemoveElementWhenClearningUp': function () {
153 return false; 150 return false;
154 }, 151 },
155*/ 152*/
156 //------------------------------------------------------------------------- 153 //-------------------------------------------------------------------------
157 __syntaxFix__: "syntax fix" 154 __syntaxFix__: "syntax fix"
158}); 155});
159 156
160Clipperz.PM.UI.Web.Components.PasswordTooltip.initTooltips = function () { 157Clipperz.PM.UI.Web.Components.PasswordTooltip.initTooltips = function () {
161 Clipperz.DOM.Helper.insertBefore(MochiKit.DOM.currentDocument().body.childNodes[0], {tag:'div', id:'Clipperz_PM_UI_Web_Components_PasswordTooltip_wrapperNode'}); 158 Clipperz.DOM.Helper.insertBefore(MochiKit.DOM.currentDocument().body.childNodes[0], {tag:'div', id:'Clipperz_PM_UI_Web_Components_PasswordTooltip_wrapperNode'});
162} 159}
163 160
164MochiKit.DOM.addLoadEvent(Clipperz.PM.UI.Web.Components.PasswordTooltip.initTooltips); 161MochiKit.DOM.addLoadEvent(Clipperz.PM.UI.Web.Components.PasswordTooltip.initTooltips);
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 ab8a38c..69c1ede 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/RulerComponent.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/RulerComponent.js
@@ -1,324 +1,321 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 26Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
30 27
31Clipperz.PM.UI.Web.Components.RulerComponent = function(args) { 28Clipperz.PM.UI.Web.Components.RulerComponent = function(args) {
32 args = args || {}; 29 args = args || {};
33 Clipperz.PM.UI.Web.Components.RulerComponent.superclass.constructor.apply(this, arguments); 30 Clipperz.PM.UI.Web.Components.RulerComponent.superclass.constructor.apply(this, arguments);
34 31
35 this._translationContext = args.translationContext|| Clipperz.Base.exception.raise('MandatoryParameter'); 32 this._translationContext = args.translationContext|| Clipperz.Base.exception.raise('MandatoryParameter');
36 // this._steps = args.steps || Clipperz.Base.exception.raise('MandatoryParameter'); 33 // this._steps = args.steps || Clipperz.Base.exception.raise('MandatoryParameter');
37 this._steps = args.steps; 34 this._steps = args.steps;
38 35
39 this._currentStep = -1; 36 this._currentStep = -1;
40 37
41 return this; 38 return this;
42} 39}
43 40
44//============================================================================= 41//=============================================================================
45 42
46Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.RulerComponent, Clipperz.PM.UI.Common.Components.BaseComponent, { 43Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.RulerComponent, Clipperz.PM.UI.Common.Components.BaseComponent, {
47 44
48 //------------------------------------------------------------------------- 45 //-------------------------------------------------------------------------
49 46
50 'toString': function () { 47 'toString': function () {
51 return "Clipperz.PM.UI.Web.Components.RulerComponent component"; 48 return "Clipperz.PM.UI.Web.Components.RulerComponent component";
52 }, 49 },
53 50
54 //------------------------------------------------------------------------- 51 //-------------------------------------------------------------------------
55 52
56 'resetStatus': function (args) { 53 'resetStatus': function (args) {
57 args = args || {}; 54 args = args || {};
58 55
59 if (this.currentStep() != 0) { 56 if (this.currentStep() != 0) {
60 var shouldAnimateTransition; 57 var shouldAnimateTransition;
61 58
62 shouldAnimateTransition = args.animateTransition || false; 59 shouldAnimateTransition = args.animateTransition || false;
63 60
64 if (shouldAnimateTransition) { 61 if (shouldAnimateTransition) {
65 this.moveToFirstStep(MochiKit.Base.method(this, 'cursorMoved')); 62 this.moveToFirstStep(MochiKit.Base.method(this, 'cursorMoved'));
66 } else { 63 } else {
67 this._currentStep = 0; 64 this._currentStep = 0;
68 this.cursorMoved(); 65 this.cursorMoved();
69 } 66 }
70 } 67 }
71 }, 68 },
72 69
73 //------------------------------------------------------------------------- 70 //-------------------------------------------------------------------------
74 71
75 'translationContext': function () { 72 'translationContext': function () {
76 return this._translationContext; 73 return this._translationContext;
77 }, 74 },
78 75
79 'steps': function () { 76 'steps': function () {
80 return this._steps; 77 return this._steps;
81 }, 78 },
82 79
83 'setSteps': function (aValue) { 80 'setSteps': function (aValue) {
84 this._steps = aValue; 81 this._steps = aValue;
85 this.renderStepsComponents(); 82 this.renderStepsComponents();
86 this.resetStatus(); 83 this.resetStatus();
87 }, 84 },
88 85
89 'translatedStepDescription': function (aStep) { 86 'translatedStepDescription': function (aStep) {
90 return Clipperz.PM.Strings.getValue(this.translationContext() + '.' + aStep + '.' + 'name'); 87 return Clipperz.PM.Strings.getValue(this.translationContext() + '.' + aStep + '.' + 'name');
91 }, 88 },
92 89
93 //------------------------------------------------------------------------- 90 //-------------------------------------------------------------------------
94 91
95 'renderSelf': function(/*aContainer, aPosition*/) { 92 'renderSelf': function(/*aContainer, aPosition*/) {
96 this.setElement(this.append(MochiKit.DOM.currentDocument().body, [ 93 this.setElement(this.append(MochiKit.DOM.currentDocument().body, [
97 {tag:'div', id:this.getId('rulerWrapper'), cls:'rulerWrapper fixed', children:[ 94 {tag:'div', id:this.getId('rulerWrapper'), cls:'rulerWrapper fixed', children:[
98 {tag:'div', cls:'ruler', children:[ 95 {tag:'div', cls:'ruler', children:[
99 {tag:'a', href:'#', id:this.getId('exit'), cls:'exit', html:'&nbsp;'}, 96 {tag:'a', href:'#', id:this.getId('exit'), cls:'exit', html:'&nbsp;'},
100 {tag:'a', href:'#', id:this.getId('smallPreviousButton'),cls:'smallButton previous', html:'&nbsp;'}, 97 {tag:'a', href:'#', id:this.getId('smallPreviousButton'),cls:'smallButton previous', html:'&nbsp;'},
101 {tag:'a', href:'#', id:this.getId('smallNextButton'), cls:'smallButton next', html:'&nbsp;'}, 98 {tag:'a', href:'#', id:this.getId('smallNextButton'), cls:'smallButton next', html:'&nbsp;'},
102 {tag:'div', cls:'marker', id:this.getId('marker'), children:[ 99 {tag:'div', cls:'marker', id:this.getId('marker'), children:[
103 {tag:'div', cls:'previous', id:this.getId('previousButton')}, 100 {tag:'div', cls:'previous', id:this.getId('previousButton')},
104 {tag:'div', cls:'markerBody'}, 101 {tag:'div', cls:'markerBody'},
105 {tag:'div', cls:'next', id:this.getId('nextButton')} 102 {tag:'div', cls:'next', id:this.getId('nextButton')}
106 ]}, 103 ]},
107 {tag:'div', cls:'steps', id:this.getId('stepsFrame')}, 104 {tag:'div', cls:'steps', id:this.getId('stepsFrame')},
108 // {tag:'div', cls:'steps' + ' ' + 'steps_' + this.steps().length, children:[ 105 // {tag:'div', cls:'steps' + ' ' + 'steps_' + this.steps().length, children:[
109 // {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())} 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())}
110 // ]}, 107 // ]},
111 {tag:'div', cls:'dots', id:this.getId('dotsFrame')} 108 {tag:'div', cls:'dots', id:this.getId('dotsFrame')}
112 // {tag:'div', cls:'dots' + ' ' + 'steps_' + this.steps().length, children:[ 109 // {tag:'div', cls:'dots' + ' ' + 'steps_' + this.steps().length, children:[
113 // {tag:'ul', id:this.getId('dots'), children:MochiKit.Base.map(function (aStep) { return {tag:'li', children:[{tag:'span', html:'*'}]}}, this.steps())} 110 // {tag:'ul', id:this.getId('dots'), children:MochiKit.Base.map(function (aStep) { return {tag:'li', children:[{tag:'span', html:'*'}]}}, this.steps())}
114 // ]} 111 // ]}
115 ]} 112 ]}
116 ]} 113 ]}
117 ])); 114 ]));
118//console.log("ELEMENT", this.element()); 115//console.log("ELEMENT", this.element());
119 116
120 MochiKit.Signal.connect(this.getElement('exit'), 'onclick', this, 'handleExit'); 117 MochiKit.Signal.connect(this.getElement('exit'), 'onclick', this, 'handleExit');
121 118
122 MochiKit.Signal.connect(this.getElement('previousButton'), 'onclick', this, 'handlePrevious'); 119 MochiKit.Signal.connect(this.getElement('previousButton'), 'onclick', this, 'handlePrevious');
123 MochiKit.Signal.connect(this.getElement('smallPreviousButton'),'onclick', this, 'handlePrevious'); 120 MochiKit.Signal.connect(this.getElement('smallPreviousButton'),'onclick', this, 'handlePrevious');
124 121
125 MochiKit.Signal.connect(this.getElement('nextButton'), 'onclick', this, 'handleNext'); 122 MochiKit.Signal.connect(this.getElement('nextButton'), 'onclick', this, 'handleNext');
126 MochiKit.Signal.connect(this.getElement('smallNextButton'), 'onclick', this, 'handleNext'); 123 MochiKit.Signal.connect(this.getElement('smallNextButton'), 'onclick', this, 'handleNext');
127 124
128 this.enablePrevious(false); 125 this.enablePrevious(false);
129 this.enableNext(false); 126 this.enableNext(false);
130 127
131 // this.cursorMoved(); 128 // this.cursorMoved();
132 }, 129 },
133 130
134 //......................................................................... 131 //.........................................................................
135 132
136 'renderStepsComponents': function () { 133 'renderStepsComponents': function () {
137 varstepsFrame; 134 varstepsFrame;
138 var dotsFrame; 135 var dotsFrame;
139 136
140 stepsFrames = this.getElement('stepsFrame'); 137 stepsFrames = this.getElement('stepsFrame');
141 MochiKit.DOM.setElementClass(stepsFrames, 'steps'); 138 MochiKit.DOM.setElementClass(stepsFrames, 'steps');
142 MochiKit.DOM.addElementClass(stepsFrames, 'steps_' + this.steps().length); 139 MochiKit.DOM.addElementClass(stepsFrames, 'steps_' + this.steps().length);
143 140
144 stepsFrames.innerHTML = ""; 141 stepsFrames.innerHTML = "";
145 this.append(stepsFrames, {tag:'ul', id:this.getId('steps'), children:MochiKit.Base.map( 142 this.append(stepsFrames, {tag:'ul', id:this.getId('steps'), children:MochiKit.Base.map(
146 MochiKit.Base.bind(function (aStep) { return {tag:'li', children:[{tag:'span', html:this.translatedStepDescription(aStep)}]}}, this), 143 MochiKit.Base.bind(function (aStep) { return {tag:'li', children:[{tag:'span', html:this.translatedStepDescription(aStep)}]}}, this),
147 this.steps())} 144 this.steps())}
148 ); 145 );
149 146
150 dotsFrames = this.getElement('dotsFrame'); 147 dotsFrames = this.getElement('dotsFrame');
151 MochiKit.DOM.setElementClass(dotsFrames, 'dots'); 148 MochiKit.DOM.setElementClass(dotsFrames, 'dots');
152 MochiKit.DOM.addElementClass(dotsFrames, 'steps_' + this.steps().length); 149 MochiKit.DOM.addElementClass(dotsFrames, 'steps_' + this.steps().length);
153 150
154 dotsFrames.innerHTML = ""; 151 dotsFrames.innerHTML = "";
155 this.append(dotsFrames, {tag:'ul', id:this.getId('dots'), children:MochiKit.Base.map( 152 this.append(dotsFrames, {tag:'ul', id:this.getId('dots'), children:MochiKit.Base.map(
156 function (aStep) { return {tag:'li', children:[{tag:'span', html:'*'}]}; }, 153 function (aStep) { return {tag:'li', children:[{tag:'span', html:'*'}]}; },
157 this.steps())} 154 this.steps())}
158 ); 155 );
159 }, 156 },
160 157
161 //------------------------------------------------------------------------- 158 //-------------------------------------------------------------------------
162 159
163 'handleExit': function (anEvent) { 160 'handleExit': function (anEvent) {
164 anEvent.preventDefault(); 161 anEvent.preventDefault();
165 162
166 MochiKit.Signal.signal(this, 'exit'); 163 MochiKit.Signal.signal(this, 'exit');
167 }, 164 },
168 165
169 //------------------------------------------------------------------------- 166 //-------------------------------------------------------------------------
170 167
171 'handlePrevious': function (anEvent) { 168 'handlePrevious': function (anEvent) {
172 anEvent.preventDefault(); 169 anEvent.preventDefault();
173 170
174 // if (!MochiKit.DOM.hasElementClass(this.getElement('previousButton'), 'disabled')) { 171 // if (!MochiKit.DOM.hasElementClass(this.getElement('previousButton'), 'disabled')) {
175 // this.moveBackward(); 172 // this.moveBackward();
176 // } 173 // }
177 174
178 MochiKit.Signal.signal(this, 'moveBackward'); 175 MochiKit.Signal.signal(this, 'moveBackward');
179 }, 176 },
180 177
181 'handleNext': function (anEvent) { 178 'handleNext': function (anEvent) {
182 anEvent.preventDefault(); 179 anEvent.preventDefault();
183 180
184 // if (!MochiKit.DOM.hasElementClass(this.getElement('nextButton'), 'disabled')) { 181 // if (!MochiKit.DOM.hasElementClass(this.getElement('nextButton'), 'disabled')) {
185 // this.moveForward(); 182 // this.moveForward();
186 // } 183 // }
187 184
188 MochiKit.Signal.signal(this, 'moveForward'); 185 MochiKit.Signal.signal(this, 'moveForward');
189 }, 186 },
190 187
191 //------------------------------------------------------------------------- 188 //-------------------------------------------------------------------------
192 189
193 'currentStep': function () { 190 'currentStep': function () {
194 return this._currentStep; 191 return this._currentStep;
195 }, 192 },
196 193
197 'markerInitialOffset': function () { 194 'markerInitialOffset': function () {
198 return -246; 195 return -246;
199 }, 196 },
200 197
201 'markerStepOffset': function () { 198 'markerStepOffset': function () {
202 return 410 / (this.steps().length - 1); 199 return 410 / (this.steps().length - 1);
203 // return 100; 200 // return 100;
204 }, 201 },
205 202
206 //------------------------------------------------------------------------- 203 //-------------------------------------------------------------------------
207 204
208 'moveToFirstStep': function (aCallback) { 205 'moveToFirstStep': function (aCallback) {
209 varstepsToMove; 206 varstepsToMove;
210 207
211 stepsToMove = this._currentStep; 208 stepsToMove = this._currentStep;
212 this._currentStep = 0; 209 this._currentStep = 0;
213 210
214 this.enablePrevious(false); 211 this.enablePrevious(false);
215 this.enableNext(false); 212 this.enableNext(false);
216 // MochiKit.Signal.signal(this, 'moveBackward'); 213 // MochiKit.Signal.signal(this, 'moveBackward');
217 MochiKit.Base.map( 214 MochiKit.Base.map(
218 function (anElement) { MochiKit.DOM.removeElementClass(anElement, 'selected'); }, 215 function (anElement) { MochiKit.DOM.removeElementClass(anElement, 'selected'); },
219 MochiKit.Selector.findChildElements(this.element(), ['li.selected']) 216 MochiKit.Selector.findChildElements(this.element(), ['li.selected'])
220 ); 217 );
221 new MochiKit.Visual.Move(this.getElement('marker'), { 218 new MochiKit.Visual.Move(this.getElement('marker'), {
222 x:-(this.markerStepOffset() * stepsToMove), 219 x:-(this.markerStepOffset() * stepsToMove),
223 mode:'relative', 220 mode:'relative',
224 duration:(0.5 * (stepsToMove/2)), 221 duration:(0.5 * (stepsToMove/2)),
225 // afterFinish:MochiKit.Base.method(this, 'cursorMoved') 222 // afterFinish:MochiKit.Base.method(this, 'cursorMoved')
226 afterFinish:MochiKit.Base.compose(MochiKit.Base.method(this, 'cursorMoved'), aCallback) 223 afterFinish:MochiKit.Base.compose(MochiKit.Base.method(this, 'cursorMoved'), aCallback)
227 }); 224 });
228 }, 225 },
229 226
230 'moveBackward': function (aCallback) { 227 'moveBackward': function (aCallback) {
231 this._currentStep --; 228 this._currentStep --;
232 229
233 this.enablePrevious(false); 230 this.enablePrevious(false);
234 this.enableNext(false); 231 this.enableNext(false);
235 // MochiKit.Signal.signal(this, 'moveBackward'); 232 // MochiKit.Signal.signal(this, 'moveBackward');
236 MochiKit.Base.map( 233 MochiKit.Base.map(
237 function (anElement) { MochiKit.DOM.removeElementClass(anElement, 'selected'); }, 234 function (anElement) { MochiKit.DOM.removeElementClass(anElement, 'selected'); },
238 MochiKit.Selector.findChildElements(this.element(), ['li.selected']) 235 MochiKit.Selector.findChildElements(this.element(), ['li.selected'])
239 ); 236 );
240 new MochiKit.Visual.Move(this.getElement('marker'), { 237 new MochiKit.Visual.Move(this.getElement('marker'), {
241 x:-this.markerStepOffset(), 238 x:-this.markerStepOffset(),
242 mode:'relative', 239 mode:'relative',
243 duration:0.5, 240 duration:0.5,
244 // afterFinish:MochiKit.Base.method(this, 'cursorMoved') 241 // afterFinish:MochiKit.Base.method(this, 'cursorMoved')
245 afterFinish:MochiKit.Base.compose(MochiKit.Base.method(this, 'cursorMoved'), aCallback) 242 afterFinish:MochiKit.Base.compose(MochiKit.Base.method(this, 'cursorMoved'), aCallback)
246 }); 243 });
247 }, 244 },
248 245
249 'moveForward': function (aCallback) { 246 'moveForward': function (aCallback) {
250 this._currentStep ++; 247 this._currentStep ++;
251 248
252 if (this._currentStep < this.steps().length) { 249 if (this._currentStep < this.steps().length) {
253 this.enablePrevious(false); 250 this.enablePrevious(false);
254 this.enableNext(false); 251 this.enableNext(false);
255 // MochiKit.Signal.signal(this, 'moveForward'); 252 // MochiKit.Signal.signal(this, 'moveForward');
256 MochiKit.Base.map( 253 MochiKit.Base.map(
257 function (anElement) { MochiKit.DOM.removeElementClass(anElement, 'selected'); }, 254 function (anElement) { MochiKit.DOM.removeElementClass(anElement, 'selected'); },
258 MochiKit.Selector.findChildElements(this.element(), ['li.selected']) 255 MochiKit.Selector.findChildElements(this.element(), ['li.selected'])
259 ); 256 );
260 new MochiKit.Visual.Move(this.getElement('marker'), { 257 new MochiKit.Visual.Move(this.getElement('marker'), {
261 x:this.markerStepOffset(), 258 x:this.markerStepOffset(),
262 mode:'relative', 259 mode:'relative',
263 duration:0.5, 260 duration:0.5,
264 // afterFinish:MochiKit.Base.method(this, 'cursorMoved') 261 // afterFinish:MochiKit.Base.method(this, 'cursorMoved')
265 afterFinish:MochiKit.Base.compose(MochiKit.Base.method(this, 'cursorMoved'), aCallback) 262 afterFinish:MochiKit.Base.compose(MochiKit.Base.method(this, 'cursorMoved'), aCallback)
266 }); 263 });
267 } else { 264 } else {
268 MochiKit.Signal.signal(this, 'done'); 265 MochiKit.Signal.signal(this, 'done');
269 } 266 }
270 }, 267 },
271 268
272 //------------------------------------------------------------------------- 269 //-------------------------------------------------------------------------
273 270
274 'enablePrevious': function (aValue) { 271 'enablePrevious': function (aValue) {
275 if (aValue == true) { 272 if (aValue == true) {
276 MochiKit.DOM.removeElementClass(this.getElement('previousButton'), 'disabled'); 273 MochiKit.DOM.removeElementClass(this.getElement('previousButton'), 'disabled');
277 MochiKit.DOM.removeElementClass(this.getElement('smallPreviousButton'), 'disabled'); 274 MochiKit.DOM.removeElementClass(this.getElement('smallPreviousButton'), 'disabled');
278 } else { 275 } else {
279 MochiKit.DOM.addElementClass(this.getElement('previousButton'), 'disabled'); 276 MochiKit.DOM.addElementClass(this.getElement('previousButton'), 'disabled');
280 MochiKit.DOM.addElementClass(this.getElement('smallPreviousButton'), 'disabled'); 277 MochiKit.DOM.addElementClass(this.getElement('smallPreviousButton'), 'disabled');
281 } 278 }
282 }, 279 },
283 280
284 //'disablePrevious': function () { 281 //'disablePrevious': function () {
285 // MochiKit.DOM.addElementClass(this.getElement('previousButton'), 'disabled'); 282 // MochiKit.DOM.addElementClass(this.getElement('previousButton'), 'disabled');
286 //}, 283 //},
287 284
288 //......................................................................... 285 //.........................................................................
289 286
290 'enableNext': function (aValue) { 287 'enableNext': function (aValue) {
291 if (aValue == true) { 288 if (aValue == true) {
292 MochiKit.DOM.removeElementClass(this.getElement('nextButton'), 'disabled'); 289 MochiKit.DOM.removeElementClass(this.getElement('nextButton'), 'disabled');
293 MochiKit.DOM.removeElementClass(this.getElement('smallNextButton'), 'disabled'); 290 MochiKit.DOM.removeElementClass(this.getElement('smallNextButton'), 'disabled');
294 } else { 291 } else {
295 MochiKit.DOM.addElementClass(this.getElement('nextButton'), 'disabled'); 292 MochiKit.DOM.addElementClass(this.getElement('nextButton'), 'disabled');
296 MochiKit.DOM.addElementClass(this.getElement('smallNextButton'), 'disabled'); 293 MochiKit.DOM.addElementClass(this.getElement('smallNextButton'), 'disabled');
297 } 294 }
298 }, 295 },
299 296
300 //'disableNext': function () { 297 //'disableNext': function () {
301 // MochiKit.DOM.addElementClass(this.getElement('nextButton'), 'disabled'); 298 // MochiKit.DOM.addElementClass(this.getElement('nextButton'), 'disabled');
302 //}, 299 //},
303 300
304 //------------------------------------------------------------------------- 301 //-------------------------------------------------------------------------
305 302
306 'cursorMoved': function () { 303 'cursorMoved': function () {
307 MochiKit.Style.setElementPosition(this.getElement('marker'), {x:this.markerStepOffset() * this.currentStep() + this.markerInitialOffset()}) 304 MochiKit.Style.setElementPosition(this.getElement('marker'), {x:this.markerStepOffset() * this.currentStep() + this.markerInitialOffset()})
308 MochiKit.Signal.signal(this, 'cursorMoved'); 305 MochiKit.Signal.signal(this, 'cursorMoved');
309 306
310 MochiKit.DOM.addElementClass(this.getElement('steps').childNodes[this.currentStep()], 'selected'); 307 MochiKit.DOM.addElementClass(this.getElement('steps').childNodes[this.currentStep()], 'selected');
311 MochiKit.DOM.addElementClass(this.getElement('dots').childNodes[this.currentStep()], 'selected'); 308 MochiKit.DOM.addElementClass(this.getElement('dots').childNodes[this.currentStep()], 'selected');
312 }, 309 },
313 310
314 //------------------------------------------------------------------------- 311 //-------------------------------------------------------------------------
315 312
316 'setDisplayMode': function (aValue) { 313 'setDisplayMode': function (aValue) {
317 MochiKit.DOM.removeElementClass(this.getElement('rulerWrapper'), 'fixed'); 314 MochiKit.DOM.removeElementClass(this.getElement('rulerWrapper'), 'fixed');
318 MochiKit.DOM.removeElementClass(this.getElement('rulerWrapper'), 'scrollable'); 315 MochiKit.DOM.removeElementClass(this.getElement('rulerWrapper'), 'scrollable');
319 MochiKit.DOM.addElementClass(this.getElement('rulerWrapper'), aValue); 316 MochiKit.DOM.addElementClass(this.getElement('rulerWrapper'), aValue);
320 }, 317 },
321 318
322 //------------------------------------------------------------------------- 319 //-------------------------------------------------------------------------
323 __syntaxFix__: "syntax fix" 320 __syntaxFix__: "syntax fix"
324}); 321});
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 39a1ccb..666afe9 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/TabSidePanel.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/TabSidePanel.js
@@ -1,193 +1,190 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 26Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
30 27
31Clipperz.PM.UI.Web.Components.TabSidePanel = function(args) { 28Clipperz.PM.UI.Web.Components.TabSidePanel = function(args) {
32 args = args || {}; 29 args = args || {};
33 Clipperz.PM.UI.Web.Components.TabSidePanel.superclass.constructor.call(this, args); 30 Clipperz.PM.UI.Web.Components.TabSidePanel.superclass.constructor.call(this, args);
34 31
35 this._element = args.element || null; 32 this._element = args.element || null;
36 33
37 this._slots = { 34 this._slots = {
38 }; 35 };
39 36
40 return this; 37 return this;
41} 38}
42 39
43//============================================================================= 40//=============================================================================
44 41
45Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.TabSidePanel, Clipperz.PM.UI.Common.Components.BaseComponent, { 42Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.TabSidePanel, Clipperz.PM.UI.Common.Components.BaseComponent, {
46 43
47 //------------------------------------------------------------------------- 44 //-------------------------------------------------------------------------
48 45
49 'toString': function () { 46 'toString': function () {
50 return "Clipperz.PM.UI.Web.Components.TabSidePanel component"; 47 return "Clipperz.PM.UI.Web.Components.TabSidePanel component";
51 }, 48 },
52 49
53 //------------------------------------------------------------------------- 50 //-------------------------------------------------------------------------
54 51
55 'deselectAllTabs': function() { 52 'deselectAllTabs': function() {
56 var tabListItems; 53 var tabListItems;
57 54
58 tabListItems = [ 55 tabListItems = [
59 'cardsLI', 56 'cardsLI',
60 // 'directLoginLI', 57 // 'directLoginLI',
61 'accountLI', 58 'accountLI',
62 'dataLI', 59 'dataLI',
63 'toolsLI' 60 'toolsLI'
64 ]; 61 ];
65 62
66//Clipperz.log("=== TabSidePanel.tabSelected anEvent.src().id", anEvent.src().id); 63//Clipperz.log("=== TabSidePanel.tabSelected anEvent.src().id", anEvent.src().id);
67 for (var i in tabListItems) { 64 for (var i in tabListItems) {
68//Clipperz.log("=== TabSidePanel.tabSelected aTabListItem", tabListItems[i]); 65//Clipperz.log("=== TabSidePanel.tabSelected aTabListItem", tabListItems[i]);
69 MochiKit.DOM.removeElementClass(this.getId(tabListItems[i]), 'selected'); 66 MochiKit.DOM.removeElementClass(this.getId(tabListItems[i]), 'selected');
70 } 67 }
71 }, 68 },
72 69
73 'selectTab': function(aTabName) { 70 'selectTab': function(aTabName) {
74 this.deselectAllTabs(); 71 this.deselectAllTabs();
75 MochiKit.DOM.addElementClass(this.getId(this.listItemIdForTabNamed(aTabName)), 'selected'); 72 MochiKit.DOM.addElementClass(this.getId(this.listItemIdForTabNamed(aTabName)), 'selected');
76 MochiKit.Signal.signal(this, 'tabSelected', aTabName); 73 MochiKit.Signal.signal(this, 'tabSelected', aTabName);
77 }, 74 },
78 75
79 'tabNameForAnchorId': function(anId) { 76 'tabNameForAnchorId': function(anId) {
80 var result; 77 var result;
81 78
82 switch(anId) { 79 switch(anId) {
83 case 'cards_tabSidePanel': 80 case 'cards_tabSidePanel':
84 result = 'cards'; 81 result = 'cards';
85 break; 82 break;
86 // case 'directLogins_tabSidePanel': 83 // case 'directLogins_tabSidePanel':
87 // result = 'directLogins'; 84 // result = 'directLogins';
88 // break; 85 // break;
89 case 'account_tabSidePanel': 86 case 'account_tabSidePanel':
90 result = 'account'; 87 result = 'account';
91 break; 88 break;
92 case 'data_tabSidePanel': 89 case 'data_tabSidePanel':
93 result = 'data'; 90 result = 'data';
94 break; 91 break;
95 case 'tools_tabSidePanel': 92 case 'tools_tabSidePanel':
96 result = 'tools'; 93 result = 'tools';
97 break; 94 break;
98 } 95 }
99 96
100 return result; 97 return result;
101 }, 98 },
102 99
103 'listItemIdForTabNamed': function(aTabName) { 100 'listItemIdForTabNamed': function(aTabName) {
104 var result; 101 var result;
105 102
106 switch (aTabName) { 103 switch (aTabName) {
107 case 'cards': 104 case 'cards':
108 result = 'cardsLI'; 105 result = 'cardsLI';
109 break; 106 break;
110 // case 'directLogins': 107 // case 'directLogins':
111 // result = 'directLoginLI'; 108 // result = 'directLoginLI';
112 // break; 109 // break;
113 case 'account': 110 case 'account':
114 result = 'accountLI'; 111 result = 'accountLI';
115 break; 112 break;
116 case 'data': 113 case 'data':
117 result = 'dataLI'; 114 result = 'dataLI';
118 break; 115 break;
119 case 'tools': 116 case 'tools':
120 result = 'toolsLI'; 117 result = 'toolsLI';
121 break; 118 break;
122 } 119 }
123 120
124 return result; 121 return result;
125 }, 122 },
126 123
127 'tabSelected': function (anEvent) { 124 'tabSelected': function (anEvent) {
128 this.selectTab(this.tabNameForAnchorId(anEvent.src().id)); 125 this.selectTab(this.tabNameForAnchorId(anEvent.src().id));
129 // anEvent.stop(); 126 // anEvent.stop();
130 anEvent.preventDefault(); 127 anEvent.preventDefault();
131 }, 128 },
132 129
133 //------------------------------------------------------------------------- 130 //-------------------------------------------------------------------------
134 131
135 'addCard': function (anEvent) { 132 'addCard': function (anEvent) {
136 anEvent.stop(); 133 anEvent.stop();
137 MochiKit.Signal.signal(this, 'addCard', anEvent.src()); 134 MochiKit.Signal.signal(this, 'addCard', anEvent.src());
138 }, 135 },
139 136
140 //------------------------------------------------------------------------- 137 //-------------------------------------------------------------------------
141 138
142 'renderSelf': function(/*aContainer, aPosition*/) { 139 'renderSelf': function(/*aContainer, aPosition*/) {
143 this.append(this.element(), [ 140 this.append(this.element(), [
144 {tag:'div', cls:'header'}, 141 {tag:'div', cls:'header'},
145 {tag:'div', cls:'body', children:[ 142 {tag:'div', cls:'body', children:[
146 {tag:'ul', cls:'mainTabs', children:[ 143 {tag:'ul', cls:'mainTabs', children:[
147 {tag:'li', id:this.getId('cardsLI'), cls:'cards', children:[ 144 {tag:'li', id:this.getId('cardsLI'), cls:'cards', children:[
148 {tag:'a', id:'cards_tabSidePanel', href:'#', html:"cards"}, 145 {tag:'a', id:'cards_tabSidePanel', href:'#', html:"cards"},
149 {tag:'div', cls:'selectionHighlighter', children:[ 146 {tag:'div', cls:'selectionHighlighter', children:[
150 {tag:'img', src:'./images/old/main/tabs/selectionHighligher.png'}, 147 {tag:'img', src:'./images/old/main/tabs/selectionHighligher.png'},
151 {tag:'a', id:this.getId('addCardA'), cls:'add', href:'#', children:[ 148 {tag:'a', id:this.getId('addCardA'), cls:'add', href:'#', children:[
152 {tag:'span', html:"add"}, 149 {tag:'span', html:"add"},
153 {tag:'h3', html:"+"} 150 {tag:'h3', html:"+"}
154 ]} 151 ]}
155 ]} 152 ]}
156 ]} 153 ]}
157 ]}, 154 ]},
158 {tag:'ul', cls:'otherTabs', children:[ 155 {tag:'ul', cls:'otherTabs', children:[
159 {tag:'li', id:this.getId('accountLI'), children:[ 156 {tag:'li', id:this.getId('accountLI'), children:[
160 {tag:'a', id:'account_tabSidePanel', href:'#', html:"account"}, 157 {tag:'a', id:'account_tabSidePanel', href:'#', html:"account"},
161 {tag:'div', cls:'selectionHighlighter', children:[ 158 {tag:'div', cls:'selectionHighlighter', children:[
162 {tag:'img', src:'./images/old/main/tabs/selectionHighligherGray.png'} 159 {tag:'img', src:'./images/old/main/tabs/selectionHighligherGray.png'}
163 ]} 160 ]}
164 ]}, 161 ]},
165 {tag:'li', id:this.getId('dataLI'), children:[ 162 {tag:'li', id:this.getId('dataLI'), children:[
166 {tag:'a', id:'data_tabSidePanel', href:'#', html:"data"}, 163 {tag:'a', id:'data_tabSidePanel', href:'#', html:"data"},
167 {tag:'div', cls:'selectionHighlighter', children:[ 164 {tag:'div', cls:'selectionHighlighter', children:[
168 {tag:'img', src:'./images/old/main/tabs/selectionHighligherGray.png'} 165 {tag:'img', src:'./images/old/main/tabs/selectionHighligherGray.png'}
169 ]} 166 ]}
170 ]}, 167 ]},
171 {tag:'li', id:this.getId('toolsLI'), children:[ 168 {tag:'li', id:this.getId('toolsLI'), children:[
172 {tag:'a', id:'tools_tabSidePanel', href:'#', html:"tools"}, 169 {tag:'a', id:'tools_tabSidePanel', href:'#', html:"tools"},
173 {tag:'div', cls:'selectionHighlighter', children:[ 170 {tag:'div', cls:'selectionHighlighter', children:[
174 {tag:'img', src:'./images/old/main/tabs/selectionHighligherGray.png'} 171 {tag:'img', src:'./images/old/main/tabs/selectionHighligherGray.png'}
175 ]} 172 ]}
176 ]} 173 ]}
177 ]} 174 ]}
178 ]}, 175 ]},
179 {tag:'div', cls:'footer'} 176 {tag:'div', cls:'footer'}
180 ]); 177 ]);
181 178
182 MochiKit.Signal.connect('cards_tabSidePanel', 'onclick', this, 'tabSelected'); 179 MochiKit.Signal.connect('cards_tabSidePanel', 'onclick', this, 'tabSelected');
183 // MochiKit.Signal.connect('directLogins_tabSidePanel', 'onclick', this, 'tabSelected'); 180 // MochiKit.Signal.connect('directLogins_tabSidePanel', 'onclick', this, 'tabSelected');
184 MochiKit.Signal.connect('account_tabSidePanel', 'onclick', this, 'tabSelected'); 181 MochiKit.Signal.connect('account_tabSidePanel', 'onclick', this, 'tabSelected');
185 MochiKit.Signal.connect('data_tabSidePanel', 'onclick', this, 'tabSelected'); 182 MochiKit.Signal.connect('data_tabSidePanel', 'onclick', this, 'tabSelected');
186 MochiKit.Signal.connect('tools_tabSidePanel', 'onclick', this, 'tabSelected'); 183 MochiKit.Signal.connect('tools_tabSidePanel', 'onclick', this, 'tabSelected');
187 MochiKit.Signal.connect(this.getId('addCardA'), 'onclick', this, 'addCard'); 184 MochiKit.Signal.connect(this.getId('addCardA'), 'onclick', this, 'addCard');
188 }, 185 },
189 186
190 //------------------------------------------------------------------------- 187 //-------------------------------------------------------------------------
191 188
192 __syntaxFix__: "syntax fix" 189 __syntaxFix__: "syntax fix"
193}); 190});
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 97e81b4..3dc9ce9 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/TextColumnManager.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/TextColumnManager.js
@@ -1,53 +1,50 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 26Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
30 27
31//############################################################################# 28//#############################################################################
32 29
33Clipperz.PM.UI.Web.Components.TextColumnManager = function(args) { 30Clipperz.PM.UI.Web.Components.TextColumnManager = function(args) {
34 args = args || {}; 31 args = args || {};
35 Clipperz.PM.UI.Web.Components.TextColumnManager.superclass.constructor.call(this, args); 32 Clipperz.PM.UI.Web.Components.TextColumnManager.superclass.constructor.call(this, args);
36 33
37 return this; 34 return this;
38} 35}
39 36
40//============================================================================= 37//=============================================================================
41 38
42Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.TextColumnManager, Clipperz.PM.UI.Web.Components.ColumnManager, { 39Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.TextColumnManager, Clipperz.PM.UI.Web.Components.ColumnManager, {
43 40
44 'toString': function () { 41 'toString': function () {
45 return "Clipperz.PM.UI.Web.Components.TextColumnManager component"; 42 return "Clipperz.PM.UI.Web.Components.TextColumnManager component";
46 }, 43 },
47 44
48 //----------------------------------------------------- 45 //-----------------------------------------------------
49 46
50 '__syntax_fix__' : 'syntax fix' 47 '__syntax_fix__' : 'syntax fix'
51 48
52}); 49});
53 50
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 179c495..3ee6189 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/ToolsPanel.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/ToolsPanel.js
@@ -1,113 +1,110 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 26Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
30 27
31Clipperz.PM.UI.Web.Components.ToolsPanel = function(args) { 28Clipperz.PM.UI.Web.Components.ToolsPanel = function(args) {
32 args = args || {}; 29 args = args || {};
33 30
34 Clipperz.PM.UI.Web.Components.ToolsPanel.superclass.constructor.apply(this, arguments); 31 Clipperz.PM.UI.Web.Components.ToolsPanel.superclass.constructor.apply(this, arguments);
35 32
36 this._initiallySelectedTab = args.selected || 'PASSWORD_GENERATOR'; 33 this._initiallySelectedTab = args.selected || 'PASSWORD_GENERATOR';
37 this._tabPanelControllerConfiguration = { 34 this._tabPanelControllerConfiguration = {
38 'PASSWORD_GENERATOR': { 35 'PASSWORD_GENERATOR': {
39 tab:'passwordGeneratorTab', 36 tab:'passwordGeneratorTab',
40 panel:'passwordGeneratorPanel' 37 panel:'passwordGeneratorPanel'
41 }, 38 },
42 'BOOKMARKLET': { 39 'BOOKMARKLET': {
43 tab:'bookmarkletTab', 40 tab:'bookmarkletTab',
44 panel:'bookmarkletPanel' 41 panel:'bookmarkletPanel'
45 }, 42 },
46 'COMPACT_EDITION': { 43 'COMPACT_EDITION': {
47 tab:'compactEditionTab', 44 tab:'compactEditionTab',
48 panel:'compactEditionPanel' 45 panel:'compactEditionPanel'
49 }, 46 },
50 'HTTP_AUTH': { 47 'HTTP_AUTH': {
51 tab:'httpAuthTab', 48 tab:'httpAuthTab',
52 panel:'httpAuthPanel' 49 panel:'httpAuthPanel'
53 } 50 }
54 }; 51 };
55 52
56 return this; 53 return this;
57} 54}
58 55
59//============================================================================= 56//=============================================================================
60 57
61Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.ToolsPanel, Clipperz.PM.UI.Common.Components.TabPanelComponent, { 58Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.ToolsPanel, Clipperz.PM.UI.Common.Components.TabPanelComponent, {
62 59
63 //------------------------------------------------------------------------- 60 //-------------------------------------------------------------------------
64 61
65 'toString': function () { 62 'toString': function () {
66 return "Clipperz.PM.UI.Web.Components.ToolsPanel component"; 63 return "Clipperz.PM.UI.Web.Components.ToolsPanel component";
67 }, 64 },
68 65
69 //------------------------------------------------------------------------- 66 //-------------------------------------------------------------------------
70 67
71 'renderSelf': function(/*aContainer, aPosition*/) { 68 'renderSelf': function(/*aContainer, aPosition*/) {
72 this.append(this.element(), [ 69 this.append(this.element(), [
73 {tag:'div', cls:'header', children:[ 70 {tag:'div', cls:'header', children:[
74 {tag:'div', cls:'subPanelTabs', children:[ 71 {tag:'div', cls:'subPanelTabs', children:[
75 {tag:'ul', children:[ 72 {tag:'ul', children:[
76 {tag:'li', id:this.getId('passwordGeneratorTab'),children:[{tag:'a', href:'#', html:'Password generator'}], cls:'first'}, 73 {tag:'li', id:this.getId('passwordGeneratorTab'),children:[{tag:'a', href:'#', html:'Password generator'}], cls:'first'},
77 {tag:'li', id:this.getId('bookmarkletTab'), children:[{tag:'a', href:'#', html:'Bookmarklet'}]}, 74 {tag:'li', id:this.getId('bookmarkletTab'), children:[{tag:'a', href:'#', html:'Bookmarklet'}]},
78 {tag:'li', id:this.getId('compactEditionTab'), children:[{tag:'a', href:'#', html:'Compact edition'}]}, 75 {tag:'li', id:this.getId('compactEditionTab'), children:[{tag:'a', href:'#', html:'Compact edition'}]},
79 {tag:'li', id:this.getId('httpAuthTab'), children:[{tag:'a', href:'#', html:'HTTP Auth'}]} 76 {tag:'li', id:this.getId('httpAuthTab'), children:[{tag:'a', href:'#', html:'HTTP Auth'}]}
80 ]} 77 ]}
81 ]} 78 ]}
82 ]}, 79 ]},
83 {tag:'div', cls:'body', children:[ 80 {tag:'div', cls:'body', children:[
84 {tag:'div', cls:'accountPanel', children:[ 81 {tag:'div', cls:'accountPanel', children:[
85 {tag:'div', cls:'subPanelContent', children:[ 82 {tag:'div', cls:'subPanelContent', children:[
86 {tag:'ul', children:[ 83 {tag:'ul', children:[
87 {tag:'li', id:this.getId('passwordGeneratorPanel'),children:[ 84 {tag:'li', id:this.getId('passwordGeneratorPanel'),children:[
88 {tag:'h3', html:"Password generator"} 85 {tag:'h3', html:"Password generator"}
89 ]}, 86 ]},
90 {tag:'li', id:this.getId('bookmarkletPanel'),children:[ 87 {tag:'li', id:this.getId('bookmarkletPanel'),children:[
91 {tag:'h3', html:"Bookmarklet"} 88 {tag:'h3', html:"Bookmarklet"}
92 ]}, 89 ]},
93 {tag:'li', id:this.getId('compactEditionPanel'), children:[ 90 {tag:'li', id:this.getId('compactEditionPanel'), children:[
94 {tag:'h3', html:"Compact edition"} 91 {tag:'h3', html:"Compact edition"}
95 ]}, 92 ]},
96 {tag:'li', id:this.getId('httpAuthPanel'), children:[ 93 {tag:'li', id:this.getId('httpAuthPanel'), children:[
97 {tag:'h3', html:"HTTP Auth"} 94 {tag:'h3', html:"HTTP Auth"}
98 ]} 95 ]}
99 ]} 96 ]}
100 ]} 97 ]}
101 ]} 98 ]}
102 ]}, 99 ]},
103 {tag:'div', cls:'footer'} 100 {tag:'div', cls:'footer'}
104 ]); 101 ]);
105 102
106 this.tabPanelController().setup({selected:this.initiallySelectedTab()}); 103 this.tabPanelController().setup({selected:this.initiallySelectedTab()});
107 }, 104 },
108 105
109 //------------------------------------------------------------------------- 106 //-------------------------------------------------------------------------
110 107
111 108
112 __syntaxFix__: "syntax fix" 109 __syntaxFix__: "syntax fix"
113}); 110});
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 5b9d522..21ccf2a 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/UnlockPasswordComponent.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/UnlockPasswordComponent.js
@@ -1,184 +1,181 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 26Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
30 27
31Clipperz.PM.UI.Web.Components.UnlockPasswordComponent = function(args) { 28Clipperz.PM.UI.Web.Components.UnlockPasswordComponent = function(args) {
32 args = args || {}; 29 args = args || {};
33 30
34 Clipperz.PM.UI.Web.Components.UnlockPasswordComponent.superclass.constructor.apply(this, arguments); 31 Clipperz.PM.UI.Web.Components.UnlockPasswordComponent.superclass.constructor.apply(this, arguments);
35 32
36 this._openFromElement = args.openFromElement || null; 33 this._openFromElement = args.openFromElement || null;
37 this._onOkCloseToElement = args.onOkCloseToElement || null; 34 this._onOkCloseToElement = args.onOkCloseToElement || null;
38 this._onCancelCloseToElement = args.onCancelCloseToElement|| null; 35 this._onCancelCloseToElement = args.onCancelCloseToElement|| null;
39 36
40 this._progressBarComponent = null; 37 this._progressBarComponent = null;
41 38
42 return this; 39 return this;
43} 40}
44 41
45//============================================================================= 42//=============================================================================
46 43
47Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.UnlockPasswordComponent, Clipperz.PM.UI.Common.Components.SimpleMessagePanel, { 44Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.UnlockPasswordComponent, Clipperz.PM.UI.Common.Components.SimpleMessagePanel, {
48 45
49 //------------------------------------------------------------------------- 46 //-------------------------------------------------------------------------
50 47
51 'toString': function () { 48 'toString': function () {
52 return "Clipperz.PM.UI.Web.Components.UnlockPasswordComponent component"; 49 return "Clipperz.PM.UI.Web.Components.UnlockPasswordComponent component";
53 }, 50 },
54 51
55 //------------------------------------------------------------------------- 52 //-------------------------------------------------------------------------
56 53
57 'getPassphrase': function () { 54 'getPassphrase': function () {
58 /* var deferredResult; 55 /* var deferredResult;
59 56
60 if (this.passphrase() == null) { 57 if (this.passphrase() == null) {
61 this.deferredShowModal({'openFromElement': this.openFromElement()}); 58 this.deferredShowModal({'openFromElement': this.openFromElement()});
62 deferredResult = this.deferred(); 59 deferredResult = this.deferred();
63 } else { 60 } else {
64 deferredResult = MochiKit.Async.succeed(this.passphrase()); 61 deferredResult = MochiKit.Async.succeed(this.passphrase());
65 } 62 }
66 63
67 return deferredResult; 64 return deferredResult;
68*/ 65*/
69 66
70 this.deferredShowModal({'openFromElement': this.openFromElement()}); 67 this.deferredShowModal({'openFromElement': this.openFromElement()});
71 68
72 return this.deferred(); 69 return this.deferred();
73 }, 70 },
74 71
75 //------------------------------------------------------------------------- 72 //-------------------------------------------------------------------------
76 73
77 'deferredShowModal': function (someParameters) { 74 'deferredShowModal': function (someParameters) {
78 return Clipperz.Async.callbacks("UnlockPasswordComponent.deferredShowModal", [ 75 return Clipperz.Async.callbacks("UnlockPasswordComponent.deferredShowModal", [
79 MochiKit.Base.bind(Clipperz.PM.UI.Web.Components.UnlockPasswordComponent.superclass.deferredShowModal, this, someParameters), 76 MochiKit.Base.bind(Clipperz.PM.UI.Web.Components.UnlockPasswordComponent.superclass.deferredShowModal, this, someParameters),
80 MochiKit.Base.method(this, 'getElement', 'passphrase'), 77 MochiKit.Base.method(this, 'getElement', 'passphrase'),
81 MochiKit.Base.methodcaller('focus') 78 MochiKit.Base.methodcaller('focus')
82 ], {trace:false}) 79 ], {trace:false})
83 }, 80 },
84 81
85 //------------------------------------------------------------------------- 82 //-------------------------------------------------------------------------
86 83
87 'openFromElement': function () { 84 'openFromElement': function () {
88 return this._openFromElement; 85 return this._openFromElement;
89 }, 86 },
90 87
91 'onOkCloseToElement': function () { 88 'onOkCloseToElement': function () {
92 return this._onOkCloseToElement; 89 return this._onOkCloseToElement;
93 }, 90 },
94 91
95 'onCancelCloseToElement': function () { 92 'onCancelCloseToElement': function () {
96 return this._onCancelCloseToElement; 93 return this._onCancelCloseToElement;
97 }, 94 },
98 95
99 //------------------------------------------------------------------------- 96 //-------------------------------------------------------------------------
100 97
101 'renderSelf': function() { 98 'renderSelf': function() {
102 Clipperz.PM.UI.Web.Components.UnlockPasswordComponent.superclass.renderSelf.apply(this, arguments); 99 Clipperz.PM.UI.Web.Components.UnlockPasswordComponent.superclass.renderSelf.apply(this, arguments);
103 100
104 this.append(this.getElement('container'), {tag:'div', cls:'passphrase', children: [ 101 this.append(this.getElement('container'), {tag:'div', cls:'passphrase', children: [
105 // {tag:'form', id:this.getId('passphraseForm'), children:[ 102 // {tag:'form', id:this.getId('passphraseForm'), children:[
106 {tag:'input', id:this.getId('passphrase'), type:'password', name:'passphrase', value:''} 103 {tag:'input', id:this.getId('passphrase'), type:'password', name:'passphrase', value:''}
107 // ]} 104 // ]}
108 ]}); 105 ]});
109 106
110 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'userSuccessfullyLoggedIn', this, 'userSuccessfullyLoggedInHandler'); 107 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'userSuccessfullyLoggedIn', this, 'userSuccessfullyLoggedInHandler');
111 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'userLoginFailed', this, 'userLoginFailedHandler'); 108 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'userLoginFailed', this, 'userLoginFailedHandler');
112 109
113 110
114 // MochiKit.Async.callLater(0.1, MochiKit.Base.method(this.getElement('passphrase'), 'focus')); 111 // MochiKit.Async.callLater(0.1, MochiKit.Base.method(this.getElement('passphrase'), 'focus'));
115 // this.getElement('passphrase').select(); 112 // this.getElement('passphrase').select();
116 }, 113 },
117 114
118 //------------------------------------------------------------------------- 115 //-------------------------------------------------------------------------
119 116
120 'showProgressBar': function () { 117 'showProgressBar': function () {
121 varprogressBarElement; 118 varprogressBarElement;
122 119
123 this.getElement('container').innerHTML = ''; 120 this.getElement('container').innerHTML = '';
124 121
125 progressBarElement = this.append(this.getElement('container'), {tag:'div', cls:'progressBarWrapper'}); 122 progressBarElement = this.append(this.getElement('container'), {tag:'div', cls:'progressBarWrapper'});
126 this.addComponent(new Clipperz.PM.UI.Common.Components.ProgressBar({'element':progressBarElement})); 123 this.addComponent(new Clipperz.PM.UI.Common.Components.ProgressBar({'element':progressBarElement}));
127 124
128 this.setButtons([{text:"Cancel", result:'CANCEL'}]); 125 this.setButtons([{text:"Cancel", result:'CANCEL'}]);
129 }, 126 },
130 127
131 //------------------------------------------------------------------------- 128 //-------------------------------------------------------------------------
132 129
133 'showFailure': function () { 130 'showFailure': function () {
134 this.setType('ALERT'); 131 this.setType('ALERT');
135 this.setTitle("Login failed"); 132 this.setTitle("Login failed");
136 this.setText("Wrong passphrase; the unlock has failed."); 133 this.setText("Wrong passphrase; the unlock has failed.");
137 this.getElement('container').innerHTML = ''; 134 this.getElement('container').innerHTML = '';
138 this.setButtons([{text:"Close", result:'CANCEL', isDefault:true}]); 135 this.setButtons([{text:"Close", result:'CANCEL', isDefault:true}]);
139 }, 136 },
140 137
141 //------------------------------------------------------------------------- 138 //-------------------------------------------------------------------------
142 139
143 'closeOk': function () { 140 'closeOk': function () {
144 var passphrase; 141 var passphrase;
145 142
146 passphrase = this.getElement('passphrase').value; 143 passphrase = this.getElement('passphrase').value;
147 this.showProgressBar(); 144 this.showProgressBar();
148 // this.deferred().callback(passphrase); 145 // this.deferred().callback(passphrase);
149 MochiKit.Async.callLater(0.5, MochiKit.Base.method(this.deferred(), 'callback', passphrase)); 146 MochiKit.Async.callLater(0.5, MochiKit.Base.method(this.deferred(), 'callback', passphrase));
150 this._deferred = null; 147 this._deferred = null;
151 }, 148 },
152 149
153 'closeCancel': function () { 150 'closeCancel': function () {
154 this.deferredHideModal({closeToElement:this.onCancelCloseToElement()}); 151 this.deferredHideModal({closeToElement:this.onCancelCloseToElement()});
155 this.deferred().cancel(); 152 this.deferred().cancel();
156 this._deferred = null; 153 this._deferred = null;
157 }, 154 },
158 155
159 //------------------------------------------------------------------------- 156 //-------------------------------------------------------------------------
160 157
161 'userSuccessfullyLoggedInHandler': function (anEvent) { 158 'userSuccessfullyLoggedInHandler': function (anEvent) {
162 this.deferredHideModal({closeToElement:this.onOkCloseToElement()}); 159 this.deferredHideModal({closeToElement:this.onOkCloseToElement()});
163 }, 160 },
164 161
165 'userLoginFailedHandler': function (anEvent) { 162 'userLoginFailedHandler': function (anEvent) {
166//console.log("############### FAILED LOGIN ################"); 163//console.log("############### FAILED LOGIN ################");
167 this.showFailure(); 164 this.showFailure();
168 }, 165 },
169 166
170 //------------------------------------------------------------------------- 167 //-------------------------------------------------------------------------
171/* 168/*
172 'deferredShow': function (someArgs, aResult) { 169 'deferredShow': function (someArgs, aResult) {
173 this.deferredShowModal(someArgs); 170 this.deferredShowModal(someArgs);
174 171
175 // this.deferred().addMethod(this, 'deferredHideModal', {closeToElement:someArgs.onOkCloseToElement }); 172 // this.deferred().addMethod(this, 'deferredHideModal', {closeToElement:someArgs.onOkCloseToElement });
176 // this.deferred().addErrback (MochiKit.Base.method(this, 'deferredHideModal', {closeToElement:someArgs.onCancelCloseToElement })); 173 // this.deferred().addErrback (MochiKit.Base.method(this, 'deferredHideModal', {closeToElement:someArgs.onCancelCloseToElement }));
177 // this.deferred().addCallback(MochiKit.Async.succeed, aResult); 174 // this.deferred().addCallback(MochiKit.Async.succeed, aResult);
178 175
179 return this.deferred(); 176 return this.deferred();
180 }, 177 },
181*/ 178*/
182 //------------------------------------------------------------------------- 179 //-------------------------------------------------------------------------
183 __syntaxFix__: "syntax fix" 180 __syntaxFix__: "syntax fix"
184}); 181});
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 f26118e..d699dc6 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/UserInfoBox.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/UserInfoBox.js
@@ -1,346 +1,343 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 26Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
30 27
31Clipperz.PM.UI.Web.Components.UserInfoBox = function(args) { 28Clipperz.PM.UI.Web.Components.UserInfoBox = function(args) {
32 args = args || {}; 29 args = args || {};
33 30
34 Clipperz.PM.UI.Web.Components.UserInfoBox.superclass.constructor.apply(this, arguments); 31 Clipperz.PM.UI.Web.Components.UserInfoBox.superclass.constructor.apply(this, arguments);
35 32
36 this._slots = {}; 33 this._slots = {};
37 this._isLocked = false; 34 this._isLocked = false;
38 this._lockTooltip = null; 35 this._lockTooltip = null;
39 36
40 return this; 37 return this;
41} 38}
42 39
43//============================================================================= 40//=============================================================================
44 41
45Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.UserInfoBox, Clipperz.PM.UI.Common.Components.BaseComponent, { 42Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.UserInfoBox, Clipperz.PM.UI.Common.Components.BaseComponent, {
46 43
47 //------------------------------------------------------------------------- 44 //-------------------------------------------------------------------------
48 45
49 'toString': function () { 46 'toString': function () {
50 return "Clipperz.PM.UI.Web.Components.UserInfoBox component"; 47 return "Clipperz.PM.UI.Web.Components.UserInfoBox component";
51 }, 48 },
52 49
53 //------------------------------------------------------------------------- 50 //-------------------------------------------------------------------------
54 51
55 'handleLogout': function(anEvent) { 52 'handleLogout': function(anEvent) {
56//Clipperz.log(">>> UserInfoBox.handleLogout"); 53//Clipperz.log(">>> UserInfoBox.handleLogout");
57 anEvent.preventDefault(); 54 anEvent.preventDefault();
58 MochiKit.Signal.signal(this, 'logout'); 55 MochiKit.Signal.signal(this, 'logout');
59//Clipperz.log("<<< UserInfoBox.handleLogout"); 56//Clipperz.log("<<< UserInfoBox.handleLogout");
60 }, 57 },
61 58
62 //------------------------------------------------------------------------- 59 //-------------------------------------------------------------------------
63 60
64 'lockTooltip': function () { 61 'lockTooltip': function () {
65 return this._lockTooltip; 62 return this._lockTooltip;
66 }, 63 },
67 64
68 //------------------------------------------------------------------------- 65 //-------------------------------------------------------------------------
69 66
70 'isLocked': function () { 67 'isLocked': function () {
71 return this._isLocked; 68 return this._isLocked;
72 }, 69 },
73 70
74 'setIsLocked': function (aValue) { 71 'setIsLocked': function (aValue) {
75 this._isLocked = aValue; 72 this._isLocked = aValue;
76 }, 73 },
77 74
78 'toggleLock': function(anEvent) { 75 'toggleLock': function(anEvent) {
79 var deferredResult; 76 var deferredResult;
80 var shouldLock; 77 var shouldLock;
81 78
82//console.log(">>> UserInfoBox.toggleLock [locked: " + this.isLocked() + "]"); 79//console.log(">>> UserInfoBox.toggleLock [locked: " + this.isLocked() + "]");
83 anEvent.preventDefault(); 80 anEvent.preventDefault();
84 this.lockTooltip().hide(); 81 this.lockTooltip().hide();
85 82
86 shouldLock = (this.isLocked() == false); 83 shouldLock = (this.isLocked() == false);
87 84
88 if (shouldLock) { 85 if (shouldLock) {
89 var maskElement; 86 var maskElement;
90 87
91 this.setIsLocked(true); 88 this.setIsLocked(true);
92 maskElement = this.getId('modalDialogMask'); 89 maskElement = this.getId('modalDialogMask');
93 deferredResult = Clipperz.Async.callbacks("UserInfoBox.toggleLock [lock]", [ 90 deferredResult = Clipperz.Async.callbacks("UserInfoBox.toggleLock [lock]", [
94 MochiKit.Base.partial(MochiKit.DOM.addElementClass, this.element(), 'locked'), 91 MochiKit.Base.partial(MochiKit.DOM.addElementClass, this.element(), 'locked'),
95 MochiKit.Base.partial(Clipperz.Visual.deferredAnimation, MochiKit.Visual.appear, maskElement, {from:0.0, to:0.75, duration:0.5}), 92 MochiKit.Base.partial(Clipperz.Visual.deferredAnimation, MochiKit.Visual.appear, maskElement, {from:0.0, to:0.75, duration:0.5}),
96 MochiKit.Base.method(Clipperz.PM.RunTime.mainController, 'setPassphraseDelegate', MochiKit.Base.method(this, 'askForPassphrase')), 93 MochiKit.Base.method(Clipperz.PM.RunTime.mainController, 'setPassphraseDelegate', MochiKit.Base.method(this, 'askForPassphrase')),
97 MochiKit.Base.partial(MochiKit.Signal.signal, this, 'lock') 94 MochiKit.Base.partial(MochiKit.Signal.signal, this, 'lock')
98 ], {trace:false}); 95 ], {trace:false});
99 } else { 96 } else {
100 deferredResult = Clipperz.Async.callbacks("UserInfoBox.toggleLock [unlock]", [ 97 deferredResult = Clipperz.Async.callbacks("UserInfoBox.toggleLock [unlock]", [
101 MochiKit.Base.partial(MochiKit.Signal.signal, this, 'unlock') 98 MochiKit.Base.partial(MochiKit.Signal.signal, this, 'unlock')
102 ], {trace:false}); 99 ], {trace:false});
103 } 100 }
104//console.log("<<< UserInfoBox.toggleLock"); 101//console.log("<<< UserInfoBox.toggleLock");
105 102
106 return deferredResult; 103 return deferredResult;
107 }, 104 },
108 105
109 //------------------------------------------------------------------------- 106 //-------------------------------------------------------------------------
110 107
111 'unlock': function () { 108 'unlock': function () {
112 var deferredResult; 109 var deferredResult;
113 var maskElement; 110 var maskElement;
114 111
115 this.setIsLocked(false); 112 this.setIsLocked(false);
116 maskElement = this.getId('modalDialogMask'); 113 maskElement = this.getId('modalDialogMask');
117 114
118 deferredResult = Clipperz.Async.callbacks("UserInfoBox.unlock", [ 115 deferredResult = Clipperz.Async.callbacks("UserInfoBox.unlock", [
119 MochiKit.Base.partial(Clipperz.Visual.deferredAnimation, MochiKit.Visual.fade, maskElement, {from:0.75, to:0.0, duration:0.5}), 116 MochiKit.Base.partial(Clipperz.Visual.deferredAnimation, MochiKit.Visual.fade, maskElement, {from:0.75, to:0.0, duration:0.5}),
120 // 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}),
121 MochiKit.Base.partial(MochiKit.DOM.removeElementClass, this.element(), 'locked') 118 MochiKit.Base.partial(MochiKit.DOM.removeElementClass, this.element(), 'locked')
122 ], {trace:false}); 119 ], {trace:false});
123 }, 120 },
124 121
125 //------------------------------------------------------------------------- 122 //-------------------------------------------------------------------------
126 123
127 'askForPassphrase': function () { 124 'askForPassphrase': function () {
128 varunlockPasswordComponent; 125 varunlockPasswordComponent;
129/* 126/*
130 vardeferredResult; 127 vardeferredResult;
131 128
132 deferredResult = new Clipperz.Async.Deferred("UserInfoBox.askForPassphrase", {trace:false}); 129 deferredResult = new Clipperz.Async.Deferred("UserInfoBox.askForPassphrase", {trace:false});
133 deferredResult.addCallback(MochiKit.Async.succeed, 'test'); 130 deferredResult.addCallback(MochiKit.Async.succeed, 'test');
134 131
135 deferredResult.callback(); 132 deferredResult.callback();
136 133
137 return deferredResult; 134 return deferredResult;
138*/ 135*/
139//console.log(">>> UserInfoBox.askForPassphrase"); 136//console.log(">>> UserInfoBox.askForPassphrase");
140 unlockPasswordComponent = new Clipperz.PM.UI.Web.Components.UnlockPasswordComponent({ 137 unlockPasswordComponent = new Clipperz.PM.UI.Web.Components.UnlockPasswordComponent({
141 'title':"Unlock account", 138 'title':"Unlock account",
142 'text': "Insert the passprase to unlock the account", 139 'text': "Insert the passprase to unlock the account",
143 'type': 'INFO', 140 'type': 'INFO',
144 'buttons': [ 141 'buttons': [
145 {text:"Cancel",result:'CANCEL'}, 142 {text:"Cancel",result:'CANCEL'},
146 {text:"Unlock", result:'OK',isDefault:true} 143 {text:"Unlock", result:'OK',isDefault:true}
147 ], 144 ],
148 'openFromElement': this.getElement('lock'), 145 'openFromElement': this.getElement('lock'),
149 'onOkCloseToElement': null, 146 'onOkCloseToElement': null,
150 'onCancelCloseToElement':this.getId('lock') 147 'onCancelCloseToElement':this.getId('lock')
151 }); 148 });
152//console.log("<<< UserInfoBox.askForPassphrase"); 149//console.log("<<< UserInfoBox.askForPassphrase");
153 150
154 return unlockPasswordComponent.getPassphrase(); 151 return unlockPasswordComponent.getPassphrase();
155 }, 152 },
156 153
157 //========================================================================= 154 //=========================================================================
158 155
159 'renderSelf': function(/*aContainer, aPosition*/) { 156 'renderSelf': function(/*aContainer, aPosition*/) {
160 this.append(this.element(), [ 157 this.append(this.element(), [
161 // {tag:'canvas', id:this.getId('canvas'), cls:'canvas', width:'188', height:'154'}, 158 // {tag:'canvas', id:this.getId('canvas'), cls:'canvas', width:'188', height:'154'},
162 {tag:'div', cls:'header', children:[ 159 {tag:'div', cls:'header', children:[
163 {tag:'h1', html:"Welcome"}, 160 {tag:'h1', html:"Welcome"},
164 {tag:'a', cls:'lockButton', href:'#', id:this.getId('lock'), html:'&nbsp;'} 161 {tag:'a', cls:'lockButton', href:'#', id:this.getId('lock'), html:'&nbsp;'}
165 ]}, 162 ]},
166 {tag:'div', cls:'body', children:[ 163 {tag:'div', cls:'body', children:[
167 {tag:'h3', id:this.getId('username'), html:""}, 164 {tag:'h3', id:this.getId('username'), html:""},
168 {tag:'ul', children:[ 165 {tag:'ul', children:[
169 {tag:'li', id:this.getId('cards'), children:[ 166 {tag:'li', id:this.getId('cards'), children:[
170 {tag:'span', id:this.getId('cardsNumber'), cls:'number', html:"-"}, 167 {tag:'span', id:this.getId('cardsNumber'), cls:'number', html:"-"},
171 {tag:'span', id:this.getId('cardsLabel'), html:"cards"} 168 {tag:'span', id:this.getId('cardsLabel'), html:"cards"}
172 ]}, 169 ]},
173 {tag:'li', id:this.getId('directLogins'), children:[ 170 {tag:'li', id:this.getId('directLogins'), children:[
174 {tag:'span', id:this.getId('directLoginsNumber'), cls:'number', html:"-"}, 171 {tag:'span', id:this.getId('directLoginsNumber'), cls:'number', html:"-"},
175 {tag:'span', id:this.getId('directLoginsLabel'), html:"direct logins"} 172 {tag:'span', id:this.getId('directLoginsLabel'), html:"direct logins"}
176 ]} 173 ]}
177 ]}, 174 ]},
178 {tag:'a', href:'#', id:this.getId('logout'), html:"logout >"} 175 {tag:'a', href:'#', id:this.getId('logout'), html:"logout >"}
179 ]}, 176 ]},
180 {tag:'div', cls:'footer'} 177 {tag:'div', cls:'footer'}
181 ]); 178 ]);
182 179
183 MochiKit.Signal.connect(this.getElement('logout'), 'onclick', this, 'handleLogout'); 180 MochiKit.Signal.connect(this.getElement('logout'), 'onclick', this, 'handleLogout');
184 MochiKit.Signal.connect(this.getElement('lock'), 'onclick', this, 'toggleLock'); 181 MochiKit.Signal.connect(this.getElement('lock'), 'onclick', this, 'toggleLock');
185 182
186 this._lockTooltip = new Clipperz.PM.UI.Common.Components.Tooltip({ 183 this._lockTooltip = new Clipperz.PM.UI.Common.Components.Tooltip({
187 element:this.getElement('lock'), 184 element:this.getElement('lock'),
188 text: "Click here to lock/unlock your account.", 185 text: "Click here to lock/unlock your account.",
189 position:'RIGHT' 186 position:'RIGHT'
190 }); 187 });
191 188
192 Clipperz.DOM.Helper.append(MochiKit.DOM.currentDocument().body, 189 Clipperz.DOM.Helper.append(MochiKit.DOM.currentDocument().body,
193 {tag:'div', id:this.getId('modalDialogWrapper'), cls:'modalDialogWrapper', children:[ 190 {tag:'div', id:this.getId('modalDialogWrapper'), cls:'modalDialogWrapper', children:[
194 {tag:'div', id:this.getId('modalDialogMask'), cls:'modalDialogMask userInfoBoxMask'} 191 {tag:'div', id:this.getId('modalDialogMask'), cls:'modalDialogMask userInfoBoxMask'}
195 ]} 192 ]}
196 ); 193 );
197 MochiKit.Style.hideElement(this.getId('modalDialogMask')); 194 MochiKit.Style.hideElement(this.getId('modalDialogMask'));
198 195
199 // this.drawUserInfoBackground(this.getElement('canvas')); 196 // this.drawUserInfoBackground(this.getElement('canvas'));
200 }, 197 },
201 198
202 //------------------------------------------------------------------------- 199 //-------------------------------------------------------------------------
203/* 200/*
204 'drawUserInfoBackground': function (canvas) { 201 'drawUserInfoBackground': function (canvas) {
205 var kMyDrawingFunctionWidth = 188.0; 202 var kMyDrawingFunctionWidth = 188.0;
206 var kMyDrawingFunctionHeight = 154.0; 203 var kMyDrawingFunctionHeight = 154.0;
207 204
208 var context = canvas.getContext("2d"); 205 var context = canvas.getContext("2d");
209 var color; 206 var color;
210 var resolution; 207 var resolution;
211 var alignStroke; 208 var alignStroke;
212 var path; 209 var path;
213 var pointX; 210 var pointX;
214 var pointY; 211 var pointY;
215 var controlPoint1X; 212 var controlPoint1X;
216 var controlPoint1Y; 213 var controlPoint1Y;
217 var controlPoint2X; 214 var controlPoint2X;
218 var controlPoint2Y; 215 var controlPoint2Y;
219 var gradient; 216 var gradient;
220 if (window.devicePixelRatio) 217 if (window.devicePixelRatio)
221 resolution = window.devicePixelRatio; 218 resolution = window.devicePixelRatio;
222 else 219 else
223 resolution = 1.0; 220 resolution = 1.0;
224 resolution *= 0.5 * (canvas.width / kMyDrawingFunctionWidth + canvas.height / kMyDrawingFunctionHeight); 221 resolution *= 0.5 * (canvas.width / kMyDrawingFunctionWidth + canvas.height / kMyDrawingFunctionHeight);
225 222
226 context.save(); 223 context.save();
227 context.scale(canvas.width / kMyDrawingFunctionWidth, canvas.height / kMyDrawingFunctionHeight); 224 context.scale(canvas.width / kMyDrawingFunctionWidth, canvas.height / kMyDrawingFunctionHeight);
228 context.clearRect(0.0, 0.0, kMyDrawingFunctionWidth, kMyDrawingFunctionHeight); 225 context.clearRect(0.0, 0.0, kMyDrawingFunctionWidth, kMyDrawingFunctionHeight);
229 226
230 // Setup for Shadow Effect 227 // Setup for Shadow Effect
231 color = "rgba(0.0%, 0.0%, 0.0%, 0.667)"; 228 color = "rgba(0.0%, 0.0%, 0.0%, 0.667)";
232 context.save(); 229 context.save();
233 context.shadowColor = color; 230 context.shadowColor = color;
234 context.shadowBlur = 3.0; 231 context.shadowBlur = 3.0;
235 context.shadowOffsetX = 5.729 * Math.cos(7.592) * resolution; 232 context.shadowOffsetX = 5.729 * Math.cos(7.592) * resolution;
236 context.shadowOffsetY = 5.729 * Math.sin(7.592) * resolution; 233 context.shadowOffsetY = 5.729 * Math.sin(7.592) * resolution;
237 234
238 // Layer 1 235 // Layer 1
239 236
240 alignStroke = 0.0; 237 alignStroke = 0.0;
241 context.beginPath(); 238 context.beginPath();
242 pointX = 169.5; 239 pointX = 169.5;
243 pointY = 141.5; 240 pointY = 141.5;
244 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 241 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
245 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 242 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
246 context.moveTo(pointX, pointY); 243 context.moveTo(pointX, pointY);
247 pointX = 177.5; 244 pointX = 177.5;
248 pointY = 133.5; 245 pointY = 133.5;
249 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 246 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
250 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 247 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
251 controlPoint1X = 173.889; 248 controlPoint1X = 173.889;
252 controlPoint1Y = 141.5; 249 controlPoint1Y = 141.5;
253 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 250 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
254 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 251 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
255 controlPoint2X = 177.5; 252 controlPoint2X = 177.5;
256 controlPoint2Y = 137.889; 253 controlPoint2Y = 137.889;
257 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 254 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
258 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 255 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
259 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 256 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
260 pointX = 177.5; 257 pointX = 177.5;
261 pointY = 19.5; 258 pointY = 19.5;
262 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 259 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
263 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 260 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
264 context.lineTo(pointX, pointY); 261 context.lineTo(pointX, pointY);
265 pointX = 169.5; 262 pointX = 169.5;
266 pointY = 11.5; 263 pointY = 11.5;
267 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 264 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
268 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 265 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
269 controlPoint1X = 177.5; 266 controlPoint1X = 177.5;
270 controlPoint1Y = 15.111; 267 controlPoint1Y = 15.111;
271 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 268 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
272 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 269 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
273 controlPoint2X = 173.889; 270 controlPoint2X = 173.889;
274 controlPoint2Y = 11.5; 271 controlPoint2Y = 11.5;
275 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 272 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
276 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 273 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
277 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 274 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
278 pointX = 18.5; 275 pointX = 18.5;
279 pointY = 11.5; 276 pointY = 11.5;
280 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 277 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
281 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 278 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
282 context.lineTo(pointX, pointY); 279 context.lineTo(pointX, pointY);
283 pointX = 10.5; 280 pointX = 10.5;
284 pointY = 19.5; 281 pointY = 19.5;
285 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 282 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
286 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 283 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
287 controlPoint1X = 14.111; 284 controlPoint1X = 14.111;
288 controlPoint1Y = 11.5; 285 controlPoint1Y = 11.5;
289 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 286 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
290 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 287 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
291 controlPoint2X = 10.5; 288 controlPoint2X = 10.5;
292 controlPoint2Y = 15.111; 289 controlPoint2Y = 15.111;
293 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 290 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
294 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 291 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
295 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 292 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
296 pointX = 10.5; 293 pointX = 10.5;
297 pointY = 133.5; 294 pointY = 133.5;
298 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 295 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
299 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 296 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
300 context.lineTo(pointX, pointY); 297 context.lineTo(pointX, pointY);
301 pointX = 18.5; 298 pointX = 18.5;
302 pointY = 141.5; 299 pointY = 141.5;
303 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 300 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
304 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 301 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
305 controlPoint1X = 10.5; 302 controlPoint1X = 10.5;
306 controlPoint1Y = 137.889; 303 controlPoint1Y = 137.889;
307 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 304 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
308 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 305 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
309 controlPoint2X = 14.111; 306 controlPoint2X = 14.111;
310 controlPoint2Y = 141.5; 307 controlPoint2Y = 141.5;
311 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 308 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
312 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 309 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
313 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 310 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
314 pointX = 169.5; 311 pointX = 169.5;
315 pointY = 141.5; 312 pointY = 141.5;
316 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 313 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
317 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 314 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
318 context.lineTo(pointX, pointY); 315 context.lineTo(pointX, pointY);
319 context.closePath(); 316 context.closePath();
320 gradient = context.createLinearGradient(94.0, 11.5, 94.0, 141.5); 317 gradient = context.createLinearGradient(94.0, 11.5, 94.0, 141.5);
321 color = "#EE9B69"; 318 color = "#EE9B69";
322 gradient.addColorStop(0.0, color); 319 gradient.addColorStop(0.0, color);
323 color = "#E38D62"; 320 color = "#E38D62";
324 gradient.addColorStop(1.0, color); 321 gradient.addColorStop(1.0, color);
325 context.fillStyle = gradient; 322 context.fillStyle = gradient;
326 context.fill(); 323 context.fill();
327 324
328 // Shadow Effect 325 // Shadow Effect
329 context.restore(); 326 context.restore();
330 327
331 context.restore(); 328 context.restore();
332 }, 329 },
333*/ 330*/
334 //------------------------------------------------------------------------- 331 //-------------------------------------------------------------------------
335 332
336 'updateUserDetails': function (someUserInfo) { 333 'updateUserDetails': function (someUserInfo) {
337 varelementName; 334 varelementName;
338 335
339 for (elementName in someUserInfo) { 336 for (elementName in someUserInfo) {
340 this.getElement(elementName).innerHTML = someUserInfo[elementName]; 337 this.getElement(elementName).innerHTML = someUserInfo[elementName];
341 } 338 }
342 }, 339 },
343 340
344 //------------------------------------------------------------------------- 341 //-------------------------------------------------------------------------
345 __syntaxFix__: "syntax fix" 342 __syntaxFix__: "syntax fix"
346}); 343});
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 05563bf..9a0e744 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/AppController.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/AppController.js
@@ -1,329 +1,326 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers'); 26Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers');
30 27
31Clipperz.PM.UI.Web.Controllers.AppController = function(args) { 28Clipperz.PM.UI.Web.Controllers.AppController = function(args) {
32 29
33 this._user = null; 30 this._user = null;
34 this._tabSlotNames = { 31 this._tabSlotNames = {
35 //tabName: slotName 32 //tabName: slotName
36 'cards': 'cardGrid', 33 'cards': 'cardGrid',
37 // 'directLogins':'directLoginGrid', 34 // 'directLogins':'directLoginGrid',
38 'account': 'accountPanel', 35 'account': 'accountPanel',
39 'data': 'dataPanel', 36 'data': 'dataPanel',
40 'tools': 'toolsPanel' 37 'tools': 'toolsPanel'
41 }; 38 };
42 39
43 //controllers 40 //controllers
44 this._cardsController= null; 41 this._cardsController= null;
45 //this._directLoginsController = null; 42 //this._directLoginsController = null;
46 this._filterController = null; //new Clipperz.PM.UI.Web.Controllers.FilterController(); 43 this._filterController = null; //new Clipperz.PM.UI.Web.Controllers.FilterController();
47 44
48 //components 45 //components
49 this._appPage = null; 46 this._appPage = null;
50 this._userInfoBox = null; 47 this._userInfoBox = null;
51 this._tabSidePanel = null; 48 this._tabSidePanel = null;
52 49
53 // MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'editCard', this, 'handleEditCard'); 50 // MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'editCard', this, 'handleEditCard');
54 // MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'deleteCard',this, 'handleDeleteCard'); 51 // MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'deleteCard',this, 'handleDeleteCard');
55 52
56 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'userDataSuccessfullySaved',this, 'userDataSuccessfullySavedHandler'); 53 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'userDataSuccessfullySaved',this, 'userDataSuccessfullySavedHandler');
57 54
58 return this; 55 return this;
59} 56}
60 57
61MochiKit.Base.update(Clipperz.PM.UI.Web.Controllers.AppController.prototype, { 58MochiKit.Base.update(Clipperz.PM.UI.Web.Controllers.AppController.prototype, {
62 59
63 'toString': function() { 60 'toString': function() {
64 return "Clipperz.PM.UI.Web.Controllers.AppController"; 61 return "Clipperz.PM.UI.Web.Controllers.AppController";
65 }, 62 },
66 63
67 //----------------------------------------------------------------------------- 64 //-----------------------------------------------------------------------------
68 65
69 'setUser': function(anUser) { 66 'setUser': function(anUser) {
70 this._user = anUser; 67 this._user = anUser;
71 }, 68 },
72 69
73 'user': function() { 70 'user': function() {
74 return this._user; 71 return this._user;
75 }, 72 },
76 73
77 //----------------------------------------------------------------------------- 74 //-----------------------------------------------------------------------------
78 /* 75 /*
79 'tabSlotNames': function() { 76 'tabSlotNames': function() {
80 return this._tabSlotNames; 77 return this._tabSlotNames;
81 }, 78 },
82*/ 79*/
83 'slotNameForTab': function(aTabName) { 80 'slotNameForTab': function(aTabName) {
84 return this._tabSlotNames[aTabName]; 81 return this._tabSlotNames[aTabName];
85 }, 82 },
86 83
87 'hideAllAppPageTabSlots': function() { 84 'hideAllAppPageTabSlots': function() {
88 var aTabName; 85 var aTabName;
89 86
90 for (aTabName in this._tabSlotNames) { 87 for (aTabName in this._tabSlotNames) {
91 this.appPage().hideSlot(this.slotNameForTab(aTabName)); 88 this.appPage().hideSlot(this.slotNameForTab(aTabName));
92 } 89 }
93 }, 90 },
94 91
95 //----------------------------------------------------------------------------- 92 //-----------------------------------------------------------------------------
96 93
97 'appPage': function() { 94 'appPage': function() {
98 if (this._appPage == null) { 95 if (this._appPage == null) {
99 this._appPage = new Clipperz.PM.UI.Web.Components.AppPage(); 96 this._appPage = new Clipperz.PM.UI.Web.Components.AppPage();
100 } 97 }
101 98
102 return this._appPage; 99 return this._appPage;
103 }, 100 },
104 101
105 //----------------------------------------------------------------------------- 102 //-----------------------------------------------------------------------------
106 103
107 'tabSidePanel': function() { 104 'tabSidePanel': function() {
108 if (this._tabSidePanel == null) { 105 if (this._tabSidePanel == null) {
109 this._tabSidePanel = new Clipperz.PM.UI.Web.Components.TabSidePanel(); 106 this._tabSidePanel = new Clipperz.PM.UI.Web.Components.TabSidePanel();
110 } 107 }
111 108
112 return this._tabSidePanel; 109 return this._tabSidePanel;
113 }, 110 },
114 111
115 //----------------------------------------------------------------------------- 112 //-----------------------------------------------------------------------------
116 113
117 'userInfoBox': function() { 114 'userInfoBox': function() {
118 if (this._userInfoBox == null) { 115 if (this._userInfoBox == null) {
119 this._userInfoBox = new Clipperz.PM.UI.Web.Components.UserInfoBox(); 116 this._userInfoBox = new Clipperz.PM.UI.Web.Components.UserInfoBox();
120 117
121 MochiKit.Signal.connect(this._userInfoBox, 'logout',this, 'handleLogout'); 118 MochiKit.Signal.connect(this._userInfoBox, 'logout',this, 'handleLogout');
122 MochiKit.Signal.connect(this._userInfoBox, 'lock', this, 'handleLock'); 119 MochiKit.Signal.connect(this._userInfoBox, 'lock', this, 'handleLock');
123 MochiKit.Signal.connect(this._userInfoBox, 'unlock',this, 'handleUnlock'); 120 MochiKit.Signal.connect(this._userInfoBox, 'unlock',this, 'handleUnlock');
124 } 121 }
125 122
126 return this._userInfoBox; 123 return this._userInfoBox;
127 }, 124 },
128 125
129 //----------------------------------------------------------------------------- 126 //-----------------------------------------------------------------------------
130 127
131 'accountPanel': function () { 128 'accountPanel': function () {
132 if (this._accountPanel == null) { 129 if (this._accountPanel == null) {
133 this._accountPanel = new Clipperz.PM.UI.Web.Components.AccountPanel(/*{selected:'Preferences'}*/); 130 this._accountPanel = new Clipperz.PM.UI.Web.Components.AccountPanel(/*{selected:'Preferences'}*/);
134 } 131 }
135 132
136 return this._accountPanel; 133 return this._accountPanel;
137 }, 134 },
138 135
139 //......................................................................... 136 //.........................................................................
140 137
141 'dataPanel': function () { 138 'dataPanel': function () {
142 if (this._dataPanel == null) { 139 if (this._dataPanel == null) {
143 this._dataPanel = new Clipperz.PM.UI.Web.Components.DataPanel(); 140 this._dataPanel = new Clipperz.PM.UI.Web.Components.DataPanel();
144 } 141 }
145 142
146 return this._dataPanel; 143 return this._dataPanel;
147 }, 144 },
148 145
149 //......................................................................... 146 //.........................................................................
150 147
151 'toolsPanel': function () { 148 'toolsPanel': function () {
152 if (this._toolsPanel == null) { 149 if (this._toolsPanel == null) {
153 this._toolsPanel = new Clipperz.PM.UI.Web.Components.ToolsPanel(); 150 this._toolsPanel = new Clipperz.PM.UI.Web.Components.ToolsPanel();
154 } 151 }
155 152
156 return this._toolsPanel; 153 return this._toolsPanel;
157 }, 154 },
158 155
159 //----------------------------------------------------------------------------- 156 //-----------------------------------------------------------------------------
160 157
161 'filterController': function () { 158 'filterController': function () {
162 if (this._filterController == null) { 159 if (this._filterController == null) {
163 this._filterController = new Clipperz.PM.UI.Web.Controllers.FilterController(); 160 this._filterController = new Clipperz.PM.UI.Web.Controllers.FilterController();
164 } 161 }
165 162
166 return this._filterController; 163 return this._filterController;
167 }, 164 },
168 165
169 'cardsController': function() { 166 'cardsController': function() {
170 if (this._cardsController == null) { 167 if (this._cardsController == null) {
171 this._cardsController = new Clipperz.PM.UI.Web.Controllers.CardsController({'filterController':this._filterController}); 168 this._cardsController = new Clipperz.PM.UI.Web.Controllers.CardsController({'filterController':this._filterController});
172 } 169 }
173 170
174 return this._cardsController; 171 return this._cardsController;
175 }, 172 },
176 173
177 //----------------------------------------------------------------------------- 174 //-----------------------------------------------------------------------------
178/* 175/*
179 'directLoginsController': function() { 176 'directLoginsController': function() {
180//Clipperz.log(">>> AppController.directLoginsController"); 177//Clipperz.log(">>> AppController.directLoginsController");
181 if (this._directLoginsController == null) { 178 if (this._directLoginsController == null) {
182 this._directLoginsController = new Clipperz.PM.UI.Web.Controllers.DirectLoginsController({'filterController':this._filterController}); 179 this._directLoginsController = new Clipperz.PM.UI.Web.Controllers.DirectLoginsController({'filterController':this._filterController});
183 } 180 }
184//Clipperz.log("<<< AppController.directLoginsController"); 181//Clipperz.log("<<< AppController.directLoginsController");
185 182
186 return this._directLoginsController; 183 return this._directLoginsController;
187 }, 184 },
188*/ 185*/
189 //----------------------------------------------------------------------------- 186 //-----------------------------------------------------------------------------
190 187
191 'populateUserInfo': function() { 188 'populateUserInfo': function() {
192 var deferredResult; 189 var deferredResult;
193 190
194 deferredResult = new Clipperz.Async.Deferred("AppController.populateUserInfo", {trace:false}); 191 deferredResult = new Clipperz.Async.Deferred("AppController.populateUserInfo", {trace:false});
195 deferredResult.collectResults({ 192 deferredResult.collectResults({
196 'username':MochiKit.Base.methodcaller('displayName'), 193 'username':MochiKit.Base.methodcaller('displayName'),
197 'cardsNumber':[ 194 'cardsNumber':[
198 MochiKit.Base.methodcaller('getRecords'), 195 MochiKit.Base.methodcaller('getRecords'),
199 function (someResults) { return someResults.length; } 196 function (someResults) { return someResults.length; }
200 ], 197 ],
201 'directLoginsNumber': [ 198 'directLoginsNumber': [
202 MochiKit.Base.methodcaller('getDirectLogins'), 199 MochiKit.Base.methodcaller('getDirectLogins'),
203 function (someResults) { return someResults.length; } 200 function (someResults) { return someResults.length; }
204 ] 201 ]
205 }) 202 })
206 deferredResult.addMethod(this.userInfoBox(), 'updateUserDetails'); 203 deferredResult.addMethod(this.userInfoBox(), 'updateUserDetails');
207 deferredResult.callback(this.user()); 204 deferredResult.callback(this.user());
208 205
209 return deferredResult; 206 return deferredResult;
210 }, 207 },
211 208
212 //----------------------------------------------------------------------------- 209 //-----------------------------------------------------------------------------
213 210
214 'run': function(args) { 211 'run': function(args) {
215 var deferredResult; 212 var deferredResult;
216 varslot; 213 varslot;
217 varpage; 214 varpage;
218 var user; 215 var user;
219 216
220 slot = args.slot; 217 slot = args.slot;
221 user = args.user; 218 user = args.user;
222 219
223 this.setUser(user); 220 this.setUser(user);
224 221
225 slot.setContent(this.appPage()); 222 slot.setContent(this.appPage());
226 223
227 this.appPage().slotNamed('userInfoBox').setContent(this.userInfoBox()); 224 this.appPage().slotNamed('userInfoBox').setContent(this.userInfoBox());
228 this.appPage().slotNamed('tabSidePanel').setContent(this.tabSidePanel()); 225 this.appPage().slotNamed('tabSidePanel').setContent(this.tabSidePanel());
229 226
230 this.appPage().slotNamed('accountPanel').setContent(this.accountPanel()); 227 this.appPage().slotNamed('accountPanel').setContent(this.accountPanel());
231 this.appPage().slotNamed('dataPanel').setContent(this.dataPanel()); 228 this.appPage().slotNamed('dataPanel').setContent(this.dataPanel());
232 this.appPage().slotNamed('toolsPanel').setContent(this.toolsPanel()); 229 this.appPage().slotNamed('toolsPanel').setContent(this.toolsPanel());
233 230
234 this.hideAllAppPageTabSlots(); 231 this.hideAllAppPageTabSlots();
235 this.appPage().showSlot(this.slotNameForTab('cards')); 232 this.appPage().showSlot(this.slotNameForTab('cards'));
236 233
237 MochiKit.Signal.connect(this.tabSidePanel(), 'tabSelected',this, 'handleTabSelected'); 234 MochiKit.Signal.connect(this.tabSidePanel(), 'tabSelected',this, 'handleTabSelected');
238 MochiKit.Signal.connect(this.tabSidePanel(), 'addCard', this, 'handleAddCard'); 235 MochiKit.Signal.connect(this.tabSidePanel(), 'addCard', this, 'handleAddCard');
239 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'addCard', this, 'handleAddCard'); 236 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'addCard', this, 'handleAddCard');
240 237
241 deferredResult = new Clipperz.Async.Deferred("AppController.run", {trace:false}); 238 deferredResult = new Clipperz.Async.Deferred("AppController.run", {trace:false});
242 239
243 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});
244 // 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});
245 deferredResult.addMethod(this, 'populateUserInfo'); 242 deferredResult.addMethod(this, 'populateUserInfo');
246 243
247 deferredResult.addCallback(MochiKit.Visual.ScrollTo, 'miscLinks', {duration:0}); 244 deferredResult.addCallback(MochiKit.Visual.ScrollTo, 'miscLinks', {duration:0});
248 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');
249 deferredResult.addMethod(this.tabSidePanel(), 'selectTab', 'cards'); 246 deferredResult.addMethod(this.tabSidePanel(), 'selectTab', 'cards');
250 deferredResult.callback(); 247 deferredResult.callback();
251 }, 248 },
252 249
253 //----------------------------------------------------------------------------- 250 //-----------------------------------------------------------------------------
254 251
255 'handleTabSelected': function (selectedTabName) { 252 'handleTabSelected': function (selectedTabName) {
256 var aTabName; 253 var aTabName;
257 var aSlotName; 254 var aSlotName;
258 255
259//Clipperz.log(">>> AppController.handleTabSelected", selectedTabName); 256//Clipperz.log(">>> AppController.handleTabSelected", selectedTabName);
260 this.hideAllAppPageTabSlots(); 257 this.hideAllAppPageTabSlots();
261 this.appPage().showSlot(this.slotNameForTab(selectedTabName)); 258 this.appPage().showSlot(this.slotNameForTab(selectedTabName));
262 259
263 switch (selectedTabName) { 260 switch (selectedTabName) {
264 case 'cards': 261 case 'cards':
265 this.cardsController().focus(); 262 this.cardsController().focus();
266 break; 263 break;
267 // case 'directLogins': 264 // case 'directLogins':
268 // this.directLoginsController().focus(); 265 // this.directLoginsController().focus();
269 // break; 266 // break;
270 case 'data': 267 case 'data':
271 break; 268 break;
272 case 'account': 269 case 'account':
273 break; 270 break;
274 case 'tools': 271 case 'tools':
275 break; 272 break;
276 } 273 }
277//Clipperz.log("<-- AppController.handleTabSelected", aTabName); 274//Clipperz.log("<-- AppController.handleTabSelected", aTabName);
278 }, 275 },
279 276
280 //============================================================================= 277 //=============================================================================
281 278
282 'handleAddCard': function (aSourceElement) { 279 'handleAddCard': function (aSourceElement) {
283//Clipperz.log("=== AppController.addCard", aSourceElement); 280//Clipperz.log("=== AppController.addCard", aSourceElement);
284 this.cardsController().addCard(aSourceElement); 281 this.cardsController().addCard(aSourceElement);
285 }, 282 },
286 283
287 //============================================================================= 284 //=============================================================================
288 285
289 'userDataSuccessfullySavedHandler': function (anEvent) { 286 'userDataSuccessfullySavedHandler': function (anEvent) {
290 this.populateUserInfo(); 287 this.populateUserInfo();
291 }, 288 },
292 289
293 //============================================================================= 290 //=============================================================================
294 291
295 'handleLogout': function(anEvent) { 292 'handleLogout': function(anEvent) {
296 var deferredResult; 293 var deferredResult;
297 294
298 deferredResult = new Clipperz.Async.Deferred("AppController.handleLogout", {trace:false}); 295 deferredResult = new Clipperz.Async.Deferred("AppController.handleLogout", {trace:false});
299 deferredResult.addMethod(this.user(), 'logout'); 296 deferredResult.addMethod(this.user(), 'logout');
300 deferredResult.addCallback(MochiKit.Signal.signal, this, 'logout'); 297 deferredResult.addCallback(MochiKit.Signal.signal, this, 'logout');
301 deferredResult.callback(); 298 deferredResult.callback();
302 299
303 return deferredResult; 300 return deferredResult;
304 }, 301 },
305 302
306 //----------------------------------------------------------------------------- 303 //-----------------------------------------------------------------------------
307 304
308 'handleLock': function (anEvent) { 305 'handleLock': function (anEvent) {
309 return Clipperz.Async.callbacks("AppController.handleLock", [ 306 return Clipperz.Async.callbacks("AppController.handleLock", [
310 MochiKit.Base.method(this.cardsController(), 'deleteAllCleanTextData'), 307 MochiKit.Base.method(this.cardsController(), 'deleteAllCleanTextData'),
311 MochiKit.Base.method(this.user(), 'lock') 308 MochiKit.Base.method(this.user(), 'lock')
312 ], {trace:false}); 309 ], {trace:false});
313 }, 310 },
314 311
315 //............................................................................. 312 //.............................................................................
316 313
317 'handleUnlock': function (anEvent) { 314 'handleUnlock': function (anEvent) {
318 return Clipperz.Async.callbacks("AppController.handleUnock", [ 315 return Clipperz.Async.callbacks("AppController.handleUnock", [
319 MochiKit.Base.partial(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'initProgress'), 316 MochiKit.Base.partial(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'initProgress'),
320 MochiKit.Base.method(this.user(), 'login'), 317 MochiKit.Base.method(this.user(), 'login'),
321 MochiKit.Base.method(this.cardsController(), 'focus'), 318 MochiKit.Base.method(this.cardsController(), 'focus'),
322 MochiKit.Base.partial(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'progressDone'), 319 MochiKit.Base.partial(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'progressDone'),
323 MochiKit.Base.method(this.userInfoBox(), 'unlock') 320 MochiKit.Base.method(this.userInfoBox(), 'unlock')
324 ], {trace:false}); 321 ], {trace:false});
325 }, 322 },
326 323
327 //============================================================================= 324 //=============================================================================
328 __syntaxFix__: "syntax fix" 325 __syntaxFix__: "syntax fix"
329}); 326});
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 2340aeb..effde31 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/CardDialogController.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/CardDialogController.js
@@ -1,408 +1,405 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers'); 26Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers');
30 27
31Clipperz.PM.UI.Web.Controllers.CardDialogController = function(args) { 28Clipperz.PM.UI.Web.Controllers.CardDialogController = function(args) {
32 args = args || {}; 29 args = args || {};
33 30
34 Clipperz.PM.UI.Web.Controllers.CardDialogController.superclass.constructor.call(this, args); 31 Clipperz.PM.UI.Web.Controllers.CardDialogController.superclass.constructor.call(this, args);
35 32
36 this._record = args.record || Clipperz.Base.exception.raise('MandatoryParameter'); 33 this._record = args.record || Clipperz.Base.exception.raise('MandatoryParameter');
37 this._delegate = args.delegate || Clipperz.Base.exception.raise('MandatoryParameter'); 34 this._delegate = args.delegate || Clipperz.Base.exception.raise('MandatoryParameter');
38 35
39 this._referenceElement = null; 36 this._referenceElement = null;
40 this._cardDialogComponent = null; 37 this._cardDialogComponent = null;
41 38
42 this._fieldsReferences = {}; 39 this._fieldsReferences = {};
43 this._directLoginReferences = {}; 40 this._directLoginReferences = {};
44 41
45 this._directLoginWizardController = null; 42 this._directLoginWizardController = null;
46 this._directLoginEditingComponent = null; 43 this._directLoginEditingComponent = null;
47 this._isDirectLoginEditingComponentVisible = false; 44 this._isDirectLoginEditingComponentVisible = false;
48 45
49 return this; 46 return this;
50}; 47};
51 48
52Clipperz.Base.extend(Clipperz.PM.UI.Web.Controllers.CardDialogController, Object, { 49Clipperz.Base.extend(Clipperz.PM.UI.Web.Controllers.CardDialogController, Object, {
53 50
54 'toString': function() { 51 'toString': function() {
55 return "Clipperz.PM.UI.Web.Controllers.CardDialogController"; 52 return "Clipperz.PM.UI.Web.Controllers.CardDialogController";
56 }, 53 },
57 54
58 //------------------------------------------------------------------------- 55 //-------------------------------------------------------------------------
59 56
60 'record': function () { 57 'record': function () {
61 return this._record; 58 return this._record;
62 }, 59 },
63 60
64 'delegate': function () { 61 'delegate': function () {
65 return this._delegate; 62 return this._delegate;
66 }, 63 },
67 64
68 //------------------------------------------------------------------------- 65 //-------------------------------------------------------------------------
69 66
70 'fieldsReferences': function () { 67 'fieldsReferences': function () {
71 return this._fieldsReferences; 68 return this._fieldsReferences;
72 }, 69 },
73 70
74 'directLoginReferences': function () { 71 'directLoginReferences': function () {
75 return this._directLoginReferences; 72 return this._directLoginReferences;
76 }, 73 },
77 74
78 //------------------------------------------------------------------------- 75 //-------------------------------------------------------------------------
79 76
80 'referenceElement': function () { 77 'referenceElement': function () {
81 return this._referenceElement; 78 return this._referenceElement;
82 }, 79 },
83 80
84 'setReferenceElement': function (anElement) { 81 'setReferenceElement': function (anElement) {
85 this._referenceElement = anElement; 82 this._referenceElement = anElement;
86 }, 83 },
87 84
88 //------------------------------------------------------------------------- 85 //-------------------------------------------------------------------------
89 86
90 'cardDialogComponent': function () { 87 'cardDialogComponent': function () {
91 if (this._cardDialogComponent == null) { 88 if (this._cardDialogComponent == null) {
92 this._cardDialogComponent = new Clipperz.PM.UI.Web.Components.CardDialogComponent(); 89 this._cardDialogComponent = new Clipperz.PM.UI.Web.Components.CardDialogComponent();
93 90
94 MochiKit.Signal.connect(this._cardDialogComponent, 'cancel', this, 'handleCancel'); 91 MochiKit.Signal.connect(this._cardDialogComponent, 'cancel', this, 'handleCancel');
95 MochiKit.Signal.connect(this._cardDialogComponent, 'save', this, 'handleSave'); 92 MochiKit.Signal.connect(this._cardDialogComponent, 'save', this, 'handleSave');
96 93
97 MochiKit.Signal.connect(this._cardDialogComponent, 'addField', this, 'handleAddField'); 94 MochiKit.Signal.connect(this._cardDialogComponent, 'addField', this, 'handleAddField');
98 MochiKit.Signal.connect(this._cardDialogComponent, 'changedValue',this, 'handleChangedValue'); 95 MochiKit.Signal.connect(this._cardDialogComponent, 'changedValue',this, 'handleChangedValue');
99 96
100 MochiKit.Signal.connect(this._cardDialogComponent, 'addDirectLogin',this, 'handleAddDirectLogin'); 97 MochiKit.Signal.connect(this._cardDialogComponent, 'addDirectLogin',this, 'handleAddDirectLogin');
101 MochiKit.Signal.connect(this._cardDialogComponent, 'keyPressed',this, 'handleCardDialogComponentKeyPressed'); 98 MochiKit.Signal.connect(this._cardDialogComponent, 'keyPressed',this, 'handleCardDialogComponentKeyPressed');
102 } 99 }
103 100
104 return this._cardDialogComponent; 101 return this._cardDialogComponent;
105 }, 102 },
106 103
107 //========================================================================= 104 //=========================================================================
108 105
109 'directLoginWizardController': function () { 106 'directLoginWizardController': function () {
110 if (this._directLoginWizardController == null) { 107 if (this._directLoginWizardController == null) {
111 this._directLoginWizardController = new Clipperz.PM.UI.Web.Controllers.DirectLoginWizardController({ 108 this._directLoginWizardController = new Clipperz.PM.UI.Web.Controllers.DirectLoginWizardController({
112 'cardLabel': this.cardDialogComponent().title(), 109 'cardLabel': this.cardDialogComponent().title(),
113 'directLoginEditingComponent': this.directLoginEditingComponent() 110 'directLoginEditingComponent': this.directLoginEditingComponent()
114 }) 111 })
115 112
116 MochiKit.Signal.connect(this._directLoginWizardController, 'exit',this, 'handleHideDirectLoginEditingComponent'); 113 MochiKit.Signal.connect(this._directLoginWizardController, 'exit',this, 'handleHideDirectLoginEditingComponent');
117 MochiKit.Signal.connect(this._directLoginWizardController, 'done',this, 'handleCompleteDirectLoginEditingComponent'); 114 MochiKit.Signal.connect(this._directLoginWizardController, 'done',this, 'handleCompleteDirectLoginEditingComponent');
118 } 115 }
119 116
120 return this._directLoginWizardController; 117 return this._directLoginWizardController;
121 }, 118 },
122 119
123 //------------------------------------------------------------------------- 120 //-------------------------------------------------------------------------
124 121
125 'directLoginEditingComponent': function () { 122 'directLoginEditingComponent': function () {
126 if (this._directLoginEditingComponent == null) { 123 if (this._directLoginEditingComponent == null) {
127 this._directLoginEditingComponent = new Clipperz.PM.UI.Web.Components.DirectLoginEditingComponent(); 124 this._directLoginEditingComponent = new Clipperz.PM.UI.Web.Components.DirectLoginEditingComponent();
128 125
129 this.cardDialogComponent().renderDirectLoginEditingComponent(this._directLoginEditingComponent); 126 this.cardDialogComponent().renderDirectLoginEditingComponent(this._directLoginEditingComponent);
130 127
131 // MochiKit.Signal.connect(this._directLoginEditingComponent, 'back', this, 'handleHideDirectLoginEditingComponent') 128 // MochiKit.Signal.connect(this._directLoginEditingComponent, 'back', this, 'handleHideDirectLoginEditingComponent')
132 // MochiKit.Signal.connect(this._directLoginEditingComponent, 'changedValue',this, 'handleChangedValue'); 129 // MochiKit.Signal.connect(this._directLoginEditingComponent, 'changedValue',this, 'handleChangedValue');
133 // MochiKit.Signal.connect(this.__directLoginEditingComponent, 'keyPressed',this, 'handleDirectLoginEditingComponentKeyPressed'); 130 // MochiKit.Signal.connect(this.__directLoginEditingComponent, 'keyPressed',this, 'handleDirectLoginEditingComponentKeyPressed');
134 } 131 }
135 132
136 return this._directLoginEditingComponent; 133 return this._directLoginEditingComponent;
137 }, 134 },
138 135
139 //------------------------------------------------------------------------- 136 //-------------------------------------------------------------------------
140 137
141 'isDirectLoginEditingComponentVisible': function () { 138 'isDirectLoginEditingComponentVisible': function () {
142 return this._isDirectLoginEditingComponentVisible; 139 return this._isDirectLoginEditingComponentVisible;
143 }, 140 },
144 141
145 'setIsDirectLoginEditingComponentVisible': function (aValue) { 142 'setIsDirectLoginEditingComponentVisible': function (aValue) {
146 this._isDirectLoginEditingComponentVisible = aValue; 143 this._isDirectLoginEditingComponentVisible = aValue;
147 }, 144 },
148 145
149 //========================================================================= 146 //=========================================================================
150 147
151 'run': function (anElement) { 148 'run': function (anElement) {
152 var deferredResult; 149 var deferredResult;
153 150
154 this.setReferenceElement(anElement); 151 this.setReferenceElement(anElement);
155 152
156 deferredResult = new Clipperz.Async.Deferred("CardDialogController.run", {trace:false}); 153 deferredResult = new Clipperz.Async.Deferred("CardDialogController.run", {trace:false});
157 deferredResult.addCallback(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'initProgress', {'steps':11}); 154 deferredResult.addCallback(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'initProgress', {'steps':11});
158 155
159 deferredResult.addMethod(this.cardDialogComponent(), 'deferredShowModal', {openFromElement:this.referenceElement()}); 156 deferredResult.addMethod(this.cardDialogComponent(), 'deferredShowModal', {openFromElement:this.referenceElement()});
160 deferredResult.addCallback(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress'); 157 deferredResult.addCallback(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
161 158
162 deferredResult.addMethod(this.record(), 'label'); 159 deferredResult.addMethod(this.record(), 'label');
163 deferredResult.addMethod(this.cardDialogComponent(), 'setTitle'); 160 deferredResult.addMethod(this.cardDialogComponent(), 'setTitle');
164 deferredResult.addCallback(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress'); 161 deferredResult.addCallback(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
165 162
166 deferredResult.addMethod(this, 'updateComponentState'); 163 deferredResult.addMethod(this, 'updateComponentState');
167 deferredResult.addCallback(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress'); 164 deferredResult.addCallback(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
168 deferredResult.addCallback(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'progressDone'); 165 deferredResult.addCallback(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'progressDone');
169 166
170 deferredResult.addMethod(this.cardDialogComponent(), 'fixRendering'); 167 deferredResult.addMethod(this.cardDialogComponent(), 'fixRendering');
171 deferredResult.addMethod(this.cardDialogComponent(), 'hideProgressMask'); 168 deferredResult.addMethod(this.cardDialogComponent(), 'hideProgressMask');
172 169
173 if (this.record().isBrandNew()) { 170 if (this.record().isBrandNew()) {
174 deferredResult.addMethod(this.cardDialogComponent(), 'setHintMode', 'ON'); 171 deferredResult.addMethod(this.cardDialogComponent(), 'setHintMode', 'ON');
175 deferredResult.addMethod(this.cardDialogComponent(), 'setFocusOnTitleField'); 172 deferredResult.addMethod(this.cardDialogComponent(), 'setFocusOnTitleField');
176 } 173 }
177 174
178 deferredResult.addErrback(MochiKit.Base.method(this.cardDialogComponent(), 'showError')); 175 deferredResult.addErrback(MochiKit.Base.method(this.cardDialogComponent(), 'showError'));
179 deferredResult.callback(); 176 deferredResult.callback();
180 177
181 return deferredResult; 178 return deferredResult;
182 }, 179 },
183 180
184 //========================================================================= 181 //=========================================================================
185 182
186 'updateComponentState': function () { 183 'updateComponentState': function () {
187 return Clipperz.Async.callbacks("CardDialogController.updateComponentState", [ 184 return Clipperz.Async.callbacks("CardDialogController.updateComponentState", [
188 MochiKit.Base.method(this.record(), 'hasPendingChanges'), 185 MochiKit.Base.method(this.record(), 'hasPendingChanges'),
189 MochiKit.Base.method(this.cardDialogComponent(), 'setShouldEnableSaving'), 186 MochiKit.Base.method(this.cardDialogComponent(), 'setShouldEnableSaving'),
190 187
191 MochiKit.Base.method(this.record(), 'label'), 188 MochiKit.Base.method(this.record(), 'label'),
192 MochiKit.Base.method(this.cardDialogComponent(), 'setTitle'), 189 MochiKit.Base.method(this.cardDialogComponent(), 'setTitle'),
193 MochiKit.Base.method(this.record(), 'notes'), 190 MochiKit.Base.method(this.record(), 'notes'),
194 MochiKit.Base.method(this.cardDialogComponent(), 'setNotes'), 191 MochiKit.Base.method(this.cardDialogComponent(), 'setNotes'),
195 192
196 MochiKit.Base.method(this.record(), 'fields'), 193 MochiKit.Base.method(this.record(), 'fields'),
197 MochiKit.Base.values, 194 MochiKit.Base.values,
198 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.method(this, 'addCardDialogComponentWithField')), 195 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.method(this, 'addCardDialogComponentWithField')),
199 196
200 MochiKit.Base.method(this.record(), 'directLogins'), 197 MochiKit.Base.method(this.record(), 'directLogins'),
201 MochiKit.Base.values, 198 MochiKit.Base.values,
202 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.method(this, 'addCardDialogComponentWithDirectLogin')), 199 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.method(this, 'addCardDialogComponentWithDirectLogin')),
203 200
204 MochiKit.Base.method(this.cardDialogComponent(), 'resetNewFieldInputs'), 201 MochiKit.Base.method(this.cardDialogComponent(), 'resetNewFieldInputs'),
205 MochiKit.Base.noop 202 MochiKit.Base.noop
206 ], {trace:false}); 203 ], {trace:false});
207 }, 204 },
208 205
209 //------------------------------------------------------------------------- 206 //-------------------------------------------------------------------------
210 207
211 'addCardDialogComponentWithField': function (aField) { 208 'addCardDialogComponentWithField': function (aField) {
212 varfieldComponent; 209 varfieldComponent;
213 210
214 fieldComponent = new Clipperz.PM.UI.Web.Components.CardDialogRecordFieldComponent({reference: aField.reference()}); 211 fieldComponent = new Clipperz.PM.UI.Web.Components.CardDialogRecordFieldComponent({reference: aField.reference()});
215 MochiKit.Signal.connect(fieldComponent, 'changedValue',this, 'handleChangedValue'); 212 MochiKit.Signal.connect(fieldComponent, 'changedValue',this, 'handleChangedValue');
216 MochiKit.Signal.connect(fieldComponent, 'performAction',this, 'handlePerformFieldAction'); 213 MochiKit.Signal.connect(fieldComponent, 'performAction',this, 'handlePerformFieldAction');
217 MochiKit.Signal.connect(fieldComponent, 'deleteField',this, 'handleDeleteField'); 214 MochiKit.Signal.connect(fieldComponent, 'deleteField',this, 'handleDeleteField');
218 215
219 // this.fieldsReferences().push({'field':aField, 'component':fieldComponent}); 216 // this.fieldsReferences().push({'field':aField, 'component':fieldComponent});
220 this.fieldsReferences()[aField.reference()] = {'field':aField, 'component':fieldComponent}; 217 this.fieldsReferences()[aField.reference()] = {'field':aField, 'component':fieldComponent};
221 218
222 return Clipperz.Async.callbacks("CardDialogController.addCardDialogComponentWithField", [ 219 return Clipperz.Async.callbacks("CardDialogController.addCardDialogComponentWithField", [
223 MochiKit.Base.method(this.cardDialogComponent(), 'addFieldRowComponent', fieldComponent), 220 MochiKit.Base.method(this.cardDialogComponent(), 'addFieldRowComponent', fieldComponent),
224 221
225 MochiKit.Base.method(aField, 'label'), 222 MochiKit.Base.method(aField, 'label'),
226 MochiKit.Base.method(fieldComponent, 'setLabel'), 223 MochiKit.Base.method(fieldComponent, 'setLabel'),
227 MochiKit.Base.method(aField, 'value'), 224 MochiKit.Base.method(aField, 'value'),
228 MochiKit.Base.method(fieldComponent, 'setValue'), 225 MochiKit.Base.method(fieldComponent, 'setValue'),
229 MochiKit.Base.method(aField, 'actionType'), 226 MochiKit.Base.method(aField, 'actionType'),
230 MochiKit.Base.method(fieldComponent, 'setActionType'), 227 MochiKit.Base.method(fieldComponent, 'setActionType'),
231 MochiKit.Base.method(aField, 'isHidden'), 228 MochiKit.Base.method(aField, 'isHidden'),
232 MochiKit.Base.method(fieldComponent, 'setIsHidden') 229 MochiKit.Base.method(fieldComponent, 'setIsHidden')
233 ], {trace:false}); 230 ], {trace:false});
234 }, 231 },
235 232
236 //------------------------------------------------------------------------- 233 //-------------------------------------------------------------------------
237 234
238 'addCardDialogComponentWithDirectLogin': function (aDirectLogin) { 235 'addCardDialogComponentWithDirectLogin': function (aDirectLogin) {
239 var directLoginComponent; 236 var directLoginComponent;
240 237
241 directLoginComponent = new Clipperz.PM.UI.Web.Components.CardDialogRecordDirectLoginComponent({reference: aDirectLogin.reference()}); 238 directLoginComponent = new Clipperz.PM.UI.Web.Components.CardDialogRecordDirectLoginComponent({reference: aDirectLogin.reference()});
242 MochiKit.Signal.connect(directLoginComponent, 'changedValue', this, 'handleChangedValue'); 239 MochiKit.Signal.connect(directLoginComponent, 'changedValue', this, 'handleChangedValue');
243 MochiKit.Signal.connect(directLoginComponent, 'deleteDirectLogin',this, 'handleDeleteDirectLogin'); 240 MochiKit.Signal.connect(directLoginComponent, 'deleteDirectLogin',this, 'handleDeleteDirectLogin');
244 MochiKit.Signal.connect(directLoginComponent, 'editDirectLogin',this, 'handleEditDirectLogin'); 241 MochiKit.Signal.connect(directLoginComponent, 'editDirectLogin',this, 'handleEditDirectLogin');
245 MochiKit.Signal.connect(directLoginComponent, 'openDirectLogin',this, 'handleOpenDirectLogin'); 242 MochiKit.Signal.connect(directLoginComponent, 'openDirectLogin',this, 'handleOpenDirectLogin');
246 243
247 this.directLoginReferences()[aDirectLogin.reference()] = {'directLogin':aDirectLogin, 'component':directLoginComponent}; 244 this.directLoginReferences()[aDirectLogin.reference()] = {'directLogin':aDirectLogin, 'component':directLoginComponent};
248 245
249 return Clipperz.Async.callbacks("CardDialogController.addCardDialogComponentWithDirectLogin", [ 246 return Clipperz.Async.callbacks("CardDialogController.addCardDialogComponentWithDirectLogin", [
250 MochiKit.Base.method(this.cardDialogComponent(), 'addDirectLoginComponent', directLoginComponent), 247 MochiKit.Base.method(this.cardDialogComponent(), 'addDirectLoginComponent', directLoginComponent),
251 MochiKit.Base.method(this, 'refreshDirectLoginComponent', this.directLoginReferences()[aDirectLogin.reference()]) 248 MochiKit.Base.method(this, 'refreshDirectLoginComponent', this.directLoginReferences()[aDirectLogin.reference()])
252 ], {trace:false}); 249 ], {trace:false});
253 }, 250 },
254 251
255 //------------------------------------------------------------------------- 252 //-------------------------------------------------------------------------
256 253
257 'refreshDirectLoginComponent': function (aDirectLoginReference) { 254 'refreshDirectLoginComponent': function (aDirectLoginReference) {
258 return Clipperz.Async.callbacks("CardDialogController.refreshDirectLoginComponent", [ 255 return Clipperz.Async.callbacks("CardDialogController.refreshDirectLoginComponent", [
259 MochiKit.Base.method(aDirectLoginReference['directLogin'],'favicon'), 256 MochiKit.Base.method(aDirectLoginReference['directLogin'],'favicon'),
260 // MochiKit.Base.method(aDirectLoginReference['directLogin'],'faviconData'), 257 // MochiKit.Base.method(aDirectLoginReference['directLogin'],'faviconData'),
261 MochiKit.Base.method(aDirectLoginReference['component'],'setFavicon'), 258 MochiKit.Base.method(aDirectLoginReference['component'],'setFavicon'),
262 MochiKit.Base.method(aDirectLoginReference['directLogin'],'label'), 259 MochiKit.Base.method(aDirectLoginReference['directLogin'],'label'),
263 MochiKit.Base.method(aDirectLoginReference['component'],'setLabel') 260 MochiKit.Base.method(aDirectLoginReference['component'],'setLabel')
264 ], {trace:false}); 261 ], {trace:false});
265 }, 262 },
266 263
267 'refreshDirectLoginComponents': function () { 264 'refreshDirectLoginComponents': function () {
268 return Clipperz.Async.callbacks("CardDialogController.refreshDirectLoginComponents", [ 265 return Clipperz.Async.callbacks("CardDialogController.refreshDirectLoginComponents", [
269 MochiKit.Base.method(this, 'directLoginReferences'), 266 MochiKit.Base.method(this, 'directLoginReferences'),
270 MochiKit.Base.values, 267 MochiKit.Base.values,
271 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.method(this, 'refreshDirectLoginComponent')), 268 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.method(this, 'refreshDirectLoginComponent')),
272 Clipperz.Async.collectAll 269 Clipperz.Async.collectAll
273 ]) 270 ])
274 }, 271 },
275 272
276 //------------------------------------------------------------------------- 273 //-------------------------------------------------------------------------
277 274
278 'updateRecordValues': function () { 275 'updateRecordValues': function () {
279 return Clipperz.Async.callbacks('CardDialogController.updateRecordValues', [ 276 return Clipperz.Async.callbacks('CardDialogController.updateRecordValues', [
280 MochiKit.Base.method(this.cardDialogComponent(), 'title'), 277 MochiKit.Base.method(this.cardDialogComponent(), 'title'),
281 MochiKit.Base.method(this.record(), 'setLabel'), 278 MochiKit.Base.method(this.record(), 'setLabel'),
282 MochiKit.Base.method(this.cardDialogComponent(), 'notes'), 279 MochiKit.Base.method(this.cardDialogComponent(), 'notes'),
283 MochiKit.Base.method(this.record(), 'setNotes'), 280 MochiKit.Base.method(this.record(), 'setNotes'),
284 281
285 MochiKit.Base.method(this, 'fieldsReferences'), 282 MochiKit.Base.method(this, 'fieldsReferences'),
286 MochiKit.Base.values, 283 MochiKit.Base.values,
287 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.method(this, 'updateRecordFieldValues')), 284 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.method(this, 'updateRecordFieldValues')),
288 285
289 MochiKit.Base.method(this, 'directLoginReferences'), 286 MochiKit.Base.method(this, 'directLoginReferences'),
290 MochiKit.Base.values, 287 MochiKit.Base.values,
291 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.method(this, 'updateRecordDirectLoginValues')), 288 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.method(this, 'updateRecordDirectLoginValues')),
292 289
293 MochiKit.Base.method(this.directLoginEditingComponent(), 'directLoginReference'), 290 MochiKit.Base.method(this.directLoginEditingComponent(), 'directLoginReference'),
294 MochiKit.Base.method(this.record(), 'directLoginWithReference'), 291 MochiKit.Base.method(this.record(), 'directLoginWithReference'),
295 MochiKit.Base.method(this, 'updateRecordDirectLoginDetails'), 292 MochiKit.Base.method(this, 'updateRecordDirectLoginDetails'),
296 293
297 MochiKit.Base.noop 294 MochiKit.Base.noop
298 ], {trace:false}); 295 ], {trace:false});
299 }, 296 },
300 297
301 //------------------------------------------------------------------------- 298 //-------------------------------------------------------------------------
302 299
303 'updateRecordFieldValues': function (aFieldReference) { 300 'updateRecordFieldValues': function (aFieldReference) {
304 var deferredResult; 301 var deferredResult;
305 302
306 deferredResult = Clipperz.Async.callbacks('CardDialogController.updateRecordFieldValues', [ 303 deferredResult = Clipperz.Async.callbacks('CardDialogController.updateRecordFieldValues', [
307 MochiKit.Base.method(aFieldReference['component'],'label'), 304 MochiKit.Base.method(aFieldReference['component'],'label'),
308 MochiKit.Base.method(aFieldReference['field'], 'setLabel'), 305 MochiKit.Base.method(aFieldReference['field'], 'setLabel'),
309 306
310 MochiKit.Base.method(aFieldReference['component'],'value'), 307 MochiKit.Base.method(aFieldReference['component'],'value'),
311 MochiKit.Base.method(aFieldReference['field'], 'setValue'), 308 MochiKit.Base.method(aFieldReference['field'], 'setValue'),
312 309
313 MochiKit.Base.method(aFieldReference['component'],'isHidden'), 310 MochiKit.Base.method(aFieldReference['component'],'isHidden'),
314 MochiKit.Base.method(aFieldReference['field'], 'setIsHidden'), 311 MochiKit.Base.method(aFieldReference['field'], 'setIsHidden'),
315 312
316 MochiKit.Base.method(aFieldReference['field'], 'actionType'), 313 MochiKit.Base.method(aFieldReference['field'], 'actionType'),
317 MochiKit.Base.method(aFieldReference['component'],'setActionType') 314 MochiKit.Base.method(aFieldReference['component'],'setActionType')
318 ], {trace:false}); 315 ], {trace:false});
319 316
320 return deferredResult; 317 return deferredResult;
321 }, 318 },
322 319
323 //------------------------------------------------------------------------- 320 //-------------------------------------------------------------------------
324 321
325 'updateRecordDirectLoginValues': function (aDirectLoginReference) { 322 'updateRecordDirectLoginValues': function (aDirectLoginReference) {
326 var deferredResult; 323 var deferredResult;
327 324
328 deferredResult = Clipperz.Async.callbacks('CardDialogController.updateRecordDirectLoginValues', [ 325 deferredResult = Clipperz.Async.callbacks('CardDialogController.updateRecordDirectLoginValues', [
329 MochiKit.Base.method(aDirectLoginReference['component'], 'label'), 326 MochiKit.Base.method(aDirectLoginReference['component'], 'label'),
330 MochiKit.Base.method(aDirectLoginReference['directLogin'], 'setLabel') 327 MochiKit.Base.method(aDirectLoginReference['directLogin'], 'setLabel')
331 ], {trace:false}); 328 ], {trace:false});
332 329
333 return deferredResult; 330 return deferredResult;
334 }, 331 },
335 332
336 //------------------------------------------------------------------------- 333 //-------------------------------------------------------------------------
337 334
338 'updateRecordDirectLoginDetails': function (aDirectLogin) { 335 'updateRecordDirectLoginDetails': function (aDirectLogin) {
339 var result; 336 var result;
340 337
341 if (MochiKit.Base.isUndefinedOrNull(aDirectLogin)) { 338 if (MochiKit.Base.isUndefinedOrNull(aDirectLogin)) {
342 result = MochiKit.Async.succeed(); 339 result = MochiKit.Async.succeed();
343 } else { 340 } else {
344 result = Clipperz.Async.callbacks("CardDialogController.updateRecordDirectLoginDetails", [ 341 result = Clipperz.Async.callbacks("CardDialogController.updateRecordDirectLoginDetails", [
345 MochiKit.Base.method(this.directLoginEditingComponent(), 'label'), 342 MochiKit.Base.method(this.directLoginEditingComponent(), 'label'),
346 MochiKit.Base.method(aDirectLogin, 'setLabel'), 343 MochiKit.Base.method(aDirectLogin, 'setLabel'),
347 MochiKit.Base.method(this.directLoginEditingComponent(), 'favicon'), 344 MochiKit.Base.method(this.directLoginEditingComponent(), 'favicon'),
348 MochiKit.Base.method(aDirectLogin, 'setFavicon') 345 MochiKit.Base.method(aDirectLogin, 'setFavicon')
349 ], {trace:false}); 346 ], {trace:false});
350 } 347 }
351 348
352 return result; 349 return result;
353 }, 350 },
354 351
355 //========================================================================= 352 //=========================================================================
356 353
357 'addField': function () { 354 'addField': function () {
358 return this.record().addField({ 355 return this.record().addField({
359 'label':this.cardDialogComponent().newFieldLabel(), 356 'label':this.cardDialogComponent().newFieldLabel(),
360 'value':this.cardDialogComponent().newFieldValue(), 357 'value':this.cardDialogComponent().newFieldValue(),
361 'isHidden':this.cardDialogComponent().newFieldIsHidden() 358 'isHidden':this.cardDialogComponent().newFieldIsHidden()
362 }); 359 });
363 }, 360 },
364 361
365 'handleAddField': function () { 362 'handleAddField': function () {
366 return Clipperz.Async.callbacks("CardDialogController.handleAddField", [ 363 return Clipperz.Async.callbacks("CardDialogController.handleAddField", [
367 MochiKit.Base.method(this, 'addField'), 364 MochiKit.Base.method(this, 'addField'),
368 365
369 MochiKit.Base.method(this, 'addCardDialogComponentWithField'), 366 MochiKit.Base.method(this, 'addCardDialogComponentWithField'),
370 MochiKit.Base.method(this.cardDialogComponent(), 'resetNewFieldInputs'), 367 MochiKit.Base.method(this.cardDialogComponent(), 'resetNewFieldInputs'),
371 368
372 MochiKit.Base.method(this.cardDialogComponent(), 'fixRendering'), 369 MochiKit.Base.method(this.cardDialogComponent(), 'fixRendering'),
373 MochiKit.Base.method(this, 'handleChangedValue') 370 MochiKit.Base.method(this, 'handleChangedValue')
374 ], {trace:false}) 371 ], {trace:false})
375 }, 372 },
376 373
377 //------------------------------------------------------------------------- 374 //-------------------------------------------------------------------------
378 375
379 'handlePerformFieldAction': function (aFieldID, aTargetElement) { 376 'handlePerformFieldAction': function (aFieldID, aTargetElement) {
380//console.log("### targetElement", aTargetElement); 377//console.log("### targetElement", aTargetElement);
381 return Clipperz.Async.callbacks("CardDialogController.handleDeleteField", [ 378 return Clipperz.Async.callbacks("CardDialogController.handleDeleteField", [
382 MochiKit.Base.method(this.record(), 'fields'), 379 MochiKit.Base.method(this.record(), 'fields'),
383 MochiKit.Base.itemgetter(aFieldID), 380 MochiKit.Base.itemgetter(aFieldID),
384 Clipperz.Async.collectResults("CardDialogController.handleDeleteField <collect results>", { 381 Clipperz.Async.collectResults("CardDialogController.handleDeleteField <collect results>", {
385 'value':MochiKit.Base.methodcaller('value'), 382 'value':MochiKit.Base.methodcaller('value'),
386 'type': MochiKit.Base.methodcaller('actionType') 383 'type': MochiKit.Base.methodcaller('actionType')
387 }, {trace:false}), 384 }, {trace:false}),
388 MochiKit.Base.bind(function (someValues) { 385 MochiKit.Base.bind(function (someValues) {
389 switch (someValues['type']) { 386 switch (someValues['type']) {
390 case 'NONE': 387 case 'NONE':
391 throw "this event handler should not be triggered for fields with type 'NONE'"; 388 throw "this event handler should not be triggered for fields with type 'NONE'";
392 break; 389 break;
393 case 'URL': 390 case 'URL':
394 var url; 391 var url;
395 392
396 url = someValues['value']; 393 url = someValues['value'];
397 if (/^https?\:\/\//.test(url) == false) { 394 if (/^https?\:\/\//.test(url) == false) {
398 url = 'http://' + url; 395 url = 'http://' + url;
399 } 396 }
400 397
401 window.open(url); 398 window.open(url);
402 break; 399 break;
403 case 'EMAIL': 400 case 'EMAIL':
404 var url; 401 var url;
405 402
406 url = 'mailto:' + someValues['value']; 403 url = 'mailto:' + someValues['value'];
407 404
408 MochiKit.DOM.currentWindow().location = url; 405 MochiKit.DOM.currentWindow().location = url;
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 b1a34b2..f58f0b8 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/CardsController.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/CardsController.js
@@ -1,207 +1,204 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers'); 26Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers');
30 27
31Clipperz.PM.UI.Web.Controllers.CardsController = function() { 28Clipperz.PM.UI.Web.Controllers.CardsController = function() {
32 Clipperz.PM.UI.Web.Controllers.CardsController.superclass.constructor.apply(this, arguments); 29 Clipperz.PM.UI.Web.Controllers.CardsController.superclass.constructor.apply(this, arguments);
33 30
34 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'cardDialogComponentClosed', this, 'handleHideCard'); 31 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'cardDialogComponentClosed', this, 'handleHideCard');
35 32
36 return this; 33 return this;
37} 34}
38 35
39Clipperz.Base.extend(Clipperz.PM.UI.Web.Controllers.CardsController, Clipperz.PM.UI.Web.Controllers.GridController, { 36Clipperz.Base.extend(Clipperz.PM.UI.Web.Controllers.CardsController, Clipperz.PM.UI.Web.Controllers.GridController, {
40 37
41 'toString': function() { 38 'toString': function() {
42 return "Clipperz.PM.UI.Web.Controllers.CardsController"; 39 return "Clipperz.PM.UI.Web.Controllers.CardsController";
43 }, 40 },
44 41
45 'createGrid': function () { 42 'createGrid': function () {
46 var grid; 43 var grid;
47 44
48 grid = new Clipperz.PM.UI.Web.Components.GridComponent({columnsManagers: [ 45 grid = new Clipperz.PM.UI.Web.Components.GridComponent({columnsManagers: [
49 new Clipperz.PM.UI.Web.Components.FaviconColumnManager({ 46 new Clipperz.PM.UI.Web.Components.FaviconColumnManager({
50 'name': 'Cards.favicon', 47 'name': 'Cards.favicon',
51 'selector': MochiKit.Base.methodcaller('favicon'), 48 'selector': MochiKit.Base.methodcaller('favicon'),
52 'cssClass': 'favicon' 49 'cssClass': 'favicon'
53 }), 50 }),
54 new Clipperz.PM.UI.Web.Components.LinkColumnManager({ 51 new Clipperz.PM.UI.Web.Components.LinkColumnManager({
55 'name': 'Cards.title', 52 'name': 'Cards.title',
56 'selector': MochiKit.Base.methodcaller('label'), 53 'selector': MochiKit.Base.methodcaller('label'),
57 'label': 'title', 54 'label': 'title',
58 'cssClass': 'title', 55 'cssClass': 'title',
59 'comparator': Clipperz.Base.caseInsensitiveCompare, 56 'comparator': Clipperz.Base.caseInsensitiveCompare,
60 'sortable': true, 57 'sortable': true,
61 'sorted': 'ASCENDING', 58 'sorted': 'ASCENDING',
62 // 'actionMethod': function(anObject, anEvent) { MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'editCard', {objectData:anObject, element:anEvent.src()})} 59 // 'actionMethod': function(anObject, anEvent) { MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'editCard', {objectData:anObject, element:anEvent.src()})}
63 'actionMethod': MochiKit.Base.method(this, 'handleShowCard') 60 'actionMethod': MochiKit.Base.method(this, 'handleShowCard')
64 }), 61 }),
65 new Clipperz.PM.UI.Web.Components.DirectLoginsColumnManager({ 62 new Clipperz.PM.UI.Web.Components.DirectLoginsColumnManager({
66 'name': 'Cards.directLogins', 63 'name': 'Cards.directLogins',
67 'selector': MochiKit.Base.methodcaller('directLoginReferences'), 64 'selector': MochiKit.Base.methodcaller('directLoginReferences'),
68 'label': 'direct logins', 65 'label': 'direct logins',
69 'cssClass': 'directLogin' 66 'cssClass': 'directLogin'
70 }), 67 }),
71 new Clipperz.PM.UI.Web.Components.DateColumnManager({ 68 new Clipperz.PM.UI.Web.Components.DateColumnManager({
72 'name': 'Cards.latestUpdate', 69 'name': 'Cards.latestUpdate',
73 'selector': MochiKit.Base.methodcaller('updateDate'), 70 'selector': MochiKit.Base.methodcaller('updateDate'),
74 'label': 'latest update', 71 'label': 'latest update',
75 'cssClass': 'latestUpdate', 72 'cssClass': 'latestUpdate',
76 'format': 'd-m-Y', 73 'format': 'd-m-Y',
77 'comparator': MochiKit.Base.compare, 74 'comparator': MochiKit.Base.compare,
78 'sortable': true, 75 'sortable': true,
79 'sorted': 'UNSORTED' 76 'sorted': 'UNSORTED'
80 }), 77 }),
81 new Clipperz.PM.UI.Web.Components.DeleteObjectColumnManager({ 78 new Clipperz.PM.UI.Web.Components.DeleteObjectColumnManager({
82 'name': 'Cards.delete', 79 'name': 'Cards.delete',
83 'selector': MochiKit.Base.noop, 80 'selector': MochiKit.Base.noop,
84 'cssClass': 'delete', 81 'cssClass': 'delete',
85 // 'actionMethod': function(anObject, anEvent) { MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'deleteCard', {objectData:anObject, element:anEvent.src()})} 82 // 'actionMethod': function(anObject, anEvent) { MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'deleteCard', {objectData:anObject, element:anEvent.src()})}
86 'actionMethod': MochiKit.Base.method(this, 'handleDeleteCard') 83 'actionMethod': MochiKit.Base.method(this, 'handleDeleteCard')
87 }) 84 })
88 ]}); 85 ]});
89 86
90 grid.setComponentForSlotNamed(new Clipperz.PM.UI.Web.Components.BookmarkletComponent(), 'headerSlot'); 87 grid.setComponentForSlotNamed(new Clipperz.PM.UI.Web.Components.BookmarkletComponent(), 'headerSlot');
91 88
92 return grid; 89 return grid;
93 }, 90 },
94 91
95 //----------------------------------------------------------------------------- 92 //-----------------------------------------------------------------------------
96 93
97 'getRows': function () { 94 'getRows': function () {
98 //TODO relying on user() in GridController, bad code smell :| 95 //TODO relying on user() in GridController, bad code smell :|
99 return this.user().getRecords(); 96 return this.user().getRecords();
100 }, 97 },
101 98
102 //============================================================================= 99 //=============================================================================
103 100
104 'displayEmptyContent': function () { 101 'displayEmptyContent': function () {
105 varemptyGridComponent; 102 varemptyGridComponent;
106 103
107 emptyGridComponent = new Clipperz.PM.UI.Web.Components.CreateNewCardSplashComponent(); 104 emptyGridComponent = new Clipperz.PM.UI.Web.Components.CreateNewCardSplashComponent();
108 105
109 return Clipperz.Async.callbacks("CardsController.displayEmptyContent", [ 106 return Clipperz.Async.callbacks("CardsController.displayEmptyContent", [
110 MochiKit.Base.method(this.grid(), 'setNoRowsGridComponent', emptyGridComponent), 107 MochiKit.Base.method(this.grid(), 'setNoRowsGridComponent', emptyGridComponent),
111 MochiKit.Base.bind(Clipperz.PM.UI.Web.Controllers.CardsController.superclass.displayEmptyContent, this) 108 MochiKit.Base.bind(Clipperz.PM.UI.Web.Controllers.CardsController.superclass.displayEmptyContent, this)
112 ], {trace:false}); 109 ], {trace:false});
113 }, 110 },
114 111
115 'displaySelectedRows': function (aFilter) { 112 'displaySelectedRows': function (aFilter) {
116 this.columnManagerWithName('Cards.directLogins').hideDirectLoginListPopup(); 113 this.columnManagerWithName('Cards.directLogins').hideDirectLoginListPopup();
117 114
118 return Clipperz.PM.UI.Web.Controllers.CardsController.superclass.displaySelectedRows.apply(this, arguments); 115 return Clipperz.PM.UI.Web.Controllers.CardsController.superclass.displaySelectedRows.apply(this, arguments);
119 }, 116 },
120 117
121 //============================================================================= 118 //=============================================================================
122 119
123 'handleShowCard': function (anObject, anEvent) { 120 'handleShowCard': function (anObject, anEvent) {
124 var cardDialogController; 121 var cardDialogController;
125 122
126 cardDialogController = new Clipperz.PM.UI.Web.Controllers.CardDialogController({record:anObject, delegate:this}); 123 cardDialogController = new Clipperz.PM.UI.Web.Controllers.CardDialogController({record:anObject, delegate:this});
127 this.grid().selectRow(anObject); 124 this.grid().selectRow(anObject);
128 125
129 cardDialogController.run(anEvent.src()); 126 cardDialogController.run(anEvent.src());
130 }, 127 },
131 128
132 //......................................................................... 129 //.........................................................................
133 130
134 'handleHideCard': function () { 131 'handleHideCard': function () {
135 this.focus(); 132 this.focus();
136 }, 133 },
137 134
138 //----------------------------------------------------------------------------- 135 //-----------------------------------------------------------------------------
139 136
140 'addCard': function (aSourceElement) { 137 'addCard': function (aSourceElement) {
141 return Clipperz.Async.callbacks("CardsController.addCard", [ 138 return Clipperz.Async.callbacks("CardsController.addCard", [
142 Clipperz.Async.collectResults("CardsController.addCard <inner results>", { 139 Clipperz.Async.collectResults("CardsController.addCard <inner results>", {
143 'record': MochiKit.Base.method(this.user(), 'createNewRecord'), 140 'record': MochiKit.Base.method(this.user(), 'createNewRecord'),
144 'delegate':MochiKit.Base.partial(MochiKit.Async.succeed, this) 141 'delegate':MochiKit.Base.partial(MochiKit.Async.succeed, this)
145 }, {trace:false}), 142 }, {trace:false}),
146 function (someParameters) { 143 function (someParameters) {
147 return new Clipperz.PM.UI.Web.Controllers.CardDialogController(someParameters); 144 return new Clipperz.PM.UI.Web.Controllers.CardDialogController(someParameters);
148 }, 145 },
149 MochiKit.Base.methodcaller('run', aSourceElement) 146 MochiKit.Base.methodcaller('run', aSourceElement)
150 ], {trace:false}); 147 ], {trace:false});
151 }, 148 },
152 149
153 //----------------------------------------------------------------------------- 150 //-----------------------------------------------------------------------------
154 151
155 'handleDeleteCard': function (anObject, anEvent) { 152 'handleDeleteCard': function (anObject, anEvent) {
156 var deferredResult; 153 var deferredResult;
157 var confirmationDialog; 154 var confirmationDialog;
158 155
159 // confirmationDialog = new Clipperz.PM.UI.Common.Components.SimpleMessagePanel({ 156 // confirmationDialog = new Clipperz.PM.UI.Common.Components.SimpleMessagePanel({
160 confirmationDialog = new Clipperz.PM.UI.Common.Components.MessagePanelWithProgressBar({ 157 confirmationDialog = new Clipperz.PM.UI.Common.Components.MessagePanelWithProgressBar({
161 'title':"Delete Card", 158 'title':"Delete Card",
162 'text': "Do you want to delete …", 159 'text': "Do you want to delete …",
163 'type': 'ALERT', 160 'type': 'ALERT',
164 'buttons': [ 161 'buttons': [
165 {text:"Cancel",result:'CANCEL'}, 162 {text:"Cancel",result:'CANCEL'},
166 {text:"Delete", result:'OK', isDefault:true} 163 {text:"Delete", result:'OK', isDefault:true}
167 ], 164 ],
168 'canCancelWhileProcessing':false 165 'canCancelWhileProcessing':false
169 }); 166 });
170 167
171 deferredResult = new Clipperz.Async.Deferred("AppController.handleDeleteCard", {trace:false}); 168 deferredResult = new Clipperz.Async.Deferred("AppController.handleDeleteCard", {trace:false});
172 deferredResult.addCallback(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'initProgress', {'steps':5}), 169 deferredResult.addCallback(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'initProgress', {'steps':5}),
173 deferredResult.addMethod(this.grid(), 'selectRow', anObject); 170 deferredResult.addMethod(this.grid(), 'selectRow', anObject);
174 deferredResult.addMethod(confirmationDialog, 'deferredShowModal', { 171 deferredResult.addMethod(confirmationDialog, 'deferredShowModal', {
175 'openFromElement': anEvent.src(), 172 'openFromElement': anEvent.src(),
176 'onOkCloseToElement': null, //MochiKit.DOM.currentDocument().body, 173 'onOkCloseToElement': null, //MochiKit.DOM.currentDocument().body,
177 'onCancelCloseToElement':anEvent.src() 174 'onCancelCloseToElement':anEvent.src()
178 }); 175 });
179 // deferredResult.addCallback(function () { Clipperz.log("DELETE: " + anObject.toString(), anObject); }); 176 // deferredResult.addCallback(function () { Clipperz.log("DELETE: " + anObject.toString(), anObject); });
180 deferredResult.addMethod(this.user(), 'deleteRecord', anObject); 177 deferredResult.addMethod(this.user(), 'deleteRecord', anObject);
181 deferredResult.addBothPass(MochiKit.Base.method(this.grid(), 'unselectRow', anObject)); 178 deferredResult.addBothPass(MochiKit.Base.method(this.grid(), 'unselectRow', anObject));
182 deferredResult.addMethod(this, 'saveChanges'); 179 deferredResult.addMethod(this, 'saveChanges');
183 deferredResult.addMethod(confirmationDialog, 'deferredDone'); 180 deferredResult.addMethod(confirmationDialog, 'deferredDone');
184 deferredResult.addErrbackPass(function (anError) { 181 deferredResult.addErrbackPass(function (anError) {
185 var result; 182 var result;
186 183
187 if (! (anError instanceof MochiKit.Async.CancelledError)) { 184 if (! (anError instanceof MochiKit.Async.CancelledError)) {
188 result = confirmationDialog.deferredError({ 185 result = confirmationDialog.deferredError({
189 'type': 'ALERT', 186 'type': 'ALERT',
190 'title':"Error", 187 'title':"Error",
191 'text': Clipperz.PM.Strings.errorDescriptionForException(anError), 188 'text': Clipperz.PM.Strings.errorDescriptionForException(anError),
192 'buttons':[{text:"Close", result:'CANCEL', isDefault:true}] 189 'buttons':[{text:"Close", result:'CANCEL', isDefault:true}]
193 }) 190 })
194 } else { 191 } else {
195 result = anError; 192 result = anError;
196 } 193 }
197 194
198 return result; 195 return result;
199 }); 196 });
200 deferredResult.callback(); 197 deferredResult.callback();
201 198
202 return deferredResult; 199 return deferredResult;
203 }, 200 },
204 201
205 //============================================================================= 202 //=============================================================================
206 __syntaxFix__: "syntax fix" 203 __syntaxFix__: "syntax fix"
207}); 204});
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 38fdc08..c025a51 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/DirectLoginWizardController.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/DirectLoginWizardController.js
@@ -1,408 +1,405 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers'); 26Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers');
30 27
31Clipperz.PM.UI.Web.Controllers.DirectLoginWizardController = function(args) { 28Clipperz.PM.UI.Web.Controllers.DirectLoginWizardController = function(args) {
32 this._directLoginEditingComponent = args.directLoginEditingComponent|| Clipperz.Base.exception.raise('MandatoryParameter'); 29 this._directLoginEditingComponent = args.directLoginEditingComponent|| Clipperz.Base.exception.raise('MandatoryParameter');
33 this._cardLabel = args.cardLabel || Clipperz.Base.exception.raise('MandatoryParameter'); 30 this._cardLabel = args.cardLabel || Clipperz.Base.exception.raise('MandatoryParameter');
34 31
35 MochiKit.Signal.connect(this._directLoginEditingComponent, 'changedValue',this, 'handleChangedValue'); 32 MochiKit.Signal.connect(this._directLoginEditingComponent, 'changedValue',this, 'handleChangedValue');
36 MochiKit.Signal.connect(this._directLoginEditingComponent, 'moveForward',this, 'handleMoveForward'); 33 MochiKit.Signal.connect(this._directLoginEditingComponent, 'moveForward',this, 'handleMoveForward');
37 MochiKit.Signal.connect(this._directLoginEditingComponent, 'keyPressed',this, 'handleDirectLoginEditingComponentKeyPressed'); 34 MochiKit.Signal.connect(this._directLoginEditingComponent, 'keyPressed',this, 'handleDirectLoginEditingComponentKeyPressed');
38 35
39 this._directLogin = null; 36 this._directLogin = null;
40 this._directLoginHasJustBeenAdded = false; 37 this._directLoginHasJustBeenAdded = false;
41 38
42 this._rulerComponent = null; 39 this._rulerComponent = null;
43 40
44 this._steps = null; 41 this._steps = null;
45 this._currentStepIndex = 0; 42 this._currentStepIndex = 0;
46 this._isNextEnabled = false; 43 this._isNextEnabled = false;
47 44
48 this._recordFields = null; 45 this._recordFields = null;
49 this._originalBindings = null; 46 this._originalBindings = null;
50 47
51 this._bindingComponents = []; 48 this._bindingComponents = [];
52 this._formValueComponents = []; 49 this._formValueComponents = [];
53 50
54 return this; 51 return this;
55} 52}
56 53
57MochiKit.Base.update(Clipperz.PM.UI.Web.Controllers.DirectLoginWizardController.prototype, { 54MochiKit.Base.update(Clipperz.PM.UI.Web.Controllers.DirectLoginWizardController.prototype, {
58 55
59 'toString': function() { 56 'toString': function() {
60 return "Clipperz.PM.UI.Web.Controllers.DirectLoginWizardController"; 57 return "Clipperz.PM.UI.Web.Controllers.DirectLoginWizardController";
61 }, 58 },
62 59
63 //------------------------------------------------------------------------- 60 //-------------------------------------------------------------------------
64 61
65 'directLogin': function () { 62 'directLogin': function () {
66 return this._directLogin; 63 return this._directLogin;
67 }, 64 },
68 65
69 //------------------------------------------------------------------------- 66 //-------------------------------------------------------------------------
70 67
71 'directLoginHasJustBeenAdded': function () { 68 'directLoginHasJustBeenAdded': function () {
72 return this._directLoginHasJustBeenAdded; 69 return this._directLoginHasJustBeenAdded;
73 }, 70 },
74 71
75 'setDirectLoginHasJustBeenAdded': function (aValue) { 72 'setDirectLoginHasJustBeenAdded': function (aValue) {
76 this._directLoginHasJustBeenAdded = aValue; 73 this._directLoginHasJustBeenAdded = aValue;
77 }, 74 },
78 75
79 //------------------------------------------------------------------------- 76 //-------------------------------------------------------------------------
80 77
81 'directLoginEditingComponent': function () { 78 'directLoginEditingComponent': function () {
82 return this._directLoginEditingComponent; 79 return this._directLoginEditingComponent;
83 }, 80 },
84 81
85 //============================================================================= 82 //=============================================================================
86 83
87 'cardLabel': function () { 84 'cardLabel': function () {
88 return this._cardLabel; 85 return this._cardLabel;
89 }, 86 },
90 87
91 //============================================================================= 88 //=============================================================================
92 89
93 'resetCurrentStepIndex': function () { 90 'resetCurrentStepIndex': function () {
94 this._currentStepIndex = 0; 91 this._currentStepIndex = 0;
95 this.rulerComponent().resetStatus(); 92 this.rulerComponent().resetStatus();
96 }, 93 },
97 94
98 //----------------------------------------------------------------------------- 95 //-----------------------------------------------------------------------------
99 96
100 'enableNext': function (aValue) { 97 'enableNext': function (aValue) {
101 this.rulerComponent().enableNext(aValue); 98 this.rulerComponent().enableNext(aValue);
102 this._isNextEnabled = aValue; 99 this._isNextEnabled = aValue;
103 }, 100 },
104 101
105 'isNextEnabled': function () { 102 'isNextEnabled': function () {
106 return this._isNextEnabled; 103 return this._isNextEnabled;
107 }, 104 },
108 105
109 //----------------------------------------------------------------------------- 106 //-----------------------------------------------------------------------------
110 107
111 'enablePrevious': function (aValue) { 108 'enablePrevious': function (aValue) {
112 this.rulerComponent().enablePrevious(aValue); 109 this.rulerComponent().enablePrevious(aValue);
113 }, 110 },
114 111
115 //============================================================================= 112 //=============================================================================
116 113
117 'bindingComponents': function () { 114 'bindingComponents': function () {
118 return this._bindingComponents; 115 return this._bindingComponents;
119 }, 116 },
120 117
121 'resetBindingComponents': function () { 118 'resetBindingComponents': function () {
122 this.directLoginEditingComponent().clearAllBindingsComponents(); 119 this.directLoginEditingComponent().clearAllBindingsComponents();
123 this._bindingComponents = []; 120 this._bindingComponents = [];
124 }, 121 },
125 122
126 //============================================================================= 123 //=============================================================================
127 124
128 'formValueComponents': function () { 125 'formValueComponents': function () {
129 return this._formValueComponents; 126 return this._formValueComponents;
130 }, 127 },
131 128
132 'resetFormValueComponents': function () { 129 'resetFormValueComponents': function () {
133 this.directLoginEditingComponent().clearAllFormValueComponents(); 130 this.directLoginEditingComponent().clearAllFormValueComponents();
134 this._formValueComponents = []; 131 this._formValueComponents = [];
135 }, 132 },
136 133
137 //============================================================================= 134 //=============================================================================
138 135
139 'recordFields': function () { 136 'recordFields': function () {
140 return this._recordFields; 137 return this._recordFields;
141 }, 138 },
142 139
143 'setRecordFields': function (aValue) { 140 'setRecordFields': function (aValue) {
144 this._recordFields = aValue; 141 this._recordFields = aValue;
145 }, 142 },
146 143
147 'recordFieldWithReference': function (aReference) { 144 'recordFieldWithReference': function (aReference) {
148 var matchingValues; 145 var matchingValues;
149 var result; 146 var result;
150 147
151 matchingValues = MochiKit.Base.filter(function (aField) { return aField['reference'] == aReference; }, this.recordFields()); 148 matchingValues = MochiKit.Base.filter(function (aField) { return aField['reference'] == aReference; }, this.recordFields());
152 149
153 if (matchingValues.length == 0) { 150 if (matchingValues.length == 0) {
154 result = null; 151 result = null;
155 } else { 152 } else {
156 result = matchingValues[0]; 153 result = matchingValues[0];
157 } 154 }
158 155
159 return result; 156 return result;
160 }, 157 },
161 158
162 //----------------------------------------------------------------------------- 159 //-----------------------------------------------------------------------------
163 160
164 'originalBindings': function () { 161 'originalBindings': function () {
165 return this._originalBindings; 162 return this._originalBindings;
166 }, 163 },
167 164
168 'setOriginalBindings': function (aValue) { 165 'setOriginalBindings': function (aValue) {
169//console.log("BINDINGS", aValue); 166//console.log("BINDINGS", aValue);
170 this._originalBindings = aValue; 167 this._originalBindings = aValue;
171 }, 168 },
172 169
173 //============================================================================= 170 //=============================================================================
174 171
175 'rulerComponent': function () { 172 'rulerComponent': function () {
176 if (this._rulerComponent == null) { 173 if (this._rulerComponent == null) {
177 this._rulerComponent = new Clipperz.PM.UI.Web.Components.RulerComponent({ 174 this._rulerComponent = new Clipperz.PM.UI.Web.Components.RulerComponent({
178 translationContext:'Wizards.DirectLoginWizard' 175 translationContext:'Wizards.DirectLoginWizard'
179 }); 176 });
180 this._rulerComponent.render(); 177 this._rulerComponent.render();
181 178
182 MochiKit.Signal.connect(this._rulerComponent, 'exit', this, 'handleExit'); 179 MochiKit.Signal.connect(this._rulerComponent, 'exit', this, 'handleExit');
183 MochiKit.Signal.connect(this._rulerComponent, 'done', this, 'done'); 180 MochiKit.Signal.connect(this._rulerComponent, 'done', this, 'done');
184 MochiKit.Signal.connect(this._rulerComponent, 'moveForward',this, 'handleMoveForward'); 181 MochiKit.Signal.connect(this._rulerComponent, 'moveForward',this, 'handleMoveForward');
185 MochiKit.Signal.connect(this._rulerComponent, 'moveBackward',this, 'handleMoveBackward'); 182 MochiKit.Signal.connect(this._rulerComponent, 'moveBackward',this, 'handleMoveBackward');
186 MochiKit.Signal.connect(this._rulerComponent, 'cursorMoved',this, 'handleCursorMoved'); 183 MochiKit.Signal.connect(this._rulerComponent, 'cursorMoved',this, 'handleCursorMoved');
187 } 184 }
188 185
189 return this._rulerComponent; 186 return this._rulerComponent;
190 }, 187 },
191 188
192 //----------------------------------------------------------------------------- 189 //-----------------------------------------------------------------------------
193 190
194 'showRuler': function (someSteps) { 191 'showRuler': function (someSteps) {
195 var rulerElement; 192 var rulerElement;
196 193
197 this.setSteps(someSteps); 194 this.setSteps(someSteps);
198 195
199 rulerElement = this.rulerComponent().element(); 196 rulerElement = this.rulerComponent().element();
200 this.directLoginEditingComponent().disableAllPanels(); 197 this.directLoginEditingComponent().disableAllPanels();
201 198
202 MochiKit.Style.showElement(rulerElement); 199 MochiKit.Style.showElement(rulerElement);
203 MochiKit.Style.setElementPosition(rulerElement, {x:-1000, y:this.directLoginEditingComponent().bottomMargin()}); 200 MochiKit.Style.setElementPosition(rulerElement, {x:-1000, y:this.directLoginEditingComponent().bottomMargin()});
204 new MochiKit.Visual.Move(rulerElement, { 201 new MochiKit.Visual.Move(rulerElement, {
205 x:0, y:this.directLoginEditingComponent().bottomMargin(), 202 x:0, y:this.directLoginEditingComponent().bottomMargin(),
206 mode:'absolute', 203 mode:'absolute',
207 duration:1, 204 duration:1,
208 afterFinish:MochiKit.Base.method(this, 'handleCursorMoved') 205 afterFinish:MochiKit.Base.method(this, 'handleCursorMoved')
209 }); 206 });
210 }, 207 },
211 208
212 'fixRulerRendering': function (aValue) { 209 'fixRulerRendering': function (aValue) {
213 this.rulerComponent().setDisplayMode(aValue); 210 this.rulerComponent().setDisplayMode(aValue);
214 }, 211 },
215 212
216 //----------------------------------------------------------------------------- 213 //-----------------------------------------------------------------------------
217 214
218 'hideRuler': function () { 215 'hideRuler': function () {
219 new MochiKit.Visual.Move(this.rulerComponent().element(), {x:-1000, mode:'relative', duration:1}); 216 new MochiKit.Visual.Move(this.rulerComponent().element(), {x:-1000, mode:'relative', duration:1});
220 }, 217 },
221 218
222 'doneWithRuler': function () { 219 'doneWithRuler': function () {
223 var rulerComponentElement; 220 var rulerComponentElement;
224 221
225 rulerComponentElement = this.rulerComponent().element(); 222 rulerComponentElement = this.rulerComponent().element();
226 new MochiKit.Visual.Move(this.rulerComponent().element(), { 223 new MochiKit.Visual.Move(this.rulerComponent().element(), {
227 x:1000, 224 x:1000,
228 mode:'relative', 225 mode:'relative',
229 duration:1, 226 duration:1,
230 // afterFinish:MochiKit.Base.partial(MochiKit.Style.hideElement, rulerComponentElement) 227 // afterFinish:MochiKit.Base.partial(MochiKit.Style.hideElement, rulerComponentElement)
231 afterFinish:function () { MochiKit.Style.hideElement(rulerComponentElement); } 228 afterFinish:function () { MochiKit.Style.hideElement(rulerComponentElement); }
232 }); 229 });
233 }, 230 },
234 231
235 //============================================================================= 232 //=============================================================================
236 233
237 'addNewDirectLoginRulerSteps': function () { 234 'addNewDirectLoginRulerSteps': function () {
238 return MochiKit.Base.concat([ 'LABEL'], this.editDirectLoginRulerSteps()); 235 return MochiKit.Base.concat([ 'LABEL'], this.editDirectLoginRulerSteps());
239 236
240 }, 237 },
241 238
242 'editDirectLoginRulerSteps': function () { 239 'editDirectLoginRulerSteps': function () {
243 return [ /*'TYPE',*/ 'CONFIGURATION', 'BINDINGS','FAVICON', 'DONE']; 240 return [ /*'TYPE',*/ 'CONFIGURATION', 'BINDINGS','FAVICON', 'DONE'];
244 }, 241 },
245 242
246 //------------------------------------------------------------------------- 243 //-------------------------------------------------------------------------
247 244
248 'runWithDirectLogin': function (aDirectLogin, hasJustBeenAdded) { 245 'runWithDirectLogin': function (aDirectLogin, hasJustBeenAdded) {
249 this._directLogin = aDirectLogin; 246 this._directLogin = aDirectLogin;
250 this.setDirectLoginHasJustBeenAdded(hasJustBeenAdded); 247 this.setDirectLoginHasJustBeenAdded(hasJustBeenAdded);
251 248
252 return Clipperz.Async.callbacks("DirectLoginWizardController.runWithDirectLogin", [ 249 return Clipperz.Async.callbacks("DirectLoginWizardController.runWithDirectLogin", [
253 MochiKit.Base.method(aDirectLogin, 'label'), 250 MochiKit.Base.method(aDirectLogin, 'label'),
254 MochiKit.Base.method(this.directLoginEditingComponent(), 'setLabel'), 251 MochiKit.Base.method(this.directLoginEditingComponent(), 'setLabel'),
255 252
256 MochiKit.Base.method(aDirectLogin, 'favicon'), 253 MochiKit.Base.method(aDirectLogin, 'favicon'),
257 MochiKit.Base.method(this.directLoginEditingComponent(), 'setDirectLoginFavicon'), 254 MochiKit.Base.method(this.directLoginEditingComponent(), 'setDirectLoginFavicon'),
258 255
259 MochiKit.Base.method(aDirectLogin, 'bookmarkletConfiguration'), 256 MochiKit.Base.method(aDirectLogin, 'bookmarkletConfiguration'),
260 MochiKit.Base.method(this.directLoginEditingComponent(), 'setBookmarkletConfiguration'), 257 MochiKit.Base.method(this.directLoginEditingComponent(), 'setBookmarkletConfiguration'),
261 258
262 MochiKit.Base.method(aDirectLogin, 'bindings'), 259 MochiKit.Base.method(aDirectLogin, 'bindings'),
263 MochiKit.Base.method(this, 'setOriginalBindings'), 260 MochiKit.Base.method(this, 'setOriginalBindings'),
264 261
265 MochiKit.Base.method(aDirectLogin, 'record'), 262 MochiKit.Base.method(aDirectLogin, 'record'),
266 MochiKit.Base.methodcaller('fields'), 263 MochiKit.Base.methodcaller('fields'),
267 MochiKit.Base.values, 264 MochiKit.Base.values,
268 MochiKit.Base.partial(MochiKit.Base.map, Clipperz.Async.collectResults("Record.directLoginReferences - collectResults", { 265 MochiKit.Base.partial(MochiKit.Base.map, Clipperz.Async.collectResults("Record.directLoginReferences - collectResults", {
269 'reference': MochiKit.Base.methodcaller('reference'), 266 'reference': MochiKit.Base.methodcaller('reference'),
270 'label': MochiKit.Base.methodcaller('label'), 267 'label': MochiKit.Base.methodcaller('label'),
271 'isHidden': MochiKit.Base.methodcaller('isHidden'), 268 'isHidden': MochiKit.Base.methodcaller('isHidden'),
272 'value': MochiKit.Base.methodcaller('value') 269 'value': MochiKit.Base.methodcaller('value')
273 }, {trace:false})), 270 }, {trace:false})),
274 Clipperz.Async.collectAll, 271 Clipperz.Async.collectAll,
275 272
276 MochiKit.Base.method(this, 'setRecordFields'), 273 MochiKit.Base.method(this, 'setRecordFields'),
277 274
278 MochiKit.Base.partial(MochiKit.Async.succeed, hasJustBeenAdded), 275 MochiKit.Base.partial(MochiKit.Async.succeed, hasJustBeenAdded),
279 Clipperz.Async.deferredIf("Direct login has just been added", [ 276 Clipperz.Async.deferredIf("Direct login has just been added", [
280 MochiKit.Base.method(this, 'addNewDirectLoginRulerSteps') 277 MochiKit.Base.method(this, 'addNewDirectLoginRulerSteps')
281 ], [ 278 ], [
282 MochiKit.Base.method(this, 'editDirectLoginRulerSteps') 279 MochiKit.Base.method(this, 'editDirectLoginRulerSteps')
283 ]), 280 ]),
284 MochiKit.Base.method(this, 'showRuler') 281 MochiKit.Base.method(this, 'showRuler')
285 ], {trace:false}); 282 ], {trace:false});
286 }, 283 },
287 284
288 //----------------------------------------------------------------------------- 285 //-----------------------------------------------------------------------------
289 286
290 'checkState': function () { 287 'checkState': function () {
291 var enablePrevious; 288 var enablePrevious;
292 var enableNext; 289 var enableNext;
293 290
294 enablePrevious = true; 291 enablePrevious = true;
295 enableNext = false; 292 enableNext = false;
296 293
297 this.directLoginEditingComponent().disableAllPanels(); 294 this.directLoginEditingComponent().disableAllPanels();
298 295
299 switch(this.currentStep()) { 296 switch(this.currentStep()) {
300 case 'LABEL': 297 case 'LABEL':
301 this.directLoginEditingComponent().enableLabelField(); 298 this.directLoginEditingComponent().enableLabelField();
302 299
303 enableNext = (this.directLoginEditingComponent().label() != ''); 300 enableNext = (this.directLoginEditingComponent().label() != '');
304 enablePrevious = false; 301 enablePrevious = false;
305 break; 302 break;
306 case 'TYPE': 303 case 'TYPE':
307 this.directLoginEditingComponent().enableTypeField(); 304 this.directLoginEditingComponent().enableTypeField();
308 305
309 enableNext = true; 306 enableNext = true;
310 enablePrevious = true; 307 enablePrevious = true;
311 break 308 break
312 case 'CONFIGURATION': 309 case 'CONFIGURATION':
313 this.directLoginEditingComponent().enableConfigurationField(); 310 this.directLoginEditingComponent().enableConfigurationField();
314 311
315 enableNext = (this.directLoginEditingComponent().bookmarkletConfiguration() != ''); 312 enableNext = (this.directLoginEditingComponent().bookmarkletConfiguration() != '');
316 313
317 if (enableNext == true) { 314 if (enableNext == true) {
318 try { 315 try {
319 Clipperz.PM.DataModel.DirectLogin.checkBookmarkletConfiguration(this.directLoginEditingComponent().bookmarkletConfiguration()); 316 Clipperz.PM.DataModel.DirectLogin.checkBookmarkletConfiguration(this.directLoginEditingComponent().bookmarkletConfiguration());
320 this.directLoginEditingComponent().removeHighlightConfigurationSyntaxError(); 317 this.directLoginEditingComponent().removeHighlightConfigurationSyntaxError();
321 } catch (e) { 318 } catch (e) {
322 this.directLoginEditingComponent().highlightConfigurationSyntaxError(); 319 this.directLoginEditingComponent().highlightConfigurationSyntaxError();
323 enableNext = false; 320 enableNext = false;
324 } 321 }
325 } 322 }
326 break; 323 break;
327 case 'BINDINGS': 324 case 'BINDINGS':
328 enableNext = MochiKit.Iter.every(this.bindingComponents(), function (aBindingComponent) { return aBindingComponent.selectedValue() != null; }) 325 enableNext = MochiKit.Iter.every(this.bindingComponents(), function (aBindingComponent) { return aBindingComponent.selectedValue() != null; })
329 this.directLoginEditingComponent().enableBindingFields(); 326 this.directLoginEditingComponent().enableBindingFields();
330 break; 327 break;
331 case 'FAVICON': 328 case 'FAVICON':
332 enableNext = true; 329 enableNext = true;
333 this.directLoginEditingComponent().enableFaviconField(); 330 this.directLoginEditingComponent().enableFaviconField();
334 break; 331 break;
335 case 'DONE': 332 case 'DONE':
336 enableNext = true; 333 enableNext = true;
337 this.directLoginEditingComponent().enableDonePanel(); 334 this.directLoginEditingComponent().enableDonePanel();
338 break; 335 break;
339 } 336 }
340 337
341 if (this.currentStepIndex() > 0) { 338 if (this.currentStepIndex() > 0) {
342 this.enablePrevious(enablePrevious); 339 this.enablePrevious(enablePrevious);
343 } else { 340 } else {
344 this.enablePrevious(false); 341 this.enablePrevious(false);
345 } 342 }
346 this.enableNext(enableNext); 343 this.enableNext(enableNext);
347 }, 344 },
348 345
349 //----------------------------------------------------------------------------- 346 //-----------------------------------------------------------------------------
350 347
351 'setFocus': function () { 348 'setFocus': function () {
352 switch(this.currentStep()) { 349 switch(this.currentStep()) {
353 case 'LABEL': 350 case 'LABEL':
354 this.directLoginEditingComponent().focusOnLabelElement(); 351 this.directLoginEditingComponent().focusOnLabelElement();
355 break; 352 break;
356 case 'TYPE': 353 case 'TYPE':
357 break; 354 break;
358 case 'CONFIGURATION': 355 case 'CONFIGURATION':
359 this.directLoginEditingComponent().focusOnBookmarkletConfigurationElement(); 356 this.directLoginEditingComponent().focusOnBookmarkletConfigurationElement();
360 break; 357 break;
361 case 'BINDINGS': 358 case 'BINDINGS':
362 // this.directLoginEditingComponent().getElement('???').focus(); 359 // this.directLoginEditingComponent().getElement('???').focus();
363 break; 360 break;
364 case 'FAVICON': 361 case 'FAVICON':
365 this.directLoginEditingComponent().focusOnFaviconElement(); 362 this.directLoginEditingComponent().focusOnFaviconElement();
366 break; 363 break;
367 case 'DONE': 364 case 'DONE':
368 break; 365 break;
369 } 366 }
370 }, 367 },
371 368
372 //============================================================================= 369 //=============================================================================
373 370
374 'steps': function () { 371 'steps': function () {
375 return this._steps; 372 return this._steps;
376 }, 373 },
377 374
378 'setSteps': function (aValue) { 375 'setSteps': function (aValue) {
379 this._steps = aValue; 376 this._steps = aValue;
380 377
381 this.rulerComponent().setSteps(aValue); 378 this.rulerComponent().setSteps(aValue);
382 this.resetCurrentStepIndex(); 379 this.resetCurrentStepIndex();
383 }, 380 },
384 381
385 'currentStepIndex': function () { 382 'currentStepIndex': function () {
386 return this._currentStepIndex; 383 return this._currentStepIndex;
387 }, 384 },
388 385
389 'currentStep': function () { 386 'currentStep': function () {
390 return this.steps()[this.currentStepIndex()]; 387 return this.steps()[this.currentStepIndex()];
391 }, 388 },
392 389
393 //============================================================================= 390 //=============================================================================
394 391
395 'handleExit': function () { 392 'handleExit': function () {
396 MochiKit.Signal.signal(this, 'exit'); 393 MochiKit.Signal.signal(this, 'exit');
397 }, 394 },
398 395
399 'done': function () { 396 'done': function () {
400 this.doneWithRuler(); 397 this.doneWithRuler();
401 398
402 Clipperz.Async.callbacks("DirectLoginWizardController.done", [ 399 Clipperz.Async.callbacks("DirectLoginWizardController.done", [
403 MochiKit.Base.method(this.directLoginEditingComponent(), 'label'), 400 MochiKit.Base.method(this.directLoginEditingComponent(), 'label'),
404 MochiKit.Base.method(this.directLogin(), 'setLabel'), 401 MochiKit.Base.method(this.directLogin(), 'setLabel'),
405 402
406 MochiKit.Base.method(this.directLoginEditingComponent(), 'bookmarkletConfiguration'), 403 MochiKit.Base.method(this.directLoginEditingComponent(), 'bookmarkletConfiguration'),
407 MochiKit.Base.method(this.directLogin(), 'setBookmarkletConfiguration'), 404 MochiKit.Base.method(this.directLogin(), 'setBookmarkletConfiguration'),
408 405
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 28401a2..6ca3be4 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/DirectLoginsController.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/DirectLoginsController.js
@@ -1,145 +1,142 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29/* 26/*
30Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers'); 27Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers');
31 28
32Clipperz.PM.UI.Web.Controllers.DirectLoginsController = function() { 29Clipperz.PM.UI.Web.Controllers.DirectLoginsController = function() {
33 Clipperz.PM.UI.Web.Controllers.DirectLoginsController.superclass.constructor.apply(this, arguments); 30 Clipperz.PM.UI.Web.Controllers.DirectLoginsController.superclass.constructor.apply(this, arguments);
34 31
35 return this; 32 return this;
36}; 33};
37 34
38Clipperz.Base.extend(Clipperz.PM.UI.Web.Controllers.DirectLoginsController, Clipperz.PM.UI.Web.Controllers.GridController, { 35Clipperz.Base.extend(Clipperz.PM.UI.Web.Controllers.DirectLoginsController, Clipperz.PM.UI.Web.Controllers.GridController, {
39 36
40 'createGrid': function () { 37 'createGrid': function () {
41 return new Clipperz.PM.UI.Web.Components.GridComponent({columnsManagers: [ 38 return new Clipperz.PM.UI.Web.Components.GridComponent({columnsManagers: [
42 new Clipperz.PM.UI.Web.Components.FaviconColumnManager({ 39 new Clipperz.PM.UI.Web.Components.FaviconColumnManager({
43 'name': 'DirectLogins.favicon', 40 'name': 'DirectLogins.favicon',
44 'selector': MochiKit.Base.methodcaller('favicon'), 41 'selector': MochiKit.Base.methodcaller('favicon'),
45 'cssClass': 'favicon' 42 'cssClass': 'favicon'
46 }), 43 }),
47 // new Clipperz.PM.UI.Web.Components.LinkColumnManager({ 44 // new Clipperz.PM.UI.Web.Components.LinkColumnManager({
48 new Clipperz.PM.UI.Web.Components.DirectLoginColumnManager({ 45 new Clipperz.PM.UI.Web.Components.DirectLoginColumnManager({
49 'name': 'DirectLogins.title', 46 'name': 'DirectLogins.title',
50 'selector': MochiKit.Base.methodcaller('label'), 47 'selector': MochiKit.Base.methodcaller('label'),
51 'label': 'title', 48 'label': 'title',
52 'cssClass': 'title', 49 'cssClass': 'title',
53 'comparator': Clipperz.Base.caseInsensitiveCompare, 50 'comparator': Clipperz.Base.caseInsensitiveCompare,
54 'sortable': true, 51 'sortable': true,
55 'sorted': 'ASCENDING', 52 'sorted': 'ASCENDING',
56 'actionMethod': MochiKit.Base.methodcaller('runDirectLogin') 53 'actionMethod': MochiKit.Base.methodcaller('runDirectLogin')
57 }), 54 }),
58 // new Clipperz.PM.UI.Web.Components.TextColumnManager({ //should be StrengthColumnManager 55 // new Clipperz.PM.UI.Web.Components.TextColumnManager({ //should be StrengthColumnManager
59 // 'label':'strength', 56 // 'label':'strength',
60 // 'cssClass':'title', 57 // 'cssClass':'title',
61 // 'selector': MochiKit.Base.methodcaller('label') //should be 'strength' or a strenght evaluation function 58 // 'selector': MochiKit.Base.methodcaller('label') //should be 'strength' or a strenght evaluation function
62 // }), 59 // }),
63 new Clipperz.PM.UI.Web.Components.LinkColumnManager({ 60 new Clipperz.PM.UI.Web.Components.LinkColumnManager({
64 'name': 'DirectLogins.cardTitle', 61 'name': 'DirectLogins.cardTitle',
65 'selector': MochiKit.Base.compose(MochiKit.Base.methodcaller('label'), MochiKit.Base.methodcaller('record')), 62 'selector': MochiKit.Base.compose(MochiKit.Base.methodcaller('label'), MochiKit.Base.methodcaller('record')),
66 'label': 'card', 63 'label': 'card',
67 'cssClass': 'cardTitle', 64 'cssClass': 'cardTitle',
68 'comparator': Clipperz.Base.caseInsensitiveCompare, 65 'comparator': Clipperz.Base.caseInsensitiveCompare,
69 'sortable': true, 66 'sortable': true,
70 'sorted': 'UNSORTED', 67 'sorted': 'UNSORTED',
71 'actionMethod': MochiKit.Base.method(this, 'handleShowCard') 68 'actionMethod': MochiKit.Base.method(this, 'handleShowCard')
72 }), 69 }),
73 // new Clipperz.PM.UI.Web.Components.TextColumnManager({ //should be StrengthColumnManager 70 // new Clipperz.PM.UI.Web.Components.TextColumnManager({ //should be StrengthColumnManager
74 // 'label':'last access', 71 // 'label':'last access',
75 // 'cssClass':'title', 72 // 'cssClass':'title',
76 // 'selector': MochiKit.Base.methodcaller('label') 73 // 'selector': MochiKit.Base.methodcaller('label')
77 // // 'sortable': true, 74 // // 'sortable': true,
78 // // 'sorted': 'UNSORTED' 75 // // 'sorted': 'UNSORTED'
79 // }), 76 // }),
80 // new Clipperz.PM.UI.Web.Components.TextColumnManager({ 77 // new Clipperz.PM.UI.Web.Components.TextColumnManager({
81 // 'label':'commands', 78 // 'label':'commands',
82 // 'cssClass':'title', 79 // 'cssClass':'title',
83 // 'selector': MochiKit.Base.methodcaller('label'), //should be a function for commands display 80 // 'selector': MochiKit.Base.methodcaller('label'), //should be a function for commands display
84 // }), 81 // }),
85 new Clipperz.PM.UI.Web.Components.DeleteObjectColumnManager({ 82 new Clipperz.PM.UI.Web.Components.DeleteObjectColumnManager({
86 'name': 'DirectLogins.delete', 83 'name': 'DirectLogins.delete',
87 'selector': MochiKit.Base.noop, 84 'selector': MochiKit.Base.noop,
88 'cssClass': 'delete', 85 'cssClass': 'delete',
89 // 'actionMethod': function(anObject, anEvent) { MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'deleteDirectLogin', {objectData:anObject, element:anEvent.src()})} 86 // 'actionMethod': function(anObject, anEvent) { MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'deleteDirectLogin', {objectData:anObject, element:anEvent.src()})}
90 'actionMethod': MochiKit.Base.method(this, 'handleDeleteDirectLogin') 87 'actionMethod': MochiKit.Base.method(this, 'handleDeleteDirectLogin')
91 }) 88 })
92 ]}); 89 ]});
93 90
94 }, 91 },
95 92
96 //----------------------------------------------------------------------------- 93 //-----------------------------------------------------------------------------
97 94
98 'getRows': function () { 95 'getRows': function () {
99 //TODO: relying on user() in GridController, bad code smell :| 96 //TODO: relying on user() in GridController, bad code smell :|
100 return this.user().getDirectLogins(); 97 return this.user().getDirectLogins();
101 }, 98 },
102 99
103 //----------------------------------------------------------------------------- 100 //-----------------------------------------------------------------------------
104 101
105 'handleShowCard': function (anObject, anEvent) { 102 'handleShowCard': function (anObject, anEvent) {
106 var cardDialogController; 103 var cardDialogController;
107 104
108 cardDialogController = new Clipperz.PM.UI.Web.Controllers.CardDialogController({record:anObject.record()}) 105 cardDialogController = new Clipperz.PM.UI.Web.Controllers.CardDialogController({record:anObject.record()})
109 cardDialogController.run(anEvent.src()); 106 cardDialogController.run(anEvent.src());
110 }, 107 },
111 108
112 //----------------------------------------------------------------------------- 109 //-----------------------------------------------------------------------------
113 110
114 'handleDeleteDirectLogin': function (anObject, anEvent) { 111 'handleDeleteDirectLogin': function (anObject, anEvent) {
115 var deferredResult; 112 var deferredResult;
116 var confirmationDialog; 113 var confirmationDialog;
117 114
118 confirmationDialog = new Clipperz.PM.UI.Common.Components.SimpleMessagePanel({ 115 confirmationDialog = new Clipperz.PM.UI.Common.Components.SimpleMessagePanel({
119 title:"Delete DirectLogin", 116 title:"Delete DirectLogin",
120 text:"Do you want to delete …", 117 text:"Do you want to delete …",
121 type:'ALERT', 118 type:'ALERT',
122 buttons: [ 119 buttons: [
123 {text:"Cancel",result:'CANCEL', isDefault:true}, 120 {text:"Cancel",result:'CANCEL', isDefault:true},
124 {text:"Delete", result:'OK'} 121 {text:"Delete", result:'OK'}
125 ] 122 ]
126 }); 123 });
127 124
128 deferredResult = new Clipperz.Async.Deferred("AppController.handleDeleteCard", {trace:false}); 125 deferredResult = new Clipperz.Async.Deferred("AppController.handleDeleteCard", {trace:false});
129 // deferredResult = confirmationDialog.deferredShow({openFromElement:anEvent.src(), onOkCloseToElement:MochiKit.DOM.currentDocument().body, onCancelCloseToElement:anEvent.src()}); 126 // deferredResult = confirmationDialog.deferredShow({openFromElement:anEvent.src(), onOkCloseToElement:MochiKit.DOM.currentDocument().body, onCancelCloseToElement:anEvent.src()});
130 deferredResult.addMethod(confirmationDialog, 'deferredShow', { 127 deferredResult.addMethod(confirmationDialog, 'deferredShow', {
131 'openFromElement': anEvent.src(), 128 'openFromElement': anEvent.src(),
132 'onOkCloseToElement': null, //MochiKit.DOM.currentDocument().body, 129 'onOkCloseToElement': null, //MochiKit.DOM.currentDocument().body,
133 'onCancelCloseToElement':anEvent.src() 130 'onCancelCloseToElement':anEvent.src()
134 }); 131 });
135 deferredResult.addCallback(function () { Clipperz.log("DELETE: " + anObject.toString(), anObject); }); 132 deferredResult.addCallback(function () { Clipperz.log("DELETE: " + anObject.toString(), anObject); });
136 deferredResult.addErrbackPass(function () { Clipperz.log("skip deletion: " + anObject.toString(), anObject); }); 133 deferredResult.addErrbackPass(function () { Clipperz.log("skip deletion: " + anObject.toString(), anObject); });
137 deferredResult.callback(); 134 deferredResult.callback();
138 135
139 return deferredResult; 136 return deferredResult;
140 }, 137 },
141 138
142 //----------------------------------------------------------------------------- 139 //-----------------------------------------------------------------------------
143 __syntaxFix__: "syntax fix" 140 __syntaxFix__: "syntax fix"
144}); 141});
145*/ \ No newline at end of file 142*/ \ No newline at end of file
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 13e02bc..bfc093a 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/FilterController.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/FilterController.js
@@ -1,158 +1,155 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers'); 26Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers');
30 27
31Clipperz.PM.UI.Web.Controllers.FilterController = function(args) { 28Clipperz.PM.UI.Web.Controllers.FilterController = function(args) {
32 args = args || {}; 29 args = args || {};
33 30
34 Clipperz.PM.UI.Web.Controllers.FilterController.superclass.constructor.call(this, args); 31 Clipperz.PM.UI.Web.Controllers.FilterController.superclass.constructor.call(this, args);
35 32
36 this._filterElements = []; 33 this._filterElements = [];
37 this._filter = ""; 34 this._filter = "";
38 35
39 this._pendingSearchClicks = 0; 36 this._pendingSearchClicks = 0;
40 37
41 return this; 38 return this;
42}; 39};
43 40
44 41
45Clipperz.Base.extend(Clipperz.PM.UI.Web.Controllers.FilterController, Object, { 42Clipperz.Base.extend(Clipperz.PM.UI.Web.Controllers.FilterController, Object, {
46 43
47 //----------------------------------------------------------------------------- 44 //-----------------------------------------------------------------------------
48 45
49 'getFilter': function () { 46 'getFilter': function () {
50 return this._filter; 47 return this._filter;
51 }, 48 },
52 49
53 '_setFilter': function (aFilterElement, aFilter) { 50 '_setFilter': function (aFilterElement, aFilter) {
54 if (aFilter != this._filter) { 51 if (aFilter != this._filter) {
55 this._filter = aFilter; 52 this._filter = aFilter;
56 MochiKit.Signal.signal(this, 'filterUpdated', aFilter); 53 MochiKit.Signal.signal(this, 'filterUpdated', aFilter);
57 this.updateFilterElements(aFilterElement, aFilter); 54 this.updateFilterElements(aFilterElement, aFilter);
58 } 55 }
59 }, 56 },
60 57
61 'setFilter': function (aFilter) { 58 'setFilter': function (aFilter) {
62 this._setFilter(null, aFilter); 59 this._setFilter(null, aFilter);
63 }, 60 },
64 61
65 //----------------------------------------------------------------------------- 62 //-----------------------------------------------------------------------------
66 63
67 'filterElements': function () { 64 'filterElements': function () {
68 return this._filterElements; 65 return this._filterElements;
69 }, 66 },
70 67
71 'registerFilterElement': function (aFilterElement) { 68 'registerFilterElement': function (aFilterElement) {
72//Clipperz.log("=== FilterController.registerFilterElement", aFilterElement); 69//Clipperz.log("=== FilterController.registerFilterElement", aFilterElement);
73 this._filterElements.push(aFilterElement); 70 this._filterElements.push(aFilterElement);
74 MochiKit.Signal.connect(aFilterElement, 'onkeydown', this, 'searchClickHandler'); 71 MochiKit.Signal.connect(aFilterElement, 'onkeydown', this, 'searchClickHandler');
75 MochiKit.Signal.connect(aFilterElement, 'onfocus', this, 'searchClickHandler'); 72 MochiKit.Signal.connect(aFilterElement, 'onfocus', this, 'searchClickHandler');
76 }, 73 },
77 74
78 'removeFilterElement': function (aFilterElement) { 75 'removeFilterElement': function (aFilterElement) {
79 var i; 76 var i;
80 var filterElements; 77 var filterElements;
81 for (i=0; i < filterElements; i++) { 78 for (i=0; i < filterElements; i++) {
82 if (filterElements[i] == aFilterElement); 79 if (filterElements[i] == aFilterElement);
83 filterElements.splice(i, 1); 80 filterElements.splice(i, 1);
84 // TODO unregister/disconnect filterElement ??MochiKit.Signal.disconnect(this.grid().filterElement(), 'updateFilter', this.filterController(), 'handleUpdateFilter'); 81 // TODO unregister/disconnect filterElement ??MochiKit.Signal.disconnect(this.grid().filterElement(), 'updateFilter', this.filterController(), 'handleUpdateFilter');
85 } 82 }
86 }, 83 },
87 84
88 'updateFilterElements': function (aSourceElement, aFilterString) { 85 'updateFilterElements': function (aSourceElement, aFilterString) {
89 MochiKit.Iter.forEach(this.filterElements(), 86 MochiKit.Iter.forEach(this.filterElements(),
90 function (aFilterElement) { 87 function (aFilterElement) {
91 if (aFilterElement != aSourceElement) { 88 if (aFilterElement != aSourceElement) {
92 aFilterElement.value = aFilterString; 89 aFilterElement.value = aFilterString;
93 } 90 }
94 } 91 }
95 ); 92 );
96 93
97 if (aSourceElement != null) { 94 if (aSourceElement != null) {
98 aSourceElement.focus(); 95 aSourceElement.focus();
99 } 96 }
100 }, 97 },
101 98
102 //----------------------------------------------------------------------------- 99 //-----------------------------------------------------------------------------
103 100
104 'run': function () { 101 'run': function () {
105//Clipperz.log("=== FilterController.run"); 102//Clipperz.log("=== FilterController.run");
106 }, 103 },
107 104
108 //----------------------------------------------------------------------------- 105 //-----------------------------------------------------------------------------
109 106
110 'pendingSearchClicks': function () { 107 'pendingSearchClicks': function () {
111 return this._pendingSearchClicks; 108 return this._pendingSearchClicks;
112 }, 109 },
113 110
114 'incrementPendingSearchClicks': function () { 111 'incrementPendingSearchClicks': function () {
115 this._pendingSearchClicks++; 112 this._pendingSearchClicks++;
116 }, 113 },
117 114
118 'decrementPendingSearchClicks': function () { 115 'decrementPendingSearchClicks': function () {
119 this._pendingSearchClicks--; 116 this._pendingSearchClicks--;
120 }, 117 },
121 118
122 //----------------------------------------------------------------------------- 119 //-----------------------------------------------------------------------------
123 120
124 'searchClickHandler': function (anEvent) { 121 'searchClickHandler': function (anEvent) {
125 if ((typeof(anEvent.key()) != 'undefined') && (anEvent.key().string == 'KEY_ENTER')) { 122 if ((typeof(anEvent.key()) != 'undefined') && (anEvent.key().string == 'KEY_ENTER')) {
126 anEvent.preventDefault(); 123 anEvent.preventDefault();
127 } else { 124 } else {
128 var value; 125 var value;
129 126
130 if ((typeof(anEvent.key()) != 'undefined') && (anEvent.key().string == 'KEY_ESCAPE')) { 127 if ((typeof(anEvent.key()) != 'undefined') && (anEvent.key().string == 'KEY_ESCAPE')) {
131 value = "" 128 value = ""
132 } else if ((typeof(anEvent.key()) != 'undefined') && (anEvent.key().string == 'KEY_ARROW_UP')) { 129 } else if ((typeof(anEvent.key()) != 'undefined') && (anEvent.key().string == 'KEY_ARROW_UP')) {
133 } else if ((typeof(anEvent.key()) != 'undefined') && (anEvent.key().string == 'KEY_ARROW_DOWN')) { 130 } else if ((typeof(anEvent.key()) != 'undefined') && (anEvent.key().string == 'KEY_ARROW_DOWN')) {
134 } else { 131 } else {
135 value = null; 132 value = null;
136 } 133 }
137 134
138 this.incrementPendingSearchClicks(); 135 this.incrementPendingSearchClicks();
139 MochiKit.Async.callLater(0.1, MochiKit.Base.method(this, "searchClickDeferredHandler", anEvent.src(), value)); 136 MochiKit.Async.callLater(0.1, MochiKit.Base.method(this, "searchClickDeferredHandler", anEvent.src(), value));
140 } 137 }
141 }, 138 },
142 139
143 //......................................................................... 140 //.........................................................................
144 141
145 'searchClickDeferredHandler': function (aFilterElement, aValue) { 142 'searchClickDeferredHandler': function (aFilterElement, aValue) {
146 if (aValue != null) { 143 if (aValue != null) {
147 aFilterElement.value = aValue; 144 aFilterElement.value = aValue;
148 } 145 }
149 146
150 this.decrementPendingSearchClicks(); 147 this.decrementPendingSearchClicks();
151 if (this.pendingSearchClicks()==0) { 148 if (this.pendingSearchClicks()==0) {
152 this._setFilter(aFilterElement, aFilterElement.value); 149 this._setFilter(aFilterElement, aFilterElement.value);
153 } 150 }
154 }, 151 },
155 152
156 //----------------------------------------------------------------------------- 153 //-----------------------------------------------------------------------------
157 'syntaxFix': 'syntax fix' 154 'syntaxFix': 'syntax fix'
158}); \ No newline at end of file 155}); \ No newline at end of file
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 740a091..8bb3016 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/GridController.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/GridController.js
@@ -1,374 +1,371 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers'); 26Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers');
30 27
31Clipperz.PM.UI.Web.Controllers.GridController = function(args) { 28Clipperz.PM.UI.Web.Controllers.GridController = function(args) {
32 args = args || {}; 29 args = args || {};
33 30
34 Clipperz.PM.UI.Web.Controllers.GridController.superclass.constructor.call(this, args); 31 Clipperz.PM.UI.Web.Controllers.GridController.superclass.constructor.call(this, args);
35 32
36 this._grid = null; 33 this._grid = null;
37 this._user = null; 34 this._user = null;
38 this._sortedColumnManager = null; 35 this._sortedColumnManager = null;
39 this._cachedObjects = null; 36 this._cachedObjects = null;
40 this._filterController = args.filterController || null; 37 this._filterController = args.filterController || null;
41 38
42 this._deferredDisplaySelectedRowsInvocation = null; 39 this._deferredDisplaySelectedRowsInvocation = null;
43 40
44 return this; 41 return this;
45}; 42};
46 43
47Clipperz.Base.extend(Clipperz.PM.UI.Web.Controllers.GridController, Object, { 44Clipperz.Base.extend(Clipperz.PM.UI.Web.Controllers.GridController, Object, {
48 45
49 'toString': function() { 46 'toString': function() {
50 return "Clipperz.PM.UI.Web.Controllers.GridController"; 47 return "Clipperz.PM.UI.Web.Controllers.GridController";
51 }, 48 },
52 49
53 //----------------------------------------------------------------------------- 50 //-----------------------------------------------------------------------------
54 51
55 'createGrid': function () { 52 'createGrid': function () {
56 throw Clipperz.Base.exception.AbstractMethod; 53 throw Clipperz.Base.exception.AbstractMethod;
57 }, 54 },
58 55
59 'setupWithGrid': function (aGrid) { 56 'setupWithGrid': function (aGrid) {
60 this._grid = aGrid; 57 this._grid = aGrid;
61 58
62 if (this._grid != null) { 59 if (this._grid != null) {
63 MochiKit.Iter.forEach(this.columnsManagers(), function (aColumnManager) { 60 MochiKit.Iter.forEach(this.columnsManagers(), function (aColumnManager) {
64 if (aColumnManager.isSortable()) { 61 if (aColumnManager.isSortable()) {
65 if (aColumnManager.isSorted()) { 62 if (aColumnManager.isSorted()) {
66 this.setSortedColumnManager(aColumnManager); 63 this.setSortedColumnManager(aColumnManager);
67 } 64 }
68 MochiKit.Signal.connect(aColumnManager, 'sort', this, 'handleColumnManagerSort'); 65 MochiKit.Signal.connect(aColumnManager, 'sort', this, 'handleColumnManagerSort');
69 } 66 }
70 MochiKit.Signal.connect(aColumnManager, 'selectRow', this, 'handleColumnManagerSelectRow'); 67 MochiKit.Signal.connect(aColumnManager, 'selectRow', this, 'handleColumnManagerSelectRow');
71 MochiKit.Signal.connect(aColumnManager, 'unselectRow', this, 'handleColumnManagerUnselectRow'); 68 MochiKit.Signal.connect(aColumnManager, 'unselectRow', this, 'handleColumnManagerUnselectRow');
72 }, this); 69 }, this);
73 } 70 }
74 }, 71 },
75 72
76 'grid': function() { 73 'grid': function() {
77 if (this._grid == null) { 74 if (this._grid == null) {
78 this.setupWithGrid(this.createGrid()); 75 this.setupWithGrid(this.createGrid());
79 } 76 }
80 77
81 return this._grid; 78 return this._grid;
82 }, 79 },
83 80
84 'filterController': function () { 81 'filterController': function () {
85//Clipperz.log('GridController.filterController >>>', this._filterController); 82//Clipperz.log('GridController.filterController >>>', this._filterController);
86 if (this._filterController == null) { 83 if (this._filterController == null) {
87 this._filterController = new Clipperz.PM.UI.Web.Controllers.FilterController(); 84 this._filterController = new Clipperz.PM.UI.Web.Controllers.FilterController();
88 } 85 }
89//Clipperz.log('GridController.filterController <<<', this._filterController); 86//Clipperz.log('GridController.filterController <<<', this._filterController);
90 return this._filterController; 87 return this._filterController;
91 }, 88 },
92 89
93 //----------------------------------------------------------------------------- 90 //-----------------------------------------------------------------------------
94 91
95 'columnsManagers': function () { 92 'columnsManagers': function () {
96 return this.grid().columnsManagers(); 93 return this.grid().columnsManagers();
97 }, 94 },
98 95
99 'columnManagerWithName': function (aName) { 96 'columnManagerWithName': function (aName) {
100 varmanagers; 97 varmanagers;
101 var result; 98 var result;
102 99
103 managers = MochiKit.Base.filter(function (aManager) { return aManager.name() == aName; } , this.columnsManagers()); 100 managers = MochiKit.Base.filter(function (aManager) { return aManager.name() == aName; } , this.columnsManagers());
104 101
105 if (managers.length == 1) { 102 if (managers.length == 1) {
106 result = managers[0]; 103 result = managers[0];
107 } else if (managers.length == 0) { 104 } else if (managers.length == 0) {
108 result = null; 105 result = null;
109 } else { 106 } else {
110 throw "WTF!!!"; 107 throw "WTF!!!";
111 } 108 }
112 109
113 return result; 110 return result;
114 }, 111 },
115 112
116 'sortedColumnManager': function () { 113 'sortedColumnManager': function () {
117 return this._sortedColumnManager; 114 return this._sortedColumnManager;
118 }, 115 },
119 116
120 'setSortedColumnManager': function(aValue) { 117 'setSortedColumnManager': function(aValue) {
121 if (aValue.sorted() != 'UNSORTED') { 118 if (aValue.sorted() != 'UNSORTED') {
122 this._sortedColumnManager = aValue; 119 this._sortedColumnManager = aValue;
123 } else { 120 } else {
124 this._sortedColumnManager = null; 121 this._sortedColumnManager = null;
125 } 122 }
126 }, 123 },
127 124
128 //----------------------------------------------------------------------------- 125 //-----------------------------------------------------------------------------
129 126
130 'handleColumnManagerSort': function(aSelectedColumnManager) { 127 'handleColumnManagerSort': function(aSelectedColumnManager) {
131 MochiKit.Iter.forEach(this.columnsManagers(), function(aColumnManager) { 128 MochiKit.Iter.forEach(this.columnsManagers(), function(aColumnManager) {
132 if (aSelectedColumnManager != aColumnManager) { 129 if (aSelectedColumnManager != aColumnManager) {
133 if (aColumnManager.isSortable()) { 130 if (aColumnManager.isSortable()) {
134 aColumnManager.setSorted('UNSORTED'); 131 aColumnManager.setSorted('UNSORTED');
135 } 132 }
136 } 133 }
137 }); 134 });
138 135
139 aSelectedColumnManager.toggleSorting(); 136 aSelectedColumnManager.toggleSorting();
140 this.setSortedColumnManager(aSelectedColumnManager); 137 this.setSortedColumnManager(aSelectedColumnManager);
141 138
142 this.displaySelectedRows(this.filterController().getFilter()); 139 this.displaySelectedRows(this.filterController().getFilter());
143 }, 140 },
144 141
145 'handleColumnManagerSelectRow': function (aRowObject) { 142 'handleColumnManagerSelectRow': function (aRowObject) {
146 this.grid().selectRow(aRowObject); 143 this.grid().selectRow(aRowObject);
147 }, 144 },
148 145
149 'handleColumnManagerUnselectRow': function (aRowObject) { 146 'handleColumnManagerUnselectRow': function (aRowObject) {
150 this.grid().unselectRow(aRowObject); 147 this.grid().unselectRow(aRowObject);
151 }, 148 },
152 149
153 //----------------------------------------------------------------------------- 150 //-----------------------------------------------------------------------------
154 151
155 'handleFilterUpdated': function (aFilter) { 152 'handleFilterUpdated': function (aFilter) {
156 if (this.grid().isActive()) { 153 if (this.grid().isActive()) {
157 this.displaySelectedRows(aFilter); 154 this.displaySelectedRows(aFilter);
158 } 155 }
159 }, 156 },
160 157
161 //----------------------------------------------------------------------------- 158 //-----------------------------------------------------------------------------
162 //TODO: relying on user() in GridController, bad code smell :| 159 //TODO: relying on user() in GridController, bad code smell :|
163 //mhh: a controller should have access to business logic object too. Otherwise it will fail its controller role. [Giulio Cesare] 160 //mhh: a controller should have access to business logic object too. Otherwise it will fail its controller role. [Giulio Cesare]
164 161
165 'setUser': function(anUser) { 162 'setUser': function(anUser) {
166 this._user = anUser; 163 this._user = anUser;
167 }, 164 },
168 165
169 'user': function() { 166 'user': function() {
170 return this._user; 167 return this._user;
171 }, 168 },
172 169
173 //----------------------------------------------------------------------------- 170 //-----------------------------------------------------------------------------
174 171
175 'run': function(args) { 172 'run': function(args) {
176//Clipperz.log("=== GridController.run"); 173//Clipperz.log("=== GridController.run");
177 var deferredResult; 174 var deferredResult;
178 175
179 this.setUser(args.user); 176 this.setUser(args.user);
180 args.slot.setContent(this.grid()); 177 args.slot.setContent(this.grid());
181 this.filterController().registerFilterElement(this.grid().filterElement()); 178 this.filterController().registerFilterElement(this.grid().filterElement());
182 MochiKit.Signal.connect(this.filterController(), 'filterUpdated', this, 'handleFilterUpdated'); 179 MochiKit.Signal.connect(this.filterController(), 'filterUpdated', this, 'handleFilterUpdated');
183 180
184 return this.displaySelectedRows(); 181 return this.displaySelectedRows();
185 }, 182 },
186 183
187 //----------------------------------------------------------------------------- 184 //-----------------------------------------------------------------------------
188 185
189 'handleGenericError': function(anError) { 186 'handleGenericError': function(anError) {
190 var result; 187 var result;
191 188
192 if (anError instanceof MochiKit.Async.CancelledError) { 189 if (anError instanceof MochiKit.Async.CancelledError) {
193 result = anError; 190 result = anError;
194 } else { 191 } else {
195Clipperz.log("## GridController - GENERIC ERROR" + "\n" + "==>> " + anError + " <<==\n" + anError.stack); 192Clipperz.log("## GridController - GENERIC ERROR" + "\n" + "==>> " + anError + " <<==\n" + anError.stack);
196 result = new MochiKit.Async.CancelledError(anError); 193 result = new MochiKit.Async.CancelledError(anError);
197 } 194 }
198 195
199 return result; 196 return result;
200 }, 197 },
201 198
202 //----------------------------------------------------------------------------- 199 //-----------------------------------------------------------------------------
203 200
204 'getRows': function () { 201 'getRows': function () {
205 throw Clipperz.Base.AbstractMethod; 202 throw Clipperz.Base.AbstractMethod;
206 }, 203 },
207 204
208 //----------------------------------------------------------------------------- 205 //-----------------------------------------------------------------------------
209 206
210 'setDeferredDisplaySelectedRowsInvocation': function (aDeferred) { 207 'setDeferredDisplaySelectedRowsInvocation': function (aDeferred) {
211 if (this._deferredDisplaySelectedRowsInvocation != null) { 208 if (this._deferredDisplaySelectedRowsInvocation != null) {
212 this._deferredDisplaySelectedRowsInvocation.cancel(); 209 this._deferredDisplaySelectedRowsInvocation.cancel();
213 } 210 }
214 211
215 this._deferredDisplaySelectedRowsInvocation = aDeferred; 212 this._deferredDisplaySelectedRowsInvocation = aDeferred;
216 }, 213 },
217 214
218 //----------------------------------------------------------------------------- 215 //-----------------------------------------------------------------------------
219 216
220 'resetDeferredDisplaySelectedRowsInvocation': function () { 217 'resetDeferredDisplaySelectedRowsInvocation': function () {
221 if (this._deferredDisplaySelectedRowsInvocation != null) { 218 if (this._deferredDisplaySelectedRowsInvocation != null) {
222 this._deferredDisplaySelectedRowsInvocation.cancel(); 219 this._deferredDisplaySelectedRowsInvocation.cancel();
223 } 220 }
224 }, 221 },
225 222
226 //----------------------------------------------------------------------------- 223 //-----------------------------------------------------------------------------
227 224
228 '_displaySelectedRows': function (aFilter, someRows) { 225 '_displaySelectedRows': function (aFilter, someRows) {
229 var result; 226 var result;
230 var delay; 227 var delay;
231 228
232 if ((aFilter != null) && (aFilter != '')) { 229 if ((aFilter != null) && (aFilter != '')) {
233 var filter; 230 var filter;
234 varfilterRegExp; 231 varfilterRegExp;
235 232
236 filter = aFilter.replace(/[^A-Za-z0-9]/g, "\\$&"); 233 filter = aFilter.replace(/[^A-Za-z0-9]/g, "\\$&");
237 filterRegExp = new RegExp(filter, "i"); 234 filterRegExp = new RegExp(filter, "i");
238 result = MochiKit.Base.filter(function (aCachedResult) { return filterRegExp.test(aCachedResult['_searchableContent'])}, someRows); 235 result = MochiKit.Base.filter(function (aCachedResult) { return filterRegExp.test(aCachedResult['_searchableContent'])}, someRows);
239 delay = 0.002*result.length; 236 delay = 0.002*result.length;
240 237
241 this.setDeferredDisplaySelectedRowsInvocation(MochiKit.Async.callLater(delay, MochiKit.Base.method(this, "deferredDisplaySelectedRows", result))); 238 this.setDeferredDisplaySelectedRowsInvocation(MochiKit.Async.callLater(delay, MochiKit.Base.method(this, "deferredDisplaySelectedRows", result)));
242 } else { 239 } else {
243 result = someRows; 240 result = someRows;
244 241
245 this.resetDeferredDisplaySelectedRowsInvocation(); 242 this.resetDeferredDisplaySelectedRowsInvocation();
246 this.deferredDisplaySelectedRows(result); 243 this.deferredDisplaySelectedRows(result);
247 } 244 }
248 245
249 }, 246 },
250 247
251 //----------------------------------------------------------------------------- 248 //-----------------------------------------------------------------------------
252 249
253 'deferredDisplaySelectedRows': function (someRows) { 250 'deferredDisplaySelectedRows': function (someRows) {
254 if (this.sortedColumnManager() != null) { 251 if (this.sortedColumnManager() != null) {
255 var comparator; 252 var comparator;
256 var fieldName; 253 var fieldName;
257 254
258 fieldName = this.sortedColumnManager().name(); 255 fieldName = this.sortedColumnManager().name();
259 comparator = this.sortedColumnManager().comparator(); 256 comparator = this.sortedColumnManager().comparator();
260 if (this.sortedColumnManager().sorted() == 'DESCENDING') { 257 if (this.sortedColumnManager().sorted() == 'DESCENDING') {
261 comparator = Clipperz.Base.reverseComparator(comparator); 258 comparator = Clipperz.Base.reverseComparator(comparator);
262 } 259 }
263 260
264 someRows.sort(MochiKit.Base.partial(function(aKey, aComparator, aObject, bObject){ 261 someRows.sort(MochiKit.Base.partial(function(aKey, aComparator, aObject, bObject){
265 return comparator(aObject[aKey], bObject[aKey]); 262 return comparator(aObject[aKey], bObject[aKey]);
266 }, this.sortedColumnManager().name(), comparator)); 263 }, this.sortedColumnManager().name(), comparator));
267 } 264 }
268 265
269 this.grid().update(someRows); 266 this.grid().update(someRows);
270 this.grid().endSearch(); 267 this.grid().endSearch();
271 }, 268 },
272 269
273 //----------------------------------------------------------------------------- 270 //-----------------------------------------------------------------------------
274 271
275 'getCachedValues': function () { 272 'getCachedValues': function () {
276 var deferredResult; 273 var deferredResult;
277 274
278 if (this._cachedObjects != null) { 275 if (this._cachedObjects != null) {
279 deferredResult = MochiKit.Async.succeed(this._cachedObjects); 276 deferredResult = MochiKit.Async.succeed(this._cachedObjects);
280 } else { 277 } else {
281 var objectCollectResultsConfiguration; 278 var objectCollectResultsConfiguration;
282 279
283 objectCollectResultsConfiguration = { 280 objectCollectResultsConfiguration = {
284 '_rowObject': MochiKit.Async.succeed, 281 '_rowObject': MochiKit.Async.succeed,
285 '_reference': MochiKit.Base.methodcaller('reference'), 282 '_reference': MochiKit.Base.methodcaller('reference'),
286 '_searchableContent':MochiKit.Base.methodcaller('searchableContent') 283 '_searchableContent':MochiKit.Base.methodcaller('searchableContent')
287 }; 284 };
288 285
289 MochiKit.Base.map(function (aColumnManager) { 286 MochiKit.Base.map(function (aColumnManager) {
290 objectCollectResultsConfiguration[aColumnManager.name()] = aColumnManager.selector(); 287 objectCollectResultsConfiguration[aColumnManager.name()] = aColumnManager.selector();
291 }, this.columnsManagers()); 288 }, this.columnsManagers());
292 289
293 deferredResult = new Clipperz.Async.Deferred("GridController.getCachedValues", {trace:false}); 290 deferredResult = new Clipperz.Async.Deferred("GridController.getCachedValues", {trace:false});
294 deferredResult.addMethod(this, 'getRows'); 291 deferredResult.addMethod(this, 'getRows');
295 deferredResult.addCallback(MochiKit.Base.map, Clipperz.Async.collectResults("GridController.getCachedValues - collectResults", objectCollectResultsConfiguration, {trace:false})); 292 deferredResult.addCallback(MochiKit.Base.map, Clipperz.Async.collectResults("GridController.getCachedValues - collectResults", objectCollectResultsConfiguration, {trace:false}));
296 deferredResult.addCallback(Clipperz.Async.collectAll); 293 deferredResult.addCallback(Clipperz.Async.collectAll);
297 deferredResult.addCallback(MochiKit.Base.bind(function (someRows) { 294 deferredResult.addCallback(MochiKit.Base.bind(function (someRows) {
298 this._cachedObjects = someRows; 295 this._cachedObjects = someRows;
299 return this._cachedObjects; 296 return this._cachedObjects;
300 }, this)); 297 }, this));
301 deferredResult.callback(); 298 deferredResult.callback();
302 } 299 }
303 300
304 return deferredResult; 301 return deferredResult;
305 }, 302 },
306 303
307 //----------------------------------------------------------------------------- 304 //-----------------------------------------------------------------------------
308 305
309 'hasPendingChanges': function () { 306 'hasPendingChanges': function () {
310 return this.user().hasPendingChanges(); 307 return this.user().hasPendingChanges();
311 }, 308 },
312 309
313 'saveChanges': function () { 310 'saveChanges': function () {
314 this._cachedObjects = null; 311 this._cachedObjects = null;
315 312
316 return Clipperz.Async.callbacks("GridController.saveChanges", [ 313 return Clipperz.Async.callbacks("GridController.saveChanges", [
317 MochiKit.Base.method(this.user(), 'saveChanges'), 314 MochiKit.Base.method(this.user(), 'saveChanges'),
318 MochiKit.Base.method(this, 'focus') 315 MochiKit.Base.method(this, 'focus')
319 ], {trace:false}); 316 ], {trace:false});
320 }, 317 },
321 318
322 'revertChanges': function () { 319 'revertChanges': function () {
323 return this.user().revertChanges(); 320 return this.user().revertChanges();
324 }, 321 },
325 322
326 //----------------------------------------------------------------------------- 323 //-----------------------------------------------------------------------------
327 324
328 'displayEmptyContent': function () { 325 'displayEmptyContent': function () {
329 }, 326 },
330 327
331 'hideEmptyContent': function () { 328 'hideEmptyContent': function () {
332 this.grid().removeNoRowsGridComponent(); 329 this.grid().removeNoRowsGridComponent();
333 }, 330 },
334 331
335 'displaySelectedRows': function (aFilter) { 332 'displaySelectedRows': function (aFilter) {
336 if ((aFilter != null) && (aFilter != '')){ 333 if ((aFilter != null) && (aFilter != '')){
337 this.grid().startSearch(); 334 this.grid().startSearch();
338 } 335 }
339 336
340 return Clipperz.Async.callbacks("GridController.displaySelectedrows", [ 337 return Clipperz.Async.callbacks("GridController.displaySelectedrows", [
341 MochiKit.Base.method(this, 'getCachedValues'), 338 MochiKit.Base.method(this, 'getCachedValues'),
342 MochiKit.Base.itemgetter('length'), 339 MochiKit.Base.itemgetter('length'),
343 Clipperz.Async.deferredIf("There are some items to show in the grid", [ 340 Clipperz.Async.deferredIf("There are some items to show in the grid", [
344 MochiKit.Base.method(this, 'hideEmptyContent'), 341 MochiKit.Base.method(this, 'hideEmptyContent'),
345 MochiKit.Base.method(this, 'getCachedValues'), 342 MochiKit.Base.method(this, 'getCachedValues'),
346 MochiKit.Base.method(this, '_displaySelectedRows', aFilter) 343 MochiKit.Base.method(this, '_displaySelectedRows', aFilter)
347 ], [ 344 ], [
348 MochiKit.Base.method(this, 'displayEmptyContent'), 345 MochiKit.Base.method(this, 'displayEmptyContent'),
349 MochiKit.Base.method(this.grid(), 'endSearch') 346 MochiKit.Base.method(this.grid(), 'endSearch')
350 ]) 347 ])
351 ], {trace:false}); 348 ], {trace:false});
352 }, 349 },
353 350
354 //----------------------------------------------------------------------------- 351 //-----------------------------------------------------------------------------
355 352
356 'focus': function () { 353 'focus': function () {
357 return Clipperz.Async.callbacks("GridController.focus", [ 354 return Clipperz.Async.callbacks("GridController.focus", [
358 MochiKit.Base.method(this, 'displaySelectedRows', this.filterController().getFilter()), 355 MochiKit.Base.method(this, 'displaySelectedRows', this.filterController().getFilter()),
359 MochiKit.Base.method(this.grid(), 'focus') 356 MochiKit.Base.method(this.grid(), 'focus')
360 ], {trace:false}) 357 ], {trace:false})
361 //*##*/this.displaySelectedRows(this.filterController().getFilter()); 358 //*##*/this.displaySelectedRows(this.filterController().getFilter());
362 // this.grid().focus(); 359 // this.grid().focus();
363 }, 360 },
364 361
365 //============================================================================= 362 //=============================================================================
366 363
367 'deleteAllCleanTextData': function () { 364 'deleteAllCleanTextData': function () {
368 this._cachedObjects = null; 365 this._cachedObjects = null;
369 this.grid().drawEmpty(); 366 this.grid().drawEmpty();
370 }, 367 },
371 368
372 //============================================================================= 369 //=============================================================================
373 __syntaxFix__: "syntax fix" 370 __syntaxFix__: "syntax fix"
374}); 371});
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 d88af41..d0b378c 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/LoginController.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/LoginController.js
@@ -1,259 +1,256 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers'); 26Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers');
30 27
31Clipperz.PM.UI.Web.Controllers.LoginController = function(args) { 28Clipperz.PM.UI.Web.Controllers.LoginController = function(args) {
32 this._args = args || {}; 29 this._args = args || {};
33 30
34 this._loginPage = null; 31 this._loginPage = null;
35 32
36 this._newUserWizardController = null; 33 this._newUserWizardController = null;
37 this._newUserCreationComponent = null; 34 this._newUserCreationComponent = null;
38 35
39 return this; 36 return this;
40} 37}
41 38
42MochiKit.Base.update(Clipperz.PM.UI.Web.Controllers.LoginController.prototype, { 39MochiKit.Base.update(Clipperz.PM.UI.Web.Controllers.LoginController.prototype, {
43 40
44 'toString': function() { 41 'toString': function() {
45 return "Clipperz.PM.UI.Web.Controllers.LoginController"; 42 return "Clipperz.PM.UI.Web.Controllers.LoginController";
46 }, 43 },
47 44
48 'args': function () { 45 'args': function () {
49 return this._args; 46 return this._args;
50 }, 47 },
51 48
52 //----------------------------------------------------------------------------- 49 //-----------------------------------------------------------------------------
53 50
54 'loginPage': function() { 51 'loginPage': function() {
55 if (this._loginPage == null) { 52 if (this._loginPage == null) {
56 this._loginPage = new Clipperz.PM.UI.Web.Components.LoginPage(); 53 this._loginPage = new Clipperz.PM.UI.Web.Components.LoginPage();
57 54
58 MochiKit.Signal.connect(this._loginPage, 'createNewAccountClick', this, 'handleCreateNewAccountClick') 55 MochiKit.Signal.connect(this._loginPage, 'createNewAccountClick', this, 'handleCreateNewAccountClick')
59 } 56 }
60 57
61 return this._loginPage; 58 return this._loginPage;
62 }, 59 },
63 60
64 //----------------------------------------------------------------------------- 61 //-----------------------------------------------------------------------------
65 62
66 'run': function(args) { 63 'run': function(args) {
67 varslot; 64 varslot;
68 varloginPage; 65 varloginPage;
69 varloginForm; 66 varloginForm;
70 67
71 slot = args.slot; 68 slot = args.slot;
72 69
73 loginForm =new Clipperz.PM.UI.Web.Components.LoginForm({'autocomplete': this.args()['autocomplete']}); 70 loginForm =new Clipperz.PM.UI.Web.Components.LoginForm({'autocomplete': this.args()['autocomplete']});
74 71
75 slot.setContent(this.loginPage()); 72 slot.setContent(this.loginPage());
76 this.loginPage().slotNamed('loginForm').setContent(loginForm); 73 this.loginPage().slotNamed('loginForm').setContent(loginForm);
77 74
78 MochiKit.Signal.connect(loginForm, 'doLogin', MochiKit.Base.method(this, 'doLogin', loginForm)); 75 MochiKit.Signal.connect(loginForm, 'doLogin', MochiKit.Base.method(this, 'doLogin', loginForm));
79 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'doLogin', MochiKit.Base.method(this, 'doLogin', loginForm)); 76 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'doLogin', MochiKit.Base.method(this, 'doLogin', loginForm));
80 }, 77 },
81 78
82 //----------------------------------------------------------------------------- 79 //-----------------------------------------------------------------------------
83 80
84 'doLogin': function(aLoginForm, anEvent) { 81 'doLogin': function(aLoginForm, anEvent) {
85 var deferredResult; 82 var deferredResult;
86 varparameters; 83 varparameters;
87 // varshouldUseOTP; 84 // varshouldUseOTP;
88 var loginProgress; 85 var loginProgress;
89 varuser; 86 varuser;
90 var getPassphraseDelegate; 87 var getPassphraseDelegate;
91 88
92 parameters = anEvent; 89 parameters = anEvent;
93 // shouldUseOTP = (typeof(parameters.passphrase) == 'undefined'); 90 // shouldUseOTP = (typeof(parameters.passphrase) == 'undefined');
94 91
95 getPassphraseDelegate = MochiKit.Base.partial(MochiKit.Async.succeed, parameters.passphrase); 92 getPassphraseDelegate = MochiKit.Base.partial(MochiKit.Async.succeed, parameters.passphrase);
96 user = new Clipperz.PM.DataModel.User({'username':parameters.username, 'getPassphraseFunction':MochiKit.Base.method(Clipperz.PM.RunTime.mainController, 'getPassphrase')}); 93 user = new Clipperz.PM.DataModel.User({'username':parameters.username, 'getPassphraseFunction':MochiKit.Base.method(Clipperz.PM.RunTime.mainController, 'getPassphrase')});
97 94
98 loginProgress = new Clipperz.PM.UI.Web.Components.LoginProgress(); 95 loginProgress = new Clipperz.PM.UI.Web.Components.LoginProgress();
99 96
100 deferredResult = new Clipperz.Async.Deferred("LoginController.doLogin", {trace:false}); 97 deferredResult = new Clipperz.Async.Deferred("LoginController.doLogin", {trace:false});
101 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'initProgress', {'steps':4}); 98 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'initProgress', {'steps':4});
102 deferredResult.addMethod(Clipperz.PM.RunTime.mainController, 'setPassphraseDelegate', getPassphraseDelegate); 99 deferredResult.addMethod(Clipperz.PM.RunTime.mainController, 'setPassphraseDelegate', getPassphraseDelegate);
103 deferredResult.addMethod(loginProgress, 'deferredShowModal', {deferredObject:deferredResult, openFromElement:aLoginForm.submitButtonElement()}); 100 deferredResult.addMethod(loginProgress, 'deferredShowModal', {deferredObject:deferredResult, openFromElement:aLoginForm.submitButtonElement()});
104 deferredResult.addMethod(Clipperz.Crypto.PRNG.defaultRandomGenerator(), 'deferredEntropyCollection'); 101 deferredResult.addMethod(Clipperz.Crypto.PRNG.defaultRandomGenerator(), 'deferredEntropyCollection');
105 // if (shouldUseOTP == false) { 102 // if (shouldUseOTP == false) {
106 deferredResult.addMethod(user, 'login'); 103 deferredResult.addMethod(user, 'login');
107 // } else { 104 // } else {
108 // deferredResult.addMethod(user, 'loginUsingOTP', parameters.username, parameters.otp); 105 // deferredResult.addMethod(user, 'loginUsingOTP', parameters.username, parameters.otp);
109 // } 106 // }
110 deferredResult.addCallback(function(aLoginProgress, res) { 107 deferredResult.addCallback(function(aLoginProgress, res) {
111 aLoginProgress.disableCancel(); 108 aLoginProgress.disableCancel();
112 return res; 109 return res;
113 }, loginProgress); 110 }, loginProgress);
114 deferredResult.addCallback(function () { 111 deferredResult.addCallback(function () {
115 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'CARDS_CONTROLLER_DID_RUN',MochiKit.Base.method(loginProgress, 'deferredHideModalAndRemove', {closeToElement:MochiKit.DOM.currentDocument().body})); 112 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'CARDS_CONTROLLER_DID_RUN',MochiKit.Base.method(loginProgress, 'deferredHideModalAndRemove', {closeToElement:MochiKit.DOM.currentDocument().body}));
116 }) 113 })
117 deferredResult.addMethod(this, 'userLoggedIn', user, loginProgress, aLoginForm); 114 deferredResult.addMethod(this, 'userLoggedIn', user, loginProgress, aLoginForm);
118 deferredResult.addErrback (MochiKit.Base.method(this, 'handleFailedLogin', loginProgress)); 115 deferredResult.addErrback (MochiKit.Base.method(this, 'handleFailedLogin', loginProgress));
119 116
120 deferredResult.addErrback (MochiKit.Base.method(loginProgress, 'deferredHideModalAndRemove', {closeToElement:aLoginForm.submitButtonElement()})); 117 deferredResult.addErrback (MochiKit.Base.method(loginProgress, 'deferredHideModalAndRemove', {closeToElement:aLoginForm.submitButtonElement()}));
121 deferredResult.addErrbackPass (MochiKit.Base.method(aLoginForm, 'focusOnPassphraseField')); 118 deferredResult.addErrbackPass (MochiKit.Base.method(aLoginForm, 'focusOnPassphraseField'));
122 deferredResult.addBoth(MochiKit.Base.method(Clipperz.PM.RunTime.mainController, 'removePassphraseDelegate', getPassphraseDelegate)); 119 deferredResult.addBoth(MochiKit.Base.method(Clipperz.PM.RunTime.mainController, 'removePassphraseDelegate', getPassphraseDelegate));
123 deferredResult.callback(); 120 deferredResult.callback();
124 121
125 MochiKit.Signal.connect(loginProgress, 'cancelEvent', deferredResult, 'cancel'); 122 MochiKit.Signal.connect(loginProgress, 'cancelEvent', deferredResult, 'cancel');
126 123
127 return deferredResult; 124 return deferredResult;
128 }, 125 },
129 126
130 //----------------------------------------------------------------------------- 127 //-----------------------------------------------------------------------------
131 128
132 'userLoggedIn': function(aUser) { 129 'userLoggedIn': function(aUser) {
133//Clipperz.log(">>> LoginController.userLoggedIn"); 130//Clipperz.log(">>> LoginController.userLoggedIn");
134 MochiKit.Signal.signal(this, 'userLoggedIn', {user: aUser}); 131 MochiKit.Signal.signal(this, 'userLoggedIn', {user: aUser});
135//Clipperz.log("<<< LoginController.userLoggedIn"); 132//Clipperz.log("<<< LoginController.userLoggedIn");
136 }, 133 },
137 134
138 //========================================================================= 135 //=========================================================================
139 136
140 'handleCreateNewAccountClick': function (aComponent) { 137 'handleCreateNewAccountClick': function (aComponent) {
141 // return Clipperz.PM.DataModel.User.registerNewAccount("new", "user"); 138 // return Clipperz.PM.DataModel.User.registerNewAccount("new", "user");
142 return Clipperz.Async.callbacks("LoginController.handleCreateNewAccountClick", [ 139 return Clipperz.Async.callbacks("LoginController.handleCreateNewAccountClick", [
143 //' MochiKit.Base.method(this, 'newUserCreationComponent'), 140 //' MochiKit.Base.method(this, 'newUserCreationComponent'),
144 // MochiKit.Base.methodcaller('deferredShowModal', {openFromElement:aComponent}), 141 // MochiKit.Base.methodcaller('deferredShowModal', {openFromElement:aComponent}),
145 // MochiKit.Base.method(this.newUserWizardController(), 'run') 142 // MochiKit.Base.method(this.newUserWizardController(), 'run')
146 143
147 144
148 MochiKit.Base.method(this, 'newUserCreationComponent'), 145 MochiKit.Base.method(this, 'newUserCreationComponent'),
149 Clipperz.Async.forkAndJoin("Async.test succeedingForkedAndWaitDeferrer", [ 146 Clipperz.Async.forkAndJoin("Async.test succeedingForkedAndWaitDeferrer", [
150 MochiKit.Base.method(this.newUserCreationComponent(), 'deferredShowModal', {openFromElement:aComponent, duration:0.5}), 147 MochiKit.Base.method(this.newUserCreationComponent(), 'deferredShowModal', {openFromElement:aComponent, duration:0.5}),
151 MochiKit.Base.method(this.newUserWizardController(), 'run') 148 MochiKit.Base.method(this.newUserWizardController(), 'run')
152 ], {trace:false}), 149 ], {trace:false}),
153 // MochiKit.Base.method(this.newUserCreationComponent(), 'enableCredentialsField') 150 // MochiKit.Base.method(this.newUserCreationComponent(), 'enableCredentialsField')
154 ], {trace:false}); 151 ], {trace:false});
155 }, 152 },
156 153
157 //----------------------------------------------------------------------------- 154 //-----------------------------------------------------------------------------
158 155
159 'newUserWizardController': function () { 156 'newUserWizardController': function () {
160 if (this._newUserWizardController == null) { 157 if (this._newUserWizardController == null) {
161 this._newUserWizardController = new Clipperz.PM.UI.Web.Controllers.NewUserWizardController({ 158 this._newUserWizardController = new Clipperz.PM.UI.Web.Controllers.NewUserWizardController({
162 'newUserCreationComponent': this.newUserCreationComponent() 159 'newUserCreationComponent': this.newUserCreationComponent()
163 }) 160 })
164 161
165 // MochiKit.Signal.connect(this._newUserWizardController, 'exit',this, 'handleHideNewUserCreationComponent'); 162 // MochiKit.Signal.connect(this._newUserWizardController, 'exit',this, 'handleHideNewUserCreationComponent');
166 MochiKit.Signal.connect(this._newUserWizardController, 'done',this, 'handleCompleteNewUserCreationComponent'); 163 MochiKit.Signal.connect(this._newUserWizardController, 'done',this, 'handleCompleteNewUserCreationComponent');
167 } 164 }
168 165
169 return this._newUserWizardController; 166 return this._newUserWizardController;
170 }, 167 },
171 168
172 //------------------------------------------------------------------------- 169 //-------------------------------------------------------------------------
173 170
174 'newUserCreationComponent': function () { 171 'newUserCreationComponent': function () {
175 if (this._newUserCreationComponent == null) { 172 if (this._newUserCreationComponent == null) {
176 this._newUserCreationComponent = new Clipperz.PM.UI.Web.Components.NewUserCreationComponent(); 173 this._newUserCreationComponent = new Clipperz.PM.UI.Web.Components.NewUserCreationComponent();
177 } 174 }
178 175
179 return this._newUserCreationComponent; 176 return this._newUserCreationComponent;
180 }, 177 },
181 178
182 'clearNewUserCreationComponent': function () { 179 'clearNewUserCreationComponent': function () {
183 if (this._newUserCreationComponent != null) { 180 if (this._newUserCreationComponent != null) {
184 this._newUserCreationComponent.clear(); 181 this._newUserCreationComponent.clear();
185 } 182 }
186 this._newUserCreationComponent = null; 183 this._newUserCreationComponent = null;
187 }, 184 },
188 185
189 //------------------------------------------------------------------------- 186 //-------------------------------------------------------------------------
190 187
191 'handleHideNewUserCreationComponent': function () { 188 'handleHideNewUserCreationComponent': function () {
192 this.clearNewUserCreationComponent(); 189 this.clearNewUserCreationComponent();
193 }, 190 },
194 191
195 'handleCompleteNewUserCreationComponent': function (someParameters) { 192 'handleCompleteNewUserCreationComponent': function (someParameters) {
196 vardeferredResult; 193 vardeferredResult;
197 varuser; 194 varuser;
198 varnewUserCreationComponent; 195 varnewUserCreationComponent;
199 196
200 user = someParameters.user; 197 user = someParameters.user;
201 newUserCreationComponent = this.newUserCreationComponent(); 198 newUserCreationComponent = this.newUserCreationComponent();
202 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'CARDS_CONTROLLER_DID_RUN',MochiKit.Base.method(newUserCreationComponent, 'deferredHideModal', {closeToElement:MochiKit.DOM.currentDocument().body})), 199 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'CARDS_CONTROLLER_DID_RUN',MochiKit.Base.method(newUserCreationComponent, 'deferredHideModal', {closeToElement:MochiKit.DOM.currentDocument().body})),
203 200
204 deferredResult = new Clipperz.Async.Deferred("LoginController.handleCompleteNewUserCreationComponent", {trace:false}); 201 deferredResult = new Clipperz.Async.Deferred("LoginController.handleCompleteNewUserCreationComponent", {trace:false});
205 202
206 deferredResult.addCallbackList([ 203 deferredResult.addCallbackList([
207 MochiKit.Base.method(Clipperz.Crypto.PRNG.defaultRandomGenerator(), 'deferredEntropyCollection'), 204 MochiKit.Base.method(Clipperz.Crypto.PRNG.defaultRandomGenerator(), 'deferredEntropyCollection'),
208 MochiKit.Base.method(user, 'login'), 205 MochiKit.Base.method(user, 'login'),
209 MochiKit.Base.method(this, 'userLoggedIn', user), 206 MochiKit.Base.method(this, 'userLoggedIn', user),
210 MochiKit.Base.method(this, 'clearNewUserCreationComponent') 207 MochiKit.Base.method(this, 'clearNewUserCreationComponent')
211 ]); 208 ]);
212 deferredResult.addErrback(function (aValue) { Clipperz.log("WTF!! Error doing the login after creating a new user" + aValue)}); 209 deferredResult.addErrback(function (aValue) { Clipperz.log("WTF!! Error doing the login after creating a new user" + aValue)});
213 deferredResult.callback(); 210 deferredResult.callback();
214 211
215 return deferredResult; 212 return deferredResult;
216 }, 213 },
217 214
218 215
219 //========================================================================= 216 //=========================================================================
220 217
221 'handleFailedLogin': function(aLoginProgress, anError) { 218 'handleFailedLogin': function(aLoginProgress, anError) {
222 var result; 219 var result;
223 220
224//console.log("anError", anError); 221//console.log("anError", anError);
225 if (anError instanceof MochiKit.Async.CancelledError) { 222 if (anError instanceof MochiKit.Async.CancelledError) {
226 result = anError; 223 result = anError;
227 } else { 224 } else {
228 var deferredResult; 225 var deferredResult;
229 226
230MochiKit.Logging.logError("## MainController - FAILED LOGIN: " + anError); 227MochiKit.Logging.logError("## MainController - FAILED LOGIN: " + anError);
231 deferredResult = new MochiKit.Async.Deferred(); 228 deferredResult = new MochiKit.Async.Deferred();
232 229
233 aLoginProgress.showErrorMessage("failed login"); 230 aLoginProgress.showErrorMessage("failed login");
234 // Clipperz.NotificationCenter.register(loginProgress, 'cancelEvent', deferredResult, 'callback'); 231 // Clipperz.NotificationCenter.register(loginProgress, 'cancelEvent', deferredResult, 'callback');
235 MochiKit.Signal.connect(aLoginProgress, 'cancelEvent', deferredResult, 'callback'); 232 MochiKit.Signal.connect(aLoginProgress, 'cancelEvent', deferredResult, 'callback');
236 deferredResult.addCallback(MochiKit.Async.fail, anError) 233 deferredResult.addCallback(MochiKit.Async.fail, anError)
237 result = deferredResult; 234 result = deferredResult;
238 } 235 }
239 236
240 return result; 237 return result;
241 }, 238 },
242 239
243 'handleGenericError': function(anError) { 240 'handleGenericError': function(anError) {
244 var result; 241 var result;
245 242
246 if (anError instanceof MochiKit.Async.CancelledError) { 243 if (anError instanceof MochiKit.Async.CancelledError) {
247 result = anError; 244 result = anError;
248 } else { 245 } else {
249MochiKit.Logging.logError("## MainController - GENERIC ERROR" + "\n" + "==>> " + anError + " <<==\n" + anError.stack); 246MochiKit.Logging.logError("## MainController - GENERIC ERROR" + "\n" + "==>> " + anError + " <<==\n" + anError.stack);
250//console.log(anError); 247//console.log(anError);
251 result = new MochiKit.Async.CancelledError(anError); 248 result = new MochiKit.Async.CancelledError(anError);
252 } 249 }
253 250
254 return result; 251 return result;
255 }, 252 },
256 253
257 //----------------------------------------------------------------------------- 254 //-----------------------------------------------------------------------------
258 __syntaxFix__: "syntax fix" 255 __syntaxFix__: "syntax fix"
259}); 256});
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 aa0d6ad..c83e3c0 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/MainController.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/MainController.js
@@ -1,218 +1,215 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers'); 26Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers');
30 27
31Clipperz.PM.UI.Web.Controllers.MainController = function(args) { 28Clipperz.PM.UI.Web.Controllers.MainController = function(args) {
32 this._args = args; 29 this._args = args;
33 30
34 //controllers 31 //controllers
35 this._loginController =null; 32 this._loginController =null;
36 this._appController =null; 33 this._appController =null;
37 34
38 //components 35 //components
39 this._headerComponent = null; 36 this._headerComponent = null;
40 this._pageComponent =null; 37 this._pageComponent =null;
41 this._footerComponent = null; 38 this._footerComponent = null;
42 39
43 this._passphraseDelegateLock = new MochiKit.Async.DeferredLock(); 40 this._passphraseDelegateLock = new MochiKit.Async.DeferredLock();
44 this._passphraseDelegateLock.acquire(); 41 this._passphraseDelegateLock.acquire();
45//Clipperz.log('MainController init _passphraseDelegateLock', this._passphraseDelegateLock); 42//Clipperz.log('MainController init _passphraseDelegateLock', this._passphraseDelegateLock);
46 this._passphraseDelegate = null; 43 this._passphraseDelegate = null;
47 44
48 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'remoteRequestSent', this, 'handleRemoteRequestSent'); 45 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'remoteRequestSent', this, 'handleRemoteRequestSent');
49 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'remoteRequestReceived',this, 'handleRemoteRequestReceived'); 46 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'remoteRequestReceived',this, 'handleRemoteRequestReceived');
50 47
51 return this; 48 return this;
52} 49}
53 50
54MochiKit.Base.update(Clipperz.PM.UI.Web.Controllers.MainController.prototype, { 51MochiKit.Base.update(Clipperz.PM.UI.Web.Controllers.MainController.prototype, {
55 52
56 'toString': function() { 53 'toString': function() {
57 return "Clipperz.PM.UI.Web.Controllers.MainController"; 54 return "Clipperz.PM.UI.Web.Controllers.MainController";
58 }, 55 },
59 56
60 'args': function () { 57 'args': function () {
61 return this._args; 58 return this._args;
62 }, 59 },
63 60
64 //----------------------------------------------------------------------------- 61 //-----------------------------------------------------------------------------
65 62
66 'headerComponent': function() { 63 'headerComponent': function() {
67 if (this._headerComponent == null) { 64 if (this._headerComponent == null) {
68 this._headerComponent = new Clipperz.PM.UI.Web.Components.PageHeader(); 65 this._headerComponent = new Clipperz.PM.UI.Web.Components.PageHeader();
69 } 66 }
70 67
71 return this._headerComponent; 68 return this._headerComponent;
72 }, 69 },
73 70
74 'footerComponent': function() { 71 'footerComponent': function() {
75 if (this._footerComponent == null) { 72 if (this._footerComponent == null) {
76 this._footerComponent = new Clipperz.PM.UI.Web.Components.PageFooter(); 73 this._footerComponent = new Clipperz.PM.UI.Web.Components.PageFooter();
77 } 74 }
78 75
79 return this._footerComponent; 76 return this._footerComponent;
80 }, 77 },
81 78
82 //----------------------------------------------------------------------------- 79 //-----------------------------------------------------------------------------
83 80
84 'pageComponent': function() { 81 'pageComponent': function() {
85 if (this._pageComponent == null) { 82 if (this._pageComponent == null) {
86 this._pageComponent = new Clipperz.PM.UI.Web.Components.Page({element:MochiKit.DOM.getElement('mainDiv')}); 83 this._pageComponent = new Clipperz.PM.UI.Web.Components.Page({element:MochiKit.DOM.getElement('mainDiv')});
87 } 84 }
88 85
89 return this._pageComponent; 86 return this._pageComponent;
90 }, 87 },
91 88
92 //----------------------------------------------------------------------------- 89 //-----------------------------------------------------------------------------
93 90
94 'loginController': function() { 91 'loginController': function() {
95 if (this._loginController == null) { 92 if (this._loginController == null) {
96 this._loginController = new Clipperz.PM.UI.Web.Controllers.LoginController(this.args()); 93 this._loginController = new Clipperz.PM.UI.Web.Controllers.LoginController(this.args());
97 94
98 MochiKit.Signal.connect(this._loginController, 'userLoggedIn', this, 'loginControllerUserLoggedInCallback'); 95 MochiKit.Signal.connect(this._loginController, 'userLoggedIn', this, 'loginControllerUserLoggedInCallback');
99 } 96 }
100 97
101 return this._loginController; 98 return this._loginController;
102 }, 99 },
103 100
104 'appController': function() { 101 'appController': function() {
105 if (this._appController == null) { 102 if (this._appController == null) {
106 this._appController = new Clipperz.PM.UI.Web.Controllers.AppController(); 103 this._appController = new Clipperz.PM.UI.Web.Controllers.AppController();
107 104
108 MochiKit.Signal.connect(this._appController, 'logout', this, 'handleLogout'); 105 MochiKit.Signal.connect(this._appController, 'logout', this, 'handleLogout');
109 } 106 }
110 107
111 return this._appController; 108 return this._appController;
112 }, 109 },
113 110
114 //----------------------------------------------------------------------------- 111 //-----------------------------------------------------------------------------
115 112
116 'run': function(shoudShowRegistrationForm) { 113 'run': function(shoudShowRegistrationForm) {
117 this.pageComponent().slotNamed('header').setContent(this.headerComponent()); 114 this.pageComponent().slotNamed('header').setContent(this.headerComponent());
118 this.pageComponent().slotNamed('footer').setContent(this.footerComponent()); 115 this.pageComponent().slotNamed('footer').setContent(this.footerComponent());
119 116
120 this.pageComponent().render(); 117 this.pageComponent().render();
121 118
122 this.loginController().run({slot:this.pageComponent().slotNamed('body')}); 119 this.loginController().run({slot:this.pageComponent().slotNamed('body')});
123 120
124 if (shoudShowRegistrationForm) { 121 if (shoudShowRegistrationForm) {
125 MochiKit.Signal.signal(this.loginController().loginPage(), 'createNewAccountClick'); 122 MochiKit.Signal.signal(this.loginController().loginPage(), 'createNewAccountClick');
126 // this.loginController().handleCreateNewAccountClick(); 123 // this.loginController().handleCreateNewAccountClick();
127 } 124 }
128 }, 125 },
129 126
130 //----------------------------------------------------------------------------- 127 //-----------------------------------------------------------------------------
131 128
132 'getPassphrase': function () { 129 'getPassphrase': function () {
133 var deferredResult; 130 var deferredResult;
134 131
135 deferredResult = new Clipperz.Async.Deferred("MainController.getPassphrase", {trace:false}); 132 deferredResult = new Clipperz.Async.Deferred("MainController.getPassphrase", {trace:false});
136 133
137 deferredResult.acquireLock(this._passphraseDelegateLock); 134 deferredResult.acquireLock(this._passphraseDelegateLock);
138 deferredResult.addMethod(this, 'invokePassphraseDelegate'); 135 deferredResult.addMethod(this, 'invokePassphraseDelegate');
139 deferredResult.releaseLock(this._passphraseDelegateLock); 136 deferredResult.releaseLock(this._passphraseDelegateLock);
140 deferredResult.callback(); 137 deferredResult.callback();
141 138
142 return deferredResult; 139 return deferredResult;
143 }, 140 },
144 141
145 //......................................................................... 142 //.........................................................................
146 143
147 'invokePassphraseDelegate': function () { 144 'invokePassphraseDelegate': function () {
148 return this._passphraseDelegate(); 145 return this._passphraseDelegate();
149 }, 146 },
150 147
151 'passphraseDelegateLock': function () { 148 'passphraseDelegateLock': function () {
152 return this._passphraseDelegateLock; 149 return this._passphraseDelegateLock;
153 }, 150 },
154 151
155 //......................................................................... 152 //.........................................................................
156 153
157 'setPassphraseDelegate': function (aDelegate) { 154 'setPassphraseDelegate': function (aDelegate) {
158 var shouldReleaseLock; 155 var shouldReleaseLock;
159 156
160 shouldReleaseLock = (this._passphraseDelegate == null); 157 shouldReleaseLock = (this._passphraseDelegate == null);
161 158
162 this._passphraseDelegate = aDelegate; 159 this._passphraseDelegate = aDelegate;
163 160
164 if (shouldReleaseLock) { 161 if (shouldReleaseLock) {
165 this._passphraseDelegateLock.release(); 162 this._passphraseDelegateLock.release();
166 } 163 }
167 }, 164 },
168 165
169 //......................................................................... 166 //.........................................................................
170 167
171 'removePassphraseDelegate': function (aDelegate) { 168 'removePassphraseDelegate': function (aDelegate) {
172 if (this._passphraseDelegate == aDelegate) { 169 if (this._passphraseDelegate == aDelegate) {
173 this._passphraseDelegate = null; 170 this._passphraseDelegate = null;
174 this._passphraseDelegateLock.acquire(); 171 this._passphraseDelegateLock.acquire();
175 } 172 }
176 }, 173 },
177 174
178 //------------------------------------------------------------------------- 175 //-------------------------------------------------------------------------
179 176
180 'loginControllerUserLoggedInCallback': function(anEvent) { 177 'loginControllerUserLoggedInCallback': function(anEvent) {
181//Clipperz.log(">>> loginControllerUserLoggedInCallback", anEvent); 178//Clipperz.log(">>> loginControllerUserLoggedInCallback", anEvent);
182 // this.setUser(anEvent.parameters()['user']); 179 // this.setUser(anEvent.parameters()['user']);
183//console.log("--- loginControllerUserLoggedInCallback - 1"); 180//console.log("--- loginControllerUserLoggedInCallback - 1");
184 181
185//console.log("--- loginControllerUserLoggedInCallback - 2"); 182//console.log("--- loginControllerUserLoggedInCallback - 2");
186 this.headerComponent().switchToLoggedMode(); 183 this.headerComponent().switchToLoggedMode();
187 this.appController().run({slot:this.pageComponent().slotNamed('body'), user:anEvent['user']}); 184 this.appController().run({slot:this.pageComponent().slotNamed('body'), user:anEvent['user']});
188//Clipperz.log("<<< loginControllerUserLoggedInCallback"); 185//Clipperz.log("<<< loginControllerUserLoggedInCallback");
189 }, 186 },
190 187
191 //----------------------------------------------------------------------------- 188 //-----------------------------------------------------------------------------
192 189
193 'handleRemoteRequestSent': function () { 190 'handleRemoteRequestSent': function () {
194//Clipperz.log("REMOTE REQUEST sent >>>"); 191//Clipperz.log("REMOTE REQUEST sent >>>");
195 }, 192 },
196 193
197 'handleRemoteRequestReceived': function () { 194 'handleRemoteRequestReceived': function () {
198//Clipperz.log("REMOTE REQUEST received <<<"); 195//Clipperz.log("REMOTE REQUEST received <<<");
199 }, 196 },
200 197
201 //----------------------------------------------------------------------------- 198 //-----------------------------------------------------------------------------
202 199
203 'handleLogout': function(anEvent) { 200 'handleLogout': function(anEvent) {
204 this.exit('logout.html'); 201 this.exit('logout.html');
205 }, 202 },
206 203
207 //----------------------------------------------------------------------------- 204 //-----------------------------------------------------------------------------
208 205
209 'exit': function(aPageName) { 206 'exit': function(aPageName) {
210//Clipperz.log("### exit " + aPageName); 207//Clipperz.log("### exit " + aPageName);
211 MochiKit.Async.wait(0).addCallback(function() { 208 MochiKit.Async.wait(0).addCallback(function() {
212 window.location.href = "./" + aPageName + "?ln=" + Clipperz.PM.Strings.selectedLanguage; 209 window.location.href = "./" + aPageName + "?ln=" + Clipperz.PM.Strings.selectedLanguage;
213 }); 210 });
214 }, 211 },
215 212
216 //----------------------------------------------------------------------------- 213 //-----------------------------------------------------------------------------
217 __syntaxFix__: "syntax fix" 214 __syntaxFix__: "syntax fix"
218}); 215});
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 28d9d20..7db6888 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/NewUserWizardController.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/NewUserWizardController.js
@@ -1,408 +1,405 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers'); 26Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers');
30 27
31Clipperz.PM.UI.Web.Controllers.NewUserWizardController = function(args) { 28Clipperz.PM.UI.Web.Controllers.NewUserWizardController = function(args) {
32 this._newUserCreationComponent = args.newUserCreationComponent|| Clipperz.Base.exception.raise('MandatoryParameter'); 29 this._newUserCreationComponent = args.newUserCreationComponent|| Clipperz.Base.exception.raise('MandatoryParameter');
33 30
34 MochiKit.Signal.connect(this._newUserCreationComponent, 'changedValue',this, 'handleChangedValue'); 31 MochiKit.Signal.connect(this._newUserCreationComponent, 'changedValue',this, 'handleChangedValue');
35 MochiKit.Signal.connect(this._newUserCreationComponent, 'moveForward',this, 'handleMoveForward'); 32 MochiKit.Signal.connect(this._newUserCreationComponent, 'moveForward',this, 'handleMoveForward');
36 MochiKit.Signal.connect(this._newUserCreationComponent, 'keyPressed',this, 'handleNewUserCreationComponentKeyPressed'); 33 MochiKit.Signal.connect(this._newUserCreationComponent, 'keyPressed',this, 'handleNewUserCreationComponentKeyPressed');
37 34
38 this._rulerComponent = null; 35 this._rulerComponent = null;
39 36
40 this._steps = null; 37 this._steps = null;
41 this._currentStepIndex = 0; 38 this._currentStepIndex = 0;
42 this._isNextEnabled = false; 39 this._isNextEnabled = false;
43 40
44 this._userCreationState = 'IDLE'; //'IN PROGRESS', 'DONE', 'FAILED' 41 this._userCreationState = 'IDLE'; //'IN PROGRESS', 'DONE', 'FAILED'
45 this._user = null; 42 this._user = null;
46 return this; 43 return this;
47} 44}
48 45
49MochiKit.Base.update(Clipperz.PM.UI.Web.Controllers.NewUserWizardController.prototype, { 46MochiKit.Base.update(Clipperz.PM.UI.Web.Controllers.NewUserWizardController.prototype, {
50 47
51 'toString': function() { 48 'toString': function() {
52 return "Clipperz.PM.UI.Web.Controllers.NewUserWizardController"; 49 return "Clipperz.PM.UI.Web.Controllers.NewUserWizardController";
53 }, 50 },
54 51
55 //------------------------------------------------------------------------- 52 //-------------------------------------------------------------------------
56 53
57 'newUserCreationComponent': function () { 54 'newUserCreationComponent': function () {
58 return this._newUserCreationComponent; 55 return this._newUserCreationComponent;
59 }, 56 },
60 57
61 //============================================================================= 58 //=============================================================================
62 59
63 'user': function () { 60 'user': function () {
64 return this._user; 61 return this._user;
65 }, 62 },
66 63
67 'setUser': function (aValue) { 64 'setUser': function (aValue) {
68 this._user = aValue; 65 this._user = aValue;
69 }, 66 },
70 67
71 //----------------------------------------------------------------------------- 68 //-----------------------------------------------------------------------------
72 69
73 'userCreationState': function () { 70 'userCreationState': function () {
74 return this._userCreationState; 71 return this._userCreationState;
75 }, 72 },
76 73
77 'setUserCreationState': function (aValue) { 74 'setUserCreationState': function (aValue) {
78//console.log("+++ NewUserWizardController.setUserCreationState", aValue); 75//console.log("+++ NewUserWizardController.setUserCreationState", aValue);
79 this._userCreationState = aValue; 76 this._userCreationState = aValue;
80 this.checkState(); 77 this.checkState();
81 }, 78 },
82 79
83 //============================================================================= 80 //=============================================================================
84 81
85 'resetCurrentStepIndex': function () { 82 'resetCurrentStepIndex': function () {
86 this._currentStepIndex = 0; 83 this._currentStepIndex = 0;
87 this.rulerComponent().resetStatus({animateTransition:true}); 84 this.rulerComponent().resetStatus({animateTransition:true});
88 }, 85 },
89 86
90 //----------------------------------------------------------------------------- 87 //-----------------------------------------------------------------------------
91 88
92 'enableNext': function (aValue) { 89 'enableNext': function (aValue) {
93 this.rulerComponent().enableNext(aValue); 90 this.rulerComponent().enableNext(aValue);
94 this._isNextEnabled = aValue; 91 this._isNextEnabled = aValue;
95 }, 92 },
96 93
97 'isNextEnabled': function () { 94 'isNextEnabled': function () {
98 return this._isNextEnabled; 95 return this._isNextEnabled;
99 }, 96 },
100 97
101 //----------------------------------------------------------------------------- 98 //-----------------------------------------------------------------------------
102 99
103 'enablePrevious': function (aValue) { 100 'enablePrevious': function (aValue) {
104 this.rulerComponent().enablePrevious(aValue); 101 this.rulerComponent().enablePrevious(aValue);
105 }, 102 },
106 103
107 //============================================================================= 104 //=============================================================================
108 105
109 'rulerComponent': function () { 106 'rulerComponent': function () {
110 if (this._rulerComponent == null) { 107 if (this._rulerComponent == null) {
111 this._rulerComponent = new Clipperz.PM.UI.Web.Components.RulerComponent({ 108 this._rulerComponent = new Clipperz.PM.UI.Web.Components.RulerComponent({
112 translationContext:'Wizards.NewUserWizard' 109 translationContext:'Wizards.NewUserWizard'
113 }); 110 });
114 this._rulerComponent.render(); 111 this._rulerComponent.render();
115 112
116 MochiKit.Signal.connect(this._rulerComponent, 'exit', this, 'handleExit'); 113 MochiKit.Signal.connect(this._rulerComponent, 'exit', this, 'handleExit');
117 MochiKit.Signal.connect(this._rulerComponent, 'done', this, 'done'); 114 MochiKit.Signal.connect(this._rulerComponent, 'done', this, 'done');
118 MochiKit.Signal.connect(this._rulerComponent, 'moveForward',this, 'handleMoveForward'); 115 MochiKit.Signal.connect(this._rulerComponent, 'moveForward',this, 'handleMoveForward');
119 MochiKit.Signal.connect(this._rulerComponent, 'moveBackward',this, 'handleMoveBackward'); 116 MochiKit.Signal.connect(this._rulerComponent, 'moveBackward',this, 'handleMoveBackward');
120 MochiKit.Signal.connect(this._rulerComponent, 'cursorMoved',this, 'handleCursorMoved'); 117 MochiKit.Signal.connect(this._rulerComponent, 'cursorMoved',this, 'handleCursorMoved');
121 } 118 }
122 119
123 return this._rulerComponent; 120 return this._rulerComponent;
124 }, 121 },
125 122
126 'resetRuler': function () { 123 'resetRuler': function () {
127 // if (this._rulerComponent != null) { 124 // if (this._rulerComponent != null) {
128 // this._rulerComponent.clear(); 125 // this._rulerComponent.clear();
129 // } 126 // }
130 // this._rulerComponent = null; 127 // this._rulerComponent = null;
131 }, 128 },
132 129
133 //----------------------------------------------------------------------------- 130 //-----------------------------------------------------------------------------
134 131
135 'showRuler': function (someSteps) { 132 'showRuler': function (someSteps) {
136 var rulerElement; 133 var rulerElement;
137 134
138 this.setSteps(someSteps); 135 this.setSteps(someSteps);
139 136
140 rulerElement = this.rulerComponent().element(); 137 rulerElement = this.rulerComponent().element();
141 this.newUserCreationComponent().disableAllPanels(); 138 this.newUserCreationComponent().disableAllPanels();
142 139
143 MochiKit.Style.showElement(rulerElement); 140 MochiKit.Style.showElement(rulerElement);
144 MochiKit.Style.setElementPosition(rulerElement, {x:-1000, y:this.newUserCreationComponent().bottomMargin()}); 141 MochiKit.Style.setElementPosition(rulerElement, {x:-1000, y:this.newUserCreationComponent().bottomMargin()});
145 new MochiKit.Visual.Move(rulerElement, { 142 new MochiKit.Visual.Move(rulerElement, {
146 x:0, y:this.newUserCreationComponent().bottomMargin(), 143 x:0, y:this.newUserCreationComponent().bottomMargin(),
147 mode:'absolute', 144 mode:'absolute',
148 duration:0.5, 145 duration:0.5,
149 // afterFinish:MochiKit.Base.method(this, 'handleCursorMoved') 146 // afterFinish:MochiKit.Base.method(this, 'handleCursorMoved')
150 afterFinish:MochiKit.Base.method(this, 'handleRulerShowed') 147 afterFinish:MochiKit.Base.method(this, 'handleRulerShowed')
151 }); 148 });
152 }, 149 },
153 150
154 //----------------------------------------------------------------------------- 151 //-----------------------------------------------------------------------------
155 152
156 'handleRulerShowed':function () { 153 'handleRulerShowed':function () {
157 return Clipperz.Async.callbacks("NewUserWizardController.handlerRulerShowed", [ 154 return Clipperz.Async.callbacks("NewUserWizardController.handlerRulerShowed", [
158 MochiKit.Base.method(this.newUserCreationComponent(), 'waitUntilFullyRendered'), 155 MochiKit.Base.method(this.newUserCreationComponent(), 'waitUntilFullyRendered'),
159 MochiKit.Base.method(this, 'handleCursorMoved') 156 MochiKit.Base.method(this, 'handleCursorMoved')
160 ], {trace:false}); 157 ], {trace:false});
161 }, 158 },
162 159
163 //----------------------------------------------------------------------------- 160 //-----------------------------------------------------------------------------
164 161
165 'hideRuler': function () { 162 'hideRuler': function () {
166 new MochiKit.Visual.Move(this.rulerComponent().element(), {x:-1000, mode:'relative', duration:0.5}); 163 new MochiKit.Visual.Move(this.rulerComponent().element(), {x:-1000, mode:'relative', duration:0.5});
167 }, 164 },
168 165
169 'doneWithRuler': function () { 166 'doneWithRuler': function () {
170 var rulerComponentElement; 167 var rulerComponentElement;
171 168
172 rulerComponentElement = this.rulerComponent().element(); 169 rulerComponentElement = this.rulerComponent().element();
173 new MochiKit.Visual.Move(this.rulerComponent().element(), { 170 new MochiKit.Visual.Move(this.rulerComponent().element(), {
174 x:1000, 171 x:1000,
175 mode:'relative', 172 mode:'relative',
176 duration:1, 173 duration:1,
177 // afterFinish:MochiKit.Base.partial(MochiKit.Style.hideElement, rulerComponentElement) 174 // afterFinish:MochiKit.Base.partial(MochiKit.Style.hideElement, rulerComponentElement)
178 afterFinish:function () { MochiKit.Style.hideElement(rulerComponentElement); } 175 afterFinish:function () { MochiKit.Style.hideElement(rulerComponentElement); }
179 }); 176 });
180 }, 177 },
181 178
182 //============================================================================= 179 //=============================================================================
183 180
184 'createNewUserRulerSteps': function () { 181 'createNewUserRulerSteps': function () {
185 return [ 'CREDENTIALS', 'CHECK_CREDENTIALS', 'TERMS_OF_SERVICE', 'CREATE_USER'/*, 'LOGIN' */]; 182 return [ 'CREDENTIALS', 'CHECK_CREDENTIALS', 'TERMS_OF_SERVICE', 'CREATE_USER'/*, 'LOGIN' */];
186 }, 183 },
187 184
188 //------------------------------------------------------------------------- 185 //-------------------------------------------------------------------------
189 186
190 'run': function () { 187 'run': function () {
191 return Clipperz.Async.callbacks("NewUserWizardController.run", [ 188 return Clipperz.Async.callbacks("NewUserWizardController.run", [
192 MochiKit.Base.method(this, 'createNewUserRulerSteps'), 189 MochiKit.Base.method(this, 'createNewUserRulerSteps'),
193 MochiKit.Base.method(this, 'showRuler') 190 MochiKit.Base.method(this, 'showRuler')
194 ], {trace:false}); 191 ], {trace:false});
195 }, 192 },
196 193
197 //----------------------------------------------------------------------------- 194 //-----------------------------------------------------------------------------
198 195
199 'checkState': function () { 196 'checkState': function () {
200 var enablePrevious; 197 var enablePrevious;
201 var enableNext; 198 var enableNext;
202 199
203 enablePrevious = true; 200 enablePrevious = true;
204 enableNext = false; 201 enableNext = false;
205 202
206 this.newUserCreationComponent().disableAllPanels(); 203 this.newUserCreationComponent().disableAllPanels();
207 204
208 switch(this.currentStep()) { 205 switch(this.currentStep()) {
209 case 'CREDENTIALS': 206 case 'CREDENTIALS':
210 this.newUserCreationComponent().enableCredentialsPanel(); 207 this.newUserCreationComponent().enableCredentialsPanel();
211 208
212 enableNext = ( 209 enableNext = (
213 (this.newUserCreationComponent().username() != '') 210 (this.newUserCreationComponent().username() != '')
214 && 211 &&
215 (this.newUserCreationComponent().passphrase() != '') 212 (this.newUserCreationComponent().passphrase() != '')
216 ); 213 );
217 // enablePrevious = false; 214 // enablePrevious = false;
218 break; 215 break;
219 case 'CHECK_CREDENTIALS': 216 case 'CHECK_CREDENTIALS':
220 this.newUserCreationComponent().enableCheckCredentialsPanel(); 217 this.newUserCreationComponent().enableCheckCredentialsPanel();
221 218
222 enableNext = (this.newUserCreationComponent().passphrase() == this.newUserCreationComponent().rePassphrase()); 219 enableNext = (this.newUserCreationComponent().passphrase() == this.newUserCreationComponent().rePassphrase());
223 // enablePrevious = true; 220 // enablePrevious = true;
224 break 221 break
225 case 'TERMS_OF_SERVICE': 222 case 'TERMS_OF_SERVICE':
226 this.newUserCreationComponent().enableTermsOfServicePanel(); 223 this.newUserCreationComponent().enableTermsOfServicePanel();
227 224
228//console.log("awareOfUnrecoverablePassphrase", this.newUserCreationComponent().awareOfUnrecoverablePassphrase()); 225//console.log("awareOfUnrecoverablePassphrase", this.newUserCreationComponent().awareOfUnrecoverablePassphrase());
229//console.log("readTermsOfService", this.newUserCreationComponent().readTermsOfService()); 226//console.log("readTermsOfService", this.newUserCreationComponent().readTermsOfService());
230 enableNext = ( 227 enableNext = (
231 (this.newUserCreationComponent().awareOfUnrecoverablePassphrase() == 'on') 228 (this.newUserCreationComponent().awareOfUnrecoverablePassphrase() == 'on')
232 && 229 &&
233 (this.newUserCreationComponent().readTermsOfService() == 'on') 230 (this.newUserCreationComponent().readTermsOfService() == 'on')
234 ) 231 )
235 break; 232 break;
236 case 'CREATE_USER': 233 case 'CREATE_USER':
237//console.log(">>> CREATE_USER", this.userCreationState()); 234//console.log(">>> CREATE_USER", this.userCreationState());
238 this.newUserCreationComponent().enableCreateUserPanel(); 235 this.newUserCreationComponent().enableCreateUserPanel();
239 236
240 switch (this.userCreationState()) { 237 switch (this.userCreationState()) {
241 case 'IDLE': 238 case 'IDLE':
242 this.setUserCreationState('IN PROGRESS'); 239 this.setUserCreationState('IN PROGRESS');
243 this.preformActualUserRegistration(); 240 this.preformActualUserRegistration();
244 241
245 enablePrevious = false; 242 enablePrevious = false;
246 enableNext = false; 243 enableNext = false;
247 break; 244 break;
248 case 'IN PROGRESS': 245 case 'IN PROGRESS':
249 enablePrevious = false; 246 enablePrevious = false;
250 enableNext = false; 247 enableNext = false;
251 break; 248 break;
252 case 'DONE': 249 case 'DONE':
253 enablePrevious = false; 250 enablePrevious = false;
254 enableNext = true; 251 enableNext = true;
255 break; 252 break;
256 case 'FAILED': 253 case 'FAILED':
257 enablePrevious = true; 254 enablePrevious = true;
258 enableNext = false; 255 enableNext = false;
259 break; 256 break;
260 }; 257 };
261 break; 258 break;
262 // case 'LOGIN': 259 // case 'LOGIN':
263 // this.newUserCreationComponent().enableLoginPanel(); 260 // this.newUserCreationComponent().enableLoginPanel();
264 // break; 261 // break;
265 } 262 }
266 263
267 if (this.currentStepIndex() > 0) { 264 if (this.currentStepIndex() > 0) {
268 this.enablePrevious(enablePrevious); 265 this.enablePrevious(enablePrevious);
269 } else { 266 } else {
270 this.enablePrevious(false); 267 this.enablePrevious(false);
271 } 268 }
272 this.enableNext(enableNext); 269 this.enableNext(enableNext);
273 }, 270 },
274 271
275 //----------------------------------------------------------------------------- 272 //-----------------------------------------------------------------------------
276 273
277 'setFocus': function () { 274 'setFocus': function () {
278 switch(this.currentStep()) { 275 switch(this.currentStep()) {
279 case 'CREDENTIALS': 276 case 'CREDENTIALS':
280 this.newUserCreationComponent().focusOnUsernameElement(); 277 this.newUserCreationComponent().focusOnUsernameElement();
281 break; 278 break;
282 case 'CHECK_CREDENTIALS': 279 case 'CHECK_CREDENTIALS':
283 this.newUserCreationComponent().focusOnRePassphraseElement(); 280 this.newUserCreationComponent().focusOnRePassphraseElement();
284 break 281 break
285 case 'TERMS_OF_SERVICE': 282 case 'TERMS_OF_SERVICE':
286 break; 283 break;
287 case 'CREATE_USER': 284 case 'CREATE_USER':
288 break; 285 break;
289 // case 'LOGIN': 286 // case 'LOGIN':
290 // break; 287 // break;
291 } 288 }
292 }, 289 },
293 290
294 //============================================================================= 291 //=============================================================================
295 292
296 'steps': function () { 293 'steps': function () {
297 return this._steps; 294 return this._steps;
298 }, 295 },
299 296
300 'setSteps': function (aValue) { 297 'setSteps': function (aValue) {
301 this._steps = aValue; 298 this._steps = aValue;
302 299
303 this.rulerComponent().setSteps(aValue); 300 this.rulerComponent().setSteps(aValue);
304 this.resetCurrentStepIndex(); 301 this.resetCurrentStepIndex();
305 }, 302 },
306 303
307 'currentStepIndex': function () { 304 'currentStepIndex': function () {
308 return this._currentStepIndex; 305 return this._currentStepIndex;
309 }, 306 },
310 307
311 'currentStep': function () { 308 'currentStep': function () {
312 return this.steps()[this.currentStepIndex()]; 309 return this.steps()[this.currentStepIndex()];
313 }, 310 },
314 311
315 //============================================================================= 312 //=============================================================================
316 313
317 'handleExit': function () { 314 'handleExit': function () {
318 return Clipperz.Async.callbacks("NewUserWizardController.handleExit", [ 315 return Clipperz.Async.callbacks("NewUserWizardController.handleExit", [
319 // MochiKit.Base.method(this.newUserCreationComponent(), 'resetContent'), 316 // MochiKit.Base.method(this.newUserCreationComponent(), 'resetContent'),
320 Clipperz.Async.forkAndJoin("NewUserWizardController.handleExit - fork and join", [ 317 Clipperz.Async.forkAndJoin("NewUserWizardController.handleExit - fork and join", [
321 MochiKit.Base.method(this, 'hideRuler'), 318 MochiKit.Base.method(this, 'hideRuler'),
322 MochiKit.Base.method(this.newUserCreationComponent(), 'deferredHideModal') 319 MochiKit.Base.method(this.newUserCreationComponent(), 'deferredHideModal')
323 ], {trace:false}), 320 ], {trace:false}),
324 MochiKit.Base.method(this, 'resetRuler'), 321 MochiKit.Base.method(this, 'resetRuler'),
325 // MochiKit.Base.method(this.newUserCreationComponent(), 'reset'), 322 // MochiKit.Base.method(this.newUserCreationComponent(), 'reset'),
326 MochiKit.Base.partial(MochiKit.Signal.signal, this, 'exit') 323 MochiKit.Base.partial(MochiKit.Signal.signal, this, 'exit')
327 ], {trace:false}) 324 ], {trace:false})
328 }, 325 },
329 326
330 'done': function () { 327 'done': function () {
331 this.doneWithRuler(); 328 this.doneWithRuler();
332 MochiKit.Signal.signal(this, 'done', {'user': this.user()}); 329 MochiKit.Signal.signal(this, 'done', {'user': this.user()});
333 }, 330 },
334 331
335 //============================================================================= 332 //=============================================================================
336 333
337 'handleMoveBackward': function () { 334 'handleMoveBackward': function () {
338 if (this._currentStepIndex > 0) { 335 if (this._currentStepIndex > 0) {
339 varafterMoveAction; 336 varafterMoveAction;
340 337
341 afterMoveAction = MochiKit.Base.noop; 338 afterMoveAction = MochiKit.Base.noop;
342 339
343//console.log("<-- backward", this.currentStep()); 340//console.log("<-- backward", this.currentStep());
344 switch(this.currentStep()) { 341 switch(this.currentStep()) {
345 case 'CREDENTIALS': 342 case 'CREDENTIALS':
346 case 'CHECK_CREDENTIALS': 343 case 'CHECK_CREDENTIALS':
347 case 'TERMS_OF_SERVICE': 344 case 'TERMS_OF_SERVICE':
348 this._currentStepIndex --; 345 this._currentStepIndex --;
349 this.rulerComponent().moveBackward(afterMoveAction); 346 this.rulerComponent().moveBackward(afterMoveAction);
350 break; 347 break;
351 case 'CREATE_USER': 348 case 'CREATE_USER':
352 this.setUser(null); 349 this.setUser(null);
353 this.newUserCreationComponent().hideAllProgeressStates(); 350 this.newUserCreationComponent().hideAllProgeressStates();
354 this.resetCurrentStepIndex(); 351 this.resetCurrentStepIndex();
355 this.setUserCreationState('IDLE'); 352 this.setUserCreationState('IDLE');
356 break; 353 break;
357 // case 'LOGIN': 354 // case 'LOGIN':
358 // break; 355 // break;
359 }; 356 };
360 357
361 } 358 }
362 359
363 if (this._currentStepIndex == 0) { 360 if (this._currentStepIndex == 0) {
364 this.enablePrevious(false); 361 this.enablePrevious(false);
365 } 362 }
366 }, 363 },
367 364
368 'handleMoveForward': function () { 365 'handleMoveForward': function () {
369 if (this.isNextEnabled()) { 366 if (this.isNextEnabled()) {
370 varafterMoveAction; 367 varafterMoveAction;
371 368
372 this._currentStepIndex ++; 369 this._currentStepIndex ++;
373 afterMoveAction = MochiKit.Base.noop; 370 afterMoveAction = MochiKit.Base.noop;
374 371
375 switch(this.currentStep()) { 372 switch(this.currentStep()) {
376 case 'CREDENTIALS': 373 case 'CREDENTIALS':
377 break; 374 break;
378 case 'CHECK_CREDENTIALS': 375 case 'CHECK_CREDENTIALS':
379 break 376 break
380 case 'TERMS_OF_SERVICE': 377 case 'TERMS_OF_SERVICE':
381 break; 378 break;
382 case 'CREATE_USER': 379 case 'CREATE_USER':
383 break; 380 break;
384 // case 'LOGIN': 381 // case 'LOGIN':
385 // break; 382 // break;
386 }; 383 };
387 384
388 this.rulerComponent().moveForward(afterMoveAction); 385 this.rulerComponent().moveForward(afterMoveAction);
389 }; 386 };
390 }, 387 },
391 388
392 'handleCursorMoved': function () { 389 'handleCursorMoved': function () {
393 // this.checkState(); 390 // this.checkState();
394 // this.setFocus(); 391 // this.setFocus();
395 392
396 return Clipperz.Async.callbacks("NewUserWizardController.handleCursorMoved", [ 393 return Clipperz.Async.callbacks("NewUserWizardController.handleCursorMoved", [
397 MochiKit.Base.method(this.newUserCreationComponent(), 'waitUntilFullyRendered'), 394 MochiKit.Base.method(this.newUserCreationComponent(), 'waitUntilFullyRendered'),
398 MochiKit.Base.method(this, 'checkState'), 395 MochiKit.Base.method(this, 'checkState'),
399 MochiKit.Base.method(this, 'setFocus') 396 MochiKit.Base.method(this, 'setFocus')
400 ], {trace:false}); 397 ], {trace:false});
401 }, 398 },
402 399
403 //------------------------------------------------------------------------- 400 //-------------------------------------------------------------------------
404 401
405 'handleChangedValue': function (anEvent) { 402 'handleChangedValue': function (anEvent) {
406 this.checkState(); 403 this.checkState();
407 }, 404 },
408 405
diff --git a/frontend/gamma/js/Clipperz/PM/UI/iPhone/Components/CardDetail.js b/frontend/gamma/js/Clipperz/PM/UI/iPhone/Components/CardDetail.js
index 23fd236..5380aa1 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/iPhone/Components/CardDetail.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/iPhone/Components/CardDetail.js
@@ -1,166 +1,163 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.PM.UI.iPhone.Components'); 26Clipperz.Base.module('Clipperz.PM.UI.iPhone.Components');
30 27
31Clipperz.PM.UI.iPhone.Components.CardDetail = function(args) { 28Clipperz.PM.UI.iPhone.Components.CardDetail = function(args) {
32 args = args || {}; 29 args = args || {};
33 30
34 Clipperz.PM.UI.iPhone.Components.CardDetail.superclass.constructor.apply(this, arguments); 31 Clipperz.PM.UI.iPhone.Components.CardDetail.superclass.constructor.apply(this, arguments);
35 32
36 this._cardReference = null; 33 this._cardReference = null;
37 34
38 return this; 35 return this;
39} 36}
40 37
41//============================================================================= 38//=============================================================================
42 39
43Clipperz.Base.extend(Clipperz.PM.UI.iPhone.Components.CardDetail, Clipperz.PM.UI.Common.Components.BaseComponent, { 40Clipperz.Base.extend(Clipperz.PM.UI.iPhone.Components.CardDetail, Clipperz.PM.UI.Common.Components.BaseComponent, {
44 41
45 //------------------------------------------------------------------------- 42 //-------------------------------------------------------------------------
46 43
47 'toString': function () { 44 'toString': function () {
48 return "Clipperz.PM.UI.iPhone.Components.CardDetail component"; 45 return "Clipperz.PM.UI.iPhone.Components.CardDetail component";
49 }, 46 },
50 47
51 //------------------------------------------------------------------------- 48 //-------------------------------------------------------------------------
52 49
53 'cardReference': function () { 50 'cardReference': function () {
54 return this._cardReference; 51 return this._cardReference;
55 }, 52 },
56 53
57 'setCardReference': function (aValue) { 54 'setCardReference': function (aValue) {
58 this._cardReference = aValue; 55 this._cardReference = aValue;
59 }, 56 },
60 57
61 //------------------------------------------------------------------------- 58 //-------------------------------------------------------------------------
62 59
63 'renderSelf': function(/*aContainer, aPosition*/) { 60 'renderSelf': function(/*aContainer, aPosition*/) {
64 this.append(this.element(), [ 61 this.append(this.element(), [
65 {tag:'div', cls:'cardDetail', id:this.getId('cardDetail'), children:[ 62 {tag:'div', cls:'cardDetail', id:this.getId('cardDetail'), children:[
66 {tag:'div', id:this.getId('progressBar')} //, 63 {tag:'div', id:this.getId('progressBar')} //,
67 // {tag:'h1', cls:'loading', html:"loading"} 64 // {tag:'h1', cls:'loading', html:"loading"}
68 ]} 65 ]}
69 ]); 66 ]);
70 67
71 this.addComponent(new Clipperz.PM.UI.Common.Components.ProgressBar({'element':this.getElement('progressBar')})); 68 this.addComponent(new Clipperz.PM.UI.Common.Components.ProgressBar({'element':this.getElement('progressBar')}));
72 MochiKit.Signal.signal(Clipperz.PM.UI.Common.Controllers.ProgressBarController.defaultController, 'updateProgress', 0); 69 MochiKit.Signal.signal(Clipperz.PM.UI.Common.Controllers.ProgressBarController.defaultController, 'updateProgress', 0);
73 }, 70 },
74 71
75 //========================================================================= 72 //=========================================================================
76 73
77 'showCardDetails': function (someData) { 74 'showCardDetails': function (someData) {
78 this.element().innerHTML = ''; 75 this.element().innerHTML = '';
79 this.append(this.element(), [ 76 this.append(this.element(), [
80 {tag:'fieldset', id:this.getId('fields'), children:MochiKit.Base.map(function (aFieldData) { 77 {tag:'fieldset', id:this.getId('fields'), children:MochiKit.Base.map(function (aFieldData) {
81 return {tag:'div', cls:'row', children:[ 78 return {tag:'div', cls:'row', children:[
82 {tag:'label', html:aFieldData['label']}, 79 {tag:'label', html:aFieldData['label']},
83 // {tag:'span', cls:('fieldValue ' + (aFieldData['isHidden']? 'password' : 'text')), html:aFieldData['value']} 80 // {tag:'span', cls:('fieldValue ' + (aFieldData['isHidden']? 'password' : 'text')), html:aFieldData['value']}
84 {tag:'div', cls:('fieldValue ' + (aFieldData['isHidden']? 'password' : 'text')), children:[ 81 {tag:'div', cls:('fieldValue ' + (aFieldData['isHidden']? 'password' : 'text')), children:[
85 {tag:'div', children:[{tag:'p', html:aFieldData['value']}]} 82 {tag:'div', children:[{tag:'p', html:aFieldData['value']}]}
86 ]} 83 ]}
87 // {tag:'input', type:'text', cls:('fieldValue ' + (aFieldData['isHidden']? 'password' : 'text')), value:aFieldData['value'], disabled:true} 84 // {tag:'input', type:'text', cls:('fieldValue ' + (aFieldData['isHidden']? 'password' : 'text')), value:aFieldData['value'], disabled:true}
88 85
89 ]} 86 ]}
90 }, someData['fields'])} 87 }, someData['fields'])}
91 ]); 88 ]);
92 89
93 MochiKit.Iter.forEach(MochiKit.Selector.findChildElements(this.element(), ['span.password']), MochiKit.Base.bind(function (aPasswordElement) { 90 MochiKit.Iter.forEach(MochiKit.Selector.findChildElements(this.element(), ['span.password']), MochiKit.Base.bind(function (aPasswordElement) {
94 MochiKit.Signal.connect(aPasswordElement, 'onclick', function (anEvent) { alert(MochiKit.DOM.scrapeText(anEvent.src())); }) 91 MochiKit.Signal.connect(aPasswordElement, 'onclick', function (anEvent) { alert(MochiKit.DOM.scrapeText(anEvent.src())); })
95 }, this)); 92 }, this));
96 93
97 if (someData['directLogins'].length > 0) { 94 if (someData['directLogins'].length > 0) {
98 this.append(this.element(), [ 95 this.append(this.element(), [
99 {tag:'h2', html:"Direct logins"}, 96 {tag:'h2', html:"Direct logins"},
100 {tag:'fieldset', id:this.getId('directLogins'), children:MochiKit.Base.map(function (aDirectLoginData) { 97 {tag:'fieldset', id:this.getId('directLogins'), children:MochiKit.Base.map(function (aDirectLoginData) {
101 return {tag:'div', cls:'row', id:('directLogin_' + aDirectLoginData['_reference']), children:[ 98 return {tag:'div', cls:'row', id:('directLogin_' + aDirectLoginData['_reference']), children:[
102 {tag:'img', cls:'favicon', src:aDirectLoginData['favicon']}, 99 {tag:'img', cls:'favicon', src:aDirectLoginData['favicon']},
103 // {tag:'input', cls:'directLogin', disabled:'disabled', type:'text', name:aDirectLoginData['label'], value:aDirectLoginData['label']} 100 // {tag:'input', cls:'directLogin', disabled:'disabled', type:'text', name:aDirectLoginData['label'], value:aDirectLoginData['label']}
104 {tag:'span', cls:'directLogin', html:aDirectLoginData['label']} 101 {tag:'span', cls:'directLogin', html:aDirectLoginData['label']}
105 ]} 102 ]}
106 }, someData['directLogins'])} 103 }, someData['directLogins'])}
107 ]); 104 ]);
108 105
109 MochiKit.Base.map(MochiKit.Base.bind(function (aRowNode) { 106 MochiKit.Base.map(MochiKit.Base.bind(function (aRowNode) {
110 MochiKit.Signal.connect(aRowNode, 'onclick', this, 'directLoginClickHandler'); 107 MochiKit.Signal.connect(aRowNode, 'onclick', this, 'directLoginClickHandler');
111 }, this), 108 }, this),
112 MochiKit.Selector.findChildElements(this.getElement('directLogins'), ['div.row']) 109 MochiKit.Selector.findChildElements(this.getElement('directLogins'), ['div.row'])
113 ) 110 )
114 }; 111 };
115 112
116 if (someData['notes'] != '') { 113 if (someData['notes'] != '') {
117 this.append(this.element(), [ 114 this.append(this.element(), [
118 {tag:'h2', html:"Notes"}, 115 {tag:'h2', html:"Notes"},
119 {tag:'fieldset', id:this.getId('fieldset'), children:[ 116 {tag:'fieldset', id:this.getId('fieldset'), children:[
120 {tag:'div', cls:'row notes', children:[ 117 {tag:'div', cls:'row notes', children:[
121 {tag:'span', html:someData['notes']} 118 {tag:'span', html:someData['notes']}
122 ]} 119 ]}
123 ]} 120 ]}
124 ]); 121 ]);
125 }; 122 };
126 123
127 return true; 124 return true;
128 }, 125 },
129 126
130 //------------------------------------------------------------------------- 127 //-------------------------------------------------------------------------
131/* 128/*
132 'toggleClickHandler': function (anEvent) { 129 'toggleClickHandler': function (anEvent) {
133 varnextState; 130 varnextState;
134 varfieldValue; 131 varfieldValue;
135 132
136//console.log("TOGGLE"); 133//console.log("TOGGLE");
137 anEvent.preventDefault; 134 anEvent.preventDefault;
138 fieldValue = MochiKit.Selector.findChildElements(anEvent.src().parentNode.parentNode, ['span.password'])[0]; 135 fieldValue = MochiKit.Selector.findChildElements(anEvent.src().parentNode.parentNode, ['span.password'])[0];
139 136
140 nextState = (MochiKit.DOM.getNodeAttribute(anEvent.src(), 'toggled') != 'true'); 137 nextState = (MochiKit.DOM.getNodeAttribute(anEvent.src(), 'toggled') != 'true');
141 if (nextState) { 138 if (nextState) {
142 MochiKit.DOM.removeElementClass(fieldValue, 'clear'); 139 MochiKit.DOM.removeElementClass(fieldValue, 'clear');
143 } else { 140 } else {
144 MochiKit.DOM.addElementClass(fieldValue, 'clear'); 141 MochiKit.DOM.addElementClass(fieldValue, 'clear');
145 } 142 }
146 143
147 MochiKit.DOM.setNodeAttribute(anEvent.src(), 'toggled', nextState); 144 MochiKit.DOM.setNodeAttribute(anEvent.src(), 'toggled', nextState);
148 }, 145 },
149*/ 146*/
150 //========================================================================= 147 //=========================================================================
151 148
152 'directLoginClickHandler': function (anEvent) { 149 'directLoginClickHandler': function (anEvent) {
153 anEvent.preventDefault(); 150 anEvent.preventDefault();
154 151
155 if (/(directLogin_)/.test(anEvent.src().id)) { 152 if (/(directLogin_)/.test(anEvent.src().id)) {
156 var directLoginReference; 153 var directLoginReference;
157 154
158 directLoginReference = anEvent.src().id.match(/(directLogin_)(.*)/)[2]; 155 directLoginReference = anEvent.src().id.match(/(directLogin_)(.*)/)[2];
159 MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'selectedDirectLogin', {cardReference:this.cardReference(), directLoginReference:directLoginReference}); 156 MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'selectedDirectLogin', {cardReference:this.cardReference(), directLoginReference:directLoginReference});
160 } 157 }
161 }, 158 },
162 159
163 //========================================================================= 160 //=========================================================================
164 161
165 __syntaxFix__: "syntax fix" 162 __syntaxFix__: "syntax fix"
166}); 163});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/iPhone/Components/CardList.js b/frontend/gamma/js/Clipperz/PM/UI/iPhone/Components/CardList.js
index 770f983..c3f2701 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/iPhone/Components/CardList.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/iPhone/Components/CardList.js
@@ -1,204 +1,201 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.PM.UI.iPhone.Components'); 26Clipperz.Base.module('Clipperz.PM.UI.iPhone.Components');
30 27
31Clipperz.PM.UI.iPhone.Components.CardList = function(args) { 28Clipperz.PM.UI.iPhone.Components.CardList = function(args) {
32 args = args || {}; 29 args = args || {};
33 30
34 Clipperz.PM.UI.iPhone.Components.CardList.superclass.constructor.apply(this, arguments); 31 Clipperz.PM.UI.iPhone.Components.CardList.superclass.constructor.apply(this, arguments);
35 32
36 this._cardDetail = null; 33 this._cardDetail = null;
37 34
38 return this; 35 return this;
39} 36}
40 37
41//============================================================================= 38//=============================================================================
42 39
43Clipperz.Base.extend(Clipperz.PM.UI.iPhone.Components.CardList, Clipperz.PM.UI.Common.Components.BaseComponent, { 40Clipperz.Base.extend(Clipperz.PM.UI.iPhone.Components.CardList, Clipperz.PM.UI.Common.Components.BaseComponent, {
44 41
45 //------------------------------------------------------------------------- 42 //-------------------------------------------------------------------------
46 43
47 'toString': function () { 44 'toString': function () {
48 return "Clipperz.PM.UI.iPhone.Components.CardList component"; 45 return "Clipperz.PM.UI.iPhone.Components.CardList component";
49 }, 46 },
50 47
51 //------------------------------------------------------------------------- 48 //-------------------------------------------------------------------------
52 49
53 'renderSelf': function(/*aContainer, aPosition*/) { 50 'renderSelf': function(/*aContainer, aPosition*/) {
54 this.append(this.element(), [ 51 this.append(this.element(), [
55 {tag:'div', cls:'toolbar', id:'toolbar', children:[ 52 {tag:'div', cls:'toolbar', id:'toolbar', children:[
56 {tag:'h1', id:'pageTitle', html:"cards"}, 53 {tag:'h1', id:'pageTitle', html:"cards"},
57 {tag:'a', id:'backButton', cls:'button', href:'#', html:"cards"} 54 {tag:'a', id:'backButton', cls:'button', href:'#', html:"cards"}
58 ]}, 55 ]},
59 {tag:'div', cls:'cardList', id:this.getId('cardList'), children:[ 56 {tag:'div', cls:'cardList', id:this.getId('cardList'), children:[
60 {tag:'form', title:'search', cls:'panel cardListSearchForm', id:this.getId('cardListSearchForm'), children:[ 57 {tag:'form', title:'search', cls:'panel cardListSearchForm', id:this.getId('cardListSearchForm'), children:[
61 {tag:'input', type:'search', name:'search', value:"", placeholder:"search", id:this.getId('searchField')} 58 {tag:'input', type:'search', name:'search', value:"", placeholder:"search", id:this.getId('searchField')}
62 ]}, 59 ]},
63 {tag:'ul', cls:'panel cardListPanel', id:this.getId('cardListPanel'), children:[]} 60 {tag:'ul', cls:'panel cardListPanel', id:this.getId('cardListPanel'), children:[]}
64 ]}, 61 ]},
65 {tag:'div', cls:'panel cardDetailPanel', id:this.getId('cardDetail')} 62 {tag:'div', cls:'panel cardDetailPanel', id:this.getId('cardDetail')}
66 ]); 63 ]);
67 64
68 MochiKit.Signal.connect(this.getElement('cardListSearchForm'), 'onsubmit', this,'searchHandler'); 65 MochiKit.Signal.connect(this.getElement('cardListSearchForm'), 'onsubmit', this,'searchHandler');
69 MochiKit.Signal.connect(this.getElement('cardListSearchForm'), 'onkeydown', this,'searchHandler'); 66 MochiKit.Signal.connect(this.getElement('cardListSearchForm'), 'onkeydown', this,'searchHandler');
70 MochiKit.Signal.connect(this.getElement('cardListSearchForm'), 'onkeyup', this,'searchHandler'); 67 MochiKit.Signal.connect(this.getElement('cardListSearchForm'), 'onkeyup', this,'searchHandler');
71 68
72 MochiKit.Signal.connect(this.getElement('cardListPanel'), 'onclick', this,'cardListClickHandler'); 69 MochiKit.Signal.connect(this.getElement('cardListPanel'), 'onclick', this,'cardListClickHandler');
73 MochiKit.Signal.connect('backButton', 'onclick', this,'backButtonClickHandler'); 70 MochiKit.Signal.connect('backButton', 'onclick', this,'backButtonClickHandler');
74 71
75 MochiKit.Style.hideElement('backButton'); 72 MochiKit.Style.hideElement('backButton');
76 MochiKit.Style.hideElement(this.getElement('cardDetail')); 73 MochiKit.Style.hideElement(this.getElement('cardDetail'));
77 }, 74 },
78 75
79 //------------------------------------------------------------------------- 76 //-------------------------------------------------------------------------
80 77
81 'searchHandler': function (anEvent) { 78 'searchHandler': function (anEvent) {
82 if ((typeof(anEvent.key()) != 'undefined') && (anEvent.key().string == 'KEY_ENTER')) { //RETURN 79 if ((typeof(anEvent.key()) != 'undefined') && (anEvent.key().string == 'KEY_ENTER')) { //RETURN
83 anEvent.preventDefault(); 80 anEvent.preventDefault();
84 } else { 81 } else {
85 if ((typeof(anEvent.key()) != 'undefined') && (anEvent.key().string == 'KEY_ESCAPE')) { 82 if ((typeof(anEvent.key()) != 'undefined') && (anEvent.key().string == 'KEY_ESCAPE')) {
86 anEvent.target().value = ""; 83 anEvent.target().value = "";
87 } 84 }
88 85
89 if (anEvent.type() == 'keyup') { 86 if (anEvent.type() == 'keyup') {
90 MochiKit.Signal.signal(this, 'searchEvent', anEvent.target().value); 87 MochiKit.Signal.signal(this, 'searchEvent', anEvent.target().value);
91 } 88 }
92 } 89 }
93 }, 90 },
94 91
95 //------------------------------------------------------------------------- 92 //-------------------------------------------------------------------------
96 93
97 'update': function (someObjects) { 94 'update': function (someObjects) {
98 varcardListPanel; 95 varcardListPanel;
99 var i,c; 96 var i,c;
100 97
101 cardListPanel = this.getElement('cardListPanel'); 98 cardListPanel = this.getElement('cardListPanel');
102 cardListPanel.innerHTML = ''; 99 cardListPanel.innerHTML = '';
103 100
104 c = someObjects.length; 101 c = someObjects.length;
105 102
106 for (i=0; i<c; i++) { 103 for (i=0; i<c; i++) {
107 this.append(cardListPanel, {tag:'li', cls:'cardListItem', id:('cardListItem_' + someObjects[i]['_reference']), children:[ 104 this.append(cardListPanel, {tag:'li', cls:'cardListItem', id:('cardListItem_' + someObjects[i]['_reference']), children:[
108 {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=')}, 105 {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=')},
109 {tag:'a', id:('cardListReference_' + someObjects[i]['_reference']), href:'#', html:someObjects[i]['label']} 106 {tag:'a', id:('cardListReference_' + someObjects[i]['_reference']), href:'#', html:someObjects[i]['label']}
110 ]}) 107 ]})
111 108
112 MochiKit.Signal.connect('cardListItem_' + someObjects[i]['_reference'], 'onclick', this, 'cardListClickHandler'); 109 MochiKit.Signal.connect('cardListItem_' + someObjects[i]['_reference'], 'onclick', this, 'cardListClickHandler');
113 } 110 }
114 111
115 }, 112 },
116 113
117 'cardListClickHandler': function (anEvent) { 114 'cardListClickHandler': function (anEvent) {
118 anEvent.preventDefault(); 115 anEvent.preventDefault();
119 116
120 if (/(cardListReference_|cardListItem_)/.test(anEvent.target().id)) { 117 if (/(cardListReference_|cardListItem_)/.test(anEvent.target().id)) {
121 var cardListReference; 118 var cardListReference;
122 119
123 cardListReference = anEvent.target().id.match(/(cardListReference_|cardListItem_)(.*)/)[2]; 120 cardListReference = anEvent.target().id.match(/(cardListReference_|cardListItem_)(.*)/)[2];
124//console.log("Showing detail for card named", cardListReference); 121//console.log("Showing detail for card named", cardListReference);
125 MochiKit.Signal.signal(this, 'selectedCard', cardListReference); 122 MochiKit.Signal.signal(this, 'selectedCard', cardListReference);
126 } 123 }
127 }, 124 },
128 125
129 //========================================================================= 126 //=========================================================================
130 127
131 'cardDetail': function (someData) { 128 'cardDetail': function (someData) {
132 if (this._cardDetail == null) { 129 if (this._cardDetail == null) {
133 this._cardDetail = new Clipperz.PM.UI.iPhone.Components.CardDetail({element:this.getElement('cardDetail')}); 130 this._cardDetail = new Clipperz.PM.UI.iPhone.Components.CardDetail({element:this.getElement('cardDetail')});
134 } 131 }
135 132
136 return this._cardDetail; 133 return this._cardDetail;
137 }, 134 },
138 135
139 //------------------------------------------------------------------------- 136 //-------------------------------------------------------------------------
140 137
141 'removeCardDetail': function () { 138 'removeCardDetail': function () {
142 if (this._cardDetail != null) { 139 if (this._cardDetail != null) {
143 this._cardDetail.remove(); 140 this._cardDetail.remove();
144 this._cardDetail = null; 141 this._cardDetail = null;
145 } 142 }
146 }, 143 },
147 144
148 //========================================================================= 145 //=========================================================================
149 146
150 'showCard': function (someData) { 147 'showCard': function (someData) {
151 vardeferredResult; 148 vardeferredResult;
152 varoffset; 149 varoffset;
153 150
154 offset = ((MochiKit.DOM.getNodeAttribute(MochiKit.DOM.currentDocument().body, 'orientation') == 'portrait') ? 320 : 480); 151 offset = ((MochiKit.DOM.getNodeAttribute(MochiKit.DOM.currentDocument().body, 'orientation') == 'portrait') ? 320 : 480);
155 this.cardDetail().render(); 152 this.cardDetail().render();
156 this.cardDetail().setCardReference(someData['_reference']); 153 this.cardDetail().setCardReference(someData['_reference']);
157 MochiKit.Style.setElementPosition(this.cardDetail().element(), {x:offset}); 154 MochiKit.Style.setElementPosition(this.cardDetail().element(), {x:offset});
158 new MochiKit.Visual.Sequence([ 155 new MochiKit.Visual.Sequence([
159 // new MochiKit.Visual.Move(this.cardDetail().element(), {x:offset, y:45, mode:'absolute', duration:0, sync:true}), 156 // new MochiKit.Visual.Move(this.cardDetail().element(), {x:offset, y:45, mode:'absolute', duration:0, sync:true}),
160 new MochiKit.Visual.Parallel([ 157 new MochiKit.Visual.Parallel([
161 new MochiKit.Visual.Move(this.getElement('cardList'), {x:-offset, y:0, mode:'relative',transition:MochiKit.Visual.Transitions.linear, sync:true}), 158 new MochiKit.Visual.Move(this.getElement('cardList'), {x:-offset, y:0, mode:'relative',transition:MochiKit.Visual.Transitions.linear, sync:true}),
162 new MochiKit.Visual.Move(this.getElement('cardDetail'), {x:0, y:45, mode:'absolute',transition:MochiKit.Visual.Transitions.linear, sync:true}), 159 new MochiKit.Visual.Move(this.getElement('cardDetail'), {x:0, y:45, mode:'absolute',transition:MochiKit.Visual.Transitions.linear, sync:true}),
163 // new MochiKit.Visual.ScrollTo('toolbar', {sync:true}), 160 // new MochiKit.Visual.ScrollTo('toolbar', {sync:true}),
164 MochiKit.Visual.appear ('backButton', { transition:MochiKit.Visual.Transitions.linear, sync:true}) 161 MochiKit.Visual.appear ('backButton', { transition:MochiKit.Visual.Transitions.linear, sync:true})
165 ], {duration:1, sync:true}), 162 ], {duration:1, sync:true}),
166 MochiKit.Visual.fade(this.getElement('cardList'), {duration:0, sync:true}) 163 MochiKit.Visual.fade(this.getElement('cardList'), {duration:0, sync:true})
167 ], {}) 164 ], {})
168 165
169 MochiKit.DOM.getElement('pageTitle').innerHTML = someData['title']; 166 MochiKit.DOM.getElement('pageTitle').innerHTML = someData['title'];
170 167
171 return true; 168 return true;
172 }, 169 },
173 170
174 //------------------------------------------------------------------------- 171 //-------------------------------------------------------------------------
175 172
176 'showCardDetails': function (someData) { 173 'showCardDetails': function (someData) {
177 return this.cardDetail().showCardDetails(someData); 174 return this.cardDetail().showCardDetails(someData);
178 }, 175 },
179 176
180 //========================================================================= 177 //=========================================================================
181 178
182 'backButtonClickHandler': function (anEvent) { 179 'backButtonClickHandler': function (anEvent) {
183 varoffset; 180 varoffset;
184 181
185 anEvent.preventDefault(); 182 anEvent.preventDefault();
186 183
187 MochiKit.DOM.getElement('pageTitle').innerHTML = "cards"; 184 MochiKit.DOM.getElement('pageTitle').innerHTML = "cards";
188 185
189 offset = ((MochiKit.DOM.getNodeAttribute(MochiKit.DOM.currentDocument().body, 'orientation') == 'portrait') ? 320 : 480); 186 offset = ((MochiKit.DOM.getNodeAttribute(MochiKit.DOM.currentDocument().body, 'orientation') == 'portrait') ? 320 : 480);
190 MochiKit.Style.setElementPosition(this.getElement('cardList'), {x:-offset}); 187 MochiKit.Style.setElementPosition(this.getElement('cardList'), {x:-offset});
191 MochiKit.DOM.showElement(this.getElement('cardList')); 188 MochiKit.DOM.showElement(this.getElement('cardList'));
192 189
193 new MochiKit.Visual.Parallel([ 190 new MochiKit.Visual.Parallel([
194 new MochiKit.Visual.Move(this.getElement('cardList'), {x:offset, y:0, mode:'relative',transition:MochiKit.Visual.Transitions.linear, sync:true}), 191 new MochiKit.Visual.Move(this.getElement('cardList'), {x:offset, y:0, mode:'relative',transition:MochiKit.Visual.Transitions.linear, sync:true}),
195 new MochiKit.Visual.Move(this.getElement('cardDetail'), {x:offset, y:0, mode:'relative',transition:MochiKit.Visual.Transitions.linear, sync:true}), 192 new MochiKit.Visual.Move(this.getElement('cardDetail'), {x:offset, y:0, mode:'relative',transition:MochiKit.Visual.Transitions.linear, sync:true}),
196 MochiKit.Visual.fade (this.getElement('cardDetail'), { transition:MochiKit.Visual.Transitions.linear, sync:true}), 193 MochiKit.Visual.fade (this.getElement('cardDetail'), { transition:MochiKit.Visual.Transitions.linear, sync:true}),
197 MochiKit.Visual.fade ('backButton', { transition:MochiKit.Visual.Transitions.linear, sync:true}) 194 MochiKit.Visual.fade ('backButton', { transition:MochiKit.Visual.Transitions.linear, sync:true})
198 ], {duration:1, afterFinish:MochiKit.Base.method(this, 'removeCardDetail')}) 195 ], {duration:1, afterFinish:MochiKit.Base.method(this, 'removeCardDetail')})
199 196
200 }, 197 },
201 198
202 //========================================================================= 199 //=========================================================================
203 __syntaxFix__: "syntax fix" 200 __syntaxFix__: "syntax fix"
204}); 201});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/iPhone/Components/LoginForm.js b/frontend/gamma/js/Clipperz/PM/UI/iPhone/Components/LoginForm.js
index eec83b0..5341878 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/iPhone/Components/LoginForm.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/iPhone/Components/LoginForm.js
@@ -1,181 +1,178 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.PM.UI.iPhone.Components'); 26Clipperz.Base.module('Clipperz.PM.UI.iPhone.Components');
30 27
31Clipperz.PM.UI.iPhone.Components.LoginForm = function(args) { 28Clipperz.PM.UI.iPhone.Components.LoginForm = function(args) {
32 args = args || {}; 29 args = args || {};
33 30
34 Clipperz.PM.UI.iPhone.Components.LoginForm.superclass.constructor.apply(this, arguments); 31 Clipperz.PM.UI.iPhone.Components.LoginForm.superclass.constructor.apply(this, arguments);
35 32
36 return this; 33 return this;
37} 34}
38 35
39//============================================================================= 36//=============================================================================
40 37
41Clipperz.Base.extend(Clipperz.PM.UI.iPhone.Components.LoginForm, Clipperz.PM.UI.Common.Components.BaseComponent, { 38Clipperz.Base.extend(Clipperz.PM.UI.iPhone.Components.LoginForm, Clipperz.PM.UI.Common.Components.BaseComponent, {
42 39
43 //------------------------------------------------------------------------- 40 //-------------------------------------------------------------------------
44 41
45 'toString': function () { 42 'toString': function () {
46 return "Clipperz.PM.UI.iPhone.Components.LoginForm component"; 43 return "Clipperz.PM.UI.iPhone.Components.LoginForm component";
47 }, 44 },
48 45
49 //------------------------------------------------------------------------- 46 //-------------------------------------------------------------------------
50 47
51 'focusOnUsername': function () { 48 'focusOnUsername': function () {
52 this.getElement('username').focus(); 49 this.getElement('username').focus();
53 }, 50 },
54 51
55 //------------------------------------------------------------------------- 52 //-------------------------------------------------------------------------
56 53
57 'username': function () { 54 'username': function () {
58 return this.getElement('username').value; 55 return this.getElement('username').value;
59 }, 56 },
60 57
61 'passphrase': function () { 58 'passphrase': function () {
62 return this.getElement('passphrase').value; 59 return this.getElement('passphrase').value;
63 }, 60 },
64 61
65 //------------------------------------------------------------------------- 62 //-------------------------------------------------------------------------
66 63
67 'renderSelf': function(/*aContainer, aPosition*/) { 64 'renderSelf': function(/*aContainer, aPosition*/) {
68 this.append(this.element(), [ 65 this.append(this.element(), [
69 {tag:'div', cls:'toolbar iPhoneClipperzToolbar', children:[ 66 {tag:'div', cls:'toolbar iPhoneClipperzToolbar', children:[
70 {tag:'h1', id:'pageTitle', html:'Clipperz'}, 67 {tag:'h1', id:'pageTitle', html:'Clipperz'},
71 {tag:'a', id:'backButton', cls:'button', href:'#', html:"back"} 68 {tag:'a', id:'backButton', cls:'button', href:'#', html:"back"}
72 ]}, 69 ]},
73 {tag:'form', title:'Theaters', cls:'panel toolbarlessPanel loginForm', id:this.getId('loginFormPanel'), children:[ 70 {tag:'form', title:'Theaters', cls:'panel toolbarlessPanel loginForm', id:this.getId('loginFormPanel'), children:[
74 {tag:'fieldset', id:this.getId('fieldset'), children:[ 71 {tag:'fieldset', id:this.getId('fieldset'), children:[
75 {tag:'div', cls:'row', children:[ 72 {tag:'div', cls:'row', children:[
76 {tag:'label', html:"username"}, 73 {tag:'label', html:"username"},
77 {tag:'input', type:'text', name:'username', value:"", autocorrect:'off', autocapitalize:'off', id:this.getId('username')} 74 {tag:'input', type:'text', name:'username', value:"", autocorrect:'off', autocapitalize:'off', id:this.getId('username')}
78 ]}, 75 ]},
79 {tag:'div', cls:'row', children:[ 76 {tag:'div', cls:'row', children:[
80 {tag:'label', html:"passphrase"}, 77 {tag:'label', html:"passphrase"},
81 {tag:'input', type:'password', name:'passphrase', value:"", id:this.getId('passphrase')} 78 {tag:'input', type:'password', name:'passphrase', value:"", id:this.getId('passphrase')}
82 ]} 79 ]}
83 ]}, 80 ]},
84 {tag:'a', cls:'whiteButton', type:'submit', href:'#', html:"Login", id:this.getId('submit')} 81 {tag:'a', cls:'whiteButton', type:'submit', href:'#', html:"Login", id:this.getId('submit')}
85 ]}, 82 ]},
86 {tag:'div', cls:'panel toolbarlessPanel loginProgressPanel', id:this.getId('loginProgressPanel'), children:[ 83 {tag:'div', cls:'panel toolbarlessPanel loginProgressPanel', id:this.getId('loginProgressPanel'), children:[
87 {tag:'div', id:this.getId('progressBar')} //, 84 {tag:'div', id:this.getId('progressBar')} //,
88 // {tag:'a', cls:'whiteButton', type:'submit', href:'#', html:"Cancel", id:this.getId('cancel')} 85 // {tag:'a', cls:'whiteButton', type:'submit', href:'#', html:"Cancel", id:this.getId('cancel')}
89 ]}, 86 ]},
90 {tag:'div', cls:'panel loginErrorPanel', id:this.getId('loginErrorPanel'), children:[ 87 {tag:'div', cls:'panel loginErrorPanel', id:this.getId('loginErrorPanel'), children:[
91 {tag:'div', cls:'errorMessage', id:this.getId('errorMessageBox'), children:[ 88 {tag:'div', cls:'errorMessage', id:this.getId('errorMessageBox'), children:[
92 {tag:'h2', id:this.getId('errorMessage'), html:"Login failed"} 89 {tag:'h2', id:this.getId('errorMessage'), html:"Login failed"}
93 ]} 90 ]}
94 ]} 91 ]}
95 ]); 92 ]);
96 93
97 MochiKit.Signal.connect(this.getElement('submit'), 'onclick',this, 'submitHandler'); 94 MochiKit.Signal.connect(this.getElement('submit'), 'onclick',this, 'submitHandler');
98 MochiKit.Signal.connect(this.getElement('loginFormPanel'), 'onsubmit',this, 'submitHandler'); 95 MochiKit.Signal.connect(this.getElement('loginFormPanel'), 'onsubmit',this, 'submitHandler');
99 96
100 // MochiKit.Signal.connect(this.getElement('cancel'), 'onclick',this, 'cancelHandler'); 97 // MochiKit.Signal.connect(this.getElement('cancel'), 'onclick',this, 'cancelHandler');
101 MochiKit.Signal.connect('backButton', 'onclick',this, 'backHandler'); 98 MochiKit.Signal.connect('backButton', 'onclick',this, 'backHandler');
102 99
103 this.addComponent(new Clipperz.PM.UI.Common.Components.ProgressBar({'element':this.getElement('progressBar')})); 100 this.addComponent(new Clipperz.PM.UI.Common.Components.ProgressBar({'element':this.getElement('progressBar')}));
104 101
105 // MochiKit.Style.hideElement(this.getElement('errorMessage')); 102 // MochiKit.Style.hideElement(this.getElement('errorMessage'));
106 103
107 this.showLoginForm(); 104 this.showLoginForm();
108 // MochiKit.Async.callLater(0.2, MochiKit.Base.method(this, 'focusOnUsername')); 105 // MochiKit.Async.callLater(0.2, MochiKit.Base.method(this, 'focusOnUsername'));
109 }, 106 },
110 107
111 //------------------------------------------------------------------------- 108 //-------------------------------------------------------------------------
112 109
113 'showLoginForm': function () { 110 'showLoginForm': function () {
114 MochiKit.Style.showElement(this.getElement('loginFormPanel')); 111 MochiKit.Style.showElement(this.getElement('loginFormPanel'));
115 MochiKit.Style.hideElement(this.getElement('loginProgressPanel')); 112 MochiKit.Style.hideElement(this.getElement('loginProgressPanel'));
116 MochiKit.Style.hideElement(this.getElement('loginErrorPanel')); 113 MochiKit.Style.hideElement(this.getElement('loginErrorPanel'));
117 MochiKit.Style.hideElement('backButton'); 114 MochiKit.Style.hideElement('backButton');
118 }, 115 },
119 116
120 'slideInLoginForm': function () { 117 'slideInLoginForm': function () {
121 varoffset; 118 varoffset;
122 119
123 offset = ((MochiKit.DOM.getNodeAttribute(MochiKit.DOM.currentDocument().body, 'orientation') == 'portrait') ? 320 : 480); 120 offset = ((MochiKit.DOM.getNodeAttribute(MochiKit.DOM.currentDocument().body, 'orientation') == 'portrait') ? 320 : 480);
124 121
125 MochiKit.Style.showElement(this.getElement('loginFormPanel')); 122 MochiKit.Style.showElement(this.getElement('loginFormPanel'));
126 MochiKit.Style.setElementPosition(this.getElement('loginFormPanel'), {x:-offset, y:0}); 123 MochiKit.Style.setElementPosition(this.getElement('loginFormPanel'), {x:-offset, y:0});
127 124
128 new MochiKit.Visual.Sequence([ 125 new MochiKit.Visual.Sequence([
129 new MochiKit.Visual.Parallel([ 126 new MochiKit.Visual.Parallel([
130 new MochiKit.Visual.Move(this.getElement('loginErrorPanel'), {x:offset, y:0, mode:'relative',transition:MochiKit.Visual.Transitions.linear, sync:true}), 127 new MochiKit.Visual.Move(this.getElement('loginErrorPanel'), {x:offset, y:0, mode:'relative',transition:MochiKit.Visual.Transitions.linear, sync:true}),
131 new MochiKit.Visual.Move(this.getElement('loginFormPanel'), {x:0, y:0, mode:'absolute',transition:MochiKit.Visual.Transitions.linear, sync:true}), 128 new MochiKit.Visual.Move(this.getElement('loginFormPanel'), {x:0, y:0, mode:'absolute',transition:MochiKit.Visual.Transitions.linear, sync:true}),
132 MochiKit.Visual.fade ('backButton', { transition:MochiKit.Visual.Transitions.linear, sync:true}) 129 MochiKit.Visual.fade ('backButton', { transition:MochiKit.Visual.Transitions.linear, sync:true})
133 ], {duration:0.5, sync:true}), 130 ], {duration:0.5, sync:true}),
134 MochiKit.Visual.fade(this.getElement('loginErrorPanel'), {duration:0, sync:true}) 131 MochiKit.Visual.fade(this.getElement('loginErrorPanel'), {duration:0, sync:true})
135 ], {}) 132 ], {})
136 }, 133 },
137 134
138 'showLoginProgress': function () { 135 'showLoginProgress': function () {
139 MochiKit.Style.hideElement(this.getElement('loginFormPanel')); 136 MochiKit.Style.hideElement(this.getElement('loginFormPanel'));
140 MochiKit.Style.showElement(this.getElement('loginProgressPanel')); 137 MochiKit.Style.showElement(this.getElement('loginProgressPanel'));
141 }, 138 },
142 139
143 'showLoginError': function (anError) { 140 'showLoginError': function (anError) {
144 this.getElement('errorMessage').innerHTML = "Login error"; 141 this.getElement('errorMessage').innerHTML = "Login error";
145 142
146 MochiKit.Style.showElement('backButton'); 143 MochiKit.Style.showElement('backButton');
147 MochiKit.Style.hideElement(this.getElement('loginProgressPanel')); 144 MochiKit.Style.hideElement(this.getElement('loginProgressPanel'));
148 MochiKit.Style.showElement(this.getElement('loginErrorPanel')); 145 MochiKit.Style.showElement(this.getElement('loginErrorPanel'));
149 MochiKit.Style.setElementPosition(this.getElement('loginErrorPanel'), {x:0, y:45}); 146 MochiKit.Style.setElementPosition(this.getElement('loginErrorPanel'), {x:0, y:45});
150 }, 147 },
151 148
152 //------------------------------------------------------------------------- 149 //-------------------------------------------------------------------------
153/* 150/*
154 'disableCancelButton': function () { 151 'disableCancelButton': function () {
155 MochiKit.DOM.hideElement(this.getElement('cancel')); 152 MochiKit.DOM.hideElement(this.getElement('cancel'));
156 }, 153 },
157*/ 154*/
158 //------------------------------------------------------------------------- 155 //-------------------------------------------------------------------------
159 156
160 'submitHandler': function (anEvent) { 157 'submitHandler': function (anEvent) {
161 anEvent.preventDefault(); 158 anEvent.preventDefault();
162 159
163 MochiKit.Signal.signal(this, 'doLogin', {'username':this.username(), 'passphrase':this.passphrase()}); 160 MochiKit.Signal.signal(this, 'doLogin', {'username':this.username(), 'passphrase':this.passphrase()});
164 }, 161 },
165 162
166 'cancelHandler': function (anEvent) { 163 'cancelHandler': function (anEvent) {
167 anEvent.preventDefault(); 164 anEvent.preventDefault();
168 165
169//console.log("CANCEL"); 166//console.log("CANCEL");
170 }, 167 },
171 168
172 'backHandler': function (anEvent) { 169 'backHandler': function (anEvent) {
173 anEvent.preventDefault(); 170 anEvent.preventDefault();
174 171
175 this.slideInLoginForm(); 172 this.slideInLoginForm();
176 }, 173 },
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/iPhone/Controllers/MainController.js b/frontend/gamma/js/Clipperz/PM/UI/iPhone/Controllers/MainController.js
index b43d877..3fcaae1 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/iPhone/Controllers/MainController.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/iPhone/Controllers/MainController.js
@@ -1,372 +1,369 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.PM.UI.iPhone.Controllers'); 26Clipperz.Base.module('Clipperz.PM.UI.iPhone.Controllers');
30 27
31 //Some parts of this controller have been derived from the iUI library. 28 //Some parts of this controller have been derived from the iUI library.
32 29
33Clipperz.PM.UI.iPhone.Controllers.MainController = function() { 30Clipperz.PM.UI.iPhone.Controllers.MainController = function() {
34 this._loginForm = null; 31 this._loginForm = null;
35 this._cardList = null; 32 this._cardList = null;
36 this._cachedValues =null; 33 this._cachedValues =null;
37 this._user = null; 34 this._user = null;
38 35
39 if (typeof window.onorientationchange == 'object') { 36 if (typeof window.onorientationchange == 'object') {
40 MochiKit.Signal.connect(window, 'onorientationchange', this, 'orientationChangeHandler'); 37 MochiKit.Signal.connect(window, 'onorientationchange', this, 'orientationChangeHandler');
41 MochiKit.Async.callLater(0, MochiKit.Base.method(this, 'orientationChangeHandler')); 38 MochiKit.Async.callLater(0, MochiKit.Base.method(this, 'orientationChangeHandler'));
42 } else { 39 } else {
43 this.setOrientation('portrait'); 40 this.setOrientation('portrait');
44 // this.setOrientation('landscape'); 41 // this.setOrientation('landscape');
45 } 42 }
46 43
47 this.addMetaTag('viewport', 'width=devicewidth; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;'); 44 this.addMetaTag('viewport', 'width=devicewidth; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;');
48 this.addMetaTag('apple-mobile-web-app-capable', 'yes'); 45 this.addMetaTag('apple-mobile-web-app-capable', 'yes');
49 this.addMetaTag('apple-mobile-web-app-status-bar-style', 'black'); 46 this.addMetaTag('apple-mobile-web-app-status-bar-style', 'black');
50 47
51 this.addLinkTag('apple-touch-icon', 'data:image/png;charset=utf-8;base64,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'); 48 this.addLinkTag('apple-touch-icon', 'data:image/png;charset=utf-8;base64,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');
52 //this.addLinkTag('apple-touch-startup-image', 'default.png'); 49 //this.addLinkTag('apple-touch-startup-image', 'default.png');
53 50
54 // if (!window.navigator.standalone)// not running as an installed app 51 // if (!window.navigator.standalone)// not running as an installed app
55 52
56 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'selectedDirectLogin', this, 'selectedDirectLoginHandler'); 53 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'selectedDirectLogin', this, 'selectedDirectLoginHandler');
57 54
58 MochiKit.DOM.addElementClass(document.body, 'iPhone'); 55 MochiKit.DOM.addElementClass(document.body, 'iPhone');
59 return this; 56 return this;
60} 57}
61 58
62MochiKit.Base.update(Clipperz.PM.UI.iPhone.Controllers.MainController.prototype, { 59MochiKit.Base.update(Clipperz.PM.UI.iPhone.Controllers.MainController.prototype, {
63 60
64 'toString': function () { 61 'toString': function () {
65 return "Clipperz.PM.UI.iPhone.Controllers.MainController"; 62 return "Clipperz.PM.UI.iPhone.Controllers.MainController";
66 }, 63 },
67 64
68 //========================================================================= 65 //=========================================================================
69 66
70 'user': function () { 67 'user': function () {
71 return this._user; 68 return this._user;
72 }, 69 },
73 70
74 'setUser': function (aValue) { 71 'setUser': function (aValue) {
75 this._user = aValue; 72 this._user = aValue;
76 }, 73 },
77 74
78 //========================================================================= 75 //=========================================================================
79 76
80 'loginForm': function() { 77 'loginForm': function() {
81 if (this._loginForm == null) { 78 if (this._loginForm == null) {
82 MochiKit.DOM.removeElement('mainDiv'); 79 MochiKit.DOM.removeElement('mainDiv');
83 this._loginForm = new Clipperz.PM.UI.iPhone.Components.LoginForm({element:MochiKit.DOM.currentDocument().body}); 80 this._loginForm = new Clipperz.PM.UI.iPhone.Components.LoginForm({element:MochiKit.DOM.currentDocument().body});
84 MochiKit.Signal.connect(this._loginForm, 'doLogin', this, 'doLoginHandler') 81 MochiKit.Signal.connect(this._loginForm, 'doLogin', this, 'doLoginHandler')
85 } 82 }
86 83
87 return this._loginForm; 84 return this._loginForm;
88 }, 85 },
89 86
90 'removeLoginForm': function () { 87 'removeLoginForm': function () {
91 if (this._loginForm != null) { 88 if (this._loginForm != null) {
92 this._loginForm.remove(); 89 this._loginForm.remove();
93 this._loginForm = null; 90 this._loginForm = null;
94 } 91 }
95 }, 92 },
96 93
97 //----------------------------------------------------------------------------- 94 //-----------------------------------------------------------------------------
98 95
99 'cardList': function () { 96 'cardList': function () {
100 if (this._cardList == null) { 97 if (this._cardList == null) {
101 this._cardList = new Clipperz.PM.UI.iPhone.Components.CardList({element:MochiKit.DOM.currentDocument().body}); 98 this._cardList = new Clipperz.PM.UI.iPhone.Components.CardList({element:MochiKit.DOM.currentDocument().body});
102 MochiKit.Signal.connect(this._cardList, 'searchEvent',this, 'searchEventHandler') 99 MochiKit.Signal.connect(this._cardList, 'searchEvent',this, 'searchEventHandler')
103 MochiKit.Signal.connect(this._cardList, 'selectedCard',this, 'selecetedCardHandler') 100 MochiKit.Signal.connect(this._cardList, 'selectedCard',this, 'selecetedCardHandler')
104 } 101 }
105 102
106 return this._cardList; 103 return this._cardList;
107 }, 104 },
108 105
109 //========================================================================= 106 //=========================================================================
110 107
111 'currentWidth': function () { 108 'currentWidth': function () {
112 return this._currentWidth; 109 return this._currentWidth;
113 }, 110 },
114 111
115 'setCurrentWidth': function (aValue) { 112 'setCurrentWidth': function (aValue) {
116 this._currentWidth = aValue; 113 this._currentWidth = aValue;
117 }, 114 },
118 115
119 //========================================================================= 116 //=========================================================================
120 117
121 'orientationChangeHandler': function () { 118 'orientationChangeHandler': function () {
122 switch(window.orientation) { 119 switch(window.orientation) {
123 case 0: 120 case 0:
124 this.setOrientation('portrait'); 121 this.setOrientation('portrait');
125 break; 122 break;
126 case 90: 123 case 90:
127 case -90: 124 case -90:
128 this.setOrientation('landscape'); 125 this.setOrientation('landscape');
129 break; 126 break;
130 } 127 }
131 }, 128 },
132 129
133 //------------------------------------------------------------------------- 130 //-------------------------------------------------------------------------
134 131
135 'setOrientation': function (anOrientation) { 132 'setOrientation': function (anOrientation) {
136 document.body.setAttribute('orientation', anOrientation); 133 document.body.setAttribute('orientation', anOrientation);
137 setTimeout(scrollTo, 100, 0, 1); 134 setTimeout(scrollTo, 100, 0, 1);
138 }, 135 },
139 136
140 //------------------------------------------------------------------------- 137 //-------------------------------------------------------------------------
141 138
142 'slidePages': function (fromPage, toPage, backwards) { 139 'slidePages': function (fromPage, toPage, backwards) {
143 var axis; 140 var axis;
144 var slideDone; 141 var slideDone;
145 142
146 slideDone = function () { 143 slideDone = function () {
147 // console.log("slideDone"); 144 // console.log("slideDone");
148 if (!hasClass(toPage, "dialog")) { 145 if (!hasClass(toPage, "dialog")) {
149 fromPage.removeAttribute("selected"); 146 fromPage.removeAttribute("selected");
150 } 147 }
151 checkTimer = setInterval(checkOrientAndLocation, 300); 148 checkTimer = setInterval(checkOrientAndLocation, 300);
152 setTimeout(updatePage, 0, toPage, fromPage); 149 setTimeout(updatePage, 0, toPage, fromPage);
153 fromPage.removeEventListener('webkitTransitionEnd', slideDone, false); 150 fromPage.removeEventListener('webkitTransitionEnd', slideDone, false);
154 } 151 }
155 152
156 axis = (backwards ? fromPage : toPage).getAttribute("axis"); 153 axis = (backwards ? fromPage : toPage).getAttribute("axis");
157 154
158 clearInterval(checkTimer); 155 clearInterval(checkTimer);
159 156
160 if (canDoSlideAnim() && axis != 'y') { 157 if (canDoSlideAnim() && axis != 'y') {
161 slide2(fromPage, toPage, backwards, slideDone); 158 slide2(fromPage, toPage, backwards, slideDone);
162 } else { 159 } else {
163 slide1(fromPage, toPage, backwards, axis, slideDone); 160 slide1(fromPage, toPage, backwards, axis, slideDone);
164 } 161 }
165 }, 162 },
166 163
167 //------------------------------------------------------------------------- 164 //-------------------------------------------------------------------------
168 165
169 'getCachedValues': function () { 166 'getCachedValues': function () {
170 var deferredResult; 167 var deferredResult;
171 168
172 if (this._cachedObjects != null) { 169 if (this._cachedObjects != null) {
173 deferredResult = MochiKit.Async.succeed(this._cachedObjects); 170 deferredResult = MochiKit.Async.succeed(this._cachedObjects);
174 } else { 171 } else {
175 deferredResult = new Clipperz.Async.Deferred("MainController.getCachedValues", {trace:false}); 172 deferredResult = new Clipperz.Async.Deferred("MainController.getCachedValues", {trace:false});
176 deferredResult.addMethod(this.user(), 'getRecords'); 173 deferredResult.addMethod(this.user(), 'getRecords');
177 deferredResult.addCallback(MochiKit.Base.map, Clipperz.Async.collectResults("MainController.getCachedValues - collectResults", { 174 deferredResult.addCallback(MochiKit.Base.map, Clipperz.Async.collectResults("MainController.getCachedValues - collectResults", {
178 '_rowObject': MochiKit.Async.succeed, 175 '_rowObject': MochiKit.Async.succeed,
179 '_reference': MochiKit.Base.methodcaller('reference'), 176 '_reference': MochiKit.Base.methodcaller('reference'),
180 'label': MochiKit.Base.methodcaller('label'), 177 'label': MochiKit.Base.methodcaller('label'),
181 'favicon': MochiKit.Base.methodcaller('favicon'), 178 'favicon': MochiKit.Base.methodcaller('favicon'),
182 '_searchableContent':MochiKit.Base.methodcaller('searchableContent') 179 '_searchableContent':MochiKit.Base.methodcaller('searchableContent')
183 }, {trace:false})); 180 }, {trace:false}));
184 deferredResult.addCallback(Clipperz.Async.collectAll); 181 deferredResult.addCallback(Clipperz.Async.collectAll);
185 deferredResult.addCallback(MochiKit.Base.bind(function (someRows) { 182 deferredResult.addCallback(MochiKit.Base.bind(function (someRows) {
186 this._cachedObjects = someRows; 183 this._cachedObjects = someRows;
187 return this._cachedObjects; 184 return this._cachedObjects;
188 }, this)); 185 }, this));
189 deferredResult.callback(); 186 deferredResult.callback();
190 } 187 }
191 188
192 return deferredResult; 189 return deferredResult;
193 }, 190 },
194 //========================================================================= 191 //=========================================================================
195 192
196 'run': function(shouldShowRegistrationForm) { 193 'run': function(shouldShowRegistrationForm) {
197 this.loginForm().render(); 194 this.loginForm().render();
198 MochiKit.Async.callLater(1, MochiKit.Base.method(this.loginForm(), 'focusOnUsername')); 195 MochiKit.Async.callLater(1, MochiKit.Base.method(this.loginForm(), 'focusOnUsername'));
199 }, 196 },
200 197
201 //========================================================================= 198 //=========================================================================
202 199
203 'doLoginHandler': function (someArgs) { 200 'doLoginHandler': function (someArgs) {
204 var deferredResult; 201 var deferredResult;
205 varparameters; 202 varparameters;
206 varshouldUseOTP; 203 varshouldUseOTP;
207 // var loginProgress; 204 // var loginProgress;
208 varuser; 205 varuser;
209 var getPassphraseDelegate; 206 var getPassphraseDelegate;
210 207
211 parameters = someArgs; 208 parameters = someArgs;
212 shouldUseOTP = (typeof(parameters.passphrase) == 'undefined'); 209 shouldUseOTP = (typeof(parameters.passphrase) == 'undefined');
213 210
214 getPassphraseDelegate = MochiKit.Base.partial(MochiKit.Async.succeed, parameters.passphrase); 211 getPassphraseDelegate = MochiKit.Base.partial(MochiKit.Async.succeed, parameters.passphrase);
215 user = new Clipperz.PM.DataModel.User({'username':parameters.username, 'getPassphraseFunction':getPassphraseDelegate}); 212 user = new Clipperz.PM.DataModel.User({'username':parameters.username, 'getPassphraseFunction':getPassphraseDelegate});
216 213
217 deferredResult = new Clipperz.Async.Deferred("MainController.doLogin", {trace:false}); 214 deferredResult = new Clipperz.Async.Deferred("MainController.doLogin", {trace:false});
218 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'initProgress', {'steps':4}); 215 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'initProgress', {'steps':4});
219 deferredResult.addMethod(this.loginForm(), 'showLoginProgress'); 216 deferredResult.addMethod(this.loginForm(), 'showLoginProgress');
220 deferredResult.addCallback(MochiKit.Async.wait, 0.1); 217 deferredResult.addCallback(MochiKit.Async.wait, 0.1);
221 deferredResult.addMethod(Clipperz.Crypto.PRNG.defaultRandomGenerator(), 'deferredEntropyCollection'); 218 deferredResult.addMethod(Clipperz.Crypto.PRNG.defaultRandomGenerator(), 'deferredEntropyCollection');
222 deferredResult.addMethod(user, 'login'); 219 deferredResult.addMethod(user, 'login');
223 deferredResult.addMethod(this, 'setUser', user); 220 deferredResult.addMethod(this, 'setUser', user);
224 deferredResult.addMethod(user, 'getRecords'); 221 deferredResult.addMethod(user, 'getRecords');
225 deferredResult.addMethod(this, 'removeLoginForm'); 222 deferredResult.addMethod(this, 'removeLoginForm');
226 deferredResult.addMethod(this.cardList(), 'render'); 223 deferredResult.addMethod(this.cardList(), 'render');
227 deferredResult.addMethod(this, 'displaySelectedRecords', ''); 224 deferredResult.addMethod(this, 'displaySelectedRecords', '');
228 deferredResult.addErrback(MochiKit.Base.method(this.loginForm(), 'showLoginError')); 225 deferredResult.addErrback(MochiKit.Base.method(this.loginForm(), 'showLoginError'));
229 deferredResult.callback(); 226 deferredResult.callback();
230 227
231 return deferredResult; 228 return deferredResult;
232 }, 229 },
233 230
234 //========================================================================= 231 //=========================================================================
235 232
236 'searchEventHandler': function (aValue) { 233 'searchEventHandler': function (aValue) {
237//console.log("searching for ... " + aValue); 234//console.log("searching for ... " + aValue);
238 return this.displaySelectedRecords(aValue); 235 return this.displaySelectedRecords(aValue);
239 }, 236 },
240 237
241 //========================================================================= 238 //=========================================================================
242 239
243 '_displaySelectedRows': function (aFilter, someRows) { 240 '_displaySelectedRows': function (aFilter, someRows) {
244 var result; 241 var result;
245 242
246 result = someRows; 243 result = someRows;
247 244
248 if (aFilter != null) { 245 if (aFilter != null) {
249 var filter; 246 var filter;
250 varfilterRegExp; 247 varfilterRegExp;
251 248
252 filter = aFilter.replace(/[^A-Za-z0-9]/g, "\\$&"); 249 filter = aFilter.replace(/[^A-Za-z0-9]/g, "\\$&");
253 filterRegExp = new RegExp(filter, "i"); 250 filterRegExp = new RegExp(filter, "i");
254 result = MochiKit.Base.filter(function (aCachedResult) { return filterRegExp.test(aCachedResult['_searchableContent'])}, result); 251 result = MochiKit.Base.filter(function (aCachedResult) { return filterRegExp.test(aCachedResult['_searchableContent'])}, result);
255 } 252 }
256 253
257 254
258 result.sort(MochiKit.Base.partial(function (aKey, aComparator, aObject, bObject) { 255 result.sort(MochiKit.Base.partial(function (aKey, aComparator, aObject, bObject) {
259 return aComparator(aObject[aKey], bObject[aKey]); 256 return aComparator(aObject[aKey], bObject[aKey]);
260 }, 'label', Clipperz.Base.caseInsensitiveCompare)); 257 }, 'label', Clipperz.Base.caseInsensitiveCompare));
261 258
262 this.cardList().update(result); 259 this.cardList().update(result);
263 }, 260 },
264 261
265 //------------------------------------------------------------------------- 262 //-------------------------------------------------------------------------
266 263
267 'displaySelectedRecords': function (aFilter) { 264 'displaySelectedRecords': function (aFilter) {
268 return Clipperz.Async.callbacks("MainController.displaySelectedrows", [ 265 return Clipperz.Async.callbacks("MainController.displaySelectedrows", [
269 MochiKit.Base.method(this, 'getCachedValues'), 266 MochiKit.Base.method(this, 'getCachedValues'),
270 MochiKit.Base.method(this, '_displaySelectedRows', aFilter) 267 MochiKit.Base.method(this, '_displaySelectedRows', aFilter)
271 ], {trace:false}); 268 ], {trace:false});
272 }, 269 },
273 270
274 //========================================================================= 271 //=========================================================================
275 272
276 'selecetedCardHandler': function (aRecordReference) { 273 'selecetedCardHandler': function (aRecordReference) {
277 vardeferredResult; 274 vardeferredResult;
278 varrecordData; 275 varrecordData;
279 276
280 recordData = {}; 277 recordData = {};
281//console.log("Showing detail for card with reference", aRecordReference); 278//console.log("Showing detail for card with reference", aRecordReference);
282 deferredResult = new Clipperz.Async.Deferred("MainController.selectedCardHandler", {trace:false}); 279 deferredResult = new Clipperz.Async.Deferred("MainController.selectedCardHandler", {trace:false});
283 deferredResult.addMethod(this.user(), 'getRecord', aRecordReference); 280 deferredResult.addMethod(this.user(), 'getRecord', aRecordReference);
284 deferredResult.collectResults({ 281 deferredResult.collectResults({
285 '_reference':MochiKit.Base.methodcaller('reference'), 282 '_reference':MochiKit.Base.methodcaller('reference'),
286 'title': MochiKit.Base.methodcaller('label'), 283 'title': MochiKit.Base.methodcaller('label'),
287 'favicon': MochiKit.Base.methodcaller('favicon') 284 'favicon': MochiKit.Base.methodcaller('favicon')
288 }); 285 });
289 deferredResult.addCallback(function (someData) { 286 deferredResult.addCallback(function (someData) {
290 MochiKit.Base.update(recordData, someData); 287 MochiKit.Base.update(recordData, someData);
291 }) 288 })
292 deferredResult.addMethod(this.cardList(), 'showCard', recordData); 289 deferredResult.addMethod(this.cardList(), 'showCard', recordData);
293 290
294 deferredResult.addMethod(this.user(), 'getRecord', aRecordReference); 291 deferredResult.addMethod(this.user(), 'getRecord', aRecordReference);
295 deferredResult.addMethodcaller('notes'); 292 deferredResult.addMethodcaller('notes');
296 deferredResult.addCallback(function (someNotes) { 293 deferredResult.addCallback(function (someNotes) {
297 recordData['notes'] = someNotes; 294 recordData['notes'] = someNotes;
298 }) 295 })
299 296
300 deferredResult.addMethod(this.user(), 'getRecord', aRecordReference); 297 deferredResult.addMethod(this.user(), 'getRecord', aRecordReference);
301 deferredResult.addMethodcaller('getCurrentRecordVersion'); 298 deferredResult.addMethodcaller('getCurrentRecordVersion');
302 deferredResult.addMethodcaller('fields'); 299 deferredResult.addMethodcaller('fields');
303 deferredResult.addCallback(MochiKit.Base.values); 300 deferredResult.addCallback(MochiKit.Base.values);
304 deferredResult.addCallback(MochiKit.Base.map, Clipperz.Async.collectResults("MainController.selectedCardHandler - fields", { 301 deferredResult.addCallback(MochiKit.Base.map, Clipperz.Async.collectResults("MainController.selectedCardHandler - fields", {
305 'label':MochiKit.Base.methodcaller('label'), 302 'label':MochiKit.Base.methodcaller('label'),
306 'value':MochiKit.Base.methodcaller('value'), 303 'value':MochiKit.Base.methodcaller('value'),
307 'isHidden':MochiKit.Base.methodcaller('isHidden') 304 'isHidden':MochiKit.Base.methodcaller('isHidden')
308 }, {trace:false})); 305 }, {trace:false}));
309 deferredResult.addCallback(Clipperz.Async.collectAll); 306 deferredResult.addCallback(Clipperz.Async.collectAll);
310 deferredResult.addCallback(function (someData) { 307 deferredResult.addCallback(function (someData) {
311 recordData['fields'] = someData; 308 recordData['fields'] = someData;
312 }); 309 });
313 310
314 deferredResult.addMethod(this.user(), 'getRecord', aRecordReference); 311 deferredResult.addMethod(this.user(), 'getRecord', aRecordReference);
315 deferredResult.addMethodcaller('directLogins'); 312 deferredResult.addMethodcaller('directLogins');
316 deferredResult.addCallback(MochiKit.Base.values); 313 deferredResult.addCallback(MochiKit.Base.values);
317 deferredResult.addCallback(MochiKit.Base.map, Clipperz.Async.collectResults("MainController.selectedCardHandler - directLogins", { 314 deferredResult.addCallback(MochiKit.Base.map, Clipperz.Async.collectResults("MainController.selectedCardHandler - directLogins", {
318 'label': MochiKit.Base.methodcaller('label'), 315 'label': MochiKit.Base.methodcaller('label'),
319 'favicon': MochiKit.Base.methodcaller('favicon'), 316 'favicon': MochiKit.Base.methodcaller('favicon'),
320 '_reference':MochiKit.Base.methodcaller('reference') 317 '_reference':MochiKit.Base.methodcaller('reference')
321 }, {trace:false})); 318 }, {trace:false}));
322 deferredResult.addCallback(Clipperz.Async.collectAll); 319 deferredResult.addCallback(Clipperz.Async.collectAll);
323 deferredResult.addCallback(function (someData) { 320 deferredResult.addCallback(function (someData) {
324 recordData['directLogins'] = someData; 321 recordData['directLogins'] = someData;
325 }); 322 });
326 323
327 deferredResult.addMethod(this.cardList(), 'showCardDetails', recordData); 324 deferredResult.addMethod(this.cardList(), 'showCardDetails', recordData);
328 deferredResult.callback(); 325 deferredResult.callback();
329 326
330 return deferredResult; 327 return deferredResult;
331 }, 328 },
332 329
333 //========================================================================= 330 //=========================================================================
334 331
335 'selectedDirectLoginHandler': function (someData) { 332 'selectedDirectLoginHandler': function (someData) {
336 vardeferredResult; 333 vardeferredResult;
337 334
338//console.log("<<< signal - directLogin"); 335//console.log("<<< signal - directLogin");
339 deferredResult = new Clipperz.Async.Deferred("MainController.selectedDirectLoginHandler", {trace:false}); 336 deferredResult = new Clipperz.Async.Deferred("MainController.selectedDirectLoginHandler", {trace:false});
340 deferredResult.addMethod(this.user(), 'getRecord', someData['cardReference']); 337 deferredResult.addMethod(this.user(), 'getRecord', someData['cardReference']);
341 deferredResult.addMethodcaller('directLogins'); 338 deferredResult.addMethodcaller('directLogins');
342 deferredResult.addCallback(MochiKit.Base.itemgetter(someData['directLoginReference'])); 339 deferredResult.addCallback(MochiKit.Base.itemgetter(someData['directLoginReference']));
343 // deferredResult.addMethodcaller('runDirectLogin'); 340 // deferredResult.addMethodcaller('runDirectLogin');
344 deferredResult.addCallback(Clipperz.PM.UI.Common.Controllers.DirectLoginRunner.openDirectLogin); 341 deferredResult.addCallback(Clipperz.PM.UI.Common.Controllers.DirectLoginRunner.openDirectLogin);
345 deferredResult.callback(); 342 deferredResult.callback();
346 343
347 return deferredResult; 344 return deferredResult;
348 }, 345 },
349 346
350 //========================================================================= 347 //=========================================================================
351 348
352 'addMetaTag': function (aName, aContent) { 349 'addMetaTag': function (aName, aContent) {
353 varmetaTag; 350 varmetaTag;
354 351
355 metaTag = document.createElement('meta'); 352 metaTag = document.createElement('meta');
356 metaTag.name = aName; 353 metaTag.name = aName;
357 metaTag.content = aContent; 354 metaTag.content = aContent;
358 document.getElementsByTagName('head')[0].appendChild(metaTag); 355 document.getElementsByTagName('head')[0].appendChild(metaTag);
359 }, 356 },
360 357
361 'addLinkTag': function (aRel, anHref) { 358 'addLinkTag': function (aRel, anHref) {
362 var linkTag; 359 var linkTag;
363 360
364 linkTag = document.createElement('link'); 361 linkTag = document.createElement('link');
365 linkTag.rel = aRel; 362 linkTag.rel = aRel;
366 linkTag.href = anHref; 363 linkTag.href = anHref;
367 document.getElementsByTagName('head')[0].appendChild(linkTag); 364 document.getElementsByTagName('head')[0].appendChild(linkTag);
368 }, 365 },
369 366
370 //========================================================================= 367 //=========================================================================
371 __syntaxFix__: "syntax fix" 368 __syntaxFix__: "syntax fix"
372}); \ No newline at end of file 369}); \ No newline at end of file
diff --git a/frontend/gamma/js/Clipperz/Set.js b/frontend/gamma/js/Clipperz/Set.js
index 61e0769..7023888 100644
--- a/frontend/gamma/js/Clipperz/Set.js
+++ b/frontend/gamma/js/Clipperz/Set.js
@@ -1,167 +1,164 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29 26
30if (typeof(Clipperz) == 'undefined') { 27if (typeof(Clipperz) == 'undefined') {
31 Clipperz = {}; 28 Clipperz = {};
32} 29}
33 30
34//############################################################################# 31//#############################################################################
35 32
36Clipperz.Set = function(args) { 33Clipperz.Set = function(args) {
37 args = args || {}; 34 args = args || {};
38 //MochiKit.Base.bindMethods(this); 35 //MochiKit.Base.bindMethods(this);
39 36
40 if (args.items != null) { 37 if (args.items != null) {
41 this._items = args.items.slice(); 38 this._items = args.items.slice();
42 } else { 39 } else {
43 this._items = []; 40 this._items = [];
44 } 41 }
45 42
46 return this; 43 return this;
47} 44}
48 45
49//============================================================================= 46//=============================================================================
50 47
51Clipperz.Set.prototype = MochiKit.Base.update(null, { 48Clipperz.Set.prototype = MochiKit.Base.update(null, {
52 49
53 //------------------------------------------------------------------------- 50 //-------------------------------------------------------------------------
54 51
55 'toString': function() { 52 'toString': function() {
56 return "Clipperz.Set"; 53 return "Clipperz.Set";
57 }, 54 },
58 55
59 //------------------------------------------------------------------------- 56 //-------------------------------------------------------------------------
60 57
61 'items': function() { 58 'items': function() {
62 return this._items; 59 return this._items;
63 }, 60 },
64 61
65 //------------------------------------------------------------------------- 62 //-------------------------------------------------------------------------
66 63
67 'popAnItem': function() { 64 'popAnItem': function() {
68 var result; 65 var result;
69 66
70 if (this.size() > 0) { 67 if (this.size() > 0) {
71 result = this.items().pop(); 68 result = this.items().pop();
72 } else { 69 } else {
73 result = null; 70 result = null;
74 } 71 }
75 72
76 return result; 73 return result;
77 }, 74 },
78 75
79 //------------------------------------------------------------------------- 76 //-------------------------------------------------------------------------
80 77
81 'allItems': function() { 78 'allItems': function() {
82 return this.items(); 79 return this.items();
83 }, 80 },
84 81
85 //------------------------------------------------------------------------- 82 //-------------------------------------------------------------------------
86 83
87 'contains': function(anItem) { 84 'contains': function(anItem) {
88 return (this.indexOf(anItem) != -1); 85 return (this.indexOf(anItem) != -1);
89 }, 86 },
90 87
91 //------------------------------------------------------------------------- 88 //-------------------------------------------------------------------------
92 89
93 'indexOf': function(anItem) { 90 'indexOf': function(anItem) {
94 varresult; 91 varresult;
95 vari, c; 92 vari, c;
96 93
97 result = -1; 94 result = -1;
98 95
99 c = this.items().length; 96 c = this.items().length;
100 for (i=0; (i<c) && (result == -1); i++) { 97 for (i=0; (i<c) && (result == -1); i++) {
101 if (this.items()[i] === anItem) { 98 if (this.items()[i] === anItem) {
102 result = i; 99 result = i;
103 } 100 }
104 } 101 }
105 102
106 return result; 103 return result;
107 }, 104 },
108 105
109 //------------------------------------------------------------------------- 106 //-------------------------------------------------------------------------
110 107
111 'add': function(anItem) { 108 'add': function(anItem) {
112 if (anItem.constructor == Array) { 109 if (anItem.constructor == Array) {
113 MochiKit.Base.map(MochiKit.Base.bind(this,add, this), anItem); 110 MochiKit.Base.map(MochiKit.Base.bind(this,add, this), anItem);
114 } else { 111 } else {
115 if (! this.contains(anItem)) { 112 if (! this.contains(anItem)) {
116 this.items().push(anItem); 113 this.items().push(anItem);
117 } 114 }
118 } 115 }
119 }, 116 },
120 117
121 //------------------------------------------------------------------------- 118 //-------------------------------------------------------------------------
122 119
123 'debug': function() { 120 'debug': function() {
124 vari, c; 121 vari, c;
125 122
126 result = -1; 123 result = -1;
127 124
128 c = this.items().length; 125 c = this.items().length;
129 for (i=0; i<c; i++) { 126 for (i=0; i<c; i++) {
130 alert("[" + i + "] " + this.items()[i].label); 127 alert("[" + i + "] " + this.items()[i].label);
131 } 128 }
132 }, 129 },
133 130
134 //------------------------------------------------------------------------- 131 //-------------------------------------------------------------------------
135 132
136 'remove': function(anItem) { 133 'remove': function(anItem) {
137 if (anItem.constructor == Array) { 134 if (anItem.constructor == Array) {
138 MochiKit.Base.map(MochiKit.Base.bind(this.remove, this), anItem); 135 MochiKit.Base.map(MochiKit.Base.bind(this.remove, this), anItem);
139 } else { 136 } else {
140 varitemIndex; 137 varitemIndex;
141 138
142 itemIndex = this.indexOf(anItem); 139 itemIndex = this.indexOf(anItem);
143 if (itemIndex != -1) { 140 if (itemIndex != -1) {
144 this.items().splice(itemIndex, 1); 141 this.items().splice(itemIndex, 1);
145 } 142 }
146 } 143 }
147 }, 144 },
148 145
149 //------------------------------------------------------------------------- 146 //-------------------------------------------------------------------------
150 147
151 'size': function() { 148 'size': function() {
152 return this.items().length; 149 return this.items().length;
153 }, 150 },
154 151
155 //------------------------------------------------------------------------- 152 //-------------------------------------------------------------------------
156 153
157 'empty': function() { 154 'empty': function() {
158 this.items().splice(0, this.items().length); 155 this.items().splice(0, this.items().length);
159 }, 156 },
160 157
161 //------------------------------------------------------------------------- 158 //-------------------------------------------------------------------------
162 159
163 __syntaxFix__: "syntax fix" 160 __syntaxFix__: "syntax fix"
164 161
165 //------------------------------------------------------------------------- 162 //-------------------------------------------------------------------------
166}); 163});
167 164
diff --git a/frontend/gamma/js/Clipperz/Signal.js b/frontend/gamma/js/Clipperz/Signal.js
index b82499a..ca3e322 100644
--- a/frontend/gamma/js/Clipperz/Signal.js
+++ b/frontend/gamma/js/Clipperz/Signal.js
@@ -1,71 +1,68 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
30if (typeof(Clipperz.Signal) == 'undefined') { Clipperz.Signal = {}; } 27if (typeof(Clipperz.Signal) == 'undefined') { Clipperz.Signal = {}; }
31 28
32Clipperz.Signal.VERSION = "0.1"; 29Clipperz.Signal.VERSION = "0.1";
33Clipperz.Signal.NAME = "Clipperz.Signal"; 30Clipperz.Signal.NAME = "Clipperz.Signal";
34 31
35MochiKit.Base.update(Clipperz.Signal, { 32MochiKit.Base.update(Clipperz.Signal, {
36 33
37 //------------------------------------------------------------------------- 34 //-------------------------------------------------------------------------
38 35
39 '__repr__': function () { 36 '__repr__': function () {
40 return "[" + this.NAME + " " + this.VERSION + "]"; 37 return "[" + this.NAME + " " + this.VERSION + "]";
41 }, 38 },
42 39
43 //------------------------------------------------------------------------- 40 //-------------------------------------------------------------------------
44 41
45 'toString': function () { 42 'toString': function () {
46 return this.__repr__(); 43 return this.__repr__();
47 }, 44 },
48 45
49 //------------------------------------------------------------------------- 46 //-------------------------------------------------------------------------
50 47
51 'fireNativeEvent': function(element, eventName) { 48 'fireNativeEvent': function(element, eventName) {
52 if (element.fireEvent) { 49 if (element.fireEvent) {
53 // MSIE 50 // MSIE
54 element.fireEvent(eventName); 51 element.fireEvent(eventName);
55 } else { 52 } else {
56 // W3C 53 // W3C
57 var event; 54 var event;
58 55
59 event = document.createEvent("HTMLEvents"); 56 event = document.createEvent("HTMLEvents");
60 event.initEvent(eventName.replace(/^on/, ""), true, true); 57 event.initEvent(eventName.replace(/^on/, ""), true, true);
61 element.dispatchEvent(event); 58 element.dispatchEvent(event);
62 } 59 }
63 }, 60 },
64 61
65 //------------------------------------------------------------------------- 62 //-------------------------------------------------------------------------
66 __syntaxFix__: "syntax fix" 63 __syntaxFix__: "syntax fix"
67 64
68}); 65});
69 66
70Clipperz.Signal.NotificationCenter = {}; 67Clipperz.Signal.NotificationCenter = {};
71 68
diff --git a/frontend/gamma/js/Clipperz/Style.js b/frontend/gamma/js/Clipperz/Style.js
index 3717f61..d377893 100644
--- a/frontend/gamma/js/Clipperz/Style.js
+++ b/frontend/gamma/js/Clipperz/Style.js
@@ -1,94 +1,91 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
30if (typeof(Clipperz.Style) == 'undefined') { Clipperz.Style = {}; } 27if (typeof(Clipperz.Style) == 'undefined') { Clipperz.Style = {}; }
31 28
32Clipperz.Style.VERSION = "0.1"; 29Clipperz.Style.VERSION = "0.1";
33Clipperz.Style.NAME = "Clipperz.DOM"; 30Clipperz.Style.NAME = "Clipperz.DOM";
34 31
35MochiKit.Base.update(Clipperz.Style, { 32MochiKit.Base.update(Clipperz.Style, {
36 33
37 //------------------------------------------------------------------------- 34 //-------------------------------------------------------------------------
38 35
39 '__repr__': function () { 36 '__repr__': function () {
40 return "[" + this.NAME + " " + this.VERSION + "]"; 37 return "[" + this.NAME + " " + this.VERSION + "]";
41 }, 38 },
42 39
43 //------------------------------------------------------------------------- 40 //-------------------------------------------------------------------------
44 41
45 'toString': function () { 42 'toString': function () {
46 return this.__repr__(); 43 return this.__repr__();
47 }, 44 },
48 45
49 //------------------------------------------------------------------------- 46 //-------------------------------------------------------------------------
50 47
51 'applyZebraStylesToTable': function(aTable) { 48 'applyZebraStylesToTable': function(aTable) {
52 var tbody; 49 var tbody;
53 var tbodyRows; 50 var tbodyRows;
54 var i,c; 51 var i,c;
55 52
56 tbody = MochiKit.DOM.getFirstElementByTagAndClassName('tbody', null, aTable); 53 tbody = MochiKit.DOM.getFirstElementByTagAndClassName('tbody', null, aTable);
57 tbodyRows = tbody.childNodes; 54 tbodyRows = tbody.childNodes;
58 // tbodyRows = MochiKit.DOM.getElementsByTagAndClassName('tr', null, tbody) 55 // tbodyRows = MochiKit.DOM.getElementsByTagAndClassName('tr', null, tbody)
59 c = tbodyRows.length; 56 c = tbodyRows.length;
60 for (i=0; i<c; i++) { 57 for (i=0; i<c; i++) {
61 var element; 58 var element;
62 59
63 element = YAHOO.Element.get(tbodyRows[i]); 60 element = YAHOO.Element.get(tbodyRows[i]);
64 element.addClass(((i%2 == 0) ? "zebra_odd": "zebra_even")); 61 element.addClass(((i%2 == 0) ? "zebra_odd": "zebra_even"));
65 element.removeClass(((i%2 == 1) ? "zebra_odd": "zebra_even")); 62 element.removeClass(((i%2 == 1) ? "zebra_odd": "zebra_even"));
66 } 63 }
67 }, 64 },
68 65
69 //------------------------------------------------------------------------- 66 //-------------------------------------------------------------------------
70 67
71 'getSizeAndPosition': function (anElement) { 68 'getSizeAndPosition': function (anElement) {
72 var result; 69 var result;
73 70
74 if (anElement != null) { 71 if (anElement != null) {
75 result ={ dimensions:MochiKit.Style.getElementDimensions(anElement), position:MochiKit.Style.getElementPosition(anElement)}; 72 result ={ dimensions:MochiKit.Style.getElementDimensions(anElement), position:MochiKit.Style.getElementPosition(anElement)};
76 } else { 73 } else {
77 result ={ dimensions:MochiKit.Style.getViewportDimensions(), position:MochiKit.Style.getViewportPosition()}; 74 result ={ dimensions:MochiKit.Style.getViewportDimensions(), position:MochiKit.Style.getViewportPosition()};
78 } 75 }
79 76
80 return result; 77 return result;
81 }, 78 },
82 79
83 'setBackgroundGradient': function (anElement, someParameters) { 80 'setBackgroundGradient': function (anElement, someParameters) {
84 // background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ff9955), to(#ff6622), color-stop(1,#333333)); 81 // background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ff9955), to(#ff6622), color-stop(1,#333333));
85 // background: -moz-linear-gradient(0% 100% 90deg,#ff6622, #ff9955); 82 // background: -moz-linear-gradient(0% 100% 90deg,#ff6622, #ff9955);
86 MochiKit.Style.setStyle(anElement, {'background': '-webkit-gradient(linear, 0% 0%, 0% 100%, from(' + someParameters['from'] + '), to(' + someParameters['to'] + '), color-stop(1,#333333))'}); 83 MochiKit.Style.setStyle(anElement, {'background': '-webkit-gradient(linear, 0% 0%, 0% 100%, from(' + someParameters['from'] + '), to(' + someParameters['to'] + '), color-stop(1,#333333))'});
87 MochiKit.Style.setStyle(anElement, {'background': '-moz-linear-gradient(0% 100% 90deg,' + someParameters['to'] + ', ' + someParameters['from'] + ')'}); 84 MochiKit.Style.setStyle(anElement, {'background': '-moz-linear-gradient(0% 100% 90deg,' + someParameters['to'] + ', ' + someParameters['from'] + ')'});
88 }, 85 },
89 86
90 //------------------------------------------------------------------------- 87 //-------------------------------------------------------------------------
91 __syntaxFix__: "syntax fix" 88 __syntaxFix__: "syntax fix"
92 89
93}); 90});
94 91
diff --git a/frontend/gamma/js/Clipperz/Visual.js b/frontend/gamma/js/Clipperz/Visual.js
index b907d5c..c2da3b7 100644
--- a/frontend/gamma/js/Clipperz/Visual.js
+++ b/frontend/gamma/js/Clipperz/Visual.js
@@ -1,368 +1,365 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
30if (typeof(Clipperz.Visual) == 'undefined') { Clipperz.Visual = {}; } 27if (typeof(Clipperz.Visual) == 'undefined') { Clipperz.Visual = {}; }
31 28
32Clipperz.Visual.VERSION = "0.1"; 29Clipperz.Visual.VERSION = "0.1";
33Clipperz.Visual.NAME = "Clipperz.Visual"; 30Clipperz.Visual.NAME = "Clipperz.Visual";
34 31
35MochiKit.Base.update(Clipperz.Visual, { 32MochiKit.Base.update(Clipperz.Visual, {
36 33
37 //------------------------------------------------------------------------- 34 //-------------------------------------------------------------------------
38 35
39 '__repr__': function () { 36 '__repr__': function () {
40 return "[" + this.NAME + " " + this.VERSION + "]"; 37 return "[" + this.NAME + " " + this.VERSION + "]";
41 }, 38 },
42 39
43 //------------------------------------------------------------------------- 40 //-------------------------------------------------------------------------
44 41
45 'toString': function () { 42 'toString': function () {
46 return this.__repr__(); 43 return this.__repr__();
47 }, 44 },
48 45
49 //------------------------------------------------------------------------- 46 //-------------------------------------------------------------------------
50 47
51 'deferredResize': function (anElement, someOptions) { 48 'deferredResize': function (anElement, someOptions) {
52 var deferredResult; 49 var deferredResult;
53 var moveTransition; 50 var moveTransition;
54 var scaleTransition; 51 var scaleTransition;
55 var duration; 52 var duration;
56 53
57 duration = someOptions.duration || 0.5; 54 duration = someOptions.duration || 0.5;
58 55
59 deferredResult = new Clipperz.Async.Deferred("Visual.deferredResize", {trace:false}); 56 deferredResult = new Clipperz.Async.Deferred("Visual.deferredResize", {trace:false});
60 deferredResult.addCallback(MochiKit.Async.succeed, arguments[arguments.length - 1]); 57 deferredResult.addCallback(MochiKit.Async.succeed, arguments[arguments.length - 1]);
61 58
62 moveTransition = MochiKit.Visual.Transitions.linear;//MochiKit.Visual.Transitions.sinoidal; 59 moveTransition = MochiKit.Visual.Transitions.linear;//MochiKit.Visual.Transitions.sinoidal;
63 scaleTransition = MochiKit.Visual.Transitions.linear;//MochiKit.Visual.Transitions.sinoidal; 60 scaleTransition = MochiKit.Visual.Transitions.linear;//MochiKit.Visual.Transitions.sinoidal;
64 61
65 MochiKit.Style.setElementPosition(anElement, {x:someOptions.from.position.x, y:someOptions.from.position.y }, 'px'); 62 MochiKit.Style.setElementPosition(anElement, {x:someOptions.from.position.x, y:someOptions.from.position.y }, 'px');
66 63
67 new MochiKit.Visual.Parallel([ 64 new MochiKit.Visual.Parallel([
68 new MochiKit.Visual.Move(anElement, {x:someOptions.to.position.x, y:someOptions.to.position.y, mode:'absolute', transition:moveTransition, sync:true}), 65 new MochiKit.Visual.Move(anElement, {x:someOptions.to.position.x, y:someOptions.to.position.y, mode:'absolute', transition:moveTransition, sync:true}),
69 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}) 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})
70 ], {duration:duration, afterFinish:MochiKit.Base.method(deferredResult, 'callback')}) 67 ], {duration:duration, afterFinish:MochiKit.Base.method(deferredResult, 'callback')})
71 68
72 return deferredResult; 69 return deferredResult;
73 }, 70 },
74 71
75 //------------------------------------------------------------------------- 72 //-------------------------------------------------------------------------
76 73
77 'deferredAnimation': function (anAnimation, someParameters, someOptions) { 74 'deferredAnimation': function (anAnimation, someParameters, someOptions) {
78 vardeferredResult; 75 vardeferredResult;
79 var afterFinishCallback; 76 var afterFinishCallback;
80 var options; 77 var options;
81 78
82 deferredResult = new Clipperz.Async.Deferred("Clipperz.Visual.deferredAnimation", {trace:false}); 79 deferredResult = new Clipperz.Async.Deferred("Clipperz.Visual.deferredAnimation", {trace:false});
83 deferredResult.addCallback(MochiKit.Async.succeed, arguments[arguments.length - 1]); 80 deferredResult.addCallback(MochiKit.Async.succeed, arguments[arguments.length - 1]);
84 81
85 if (MochiKit.Base.isUndefinedOrNull(someOptions)) { 82 if (MochiKit.Base.isUndefinedOrNull(someOptions)) {
86 options = {} 83 options = {}
87 } else { 84 } else {
88 options = someOptions; 85 options = someOptions;
89 } 86 }
90 87
91 if (MochiKit.Base.isUndefinedOrNull(someOptions['afterFinish'])) { 88 if (MochiKit.Base.isUndefinedOrNull(someOptions['afterFinish'])) {
92 options['afterFinish'] = MochiKit.Base.noop; 89 options['afterFinish'] = MochiKit.Base.noop;
93 } 90 }
94 91
95 MochiKit.Base.update(options, { 92 MochiKit.Base.update(options, {
96 'afterFinish': MochiKit.Base.compose(options['afterFinish'], MochiKit.Base.method(deferredResult, 'callback')) 93 'afterFinish': MochiKit.Base.compose(options['afterFinish'], MochiKit.Base.method(deferredResult, 'callback'))
97 }); 94 });
98 95
99 new anAnimation(someParameters, options); 96 new anAnimation(someParameters, options);
100 97
101 return deferredResult; 98 return deferredResult;
102 }, 99 },
103 100
104 //------------------------------------------------------------------------- 101 //-------------------------------------------------------------------------
105 102
106 'deferredAnimations': function (aSinchronizationType, someAnimations, someOptions) { 103 'deferredAnimations': function (aSinchronizationType, someAnimations, someOptions) {
107 var deferredResult; 104 var deferredResult;
108 varoptions; 105 varoptions;
109 106
110 deferredResult = new Clipperz.Async.Deferred("Visual.deferredParallelAnimations", {trace:false}); 107 deferredResult = new Clipperz.Async.Deferred("Visual.deferredParallelAnimations", {trace:false});
111 deferredResult.addCallback(MochiKit.Async.succeed, arguments[arguments.length - 1]); 108 deferredResult.addCallback(MochiKit.Async.succeed, arguments[arguments.length - 1]);
112 109
113 options = someOptions; 110 options = someOptions;
114 if (MochiKit.Base.isUndefinedOrNull(someOptions['afterFinish'])) { 111 if (MochiKit.Base.isUndefinedOrNull(someOptions['afterFinish'])) {
115 options['afterFinish'] = MochiKit.Base.noop; 112 options['afterFinish'] = MochiKit.Base.noop;
116 } 113 }
117 MochiKit.Base.update(options, { 114 MochiKit.Base.update(options, {
118 'afterFinish': MochiKit.Base.compose(options['afterFinish'], MochiKit.Base.method(deferredResult, 'callback')) 115 'afterFinish': MochiKit.Base.compose(options['afterFinish'], MochiKit.Base.method(deferredResult, 'callback'))
119 }); 116 });
120 117
121 new aSinchronizationType(someAnimations, options) 118 new aSinchronizationType(someAnimations, options)
122 119
123 return deferredResult; 120 return deferredResult;
124 }, 121 },
125 122
126 //------------------------------------------------------------------------- 123 //-------------------------------------------------------------------------
127 __syntaxFix__: "syntax fix" 124 __syntaxFix__: "syntax fix"
128 125
129}); 126});
130 127
131//############################################################################# 128//#############################################################################
132 129
133/** @id Clipperz.Visual.Resize */ 130/** @id Clipperz.Visual.Resize */
134Clipperz.Visual.Resize = function (element, percent, options) { 131Clipperz.Visual.Resize = function (element, percent, options) {
135 var cls = arguments.callee; 132 var cls = arguments.callee;
136 if (!(this instanceof cls)) { 133 if (!(this instanceof cls)) {
137 return new cls(element, percent, options); 134 return new cls(element, percent, options);
138 } 135 }
139 this.__init__(element, percent, options); 136 this.__init__(element, percent, options);
140}; 137};
141 138
142Clipperz.Visual.Resize.prototype = new MochiKit.Visual.Base(); 139Clipperz.Visual.Resize.prototype = new MochiKit.Visual.Base();
143 140
144MochiKit.Base.update(Clipperz.Visual.Resize.prototype, { 141MochiKit.Base.update(Clipperz.Visual.Resize.prototype, {
145 __class__ : Clipperz.Visual.Resize, 142 __class__ : Clipperz.Visual.Resize,
146 143
147 __init__: function (element, options) { 144 __init__: function (element, options) {
148 this.element = MochiKit.DOM.getElement(element); 145 this.element = MochiKit.DOM.getElement(element);
149 options = MochiKit.Base.update({ 146 options = MochiKit.Base.update({
150 scaleX: true, 147 scaleX: true,
151 scaleY: true, 148 scaleY: true,
152 scaleContent: true, 149 scaleContent: true,
153 scaleFromCenter: false, 150 scaleFromCenter: false,
154 scaleMode: 'box', // 'box' or 'contents' or {} with provided values 151 scaleMode: 'box', // 'box' or 'contents' or {} with provided values
155 syntax_fix: 'syntax fix' 152 syntax_fix: 'syntax fix'
156 }, options); 153 }, options);
157 154
158 this.start(options); 155 this.start(options);
159 }, 156 },
160 157
161 setup: function () { 158 setup: function () {
162 this.restoreAfterFinish = this.options.restoreAfterFinish || false; 159 this.restoreAfterFinish = this.options.restoreAfterFinish || false;
163 this.elementPositioning = MochiKit.Style.getStyle(this.element, 'position'); 160 this.elementPositioning = MochiKit.Style.getStyle(this.element, 'position');
164 161
165 var ma = MochiKit.Base.map; 162 var ma = MochiKit.Base.map;
166 var b = MochiKit.Base.bind; 163 var b = MochiKit.Base.bind;
167 this.originalStyle = {}; 164 this.originalStyle = {};
168 ma(b(function (k) { this.originalStyle[k] = this.element.style[k]; }, this), ['top', 'left', 'width', 'height', 'fontSize']); 165 ma(b(function (k) { this.originalStyle[k] = this.element.style[k]; }, this), ['top', 'left', 'width', 'height', 'fontSize']);
169 166
170 this.originalTop = this.element.offsetTop; 167 this.originalTop = this.element.offsetTop;
171 this.originalLeft = this.element.offsetLeft; 168 this.originalLeft = this.element.offsetLeft;
172 169
173 var fontSize = MochiKit.Style.getStyle(this.element, 'font-size') || '100%'; 170 var fontSize = MochiKit.Style.getStyle(this.element, 'font-size') || '100%';
174 ma(b(function (fontSizeType) { 171 ma(b(function (fontSizeType) {
175 if (fontSize.indexOf(fontSizeType) > 0) { 172 if (fontSize.indexOf(fontSizeType) > 0) {
176 this.fontSize = parseFloat(fontSize); 173 this.fontSize = parseFloat(fontSize);
177 this.fontSizeType = fontSizeType; 174 this.fontSizeType = fontSizeType;
178 } 175 }
179 }, this), ['em', 'px', '%']); 176 }, this), ['em', 'px', '%']);
180 177
181 this.factor = 1; 178 this.factor = 1;
182 179
183 this.dims = [this.options.fromSize.h, this.options.fromSize.w]; 180 this.dims = [this.options.fromSize.h, this.options.fromSize.w];
184 }, 181 },
185 182
186 update: function (position) { 183 update: function (position) {
187 this.setDimensions((this.options.toSize.h - this.options.fromSize.h) * position + this.options.fromSize.h, 184 this.setDimensions((this.options.toSize.h - this.options.fromSize.h) * position + this.options.fromSize.h,
188 (this.options.toSize.w - this.options.fromSize.w) * position + this.options.fromSize.w); 185 (this.options.toSize.w - this.options.fromSize.w) * position + this.options.fromSize.w);
189 }, 186 },
190 187
191 finish: function () { 188 finish: function () {
192 if (this.restoreAfterFinish) { 189 if (this.restoreAfterFinish) {
193 MochiKit.Style.setStyle(this.element, this.originalStyle); 190 MochiKit.Style.setStyle(this.element, this.originalStyle);
194 } 191 }
195 }, 192 },
196 193
197 setDimensions: function (height, width) { 194 setDimensions: function (height, width) {
198 var d = {}; 195 var d = {};
199 var r = Math.round; 196 var r = Math.round;
200 if (/MSIE/.test(navigator.userAgent)) { 197 if (/MSIE/.test(navigator.userAgent)) {
201 r = Math.ceil; 198 r = Math.ceil;
202 } 199 }
203 if (this.options.scaleX) { 200 if (this.options.scaleX) {
204 d.width = r(width) + 'px'; 201 d.width = r(width) + 'px';
205 } 202 }
206 if (this.options.scaleY) { 203 if (this.options.scaleY) {
207 d.height = r(height) + 'px'; 204 d.height = r(height) + 'px';
208 } 205 }
209 if (this.options.scaleFromCenter) { 206 if (this.options.scaleFromCenter) {
210 var topd = (height - this.dims[0])/2; 207 var topd = (height - this.dims[0])/2;
211 var leftd = (width - this.dims[1])/2; 208 var leftd = (width - this.dims[1])/2;
212 if (this.elementPositioning == 'absolute') { 209 if (this.elementPositioning == 'absolute') {
213 if (this.options.scaleY) { 210 if (this.options.scaleY) {
214 d.top = this.originalTop - topd + 'px'; 211 d.top = this.originalTop - topd + 'px';
215 } 212 }
216 if (this.options.scaleX) { 213 if (this.options.scaleX) {
217 d.left = this.originalLeft - leftd + 'px'; 214 d.left = this.originalLeft - leftd + 'px';
218 } 215 }
219 } else { 216 } else {
220 if (this.options.scaleY) { 217 if (this.options.scaleY) {
221 d.top = -topd + 'px'; 218 d.top = -topd + 'px';
222 } 219 }
223 if (this.options.scaleX) { 220 if (this.options.scaleX) {
224 d.left = -leftd + 'px'; 221 d.left = -leftd + 'px';
225 } 222 }
226 } 223 }
227 } 224 }
228 MochiKit.Style.setStyle(this.element, d); 225 MochiKit.Style.setStyle(this.element, d);
229 } 226 }
230}); 227});
231 228
232//============================================================================= 229//=============================================================================
233 230
234Clipperz.Visual.squize = function (element, /* optional */ options) { 231Clipperz.Visual.squize = function (element, /* optional */ options) {
235 var d = MochiKit.DOM; 232 var d = MochiKit.DOM;
236 var v = MochiKit.Visual; 233 var v = MochiKit.Visual;
237 var s = MochiKit.Style; 234 var s = MochiKit.Style;
238 235
239 element = d.getElement(element); 236 element = d.getElement(element);
240 options = MochiKit.Base.update({ 237 options = MochiKit.Base.update({
241 moveTransition: v.Transitions.sinoidal, 238 moveTransition: v.Transitions.sinoidal,
242 scaleTransition: v.Transitions.sinoidal, 239 scaleTransition: v.Transitions.sinoidal,
243 opacityTransition: v.Transitions.none, 240 opacityTransition: v.Transitions.none,
244 scaleContent: true, 241 scaleContent: true,
245 scaleFromCenter: false, 242 scaleFromCenter: false,
246 scaleX: true, 243 scaleX: true,
247 scaleY: true 244 scaleY: true
248 }, options); 245 }, options);
249 var oldStyle = { 246 var oldStyle = {
250 top: element.style.top, 247 top: element.style.top,
251 left: element.style.left, 248 left: element.style.left,
252 height: element.style.height, 249 height: element.style.height,
253 width: element.style.width, 250 width: element.style.width,
254 opacity: s.getStyle(element, 'opacity') 251 opacity: s.getStyle(element, 'opacity')
255 }; 252 };
256 253
257 var dims = s.getElementDimensions(element, true); 254 var dims = s.getElementDimensions(element, true);
258 var moveX, moveY; 255 var moveX, moveY;
259 256
260 moveX = options.scaleX ? dims.w/2 : 0; 257 moveX = options.scaleX ? dims.w/2 : 0;
261 moveY = options.scaleY ? dims.h/2 : 0; 258 moveY = options.scaleY ? dims.h/2 : 0;
262 259
263 var elemClip; 260 var elemClip;
264 261
265 var optionsParallel = MochiKit.Base.update({ 262 var optionsParallel = MochiKit.Base.update({
266 beforeStartInternal: function (effect) { 263 beforeStartInternal: function (effect) {
267 s.makePositioned(effect.effects[0].element); 264 s.makePositioned(effect.effects[0].element);
268 elemClip = s.makeClipping(effect.effects[0].element); 265 elemClip = s.makeClipping(effect.effects[0].element);
269 }, 266 },
270 afterFinishInternal: function (effect) { 267 afterFinishInternal: function (effect) {
271 s.hideElement(effect.effects[0].element); 268 s.hideElement(effect.effects[0].element);
272 s.undoClipping(effect.effects[0].element, elemClip); 269 s.undoClipping(effect.effects[0].element, elemClip);
273 s.undoPositioned(effect.effects[0].element); 270 s.undoPositioned(effect.effects[0].element);
274 s.setStyle(effect.effects[0].element, oldStyle); 271 s.setStyle(effect.effects[0].element, oldStyle);
275 } 272 }
276 }, options); 273 }, options);
277 274
278 return new v.Parallel( 275 return new v.Parallel(
279 [new v.Opacity(element, { 276 [new v.Opacity(element, {
280 sync: true, to: 0.0, from: 1.0, 277 sync: true, to: 0.0, from: 1.0,
281 transition: options.opacityTransition 278 transition: options.opacityTransition
282 }), 279 }),
283 new v.Scale(element, /Opera/.test(navigator.userAgent) ? 1 : 0, { 280 new v.Scale(element, /Opera/.test(navigator.userAgent) ? 1 : 0, {
284 scaleMode: {originalHeight: dims.h, originalWidth: dims.w}, 281 scaleMode: {originalHeight: dims.h, originalWidth: dims.w},
285 sync: true, transition: options.scaleTransition, 282 sync: true, transition: options.scaleTransition,
286 scaleContent: options.scaleContent, 283 scaleContent: options.scaleContent,
287 scaleFromCenter: options.scaleFromCenter, 284 scaleFromCenter: options.scaleFromCenter,
288 restoreAfterFinish: true, 285 restoreAfterFinish: true,
289 scaleX: options.scaleX, 286 scaleX: options.scaleX,
290 scaleY: options.scaleY 287 scaleY: options.scaleY
291 }), 288 }),
292 new v.Move(element, { 289 new v.Move(element, {
293 x: moveX, y: moveY, sync: true, transition: options.moveTransition 290 x: moveX, y: moveY, sync: true, transition: options.moveTransition
294 }) 291 })
295 ], optionsParallel 292 ], optionsParallel
296 ); 293 );
297}; 294};
298 295
299//----------------------------------------------------------------------------- 296//-----------------------------------------------------------------------------
300 297
301Clipperz.Visual.expand = function (element, /* optional */ options) { 298Clipperz.Visual.expand = function (element, /* optional */ options) {
302 var d = MochiKit.DOM; 299 var d = MochiKit.DOM;
303 var v = MochiKit.Visual; 300 var v = MochiKit.Visual;
304 var s = MochiKit.Style; 301 var s = MochiKit.Style;
305 302
306 element = d.getElement(element); 303 element = d.getElement(element);
307 options = MochiKit.Base.update({ 304 options = MochiKit.Base.update({
308 // direction: 'center', 305 // direction: 'center',
309 moveTransition: v.Transitions.sinoidal, 306 moveTransition: v.Transitions.sinoidal,
310 scaleTransition: v.Transitions.sinoidal, 307 scaleTransition: v.Transitions.sinoidal,
311 opacityTransition: v.Transitions.none, 308 opacityTransition: v.Transitions.none,
312 scaleContent: true, 309 scaleContent: true,
313 scaleFromCenter: false, 310 scaleFromCenter: false,
314 scaleX: true, 311 scaleX: true,
315 scaleY: true 312 scaleY: true
316 }, options); 313 }, options);
317 var oldStyle = { 314 var oldStyle = {
318 top: element.style.top, 315 top: element.style.top,
319 left: element.style.left, 316 left: element.style.left,
320 height: element.style.height, 317 height: element.style.height,
321 width: element.style.width, 318 width: element.style.width,
322 opacity: s.getStyle(element, 'opacity') 319 opacity: s.getStyle(element, 'opacity')
323 }; 320 };
324 321
325 var dims = s.getElementDimensions(element, true); 322 var dims = s.getElementDimensions(element, true);
326 var moveX, moveY; 323 var moveX, moveY;
327 324
328 moveX = options.scaleX ? dims.w/2 : 0; 325 moveX = options.scaleX ? dims.w/2 : 0;
329 moveY = options.scaleY ? dims.h/2 : 0; 326 moveY = options.scaleY ? dims.h/2 : 0;
330 327
331 var elemClip; 328 var elemClip;
332 329
333 var optionsParallel = MochiKit.Base.update({ 330 var optionsParallel = MochiKit.Base.update({
334 beforeStartInternal: function (effect) { 331 beforeStartInternal: function (effect) {
335 s.makePositioned(effect.effects[0].element); 332 s.makePositioned(effect.effects[0].element);
336 elemClip = s.makeClipping(effect.effects[0].element); 333 elemClip = s.makeClipping(effect.effects[0].element);
337 }, 334 },
338 afterFinishInternal: function (effect) { 335 afterFinishInternal: function (effect) {
339 s.hideElement(effect.effects[0].element); 336 s.hideElement(effect.effects[0].element);
340 s.undoClipping(effect.effects[0].element, elemClip); 337 s.undoClipping(effect.effects[0].element, elemClip);
341 s.undoPositioned(effect.effects[0].element); 338 s.undoPositioned(effect.effects[0].element);
342 s.setStyle(effect.effects[0].element, oldStyle); 339 s.setStyle(effect.effects[0].element, oldStyle);
343 } 340 }
344 }, options); 341 }, options);
345 342
346 return new v.Parallel( 343 return new v.Parallel(
347 [new v.Opacity(element, { 344 [new v.Opacity(element, {
348 sync: true, to: 0.0, from: 1.0, 345 sync: true, to: 0.0, from: 1.0,
349 transition: options.opacityTransition 346 transition: options.opacityTransition
350 }), 347 }),
351 new v.Scale(element, /Opera/.test(navigator.userAgent) ? 1 : 0, { 348 new v.Scale(element, /Opera/.test(navigator.userAgent) ? 1 : 0, {
352 scaleMode: {originalHeight: dims.h, originalWidth: dims.w}, 349 scaleMode: {originalHeight: dims.h, originalWidth: dims.w},
353 sync: true, transition: options.scaleTransition, 350 sync: true, transition: options.scaleTransition,
354 scaleContent: options.scaleContent, 351 scaleContent: options.scaleContent,
355 scaleFromCenter: options.scaleFromCenter, 352 scaleFromCenter: options.scaleFromCenter,
356 restoreAfterFinish: true, 353 restoreAfterFinish: true,
357 scaleX: options.scaleX, 354 scaleX: options.scaleX,
358 scaleY: options.scaleY 355 scaleY: options.scaleY
359 }), 356 }),
360 new v.Move(element, { 357 new v.Move(element, {
361 x: moveX, y: moveY, sync: true, transition: options.moveTransition 358 x: moveX, y: moveY, sync: true, transition: options.moveTransition
362 }) 359 })
363 ], optionsParallel 360 ], optionsParallel
364 ); 361 );
365}; 362};
366 363
367//============================================================================= 364//=============================================================================
368 365
diff --git a/frontend/gamma/js/Clipperz/YUI/DomHelper.js b/frontend/gamma/js/Clipperz/YUI/DomHelper.js
index dbd8c93..87c74f5 100644
--- a/frontend/gamma/js/Clipperz/YUI/DomHelper.js
+++ b/frontend/gamma/js/Clipperz/YUI/DomHelper.js
@@ -1,408 +1,405 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
30if (typeof(Clipperz.YUI) == 'undefined') { Clipperz.YUI = {}; } 27if (typeof(Clipperz.YUI) == 'undefined') { Clipperz.YUI = {}; }
31 28
32 29
33/** 30/**
34 * @class Clipperz.ext.DomHelper 31 * @class Clipperz.ext.DomHelper
35 * Utility class for working with DOM and/or Templates. It transparently supports using HTML fragments or DOM. 32 * Utility class for working with DOM and/or Templates. It transparently supports using HTML fragments or DOM.
36 * 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>. 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>.
37 * @singleton 34 * @singleton
38 */ 35 */
39Clipperz.YUI.DomHelper = new function(){ 36Clipperz.YUI.DomHelper = new function(){
40 /**@private*/ 37 /**@private*/
41 var d = document; 38 var d = document;
42 var tempTableEl = null; 39 var tempTableEl = null;
43 /** True to force the use of DOM instead of html fragments @type Boolean */ 40 /** True to force the use of DOM instead of html fragments @type Boolean */
44 this.useDom = false; 41 this.useDom = false;
45 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; 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;
46 /** 43 /**
47 * Applies a style specification to an element 44 * Applies a style specification to an element
48 * @param {String/HTMLElement} el The element to apply styles to 45 * @param {String/HTMLElement} el The element to apply styles to
49 * @param {String/Object/Function} styles A style specification string eg "width:100px", or object in the form {width:"100px"}, or 46 * @param {String/Object/Function} styles A style specification string eg "width:100px", or object in the form {width:"100px"}, or
50 * a function which returns such a specification. 47 * a function which returns such a specification.
51 */ 48 */
52 this.applyStyles = function(el, styles){ 49 this.applyStyles = function(el, styles){
53 if(styles){ 50 if(styles){
54 var D = YAHOO.util.Dom; 51 var D = YAHOO.util.Dom;
55 if (typeof styles == "string"){ 52 if (typeof styles == "string"){
56 var re = /\s?([a-z\-]*)\:([^;]*);?/gi; 53 var re = /\s?([a-z\-]*)\:([^;]*);?/gi;
57 var matches; 54 var matches;
58 while ((matches = re.exec(styles)) != null){ 55 while ((matches = re.exec(styles)) != null){
59 D.setStyle(el, matches[1], matches[2]); 56 D.setStyle(el, matches[1], matches[2]);
60 } 57 }
61 }else if (typeof styles == "object"){ 58 }else if (typeof styles == "object"){
62 for (var style in styles){ 59 for (var style in styles){
63 D.setStyle(el, style, styles[style]); 60 D.setStyle(el, style, styles[style]);
64 } 61 }
65 }else if (typeof styles == "function"){ 62 }else if (typeof styles == "function"){
66 Clipperz.YUI.DomHelper.applyStyles(el, styles.call()); 63 Clipperz.YUI.DomHelper.applyStyles(el, styles.call());
67 } 64 }
68 } 65 }
69 }; 66 };
70 67
71 // build as innerHTML where available 68 // build as innerHTML where available
72 /** @ignore */ 69 /** @ignore */
73 var createHtml = function(o){ 70 var createHtml = function(o){
74 var b = ''; 71 var b = '';
75 72
76 if(typeof(o['html']) != 'undefined') { 73 if(typeof(o['html']) != 'undefined') {
77 o['html'] = Clipperz.Base.sanitizeString(o['html']); 74 o['html'] = Clipperz.Base.sanitizeString(o['html']);
78 } else if (typeof(o['htmlString']) != 'undefined') { 75 } else if (typeof(o['htmlString']) != 'undefined') {
79 o['html'] = o['htmlString']; 76 o['html'] = o['htmlString'];
80 delete o.htmlString; 77 delete o.htmlString;
81 } 78 }
82 79
83 if (MochiKit.Base.isArrayLike(o)) { 80 if (MochiKit.Base.isArrayLike(o)) {
84 for (var i = 0, l = o.length; i < l; i++) { 81 for (var i = 0, l = o.length; i < l; i++) {
85 b += createHtml(o[i]); 82 b += createHtml(o[i]);
86 } 83 }
87 return b; 84 return b;
88 } 85 }
89 86
90 b += '<' + o.tag; 87 b += '<' + o.tag;
91 for(var attr in o){ 88 for(var attr in o){
92 if(attr == 'tag' || attr == 'children' || attr == 'html' || typeof o[attr] == 'function') continue; 89 if(attr == 'tag' || attr == 'children' || attr == 'html' || typeof o[attr] == 'function') continue;
93 if(attr == 'style'){ 90 if(attr == 'style'){
94 var s = o['style']; 91 var s = o['style'];
95 if(typeof s == 'function'){ 92 if(typeof s == 'function'){
96 s = s.call(); 93 s = s.call();
97 } 94 }
98 if(typeof s == 'string'){ 95 if(typeof s == 'string'){
99 b += ' style="' + s + '"'; 96 b += ' style="' + s + '"';
100 }else if(typeof s == 'object'){ 97 }else if(typeof s == 'object'){
101 b += ' style="'; 98 b += ' style="';
102 for(var key in s){ 99 for(var key in s){
103 if(typeof s[key] != 'function'){ 100 if(typeof s[key] != 'function'){
104 b += key + ':' + s[key] + ';'; 101 b += key + ':' + s[key] + ';';
105 } 102 }
106 } 103 }
107 b += '"'; 104 b += '"';
108 } 105 }
109 }else{ 106 }else{
110 if(attr == 'cls'){ 107 if(attr == 'cls'){
111 b += ' class="' + o['cls'] + '"'; 108 b += ' class="' + o['cls'] + '"';
112 }else if(attr == 'htmlFor'){ 109 }else if(attr == 'htmlFor'){
113 b += ' for="' + o['htmlFor'] + '"'; 110 b += ' for="' + o['htmlFor'] + '"';
114 }else{ 111 }else{
115 b += ' ' + attr + '="' + o[attr] + '"'; 112 b += ' ' + attr + '="' + o[attr] + '"';
116 } 113 }
117 } 114 }
118 } 115 }
119 if(emptyTags.test(o.tag)){ 116 if(emptyTags.test(o.tag)){
120 b += ' />'; 117 b += ' />';
121 }else{ 118 }else{
122 b += '>'; 119 b += '>';
123 if(o.children){ 120 if(o.children){
124 for(var i = 0, len = o.children.length; i < len; i++) { 121 for(var i = 0, len = o.children.length; i < len; i++) {
125 b += createHtml(o.children[i], b); 122 b += createHtml(o.children[i], b);
126 } 123 }
127 } 124 }
128 if(o.html){ 125 if(o.html){
129 b += o.html; 126 b += o.html;
130 } 127 }
131 b += '</' + o.tag + '>'; 128 b += '</' + o.tag + '>';
132 } 129 }
133 return b; 130 return b;
134 } 131 }
135 132
136 // build as dom 133 // build as dom
137 /** @ignore */ 134 /** @ignore */
138 var createDom = function(o, parentNode){ 135 var createDom = function(o, parentNode){
139 var el = d.createElement(o.tag); 136 var el = d.createElement(o.tag);
140 var useSet = el.setAttribute ? true : false; // In IE some elements don't have setAttribute 137 var useSet = el.setAttribute ? true : false; // In IE some elements don't have setAttribute
141 for(var attr in o){ 138 for(var attr in o){
142 if(attr == 'tag' || attr == 'children' || attr == 'html' || attr == 'style' || typeof o[attr] == 'function') continue; 139 if(attr == 'tag' || attr == 'children' || attr == 'html' || attr == 'style' || typeof o[attr] == 'function') continue;
143 if(attr=='cls'){ 140 if(attr=='cls'){
144 el.className = o['cls']; 141 el.className = o['cls'];
145 }else{ 142 }else{
146 if(useSet) el.setAttribute(attr, o[attr]); 143 if(useSet) el.setAttribute(attr, o[attr]);
147 else el[attr] = o[attr]; 144 else el[attr] = o[attr];
148 } 145 }
149 } 146 }
150 Clipperz.YUI.DomHelper.applyStyles(el, o.style); 147 Clipperz.YUI.DomHelper.applyStyles(el, o.style);
151 if(o.children){ 148 if(o.children){
152 for(var i = 0, len = o.children.length; i < len; i++) { 149 for(var i = 0, len = o.children.length; i < len; i++) {
153 createDom(o.children[i], el); 150 createDom(o.children[i], el);
154 } 151 }
155 } 152 }
156 if(o.html){ 153 if(o.html){
157 el.innerHTML = o.html; 154 el.innerHTML = o.html;
158 } 155 }
159 if(parentNode){ 156 if(parentNode){
160 parentNode.appendChild(el); 157 parentNode.appendChild(el);
161 } 158 }
162 return el; 159 return el;
163 }; 160 };
164 161
165 /** 162 /**
166 * @ignore 163 * @ignore
167 * Nasty code for IE's broken table implementation 164 * Nasty code for IE's broken table implementation
168 */ 165 */
169 var insertIntoTable = function(tag, where, el, html){ 166 var insertIntoTable = function(tag, where, el, html){
170 if(!tempTableEl){ 167 if(!tempTableEl){
171 tempTableEl = document.createElement('div'); 168 tempTableEl = document.createElement('div');
172 } 169 }
173 var nodes; 170 var nodes;
174 if(tag == 'table' || tag == 'tbody'){ 171 if(tag == 'table' || tag == 'tbody'){
175 tempTableEl.innerHTML = '<table><tbody>'+html+'</tbody></table>'; 172 tempTableEl.innerHTML = '<table><tbody>'+html+'</tbody></table>';
176 nodes = tempTableEl.firstChild.firstChild.childNodes; 173 nodes = tempTableEl.firstChild.firstChild.childNodes;
177 }else{ 174 }else{
178 tempTableEl.innerHTML = '<table><tbody><tr>'+html+'</tr></tbody></table>'; 175 tempTableEl.innerHTML = '<table><tbody><tr>'+html+'</tr></tbody></table>';
179 nodes = tempTableEl.firstChild.firstChild.firstChild.childNodes; 176 nodes = tempTableEl.firstChild.firstChild.firstChild.childNodes;
180 } 177 }
181 if (where == 'beforebegin') { 178 if (where == 'beforebegin') {
182 nodes.reverse(); 179 nodes.reverse();
183 // el.parentNode.insertBefore(node, el); 180 // el.parentNode.insertBefore(node, el);
184 MochiKit.Base.map(function(aNode) {el.parentNode.insertBefore(aNode, el)}, nodes); 181 MochiKit.Base.map(function(aNode) {el.parentNode.insertBefore(aNode, el)}, nodes);
185 } else if (where == 'afterbegin') { 182 } else if (where == 'afterbegin') {
186 nodes.reverse(); 183 nodes.reverse();
187 // el.insertBefore(node, el.firstChild); 184 // el.insertBefore(node, el.firstChild);
188 MochiKit.Base.map(function(aNode) {el.insertBefore(aNode, el.firstChild)}, nodes); 185 MochiKit.Base.map(function(aNode) {el.insertBefore(aNode, el.firstChild)}, nodes);
189 } else if (where == 'beforeend') { 186 } else if (where == 'beforeend') {
190 // el.appendChild(node); 187 // el.appendChild(node);
191 MochiKit.Base.map(function(aNode) {el.appendChild(aNode)}, nodes); 188 MochiKit.Base.map(function(aNode) {el.appendChild(aNode)}, nodes);
192 } else if (where == 'afterend') { 189 } else if (where == 'afterend') {
193 // el.parentNode.insertBefore(node, el.nextSibling); 190 // el.parentNode.insertBefore(node, el.nextSibling);
194 MochiKit.Base.map(function(aNode) {el.parentNode.insertBefore(aNode, el.nextSibling)}, nodes); 191 MochiKit.Base.map(function(aNode) {el.parentNode.insertBefore(aNode, el.nextSibling)}, nodes);
195 } 192 }
196 193
197 return nodes; 194 return nodes;
198 } 195 }
199 196
200 /** 197 /**
201 * Inserts an HTML fragment into the Dom 198 * Inserts an HTML fragment into the Dom
202 * @param {String} where Where to insert the html in relation to el - beforeBegin, afterBegin, beforeEnd, afterEnd. 199 * @param {String} where Where to insert the html in relation to el - beforeBegin, afterBegin, beforeEnd, afterEnd.
203 * @param {HTMLElement} el The context element 200 * @param {HTMLElement} el The context element
204 * @param {String} html The HTML fragmenet 201 * @param {String} html The HTML fragmenet
205 * @return {HTMLElement} The new node 202 * @return {HTMLElement} The new node
206 */ 203 */
207 this.insertHtml = function(where, el, html){ 204 this.insertHtml = function(where, el, html){
208 where = where.toLowerCase(); 205 where = where.toLowerCase();
209 // if(el.insertAdjacentHTML){ 206 // if(el.insertAdjacentHTML){
210 if(Clipperz_IEisBroken){ 207 if(Clipperz_IEisBroken){
211 var tag = el.tagName.toLowerCase(); 208 var tag = el.tagName.toLowerCase();
212 if(tag == 'table' || tag == 'tbody' || tag == 'tr'){ 209 if(tag == 'table' || tag == 'tbody' || tag == 'tr'){
213 return insertIntoTable(tag, where, el, html); 210 return insertIntoTable(tag, where, el, html);
214 } 211 }
215 switch(where){ 212 switch(where){
216 case 'beforebegin': 213 case 'beforebegin':
217 el.insertAdjacentHTML(where, html); 214 el.insertAdjacentHTML(where, html);
218 return el.previousSibling; 215 return el.previousSibling;
219 case 'afterbegin': 216 case 'afterbegin':
220 el.insertAdjacentHTML(where, html); 217 el.insertAdjacentHTML(where, html);
221 return el.firstChild; 218 return el.firstChild;
222 case 'beforeend': 219 case 'beforeend':
223 el.insertAdjacentHTML(where, html); 220 el.insertAdjacentHTML(where, html);
224 return el.lastChild; 221 return el.lastChild;
225 case 'afterend': 222 case 'afterend':
226 el.insertAdjacentHTML(where, html); 223 el.insertAdjacentHTML(where, html);
227 return el.nextSibling; 224 return el.nextSibling;
228 } 225 }
229 throw 'Illegal insertion point -> "' + where + '"'; 226 throw 'Illegal insertion point -> "' + where + '"';
230 } 227 }
231 var range = el.ownerDocument.createRange(); 228 var range = el.ownerDocument.createRange();
232 var frag; 229 var frag;
233 switch(where){ 230 switch(where){
234 case 'beforebegin': 231 case 'beforebegin':
235 range.setStartBefore(el); 232 range.setStartBefore(el);
236 frag = range.createContextualFragment(html); 233 frag = range.createContextualFragment(html);
237 el.parentNode.insertBefore(frag, el); 234 el.parentNode.insertBefore(frag, el);
238 return el.previousSibling; 235 return el.previousSibling;
239 case 'afterbegin': 236 case 'afterbegin':
240 if(el.firstChild){ // faster 237 if(el.firstChild){ // faster
241 range.setStartBefore(el.firstChild); 238 range.setStartBefore(el.firstChild);
242 }else{ 239 }else{
243 range.selectNodeContents(el); 240 range.selectNodeContents(el);
244 range.collapse(true); 241 range.collapse(true);
245 } 242 }
246 frag = range.createContextualFragment(html); 243 frag = range.createContextualFragment(html);
247 el.insertBefore(frag, el.firstChild); 244 el.insertBefore(frag, el.firstChild);
248 return el.firstChild; 245 return el.firstChild;
249 case 'beforeend': 246 case 'beforeend':
250 if(el.lastChild){ 247 if(el.lastChild){
251 range.setStartAfter(el.lastChild); // faster 248 range.setStartAfter(el.lastChild); // faster
252 }else{ 249 }else{
253 range.selectNodeContents(el); 250 range.selectNodeContents(el);
254 range.collapse(false); 251 range.collapse(false);
255 } 252 }
256 frag = range.createContextualFragment(html); 253 frag = range.createContextualFragment(html);
257 el.appendChild(frag); 254 el.appendChild(frag);
258 return el.lastChild; 255 return el.lastChild;
259 case 'afterend': 256 case 'afterend':
260 range.setStartAfter(el); 257 range.setStartAfter(el);
261 frag = range.createContextualFragment(html); 258 frag = range.createContextualFragment(html);
262 el.parentNode.insertBefore(frag, el.nextSibling); 259 el.parentNode.insertBefore(frag, el.nextSibling);
263 return el.nextSibling; 260 return el.nextSibling;
264 } 261 }
265 throw 'Illegal insertion point -> "' + where + '"'; 262 throw 'Illegal insertion point -> "' + where + '"';
266 }; 263 };
267 264
268 /** 265 /**
269 * Creates new Dom element(s) and inserts them before el 266 * Creates new Dom element(s) and inserts them before el
270 * @param {String/HTMLElement/Element} el The context element 267 * @param {String/HTMLElement/Element} el The context element
271 * @param {Object} o The Dom object spec (and children) 268 * @param {Object} o The Dom object spec (and children)
272 * @param {<i>Boolean</i>} returnElement (optional) true to return a YAHOO.Element 269 * @param {<i>Boolean</i>} returnElement (optional) true to return a YAHOO.Element
273 * @return {HTMLElement} The new node 270 * @return {HTMLElement} The new node
274 */ 271 */
275 this.insertBefore = function(el, o, returnElement){ 272 this.insertBefore = function(el, o, returnElement){
276 el = el.dom ? el.dom : YAHOO.util.Dom.get(el); 273 el = el.dom ? el.dom : YAHOO.util.Dom.get(el);
277 var newNode; 274 var newNode;
278 if(this.useDom){ 275 if(this.useDom){
279 newNode = createDom(o, null); 276 newNode = createDom(o, null);
280 el.parentNode.insertBefore(newNode, el); 277 el.parentNode.insertBefore(newNode, el);
281 }else{ 278 }else{
282 var html = createHtml(o); 279 var html = createHtml(o);
283 newNode = this.insertHtml('beforeBegin', el, html); 280 newNode = this.insertHtml('beforeBegin', el, html);
284 } 281 }
285 return returnElement ? YAHOO.Element.get(newNode, true) : newNode; 282 return returnElement ? YAHOO.Element.get(newNode, true) : newNode;
286 }; 283 };
287 284
288 /** 285 /**
289 * Creates new Dom element(s) and inserts them after el 286 * Creates new Dom element(s) and inserts them after el
290 * @param {String/HTMLElement/Element} el The context element 287 * @param {String/HTMLElement/Element} el The context element
291 * @param {Object} o The Dom object spec (and children) 288 * @param {Object} o The Dom object spec (and children)
292 * @param {<i>Boolean</i>} returnElement (optional) true to return a YAHOO.Element 289 * @param {<i>Boolean</i>} returnElement (optional) true to return a YAHOO.Element
293 * @return {HTMLElement} The new node 290 * @return {HTMLElement} The new node
294 */ 291 */
295 this.insertAfter = function(el, o, returnElement){ 292 this.insertAfter = function(el, o, returnElement){
296 el = el.dom ? el.dom : YAHOO.util.Dom.get(el); 293 el = el.dom ? el.dom : YAHOO.util.Dom.get(el);
297 var newNode; 294 var newNode;
298 if(this.useDom){ 295 if(this.useDom){
299 newNode = createDom(o, null); 296 newNode = createDom(o, null);
300 el.parentNode.insertBefore(newNode, el.nextSibling); 297 el.parentNode.insertBefore(newNode, el.nextSibling);
301 }else{ 298 }else{
302 var html = createHtml(o); 299 var html = createHtml(o);
303 newNode = this.insertHtml('afterEnd', el, html); 300 newNode = this.insertHtml('afterEnd', el, html);
304 } 301 }
305 return returnElement ? YAHOO.Element.get(newNode, true) : newNode; 302 return returnElement ? YAHOO.Element.get(newNode, true) : newNode;
306 }; 303 };
307 304
308 /** 305 /**
309 * Creates new Dom element(s) and appends them to el 306 * Creates new Dom element(s) and appends them to el
310 * @param {String/HTMLElement/Element} el The context element 307 * @param {String/HTMLElement/Element} el The context element
311 * @param {Object} o The Dom object spec (and children) 308 * @param {Object} o The Dom object spec (and children)
312 * @param {<i>Boolean</i>} returnElement (optional) true to return a YAHOO.Element 309 * @param {<i>Boolean</i>} returnElement (optional) true to return a YAHOO.Element
313 * @return {HTMLElement} The new node 310 * @return {HTMLElement} The new node
314 */ 311 */
315 this.append = function(el, o, returnElement){ 312 this.append = function(el, o, returnElement){
316 el = el.dom ? el.dom : YAHOO.util.Dom.get(el); 313 el = el.dom ? el.dom : YAHOO.util.Dom.get(el);
317 var newNode; 314 var newNode;
318 if(this.useDom){ 315 if(this.useDom){
319 newNode = createDom(o, null); 316 newNode = createDom(o, null);
320 el.appendChild(newNode); 317 el.appendChild(newNode);
321 }else{ 318 }else{
322 var html = createHtml(o); 319 var html = createHtml(o);
323 newNode = this.insertHtml('beforeEnd', el, html); 320 newNode = this.insertHtml('beforeEnd', el, html);
324 } 321 }
325 return returnElement ? YAHOO.Element.get(newNode, true) : newNode; 322 return returnElement ? YAHOO.Element.get(newNode, true) : newNode;
326 }; 323 };
327 324
328 /** 325 /**
329 * Creates new Dom element(s) and overwrites the contents of el with them 326 * Creates new Dom element(s) and overwrites the contents of el with them
330 * @param {String/HTMLElement/Element} el The context element 327 * @param {String/HTMLElement/Element} el The context element
331 * @param {Object} o The Dom object spec (and children) 328 * @param {Object} o The Dom object spec (and children)
332 * @param {<i>Boolean</i>} returnElement (optional) true to return a YAHOO.Element 329 * @param {<i>Boolean</i>} returnElement (optional) true to return a YAHOO.Element
333 * @return {HTMLElement} The new node 330 * @return {HTMLElement} The new node
334 */ 331 */
335 this.overwrite = function(el, o, returnElement){ 332 this.overwrite = function(el, o, returnElement){
336 el = el.dom ? el.dom : YAHOO.util.Dom.get(el); 333 el = el.dom ? el.dom : YAHOO.util.Dom.get(el);
337 el.innerHTML = createHtml(o); 334 el.innerHTML = createHtml(o);
338 return returnElement ? YAHOO.Element.get(el.firstChild, true) : el.firstChild; 335 return returnElement ? YAHOO.Element.get(el.firstChild, true) : el.firstChild;
339 }; 336 };
340 337
341 /** 338 /**
342 * Creates a new Clipperz.YUI.DomHelper.Template from the Dom object spec 339 * Creates a new Clipperz.YUI.DomHelper.Template from the Dom object spec
343 * @param {Object} o The Dom object spec (and children) 340 * @param {Object} o The Dom object spec (and children)
344 * @return {Clipperz.YUI.DomHelper.Template} The new template 341 * @return {Clipperz.YUI.DomHelper.Template} The new template
345 */ 342 */
346 this.createTemplate = function(o){ 343 this.createTemplate = function(o){
347 var html = createHtml(o); 344 var html = createHtml(o);
348 return new Clipperz.YUI.DomHelper.Template(html); 345 return new Clipperz.YUI.DomHelper.Template(html);
349 }; 346 };
350}(); 347}();
351 348
352/** 349/**
353* @class Clipperz.YUI.DomHelper.Template 350* @class Clipperz.YUI.DomHelper.Template
354* Represents an HTML fragment template. 351* Represents an HTML fragment template.
355* 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>. 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>.
356* <br> 353* <br>
357* <b>This class is also available as Clipperz.YUI.Template</b>. 354* <b>This class is also available as Clipperz.YUI.Template</b>.
358* @constructor 355* @constructor
359* @param {String/Array} html The HTML fragment or an array of fragments to join('') or multiple arguments to join('') 356* @param {String/Array} html The HTML fragment or an array of fragments to join('') or multiple arguments to join('')
360*/ 357*/
361Clipperz.YUI.DomHelper.Template = function(html){ 358Clipperz.YUI.DomHelper.Template = function(html){
362 if(html instanceof Array){ 359 if(html instanceof Array){
363 html = html.join(''); 360 html = html.join('');
364 }else if(arguments.length > 1){ 361 }else if(arguments.length > 1){
365 html = Array.prototype.join.call(arguments, ''); 362 html = Array.prototype.join.call(arguments, '');
366 } 363 }
367 /**@private*/ 364 /**@private*/
368 this.html = html; 365 this.html = html;
369}; 366};
370Clipperz.YUI.DomHelper.Template.prototype = { 367Clipperz.YUI.DomHelper.Template.prototype = {
371 /** 368 /**
372 * Returns an HTML fragment of this template with the specified values applied 369 * Returns an HTML fragment of this template with the specified values applied
373 * @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'}) 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'})
374 * @return {String} 371 * @return {String}
375 */ 372 */
376 applyTemplate : function(values){ 373 applyTemplate : function(values){
377 if(this.compiled){ 374 if(this.compiled){
378 return this.compiled(values); 375 return this.compiled(values);
379 } 376 }
380 var empty = ''; 377 var empty = '';
381 var fn = function(match, index){ 378 var fn = function(match, index){
382 if(typeof values[index] != 'undefined'){ 379 if(typeof values[index] != 'undefined'){
383 return values[index]; 380 return values[index];
384 }else{ 381 }else{
385 return empty; 382 return empty;
386 } 383 }
387 } 384 }
388 return this.html.replace(this.re, fn); 385 return this.html.replace(this.re, fn);
389 }, 386 },
390 387
391 /** 388 /**
392 * The regular expression used to match template variables 389 * The regular expression used to match template variables
393 * @type RegExp 390 * @type RegExp
394 * @property 391 * @property
395 */ 392 */
396 re : /\{([\w|-]+)\}/g, 393 re : /\{([\w|-]+)\}/g,
397 394
398 /** 395 /**
399 * Compiles the template into an internal function, eliminating the RegEx overhead 396 * Compiles the template into an internal function, eliminating the RegEx overhead
400 */ 397 */
401 compile : function(){ 398 compile : function(){
402 var body = ["this.compiled = function(values){ return ['"]; 399 var body = ["this.compiled = function(values){ return ['"];
403 body.push(this.html.replace(this.re, "', values['$1'], '")); 400 body.push(this.html.replace(this.re, "', values['$1'], '"));
404 body.push("'].join('');};"); 401 body.push("'].join('');};");
405 eval(body.join('')); 402 eval(body.join(''));
406 return this; 403 return this;
407 }, 404 },
408 405
diff --git a/frontend/gamma/js/Clipperz/YUI/DomQuery.js b/frontend/gamma/js/Clipperz/YUI/DomQuery.js
index 4a143ab..76d0fae 100644
--- a/frontend/gamma/js/Clipperz/YUI/DomQuery.js
+++ b/frontend/gamma/js/Clipperz/YUI/DomQuery.js
@@ -1,408 +1,405 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
30if (typeof(Clipperz.YUI) == 'undefined') { Clipperz.YUI = {}; } 27if (typeof(Clipperz.YUI) == 'undefined') { Clipperz.YUI = {}; }
31 28
32 29
33/* 30/*
34 * yui-ext 0.40 31 * yui-ext 0.40
35 * Copyright(c) 2006, Jack Slocum. 32 * Copyright(c) 2006, Jack Slocum.
36 */ 33 */
37 34
38/** 35/**
39 * @class Clipperz.YUI.DomQuery 36 * @class Clipperz.YUI.DomQuery
40 * Provides high performance selector/xpath processing by compiling queries into reusable functions. 37 * Provides high performance selector/xpath processing by compiling queries into reusable functions.
41 * New pseudo classes and matchers can be plugged. It works on HTML and XML documents (if a content node is passed in). 38 * New pseudo classes and matchers can be plugged. It works on HTML and XML documents (if a content node is passed in).
42 * @singleton 39 * @singleton
43 */ 40 */
44Clipperz.YUI.DomQuery = function(){ 41Clipperz.YUI.DomQuery = function(){
45 var cache = {}, simpleCache = {}, valueCache = {}; 42 var cache = {}, simpleCache = {}, valueCache = {};
46 var nonSpace = /\S/; 43 var nonSpace = /\S/;
47 var trimRe = /^\s*(.*?)\s*$/; 44 var trimRe = /^\s*(.*?)\s*$/;
48 var tplRe = /\{(\d+)\}/g; 45 var tplRe = /\{(\d+)\}/g;
49 var modeRe = /^(\s?[\/>]\s?|\s|$)/; 46 var modeRe = /^(\s?[\/>]\s?|\s|$)/;
50 var clsRes = {}; 47 var clsRes = {};
51 48
52 function child(p, index){ 49 function child(p, index){
53 var i = 0; 50 var i = 0;
54 var n = p.firstChild; 51 var n = p.firstChild;
55 while(n){ 52 while(n){
56 if(n.nodeType == 1){ 53 if(n.nodeType == 1){
57 i++; 54 i++;
58 if(i == index){ 55 if(i == index){
59 return n; 56 return n;
60 } 57 }
61 } 58 }
62 n = n.nextSibling; 59 n = n.nextSibling;
63 } 60 }
64 return null; 61 return null;
65 }; 62 };
66 63
67 function next(d){ 64 function next(d){
68 var n = d.nextSibling; 65 var n = d.nextSibling;
69 while(n && n.nodeType != 1){ 66 while(n && n.nodeType != 1){
70 n = n.nextSibling; 67 n = n.nextSibling;
71 } 68 }
72 return n; 69 return n;
73 }; 70 };
74 71
75 function prev(d){ 72 function prev(d){
76 var n = d.previousSibling; 73 var n = d.previousSibling;
77 while(n && n.nodeType != 1){ 74 while(n && n.nodeType != 1){
78 n = n.previousSibling; 75 n = n.previousSibling;
79 } 76 }
80 return n; 77 return n;
81 }; 78 };
82 79
83 function clean(d){ 80 function clean(d){
84 var n = d.firstChild, ni = -1; 81 var n = d.firstChild, ni = -1;
85 while(n){ 82 while(n){
86 var nx = n.nextSibling; 83 var nx = n.nextSibling;
87 if(n.nodeType == 3 && !nonSpace.test(n.nodeValue)){ 84 if(n.nodeType == 3 && !nonSpace.test(n.nodeValue)){
88 d.removeChild(n); 85 d.removeChild(n);
89 }else{ 86 }else{
90 n.nodeIndex = ++ni; 87 n.nodeIndex = ++ni;
91 } 88 }
92 n = nx; 89 n = nx;
93 } 90 }
94 return this; 91 return this;
95 }; 92 };
96 93
97 function byClassName(c, a, v){ 94 function byClassName(c, a, v){
98 if(!v){ 95 if(!v){
99 return c; 96 return c;
100 } 97 }
101 var re = clsRes[v]; 98 var re = clsRes[v];
102 if(!re){ 99 if(!re){
103 re = new RegExp('(?:^|\\s)(?:' + v + ')(?:\\s|$)'); 100 re = new RegExp('(?:^|\\s)(?:' + v + ')(?:\\s|$)');
104 clsRes[v] = re; 101 clsRes[v] = re;
105 } 102 }
106 var r = []; 103 var r = [];
107 for(var i = 0, ci; ci = c[i]; i++){ 104 for(var i = 0, ci; ci = c[i]; i++){
108 if(re.test(ci.className)){ 105 if(re.test(ci.className)){
109 r[r.length] = ci; 106 r[r.length] = ci;
110 } 107 }
111 } 108 }
112 return r; 109 return r;
113 }; 110 };
114 111
115 function convert(c){ 112 function convert(c){
116 if(c.slice){ 113 if(c.slice){
117 return c; 114 return c;
118 } 115 }
119 var r = []; 116 var r = [];
120 for(var i = 0, l = c.length; i < l; i++){ 117 for(var i = 0, l = c.length; i < l; i++){
121 r[r.length] = c[i]; 118 r[r.length] = c[i];
122 } 119 }
123 return r; 120 return r;
124 }; 121 };
125 122
126 function attrValue(n, attr){ 123 function attrValue(n, attr){
127 if(!n.tagName && typeof n.length != 'undefined'){ 124 if(!n.tagName && typeof n.length != 'undefined'){
128 n = n[0]; 125 n = n[0];
129 } 126 }
130 if(!n){ 127 if(!n){
131 return null; 128 return null;
132 } 129 }
133 if(attr == 'for'){ 130 if(attr == 'for'){
134 return n.htmlFor; 131 return n.htmlFor;
135 } 132 }
136 if(attr == 'class' || attr == 'className'){ 133 if(attr == 'class' || attr == 'className'){
137 return n.className; 134 return n.className;
138 } 135 }
139 return n.getAttribute(attr) || n[attr]; 136 return n.getAttribute(attr) || n[attr];
140 137
141 }; 138 };
142 139
143 function getNodes(ns, mode, tagName){ 140 function getNodes(ns, mode, tagName){
144 var result = [], cs; 141 var result = [], cs;
145 if(!ns){ 142 if(!ns){
146 return result; 143 return result;
147 } 144 }
148 mode = mode ? mode.replace(trimRe, '$1') : ''; 145 mode = mode ? mode.replace(trimRe, '$1') : '';
149 tagName = tagName || '*'; 146 tagName = tagName || '*';
150 if(ns.tagName || ns == document){ 147 if(ns.tagName || ns == document){
151 ns = [ns]; 148 ns = [ns];
152 } 149 }
153 if(mode != '/' && mode != '>'){ 150 if(mode != '/' && mode != '>'){
154 for(var i = 0, ni; ni = ns[i]; i++){ 151 for(var i = 0, ni; ni = ns[i]; i++){
155 cs = ni.getElementsByTagName(tagName); 152 cs = ni.getElementsByTagName(tagName);
156 result = concat(result, cs); 153 result = concat(result, cs);
157 } 154 }
158 }else{ 155 }else{
159 for(var i = 0, ni; ni = ns[i]; i++){ 156 for(var i = 0, ni; ni = ns[i]; i++){
160 var cn = ni.getElementsByTagName(tagName); 157 var cn = ni.getElementsByTagName(tagName);
161 for(var j = 0, cj; cj = cn[j]; j++){ 158 for(var j = 0, cj; cj = cn[j]; j++){
162 if(cj.parentNode == ni){ 159 if(cj.parentNode == ni){
163 result[result.length] = cj; 160 result[result.length] = cj;
164 } 161 }
165 } 162 }
166 } 163 }
167 164
168 } 165 }
169 return result; 166 return result;
170 }; 167 };
171 168
172 function concat(a, b){ 169 function concat(a, b){
173 if(b.slice){ 170 if(b.slice){
174 return a.concat(b); 171 return a.concat(b);
175 } 172 }
176 for(var i = 0, l = b.length; i < l; i++){ 173 for(var i = 0, l = b.length; i < l; i++){
177 a[a.length] = b[i]; 174 a[a.length] = b[i];
178 } 175 }
179 return a; 176 return a;
180 } 177 }
181 178
182 function byTag(cs, tagName){ 179 function byTag(cs, tagName){
183 if(cs.tagName || cs == document){ 180 if(cs.tagName || cs == document){
184 cs = [cs]; 181 cs = [cs];
185 } 182 }
186 if(!tagName){ 183 if(!tagName){
187 return cs; 184 return cs;
188 } 185 }
189 var r = []; tagName = tagName.toLowerCase(); 186 var r = []; tagName = tagName.toLowerCase();
190 for(var i = 0, ci; ci = cs[i]; i++){ 187 for(var i = 0, ci; ci = cs[i]; i++){
191 if(ci.nodeType == 1 && ci.tagName.toLowerCase()==tagName){ 188 if(ci.nodeType == 1 && ci.tagName.toLowerCase()==tagName){
192 r[r.length] = ci; 189 r[r.length] = ci;
193 } 190 }
194 } 191 }
195 return r; 192 return r;
196 }; 193 };
197 194
198 function byId(cs, attr, id){ 195 function byId(cs, attr, id){
199 if(cs.tagName || cs == document){ 196 if(cs.tagName || cs == document){
200 cs = [cs]; 197 cs = [cs];
201 } 198 }
202 if(!id){ 199 if(!id){
203 return cs; 200 return cs;
204 } 201 }
205 var r = []; 202 var r = [];
206 for(var i = 0, l = cs.length; i < l; i++){ 203 for(var i = 0, l = cs.length; i < l; i++){
207 var ci = cs[i]; 204 var ci = cs[i];
208 if(ci && ci.id == id){ 205 if(ci && ci.id == id){
209 r[r.length] = ci; 206 r[r.length] = ci;
210 } 207 }
211 } 208 }
212 return r; 209 return r;
213 }; 210 };
214 211
215 function byAttribute(cs, attr, value, op, custom){ 212 function byAttribute(cs, attr, value, op, custom){
216 var r = [], st = custom=='{'; 213 var r = [], st = custom=='{';
217 var f = Clipperz.YUI.DomQuery.operators[op]; 214 var f = Clipperz.YUI.DomQuery.operators[op];
218 for(var i = 0, l = cs.length; i < l; i++){ 215 for(var i = 0, l = cs.length; i < l; i++){
219 var a; 216 var a;
220 if(st){ 217 if(st){
221 a = Clipperz.YUI.DomQuery.getStyle(cs[i], attr); 218 a = Clipperz.YUI.DomQuery.getStyle(cs[i], attr);
222 } 219 }
223 else if(attr == 'class' || attr == 'className'){ 220 else if(attr == 'class' || attr == 'className'){
224 a = cs[i].className; 221 a = cs[i].className;
225 }else if(attr == 'for'){ 222 }else if(attr == 'for'){
226 a = cs[i].htmlFor; 223 a = cs[i].htmlFor;
227 }else{ 224 }else{
228 a = cs[i].getAttribute(attr); 225 a = cs[i].getAttribute(attr);
229 } 226 }
230 if((f && f(a, value)) || (!f && a)){ 227 if((f && f(a, value)) || (!f && a)){
231 r[r.length] = cs[i]; 228 r[r.length] = cs[i];
232 } 229 }
233 } 230 }
234 return r; 231 return r;
235 }; 232 };
236 233
237 function byPseudo(cs, name, value){ 234 function byPseudo(cs, name, value){
238 return Clipperz.YUI.DomQuery.pseudos[name](cs, value); 235 return Clipperz.YUI.DomQuery.pseudos[name](cs, value);
239 }; 236 };
240 237
241 // This is for IE MSXML which does not support expandos. 238 // This is for IE MSXML which does not support expandos.
242 // IE runs the same speed using setAttribute, however FF slows way down 239 // IE runs the same speed using setAttribute, however FF slows way down
243 // and Safari completely fails so they need to continue to use expandos. 240 // and Safari completely fails so they need to continue to use expandos.
244 // Branched at load time for faster execution. 241 // Branched at load time for faster execution.
245 var isIE = window.ActiveXObject; 242 var isIE = window.ActiveXObject;
246 var addAttr = isIE ? 243 var addAttr = isIE ?
247 function(n, a, v){ 244 function(n, a, v){
248 n.setAttribute(a, v); 245 n.setAttribute(a, v);
249 } : 246 } :
250 function(n, a, v){ 247 function(n, a, v){
251 n[a] = v; 248 n[a] = v;
252 }; 249 };
253 var getAttr = isIE ? 250 var getAttr = isIE ?
254 function(n, a){ 251 function(n, a){
255 return n.getAttribute(a); 252 return n.getAttribute(a);
256 } : 253 } :
257 function(n, a){ 254 function(n, a){
258 return n[a]; 255 return n[a];
259 }; 256 };
260 var clearAttr = isIE ? 257 var clearAttr = isIE ?
261 function(n, a){ 258 function(n, a){
262 n.removeAttribute(a); 259 n.removeAttribute(a);
263 } : 260 } :
264 function(n, a, v){ 261 function(n, a, v){
265 delete n[a]; 262 delete n[a];
266 }; 263 };
267 264
268 function nodup(cs){ 265 function nodup(cs){
269 if(!cs.length){ 266 if(!cs.length){
270 return cs; 267 return cs;
271 } 268 }
272 addAttr(cs[0], '_nodup', true); 269 addAttr(cs[0], '_nodup', true);
273 var r = [cs[0]]; 270 var r = [cs[0]];
274 for(var i = 1, len = cs.length; i < len; i++){ 271 for(var i = 1, len = cs.length; i < len; i++){
275 var c = cs[i]; 272 var c = cs[i];
276 if(!getAttr(c, '_nodup')){ 273 if(!getAttr(c, '_nodup')){
277 addAttr(c, '_nodup', true); 274 addAttr(c, '_nodup', true);
278 r[r.length] = c; 275 r[r.length] = c;
279 } 276 }
280 } 277 }
281 for(var i = 0, len = cs.length; i < len; i++){ 278 for(var i = 0, len = cs.length; i < len; i++){
282 clearAttr(cs[i], '_nodup'); 279 clearAttr(cs[i], '_nodup');
283 } 280 }
284 return r; 281 return r;
285 } 282 }
286 283
287 function quickDiff(c1, c2){ 284 function quickDiff(c1, c2){
288 if(!c1.length){ 285 if(!c1.length){
289 return c2; 286 return c2;
290 } 287 }
291 for(var i = 0, len = c1.length; i < len; i++){ 288 for(var i = 0, len = c1.length; i < len; i++){
292 addAttr(c1[i], '_qdiff', true); 289 addAttr(c1[i], '_qdiff', true);
293 } 290 }
294 var r = []; 291 var r = [];
295 for(var i = 0, len = c2.length; i < len; i++){ 292 for(var i = 0, len = c2.length; i < len; i++){
296 if(!getAttr(c2[i], '_qdiff')){ 293 if(!getAttr(c2[i], '_qdiff')){
297 r[r.length] = c2[i]; 294 r[r.length] = c2[i];
298 } 295 }
299 } 296 }
300 for(var i = 0, len = c1.length; i < len; i++){ 297 for(var i = 0, len = c1.length; i < len; i++){
301 clearAttr(c1[i], '_qdiff'); 298 clearAttr(c1[i], '_qdiff');
302 } 299 }
303 return r; 300 return r;
304 } 301 }
305 302
306 function quickId(ns, mode, root, id){ 303 function quickId(ns, mode, root, id){
307 if(ns == root){ 304 if(ns == root){
308 var d = root.ownerDocument || root; 305 var d = root.ownerDocument || root;
309 return d.getElementById(id); 306 return d.getElementById(id);
310 } 307 }
311 ns = getNodes(ns, mode, '*'); 308 ns = getNodes(ns, mode, '*');
312 return byId(ns, null, id); 309 return byId(ns, null, id);
313 } 310 }
314 311
315 return { 312 return {
316 getStyle : function(el, name){ 313 getStyle : function(el, name){
317 return YAHOO.util.Dom.getStyle(el, name); 314 return YAHOO.util.Dom.getStyle(el, name);
318 }, 315 },
319 /** 316 /**
320 * Compiles a selector/xpath query into a reusable function. The returned function 317 * Compiles a selector/xpath query into a reusable function. The returned function
321 * takes one parameter "root" (optional), which is the context node from where the query should start. 318 * takes one parameter "root" (optional), which is the context node from where the query should start.
322 * @param {String} selector The selector/xpath query 319 * @param {String} selector The selector/xpath query
323 * @param {String} type (optional) Either 'select' (the default) or 'simple' for a simple selector match 320 * @param {String} type (optional) Either 'select' (the default) or 'simple' for a simple selector match
324 * @return {Function} 321 * @return {Function}
325 */ 322 */
326 compile : function(path, type){ 323 compile : function(path, type){
327 // strip leading slashes 324 // strip leading slashes
328 while(path.substr(0, 1)=='/'){ 325 while(path.substr(0, 1)=='/'){
329 path = path.substr(1); 326 path = path.substr(1);
330 } 327 }
331 type = type || 'select'; 328 type = type || 'select';
332 329
333 var fn = ['var f = function(root){\n var mode; var n = root || document;\n']; 330 var fn = ['var f = function(root){\n var mode; var n = root || document;\n'];
334 var q = path, mode, lq; 331 var q = path, mode, lq;
335 var tk = Clipperz.YUI.DomQuery.matchers; 332 var tk = Clipperz.YUI.DomQuery.matchers;
336 var tklen = tk.length; 333 var tklen = tk.length;
337 var mm; 334 var mm;
338 while(q && lq != q){ 335 while(q && lq != q){
339 lq = q; 336 lq = q;
340 var tm = q.match(/^(#)?([\w-\*]+)/); 337 var tm = q.match(/^(#)?([\w-\*]+)/);
341 if(type == 'select'){ 338 if(type == 'select'){
342 if(tm){ 339 if(tm){
343 if(tm[1] == '#'){ 340 if(tm[1] == '#'){
344 fn[fn.length] = 'n = quickId(n, mode, root, "'+tm[2]+'");'; 341 fn[fn.length] = 'n = quickId(n, mode, root, "'+tm[2]+'");';
345 }else{ 342 }else{
346 fn[fn.length] = 'n = getNodes(n, mode, "'+tm[2]+'");'; 343 fn[fn.length] = 'n = getNodes(n, mode, "'+tm[2]+'");';
347 } 344 }
348 q = q.replace(tm[0], ''); 345 q = q.replace(tm[0], '');
349 }else{ 346 }else{
350 fn[fn.length] = 'n = getNodes(n, mode, "*");'; 347 fn[fn.length] = 'n = getNodes(n, mode, "*");';
351 } 348 }
352 }else{ 349 }else{
353 if(tm){ 350 if(tm){
354 if(tm[1] == '#'){ 351 if(tm[1] == '#'){
355 fn[fn.length] = 'n = byId(n, null, "'+tm[2]+'");'; 352 fn[fn.length] = 'n = byId(n, null, "'+tm[2]+'");';
356 }else{ 353 }else{
357 fn[fn.length] = 'n = byTag(n, "'+tm[2]+'");'; 354 fn[fn.length] = 'n = byTag(n, "'+tm[2]+'");';
358 } 355 }
359 q = q.replace(tm[0], ''); 356 q = q.replace(tm[0], '');
360 } 357 }
361 } 358 }
362 while(!(mm = q.match(modeRe))){ 359 while(!(mm = q.match(modeRe))){
363 var matched = false; 360 var matched = false;
364 for(var j = 0; j < tklen; j++){ 361 for(var j = 0; j < tklen; j++){
365 var t = tk[j]; 362 var t = tk[j];
366 var m = q.match(t.re); 363 var m = q.match(t.re);
367 if(m){ 364 if(m){
368 fn[fn.length] = t.select.replace(tplRe, function(x, i){ 365 fn[fn.length] = t.select.replace(tplRe, function(x, i){
369 return m[i]; 366 return m[i];
370 }); 367 });
371 q = q.replace(m[0], ''); 368 q = q.replace(m[0], '');
372 matched = true; 369 matched = true;
373 break; 370 break;
374 } 371 }
375 } 372 }
376 // prevent infinite loop on bad selector 373 // prevent infinite loop on bad selector
377 if(!matched){ 374 if(!matched){
378 throw 'Error parsing selector, parsing failed at "' + q + '"'; 375 throw 'Error parsing selector, parsing failed at "' + q + '"';
379 } 376 }
380 } 377 }
381 if(mm[1]){ 378 if(mm[1]){
382 fn[fn.length] = 'mode="'+mm[1]+'";'; 379 fn[fn.length] = 'mode="'+mm[1]+'";';
383 q = q.replace(mm[1], ''); 380 q = q.replace(mm[1], '');
384 } 381 }
385 } 382 }
386 fn[fn.length] = 'return nodup(n);\n}'; 383 fn[fn.length] = 'return nodup(n);\n}';
387 eval(fn.join('')); 384 eval(fn.join(''));
388 return f; 385 return f;
389 }, 386 },
390 387
391 /** 388 /**
392 * Selects a group of elements. 389 * Selects a group of elements.
393 * @param {String} selector The selector/xpath query 390 * @param {String} selector The selector/xpath query
394 * @param {Node} root (optional) The start of the query (defaults to document). 391 * @param {Node} root (optional) The start of the query (defaults to document).
395 * @return {Array} 392 * @return {Array}
396 */ 393 */
397 select : function(path, root, type){ 394 select : function(path, root, type){
398 if(!root || root == document){ 395 if(!root || root == document){
399 root = document; 396 root = document;
400 } 397 }
401 if(typeof root == 'string'){ 398 if(typeof root == 'string'){
402 root = document.getElementById(root); 399 root = document.getElementById(root);
403 } 400 }
404 var paths = path.split(','); 401 var paths = path.split(',');
405 var results = []; 402 var results = [];
406 for(var i = 0, len = paths.length; i < len; i++){ 403 for(var i = 0, len = paths.length; i < len; i++){
407 var p = paths[i].replace(trimRe, '$1'); 404 var p = paths[i].replace(trimRe, '$1');
408 if(!cache[p]){ 405 if(!cache[p]){
diff --git a/frontend/gamma/js/Clipperz/YUI/Utils.js b/frontend/gamma/js/Clipperz/YUI/Utils.js
index 4d4a5f9..e9929fc 100644
--- a/frontend/gamma/js/Clipperz/YUI/Utils.js
+++ b/frontend/gamma/js/Clipperz/YUI/Utils.js
@@ -1,98 +1,95 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29if (typeof YAHOO == 'undefined') { YAHOO = {}; }; 26if (typeof YAHOO == 'undefined') { YAHOO = {}; };
30if (typeof YAHOO.util == 'undefined') { YAHOO.util = {}; }; 27if (typeof YAHOO.util == 'undefined') { YAHOO.util = {}; };
31if (typeof YAHOO.util.Dom == 'undefined') { YAHOO.util.Dom = {}; }; 28if (typeof YAHOO.util.Dom == 'undefined') { YAHOO.util.Dom = {}; };
32 29
33YAHOO.extend = function(subc, superc, overrides) { 30YAHOO.extend = function(subc, superc, overrides) {
34 var F = function() {}; 31 var F = function() {};
35 F.prototype=superc.prototype; 32 F.prototype=superc.prototype;
36 subc.prototype=new F(); 33 subc.prototype=new F();
37 subc.prototype.constructor=subc; 34 subc.prototype.constructor=subc;
38 subc.superclass=superc.prototype; 35 subc.superclass=superc.prototype;
39 if (superc.prototype.constructor == Object.prototype.constructor) { 36 if (superc.prototype.constructor == Object.prototype.constructor) {
40 superc.prototype.constructor=superc; 37 superc.prototype.constructor=superc;
41 } 38 }
42 39
43 if (overrides) { 40 if (overrides) {
44 for (var i in overrides) { 41 for (var i in overrides) {
45 subc.prototype[i]=overrides[i]; 42 subc.prototype[i]=overrides[i];
46 } 43 }
47 } 44 }
48}; 45};
49 46
50YAHOO.override = function(origclass, overrides){ 47YAHOO.override = function(origclass, overrides){
51 if(overrides){ 48 if(overrides){
52 var p = origclass.prototype; 49 var p = origclass.prototype;
53 for(var method in overrides){ 50 for(var method in overrides){
54 p[method] = overrides[method]; 51 p[method] = overrides[method];
55 } 52 }
56 } 53 }
57}; 54};
58 55
59YAHOO.extendX = function(subclass, superclass, overrides){ 56YAHOO.extendX = function(subclass, superclass, overrides){
60 YAHOO.extend(subclass, superclass); 57 YAHOO.extend(subclass, superclass);
61 subclass.override = function(o){ 58 subclass.override = function(o){
62 YAHOO.override(subclass, o); 59 YAHOO.override(subclass, o);
63 }; 60 };
64 if(!subclass.prototype.override){ 61 if(!subclass.prototype.override){
65 subclass.prototype.override = function(o){ 62 subclass.prototype.override = function(o){
66 for(var method in o){ 63 for(var method in o){
67 this[method] = o[method]; 64 this[method] = o[method];
68 } 65 }
69 }; 66 };
70 } 67 }
71 if(overrides){ 68 if(overrides){
72 subclass.override(overrides); 69 subclass.override(overrides);
73 }; 70 };
74 71
75}; 72};
76 73
77YAHOO.util.Dom.get = function(el) { 74YAHOO.util.Dom.get = function(el) {
78 if (!el) { return null; } // nothing to work with 75 if (!el) { return null; } // nothing to work with
79 76
80 if (typeof el != 'string' && !(el instanceof Array) ) { // assuming HTMLElement or HTMLCollection, so pass back as is 77 if (typeof el != 'string' && !(el instanceof Array) ) { // assuming HTMLElement or HTMLCollection, so pass back as is
81 return el; 78 return el;
82 } 79 }
83 80
84 if (typeof el == 'string') { // ID 81 if (typeof el == 'string') { // ID
85 return document.getElementById(el); 82 return document.getElementById(el);
86 } 83 }
87 else { // array of ID's and/or elements 84 else { // array of ID's and/or elements
88 var collection = []; 85 var collection = [];
89 for (var i = 0, len = el.length; i < len; ++i) { 86 for (var i = 0, len = el.length; i < len; ++i) {
90 collection[collection.length] = YAHOO.util.Dom.get(el[i]); 87 collection[collection.length] = YAHOO.util.Dom.get(el[i]);
91 } 88 }
92 89
93 return collection; 90 return collection;
94 } 91 }
95 92
96 return null; // safety, should never happen 93 return null; // safety, should never happen
97}; 94};
98 95
diff --git a/frontend/gamma/js/main.js b/frontend/gamma/js/main.js
index abb178f..352c4c7 100644
--- a/frontend/gamma/js/main.js
+++ b/frontend/gamma/js/main.js
@@ -1,109 +1,106 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29function _pm_logEvent(anEvent) { 26function _pm_logEvent(anEvent) {
30 //console.log("####", anEvent); 27 //console.log("####", anEvent);
31 28
32 anEvent.preventDefault(); 29 anEvent.preventDefault();
33} 30}
34 31
35function handleGenericDeferredError(anError) { 32function handleGenericDeferredError(anError) {
36 var result; 33 var result;
37 34
38 if (anError instanceof MochiKit.Async.CancelledError) { 35 if (anError instanceof MochiKit.Async.CancelledError) {
39 result = anError; 36 result = anError;
40 } else { 37 } else {
41MochiKit.Logging.logError("## MainController - GENERIC ERROR" + "\n" + "==>> " + anError + " <<==\n" + anError.stack); 38MochiKit.Logging.logError("## MainController - GENERIC ERROR" + "\n" + "==>> " + anError + " <<==\n" + anError.stack);
42//console.log(anError); 39//console.log(anError);
43 result = new MochiKit.Async.CancelledError(anError); 40 result = new MochiKit.Async.CancelledError(anError);
44 } 41 }
45 42
46 return result; 43 return result;
47} 44}
48 45
49 46
50Clipperz.PM.RunTime = {}; 47Clipperz.PM.RunTime = {};
51 48
52 49
53function run() { 50function run() {
54 var shouldShowRegistrationForm; 51 var shouldShowRegistrationForm;
55 var useCompactDesign; 52 var useCompactDesign;
56 var controllerParameters; 53 var controllerParameters;
57 //var iPhoneDesign; 54 //var iPhoneDesign;
58 55
59 //MochiKit.Signal.connect(document.body, 'onkeydown', _pm_logEvent); 56 //MochiKit.Signal.connect(document.body, 'onkeydown', _pm_logEvent);
60 //MochiKit.Signal.connect(document.body, 'onkeypress', _pm_logEvent); 57 //MochiKit.Signal.connect(document.body, 'onkeypress', _pm_logEvent);
61 //MochiKit.Signal.connect(document.body, 'onclick', _pm_logEvent); 58 //MochiKit.Signal.connect(document.body, 'onclick', _pm_logEvent);
62 59
63 controllerParameters = {}; 60 controllerParameters = {};
64 61
65 MochiKit.DOM.removeElement('javaScriptAlert'); 62 MochiKit.DOM.removeElement('javaScriptAlert');
66 Clipperz.PM.Strings.Languages.initSetup(); 63 Clipperz.PM.Strings.Languages.initSetup();
67 64
68 if (window.location.search.indexOf('registration') != -1) { 65 if (window.location.search.indexOf('registration') != -1) {
69 shouldShowRegistrationForm = true; 66 shouldShowRegistrationForm = true;
70 } else { 67 } else {
71 shouldShowRegistrationForm = false; 68 shouldShowRegistrationForm = false;
72 } 69 }
73 70
74 if (window.location.search.indexOf('autocomplete') != -1) { 71 if (window.location.search.indexOf('autocomplete') != -1) {
75 controllerParameters['autocomplete'] = 'on' 72 controllerParameters['autocomplete'] = 'on'
76 } 73 }
77 74
78 //if ((window.location.search.indexOf('iPhone') != -1) || (navigator.userAgent.match('iPhone'))) { 75 //if ((window.location.search.indexOf('iPhone') != -1) || (navigator.userAgent.match('iPhone'))) {
79 // iPhoneDesign = true; 76 // iPhoneDesign = true;
80 //} else { 77 //} else {
81 // iPhoneDesign = false; 78 // iPhoneDesign = false;
82 //} 79 //}
83 80
84 if (window.location.search.indexOf('compact') != -1) { 81 if (window.location.search.indexOf('compact') != -1) {
85 useCompactDesign = true; 82 useCompactDesign = true;
86 } else { 83 } else {
87 useCompactDesign = false; 84 useCompactDesign = false;
88 } 85 }
89 86
90 if (useCompactDesign == true) { 87 if (useCompactDesign == true) {
91 Clipperz.PM.RunTime.mainController = new Clipperz.PM.UI.Compact.Controllers.MainController(controllerParameters); 88 Clipperz.PM.RunTime.mainController = new Clipperz.PM.UI.Compact.Controllers.MainController(controllerParameters);
92 //} else if (iPhoneDesign == true) { 89 //} else if (iPhoneDesign == true) {
93 // Clipperz.PM.RunTime.mainController = new Clipperz.PM.UI.iPhone.Controllers.MainController(); 90 // Clipperz.PM.RunTime.mainController = new Clipperz.PM.UI.iPhone.Controllers.MainController();
94 } else { 91 } else {
95 Clipperz.PM.RunTime.mainController = new Clipperz.PM.UI.Web.Controllers.MainController(controllerParameters); 92 Clipperz.PM.RunTime.mainController = new Clipperz.PM.UI.Web.Controllers.MainController(controllerParameters);
96 } 93 }
97 94
98 Clipperz.PM.RunTime.mainController.run(shouldShowRegistrationForm); 95 Clipperz.PM.RunTime.mainController.run(shouldShowRegistrationForm);
99 96
100//Clipperz.log("HASH: " + window.location.hash); 97//Clipperz.log("HASH: " + window.location.hash);
101if (window.location.hash != "") { 98if (window.location.hash != "") {
102 window.location.hash = "" 99 window.location.hash = ""
103} 100}
104//Clipperz.log("HASH cleaned"); 101//Clipperz.log("HASH cleaned");
105 //#credentials=base64encoded({username:'joe', passphrase:'clipperz'}) 102 //#credentials=base64encoded({username:'joe', passphrase:'clipperz'})
106 //MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'doLogin', {username:'joe', passphrase:'clipperz'}); 103 //MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'doLogin', {username:'joe', passphrase:'clipperz'});
107} 104}
108 105
109MochiKit.DOM.addLoadEvent(run); 106MochiKit.DOM.addLoadEvent(run);
diff --git a/frontend/gamma/js/main_iPhone.js b/frontend/gamma/js/main_iPhone.js
index f13e95c..0644f68 100644
--- a/frontend/gamma/js/main_iPhone.js
+++ b/frontend/gamma/js/main_iPhone.js
@@ -1,60 +1,57 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29function _pm_logEvent(anEvent) { 26function _pm_logEvent(anEvent) {
30 //console.log("####", anEvent); 27 //console.log("####", anEvent);
31 28
32 anEvent.preventDefault(); 29 anEvent.preventDefault();
33} 30}
34 31
35function handleGenericDeferredError(anError) { 32function handleGenericDeferredError(anError) {
36 var result; 33 var result;
37 34
38 if (anError instanceof MochiKit.Async.CancelledError) { 35 if (anError instanceof MochiKit.Async.CancelledError) {
39 result = anError; 36 result = anError;
40 } else { 37 } else {
41MochiKit.Logging.logError("## MainController - GENERIC ERROR" + "\n" + "==>> " + anError + " <<==\n" + anError.stack); 38MochiKit.Logging.logError("## MainController - GENERIC ERROR" + "\n" + "==>> " + anError + " <<==\n" + anError.stack);
42 result = new MochiKit.Async.CancelledError(anError); 39 result = new MochiKit.Async.CancelledError(anError);
43 } 40 }
44 41
45 return result; 42 return result;
46} 43}
47 44
48 45
49Clipperz.PM.RunTime = {}; 46Clipperz.PM.RunTime = {};
50 47
51 48
52function run() { 49function run() {
53 MochiKit.DOM.removeElement('javaScriptAlert'); 50 MochiKit.DOM.removeElement('javaScriptAlert');
54 Clipperz.PM.Strings.Languages.initSetup(); 51 Clipperz.PM.Strings.Languages.initSetup();
55 52
56 Clipperz.PM.RunTime.mainController = new Clipperz.PM.UI.iPhone.Controllers.MainController(); 53 Clipperz.PM.RunTime.mainController = new Clipperz.PM.UI.iPhone.Controllers.MainController();
57 Clipperz.PM.RunTime.mainController.run(false); 54 Clipperz.PM.RunTime.mainController.run(false);
58} 55}
59 56
60MochiKit.DOM.addLoadEvent(run); 57MochiKit.DOM.addLoadEvent(run);
diff --git a/frontend/gamma/tests/SimpleTest/SimpleTest.Async.js b/frontend/gamma/tests/SimpleTest/SimpleTest.Async.js
index 040cdbf..3633182 100644
--- a/frontend/gamma/tests/SimpleTest/SimpleTest.Async.js
+++ b/frontend/gamma/tests/SimpleTest/SimpleTest.Async.js
@@ -1,169 +1,166 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29MochiKit.Base.update(Clipperz.Async.Deferred.prototype, { 26MochiKit.Base.update(Clipperz.Async.Deferred.prototype, {
30/* 27/*
31 '_addTest': function(anExpectedValue, aDescription, isDeep, aResult) { 28 '_addTest': function(anExpectedValue, aDescription, isDeep, aResult) {
32 if (isDeep) { 29 if (isDeep) {
33 SimpleTest.isDeeply(aResult, anExpectedValue, aDescription); 30 SimpleTest.isDeeply(aResult, anExpectedValue, aDescription);
34 } else { 31 } else {
35 SimpleTest.is(aResult, anExpectedValue, aDescription); 32 SimpleTest.is(aResult, anExpectedValue, aDescription);
36 } 33 }
37 34
38 return aResult; 35 return aResult;
39 }, 36 },
40*/ 37*/
41 'addTest': function (anExpectedValue, aDescription, isDeep) { 38 'addTest': function (anExpectedValue, aDescription, isDeep) {
42 // this.addMethod(this, '_addTest', anExpectedValue, aDescription, isDeep); 39 // this.addMethod(this, '_addTest', anExpectedValue, aDescription, isDeep);
43 // this.addCallback(Clipperz.Async.test, anExpectedValue, aDescription, isDeep); 40 // this.addCallback(Clipperz.Async.test, anExpectedValue, aDescription, isDeep);
44 41
45 if (isDeep) { 42 if (isDeep) {
46 // SimpleTest.isDeeply(aResult, anExpectedValue, aDescription); 43 // SimpleTest.isDeeply(aResult, anExpectedValue, aDescription);
47 this.addCallback(Clipperz.Async.Test.isDeeply(anExpectedValue, aDescription)); 44 this.addCallback(Clipperz.Async.Test.isDeeply(anExpectedValue, aDescription));
48 } else { 45 } else {
49 // SimpleTest.is(aResult, anExpectedValue, aDescription); 46 // SimpleTest.is(aResult, anExpectedValue, aDescription);
50 this.addCallback(Clipperz.Async.Test.is(anExpectedValue, aDescription)); 47 this.addCallback(Clipperz.Async.Test.is(anExpectedValue, aDescription));
51 } 48 }
52 }, 49 },
53 50
54 //------------------------------------------------------------------------- 51 //-------------------------------------------------------------------------
55 52
56 'shouldSucceed': function (aDescription) { 53 'shouldSucceed': function (aDescription) {
57 this.addCallbackPass(SimpleTest.ok, true, aDescription); 54 this.addCallbackPass(SimpleTest.ok, true, aDescription);
58 this.addErrbackPass (SimpleTest.ok, false, aDescription); 55 this.addErrbackPass (SimpleTest.ok, false, aDescription);
59 this.addBoth(MochiKit.Async.succeed, null); 56 this.addBoth(MochiKit.Async.succeed, null);
60 }, 57 },
61 58
62 'shouldFail': function (aDescription) { 59 'shouldFail': function (aDescription) {
63 this.addCallbackPass(SimpleTest.ok, false, aDescription); 60 this.addCallbackPass(SimpleTest.ok, false, aDescription);
64 this.addErrbackPass (SimpleTest.ok, true, aDescription); 61 this.addErrbackPass (SimpleTest.ok, true, aDescription);
65 this.addBoth(MochiKit.Async.succeed, null); 62 this.addBoth(MochiKit.Async.succeed, null);
66 }, 63 },
67 64
68 //------------------------------------------------------------------------- 65 //-------------------------------------------------------------------------
69 66
70}); 67});
71 68
72 69
73Clipperz.Async.Test = {}; 70Clipperz.Async.Test = {};
74MochiKit.Base.update(Clipperz.Async.Test, { 71MochiKit.Base.update(Clipperz.Async.Test, {
75 72
76 'is': function (anExpectedResult, aDescription) { 73 'is': function (anExpectedResult, aDescription) {
77 return MochiKit.Base.partial(function (anExpectedResult, aDescription, aResult) { 74 return MochiKit.Base.partial(function (anExpectedResult, aDescription, aResult) {
78 SimpleTest.is(aResult, anExpectedResult, aDescription); 75 SimpleTest.is(aResult, anExpectedResult, aDescription);
79 76
80 return aResult; 77 return aResult;
81 }, anExpectedResult, aDescription); 78 }, anExpectedResult, aDescription);
82 }, 79 },
83 80
84 //------------------------------------------------------------------------- 81 //-------------------------------------------------------------------------
85 82
86 'ok': function (aDescription) { 83 'ok': function (aDescription) {
87 return MochiKit.Base.partial(function (aDescription, aResult) { 84 return MochiKit.Base.partial(function (aDescription, aResult) {
88 SimpleTest.ok(aResult, aDescription); 85 SimpleTest.ok(aResult, aDescription);
89 86
90 return aResult; 87 return aResult;
91 }, aDescription); 88 }, aDescription);
92 }, 89 },
93 90
94 //------------------------------------------------------------------------- 91 //-------------------------------------------------------------------------
95 92
96 'fail': function(aDescription) { 93 'fail': function(aDescription) {
97 return MochiKit.Base.partial(function (aDescription, aResult) { 94 return MochiKit.Base.partial(function (aDescription, aResult) {
98 SimpleTest.ok(!aResult, aDescription); 95 SimpleTest.ok(!aResult, aDescription);
99 96
100 return aResult; 97 return aResult;
101 }, aDescription); 98 }, aDescription);
102 }, 99 },
103 100
104 //------------------------------------------------------------------------- 101 //-------------------------------------------------------------------------
105 102
106 'isDeeply': function (anExpectedResult, aDescription) { 103 'isDeeply': function (anExpectedResult, aDescription) {
107 return MochiKit.Base.partial(function (anExpectedResult, aDescription, aResult) { 104 return MochiKit.Base.partial(function (anExpectedResult, aDescription, aResult) {
108 SimpleTest.isDeeply(aResult, anExpectedResult, aDescription); 105 SimpleTest.isDeeply(aResult, anExpectedResult, aDescription);
109 106
110 return aResult; 107 return aResult;
111 }, anExpectedResult, aDescription); 108 }, anExpectedResult, aDescription);
112 }, 109 },
113 110
114 //------------------------------------------------------------------------- 111 //-------------------------------------------------------------------------
115 __syntaxFix__: "syntax fix" 112 __syntaxFix__: "syntax fix"
116}); 113});
117 114
118 115
119SimpleTest.runDeferredTests = function (aName, aTestSet, aTestArguments) { 116SimpleTest.runDeferredTests = function (aName, aTestSet, aTestArguments) {
120 try { 117 try {
121 var deferredTests; 118 var deferredTests;
122 var aTestName; 119 var aTestName;
123 var title; 120 var title;
124 121
125 deferredTests = new Clipperz.Async.Deferred(aName + " <deferred test set>", aTestArguments); 122 deferredTests = new Clipperz.Async.Deferred(aName + " <deferred test set>", aTestArguments);
126 123
127 title = aName; 124 title = aName;
128 125
129 aTestName = window.location.href.match(/#.*/); 126 aTestName = window.location.href.match(/#.*/);
130 if (aTestName && (aTestName != '#')) { 127 if (aTestName && (aTestName != '#')) {
131 aTestName = aTestName[0].slice(1); 128 aTestName = aTestName[0].slice(1);
132 if (aTestName in aTestSet) { 129 if (aTestName in aTestSet) {
133 //Clipperz.log("single test execution, via fragment identifier", aTestName); 130 //Clipperz.log("single test execution, via fragment identifier", aTestName);
134 title += ' [' + aTestName + ']'; 131 title += ' [' + aTestName + ']';
135 deferredTests.addCallback(aTestSet[aTestName], aTestArguments); 132 deferredTests.addCallback(aTestSet[aTestName], aTestArguments);
136 deferredTests.addErrback(SimpleTest.ok, false, aTestName); 133 deferredTests.addErrback(SimpleTest.ok, false, aTestName);
137 } else { 134 } else {
138 title = 'WRONG TEST NAME' 135 title = 'WRONG TEST NAME'
139 deferredTests.addBoth(is, aTestName, null, "Wrong test name selected to run"); 136 deferredTests.addBoth(is, aTestName, null, "Wrong test name selected to run");
140 } 137 }
141 } else { 138 } else {
142 for (aTestName in aTestSet) { 139 for (aTestName in aTestSet) {
143 deferredTests.addCallback(aTestSet[aTestName], aTestArguments); 140 deferredTests.addCallback(aTestSet[aTestName], aTestArguments);
144 deferredTests.addErrback(SimpleTest.ok, false, aTestName); 141 deferredTests.addErrback(SimpleTest.ok, false, aTestName);
145 deferredTests.addBoth(MochiKit.Async.wait, 0.5); 142 deferredTests.addBoth(MochiKit.Async.wait, 0.5);
146 } 143 }
147 deferredTests.addBoth(is, true, true, "FINISH: completed the full stack of tests"); 144 deferredTests.addBoth(is, true, true, "FINISH: completed the full stack of tests");
148 } 145 }
149 146
150 MochiKit.DOM.currentDocument().title = title; 147 MochiKit.DOM.currentDocument().title = title;
151 148
152 deferredTests.addBoth(SimpleTest.finish); 149 deferredTests.addBoth(SimpleTest.finish);
153 deferredTests.callback(); 150 deferredTests.callback();
154 151
155 SimpleTest.waitForExplicitFinish(); 152 SimpleTest.waitForExplicitFinish();
156 } catch (err) { 153 } catch (err) {
157 var s = "test suite failure!\n"; 154 var s = "test suite failure!\n";
158 var o = {}; 155 var o = {};
159 var k = null; 156 var k = null;
160 for (k in err) { 157 for (k in err) {
161 // ensure unique keys?! 158 // ensure unique keys?!
162 if (!o[k]) { 159 if (!o[k]) {
163 s += k + ": " + err[k] + "\n"; 160 s += k + ": " + err[k] + "\n";
164 o[k] = err[k]; 161 o[k] = err[k];
165 } 162 }
166 } 163 }
167 ok ( false, s ); 164 ok ( false, s );
168 } 165 }
169} 166}
diff --git a/frontend/gamma/tests/index.html b/frontend/gamma/tests/index.html
index 865f8f1..ef89088 100755
--- a/frontend/gamma/tests/index.html
+++ b/frontend/gamma/tests/index.html
@@ -1,56 +1,53 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27--> 24-->
28 25
29<html> 26<html>
30<head> 27<head>
31 <script type="text/javascript" src="../js/MochiKit/MochiKit.js"></script> 28 <script type="text/javascript" src="../js/MochiKit/MochiKit.js"></script>
32 <script type="text/javascript" src="./SimpleTest/TestRunner.js"></script> 29 <script type="text/javascript" src="./SimpleTest/TestRunner.js"></script>
33</head> 30</head>
34<body> 31<body>
35<script type="text/javascript"> 32<script type="text/javascript">
36TestRunner.runTests( 33TestRunner.runTests(
37/* 34/*
38 //'tests/Clipperz/Base.html', 35 //'tests/Clipperz/Base.html',
39 //'tests/Clipperz/Set.html', 36 //'tests/Clipperz/Set.html',
40 'tests/Clipperz/index.html', 37 'tests/Clipperz/index.html',
41 38
42 //'tests/Clipperz/Crypto/Base.html', 39 //'tests/Clipperz/Crypto/Base.html',
43 //'tests/Clipperz/Crypto/BigInt.html', 40 //'tests/Clipperz/Crypto/BigInt.html',
44 //'tests/Clipperz/Crypto/SRP.html' 41 //'tests/Clipperz/Crypto/SRP.html'
45 'tests/Clipperz/Crypto/index.html', 42 'tests/Clipperz/Crypto/index.html',
46 'tests/Clipperz/PM/index.html', 43 'tests/Clipperz/PM/index.html',
47 'tests/Clipperz/PM/DataModel/index.html' 44 'tests/Clipperz/PM/DataModel/index.html'
48*/ 45*/
49 46
50 'tests/index.html' 47 'tests/index.html'
51 48
52 49
53); 50);
54</script> 51</script>
55</body> 52</body>
56</html> \ No newline at end of file 53</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 3847475..fd79d8a 100644
--- a/frontend/gamma/tests/tests/Bookmarklet/Bookmarklet.css
+++ b/frontend/gamma/tests/tests/Bookmarklet/Bookmarklet.css
@@ -1,201 +1,198 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29/* @override 26/* @override
30 http://localhost:8000/tests/js/tests/Bookmarklet/Bookmarklet.css 27 http://localhost:8000/tests/js/tests/Bookmarklet/Bookmarklet.css
31 http://www.clipperz.com/files/clipperz.com/bookmarklet/0.3.0/Bookmarklet.css 28 http://www.clipperz.com/files/clipperz.com/bookmarklet/0.3.0/Bookmarklet.css
32*/ 29*/
33 30
34div#clipperzBookmarklet { 31div#clipperzBookmarklet {
35 margin: 0; 32 margin: 0;
36 padding: 0; 33 padding: 0;
37 border: 0; 34 border: 0;
38 outline: 0; 35 outline: 0;
39 font-size: 100%; 36 font-size: 100%;
40 vertical-align: baseline; 37 vertical-align: baseline;
41 background: transparent; 38 background: transparent;
42 39
43 position: absolute; 40 position: absolute;
44 top: 80px; 41 top: 80px;
45 left: 100px; 42 left: 100px;
46 width: 202px; 43 width: 202px;
47 height: 202px; 44 height: 202px;
48 background: url(./background.png) no-repeat; 45 background: url(./background.png) no-repeat;
49} 46}
50 47
51div#clipperzBookmarklet div#clipperzBookmarkletClose { 48div#clipperzBookmarklet div#clipperzBookmarkletClose {
52 margin: 0; 49 margin: 0;
53 padding: 0; 50 padding: 0;
54 border: 0; 51 border: 0;
55 outline: 0; 52 outline: 0;
56 font-size: 100%; 53 font-size: 100%;
57 vertical-align: baseline; 54 vertical-align: baseline;
58 background: transparent; 55 background: transparent;
59 56
60 position: absolute; 57 position: absolute;
61 left: 168px; 58 left: 168px;
62 top: 5px; 59 top: 5px;
63 width: 25px; 60 width: 25px;
64 height: 25px; 61 height: 25px;
65 background: url(./close.png) no-repeat; 62 background: url(./close.png) no-repeat;
66} 63}
67 64
68div#clipperzBookmarklet div#clipperzBookmarkletClose:hover { 65div#clipperzBookmarklet div#clipperzBookmarkletClose:hover {
69 background: url(./close_selected.png) no-repeat; 66 background: url(./close_selected.png) no-repeat;
70 cursor: pointer; 67 cursor: pointer;
71} 68}
72 69
73div#clipperzBookmarklet div#clipperzBookmarkletResult { 70div#clipperzBookmarklet div#clipperzBookmarkletResult {
74 margin: 0; 71 margin: 0;
75 padding: 0; 72 padding: 0;
76 border: 0; 73 border: 0;
77 outline: 0; 74 outline: 0;
78 font-size: 100%; 75 font-size: 100%;
79 vertical-align: baseline; 76 vertical-align: baseline;
80 background: transparent; 77 background: transparent;
81 78
82 position: absolute; 79 position: absolute;
83 width: 145px; 80 width: 145px;
84 top: 61px; 81 top: 61px;
85 left: 27px; 82 left: 27px;
86 height: 63px; 83 height: 63px;
87 overflow: hidden; 84 overflow: hidden;
88} 85}
89 86
90div#clipperzBookmarklet div#clipperzBookmarkletResultIcon { 87div#clipperzBookmarklet div#clipperzBookmarkletResultIcon {
91 margin: 0; 88 margin: 0;
92 padding: 0; 89 padding: 0;
93 border: 0; 90 border: 0;
94 outline: 0; 91 outline: 0;
95 font-size: 100%; 92 font-size: 100%;
96 vertical-align: baseline; 93 vertical-align: baseline;
97 94
98 width: 28px; 95 width: 28px;
99 height: 35px; 96 height: 35px;
100 position: absolute; 97 position: absolute;
101} 98}
102 99
103div#clipperzBookmarklet div#clipperzBookmarkletResultIcon.ok { 100div#clipperzBookmarklet div#clipperzBookmarkletResultIcon.ok {
104 background: transparent url(./info.png); 101 background: transparent url(./info.png);
105} 102}
106 103
107div#clipperzBookmarklet div#clipperzBookmarkletResultIcon.fail { 104div#clipperzBookmarklet div#clipperzBookmarkletResultIcon.fail {
108 background: transparent url(./error.png); 105 background: transparent url(./error.png);
109} 106}
110 107
111div#clipperzBookmarklet div#clipperzBookmarkletResult p { 108div#clipperzBookmarklet div#clipperzBookmarkletResult p {
112 margin: 0; 109 margin: 0;
113 padding: 0; 110 padding: 0;
114 border: 0; 111 border: 0;
115 outline: 0; 112 outline: 0;
116 font-size: 100%; 113 font-size: 100%;
117 vertical-align: baseline; 114 vertical-align: baseline;
118 background: transparent; 115 background: transparent;
119 116
120 font-family: Helvetica, Arial, Geneva, sans-serif; 117 font-family: Helvetica, Arial, Geneva, sans-serif;
121 color: #898e7d; 118 color: #898e7d;
122 font-size: 14px; 119 font-size: 14px;
123 margin-left: 35px; 120 margin-left: 35px;
124} 121}
125 122
126div#clipperzBookmarklet div#clipperzBookmarletButton { 123div#clipperzBookmarklet div#clipperzBookmarletButton {
127 margin: 0; 124 margin: 0;
128 padding: 0; 125 padding: 0;
129 border: 0; 126 border: 0;
130 outline: 0; 127 outline: 0;
131 font-size: 100%; 128 font-size: 100%;
132 vertical-align: baseline; 129 vertical-align: baseline;
133 background: transparent; 130 background: transparent;
134 131
135 position: absolute; 132 position: absolute;
136 top: 125px; 133 top: 125px;
137 left: 26px; 134 left: 26px;
138 width: 148px; 135 width: 148px;
139 height: 49px; 136 height: 49px;
140 background: url(./copy.png) no-repeat; 137 background: url(./copy.png) no-repeat;
141} 138}
142 139
143div#clipperzBookmarklet div#clipperzBookmarletButton span { 140div#clipperzBookmarklet div#clipperzBookmarletButton span {
144 margin: 0; 141 margin: 0;
145 padding: 0; 142 padding: 0;
146 border: 0; 143 border: 0;
147 outline: 0; 144 outline: 0;
148 font-size: 100%; 145 font-size: 100%;
149 vertical-align: baseline; 146 vertical-align: baseline;
150 background: transparent; 147 background: transparent;
151 148
152 display: block; 149 display: block;
153 font-family: Helvetica, Arial, Geneva, sans-serif; 150 font-family: Helvetica, Arial, Geneva, sans-serif;
154 font-weight: bold; 151 font-weight: bold;
155 font-size: 14pt; 152 font-size: 14pt;
156 padding-left: 60px; 153 padding-left: 60px;
157 padding-top: 12px; 154 padding-top: 12px;
158 color: #838975; 155 color: #838975;
159} 156}
160 157
161div#clipperzBookmarklet div#clipperzBookmarletButton.hover { 158div#clipperzBookmarklet div#clipperzBookmarletButton.hover {
162 background: url(./copy_selected.png) no-repeat; 159 background: url(./copy_selected.png) no-repeat;
163} 160}
164 161
165 162
166div#clipperzBookmarklet div#clipperzBookmarletAfterCopyHint.hidden { 163div#clipperzBookmarklet div#clipperzBookmarletAfterCopyHint.hidden {
167 display: none; 164 display: none;
168} 165}
169 166
170 167
171div#clipperzBookmarklet div#clipperzBookmarletAfterCopyHint { 168div#clipperzBookmarklet div#clipperzBookmarletAfterCopyHint {
172 margin: 0; 169 margin: 0;
173 padding: 0; 170 padding: 0;
174 border: 0; 171 border: 0;
175 outline: 0; 172 outline: 0;
176 font-size: 100%; 173 font-size: 100%;
177 vertical-align: baseline; 174 vertical-align: baseline;
178 background: transparent; 175 background: transparent;
179 176
180 position: absolute; 177 position: absolute;
181 top: 78px; 178 top: 78px;
182 left: 135px; 179 left: 135px;
183 width: 171px; 180 width: 171px;
184 height: 72px; 181 height: 72px;
185 background: url(./hint.png) no-repeat; 182 background: url(./hint.png) no-repeat;
186} 183}
187 184
188div#clipperzBookmarklet div#clipperzBookmarletAfterCopyHint p { 185div#clipperzBookmarklet div#clipperzBookmarletAfterCopyHint p {
189 margin: 0; 186 margin: 0;
190 padding: 0; 187 padding: 0;
191 border: 0; 188 border: 0;
192 outline: 0; 189 outline: 0;
193 font-size: 100%; 190 font-size: 100%;
194 vertical-align: baseline; 191 vertical-align: baseline;
195 background: transparent; 192 background: transparent;
196 193
197 padding: 10px; 194 padding: 10px;
198 font-family: Helvetica, Arial, Geneva, sans-serif; 195 font-family: Helvetica, Arial, Geneva, sans-serif;
199 color: white; 196 color: white;
200 font-size: 13px; 197 font-size: 13px;
201} \ No newline at end of file 198} \ No newline at end of file
diff --git a/frontend/gamma/tests/tests/Bookmarklet/Fail.html b/frontend/gamma/tests/tests/Bookmarklet/Fail.html
index 9a95bad..d3d1ec9 100644
--- a/frontend/gamma/tests/tests/Bookmarklet/Fail.html
+++ b/frontend/gamma/tests/tests/Bookmarklet/Fail.html
@@ -1,113 +1,110 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27--> 24-->
28 25
29<html> 26<html>
30<head> 27<head>
31 <title>Bookmarlet TEST - fail</title> 28 <title>Bookmarlet TEST - fail</title>
32 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script> 29 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script>
33 <script type="text/javascript" src="../../SimpleTest/SimpleTest.js"></script> 30 <script type="text/javascript" src="../../SimpleTest/SimpleTest.js"></script>
34 <link rel="stylesheet" type="text/css" href="../../SimpleTest/test.css"> 31 <link rel="stylesheet" type="text/css" href="../../SimpleTest/test.css">
35 32
36 <!-- link rel="stylesheet" type="text/css" href="./Bookmarklet.css" --> 33 <!-- link rel="stylesheet" type="text/css" href="./Bookmarklet.css" -->
37 <script type='text/javascript' src='../../../js/Bookmarklet.js'></script> 34 <script type='text/javascript' src='../../../js/Bookmarklet.js'></script>
38 <script type='text/javascript' src='../../../../_build/_scratch/bookmarklet_test.js'></script> 35 <script type='text/javascript' src='../../../../_build/_scratch/bookmarklet_test.js'></script>
39</head> 36</head>
40<body> 37<body>
41 38
42<!-- TWITTER Login Form --> 39<!-- TWITTER Login Form -->
43<!-- form id="signin" action="https://twitter.com/sessions" method="post"> 40<!-- form id="signin" action="https://twitter.com/sessions" method="post">
44 <input id="authenticity_token" type="hidden" value="a3a9abfa089122e4b437736313e54f2a25911101" name="authenticity_token"/> 41 <input id="authenticity_token" type="hidden" value="a3a9abfa089122e4b437736313e54f2a25911101" name="authenticity_token"/>
45 <fieldset class="common-form standard-form"> 42 <fieldset class="common-form standard-form">
46 <legend>Please sign in</legend> 43 <legend>Please sign in</legend>
47 <p> 44 <p>
48 <label class="inside" for="username" tabindex="1">user name or email address:</label> 45 <label class="inside" for="username" tabindex="1">user name or email address:</label>
49 <input id="username" type="text" title="username" value="" name="session[username_or_email]"/> 46 <input id="username" type="text" title="username" value="" name="session[username_or_email]"/>
50 </p> 47 </p>
51 <p> 48 <p>
52 <label class="inside" for="password" tabindex="2">password:</label> 49 <label class="inside" for="password" tabindex="2">password:</label>
53 <input id="password" type="password" title="password" value="" name="session[password]"/> 50 <input id="password" type="password" title="password" value="" name="session[password]"/>
54 </p> 51 </p>
55 <p class="remember"></p> 52 <p class="remember"></p>
56 <p class="submit"></p> 53 <p class="submit"></p>
57 <p class="forgot"></p> 54 <p class="forgot"></p>
58 <p class="complete"></p> 55 <p class="complete"></p>
59 </fieldset> 56 </fieldset>
60</form --> 57</form -->
61 58
62<!-- ###################################################################### --> 59<!-- ###################################################################### -->
63<!-- 60<!--
64<div id="clipperzBookmarklet" style=""> 61<div id="clipperzBookmarklet" style="">
65 <div id="clipperzBookmarkletResult" style=""><p>The direct login configuration has been collected.</p></div> 62 <div id="clipperzBookmarkletResult" style=""><p>The direct login configuration has been collected.</p></div>
66 <div id="clipperzBookmarletButton" style=""></div> 63 <div id="clipperzBookmarletButton" style=""></div>
67 <div id="clipperzBookmarletAfterCopyHint" style=""><p>Now you can return to the Clipperz main interface and create a new card</p></div> 64 <div id="clipperzBookmarletAfterCopyHint" style=""><p>Now you can return to the Clipperz main interface and create a new card</p></div>
68</div> 65</div>
69--> 66-->
70<!-- 67<!--
71<div id="clipperzBookmarklet"> 68<div id="clipperzBookmarklet">
72 <div id="clipperzBookmarkletResult"><div id="clipperzBookmarkletResultIcon"></div><p id="clipperzBookmarkletResultText"></p></div> 69 <div id="clipperzBookmarkletResult"><div id="clipperzBookmarkletResultIcon"></div><p id="clipperzBookmarkletResultText"></p></div>
73 <div id="clipperzBookmarletButton"></div> 70 <div id="clipperzBookmarletButton"></div>
74 <div id="clipperzBookmarletAfterCopyHint"><p id="clipperzBookmarkletHintText"></p></div> 71 <div id="clipperzBookmarletAfterCopyHint"><p id="clipperzBookmarkletHintText"></p></div>
75</div> 72</div>
76--> 73-->
77 74
78 75
79<!-- ###################################################################### --> 76<!-- ###################################################################### -->
80 77
81<pre id="test"> 78<pre id="test">
82<script type="text/javascript"> 79<script type="text/javascript">
83try { 80try {
84 runBookmarklet(); 81 runBookmarklet();
85 // varparameters; 82 // varparameters;
86 //runBookmarklet(); 83 //runBookmarklet();
87 84
88 //parameters = getLoginFormConfiguration(); 85 //parameters = getLoginFormConfiguration();
89 86
90 // SimpleTest.ok(parameters != null, "The bookmarklet returns something useful"); 87 // SimpleTest.ok(parameters != null, "The bookmarklet returns something useful");
91 // SimpleTest.ok(bookmarkletClip != null,"The clipboard bridge has been created"); 88 // SimpleTest.ok(bookmarkletClip != null,"The clipboard bridge has been created");
92 // SimpleTest.ok(bookmarkletClip.ready,"The clipboard bridge has been created AND is ready"); 89 // SimpleTest.ok(bookmarkletClip.ready,"The clipboard bridge has been created AND is ready");
93 SimpleTest.ok(true, "no exception raised"); 90 SimpleTest.ok(true, "no exception raised");
94 91
95} catch (err) { 92} catch (err) {
96 93
97 var s = "test suite failure!\n"; 94 var s = "test suite failure!\n";
98 var o = {}; 95 var o = {};
99 var k = null; 96 var k = null;
100 for (k in err) { 97 for (k in err) {
101 // ensure unique keys?! 98 // ensure unique keys?!
102 if (!o[k]) { 99 if (!o[k]) {
103 s += k + ": " + err[k] + "\n"; 100 s += k + ": " + err[k] + "\n";
104 o[k] = err[k]; 101 o[k] = err[k];
105 } 102 }
106 } 103 }
107 ok ( false, s ); 104 ok ( false, s );
108} 105}
109 106
110</script> 107</script>
111</pre> 108</pre>
112</body> 109</body>
113</html> 110</html>
diff --git a/frontend/gamma/tests/tests/Bookmarklet/Twitter.html b/frontend/gamma/tests/tests/Bookmarklet/Twitter.html
index c9ee827..27dc6a1 100644
--- a/frontend/gamma/tests/tests/Bookmarklet/Twitter.html
+++ b/frontend/gamma/tests/tests/Bookmarklet/Twitter.html
@@ -1,113 +1,110 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27--> 24-->
28 25
29<html> 26<html>
30<head> 27<head>
31 <title>Bookmarlet TEST - ok</title> 28 <title>Bookmarlet TEST - ok</title>
32 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script> 29 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script>
33 <script type="text/javascript" src="../../SimpleTest/SimpleTest.js"></script> 30 <script type="text/javascript" src="../../SimpleTest/SimpleTest.js"></script>
34 <link rel="stylesheet" type="text/css" href="../../SimpleTest/test.css"> 31 <link rel="stylesheet" type="text/css" href="../../SimpleTest/test.css">
35 32
36 <!-- link rel="stylesheet" type="text/css" href="./Bookmarklet.css" --> 33 <!-- link rel="stylesheet" type="text/css" href="./Bookmarklet.css" -->
37 <script type='text/javascript' src='../../../js/Bookmarklet.js'></script> 34 <script type='text/javascript' src='../../../js/Bookmarklet.js'></script>
38 <script type='text/javascript' src='../../../../_build/_scratch/bookmarklet_test.js'></script> 35 <script type='text/javascript' src='../../../../_build/_scratch/bookmarklet_test.js'></script>
39</head> 36</head>
40<body> 37<body>
41 38
42<!-- TWITTER Login Form --> 39<!-- TWITTER Login Form -->
43<form id="signin" action="https://twitter.com/sessions" method="post"> 40<form id="signin" action="https://twitter.com/sessions" method="post">
44 <input id="authenticity_token" type="hidden" value="a3a9abfa089122e4b437736313e54f2a25911101" name="authenticity_token"/> 41 <input id="authenticity_token" type="hidden" value="a3a9abfa089122e4b437736313e54f2a25911101" name="authenticity_token"/>
45 <fieldset class="common-form standard-form"> 42 <fieldset class="common-form standard-form">
46 <legend>Please sign in</legend> 43 <legend>Please sign in</legend>
47 <p> 44 <p>
48 <label class="inside" for="username" tabindex="1">user name or email address:</label> 45 <label class="inside" for="username" tabindex="1">user name or email address:</label>
49 <input id="username" type="text" title="username" value="" name="session[username_or_email]"/> 46 <input id="username" type="text" title="username" value="" name="session[username_or_email]"/>
50 </p> 47 </p>
51 <p> 48 <p>
52 <label class="inside" for="password" tabindex="2">password:</label> 49 <label class="inside" for="password" tabindex="2">password:</label>
53 <input id="password" type="password" title="password" value="" name="session[password]"/> 50 <input id="password" type="password" title="password" value="" name="session[password]"/>
54 </p> 51 </p>
55 <p class="remember"></p> 52 <p class="remember"></p>
56 <p class="submit"></p> 53 <p class="submit"></p>
57 <p class="forgot"></p> 54 <p class="forgot"></p>
58 <p class="complete"></p> 55 <p class="complete"></p>
59 </fieldset> 56 </fieldset>
60</form> 57</form>
61 58
62<!-- ###################################################################### --> 59<!-- ###################################################################### -->
63<!-- 60<!--
64<div id="clipperzBookmarklet" style=""> 61<div id="clipperzBookmarklet" style="">
65 <div id="clipperzBookmarkletResult" style=""><p>The direct login configuration has been collected.</p></div> 62 <div id="clipperzBookmarkletResult" style=""><p>The direct login configuration has been collected.</p></div>
66 <div id="clipperzBookmarletButton" style=""></div> 63 <div id="clipperzBookmarletButton" style=""></div>
67 <div id="clipperzBookmarletAfterCopyHint" style=""><p>Now you can return to the Clipperz main interface and create a new card</p></div> 64 <div id="clipperzBookmarletAfterCopyHint" style=""><p>Now you can return to the Clipperz main interface and create a new card</p></div>
68</div> 65</div>
69--> 66-->
70<!-- 67<!--
71<div id="clipperzBookmarklet"> 68<div id="clipperzBookmarklet">
72 <div id="clipperzBookmarkletResult"><div id="clipperzBookmarkletResultIcon"></div><p id="clipperzBookmarkletResultText"></p></div> 69 <div id="clipperzBookmarkletResult"><div id="clipperzBookmarkletResultIcon"></div><p id="clipperzBookmarkletResultText"></p></div>
73 <div id="clipperzBookmarletButton"></div> 70 <div id="clipperzBookmarletButton"></div>
74 <div id="clipperzBookmarletAfterCopyHint"><p id="clipperzBookmarkletHintText"></p></div> 71 <div id="clipperzBookmarletAfterCopyHint"><p id="clipperzBookmarkletHintText"></p></div>
75</div> 72</div>
76--> 73-->
77 74
78 75
79<!-- ###################################################################### --> 76<!-- ###################################################################### -->
80 77
81<pre id="test"> 78<pre id="test">
82<script type="text/javascript"> 79<script type="text/javascript">
83try { 80try {
84 runBookmarklet(); 81 runBookmarklet();
85 // varparameters; 82 // varparameters;
86 //runBookmarklet(); 83 //runBookmarklet();
87 84
88 //parameters = getLoginFormConfiguration(); 85 //parameters = getLoginFormConfiguration();
89 86
90 // SimpleTest.ok(parameters != null, "The bookmarklet returns something useful"); 87 // SimpleTest.ok(parameters != null, "The bookmarklet returns something useful");
91 // SimpleTest.ok(bookmarkletClip != null,"The clipboard bridge has been created"); 88 // SimpleTest.ok(bookmarkletClip != null,"The clipboard bridge has been created");
92 // SimpleTest.ok(bookmarkletClip.ready,"The clipboard bridge has been created AND is ready"); 89 // SimpleTest.ok(bookmarkletClip.ready,"The clipboard bridge has been created AND is ready");
93 SimpleTest.ok(true, "no exception raised"); 90 SimpleTest.ok(true, "no exception raised");
94 91
95} catch (err) { 92} catch (err) {
96 93
97 var s = "test suite failure!\n"; 94 var s = "test suite failure!\n";
98 var o = {}; 95 var o = {};
99 var k = null; 96 var k = null;
100 for (k in err) { 97 for (k in err) {
101 // ensure unique keys?! 98 // ensure unique keys?!
102 if (!o[k]) { 99 if (!o[k]) {
103 s += k + ": " + err[k] + "\n"; 100 s += k + ": " + err[k] + "\n";
104 o[k] = err[k]; 101 o[k] = err[k];
105 } 102 }
106 } 103 }
107 ok ( false, s ); 104 ok ( false, s );
108} 105}
109 106
110</script> 107</script>
111</pre> 108</pre>
112</body> 109</body>
113</html> 110</html>
diff --git a/frontend/gamma/tests/tests/Bookmarklet/index.html b/frontend/gamma/tests/tests/Bookmarklet/index.html
index 729bf21..9ee3dec 100644
--- a/frontend/gamma/tests/tests/Bookmarklet/index.html
+++ b/frontend/gamma/tests/tests/Bookmarklet/index.html
@@ -1,42 +1,39 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27--> 24-->
28 25
29<html> 26<html>
30<head> 27<head>
31 <title>Complete TEST suite</title> 28 <title>Complete TEST suite</title>
32 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script> 29 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script>
33 <script type="text/javascript" src="../../SimpleTest/TestRunner.js"></script> 30 <script type="text/javascript" src="../../SimpleTest/TestRunner.js"></script>
34</head> 31</head>
35<body> 32<body>
36<script> 33<script>
37TestRunner.runTests( 34TestRunner.runTests(
38 'Twitter.html' 35 'Twitter.html'
39); 36);
40</script> 37</script>
41</body> 38</body>
42</html> \ No newline at end of file 39</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 02f4de2..6d28fdb 100644
--- a/frontend/gamma/tests/tests/Clipperz/Async.html
+++ b/frontend/gamma/tests/tests/Clipperz/Async.html
@@ -1,53 +1,50 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27--> 24-->
28 25
29<html> 26<html>
30<head> 27<head>
31 <title>Clipperz.Async - test</title> 28 <title>Clipperz.Async - test</title>
32 29
33 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script> 30 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script>
34 <script type="text/javascript" src="../../SimpleTest/SimpleTest.js"></script> 31 <script type="text/javascript" src="../../SimpleTest/SimpleTest.js"></script>
35 <link rel="stylesheet" type="text/css" href="../../SimpleTest/test.css"> 32 <link rel="stylesheet" type="text/css" href="../../SimpleTest/test.css">
36 33
37 <script type='text/javascript' src='../../../js/JSON/json2.js'></script> 34 <script type='text/javascript' src='../../../js/JSON/json2.js'></script>
38 35
39 <script type='text/javascript' src='../../../js/Clipperz/YUI/Utils.js'></script> 36 <script type='text/javascript' src='../../../js/Clipperz/YUI/Utils.js'></script>
40 <script type='text/javascript' src='../../../js/Clipperz/Base.js'></script> 37 <script type='text/javascript' src='../../../js/Clipperz/Base.js'></script>
41 <script type='text/javascript' src='../../../js/Clipperz/ByteArray.js'></script> 38 <script type='text/javascript' src='../../../js/Clipperz/ByteArray.js'></script>
42 <script type='text/javascript' src='../../../js/Clipperz/Logging.js'></script> 39 <script type='text/javascript' src='../../../js/Clipperz/Logging.js'></script>
43 <script type='text/javascript' src='../../../js/Clipperz/Async.js'></script> 40 <script type='text/javascript' src='../../../js/Clipperz/Async.js'></script>
44 <script type="text/javascript" src="../../SimpleTest/SimpleTest.Async.js"></script> 41 <script type="text/javascript" src="../../SimpleTest/SimpleTest.Async.js"></script>
45</head> 42</head>
46<body> 43<body>
47 44
48<pre id="test"> 45<pre id="test">
49<!--<script type="text/javascript" src="User.data.js"></script>//--> 46<!--<script type="text/javascript" src="User.data.js"></script>//-->
50<script type="text/javascript" src="Async.test.js"></script> 47<script type="text/javascript" src="Async.test.js"></script>
51</pre> 48</pre>
52</body> 49</body>
53</html> 50</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/Async.test.js b/frontend/gamma/tests/tests/Clipperz/Async.test.js
index fa6daca..443130e 100644
--- a/frontend/gamma/tests/tests/Clipperz/Async.test.js
+++ b/frontend/gamma/tests/tests/Clipperz/Async.test.js
@@ -1,408 +1,405 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29testObject = function (aLabel) { 26testObject = function (aLabel) {
30 this._label = aLabel; 27 this._label = aLabel;
31 this._sibling = null; 28 this._sibling = null;
32} 29}
33 30
34testObject.prototype = { 31testObject.prototype = {
35 'label': function () { 32 'label': function () {
36 return MochiKit.Async.succeed(this._label); 33 return MochiKit.Async.succeed(this._label);
37 }, 34 },
38 35
39 'shouldHit': function () { 36 'shouldHit': function () {
40 var filterRegExp; 37 var filterRegExp;
41 38
42 filterRegExp = new RegExp("hit", "i"); 39 filterRegExp = new RegExp("hit", "i");
43 40
44 return Clipperz.Async.callbacks("testObject.shouldHit", [ 41 return Clipperz.Async.callbacks("testObject.shouldHit", [
45 MochiKit.Base.method(this, 'label'), 42 MochiKit.Base.method(this, 'label'),
46 MochiKit.Base.method(filterRegExp, 'test') 43 MochiKit.Base.method(filterRegExp, 'test')
47 ]); 44 ]);
48 }, 45 },
49 46
50 'sibling': function () { 47 'sibling': function () {
51 return this._sibling; 48 return this._sibling;
52 }, 49 },
53 50
54 'setSibling': function (aSibling) { 51 'setSibling': function (aSibling) {
55 this._sibling = aSibling; 52 this._sibling = aSibling;
56 } 53 }
57 54
58} 55}
59 56
60var tests = { 57var tests = {
61 58
62 //------------------------------------------------------------------------- 59 //-------------------------------------------------------------------------
63 60
64 'succeedingForkedDeferrer_test': function (someTestArgs) { 61 'succeedingForkedDeferrer_test': function (someTestArgs) {
65 var deferredResult; 62 var deferredResult;
66 63
67 deferredResult = new Clipperz.Async.Deferred('Async.test succeedingForkedDeferred', someTestArgs); 64 deferredResult = new Clipperz.Async.Deferred('Async.test succeedingForkedDeferred', someTestArgs);
68 deferredResult.addCallback(Clipperz.Async.forkAndJoin("Async.test succeedingForkedDeferred", 65 deferredResult.addCallback(Clipperz.Async.forkAndJoin("Async.test succeedingForkedDeferred",
69 [ 66 [
70 MochiKit.Base.partial(MochiKit.Async.succeed, 3), 67 MochiKit.Base.partial(MochiKit.Async.succeed, 3),
71 MochiKit.Base.partial(MochiKit.Async.succeed, 2) 68 MochiKit.Base.partial(MochiKit.Async.succeed, 2)
72 ], someTestArgs 69 ], someTestArgs
73 )); 70 ));
74 deferredResult.addCallback(function (anAsyncResult) { 71 deferredResult.addCallback(function (anAsyncResult) {
75 var sum; 72 var sum;
76 73
77 sum = MochiKit.Iter.reduce(MochiKit.Base.operator.add, anAsyncResult); 74 sum = MochiKit.Iter.reduce(MochiKit.Base.operator.add, anAsyncResult);
78 SimpleTest.is(sum, 5, "the sum of all the returned results should be 5"); 75 SimpleTest.is(sum, 5, "the sum of all the returned results should be 5");
79 }); 76 });
80 deferredResult.addErrback(function() { 77 deferredResult.addErrback(function() {
81 SimpleTest.ok(false, "forkAndJoin should succeed and execution path should NOT go through here (1)") 78 SimpleTest.ok(false, "forkAndJoin should succeed and execution path should NOT go through here (1)")
82 }) 79 })
83 deferredResult.callback(); 80 deferredResult.callback();
84 81
85 return deferredResult; 82 return deferredResult;
86 }, 83 },
87 84
88 //------------------------------------------------------------------------- 85 //-------------------------------------------------------------------------
89 86
90 'succeedingForkedAndWaitDeferrer_test': function (someTestArgs) { 87 'succeedingForkedAndWaitDeferrer_test': function (someTestArgs) {
91 var deferredResult; 88 var deferredResult;
92 89
93 deferredResult = new Clipperz.Async.Deferred('succeedingForkedAndWaitDeferrer_test', someTestArgs); 90 deferredResult = new Clipperz.Async.Deferred('succeedingForkedAndWaitDeferrer_test', someTestArgs);
94 deferredResult.addCallback(Clipperz.Async.forkAndJoin("Async.test succeedingForkedAndWaitDeferrer", 91 deferredResult.addCallback(Clipperz.Async.forkAndJoin("Async.test succeedingForkedAndWaitDeferrer",
95 [ 92 [
96 MochiKit.Base.partial(MochiKit.Async.callLater, 2, MochiKit.Async.succeed, 3), 93 MochiKit.Base.partial(MochiKit.Async.callLater, 2, MochiKit.Async.succeed, 3),
97 MochiKit.Base.partial(MochiKit.Async.callLater, 1, MochiKit.Async.succeed, 2), 94 MochiKit.Base.partial(MochiKit.Async.callLater, 1, MochiKit.Async.succeed, 2),
98 MochiKit.Base.partial(MochiKit.Async.callLater, 3, MochiKit.Async.succeed, 7) 95 MochiKit.Base.partial(MochiKit.Async.callLater, 3, MochiKit.Async.succeed, 7)
99 ], someTestArgs 96 ], someTestArgs
100 )); 97 ));
101 deferredResult.addCallback(function (anAsyncResult) { 98 deferredResult.addCallback(function (anAsyncResult) {
102 var sum; 99 var sum;
103 100
104 sum = MochiKit.Iter.reduce(MochiKit.Base.operator.add, anAsyncResult); 101 sum = MochiKit.Iter.reduce(MochiKit.Base.operator.add, anAsyncResult);
105 SimpleTest.is(sum, 12, "the sum of all the returned results should be 12"); 102 SimpleTest.is(sum, 12, "the sum of all the returned results should be 12");
106 }); 103 });
107 deferredResult.addErrback(function() { 104 deferredResult.addErrback(function() {
108 SimpleTest.ok(false, "forkAndJoin should succeed and execution path should NOT go through here (2)") 105 SimpleTest.ok(false, "forkAndJoin should succeed and execution path should NOT go through here (2)")
109 }) 106 })
110 deferredResult.callback(); 107 deferredResult.callback();
111 108
112 return deferredResult; 109 return deferredResult;
113 }, 110 },
114 111
115 //------------------------------------------------------------------------- 112 //-------------------------------------------------------------------------
116 113
117 'failingForkedDeferrer_test': function (someTestArgs) { 114 'failingForkedDeferrer_test': function (someTestArgs) {
118 var deferredResult; 115 var deferredResult;
119 116
120 deferredResult = new Clipperz.Async.Deferred('Async.test failingForkedDeferred', someTestArgs); 117 deferredResult = new Clipperz.Async.Deferred('Async.test failingForkedDeferred', someTestArgs);
121 deferredResult.addCallback(Clipperz.Async.forkAndJoin("Async.test failingForkedDeferred", 118 deferredResult.addCallback(Clipperz.Async.forkAndJoin("Async.test failingForkedDeferred",
122 [ 119 [
123 MochiKit.Async.succeed, 120 MochiKit.Async.succeed,
124 MochiKit.Async.fail 121 MochiKit.Async.fail
125 ], someTestArgs 122 ], someTestArgs
126 )); 123 ));
127 deferredResult.addCallback(function () { 124 deferredResult.addCallback(function () {
128 SimpleTest.ok(false, "forkAndJoin should fail, and execution path should NOT go through here"); 125 SimpleTest.ok(false, "forkAndJoin should fail, and execution path should NOT go through here");
129 }); 126 });
130 deferredResult.addErrback(function() { 127 deferredResult.addErrback(function() {
131 SimpleTest.ok(true, "forkAndJoin should fail and execution path should go through here") 128 SimpleTest.ok(true, "forkAndJoin should fail and execution path should go through here")
132 }) 129 })
133 deferredResult.callback(); 130 deferredResult.callback();
134 131
135 return deferredResult; 132 return deferredResult;
136 }, 133 },
137 134
138 //------------------------------------------------------------------------- 135 //-------------------------------------------------------------------------
139 136
140 'succeedingCollectResultsDeferrer_test': function (someTestArgs) { 137 'succeedingCollectResultsDeferrer_test': function (someTestArgs) {
141 var deferredResult; 138 var deferredResult;
142 139
143 deferredResult = new Clipperz.Async.Deferred('Async.test succeedingCollectResultsDeferrer', someTestArgs); 140 deferredResult = new Clipperz.Async.Deferred('Async.test succeedingCollectResultsDeferrer', someTestArgs);
144 deferredResult.addCallback(Clipperz.Async.collectResults('Async.test succeedingCollectResultsDeferrer', { 141 deferredResult.addCallback(Clipperz.Async.collectResults('Async.test succeedingCollectResultsDeferrer', {
145 'first':MochiKit.Base.partial(MochiKit.Async.callLater, 2, MochiKit.Async.succeed, 3), 142 'first':MochiKit.Base.partial(MochiKit.Async.callLater, 2, MochiKit.Async.succeed, 3),
146 'second':MochiKit.Base.partial(MochiKit.Async.callLater, 1, MochiKit.Async.succeed, 2), 143 'second':MochiKit.Base.partial(MochiKit.Async.callLater, 1, MochiKit.Async.succeed, 2),
147 'third':MochiKit.Base.partial(MochiKit.Async.callLater, 3, MochiKit.Async.succeed, 7) 144 'third':MochiKit.Base.partial(MochiKit.Async.callLater, 3, MochiKit.Async.succeed, 7)
148 }, someTestArgs)); 145 }, someTestArgs));
149 deferredResult.addCallback(function (anAsyncResult) { 146 deferredResult.addCallback(function (anAsyncResult) {
150 var sum; 147 var sum;
151 148
152 sum = MochiKit.Iter.reduce(MochiKit.Base.operator.add, MochiKit.Base.values(anAsyncResult)); 149 sum = MochiKit.Iter.reduce(MochiKit.Base.operator.add, MochiKit.Base.values(anAsyncResult));
153 SimpleTest.is(sum, 12, "the sum of all the returned results should be 12"); 150 SimpleTest.is(sum, 12, "the sum of all the returned results should be 12");
154 SimpleTest.is(anAsyncResult['first'], 3, "the result of the 'first' item is 3"); 151 SimpleTest.is(anAsyncResult['first'], 3, "the result of the 'first' item is 3");
155 SimpleTest.is(anAsyncResult['second'], 2, "the result of the 'second' item is 2"); 152 SimpleTest.is(anAsyncResult['second'], 2, "the result of the 'second' item is 2");
156 SimpleTest.is(anAsyncResult['third'], 7, "the result of the 'third' item is 7"); 153 SimpleTest.is(anAsyncResult['third'], 7, "the result of the 'third' item is 7");
157 SimpleTest.is(MochiKit.Base.keys(anAsyncResult).length, 3, "the result has exactly 3 values"); 154 SimpleTest.is(MochiKit.Base.keys(anAsyncResult).length, 3, "the result has exactly 3 values");
158 }); 155 });
159 deferredResult.addErrback(function() { 156 deferredResult.addErrback(function() {
160 SimpleTest.ok(false, "collectResults should succeed and execution path should NOT go through here"); 157 SimpleTest.ok(false, "collectResults should succeed and execution path should NOT go through here");
161 }); 158 });
162 deferredResult.callback(); 159 deferredResult.callback();
163 160
164 return deferredResult; 161 return deferredResult;
165 }, 162 },
166 163
167 //------------------------------------------------------------------------- 164 //-------------------------------------------------------------------------
168 165
169 'collectResultsWithParameter_test': function (someTestArgs) { 166 'collectResultsWithParameter_test': function (someTestArgs) {
170 var deferredResult; 167 var deferredResult;
171 168
172 deferredResult = new Clipperz.Async.Deferred('collectResultsWithParameter_test', someTestArgs); 169 deferredResult = new Clipperz.Async.Deferred('collectResultsWithParameter_test', someTestArgs);
173 deferredResult.collectResults({ 170 deferredResult.collectResults({
174 'add_3':MochiKit.Base.partial(MochiKit.Base.operator.add, 3), 171 'add_3':MochiKit.Base.partial(MochiKit.Base.operator.add, 3),
175 'sub_8':MochiKit.Base.partial(MochiKit.Base.operator.sub, 8), 172 'sub_8':MochiKit.Base.partial(MochiKit.Base.operator.sub, 8),
176 'mul_4':MochiKit.Base.partial(MochiKit.Base.operator.mul, 4) 173 'mul_4':MochiKit.Base.partial(MochiKit.Base.operator.mul, 4)
177 }); 174 });
178 deferredResult.addCallback(function (anAsyncResult) { 175 deferredResult.addCallback(function (anAsyncResult) {
179 SimpleTest.is(anAsyncResult['add_3'], 8, "adding 3 to the passed value (5) returns 8"); 176 SimpleTest.is(anAsyncResult['add_3'], 8, "adding 3 to the passed value (5) returns 8");
180 SimpleTest.is(anAsyncResult['sub_8'], 3, "subtracting the passed value (5) to 8 returns 3"); 177 SimpleTest.is(anAsyncResult['sub_8'], 3, "subtracting the passed value (5) to 8 returns 3");
181 SimpleTest.is(anAsyncResult['mul_4'], 20, "multiplying the passed value (5) by 4 returns 20"); 178 SimpleTest.is(anAsyncResult['mul_4'], 20, "multiplying the passed value (5) by 4 returns 20");
182 SimpleTest.is(MochiKit.Base.keys(anAsyncResult).length, 3, "the result has exactly 3 values"); 179 SimpleTest.is(MochiKit.Base.keys(anAsyncResult).length, 3, "the result has exactly 3 values");
183 }); 180 });
184 deferredResult.callback(5); 181 deferredResult.callback(5);
185 182
186 return deferredResult; 183 return deferredResult;
187 }, 184 },
188 185
189 //------------------------------------------------------------------------- 186 //-------------------------------------------------------------------------
190 187
191 'succeedingCollectResultsDeferrer_alternative_syntax_test': function (someTestArgs) { 188 'succeedingCollectResultsDeferrer_alternative_syntax_test': function (someTestArgs) {
192 var deferredResult; 189 var deferredResult;
193 190
194 deferredResult = new Clipperz.Async.Deferred('succeedingCollectResultsDeferrer_alternative_syntax_test', someTestArgs); 191 deferredResult = new Clipperz.Async.Deferred('succeedingCollectResultsDeferrer_alternative_syntax_test', someTestArgs);
195 deferredResult.collectResults({ 192 deferredResult.collectResults({
196 'first':MochiKit.Base.partial(MochiKit.Async.callLater, 2, MochiKit.Async.succeed, 3), 193 'first':MochiKit.Base.partial(MochiKit.Async.callLater, 2, MochiKit.Async.succeed, 3),
197 'second':MochiKit.Base.partial(MochiKit.Async.callLater, 1, MochiKit.Async.succeed, 2), 194 'second':MochiKit.Base.partial(MochiKit.Async.callLater, 1, MochiKit.Async.succeed, 2),
198 'third':MochiKit.Base.partial(MochiKit.Async.callLater, 3, MochiKit.Async.succeed, 7) 195 'third':MochiKit.Base.partial(MochiKit.Async.callLater, 3, MochiKit.Async.succeed, 7)
199 }); 196 });
200 deferredResult.addCallback(function (anAsyncResult) { 197 deferredResult.addCallback(function (anAsyncResult) {
201 var sum; 198 var sum;
202 199
203 sum = MochiKit.Iter.reduce(MochiKit.Base.operator.add, MochiKit.Base.values(anAsyncResult)); 200 sum = MochiKit.Iter.reduce(MochiKit.Base.operator.add, MochiKit.Base.values(anAsyncResult));
204 SimpleTest.is(sum, 12, "the sum of all the returned results should be 12"); 201 SimpleTest.is(sum, 12, "the sum of all the returned results should be 12");
205 SimpleTest.is(anAsyncResult['first'], 3, "the result of the 'first' item is 3"); 202 SimpleTest.is(anAsyncResult['first'], 3, "the result of the 'first' item is 3");
206 SimpleTest.is(anAsyncResult['second'], 2, "the result of the 'second' item is 2"); 203 SimpleTest.is(anAsyncResult['second'], 2, "the result of the 'second' item is 2");
207 SimpleTest.is(anAsyncResult['third'], 7, "the result of the 'third' item is 7"); 204 SimpleTest.is(anAsyncResult['third'], 7, "the result of the 'third' item is 7");
208 SimpleTest.is(MochiKit.Base.keys(anAsyncResult).length, 3, "the result has exactly 3 values"); 205 SimpleTest.is(MochiKit.Base.keys(anAsyncResult).length, 3, "the result has exactly 3 values");
209 }); 206 });
210 deferredResult.addErrback(function() { 207 deferredResult.addErrback(function() {
211 SimpleTest.ok(false, "collectResults should succeed and execution path should NOT go through here"); 208 SimpleTest.ok(false, "collectResults should succeed and execution path should NOT go through here");
212 }); 209 });
213 deferredResult.callback(); 210 deferredResult.callback();
214 211
215 return deferredResult; 212 return deferredResult;
216 }, 213 },
217 214
218 //------------------------------------------------------------------------- 215 //-------------------------------------------------------------------------
219 216
220 'failingCollectResultsDeferrer_test': function (someTestArgs) { 217 'failingCollectResultsDeferrer_test': function (someTestArgs) {
221 var deferredResult; 218 var deferredResult;
222 219
223 deferredResult = new Clipperz.Async.Deferred('Async.test failingCollectResultsDeferrer', someTestArgs); 220 deferredResult = new Clipperz.Async.Deferred('Async.test failingCollectResultsDeferrer', someTestArgs);
224 deferredResult.addCallback(Clipperz.Async.collectResults('Async.test failingCollectResultsDeferrer', { 221 deferredResult.addCallback(Clipperz.Async.collectResults('Async.test failingCollectResultsDeferrer', {
225 'succeed':MochiKit.Base.partial(MochiKit.Async.succeed, 3), 222 'succeed':MochiKit.Base.partial(MochiKit.Async.succeed, 3),
226 'fail': MochiKit.Base.partial(MochiKit.Async.fail, 2) 223 'fail': MochiKit.Base.partial(MochiKit.Async.fail, 2)
227 }, someTestArgs)); 224 }, someTestArgs));
228 deferredResult.addCallback(function() { 225 deferredResult.addCallback(function() {
229 SimpleTest.ok(false, "collectResults should fail and execution path should NOT go through here"); 226 SimpleTest.ok(false, "collectResults should fail and execution path should NOT go through here");
230 }); 227 });
231 deferredResult.addErrback(function (anAsyncResult) { 228 deferredResult.addErrback(function (anAsyncResult) {
232 var result; 229 var result;
233 230
234 result = anAsyncResult['message']; 231 result = anAsyncResult['message'];
235 SimpleTest.is(MochiKit.Base.keys(result).length, 2, "the result has exactly 2 values"); 232 SimpleTest.is(MochiKit.Base.keys(result).length, 2, "the result has exactly 2 values");
236//console.log("anAsyncResult", anAsyncResult); 233//console.log("anAsyncResult", anAsyncResult);
237 SimpleTest.ok(!(result['succeed'] instanceof Error), "the successful value is actually successful"); 234 SimpleTest.ok(!(result['succeed'] instanceof Error), "the successful value is actually successful");
238 SimpleTest.ok(result['fail'] instanceof Error, "the failed value is actually failed"); 235 SimpleTest.ok(result['fail'] instanceof Error, "the failed value is actually failed");
239 }); 236 });
240 deferredResult.callback(); 237 deferredResult.callback();
241 238
242 return deferredResult; 239 return deferredResult;
243 }, 240 },
244 241
245 //------------------------------------------------------------------------- 242 //-------------------------------------------------------------------------
246 243
247 'collectResults_withSimpleArrayListOfCalls_test': function (someTestArgs) { 244 'collectResults_withSimpleArrayListOfCalls_test': function (someTestArgs) {
248 var deferredResult; 245 var deferredResult;
249 246
250 deferredResult = new Clipperz.Async.Deferred('collectResults_withSimpleArrayListOfCalls_test', someTestArgs); 247 deferredResult = new Clipperz.Async.Deferred('collectResults_withSimpleArrayListOfCalls_test', someTestArgs);
251 deferredResult.addCallback(Clipperz.Async.collectResults('collectResults_withSimpleArrayListOfCalls_test - collectResults', { 248 deferredResult.addCallback(Clipperz.Async.collectResults('collectResults_withSimpleArrayListOfCalls_test - collectResults', {
252 'path1': [ 249 'path1': [
253 MochiKit.Base.partial(MochiKit.Async.succeed, 3) 250 MochiKit.Base.partial(MochiKit.Async.succeed, 3)
254 ], 251 ],
255 'path2': MochiKit.Base.partial(MochiKit.Async.succeed, 2) 252 'path2': MochiKit.Base.partial(MochiKit.Async.succeed, 2)
256 }, someTestArgs)); 253 }, someTestArgs));
257 deferredResult.addCallback(function (anAsyncResult) { 254 deferredResult.addCallback(function (anAsyncResult) {
258 SimpleTest.is(anAsyncResult['path1'], 3, "the result of the first path is 3"); 255 SimpleTest.is(anAsyncResult['path1'], 3, "the result of the first path is 3");
259 SimpleTest.is(anAsyncResult['path2'], 2, "the result of the second path is 2"); 256 SimpleTest.is(anAsyncResult['path2'], 2, "the result of the second path is 2");
260 }); 257 });
261 deferredResult.callback(); 258 deferredResult.callback();
262 259
263 return deferredResult; 260 return deferredResult;
264 }, 261 },
265 262
266 //------------------------------------------------------------------------- 263 //-------------------------------------------------------------------------
267 264
268 'collectResults_withArrayListOfCalls_test': function (someTestArgs) { 265 'collectResults_withArrayListOfCalls_test': function (someTestArgs) {
269 var deferredResult; 266 var deferredResult;
270 267
271 deferredResult = new Clipperz.Async.Deferred('collectResults_withArrayListOfCalls_test', someTestArgs); 268 deferredResult = new Clipperz.Async.Deferred('collectResults_withArrayListOfCalls_test', someTestArgs);
272 deferredResult.addCallback(Clipperz.Async.collectResults('collectResults_withArrayListOfCalls_test - collectResults', { 269 deferredResult.addCallback(Clipperz.Async.collectResults('collectResults_withArrayListOfCalls_test - collectResults', {
273 'path1': [ 270 'path1': [
274 MochiKit.Base.partial(MochiKit.Async.succeed, {key1:'value1', key2:'value2'}), 271 MochiKit.Base.partial(MochiKit.Async.succeed, {key1:'value1', key2:'value2'}),
275 Clipperz.Base.serializeJSON 272 Clipperz.Base.serializeJSON
276 ], 273 ],
277 'path2': [ 274 'path2': [
278 MochiKit.Base.partial(MochiKit.Async.succeed, {key3:'value3', key4:'value4'}), 275 MochiKit.Base.partial(MochiKit.Async.succeed, {key3:'value3', key4:'value4'}),
279 Clipperz.Base.serializeJSON 276 Clipperz.Base.serializeJSON
280 ] 277 ]
281 }, someTestArgs)); 278 }, someTestArgs));
282 deferredResult.addCallback(function (anAsyncResult) { 279 deferredResult.addCallback(function (anAsyncResult) {
283 SimpleTest.is(anAsyncResult['path1'], "{\"key1\":\"value1\",\"key2\":\"value2\"}", "the result of the first path is correct"); 280 SimpleTest.is(anAsyncResult['path1'], "{\"key1\":\"value1\",\"key2\":\"value2\"}", "the result of the first path is correct");
284 SimpleTest.is(anAsyncResult['path2'], "{\"key3\":\"value3\",\"key4\":\"value4\"}", "the result of the second path is correct"); 281 SimpleTest.is(anAsyncResult['path2'], "{\"key3\":\"value3\",\"key4\":\"value4\"}", "the result of the second path is correct");
285 }); 282 });
286 deferredResult.callback(); 283 deferredResult.callback();
287 284
288 return deferredResult; 285 return deferredResult;
289 }, 286 },
290 287
291 //------------------------------------------------------------------------- 288 //-------------------------------------------------------------------------
292 289
293 'deferredSort_test': function (someTestArgs) { 290 'deferredSort_test': function (someTestArgs) {
294 var deferredResult; 291 var deferredResult;
295 vartestArray; 292 vartestArray;
296 293
297 testArray = [ 294 testArray = [
298 {key:'key2', label:function () { return MochiKit.Async.succeed('label2')} }, 295 {key:'key2', label:function () { return MochiKit.Async.succeed('label2')} },
299 {key:'key3', label:function () { return MochiKit.Async.succeed('label3')} }, 296 {key:'key3', label:function () { return MochiKit.Async.succeed('label3')} },
300 {key:'key7', label:function () { return MochiKit.Async.succeed('label7')} }, 297 {key:'key7', label:function () { return MochiKit.Async.succeed('label7')} },
301 {key:'key1', label:function () { return MochiKit.Async.succeed('label1')} }, 298 {key:'key1', label:function () { return MochiKit.Async.succeed('label1')} },
302 {key:'key5', label:function () { return MochiKit.Async.succeed('label5')} }, 299 {key:'key5', label:function () { return MochiKit.Async.succeed('label5')} },
303 {key:'key4', label:function () { return MochiKit.Async.succeed('label4')} }, 300 {key:'key4', label:function () { return MochiKit.Async.succeed('label4')} },
304 {key:'key9', label:function () { return MochiKit.Async.succeed('label9')} }, 301 {key:'key9', label:function () { return MochiKit.Async.succeed('label9')} },
305 {key:'key8', label:function () { return MochiKit.Async.succeed('label8')} }, 302 {key:'key8', label:function () { return MochiKit.Async.succeed('label8')} },
306 {key:'key6', label:function () { return MochiKit.Async.succeed('label6')} } 303 {key:'key6', label:function () { return MochiKit.Async.succeed('label6')} }
307 ] 304 ]
308 305
309 deferredResult = new Clipperz.Async.Deferred('deferredSort_test', someTestArgs); 306 deferredResult = new Clipperz.Async.Deferred('deferredSort_test', someTestArgs);
310 deferredResult.addCallback(Clipperz.Async.deferredSort, function (aObject, bObject) { 307 deferredResult.addCallback(Clipperz.Async.deferredSort, function (aObject, bObject) {
311 var result; 308 var result;
312 309
313 result = Clipperz.Async.deferredCompare(MochiKit.Base.compare, aObject.label(), bObject.label()); 310 result = Clipperz.Async.deferredCompare(MochiKit.Base.compare, aObject.label(), bObject.label());
314 311
315 return result; 312 return result;
316 }); 313 });
317 deferredResult.addCallback(function (aSortedArray) { 314 deferredResult.addCallback(function (aSortedArray) {
318 SimpleTest.is(aSortedArray.length, testArray.length, "The sorted array should have the same number of objects as the original one"); 315 SimpleTest.is(aSortedArray.length, testArray.length, "The sorted array should have the same number of objects as the original one");
319 SimpleTest.is(aSortedArray[0]['key'], 'key1', "[0] -> key1"); 316 SimpleTest.is(aSortedArray[0]['key'], 'key1', "[0] -> key1");
320 SimpleTest.is(aSortedArray[1]['key'], 'key2', "[1] -> key2"); 317 SimpleTest.is(aSortedArray[1]['key'], 'key2', "[1] -> key2");
321 SimpleTest.is(aSortedArray[2]['key'], 'key3', "[2] -> key3"); 318 SimpleTest.is(aSortedArray[2]['key'], 'key3', "[2] -> key3");
322 SimpleTest.is(aSortedArray[3]['key'], 'key4', "[3] -> key4"); 319 SimpleTest.is(aSortedArray[3]['key'], 'key4', "[3] -> key4");
323 SimpleTest.is(aSortedArray[4]['key'], 'key5', "[4] -> key5"); 320 SimpleTest.is(aSortedArray[4]['key'], 'key5', "[4] -> key5");
324 SimpleTest.is(aSortedArray[5]['key'], 'key6', "[5] -> key6"); 321 SimpleTest.is(aSortedArray[5]['key'], 'key6', "[5] -> key6");
325 SimpleTest.is(aSortedArray[6]['key'], 'key7', "[6] -> key7"); 322 SimpleTest.is(aSortedArray[6]['key'], 'key7', "[6] -> key7");
326 SimpleTest.is(aSortedArray[7]['key'], 'key8', "[7] -> key8"); 323 SimpleTest.is(aSortedArray[7]['key'], 'key8', "[7] -> key8");
327 SimpleTest.is(aSortedArray[8]['key'], 'key9', "[8] -> key9"); 324 SimpleTest.is(aSortedArray[8]['key'], 'key9', "[8] -> key9");
328 }); 325 });
329 deferredResult.callback(testArray); 326 deferredResult.callback(testArray);
330 327
331 return deferredResult; 328 return deferredResult;
332 }, 329 },
333 330
334 //------------------------------------------------------------------------- 331 //-------------------------------------------------------------------------
335 332
336 'callbacks_test': function (someTestArgs) { 333 'callbacks_test': function (someTestArgs) {
337 return Clipperz.Async.callbacks("callbacks_test", [ 334 return Clipperz.Async.callbacks("callbacks_test", [
338 MochiKit.Base.partial(MochiKit.Base.operator.add, 5), 335 MochiKit.Base.partial(MochiKit.Base.operator.add, 5),
339 Clipperz.Async.Test.is(15, "Clipperz.Async.callbacks seems to work") 336 Clipperz.Async.Test.is(15, "Clipperz.Async.callbacks seems to work")
340 ], someTestArgs, 10); 337 ], someTestArgs, 10);
341 }, 338 },
342 339
343 //------------------------------------------------------------------------- 340 //-------------------------------------------------------------------------
344 341
345 'deferredAcquireLockTest': function (someTestArgs) { 342 'deferredAcquireLockTest': function (someTestArgs) {
346 var deferredLock; 343 var deferredLock;
347 var deferredResult; 344 var deferredResult;
348 var anotherDeferred; 345 var anotherDeferred;
349 var deferredResults; 346 var deferredResults;
350 347
351 deferredLock = new MochiKit.Async.DeferredLock(); 348 deferredLock = new MochiKit.Async.DeferredLock();
352 deferredResult = new Clipperz.Async.Deferred("acquireLockTest", {trace:false}); 349 deferredResult = new Clipperz.Async.Deferred("acquireLockTest", {trace:false});
353 deferredResult.acquireLock(deferredLock); 350 deferredResult.acquireLock(deferredLock);
354 deferredResult.addCallback(function () { 351 deferredResult.addCallback(function () {
355 SimpleTest.is(true, deferredLock.locked, 'DeferredLock is locked after Clipperz.Async.Deferred.acquireLock'); 352 SimpleTest.is(true, deferredLock.locked, 'DeferredLock is locked after Clipperz.Async.Deferred.acquireLock');
356 }); 353 });
357 354
358 anotherDeferred = new Clipperz.Async.Deferred("acquireLockLockedTest", {trace:false}); 355 anotherDeferred = new Clipperz.Async.Deferred("acquireLockLockedTest", {trace:false});
359 anotherDeferred.acquireLock(deferredLock); 356 anotherDeferred.acquireLock(deferredLock);
360 anotherDeferred.addCallback(function () { 357 anotherDeferred.addCallback(function () {
361 SimpleTest.ok(false, 'Did not wait on a locked DeferredLock') 358 SimpleTest.ok(false, 'Did not wait on a locked DeferredLock')
362 }); 359 });
363 anotherDeferred.addErrback(function (anError) { 360 anotherDeferred.addErrback(function (anError) {
364 SimpleTest.ok(true, 'Did wait on a locked DeferredLock'); 361 SimpleTest.ok(true, 'Did wait on a locked DeferredLock');
365 }); 362 });
366 363
367 deferredResults = new MochiKit.Async.DeferredList([deferredResult, anotherDeferred], false, false, false); 364 deferredResults = new MochiKit.Async.DeferredList([deferredResult, anotherDeferred], false, false, false);
368 MochiKit.Async.callLater(1, function () { 365 MochiKit.Async.callLater(1, function () {
369 anotherDeferred.cancel(); 366 anotherDeferred.cancel();
370 }); 367 });
371 368
372 deferredResult.callback(); 369 deferredResult.callback();
373 anotherDeferred.callback(); 370 anotherDeferred.callback();
374 return deferredResults; 371 return deferredResults;
375 }, 372 },
376 373
377 //------------------------------------------------------------------------- 374 //-------------------------------------------------------------------------
378 375
379 'deferredLockAcquireTest': function (someTestArgs) { 376 'deferredLockAcquireTest': function (someTestArgs) {
380 var deferredLock; 377 var deferredLock;
381 var defferedResult; 378 var defferedResult;
382 var anotherDeferred; 379 var anotherDeferred;
383 var deferredResults; 380 var deferredResults;
384 381
385 deferredLock = new MochiKit.Async.DeferredLock(); 382 deferredLock = new MochiKit.Async.DeferredLock();
386 deferredResult = new Clipperz.Async.Deferred("acquireLockTest", {trace:false}); 383 deferredResult = new Clipperz.Async.Deferred("acquireLockTest", {trace:false});
387 deferredResult.addMethod(deferredLock, 'acquire'); 384 deferredResult.addMethod(deferredLock, 'acquire');
388 deferredResult.addCallback(function () { 385 deferredResult.addCallback(function () {
389 SimpleTest.is(true, deferredLock.locked, 'DeferredLock is locked after Clipperz.Async.Deferred.acquireLock'); 386 SimpleTest.is(true, deferredLock.locked, 'DeferredLock is locked after Clipperz.Async.Deferred.acquireLock');
390 }); 387 });
391 388
392 anotherDeferred = new Clipperz.Async.Deferred("acquireLockLockedTest", {trace:false}); 389 anotherDeferred = new Clipperz.Async.Deferred("acquireLockLockedTest", {trace:false});
393 anotherDeferred.addMethod(deferredLock, 'acquire'); 390 anotherDeferred.addMethod(deferredLock, 'acquire');
394 anotherDeferred.addCallback(function () { 391 anotherDeferred.addCallback(function () {
395 SimpleTest.ok(false, 'Did not wait on a locked DeferredLock') 392 SimpleTest.ok(false, 'Did not wait on a locked DeferredLock')
396 }); 393 });
397 anotherDeferred.addErrback(function (anError) { 394 anotherDeferred.addErrback(function (anError) {
398 SimpleTest.ok(true, 'Did wait on a locked DeferredLock'); 395 SimpleTest.ok(true, 'Did wait on a locked DeferredLock');
399 }); 396 });
400 397
401 398
402 deferredResults = new MochiKit.Async.DeferredList([deferredResult, anotherDeferred], false, false, false); 399 deferredResults = new MochiKit.Async.DeferredList([deferredResult, anotherDeferred], false, false, false);
403 MochiKit.Async.callLater(1, function () { 400 MochiKit.Async.callLater(1, function () {
404 anotherDeferred.cancel(); 401 anotherDeferred.cancel();
405 }); 402 });
406 403
407 deferredResult.callback(); 404 deferredResult.callback();
408 anotherDeferred.callback() 405 anotherDeferred.callback()
diff --git a/frontend/gamma/tests/tests/Clipperz/Base.html b/frontend/gamma/tests/tests/Clipperz/Base.html
index 6b29417..a1b1df8 100644
--- a/frontend/gamma/tests/tests/Clipperz/Base.html
+++ b/frontend/gamma/tests/tests/Clipperz/Base.html
@@ -1,55 +1,52 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27--> 24-->
28 25
29<html> 26<html>
30<head> 27<head>
31 <title>Clipperz.Base - TEST</title> 28 <title>Clipperz.Base - TEST</title>
32 29
33 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script> 30 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script>
34 <script type="text/javascript" src="../../SimpleTest/SimpleTest.js"></script> 31 <script type="text/javascript" src="../../SimpleTest/SimpleTest.js"></script>
35 <link rel="stylesheet" type="text/css" href="../../SimpleTest/test.css"> 32 <link rel="stylesheet" type="text/css" href="../../SimpleTest/test.css">
36 33
37 <script type='text/javascript' src='../../../js/JSON/json2.js'></script> 34 <script type='text/javascript' src='../../../js/JSON/json2.js'></script>
38 35
39 <script type='text/javascript' src='../../../js/Clipperz/YUI/Utils.js'></script> 36 <script type='text/javascript' src='../../../js/Clipperz/YUI/Utils.js'></script>
40 <script type='text/javascript' src='../../../js/Clipperz/Base.js'></script> 37 <script type='text/javascript' src='../../../js/Clipperz/Base.js'></script>
41 <script type='text/javascript' src='../../../js/Clipperz/ByteArray.js'></script> 38 <script type='text/javascript' src='../../../js/Clipperz/ByteArray.js'></script>
42 <script type='text/javascript' src='../../../js/Clipperz/Logging.js'></script> 39 <script type='text/javascript' src='../../../js/Clipperz/Logging.js'></script>
43 <script type='text/javascript' src='../../../js/Clipperz/Async.js'></script> 40 <script type='text/javascript' src='../../../js/Clipperz/Async.js'></script>
44 <script type='text/javascript' src='../../../js/Clipperz/KeyValueObjectStore.js'></script> 41 <script type='text/javascript' src='../../../js/Clipperz/KeyValueObjectStore.js'></script>
45 42
46 43
47 <script type="text/javascript" src="../../SimpleTest/SimpleTest.Async.js"></script> 44 <script type="text/javascript" src="../../SimpleTest/SimpleTest.Async.js"></script>
48 45
49</head> 46</head>
50<body> 47<body>
51<pre id="test"> 48<pre id="test">
52<script type="text/javascript" src="Base.test.js"></script> 49<script type="text/javascript" src="Base.test.js"></script>
53</pre> 50</pre>
54</body> 51</body>
55</html> 52</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/Base.test.js b/frontend/gamma/tests/tests/Clipperz/Base.test.js
index e5c7caf..fc827f7 100644
--- a/frontend/gamma/tests/tests/Clipperz/Base.test.js
+++ b/frontend/gamma/tests/tests/Clipperz/Base.test.js
@@ -1,367 +1,364 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29 26
30//============================================================================= 27//=============================================================================
31 28
32testEvalJSON = function(aString, shouldFail, aDescription) { 29testEvalJSON = function(aString, shouldFail, aDescription) {
33 var result; 30 var result;
34 31
35 if (shouldFail == true) { 32 if (shouldFail == true) {
36 try { 33 try {
37 result = Clipperz.Base.evalJSON(aString); 34 result = Clipperz.Base.evalJSON(aString);
38 is(true, false, aDescription + ": vulnerability not caught"); 35 is(true, false, aDescription + ": vulnerability not caught");
39//console.log(result); 36//console.log(result);
40 } catch(exception) { 37 } catch(exception) {
41 is(true, true, aDescription + ": vulnerability correctly caught"); 38 is(true, true, aDescription + ": vulnerability correctly caught");
42 } 39 }
43 } else { 40 } else {
44 try { 41 try {
45 result = Clipperz.Base.evalJSON(aString); 42 result = Clipperz.Base.evalJSON(aString);
46 is(true, true, aDescription + ": configuration correctly checked"); 43 is(true, true, aDescription + ": configuration correctly checked");
47 } catch(exception) { 44 } catch(exception) {
48 is(true, false, aDescription + ": configuration wrongly caught as malicious"); 45 is(true, false, aDescription + ": configuration wrongly caught as malicious");
49 // console.log(exception); 46 // console.log(exception);
50 } 47 }
51 } 48 }
52 49
53 return result; 50 return result;
54} 51}
55 52
56//============================================================================= 53//=============================================================================
57 54
58var tests = { 55var tests = {
59 56
60 '001_test': function () { 57 '001_test': function () {
61 var stringToSplit; 58 var stringToSplit;
62 varsplittedString; 59 varsplittedString;
63 60
64 stringToSplit = "stringToSplit"; 61 stringToSplit = "stringToSplit";
65 splittedString = Clipperz.Base.splitStringAtFixedTokenSize(stringToSplit, 2); 62 splittedString = Clipperz.Base.splitStringAtFixedTokenSize(stringToSplit, 2);
66 is(splittedString.length, 7); 63 is(splittedString.length, 7);
67 is(splittedString[0], 'st'); 64 is(splittedString[0], 'st');
68 is(splittedString[1], 'ri'); 65 is(splittedString[1], 'ri');
69 is(splittedString[2], 'ng'); 66 is(splittedString[2], 'ng');
70 is(splittedString[3], 'To'); 67 is(splittedString[3], 'To');
71 is(splittedString[4], 'Sp'); 68 is(splittedString[4], 'Sp');
72 is(splittedString[5], 'li'); 69 is(splittedString[5], 'li');
73 is(splittedString[6], 't', "test that should pass"); 70 is(splittedString[6], 't', "test that should pass");
74 71
75 stringToSplit = "stringToSplit"; 72 stringToSplit = "stringToSplit";
76 splittedString = Clipperz.Base.splitStringAtFixedTokenSize(stringToSplit, 20); 73 splittedString = Clipperz.Base.splitStringAtFixedTokenSize(stringToSplit, 20);
77 is(splittedString.length, 1); 74 is(splittedString.length, 1);
78 is(splittedString[0], 'stringToSplit'); 75 is(splittedString[0], 'stringToSplit');
79 76
80 stringToSplit = null; 77 stringToSplit = null;
81 splittedString = Clipperz.Base.splitStringAtFixedTokenSize(stringToSplit, 20); 78 splittedString = Clipperz.Base.splitStringAtFixedTokenSize(stringToSplit, 20);
82 is(splittedString.length, 0); 79 is(splittedString.length, 0);
83 }, 80 },
84 81
85 //------------------------------------------------------------------------- 82 //-------------------------------------------------------------------------
86 83
87 '002_test': function () { 84 '002_test': function () {
88 var anObject; 85 var anObject;
89 86
90 anObject = "String"; 87 anObject = "String";
91 is(Clipperz.Base.objectType(anObject), 'string', "test on strings (1)"); 88 is(Clipperz.Base.objectType(anObject), 'string', "test on strings (1)");
92 anObject = new String("String"); 89 anObject = new String("String");
93 is(Clipperz.Base.objectType(anObject), 'string', "test on strings (2)"); 90 is(Clipperz.Base.objectType(anObject), 'string', "test on strings (2)");
94 91
95 anObject = 120; 92 anObject = 120;
96 is(Clipperz.Base.objectType(anObject), 'number', "test on numbers (1)"); 93 is(Clipperz.Base.objectType(anObject), 'number', "test on numbers (1)");
97 anObject = new Number(120); 94 anObject = new Number(120);
98 is(Clipperz.Base.objectType(anObject), 'number', "test on numbers (2)"); 95 is(Clipperz.Base.objectType(anObject), 'number', "test on numbers (2)");
99 96
100 anObject = true; 97 anObject = true;
101 is(Clipperz.Base.objectType(anObject), 'boolean', "test on booleans (1)"); 98 is(Clipperz.Base.objectType(anObject), 'boolean', "test on booleans (1)");
102 anObject = new Boolean(true); 99 anObject = new Boolean(true);
103 is(Clipperz.Base.objectType(anObject), 'boolean', "test on booleans (2)"); 100 is(Clipperz.Base.objectType(anObject), 'boolean', "test on booleans (2)");
104 101
105 anObject = new Date; 102 anObject = new Date;
106 is(Clipperz.Base.objectType(anObject), 'date', "test on dates"); 103 is(Clipperz.Base.objectType(anObject), 'date', "test on dates");
107 104
108 anObject = new Error("test"); 105 anObject = new Error("test");
109 is(Clipperz.Base.objectType(anObject), 'error', "test on errors"); 106 is(Clipperz.Base.objectType(anObject), 'error', "test on errors");
110 107
111 anObject = function() {}; 108 anObject = function() {};
112 is(Clipperz.Base.objectType(anObject), 'function', "test on functions"); 109 is(Clipperz.Base.objectType(anObject), 'function', "test on functions");
113 110
114 anObject = new Object(); 111 anObject = new Object();
115 is(Clipperz.Base.objectType(anObject), 'object', "test on objects"); 112 is(Clipperz.Base.objectType(anObject), 'object', "test on objects");
116 113
117 114
118 anObject = [1, 2, 3]; 115 anObject = [1, 2, 3];
119 is(Clipperz.Base.objectType(anObject), 'array', "test on arrays"); 116 is(Clipperz.Base.objectType(anObject), 'array', "test on arrays");
120 }, 117 },
121 118
122 //------------------------------------------------------------------------- 119 //-------------------------------------------------------------------------
123 120
124 '003_test': function () { 121 '003_test': function () {
125 var original, clone; 122 var original, clone;
126 123
127 original = { 124 original = {
128 a: "a", 125 a: "a",
129 b: "b" 126 b: "b"
130 }; 127 };
131 128
132 clone = Clipperz.Base.deepClone(original); 129 clone = Clipperz.Base.deepClone(original);
133 is(MochiKit.Base.compare(original, clone), 0, "simple cloning return two equal objects"); 130 is(MochiKit.Base.compare(original, clone), 0, "simple cloning return two equal objects");
134 131
135 clone.c = "c"; 132 clone.c = "c";
136 is(MochiKit.Base.compare(original, clone), -1, "changing an object leave the original object unchanged"); 133 is(MochiKit.Base.compare(original, clone), -1, "changing an object leave the original object unchanged");
137 134
138 original = { 135 original = {
139 a: "a", 136 a: "a",
140 b: "b", 137 b: "b",
141 nested: { 138 nested: {
142 a1: "a1", 139 a1: "a1",
143 b1: "b1" 140 b1: "b1"
144 } 141 }
145 }; 142 };
146 143
147 clone = Clipperz.Base.deepClone(original); 144 clone = Clipperz.Base.deepClone(original);
148 is(MochiKit.Base.compare(original, clone), 0, "cloning of an object with nested values return two equal objects"); 145 is(MochiKit.Base.compare(original, clone), 0, "cloning of an object with nested values return two equal objects");
149 146
150 clone.nested.c1 = "c1"; 147 clone.nested.c1 = "c1";
151 is(MochiKit.Base.compare(original, clone), -1, "changing a nested value leave the original object unchanged"); 148 is(MochiKit.Base.compare(original, clone), -1, "changing a nested value leave the original object unchanged");
152 }, 149 },
153 150
154 //------------------------------------------------------------------------- 151 //-------------------------------------------------------------------------
155 152
156 '004_test': function () { 153 '004_test': function () {
157 var jsonString; 154 var jsonString;
158 155
159 jsonString = '{"page": {"title": "Example Attack"},"form": { "attributes": { "action": "javascript:opener.document.body.innerHTML = \'hacked!\';close();", "style": "-moz-binding:url(\'http://ha.ckers.org/xssmoz.xml#xss\')", "method": null }, "inputs": [{"type": "text", "name": "username", "value": ""}, {"type": "password", "name": "password", "value": ""}]},"version": "0.2.3" }'; 156 jsonString = '{"page": {"title": "Example Attack"},"form": { "attributes": { "action": "javascript:opener.document.body.innerHTML = \'hacked!\';close();", "style": "-moz-binding:url(\'http://ha.ckers.org/xssmoz.xml#xss\')", "method": null }, "inputs": [{"type": "text", "name": "username", "value": ""}, {"type": "password", "name": "password", "value": ""}]},"version": "0.2.3" }';
160 testEvalJSON(jsonString, false, ""); 157 testEvalJSON(jsonString, false, "");
161 158
162 //jsonString = '{"0":{"label":"<script>alert(\"Ciao Marco\")< /script>","key":"ebc9782019bf9aa757e9c4d716ab303e2050b60c4b9a06b18ab09a417e0ddf00"}, "1":{"label":"<iframe><script>alert(\\"Ciao ragazzi\\")< /script></iframe>", "key":"413cfb122a1601c50e0f9462978ba77a36fdcecb49dda7550ee129dc114ba328"}}'; 159 //jsonString = '{"0":{"label":"<script>alert(\"Ciao Marco\")< /script>","key":"ebc9782019bf9aa757e9c4d716ab303e2050b60c4b9a06b18ab09a417e0ddf00"}, "1":{"label":"<iframe><script>alert(\\"Ciao ragazzi\\")< /script></iframe>", "key":"413cfb122a1601c50e0f9462978ba77a36fdcecb49dda7550ee129dc114ba328"}}';
163 jsonString = new Clipperz.ByteArray().appendBase64String("eyIwIjp7ImxhYmVsIjoiPHNjcmlwdD5hbGVydChcIkNpYW8gTWFyY29cIik8L3NjcmlwdD4iLCAia2V5IjoiZWJjOTc4MjAxOWJmOWFhNzU3ZTljNGQ3MTZhYjMwM2UyMDUwYjYwYzRiOWEwNmIxOGFiMDlhNDE3ZTBkZGYwMCJ9LCAiMSI6eyJsYWJlbCI6IjxpZnJhbWU+PHNjcmlwdD5hbGVydChcIkNpYW8gcmFnYXp6aVwiKTwvc2NyaXB0PjwvaWZyYW1lPiIsICJrZXkiOiI0MTNjZmIxMjJhMTYwMWM1MGUwZjk0NjI5NzhiYTc3YTM2ZmRjZWNiNDlkZGE3NTUwZWUxMjlkYzExNGJhMzI4In19").asString(); 160 jsonString = new Clipperz.ByteArray().appendBase64String("eyIwIjp7ImxhYmVsIjoiPHNjcmlwdD5hbGVydChcIkNpYW8gTWFyY29cIik8L3NjcmlwdD4iLCAia2V5IjoiZWJjOTc4MjAxOWJmOWFhNzU3ZTljNGQ3MTZhYjMwM2UyMDUwYjYwYzRiOWEwNmIxOGFiMDlhNDE3ZTBkZGYwMCJ9LCAiMSI6eyJsYWJlbCI6IjxpZnJhbWU+PHNjcmlwdD5hbGVydChcIkNpYW8gcmFnYXp6aVwiKTwvc2NyaXB0PjwvaWZyYW1lPiIsICJrZXkiOiI0MTNjZmIxMjJhMTYwMWM1MGUwZjk0NjI5NzhiYTc3YTM2ZmRjZWNiNDlkZGE3NTUwZWUxMjlkYzExNGJhMzI4In19").asString();
164 testEvalJSON(jsonString, false); 161 testEvalJSON(jsonString, false);
165 162
166 jsonString = 'alert("foobar");'; 163 jsonString = 'alert("foobar");';
167 testEvalJSON(jsonString, true); 164 testEvalJSON(jsonString, true);
168 165
169 //jsonString = '<script>alert("foobar");< /script>'; 166 //jsonString = '<script>alert("foobar");< /script>';
170 jsonString = new Clipperz.ByteArray().appendBase64String("PHNjcmlwdD5hbGVydCgiZm9vYmFyIik7PC9zY3JpcHQ+").asString(); 167 jsonString = new Clipperz.ByteArray().appendBase64String("PHNjcmlwdD5hbGVydCgiZm9vYmFyIik7PC9zY3JpcHQ+").asString();
171 testEvalJSON(jsonString, true); 168 testEvalJSON(jsonString, true);
172 169
173 jsonString = '{"xss": alert("XSS!")}'; 170 jsonString = '{"xss": alert("XSS!")}';
174 testEvalJSON(jsonString, true); 171 testEvalJSON(jsonString, true);
175 172
176 jsonString = '{"inner": {"xss": alert("XSS!")}}'; 173 jsonString = '{"inner": {"xss": alert("XSS!")}}';
177 testEvalJSON(jsonString, true); 174 testEvalJSON(jsonString, true);
178 }, 175 },
179 176
180 //------------------------------------------------------------------------- 177 //-------------------------------------------------------------------------
181 178
182 'Clipperz.Base.itemgetter_test': function () { 179 'Clipperz.Base.itemgetter_test': function () {
183 varanObject; 180 varanObject;
184 181
185 anObject = { 182 anObject = {
186 key1: 'value1', 183 key1: 'value1',
187 key2: { 184 key2: {
188 key2_1: 'value2_1', 185 key2_1: 'value2_1',
189 key2_2: 'value2_2' 186 key2_2: 'value2_2'
190 }, 187 },
191 key3: { 188 key3: {
192 key3_1: { 189 key3_1: {
193 key3_1_1: 'value3_1_1', 190 key3_1_1: 'value3_1_1',
194 key3_1_2: 'value3_1_2' 191 key3_1_2: 'value3_1_2'
195 }, 192 },
196 key3_2: { 193 key3_2: {
197 key3_2_1: 'value3_2_1', 194 key3_2_1: 'value3_2_1',
198 key3_2_2: 'value3_2_2' 195 key3_2_2: 'value3_2_2'
199 } 196 }
200 } 197 }
201 }; 198 };
202 199
203 SimpleTest.is(Clipperz.Base.itemgetter('key1')(anObject), "value1", "Clipperz.Base.itemgetter works as MochiKit.Base.itemgetter"); 200 SimpleTest.is(Clipperz.Base.itemgetter('key1')(anObject), "value1", "Clipperz.Base.itemgetter works as MochiKit.Base.itemgetter");
204 SimpleTest.is(Clipperz.Base.itemgetter('key2.key2_1')(anObject), "value2_1", "Clipperz.Base.itemgetter works also with keypaths"); 201 SimpleTest.is(Clipperz.Base.itemgetter('key2.key2_1')(anObject), "value2_1", "Clipperz.Base.itemgetter works also with keypaths");
205 SimpleTest.is(Clipperz.Base.itemgetter('key3.key3_2.key3_2_2')(anObject), "value3_2_2", "Clipperz.Base.itemgetter works also with 'long' keypaths"); 202 SimpleTest.is(Clipperz.Base.itemgetter('key3.key3_2.key3_2_2')(anObject), "value3_2_2", "Clipperz.Base.itemgetter works also with 'long' keypaths");
206 }, 203 },
207 204
208 //------------------------------------------------------------------------- 205 //-------------------------------------------------------------------------
209 206
210 'Clipperz.Base.caseInsensitiveCompare_test': function () { 207 'Clipperz.Base.caseInsensitiveCompare_test': function () {
211 varcomparator; 208 varcomparator;
212 var objects; 209 var objects;
213 210
214 comparator = Clipperz.Base.caseInsensitiveCompare; 211 comparator = Clipperz.Base.caseInsensitiveCompare;
215 objects = [ 'ccc', 'aaa', 'bbb', 'eee', 'ddd']; 212 objects = [ 'ccc', 'aaa', 'bbb', 'eee', 'ddd'];
216 SimpleTest.isDeeply(['aaa', 'bbb', 'ccc', 'ddd', 'eee'], objects.sort(comparator), "caseInsensitiveCompare works with all lowercase values"); 213 SimpleTest.isDeeply(['aaa', 'bbb', 'ccc', 'ddd', 'eee'], objects.sort(comparator), "caseInsensitiveCompare works with all lowercase values");
217 214
218 comparator = MochiKit.Base.compare; 215 comparator = MochiKit.Base.compare;
219 objects = [ 'ccc', 'AAA', 'bbb', 'EEE', 'ddd']; 216 objects = [ 'ccc', 'AAA', 'bbb', 'EEE', 'ddd'];
220 SimpleTest.isDeeply(['AAA', 'EEE', 'bbb', 'ccc', 'ddd'], objects.sort(comparator), "caseInsensitiveCompare works with all lowercase values"); 217 SimpleTest.isDeeply(['AAA', 'EEE', 'bbb', 'ccc', 'ddd'], objects.sort(comparator), "caseInsensitiveCompare works with all lowercase values");
221 218
222 comparator = Clipperz.Base.caseInsensitiveCompare; 219 comparator = Clipperz.Base.caseInsensitiveCompare;
223 objects = [ 'ccc', 'AAA', 'bbb', 'EEE', 'ddd']; 220 objects = [ 'ccc', 'AAA', 'bbb', 'EEE', 'ddd'];
224 SimpleTest.isDeeply(['AAA', 'bbb', 'ccc', 'ddd', 'EEE'], objects.sort(comparator), "caseInsensitiveCompare works with all lowercase values"); 221 SimpleTest.isDeeply(['AAA', 'bbb', 'ccc', 'ddd', 'EEE'], objects.sort(comparator), "caseInsensitiveCompare works with all lowercase values");
225 }, 222 },
226 223
227 //------------------------------------------------------------------------- 224 //-------------------------------------------------------------------------
228 225
229 'Clipperz.Base.reverseComparator_test': function () { 226 'Clipperz.Base.reverseComparator_test': function () {
230 varcomparator; 227 varcomparator;
231 var objects; 228 var objects;
232 229
233 comparator = MochiKit.Base.compare; 230 comparator = MochiKit.Base.compare;
234 objects = [5, 3, 2, 4, 1]; 231 objects = [5, 3, 2, 4, 1];
235 SimpleTest.isDeeply([1, 2, 3, 4, 5], objects.sort(comparator), "a regular comparator works fine"); 232 SimpleTest.isDeeply([1, 2, 3, 4, 5], objects.sort(comparator), "a regular comparator works fine");
236 233
237 comparator = Clipperz.Base.reverseComparator(MochiKit.Base.compare); 234 comparator = Clipperz.Base.reverseComparator(MochiKit.Base.compare);
238 objects = [5, 3, 2, 4, 1]; 235 objects = [5, 3, 2, 4, 1];
239 SimpleTest.isDeeply([5, 4, 3, 2 ,1], objects.sort(comparator), "a reversed comparator works fine"); 236 SimpleTest.isDeeply([5, 4, 3, 2 ,1], objects.sort(comparator), "a reversed comparator works fine");
240 237
241 comparator = MochiKit.Base.keyComparator('label'); 238 comparator = MochiKit.Base.keyComparator('label');
242 objects = [ {label:"5"}, {label:"3"}, {label:"1"}, {label:"4"}, {label:"2"}]; 239 objects = [ {label:"5"}, {label:"3"}, {label:"1"}, {label:"4"}, {label:"2"}];
243 SimpleTest.isDeeply([ {label:"1"}, {label:"2"}, {label:"3"}, {label:"4"}, {label:"5"}], objects.sort(comparator), "a regular keyComparator works fine"); 240 SimpleTest.isDeeply([ {label:"1"}, {label:"2"}, {label:"3"}, {label:"4"}, {label:"5"}], objects.sort(comparator), "a regular keyComparator works fine");
244 241
245 comparator = Clipperz.Base.reverseComparator(MochiKit.Base.keyComparator('label')); 242 comparator = Clipperz.Base.reverseComparator(MochiKit.Base.keyComparator('label'));
246 objects = [ {label:"5"}, {label:"3"}, {label:"1"}, {label:"4"}, {label:"2"}]; 243 objects = [ {label:"5"}, {label:"3"}, {label:"1"}, {label:"4"}, {label:"2"}];
247 SimpleTest.isDeeply([ {label:"5"}, {label:"4"}, {label:"3"}, {label:"2"}, {label:"1"}], objects.sort(comparator), "a reversed keyComparator works fine"); 244 SimpleTest.isDeeply([ {label:"5"}, {label:"4"}, {label:"3"}, {label:"2"}, {label:"1"}], objects.sort(comparator), "a reversed keyComparator works fine");
248 }, 245 },
249 246
250 //------------------------------------------------------------------------- 247 //-------------------------------------------------------------------------
251 248
252 'Clipperz.Base.map_test': function () { 249 'Clipperz.Base.map_test': function () {
253 var objects; 250 var objects;
254 varcomputedObjecs; 251 varcomputedObjecs;
255 252
256 objects = [5, 3, 2, 4, 1]; 253 objects = [5, 3, 2, 4, 1];
257 computedObjecs = Clipperz.Base.map(function (aValue) { return aValue * 2;}, objects); 254 computedObjecs = Clipperz.Base.map(function (aValue) { return aValue * 2;}, objects);
258 SimpleTest.isDeeply(computedObjecs, [10, 6, 4, 8, 2], "the mapped values of the array do match"); 255 SimpleTest.isDeeply(computedObjecs, [10, 6, 4, 8, 2], "the mapped values of the array do match");
259 256
260 objects = { 257 objects = {
261 'five': 5, 258 'five': 5,
262 'three':3, 259 'three':3,
263 'two': 2, 260 'two': 2,
264 'four': 4, 261 'four': 4,
265 'one': 1 262 'one': 1
266 }; 263 };
267 computedObjecs = Clipperz.Base.map(function (aValue) { return aValue * 2;}, objects); 264 computedObjecs = Clipperz.Base.map(function (aValue) { return aValue * 2;}, objects);
268 SimpleTest.isDeeply(computedObjecs, { 265 SimpleTest.isDeeply(computedObjecs, {
269 'five': 10, 266 'five': 10,
270 'three':6, 267 'three':6,
271 'two': 4, 268 'two': 4,
272 'four': 8, 269 'four': 8,
273 'one': 2 270 'one': 2
274 }, "the mapped values of the object do match"); 271 }, "the mapped values of the object do match");
275 }, 272 },
276 273
277 //------------------------------------------------------------------------- 274 //-------------------------------------------------------------------------
278 275
279 'Clipperz.Base.isUrl_test': function () { 276 'Clipperz.Base.isUrl_test': function () {
280 varurlTestCases; 277 varurlTestCases;
281 278
282 urlTestCases = [ 279 urlTestCases = [
283 {url:'http://foo.com/blah_blah', expectedResult:true}, 280 {url:'http://foo.com/blah_blah', expectedResult:true},
284 {url:'http://foo.com/blah_blah', expectedResult:true}, 281 {url:'http://foo.com/blah_blah', expectedResult:true},
285 {url:'http://foo.com/blah_blah/', expectedResult:true}, 282 {url:'http://foo.com/blah_blah/', expectedResult:true},
286 {url:'http://foo.com/blah_blah_(wikipedia)', expectedResult:true}, 283 {url:'http://foo.com/blah_blah_(wikipedia)', expectedResult:true},
287 {url:'http://foo.com/blah_blah.', expectedResult:true}, 284 {url:'http://foo.com/blah_blah.', expectedResult:true},
288 {url:'http://foo.com/blah_blah/.', expectedResult:true}, 285 {url:'http://foo.com/blah_blah/.', expectedResult:true},
289 {url:'http://foo.com/blah_blah,', expectedResult:true}, 286 {url:'http://foo.com/blah_blah,', expectedResult:true},
290 {url:'http://✪df.ws/123', expectedResult:true}, 287 {url:'http://✪df.ws/123', expectedResult:true},
291 {url:'http://➡.ws/䨹', expectedResult:true}, 288 {url:'http://➡.ws/䨹', expectedResult:true},
292 {url:'www.➡.ws/䨹', expectedResult:true}, 289 {url:'www.➡.ws/䨹', expectedResult:true},
293 {url:'http://www.example.com/wpstyle/?p=364.', expectedResult:true}, 290 {url:'http://www.example.com/wpstyle/?p=364.', expectedResult:true},
294 {url:'www.clipperz.com', expectedResult:true}, 291 {url:'www.clipperz.com', expectedResult:true},
295 {url:'http://www.clipperz.com', expectedResult:true}, 292 {url:'http://www.clipperz.com', expectedResult:true},
296 {url:'http://clipperz.com', expectedResult:true}, 293 {url:'http://clipperz.com', expectedResult:true},
297 294
298 {url:'clipperz.com', expectedResult:false}, 295 {url:'clipperz.com', expectedResult:false},
299 // {url:'www.clipperz', expectedResult:false}, 296 // {url:'www.clipperz', expectedResult:false},
300 // {url:'www.abc', expectedResult:false}, 297 // {url:'www.abc', expectedResult:false},
301 {url:'joe@clipperz.com', expectedResult:false}, 298 {url:'joe@clipperz.com', expectedResult:false},
302 {url:'<http://foo.com/blah_blah>', expectedResult:false}, 299 {url:'<http://foo.com/blah_blah>', expectedResult:false},
303 {url:'<http://foo.com/blah_blah/>', expectedResult:false}, 300 {url:'<http://foo.com/blah_blah/>', expectedResult:false},
304 {} 301 {}
305 ]; 302 ];
306 303
307 MochiKit.Base.map(function (someValues) { 304 MochiKit.Base.map(function (someValues) {
308 if (typeof(someValues['url']) != 'undefined') { 305 if (typeof(someValues['url']) != 'undefined') {
309 SimpleTest.is(Clipperz.Base.isUrl(someValues['url']), someValues['expectedResult'], "testing url '" + someValues['url'] + "' - expected result: " + someValues['expectedResult']); 306 SimpleTest.is(Clipperz.Base.isUrl(someValues['url']), someValues['expectedResult'], "testing url '" + someValues['url'] + "' - expected result: " + someValues['expectedResult']);
310 } 307 }
311 }, urlTestCases); 308 }, urlTestCases);
312 309
313/* 310/*
314 //RegExp and test strings courtesy of John Gruber: http://daringfireball.net/2009/11/liberal_regex_for_matching_urls 311 //RegExp and test strings courtesy of John Gruber: http://daringfireball.net/2009/11/liberal_regex_for_matching_urls
315 SimpleTest.is(Clipperz.Base.isUrl('http://foo.com/blah_blah'), true,"url test +1"); 312 SimpleTest.is(Clipperz.Base.isUrl('http://foo.com/blah_blah'), true,"url test +1");
316 SimpleTest.is(Clipperz.Base.isUrl('http://foo.com/blah_blah/'), true,"url test +2"); 313 SimpleTest.is(Clipperz.Base.isUrl('http://foo.com/blah_blah/'), true,"url test +2");
317 SimpleTest.is(Clipperz.Base.isUrl('http://foo.com/blah_blah_(wikipedia)'), true,"url test +3"); 314 SimpleTest.is(Clipperz.Base.isUrl('http://foo.com/blah_blah_(wikipedia)'), true,"url test +3");
318 SimpleTest.is(Clipperz.Base.isUrl('http://foo.com/blah_blah.'), true,"url test +4"); 315 SimpleTest.is(Clipperz.Base.isUrl('http://foo.com/blah_blah.'), true,"url test +4");
319 SimpleTest.is(Clipperz.Base.isUrl('http://foo.com/blah_blah/.'), true,"url test +5"); 316 SimpleTest.is(Clipperz.Base.isUrl('http://foo.com/blah_blah/.'), true,"url test +5");
320 SimpleTest.is(Clipperz.Base.isUrl('<http://foo.com/blah_blah>'), true,"url test +6"); 317 SimpleTest.is(Clipperz.Base.isUrl('<http://foo.com/blah_blah>'), true,"url test +6");
321 SimpleTest.is(Clipperz.Base.isUrl('<http://foo.com/blah_blah/>'), true,"url test +7"); 318 SimpleTest.is(Clipperz.Base.isUrl('<http://foo.com/blah_blah/>'), true,"url test +7");
322 SimpleTest.is(Clipperz.Base.isUrl('http://foo.com/blah_blah,'), true,"url test +8"); 319 SimpleTest.is(Clipperz.Base.isUrl('http://foo.com/blah_blah,'), true,"url test +8");
323 SimpleTest.is(Clipperz.Base.isUrl('http://✪df.ws/123'), true,"url test +9"); 320 SimpleTest.is(Clipperz.Base.isUrl('http://✪df.ws/123'), true,"url test +9");
324 SimpleTest.is(Clipperz.Base.isUrl('http://➡.ws/䨹'), true,"url test +10"); 321 SimpleTest.is(Clipperz.Base.isUrl('http://➡.ws/䨹'), true,"url test +10");
325 SimpleTest.is(Clipperz.Base.isUrl('www.➡.ws/䨹'), true,"url test +11"); 322 SimpleTest.is(Clipperz.Base.isUrl('www.➡.ws/䨹'), true,"url test +11");
326 SimpleTest.is(Clipperz.Base.isUrl('http://www.example.com/wpstyle/?p=364.'),true,"url test +12"); 323 SimpleTest.is(Clipperz.Base.isUrl('http://www.example.com/wpstyle/?p=364.'),true,"url test +12");
327 SimpleTest.is(Clipperz.Base.isUrl('www.clipperz.com'), true,"url test +13"); 324 SimpleTest.is(Clipperz.Base.isUrl('www.clipperz.com'), true,"url test +13");
328 SimpleTest.is(Clipperz.Base.isUrl('http://www.clipperz.com'), true,"url test +14"); 325 SimpleTest.is(Clipperz.Base.isUrl('http://www.clipperz.com'), true,"url test +14");
329 326
330 // SimpleTest.is(Clipperz.Base.isUrl('http://userid@example.com'), true, "url test +13");// FAIL 327 // SimpleTest.is(Clipperz.Base.isUrl('http://userid@example.com'), true, "url test +13");// FAIL
331 // SimpleTest.is(Clipperz.Base.isUrl('http://userid@example.com:8080'), true, "url test +14");// FAIL 328 // SimpleTest.is(Clipperz.Base.isUrl('http://userid@example.com:8080'), true, "url test +14");// FAIL
332 // SimpleTest.is(Clipperz.Base.isUrl('http://userid:password@example.com'), true, "url test +15");// FAIL 329 // SimpleTest.is(Clipperz.Base.isUrl('http://userid:password@example.com'), true, "url test +15");// FAIL
333 // SimpleTest.is(Clipperz.Base.isUrl('http://userid:password@example.com:8080'), true, "url test +16");// FAIL 330 // SimpleTest.is(Clipperz.Base.isUrl('http://userid:password@example.com:8080'), true, "url test +16");// FAIL
334 331
335 332
336 SimpleTest.is(Clipperz.Base.isUrl('joe@clipperz.com'), false,"url test -1"); 333 SimpleTest.is(Clipperz.Base.isUrl('joe@clipperz.com'), false,"url test -1");
337 SimpleTest.is(Clipperz.Base.isUrl('rdar://1234'), false,"url test -2"); 334 SimpleTest.is(Clipperz.Base.isUrl('rdar://1234'), false,"url test -2");
338 SimpleTest.is(Clipperz.Base.isUrl('rdar:/1234'), false,"url test -3"); 335 SimpleTest.is(Clipperz.Base.isUrl('rdar:/1234'), false,"url test -3");
339 SimpleTest.is(Clipperz.Base.isUrl('http://example.com:8080 x-yojimbo-item://6303E4C1-xxxx-45A6-AB9D-3A908F59AE0E'), false,"url test -4"); 336 SimpleTest.is(Clipperz.Base.isUrl('http://example.com:8080 x-yojimbo-item://6303E4C1-xxxx-45A6-AB9D-3A908F59AE0E'), false,"url test -4");
340 SimpleTest.is(Clipperz.Base.isUrl('message://%3c330e7f8409726r6a4ba78dkf1fd71420c1bf6ff@mail.gmail.com%3e'), false,"url test -5"); 337 SimpleTest.is(Clipperz.Base.isUrl('message://%3c330e7f8409726r6a4ba78dkf1fd71420c1bf6ff@mail.gmail.com%3e'), false,"url test -5");
341*/ 338*/
342 }, 339 },
343 340
344 //------------------------------------------------------------------------- 341 //-------------------------------------------------------------------------
345 342
346 'Clipperz.Base.isEmail_test': function () { 343 'Clipperz.Base.isEmail_test': function () {
347 varemailTestCases; 344 varemailTestCases;
348 345
349 emailTestCases = [ 346 emailTestCases = [
350 {email:'joe@clipperz.com', expectedResult:true}, 347 {email:'joe@clipperz.com', expectedResult:true},
351 348
352 {email:'http://foo.com/blah_blah', expectedResult:false} 349 {email:'http://foo.com/blah_blah', expectedResult:false}
353 ]; 350 ];
354 351
355 MochiKit.Base.map(function (someValues) { 352 MochiKit.Base.map(function (someValues) {
356 SimpleTest.is(Clipperz.Base.isEmail(someValues['email']), someValues['expectedResult'], "testing email '" + someValues['email'] + "' - expected result: " + someValues['expectedResult']); 353 SimpleTest.is(Clipperz.Base.isEmail(someValues['email']), someValues['expectedResult'], "testing email '" + someValues['email'] + "' - expected result: " + someValues['expectedResult']);
357 }, emailTestCases); 354 }, emailTestCases);
358 }, 355 },
359 356
360 //------------------------------------------------------------------------- 357 //-------------------------------------------------------------------------
361 358
362 'syntaxFix': MochiKit.Base.noop 359 'syntaxFix': MochiKit.Base.noop
363} 360}
364 361
365//============================================================================= 362//=============================================================================
366 363
367SimpleTest.runDeferredTests("Clipperz.Base", tests, {trace:false}); 364SimpleTest.runDeferredTests("Clipperz.Base", tests, {trace:false});
diff --git a/frontend/gamma/tests/tests/Clipperz/ByteArray.html b/frontend/gamma/tests/tests/Clipperz/ByteArray.html
index c8b8ae7..6dc7116 100644
--- a/frontend/gamma/tests/tests/Clipperz/ByteArray.html
+++ b/frontend/gamma/tests/tests/Clipperz/ByteArray.html
@@ -1,71 +1,68 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27--> 24-->
28 25
29<html> 26<html>
30<head> 27<head>
31 <title>Clipperz.ByteArray - tests</title> 28 <title>Clipperz.ByteArray - tests</title>
32 29
33 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> 30 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
34 31
35 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script> 32 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script>
36 <script type="text/javascript" src="../../SimpleTest/SimpleTest.js"></script> 33 <script type="text/javascript" src="../../SimpleTest/SimpleTest.js"></script>
37 <link rel="stylesheet" type="text/css" href="../../SimpleTest/test.css"> 34 <link rel="stylesheet" type="text/css" href="../../SimpleTest/test.css">
38 35
39 <script type='text/javascript' src='../../../js/JSON/json2.js'></script> 36 <script type='text/javascript' src='../../../js/JSON/json2.js'></script>
40 37
41 <script type='text/javascript' src='../../../js/Clipperz/YUI/Utils.js'></script> 38 <script type='text/javascript' src='../../../js/Clipperz/YUI/Utils.js'></script>
42 <script type='text/javascript' src='../../../js/Clipperz/YUI/DomHelper.js'></script> 39 <script type='text/javascript' src='../../../js/Clipperz/YUI/DomHelper.js'></script>
43 <script type='text/javascript' src='../../../js/Clipperz/Base.js'></script> 40 <script type='text/javascript' src='../../../js/Clipperz/Base.js'></script>
44 <script type='text/javascript' src='../../../js/Clipperz/ByteArray.js'></script> 41 <script type='text/javascript' src='../../../js/Clipperz/ByteArray.js'></script>
45 <script type='text/javascript' src='../../../js/Clipperz/Async.js'></script> 42 <script type='text/javascript' src='../../../js/Clipperz/Async.js'></script>
46 <script type='text/javascript' src='../../../js/Clipperz/Logging.js'></script> 43 <script type='text/javascript' src='../../../js/Clipperz/Logging.js'></script>
47 <script type='text/javascript' src='../../../js/Clipperz/Crypto/Base.js'></script> 44 <script type='text/javascript' src='../../../js/Clipperz/Crypto/Base.js'></script>
48 <script type='text/javascript' src='../../../js/Clipperz/Crypto/BigInt.js'></script> 45 <script type='text/javascript' src='../../../js/Clipperz/Crypto/BigInt.js'></script>
49 <script type='text/javascript' src='../../../js/Clipperz/Crypto/AES.js'></script> 46 <script type='text/javascript' src='../../../js/Clipperz/Crypto/AES.js'></script>
50 <script type='text/javascript' src='../../../js/Clipperz/Crypto/SHA.js'></script> 47 <script type='text/javascript' src='../../../js/Clipperz/Crypto/SHA.js'></script>
51 <script type='text/javascript' src='../../../js/Clipperz/Crypto/PRNG.js'></script> 48 <script type='text/javascript' src='../../../js/Clipperz/Crypto/PRNG.js'></script>
52 <!-- script type='text/javascript' src='../../../js/Clipperz/Crypto/BigInt.js'></script --> 49 <!-- script type='text/javascript' src='../../../js/Clipperz/Crypto/BigInt.js'></script -->
53 50
54 <script type="text/javascript" src="../../SimpleTest/SimpleTest.Async.js"></script> 51 <script type="text/javascript" src="../../SimpleTest/SimpleTest.Async.js"></script>
55 52
56</head> 53</head>
57<body> 54<body>
58 55
59<pre id="test"> 56<pre id="test">
60<script> 57<script>
61 Clipperz_IEisBroken = false; 58 Clipperz_IEisBroken = false;
62</script> 59</script>
63 <script type="text/javascript"> 60 <script type="text/javascript">
64 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 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.";
65 var longIsoLatin1Text = "¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùù"; 62 var longIsoLatin1Text = "¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùù";
66 var longUtf8Text = "客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之"; 63 var longUtf8Text = "客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之";
67 </script> 64 </script>
68 <script type="text/javascript" src="ByteArray.test.js"></script> 65 <script type="text/javascript" src="ByteArray.test.js"></script>
69</pre> 66</pre>
70</body> 67</body>
71</html> 68</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/ByteArray.test.js b/frontend/gamma/tests/tests/Clipperz/ByteArray.test.js
index ef2660e..43d74a0 100644
--- a/frontend/gamma/tests/tests/Clipperz/ByteArray.test.js
+++ b/frontend/gamma/tests/tests/Clipperz/ByteArray.test.js
@@ -1,408 +1,405 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); 26Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
30 27
31var tests = { 28var tests = {
32 29
33 //------------------------------------------------------------------------- 30 //-------------------------------------------------------------------------
34 31
35 'core_tests': function (someTestArgs) { 32 'core_tests': function (someTestArgs) {
36 // vardeferredResult; 33 // vardeferredResult;
37 34
38 // deferredResult = new Clipperz.Async.Deferred("core_tests", someTestArgs); 35 // deferredResult = new Clipperz.Async.Deferred("core_tests", someTestArgs);
39 // deferredResult.addCallback(function() { 36 // deferredResult.addCallback(function() {
40 var byteArray; 37 var byteArray;
41 38
42 byteArray = new Clipperz.ByteArray(); 39 byteArray = new Clipperz.ByteArray();
43 40
44 try { 41 try {
45 byteArray.checkByteValue(512); 42 byteArray.checkByteValue(512);
46 is(false, true, "a value greater that a byte (0x200) should have raised an exception - NO Exception"); 43 is(false, true, "a value greater that a byte (0x200) should have raised an exception - NO Exception");
47 } catch(e) { 44 } catch(e) {
48 // is(e.name, 45 // is(e.name,
49 // "Clipperz.ByteArray.exception.InvalidValue", 46 // "Clipperz.ByteArray.exception.InvalidValue",
50 // "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")
51 ok(/Clipperz\.ByteArray\.exception\.InvalidValue.*/.test(e.name), 48 ok(/Clipperz\.ByteArray\.exception\.InvalidValue.*/.test(e.name),
52 "appending a value greater that a byte (0x200) should have raised an exception - EXCEPTION HANDLER") 49 "appending a value greater that a byte (0x200) should have raised an exception - EXCEPTION HANDLER")
53 }; 50 };
54 51
55 // }); 52 // });
56 // deferredResult.callback(); 53 // deferredResult.callback();
57 54
58 // return deferredResult; 55 // return deferredResult;
59 56
60 }, 57 },
61 58
62 //------------------------------------------------------------------------- 59 //-------------------------------------------------------------------------
63 60
64 'basic_tests': function (someTestArgs) { 61 'basic_tests': function (someTestArgs) {
65 vardeferredResult; 62 vardeferredResult;
66 63
67 deferredResult = new Clipperz.Async.Deferred("simple_tests", someTestArgs); 64 deferredResult = new Clipperz.Async.Deferred("simple_tests", someTestArgs);
68 deferredResult.addCallback(function() { 65 deferredResult.addCallback(function() {
69 var byteArray; 66 var byteArray;
70 var byteArray2; 67 var byteArray2;
71 varbyteArrayIterator; 68 varbyteArrayIterator;
72 varnextBlock; 69 varnextBlock;
73 70
74 byteArray = new Clipperz.ByteArray(); 71 byteArray = new Clipperz.ByteArray();
75 is(byteArray.length(), 0, "before adding any element the length is 0"); 72 is(byteArray.length(), 0, "before adding any element the length is 0");
76 byteArray.appendByte(10); 73 byteArray.appendByte(10);
77 is(byteArray.length(), 1, "adding a single byte the length == 1"); 74 is(byteArray.length(), 1, "adding a single byte the length == 1");
78 is(byteArray.byteAtIndex(0), 10, "the first element is correct"); 75 is(byteArray.byteAtIndex(0), 10, "the first element is correct");
79 76
80 byteArrayIterator = new Clipperz.ByteArrayIterator({byteArray:byteArray, blockSize:(8/8), finalPadding:true}); 77 byteArrayIterator = new Clipperz.ByteArrayIterator({byteArray:byteArray, blockSize:(8/8), finalPadding:true});
81 nextBlock = byteArrayIterator.nextBlock(); 78 nextBlock = byteArrayIterator.nextBlock();
82 is(nextBlock.constructor, Array, "ByteArrayIterator.nextBlock returns an array of byte values"); 79 is(nextBlock.constructor, Array, "ByteArrayIterator.nextBlock returns an array of byte values");
83 is(nextBlock.length, 1, "as the block size is 8bit, the returned array has only one element"); 80 is(nextBlock.length, 1, "as the block size is 8bit, the returned array has only one element");
84 is(nextBlock[0], 10, "the element of the returned block is correct"); 81 is(nextBlock[0], 10, "the element of the returned block is correct");
85 nextBlock = byteArrayIterator.nextBlock(); 82 nextBlock = byteArrayIterator.nextBlock();
86 is(nextBlock, null, "after the last element, the nextBlock returns null"); 83 is(nextBlock, null, "after the last element, the nextBlock returns null");
87 84
88 byteArray = new Clipperz.ByteArray(); 85 byteArray = new Clipperz.ByteArray();
89 byteArray.appendBytes(10, 20, 45, 38); 86 byteArray.appendBytes(10, 20, 45, 38);
90 is(byteArray.length(), 4, "Appending more bytes, returns the right length"); 87 is(byteArray.length(), 4, "Appending more bytes, returns the right length");
91 is(byteArray.byteAtIndex(0), 10, "and all the elements are right [0]"); 88 is(byteArray.byteAtIndex(0), 10, "and all the elements are right [0]");
92 is(byteArray.byteAtIndex(1), 20, "and all the elements are right [1]"); 89 is(byteArray.byteAtIndex(1), 20, "and all the elements are right [1]");
93 is(byteArray.byteAtIndex(2), 45, "and all the elements are right [2]"); 90 is(byteArray.byteAtIndex(2), 45, "and all the elements are right [2]");
94 is(byteArray.byteAtIndex(3), 38, "and all the elements are right [3]"); 91 is(byteArray.byteAtIndex(3), 38, "and all the elements are right [3]");
95 92
96 byteArray2 = new Clipperz.ByteArray(); 93 byteArray2 = new Clipperz.ByteArray();
97 byteArray2.appendBytes([10, 20, 45, 38]); 94 byteArray2.appendBytes([10, 20, 45, 38]);
98 is(byteArray.equals(byteArray2), true, "equals method tested with a byteArray created with the same values"); 95 is(byteArray.equals(byteArray2), true, "equals method tested with a byteArray created with the same values");
99 96
100 byteArray2 = new Clipperz.ByteArray(); 97 byteArray2 = new Clipperz.ByteArray();
101 byteArray2.appendBytes([20, 11, 3, 22]); 98 byteArray2.appendBytes([20, 11, 3, 22]);
102 is(byteArray.equals(byteArray2), false, "equals method tested with a byteArray created with different values"); 99 is(byteArray.equals(byteArray2), false, "equals method tested with a byteArray created with different values");
103 100
104 byteArrayIterator = new Clipperz.ByteArrayIterator({byteArray:byteArray, blockSize:(8/8), finalPadding:true}); 101 byteArrayIterator = new Clipperz.ByteArrayIterator({byteArray:byteArray, blockSize:(8/8), finalPadding:true});
105 nextBlock = byteArrayIterator.nextBlock(); 102 nextBlock = byteArrayIterator.nextBlock();
106 is(nextBlock.length, 1, "the size of the block returned by the byteArrayIterator match with the configured blockedSize"); 103 is(nextBlock.length, 1, "the size of the block returned by the byteArrayIterator match with the configured blockedSize");
107 is(nextBlock[0], 10, "the values returned by nextBlock are right [1]"); 104 is(nextBlock[0], 10, "the values returned by nextBlock are right [1]");
108 nextBlock = byteArrayIterator.nextBlock(); 105 nextBlock = byteArrayIterator.nextBlock();
109 is(nextBlock[0], 20, "the values returned by nextBlock are right [2]"); 106 is(nextBlock[0], 20, "the values returned by nextBlock are right [2]");
110 nextBlock = byteArrayIterator.nextBlock(); 107 nextBlock = byteArrayIterator.nextBlock();
111 is(nextBlock[0], 45, "the values returned by nextBlock are right [3]"); 108 is(nextBlock[0], 45, "the values returned by nextBlock are right [3]");
112 nextBlock = byteArrayIterator.nextBlock(); 109 nextBlock = byteArrayIterator.nextBlock();
113 is(nextBlock[0], 38, "the values returned by nextBlock are right [4]"); 110 is(nextBlock[0], 38, "the values returned by nextBlock are right [4]");
114 nextBlock = byteArrayIterator.nextBlock(); 111 nextBlock = byteArrayIterator.nextBlock();
115 is(nextBlock, null, "after the last block the nextBlock method returns null"); 112 is(nextBlock, null, "after the last block the nextBlock method returns null");
116 113
117 byteArrayIterator = new Clipperz.ByteArrayIterator({byteArray:byteArray, blockSize:(16/8), finalPadding:true}); 114 byteArrayIterator = new Clipperz.ByteArrayIterator({byteArray:byteArray, blockSize:(16/8), finalPadding:true});
118 nextBlock = byteArrayIterator.nextBlock(); 115 nextBlock = byteArrayIterator.nextBlock();
119 is(nextBlock.length, 2, "on the same data, using a different block size, returns the right length"); 116 is(nextBlock.length, 2, "on the same data, using a different block size, returns the right length");
120 is(nextBlock[0], 10, "and also the data are fine [1][0]"); 117 is(nextBlock[0], 10, "and also the data are fine [1][0]");
121 is(nextBlock[1], 20, "and also the data are fine [1][1]"); 118 is(nextBlock[1], 20, "and also the data are fine [1][1]");
122 nextBlock = byteArrayIterator.nextBlock(); 119 nextBlock = byteArrayIterator.nextBlock();
123 is(nextBlock.length, 2, "also the second block size is right"); 120 is(nextBlock.length, 2, "also the second block size is right");
124 is(nextBlock[0], 45, "and also the data are fine [2][0]"); 121 is(nextBlock[0], 45, "and also the data are fine [2][0]");
125 is(nextBlock[1], 38, "and also the data are fine [2][1]"); 122 is(nextBlock[1], 38, "and also the data are fine [2][1]");
126 nextBlock = byteArrayIterator.nextBlock(); 123 nextBlock = byteArrayIterator.nextBlock();
127 is(nextBlock, null, "even with a bigger blockSize, at the end the returned value is null"); 124 is(nextBlock, null, "even with a bigger blockSize, at the end the returned value is null");
128 125
129 byteArray = new Clipperz.ByteArray(11,22,33,44,55,66,77,88,99); 126 byteArray = new Clipperz.ByteArray(11,22,33,44,55,66,77,88,99);
130 is(byteArray.length(), 9, ""); 127 is(byteArray.length(), 9, "");
131 byteArrayIterator = new Clipperz.ByteArrayIterator({byteArray:byteArray, blockSize:(16/8), finalPadding:true}); 128 byteArrayIterator = new Clipperz.ByteArrayIterator({byteArray:byteArray, blockSize:(16/8), finalPadding:true});
132 nextBlock = byteArrayIterator.nextBlock(); 129 nextBlock = byteArrayIterator.nextBlock();
133 nextBlock = byteArrayIterator.nextBlock(); 130 nextBlock = byteArrayIterator.nextBlock();
134 nextBlock = byteArrayIterator.nextBlock(); 131 nextBlock = byteArrayIterator.nextBlock();
135 nextBlock = byteArrayIterator.nextBlock(); 132 nextBlock = byteArrayIterator.nextBlock();
136 nextBlock = byteArrayIterator.nextBlock(); 133 nextBlock = byteArrayIterator.nextBlock();
137 is(nextBlock.length, 2, "the last block of an odd byte array has always the same size"); 134 is(nextBlock.length, 2, "the last block of an odd byte array has always the same size");
138 is(nextBlock[0], 99, "the last element is returned"); 135 is(nextBlock[0], 99, "the last element is returned");
139 is(nextBlock[1], 0, "and a 0 is return for the extra values"); 136 is(nextBlock[1], 0, "and a 0 is return for the extra values");
140 nextBlock = byteArrayIterator.nextBlock(); 137 nextBlock = byteArrayIterator.nextBlock();
141 is(nextBlock, null, "even with odd blockSize, after returning all the values, null is returned"); 138 is(nextBlock, null, "even with odd blockSize, after returning all the values, null is returned");
142 139
143 byteArrayIterator = new Clipperz.ByteArrayIterator({byteArray:byteArray, blockSize:(32/8), finalPadding:true}); 140 byteArrayIterator = new Clipperz.ByteArrayIterator({byteArray:byteArray, blockSize:(32/8), finalPadding:true});
144 nextBlock = byteArrayIterator.nextBlock(); 141 nextBlock = byteArrayIterator.nextBlock();
145 is(nextBlock[0], 11, "32 bit blockSize [1][0]"); 142 is(nextBlock[0], 11, "32 bit blockSize [1][0]");
146 is(nextBlock[1], 22, "32 bit blockSize [1][1]"); 143 is(nextBlock[1], 22, "32 bit blockSize [1][1]");
147 is(nextBlock[2], 33, "32 bit blockSize [1][2]"); 144 is(nextBlock[2], 33, "32 bit blockSize [1][2]");
148 is(nextBlock[3], 44, "32 bit blockSize [1][3]"); 145 is(nextBlock[3], 44, "32 bit blockSize [1][3]");
149 nextBlock = byteArrayIterator.nextBlock(); 146 nextBlock = byteArrayIterator.nextBlock();
150 is(nextBlock[0], 55, "32 bit blockSize [2][0]"); 147 is(nextBlock[0], 55, "32 bit blockSize [2][0]");
151 is(nextBlock[1], 66, "32 bit blockSize [2][1]"); 148 is(nextBlock[1], 66, "32 bit blockSize [2][1]");
152 is(nextBlock[2], 77, "32 bit blockSize [2][2]"); 149 is(nextBlock[2], 77, "32 bit blockSize [2][2]");
153 is(nextBlock[3], 88, "32 bit blockSize [2][3]"); 150 is(nextBlock[3], 88, "32 bit blockSize [2][3]");
154 nextBlock = byteArrayIterator.nextBlock(); 151 nextBlock = byteArrayIterator.nextBlock();
155 is(nextBlock.length, 4, "the last block of an odd byte array has always the same size"); 152 is(nextBlock.length, 4, "the last block of an odd byte array has always the same size");
156 is(nextBlock[0], 99, "the last element is returned (2)"); 153 is(nextBlock[0], 99, "the last element is returned (2)");
157 is(nextBlock[1], 0, "and a 0 is return for the extra values (2.1)"); 154 is(nextBlock[1], 0, "and a 0 is return for the extra values (2.1)");
158 is(nextBlock[2], 0, "and a 0 is return for the extra values (2.2)"); 155 is(nextBlock[2], 0, "and a 0 is return for the extra values (2.2)");
159 is(nextBlock[3], 0, "and a 0 is return for the extra values (2.3)"); 156 is(nextBlock[3], 0, "and a 0 is return for the extra values (2.3)");
160 nextBlock = byteArrayIterator.nextBlock(); 157 nextBlock = byteArrayIterator.nextBlock();
161 is(nextBlock, null, "even with odd blockSize, after returning all the values, null is returned (2)"); 158 is(nextBlock, null, "even with odd blockSize, after returning all the values, null is returned (2)");
162 159
163 byteArray = new Clipperz.ByteArray([11,22,33,44,55,66,77,88,99,100, 111, 122, 133, 144, 155, 166, 177]); 160 byteArray = new Clipperz.ByteArray([11,22,33,44,55,66,77,88,99,100, 111, 122, 133, 144, 155, 166, 177]);
164 byteArrayIterator = new Clipperz.ByteArrayIterator({byteArray:byteArray, blockSize:(128/8), finalPadding:true}); 161 byteArrayIterator = new Clipperz.ByteArrayIterator({byteArray:byteArray, blockSize:(128/8), finalPadding:true});
165 nextBlock = byteArrayIterator.nextBlock(); 162 nextBlock = byteArrayIterator.nextBlock();
166 is(nextBlock.length, 16, "using a blockSize of 128 bit, the nextBlock return a 16 elements array"); 163 is(nextBlock.length, 16, "using a blockSize of 128 bit, the nextBlock return a 16 elements array");
167 164
168 byteArray = new Clipperz.ByteArray(); 165 byteArray = new Clipperz.ByteArray();
169 try { 166 try {
170 byteArray.appendByte(512); 167 byteArray.appendByte(512);
171 is(false, true, "appending a value greater that a byte (0x200) should have raised an exception - NO Exception"); 168 is(false, true, "appending a value greater that a byte (0x200) should have raised an exception - NO Exception");
172 } catch(e) { 169 } catch(e) {
173 // is(e.name, 170 // is(e.name,
174 // "Clipperz.ByteArray.exception.InvalidValue", 171 // "Clipperz.ByteArray.exception.InvalidValue",
175 // "appending a value greater that a byte (0x200) should have raised an exception - EXCEPTION HANDLER") 172 // "appending a value greater that a byte (0x200) should have raised an exception - EXCEPTION HANDLER")
176 ok(/Clipperz\.ByteArray\.exception\.InvalidValue.*/.test(e.name), 173 ok(/Clipperz\.ByteArray\.exception\.InvalidValue.*/.test(e.name),
177 "appending a value greater that a byte (0x200) should have raised an exception - EXCEPTION HANDLER") 174 "appending a value greater that a byte (0x200) should have raised an exception - EXCEPTION HANDLER")
178 }; 175 };
179 176
180 try { 177 try {
181 byteArray.appendByte(256); 178 byteArray.appendByte(256);
182 is(false, true, "appending a value greater that a byte (0x100) should have raised an exception - NO Exception"); 179 is(false, true, "appending a value greater that a byte (0x100) should have raised an exception - NO Exception");
183 } catch(e) { 180 } catch(e) {
184 // is(e.name, 181 // is(e.name,
185 // "Clipperz.ByteArray.exception.InvalidValue", 182 // "Clipperz.ByteArray.exception.InvalidValue",
186 // "appending a value greater that a byte (0x100) should have raised an exception - EXCEPTION HANDLER") 183 // "appending a value greater that a byte (0x100) should have raised an exception - EXCEPTION HANDLER")
187 ok(/Clipperz\.ByteArray\.exception\.InvalidValue.*/.test(e.name), 184 ok(/Clipperz\.ByteArray\.exception\.InvalidValue.*/.test(e.name),
188 "appending a value greater that a byte (0x100) should have raised an exception - EXCEPTION HANDLER") 185 "appending a value greater that a byte (0x100) should have raised an exception - EXCEPTION HANDLER")
189 }; 186 };
190 187
191 byteArray.appendByte(255); 188 byteArray.appendByte(255);
192 is(byteArray.length(), 1, "appending a value that feets a single byte does not raise any exception"); 189 is(byteArray.length(), 1, "appending a value that feets a single byte does not raise any exception");
193 190
194 byteArray = new Clipperz.ByteArray(10, 20, 30, 40, 50); 191 byteArray = new Clipperz.ByteArray(10, 20, 30, 40, 50);
195 byteArray2 = new Clipperz.ByteArray("0x0a141e2832"); 192 byteArray2 = new Clipperz.ByteArray("0x0a141e2832");
196 is(byteArray.equals(byteArray2), true, "the hex constructor works fine"); 193 is(byteArray.equals(byteArray2), true, "the hex constructor works fine");
197 194
198 byteArray2 = byteArray.clone(); 195 byteArray2 = byteArray.clone();
199 is(byteArray.equals(byteArray2), true, "the clone method works fine"); 196 is(byteArray.equals(byteArray2), true, "the clone method works fine");
200 }); 197 });
201 deferredResult.callback(); 198 deferredResult.callback();
202 199
203 return deferredResult; 200 return deferredResult;
204 }, 201 },
205 202
206 //------------------------------------------------------------------------- 203 //-------------------------------------------------------------------------
207 204
208 'compare_tests': function (someTestArgs) { 205 'compare_tests': function (someTestArgs) {
209 vardeferredResult; 206 vardeferredResult;
210 207
211 deferredResult = new Clipperz.Async.Deferred("compare_tests", someTestArgs); 208 deferredResult = new Clipperz.Async.Deferred("compare_tests", someTestArgs);
212 deferredResult.addCallback(function() { 209 deferredResult.addCallback(function() {
213 var byteArray1; 210 var byteArray1;
214 var byteArray2; 211 var byteArray2;
215 var result; 212 var result;
216 213
217 byteArray1 = new Clipperz.ByteArray("0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16); 214 byteArray1 = new Clipperz.ByteArray("0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16);
218 byteArray2 = new Clipperz.ByteArray("0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16); 215 byteArray2 = new Clipperz.ByteArray("0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16);
219 result = byteArray1.compare(byteArray2); 216 result = byteArray1.compare(byteArray2);
220 is(result, 0, "equal compare"); 217 is(result, 0, "equal compare");
221 218
222 byteArray1 = new Clipperz.ByteArray("0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16); 219 byteArray1 = new Clipperz.ByteArray("0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16);
223 byteArray2 = new Clipperz.ByteArray("0x05", 16); 220 byteArray2 = new Clipperz.ByteArray("0x05", 16);
224 result = byteArray1.compare(byteArray2); 221 result = byteArray1.compare(byteArray2);
225 is(result, 1, "'OxXXXXXXX'.compare('0x05')"); 222 is(result, 1, "'OxXXXXXXX'.compare('0x05')");
226 result = byteArray2.compare(byteArray1); 223 result = byteArray2.compare(byteArray1);
227 is(result, -1, "'0x05'.compare('OxXXXXXXX')"); 224 is(result, -1, "'0x05'.compare('OxXXXXXXX')");
228 225
229 byteArray1 = new Clipperz.ByteArray("0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16); 226 byteArray1 = new Clipperz.ByteArray("0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16);
230 byteArray2 = new Clipperz.ByteArray("0xff", 16); 227 byteArray2 = new Clipperz.ByteArray("0xff", 16);
231 result = byteArray1.compare(byteArray2); 228 result = byteArray1.compare(byteArray2);
232 is(result, 1, "'OxXXXXXXX'.compare('0xff')"); 229 is(result, 1, "'OxXXXXXXX'.compare('0xff')");
233 result = byteArray2.compare(byteArray1); 230 result = byteArray2.compare(byteArray1);
234 is(result, -1, "'0xff'.compare('OxXXXXXXX')"); 231 is(result, -1, "'0xff'.compare('OxXXXXXXX')");
235 }); 232 });
236 deferredResult.callback(); 233 deferredResult.callback();
237 234
238 return deferredResult; 235 return deferredResult;
239 }, 236 },
240 237
241 //------------------------------------------------------------------------- 238 //-------------------------------------------------------------------------
242 239
243 'shiftLeft_tests': function (someTestArgs) { 240 'shiftLeft_tests': function (someTestArgs) {
244 vardeferredResult; 241 vardeferredResult;
245 242
246 deferredResult = new Clipperz.Async.Deferred("shiftLeft_tests", someTestArgs); 243 deferredResult = new Clipperz.Async.Deferred("shiftLeft_tests", someTestArgs);
247 deferredResult.addCallback(function() { 244 deferredResult.addCallback(function() {
248 245
249 }); 246 });
250 deferredResult.callback(); 247 deferredResult.callback();
251 248
252 return deferredResult; 249 return deferredResult;
253 }, 250 },
254 251
255 //------------------------------------------------------------------------- 252 //-------------------------------------------------------------------------
256 253
257 'nextBlockArray_tests': function (someTestArgs) { 254 'nextBlockArray_tests': function (someTestArgs) {
258 vardeferredResult; 255 vardeferredResult;
259 256
260 deferredResult = new Clipperz.Async.Deferred("nextBlockArray_tests", someTestArgs); 257 deferredResult = new Clipperz.Async.Deferred("nextBlockArray_tests", someTestArgs);
261 deferredResult.addCallback(function() { 258 deferredResult.addCallback(function() {
262 var byteArray; 259 var byteArray;
263 var byteArrayIterator; 260 var byteArrayIterator;
264 var nextBlock; 261 var nextBlock;
265 262
266 byteArray = new Clipperz.ByteArray("0x8cf53d90077df9a043bf8d10b470b144784411c93a4d504556834dae3ea4a5bb"); 263 byteArray = new Clipperz.ByteArray("0x8cf53d90077df9a043bf8d10b470b144784411c93a4d504556834dae3ea4a5bb");
267 byteArrayIterator = new Clipperz.ByteArrayIterator({byteArray:byteArray, blockSize:(128/8), finalPadding:false}); 264 byteArrayIterator = new Clipperz.ByteArrayIterator({byteArray:byteArray, blockSize:(128/8), finalPadding:false});
268 nextBlock = byteArrayIterator.nextBlockArray(); 265 nextBlock = byteArrayIterator.nextBlockArray();
269 is(nextBlock.toHexString(), "0x8cf53d90077df9a043bf8d10b470b144", "nextBlockArray first iteration"); 266 is(nextBlock.toHexString(), "0x8cf53d90077df9a043bf8d10b470b144", "nextBlockArray first iteration");
270 nextBlock = byteArrayIterator.nextBlockArray(); 267 nextBlock = byteArrayIterator.nextBlockArray();
271 is(nextBlock.toHexString(), "0x784411c93a4d504556834dae3ea4a5bb", "nextBlockArray second iteration"); 268 is(nextBlock.toHexString(), "0x784411c93a4d504556834dae3ea4a5bb", "nextBlockArray second iteration");
272 269
273 byteArray = new Clipperz.ByteArray("0x8cf53d90077df9a043bf8d10b470b144784411c93a4d504556834dae3ea4a5bb"); 270 byteArray = new Clipperz.ByteArray("0x8cf53d90077df9a043bf8d10b470b144784411c93a4d504556834dae3ea4a5bb");
274 byteArrayIterator = new Clipperz.ByteArrayIterator({byteArray:byteArray, blockSize:(128/8), finalPadding:false}); 271 byteArrayIterator = new Clipperz.ByteArrayIterator({byteArray:byteArray, blockSize:(128/8), finalPadding:false});
275 nextBlock = byteArrayIterator.nextBlock(); 272 nextBlock = byteArrayIterator.nextBlock();
276 is(nextBlock.length, 16, "nextBlock first iteration length"); 273 is(nextBlock.length, 16, "nextBlock first iteration length");
277 nextBlock = byteArrayIterator.nextBlock(); 274 nextBlock = byteArrayIterator.nextBlock();
278 is(nextBlock.length, 16, "nextBlock second iteration length"); 275 is(nextBlock.length, 16, "nextBlock second iteration length");
279 }); 276 });
280 deferredResult.callback(); 277 deferredResult.callback();
281 278
282 return deferredResult; 279 return deferredResult;
283 }, 280 },
284 281
285 //------------------------------------------------------------------------- 282 //-------------------------------------------------------------------------
286 283
287 'xor_tests': function (someTestArgs) { 284 'xor_tests': function (someTestArgs) {
288 vardeferredResult; 285 vardeferredResult;
289 286
290 deferredResult = new Clipperz.Async.Deferred("xor_tests", someTestArgs); 287 deferredResult = new Clipperz.Async.Deferred("xor_tests", someTestArgs);
291 deferredResult.addCallback(function() { 288 deferredResult.addCallback(function() {
292 var byteArray; 289 var byteArray;
293 var byteArray2; 290 var byteArray2;
294 291
295 byteArray = new Clipperz.ByteArray("0x55555555555555555555555555555555"); 292 byteArray = new Clipperz.ByteArray("0x55555555555555555555555555555555");
296 byteArray2 = new Clipperz.ByteArray("0x00ff000000ff000000ff000000ff0000"); 293 byteArray2 = new Clipperz.ByteArray("0x00ff000000ff000000ff000000ff0000");
297 is(byteArray.xorMergeWithBlock(byteArray2).toHexString(), "0x55aa555555aa555555aa555555aa5555", "the xorMergeWithBlock method works fine"); 294 is(byteArray.xorMergeWithBlock(byteArray2).toHexString(), "0x55aa555555aa555555aa555555aa5555", "the xorMergeWithBlock method works fine");
298 295
299 byteArray = new Clipperz.ByteArray("0x555555555555555555"); 296 byteArray = new Clipperz.ByteArray("0x555555555555555555");
300 byteArray2 = new Clipperz.ByteArray("0x00ff000000ff000000ff000000ff0000"); 297 byteArray2 = new Clipperz.ByteArray("0x00ff000000ff000000ff000000ff0000");
301 is(byteArray.xorMergeWithBlock(byteArray2, 'left', 'truncate').toHexString(), "0x55aa555555aa555555", "the xorMergeWithBlock (left, truncate) method works fine"); 298 is(byteArray.xorMergeWithBlock(byteArray2, 'left', 'truncate').toHexString(), "0x55aa555555aa555555", "the xorMergeWithBlock (left, truncate) method works fine");
302 299
303 byteArray = new Clipperz.ByteArray("0x555555555555555555"); 300 byteArray = new Clipperz.ByteArray("0x555555555555555555");
304 byteArray2 = new Clipperz.ByteArray("0x00ff000000ff000000ff000000ff0000"); 301 byteArray2 = new Clipperz.ByteArray("0x00ff000000ff000000ff000000ff0000");
305 is(byteArray.xorMergeWithBlock(byteArray2, 'right', 'truncate').toHexString(), "0x5555aa555555aa5555", "the xorMergeWithBlock (right, truncate) method works fine"); 302 is(byteArray.xorMergeWithBlock(byteArray2, 'right', 'truncate').toHexString(), "0x5555aa555555aa5555", "the xorMergeWithBlock (right, truncate) method works fine");
306 }); 303 });
307 deferredResult.callback(); 304 deferredResult.callback();
308 305
309 return deferredResult; 306 return deferredResult;
310 }, 307 },
311 308
312 //------------------------------------------------------------------------- 309 //-------------------------------------------------------------------------
313 310
314 'increment_tests': function (someTestArgs) { 311 'increment_tests': function (someTestArgs) {
315 vardeferredResult; 312 vardeferredResult;
316 313
317 deferredResult = new Clipperz.Async.Deferred("increment_tests", someTestArgs); 314 deferredResult = new Clipperz.Async.Deferred("increment_tests", someTestArgs);
318 deferredResult.addCallback(function() { 315 deferredResult.addCallback(function() {
319 var byteArray; 316 var byteArray;
320 varnumber; 317 varnumber;
321 var i,c; 318 var i,c;
322 319
323 number = new Clipperz.Crypto.BigInt("55555555555555555555555555555555", 16); 320 number = new Clipperz.Crypto.BigInt("55555555555555555555555555555555", 16);
324 byteArray = new Clipperz.ByteArray("0x" + number.asString(16)); 321 byteArray = new Clipperz.ByteArray("0x" + number.asString(16));
325 c = 2048; 322 c = 2048;
326 for (i=0; i<c; i++) { 323 for (i=0; i<c; i++) {
327 byteArray.increment(); 324 byteArray.increment();
328 } 325 }
329 is(byteArray.toHexString(), "0x" + number.add(2048).asString(16), "Clipperz.ByteArray.increment works"); 326 is(byteArray.toHexString(), "0x" + number.add(2048).asString(16), "Clipperz.ByteArray.increment works");
330 }); 327 });
331 deferredResult.callback(); 328 deferredResult.callback();
332 329
333 return deferredResult; 330 return deferredResult;
334 }, 331 },
335 332
336 //------------------------------------------------------------------------- 333 //-------------------------------------------------------------------------
337 334
338 'split_tests': function (someTestArgs) { 335 'split_tests': function (someTestArgs) {
339 vardeferredResult; 336 vardeferredResult;
340 337
341 deferredResult = new Clipperz.Async.Deferred("split_tests", someTestArgs); 338 deferredResult = new Clipperz.Async.Deferred("split_tests", someTestArgs);
342 deferredResult.addCallback(function() { 339 deferredResult.addCallback(function() {
343 var byteArray; 340 var byteArray;
344 341
345 byteArray = new Clipperz.ByteArray("0xa1b2c3d4"); 342 byteArray = new Clipperz.ByteArray("0xa1b2c3d4");
346 is(byteArray.split(0, 2).toHexString(), "0xa1b2", "byteArray.split(0,2) works fine"); 343 is(byteArray.split(0, 2).toHexString(), "0xa1b2", "byteArray.split(0,2) works fine");
347 is(byteArray.split(2).toHexString(), "0xc3d4", "byteArray.split(2) works fine"); 344 is(byteArray.split(2).toHexString(), "0xc3d4", "byteArray.split(2) works fine");
348 is(byteArray.split(1, 3).toHexString(), "0xb2c3", "byteArray.split(1,3) works fine"); 345 is(byteArray.split(1, 3).toHexString(), "0xb2c3", "byteArray.split(1,3) works fine");
349 }); 346 });
350 deferredResult.callback(); 347 deferredResult.callback();
351 348
352 return deferredResult; 349 return deferredResult;
353 }, 350 },
354 351
355 //------------------------------------------------------------------------- 352 //-------------------------------------------------------------------------
356 353
357 'appendBlock_tests': function (someTestArgs) { 354 'appendBlock_tests': function (someTestArgs) {
358 vardeferredResult; 355 vardeferredResult;
359 356
360 deferredResult = new Clipperz.Async.Deferred("appendBlock_tests", someTestArgs); 357 deferredResult = new Clipperz.Async.Deferred("appendBlock_tests", someTestArgs);
361 deferredResult.addCallback(function() { 358 deferredResult.addCallback(function() {
362 var byteArray; 359 var byteArray;
363 var byteArray2; 360 var byteArray2;
364 361
365 byteArray = new Clipperz.ByteArray("0xa1b2c3d4"); 362 byteArray = new Clipperz.ByteArray("0xa1b2c3d4");
366 byteArray2 = new Clipperz.ByteArray("0x1a2b3c4d"); 363 byteArray2 = new Clipperz.ByteArray("0x1a2b3c4d");
367 is(byteArray.appendBlock(byteArray2).toHexString(), "0xa1b2c3d41a2b3c4d", "the appendBlock method works fine"); 364 is(byteArray.appendBlock(byteArray2).toHexString(), "0xa1b2c3d41a2b3c4d", "the appendBlock method works fine");
368 }); 365 });
369 deferredResult.callback(); 366 deferredResult.callback();
370 367
371 return deferredResult; 368 return deferredResult;
372 }, 369 },
373 370
374 //------------------------------------------------------------------------- 371 //-------------------------------------------------------------------------
375 372
376 'appendWords_tests': function (someTestArgs) { 373 'appendWords_tests': function (someTestArgs) {
377 vardeferredResult; 374 vardeferredResult;
378 375
379 deferredResult = new Clipperz.Async.Deferred("appendWords_tests", someTestArgs); 376 deferredResult = new Clipperz.Async.Deferred("appendWords_tests", someTestArgs);
380 deferredResult.addCallback(function() { 377 deferredResult.addCallback(function() {
381 var byteArray; 378 var byteArray;
382 379
383 byteArray = new Clipperz.ByteArray(); 380 byteArray = new Clipperz.ByteArray();
384 byteArray.appendWords(0xa1b2c4d4, 0x1a2b3c4d); 381 byteArray.appendWords(0xa1b2c4d4, 0x1a2b3c4d);
385 is(byteArray.toHexString(), "0xa1b2c4d41a2b3c4d", "test appendWords"); 382 is(byteArray.toHexString(), "0xa1b2c4d41a2b3c4d", "test appendWords");
386 383
387 byteArray = new Clipperz.ByteArray(); 384 byteArray = new Clipperz.ByteArray();
388 byteArray.appendBigEndianWords(0xa1b2c4d4, 0x1a2b3c4d); 385 byteArray.appendBigEndianWords(0xa1b2c4d4, 0x1a2b3c4d);
389 is(byteArray.toHexString(), "0xd4c4b2a14d3c2b1a", "test appendBigEndianWords"); 386 is(byteArray.toHexString(), "0xd4c4b2a14d3c2b1a", "test appendBigEndianWords");
390 }); 387 });
391 deferredResult.callback(); 388 deferredResult.callback();
392 389
393 return deferredResult; 390 return deferredResult;
394 }, 391 },
395 392
396 //------------------------------------------------------------------------- 393 //-------------------------------------------------------------------------
397 394
398 'setByteAtIndex_tests': function (someTestArgs) { 395 'setByteAtIndex_tests': function (someTestArgs) {
399 vardeferredResult; 396 vardeferredResult;
400 397
401 deferredResult = new Clipperz.Async.Deferred("setByteAtIndex_tests", someTestArgs); 398 deferredResult = new Clipperz.Async.Deferred("setByteAtIndex_tests", someTestArgs);
402 deferredResult.addCallback(function() { 399 deferredResult.addCallback(function() {
403 varbyteArray; 400 varbyteArray;
404 401
405 byteArray = new Clipperz.ByteArray("0xa1b2c3d4e5f6"); 402 byteArray = new Clipperz.ByteArray("0xa1b2c3d4e5f6");
406 byteArray.setByteAtIndex(10, 0); 403 byteArray.setByteAtIndex(10, 0);
407 is(byteArray.toHexString(), "0x0ab2c3d4e5f6", "setByteAtIndex( , 0) works fine"); 404 is(byteArray.toHexString(), "0x0ab2c3d4e5f6", "setByteAtIndex( , 0) works fine");
408 405
diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/AES.html b/frontend/gamma/tests/tests/Clipperz/Crypto/AES.html
index 93089b7..828ccb8 100644
--- a/frontend/gamma/tests/tests/Clipperz/Crypto/AES.html
+++ b/frontend/gamma/tests/tests/Clipperz/Crypto/AES.html
@@ -1,292 +1,289 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27--> 24-->
28 25
29<html> 26<html>
30<head> 27<head>
31 <title>Clipperz.Crypto.AES_v3 - TEST</title> 28 <title>Clipperz.Crypto.AES_v3 - TEST</title>
32 29
33 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 30 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
34 <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script> 31 <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script>
35 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> 32 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
36 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> 33 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
37 34
38 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script> 35 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script>
39 36
40 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> 37 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
41 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script> 38 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 39 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
43 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 40 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
44 41
45 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> 42 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
46 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script> 43 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
47 44
48</head> 45</head>
49<body> 46<body>
50<pre id="test"> 47<pre id="test">
51<script type="text/javascript"> 48<script type="text/javascript">
52 49
53try { 50try {
54 var block; 51 var block;
55 var keyValue; 52 var keyValue;
56 varkey; 53 varkey;
57 var encryptedBlock; 54 var encryptedBlock;
58 var startTime, endTime; 55 var startTime, endTime;
59 56
60 startTime = new Date(); 57 startTime = new Date();
61 58
62 keyValue = new Clipperz.ByteArray("0x00010203050607080a0b0c0d0f10111214151617191a1b1c1e1f202123242526"); 59 keyValue = new Clipperz.ByteArray("0x00010203050607080a0b0c0d0f10111214151617191a1b1c1e1f202123242526");
63 key = new Clipperz.Crypto.AES.Key({key:keyValue}); 60 key = new Clipperz.Crypto.AES.Key({key:keyValue});
64 block = new Clipperz.ByteArray("0x834eadfccac7e1b30664b1aba44815ab"); 61 block = new Clipperz.ByteArray("0x834eadfccac7e1b30664b1aba44815ab");
65 encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues())); 62 encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues()));
66 is(encryptedBlock.toHexString(), "0x1946dabf6a03a2a2c3d0b05080aed6fc", "Test 1"); 63 is(encryptedBlock.toHexString(), "0x1946dabf6a03a2a2c3d0b05080aed6fc", "Test 1");
67 64
68 keyValue = new Clipperz.ByteArray("0x28292a2b2d2e2f30323334353738393a3c3d3e3f41424344464748494b4c4d4e"); 65 keyValue = new Clipperz.ByteArray("0x28292a2b2d2e2f30323334353738393a3c3d3e3f41424344464748494b4c4d4e");
69 key = new Clipperz.Crypto.AES.Key({key:keyValue}); 66 key = new Clipperz.Crypto.AES.Key({key:keyValue});
70 block = new Clipperz.ByteArray("0xd9dc4dba3021b05d67c0518f72b62bf1"); 67 block = new Clipperz.ByteArray("0xd9dc4dba3021b05d67c0518f72b62bf1");
71 encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues())); 68 encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues()));
72 is(encryptedBlock.toHexString(), "0x5ed301d747d3cc715445ebdec62f2fb4", "Test 2"); 69 is(encryptedBlock.toHexString(), "0x5ed301d747d3cc715445ebdec62f2fb4", "Test 2");
73 70
74 keyValue = new Clipperz.ByteArray("0x50515253555657585a5b5c5d5f60616264656667696a6b6c6e6f707173747576"); 71 keyValue = new Clipperz.ByteArray("0x50515253555657585a5b5c5d5f60616264656667696a6b6c6e6f707173747576");
75 key = new Clipperz.Crypto.AES.Key({key:keyValue}); 72 key = new Clipperz.Crypto.AES.Key({key:keyValue});
76 block = new Clipperz.ByteArray("0xa291d86301a4a739f7392173aa3c604c"); 73 block = new Clipperz.ByteArray("0xa291d86301a4a739f7392173aa3c604c");
77 encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues())); 74 encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues()));
78 is(encryptedBlock.toHexString(), "0x6585c8f43d13a6beab6419fc5935b9d0", "Test 3"); 75 is(encryptedBlock.toHexString(), "0x6585c8f43d13a6beab6419fc5935b9d0", "Test 3");
79 76
80 keyValue = new Clipperz.ByteArray("0x78797a7b7d7e7f80828384858788898a8c8d8e8f91929394969798999b9c9d9e"); 77 keyValue = new Clipperz.ByteArray("0x78797a7b7d7e7f80828384858788898a8c8d8e8f91929394969798999b9c9d9e");
81 key = new Clipperz.Crypto.AES.Key({key:keyValue}); 78 key = new Clipperz.Crypto.AES.Key({key:keyValue});
82 block = new Clipperz.ByteArray("0x4264b2696498de4df79788a9f83e9390"); 79 block = new Clipperz.ByteArray("0x4264b2696498de4df79788a9f83e9390");
83 encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues())); 80 encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues()));
84 is(encryptedBlock.toHexString(), "0x2a5b56a596680fcc0e05f5e0f151ecae", "Test 4"); 81 is(encryptedBlock.toHexString(), "0x2a5b56a596680fcc0e05f5e0f151ecae", "Test 4");
85 82
86 keyValue = new Clipperz.ByteArray("0xa0a1a2a3a5a6a7a8aaabacadafb0b1b2b4b5b6b7b9babbbcbebfc0c1c3c4c5c6"); 83 keyValue = new Clipperz.ByteArray("0xa0a1a2a3a5a6a7a8aaabacadafb0b1b2b4b5b6b7b9babbbcbebfc0c1c3c4c5c6");
87 key = new Clipperz.Crypto.AES.Key({key:keyValue}); 84 key = new Clipperz.Crypto.AES.Key({key:keyValue});
88 block = new Clipperz.ByteArray("0xee9932b3721804d5a83ef5949245b6f6"); 85 block = new Clipperz.ByteArray("0xee9932b3721804d5a83ef5949245b6f6");
89 encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues())); 86 encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues()));
90 is(encryptedBlock.toHexString(), "0xf5d6ff414fd2c6181494d20c37f2b8c4", "Test 5"); 87 is(encryptedBlock.toHexString(), "0xf5d6ff414fd2c6181494d20c37f2b8c4", "Test 5");
91 88
92 keyValue = new Clipperz.ByteArray("0xc8c9cacbcdcecfd0d2d3d4d5d7d8d9dadcdddedfe1e2e3e4e6e7e8e9ebecedee"); 89 keyValue = new Clipperz.ByteArray("0xc8c9cacbcdcecfd0d2d3d4d5d7d8d9dadcdddedfe1e2e3e4e6e7e8e9ebecedee");
93 key = new Clipperz.Crypto.AES.Key({key:keyValue}); 90 key = new Clipperz.Crypto.AES.Key({key:keyValue});
94 block = new Clipperz.ByteArray("0xe6248f55c5fdcbca9cbbb01c88a2ea77"); 91 block = new Clipperz.ByteArray("0xe6248f55c5fdcbca9cbbb01c88a2ea77");
95 encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues())); 92 encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues()));
96 is(encryptedBlock.toHexString(), "0x85399c01f59fffb5204f19f8482f00b8", "Test 6"); 93 is(encryptedBlock.toHexString(), "0x85399c01f59fffb5204f19f8482f00b8", "Test 6");
97 94
98 keyValue = new Clipperz.ByteArray("0xf0f1f2f3f5f6f7f8fafbfcfdfe01000204050607090a0b0c0e0f101113141516"); 95 keyValue = new Clipperz.ByteArray("0xf0f1f2f3f5f6f7f8fafbfcfdfe01000204050607090a0b0c0e0f101113141516");
99 key = new Clipperz.Crypto.AES.Key({key:keyValue}); 96 key = new Clipperz.Crypto.AES.Key({key:keyValue});
100 block = new Clipperz.ByteArray("0xb8358e41b9dff65fd461d55a99266247"); 97 block = new Clipperz.ByteArray("0xb8358e41b9dff65fd461d55a99266247");
101 encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues())); 98 encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues()));
102 is(encryptedBlock.toHexString(), "0x92097b4c88a041ddf98144bc8d22e8e7", "Test 7"); 99 is(encryptedBlock.toHexString(), "0x92097b4c88a041ddf98144bc8d22e8e7", "Test 7");
103 100
104 keyValue = new Clipperz.ByteArray("0x18191a1b1d1e1f20222324252728292a2c2d2e2f31323334363738393b3c3d3e"); 101 keyValue = new Clipperz.ByteArray("0x18191a1b1d1e1f20222324252728292a2c2d2e2f31323334363738393b3c3d3e");
105 key = new Clipperz.Crypto.AES.Key({key:keyValue}); 102 key = new Clipperz.Crypto.AES.Key({key:keyValue});
106 block = new Clipperz.ByteArray("0xf0e2d72260af58e21e015ab3a4c0d906"); 103 block = new Clipperz.ByteArray("0xf0e2d72260af58e21e015ab3a4c0d906");
107 encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues())); 104 encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues()));
108 is(encryptedBlock.toHexString(), "0x89bd5b73b356ab412aef9f76cea2d65c", "Test 8"); 105 is(encryptedBlock.toHexString(), "0x89bd5b73b356ab412aef9f76cea2d65c", "Test 8");
109 106
110 keyValue = new Clipperz.ByteArray("0x40414243454647484a4b4c4d4f50515254555657595a5b5c5e5f606163646566"); 107 keyValue = new Clipperz.ByteArray("0x40414243454647484a4b4c4d4f50515254555657595a5b5c5e5f606163646566");
111 key = new Clipperz.Crypto.AES.Key({key:keyValue}); 108 key = new Clipperz.Crypto.AES.Key({key:keyValue});
112 block = new Clipperz.ByteArray("0x475b8b823ce8893db3c44a9f2a379ff7"); 109 block = new Clipperz.ByteArray("0x475b8b823ce8893db3c44a9f2a379ff7");
113 encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues())); 110 encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues()));
114 is(encryptedBlock.toHexString(), "0x2536969093c55ff9454692f2fac2f530", "Test 9"); 111 is(encryptedBlock.toHexString(), "0x2536969093c55ff9454692f2fac2f530", "Test 9");
115 112
116 keyValue = new Clipperz.ByteArray("0x68696a6b6d6e6f70727374757778797a7c7d7e7f81828384868788898b8c8d8e"); 113 keyValue = new Clipperz.ByteArray("0x68696a6b6d6e6f70727374757778797a7c7d7e7f81828384868788898b8c8d8e");
117 key = new Clipperz.Crypto.AES.Key({key:keyValue}); 114 key = new Clipperz.Crypto.AES.Key({key:keyValue});
118 block = new Clipperz.ByteArray("0x688f5281945812862f5f3076cf80412f"); 115 block = new Clipperz.ByteArray("0x688f5281945812862f5f3076cf80412f");
119 encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues())); 116 encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues()));
120 is(encryptedBlock.toHexString(), "0x07fc76a872843f3f6e0081ee9396d637", "Test 10"); 117 is(encryptedBlock.toHexString(), "0x07fc76a872843f3f6e0081ee9396d637", "Test 10");
121 118
122 //------------------------------------------------------------------------- 119 //-------------------------------------------------------------------------
123 // 120 //
124 // Key expansion 121 // Key expansion
125 // 122 //
126 //------------------------------------------------------------------------- 123 //-------------------------------------------------------------------------
127 //test vector: http://en.wikipedia.org/wiki/Rijndael_key_schedule#Test_vectors 124 //test vector: http://en.wikipedia.org/wiki/Rijndael_key_schedule#Test_vectors
128 125
129 keyValue = new Clipperz.ByteArray("0x0000000000000000000000000000000012345678"); 126 keyValue = new Clipperz.ByteArray("0x0000000000000000000000000000000012345678");
130 try { 127 try {
131 key = new Clipperz.Crypto.AES.Key({key:keyValue}); 128 key = new Clipperz.Crypto.AES.Key({key:keyValue});
132 is(true, false, "Unsupported key size"); 129 is(true, false, "Unsupported key size");
133 } catch (exception) { 130 } catch (exception) {
134 is(true, true, "Unsupported key size"); 131 is(true, true, "Unsupported key size");
135 } 132 }
136 133
137 keyValue = new Clipperz.ByteArray("0x00000000000000000000000000000000"); 134 keyValue = new Clipperz.ByteArray("0x00000000000000000000000000000000");
138 key = new Clipperz.Crypto.AES.Key({key:keyValue}); 135 key = new Clipperz.Crypto.AES.Key({key:keyValue});
139 is(key.stretchedKey().toHexString(), 136 is(key.stretchedKey().toHexString(),
140 "0x" +"00000000000000000000000000000000" + 137 "0x" +"00000000000000000000000000000000" +
141 "62636363626363636263636362636363" + 138 "62636363626363636263636362636363" +
142 "9b9898c9f9fbfbaa9b9898c9f9fbfbaa" + 139 "9b9898c9f9fbfbaa9b9898c9f9fbfbaa" +
143 "90973450696ccffaf2f457330b0fac99" + 140 "90973450696ccffaf2f457330b0fac99" +
144 "ee06da7b876a1581759e42b27e91ee2b" + 141 "ee06da7b876a1581759e42b27e91ee2b" +
145 "7f2e2b88f8443e098dda7cbbf34b9290" + 142 "7f2e2b88f8443e098dda7cbbf34b9290" +
146 "ec614b851425758c99ff09376ab49ba7" + 143 "ec614b851425758c99ff09376ab49ba7" +
147 "217517873550620bacaf6b3cc61bf09b" + 144 "217517873550620bacaf6b3cc61bf09b" +
148 "0ef903333ba9613897060a04511dfa9f" + 145 "0ef903333ba9613897060a04511dfa9f" +
149 "b1d4d8e28a7db9da1d7bb3de4c664941" + 146 "b1d4d8e28a7db9da1d7bb3de4c664941" +
150 "b4ef5bcb3e92e21123e951cf6f8f188e", 147 "b4ef5bcb3e92e21123e951cf6f8f188e",
151 "Stretched empty key"); 148 "Stretched empty key");
152 149
153 150
154 keyValue = new Clipperz.ByteArray("0x0000000000000000000000000000000000000000000000000000000000000000"); 151 keyValue = new Clipperz.ByteArray("0x0000000000000000000000000000000000000000000000000000000000000000");
155 key = new Clipperz.Crypto.AES.Key({key:keyValue}); 152 key = new Clipperz.Crypto.AES.Key({key:keyValue});
156 is(key.stretchedKey().toHexString(), 153 is(key.stretchedKey().toHexString(),
157 "0x" +"00000000000000000000000000000000" + 154 "0x" +"00000000000000000000000000000000" +
158 "00000000000000000000000000000000" + 155 "00000000000000000000000000000000" +
159 "62636363626363636263636362636363" + 156 "62636363626363636263636362636363" +
160 "aafbfbfbaafbfbfbaafbfbfbaafbfbfb" + 157 "aafbfbfbaafbfbfbaafbfbfbaafbfbfb" +
161 "6f6c6ccf0d0f0fac6f6c6ccf0d0f0fac" + 158 "6f6c6ccf0d0f0fac6f6c6ccf0d0f0fac" +
162 "7d8d8d6ad77676917d8d8d6ad7767691" + 159 "7d8d8d6ad77676917d8d8d6ad7767691" +
163 "5354edc15e5be26d31378ea23c38810e" + 160 "5354edc15e5be26d31378ea23c38810e" +
164 "968a81c141fcf7503c717a3aeb070cab" + 161 "968a81c141fcf7503c717a3aeb070cab" +
165 "9eaa8f28c0f16d45f1c6e3e7cdfe62e9" + 162 "9eaa8f28c0f16d45f1c6e3e7cdfe62e9" +
166 "2b312bdf6acddc8f56bca6b5bdbbaa1e" + 163 "2b312bdf6acddc8f56bca6b5bdbbaa1e" +
167 "6406fd52a4f79017553173f098cf1119" + 164 "6406fd52a4f79017553173f098cf1119" +
168 "6dbba90b0776758451cad331ec71792f" + 165 "6dbba90b0776758451cad331ec71792f" +
169 "e7b0e89c4347788b16760b7b8eb91a62" + 166 "e7b0e89c4347788b16760b7b8eb91a62" +
170 "74ed0ba1739b7e252251ad14ce20d43b" + 167 "74ed0ba1739b7e252251ad14ce20d43b" +
171 "10f80a1753bf729c45c979e7cb706385", 168 "10f80a1753bf729c45c979e7cb706385",
172 "Stretched empty key"); 169 "Stretched empty key");
173 170
174 var roundIndex; 171 var roundIndex;
175 172
176 roundIndex = 0; 173 roundIndex = 0;
177 is(key.stretchedKey().split(roundIndex*16, roundIndex*16 + 16).toHexString(), "0x00000000000000000000000000000000", "empty key, subKeyAtRound(0)"); 174 is(key.stretchedKey().split(roundIndex*16, roundIndex*16 + 16).toHexString(), "0x00000000000000000000000000000000", "empty key, subKeyAtRound(0)");
178 roundIndex = 1; 175 roundIndex = 1;
179 is(key.stretchedKey().split(roundIndex*16, roundIndex*16 + 16).toHexString(), "0x00000000000000000000000000000000", "empty key, subKeyAtRound(1)"); 176 is(key.stretchedKey().split(roundIndex*16, roundIndex*16 + 16).toHexString(), "0x00000000000000000000000000000000", "empty key, subKeyAtRound(1)");
180 roundIndex = 2; 177 roundIndex = 2;
181 is(key.stretchedKey().split(roundIndex*16, roundIndex*16 + 16).toHexString(), "0x62636363626363636263636362636363", "empty key, subKeyAtRound(2)"); 178 is(key.stretchedKey().split(roundIndex*16, roundIndex*16 + 16).toHexString(), "0x62636363626363636263636362636363", "empty key, subKeyAtRound(2)");
182 roundIndex = 3; 179 roundIndex = 3;
183 is(key.stretchedKey().split(roundIndex*16, roundIndex*16 + 16).toHexString(), "0xaafbfbfbaafbfbfbaafbfbfbaafbfbfb", "empty key, subKeyAtRound(3)"); 180 is(key.stretchedKey().split(roundIndex*16, roundIndex*16 + 16).toHexString(), "0xaafbfbfbaafbfbfbaafbfbfbaafbfbfb", "empty key, subKeyAtRound(3)");
184 roundIndex = 4; 181 roundIndex = 4;
185 is(key.stretchedKey().split(roundIndex*16, roundIndex*16 + 16).toHexString(), "0x6f6c6ccf0d0f0fac6f6c6ccf0d0f0fac", "empty key, subKeyAtRound(4)"); 182 is(key.stretchedKey().split(roundIndex*16, roundIndex*16 + 16).toHexString(), "0x6f6c6ccf0d0f0fac6f6c6ccf0d0f0fac", "empty key, subKeyAtRound(4)");
186 roundIndex = 5; 183 roundIndex = 5;
187 is(key.stretchedKey().split(roundIndex*16, roundIndex*16 + 16).toHexString(), "0x7d8d8d6ad77676917d8d8d6ad7767691", "empty key, subKeyAtRound(5)"); 184 is(key.stretchedKey().split(roundIndex*16, roundIndex*16 + 16).toHexString(), "0x7d8d8d6ad77676917d8d8d6ad7767691", "empty key, subKeyAtRound(5)");
188 roundIndex = 6; 185 roundIndex = 6;
189 is(key.stretchedKey().split(roundIndex*16, roundIndex*16 + 16).toHexString(), "0x5354edc15e5be26d31378ea23c38810e", "empty key, subKeyAtRound(6)"); 186 is(key.stretchedKey().split(roundIndex*16, roundIndex*16 + 16).toHexString(), "0x5354edc15e5be26d31378ea23c38810e", "empty key, subKeyAtRound(6)");
190 roundIndex = 7; 187 roundIndex = 7;
191 is(key.stretchedKey().split(roundIndex*16, roundIndex*16 + 16).toHexString(), "0x968a81c141fcf7503c717a3aeb070cab", "empty key, subKeyAtRound(7)"); 188 is(key.stretchedKey().split(roundIndex*16, roundIndex*16 + 16).toHexString(), "0x968a81c141fcf7503c717a3aeb070cab", "empty key, subKeyAtRound(7)");
192 roundIndex = 8; 189 roundIndex = 8;
193 is(key.stretchedKey().split(roundIndex*16, roundIndex*16 + 16).toHexString(), "0x9eaa8f28c0f16d45f1c6e3e7cdfe62e9", "empty key, subKeyAtRound(8)"); 190 is(key.stretchedKey().split(roundIndex*16, roundIndex*16 + 16).toHexString(), "0x9eaa8f28c0f16d45f1c6e3e7cdfe62e9", "empty key, subKeyAtRound(8)");
194 roundIndex = 9; 191 roundIndex = 9;
195 is(key.stretchedKey().split(roundIndex*16, roundIndex*16 + 16).toHexString(), "0x2b312bdf6acddc8f56bca6b5bdbbaa1e", "empty key, subKeyAtRound(9)"); 192 is(key.stretchedKey().split(roundIndex*16, roundIndex*16 + 16).toHexString(), "0x2b312bdf6acddc8f56bca6b5bdbbaa1e", "empty key, subKeyAtRound(9)");
196 roundIndex = 10; 193 roundIndex = 10;
197 is(key.stretchedKey().split(roundIndex*16, roundIndex*16 + 16).toHexString(), "0x6406fd52a4f79017553173f098cf1119", "empty key, subKeyAtRound(10)"); 194 is(key.stretchedKey().split(roundIndex*16, roundIndex*16 + 16).toHexString(), "0x6406fd52a4f79017553173f098cf1119", "empty key, subKeyAtRound(10)");
198 roundIndex = 11; 195 roundIndex = 11;
199 is(key.stretchedKey().split(roundIndex*16, roundIndex*16 + 16).toHexString(), "0x6dbba90b0776758451cad331ec71792f", "empty key, subKeyAtRound(11)"); 196 is(key.stretchedKey().split(roundIndex*16, roundIndex*16 + 16).toHexString(), "0x6dbba90b0776758451cad331ec71792f", "empty key, subKeyAtRound(11)");
200 roundIndex = 12; 197 roundIndex = 12;
201 is(key.stretchedKey().split(roundIndex*16, roundIndex*16 + 16).toHexString(), "0xe7b0e89c4347788b16760b7b8eb91a62", "empty key, subKeyAtRound(12)"); 198 is(key.stretchedKey().split(roundIndex*16, roundIndex*16 + 16).toHexString(), "0xe7b0e89c4347788b16760b7b8eb91a62", "empty key, subKeyAtRound(12)");
202 roundIndex = 13; 199 roundIndex = 13;
203 is(key.stretchedKey().split(roundIndex*16, roundIndex*16 + 16).toHexString(), "0x74ed0ba1739b7e252251ad14ce20d43b", "empty key, subKeyAtRound(13)"); 200 is(key.stretchedKey().split(roundIndex*16, roundIndex*16 + 16).toHexString(), "0x74ed0ba1739b7e252251ad14ce20d43b", "empty key, subKeyAtRound(13)");
204 roundIndex = 14; 201 roundIndex = 14;
205 is(key.stretchedKey().split(roundIndex*16, roundIndex*16 + 16).toHexString(), "0x10f80a1753bf729c45c979e7cb706385", "empty key, subKeyAtRound(14)"); 202 is(key.stretchedKey().split(roundIndex*16, roundIndex*16 + 16).toHexString(), "0x10f80a1753bf729c45c979e7cb706385", "empty key, subKeyAtRound(14)");
206 203
207 204
208 //------------------------------------------------------------------------- 205 //-------------------------------------------------------------------------
209 // 206 //
210 // Encrypt / decrypt 207 // Encrypt / decrypt
211 // 208 //
212 //------------------------------------------------------------------------- 209 //-------------------------------------------------------------------------
213 // Test vectors:http://www.zvon.org/tmRFC/RFC3686/Output/chapter6.html 210 // Test vectors:http://www.zvon.org/tmRFC/RFC3686/Output/chapter6.html
214 // http://www.cs.utsa.edu/~wagner/laws/AEStestRuns.html 211 // http://www.cs.utsa.edu/~wagner/laws/AEStestRuns.html
215 // http://www.ietf.org/rfc/rfc3686.txt 212 // http://www.ietf.org/rfc/rfc3686.txt
216 213
217 { 214 {
218 // 215 //
219 // http://www.cs.utsa.edu/~wagner/laws/AEStestRuns.html 216 // http://www.cs.utsa.edu/~wagner/laws/AEStestRuns.html
220 // 217 //
221 var key; 218 var key;
222 var plainText; 219 var plainText;
223 var cipherText; 220 var cipherText;
224 var result; 221 var result;
225 222
226 // 223 //
227 //256-bit key size 224 //256-bit key size
228 // 225 //
229 226
230 //Gladman's Test Data, 256-bit key - encrypt 227 //Gladman's Test Data, 256-bit key - encrypt
231 key = new Clipperz.ByteArray("0x2b7e151628aed2a6abf7158809cf4f3c762e7160f38b4da56a784d9045190cfe", 16); 228 key = new Clipperz.ByteArray("0x2b7e151628aed2a6abf7158809cf4f3c762e7160f38b4da56a784d9045190cfe", 16);
232 plainText = new Clipperz.ByteArray("0x3243f6a8885a308d313198a2e0370734", 16); 229 plainText = new Clipperz.ByteArray("0x3243f6a8885a308d313198a2e0370734", 16);
233 cipherText = new Clipperz.ByteArray("0x1a6e6c2c662e7da6501ffb62bc9e93f3", 16); 230 cipherText = new Clipperz.ByteArray("0x1a6e6c2c662e7da6501ffb62bc9e93f3", 16);
234 231
235 result = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(new Clipperz.Crypto.AES.Key({key:key}), plainText.arrayValues())); 232 result = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(new Clipperz.Crypto.AES.Key({key:key}), plainText.arrayValues()));
236 is(result.toHexString(), cipherText.toHexString(), "Gladman's Test Data, 256-bit key - encrypt"); 233 is(result.toHexString(), cipherText.toHexString(), "Gladman's Test Data, 256-bit key - encrypt");
237 234
238 //AES Specification Test Data, 256-bit key - encrypt 235 //AES Specification Test Data, 256-bit key - encrypt
239 key = new Clipperz.ByteArray("0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f", 16); 236 key = new Clipperz.ByteArray("0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f", 16);
240 plainText = new Clipperz.ByteArray("0x00112233445566778899aabbccddeeff", 16); 237 plainText = new Clipperz.ByteArray("0x00112233445566778899aabbccddeeff", 16);
241 cipherText = new Clipperz.ByteArray("0x8ea2b7ca516745bfeafc49904b496089", 16); 238 cipherText = new Clipperz.ByteArray("0x8ea2b7ca516745bfeafc49904b496089", 16);
242 239
243 result = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(new Clipperz.Crypto.AES.Key({key:key}), plainText.arrayValues())); 240 result = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(new Clipperz.Crypto.AES.Key({key:key}), plainText.arrayValues()));
244 is(result.toHexString(), cipherText.toHexString(), "AES Specification Test Data, 256-bit key - encrypt"); 241 is(result.toHexString(), cipherText.toHexString(), "AES Specification Test Data, 256-bit key - encrypt");
245 242
246 // 243 //
247 //128-bit key size 244 //128-bit key size
248 // 245 //
249 246
250 //Gladman's Test Data, 128-bit key - encrypt 247 //Gladman's Test Data, 128-bit key - encrypt
251 key = new Clipperz.ByteArray("0x2b7e151628aed2a6abf7158809cf4f3c", 16); 248 key = new Clipperz.ByteArray("0x2b7e151628aed2a6abf7158809cf4f3c", 16);
252 plainText = new Clipperz.ByteArray("0x3243f6a8885a308d313198a2e0370734", 16); 249 plainText = new Clipperz.ByteArray("0x3243f6a8885a308d313198a2e0370734", 16);
253 cipherText = new Clipperz.ByteArray("0x3925841d02dc09fbdc118597196a0b32", 16); 250 cipherText = new Clipperz.ByteArray("0x3925841d02dc09fbdc118597196a0b32", 16);
254 251
255 result = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(new Clipperz.Crypto.AES.Key({key:key}), plainText.arrayValues())); 252 result = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(new Clipperz.Crypto.AES.Key({key:key}), plainText.arrayValues()));
256 is(result.toHexString(), cipherText.toHexString(), "Gladman's Test Data, 128-bit key - encrypt"); 253 is(result.toHexString(), cipherText.toHexString(), "Gladman's Test Data, 128-bit key - encrypt");
257 254
258 //AES Specification Test Data, 128-bit key - encrypt 255 //AES Specification Test Data, 128-bit key - encrypt
259 key = new Clipperz.ByteArray("0x000102030405060708090a0b0c0d0e0f", 16); 256 key = new Clipperz.ByteArray("0x000102030405060708090a0b0c0d0e0f", 16);
260 plainText = new Clipperz.ByteArray("0x00112233445566778899aabbccddeeff", 16); 257 plainText = new Clipperz.ByteArray("0x00112233445566778899aabbccddeeff", 16);
261 cipherText = new Clipperz.ByteArray("0x69c4e0d86a7b0430d8cdb78070b4c55a", 16); 258 cipherText = new Clipperz.ByteArray("0x69c4e0d86a7b0430d8cdb78070b4c55a", 16);
262 259
263 result = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(new Clipperz.Crypto.AES.Key({key:key}), plainText.arrayValues())); 260 result = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(new Clipperz.Crypto.AES.Key({key:key}), plainText.arrayValues()));
264 is(result.toHexString(), cipherText.toHexString(), "AES Specification Test Data, 128-bit key - encrypt"); 261 is(result.toHexString(), cipherText.toHexString(), "AES Specification Test Data, 128-bit key - encrypt");
265 262
266 } 263 }
267 264
268 265
269 endTime = new Date(); 266 endTime = new Date();
270 MochiKit.Logging.logDebug("elapsed time: " + (endTime - startTime)); 267 MochiKit.Logging.logDebug("elapsed time: " + (endTime - startTime));
271 268
272//############################################################################# 269//#############################################################################
273 270
274} catch (err) { 271} catch (err) {
275 272
276 var s = "test suite failure!\n"; 273 var s = "test suite failure!\n";
277 var o = {}; 274 var o = {};
278 var k = null; 275 var k = null;
279 for (k in err) { 276 for (k in err) {
280 // ensure unique keys?! 277 // ensure unique keys?!
281 if (!o[k]) { 278 if (!o[k]) {
282 s += k + ": " + err[k] + "\n"; 279 s += k + ": " + err[k] + "\n";
283 o[k] = err[k]; 280 o[k] = err[k];
284 } 281 }
285 } 282 }
286 ok ( false, s ); 283 ok ( false, s );
287} 284}
288 285
289</script> 286</script>
290</pre> 287</pre>
291</body> 288</body>
292</html> 289</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/AES.performance.html b/frontend/gamma/tests/tests/Clipperz/Crypto/AES.performance.html
index 0d1cf07..4817096 100644
--- a/frontend/gamma/tests/tests/Clipperz/Crypto/AES.performance.html
+++ b/frontend/gamma/tests/tests/Clipperz/Crypto/AES.performance.html
@@ -1,344 +1,341 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27--> 24-->
28 25
29<html> 26<html>
30<head> 27<head>
31 <title>Clipperz.Crypto.AES_performance - TEST</title> 28 <title>Clipperz.Crypto.AES_performance - TEST</title>
32 29
33 <script> 30 <script>
34 jslog_config_enabled = true; 31 jslog_config_enabled = true;
35 </script> 32 </script>
36 33
37 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 34 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
38 <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script> 35 <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script>
39 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> 36 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
40 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> 37 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
41 38
42 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script> 39 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script>
43 40
44 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> 41 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
45 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script> 42 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
46 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 43 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
47 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script> 44 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
48 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 45 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
49 46
50 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> 47 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
51 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> 48 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
52 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script> 49 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
53 50
54 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script> 51 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
55 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script> 52 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script>
56 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script> 53 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script>
57 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script> 54 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script>
58 55
59</head> 56</head>
60<body> 57<body>
61<pre id="test"> 58<pre id="test">
62<script type="text/javascript"> 59<script type="text/javascript">
63Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); 60Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
64 61
65try { 62try {
66 63
67 var password; 64 var password;
68 varplainText; 65 varplainText;
69 varencryptedText; 66 varencryptedText;
70 var decryptedText; 67 var decryptedText;
71 /* 68 /*
72 password = "trustno1"; 69 password = "trustno1";
73 plainText = "The quick brown fox jumps over the lazy dog"; 70 plainText = "The quick brown fox jumps over the lazy dog";
74//console.profile("encrypt"); 71//console.profile("encrypt");
75 encryptedText = Clipperz.PM.Crypto.encryptingFunctions.versions['0.2'].encrypt(password, plainText); 72 encryptedText = Clipperz.PM.Crypto.encryptingFunctions.versions['0.2'].encrypt(password, plainText);
76//console.profileEnd(); 73//console.profileEnd();
77//console.profile("decrypt"); 74//console.profile("decrypt");
78 decryptedText = Clipperz.PM.Crypto.encryptingFunctions.versions['0.2'].decrypt(password, encryptedText); 75 decryptedText = Clipperz.PM.Crypto.encryptingFunctions.versions['0.2'].decrypt(password, encryptedText);
79//console.profileEnd(); 76//console.profileEnd();
80 is(decryptedText, plainText, "simple string encrypted/decrypted"); 77 is(decryptedText, plainText, "simple string encrypted/decrypted");
81*/ 78*/
82 79
83 password = "L7bd9fQMhborMbYcHtlr"; 80 password = "L7bd9fQMhborMbYcHtlr";
84 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 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"}};
85/* */ 82/* */
86 plainText = { 83 plainText = {
87 "records": { 84 "records": {
88 "1": { 85 "1": {
89 "label":"imap4all [no]", 86 "label":"imap4all [no]",
90 "key":"f54b5033d1152456acb67974c45ee6771f8411e300c9533359dfacacf60dcbbd", 87 "key":"f54b5033d1152456acb67974c45ee6771f8411e300c9533359dfacacf60dcbbd",
91 "notes":"" 88 "notes":""
92 }, 89 },
93 "2": { 90 "2": {
94 "label":"Il manifesto", 91 "label":"Il manifesto",
95 "key":"6e0ef134503110e72f444e7d102a4b1cc6ae28f2e0b1287c2b1875ff052fc16c", 92 "key":"6e0ef134503110e72f444e7d102a4b1cc6ae28f2e0b1287c2b1875ff052fc16c",
96 "notes":"" 93 "notes":""
97 }, 94 },
98 "3": { 95 "3": {
99 "label": "OmniGroup applications", 96 "label": "OmniGroup applications",
100 "key": "7b432b7dae39ff5951db31947fa721dc012af0da4055760c6df3b02e776ef22c", 97 "key": "7b432b7dae39ff5951db31947fa721dc012af0da4055760c6df3b02e776ef22c",
101 "notes": "url: http://www.omnigroup.com\n\nLicence owner: Giulio Cesare Solaroli\n\nOmniWeb: EQGP-EMKH-LKWP-MUHQ-OUHL-LDF\nOmniGraffle:\nOmniOutliner:\nOmniDiskSweeper:" 98 "notes": "url: http://www.omnigroup.com\n\nLicence owner: Giulio Cesare Solaroli\n\nOmniWeb: EQGP-EMKH-LKWP-MUHQ-OUHL-LDF\nOmniGraffle:\nOmniOutliner:\nOmniDiskSweeper:"
102 }, 99 },
103 "4": { 100 "4": {
104 "label": "R@cine", 101 "label": "R@cine",
105 "key": "57295772c84669b0a224f435e9b75c797ae5999a2d9473ab50f9384ae54f49d6", 102 "key": "57295772c84669b0a224f435e9b75c797ae5999a2d9473ab50f9384ae54f49d6",
106 "notes": "" 103 "notes": ""
107 }, 104 },
108 "5": { 105 "5": {
109 "label": "NewsGator", 106 "label": "NewsGator",
110 "key": "6ee16f6932ee02000c49dbcc685c84074b40d7956e5f4bc1100030a0f9a41f1a", 107 "key": "6ee16f6932ee02000c49dbcc685c84074b40d7956e5f4bc1100030a0f9a41f1a",
111 "notes": "" 108 "notes": ""
112 }, 109 },
113 "6": { 110 "6": {
114 "label": "GMail - giulio.cesare", 111 "label": "GMail - giulio.cesare",
115 "key": "0395efd852b00700bcf78b65350ec15932430df71201d2c53a11b0269b557d1a", 112 "key": "0395efd852b00700bcf78b65350ec15932430df71201d2c53a11b0269b557d1a",
116 "notes": "" 113 "notes": ""
117 }, 114 },
118 "7": { 115 "7": {
119 "label": "GMail - clipperz.com", 116 "label": "GMail - clipperz.com",
120 "key": "90d6ae70d89c8211404b6f9d6c70b6b9c113fff74f474a67b34acd9c1c048d1f", 117 "key": "90d6ae70d89c8211404b6f9d6c70b6b9c113fff74f474a67b34acd9c1c048d1f",
121 "notes": "" 118 "notes": ""
122 }, 119 },
123 "8": { 120 "8": {
124 "label": "Aruba - hosting", 121 "label": "Aruba - hosting",
125 "key": "5c7472d24d57391c63ea99ed1fc9de179d225abd335fa65702018cfea6083d47", 122 "key": "5c7472d24d57391c63ea99ed1fc9de179d225abd335fa65702018cfea6083d47",
126 "notes": "" 123 "notes": ""
127 }, 124 },
128 "9": { 125 "9": {
129 "label": "Aruba - sql hosting", 126 "label": "Aruba - sql hosting",
130 "key": "f6bd942ac3b0b7065771e5197c7499b345a10f7a4843d00c3ba3809d0ea059dc", 127 "key": "f6bd942ac3b0b7065771e5197c7499b345a10f7a4843d00c3ba3809d0ea059dc",
131 "notes": "" 128 "notes": ""
132 }, 129 },
133 "10": { 130 "10": {
134 "label": "Amazon", 131 "label": "Amazon",
135 "key": "1ae022b4d14b642f113703b2a98931bd892dec2da785ab5ff6fc1d0aac7537f1", 132 "key": "1ae022b4d14b642f113703b2a98931bd892dec2da785ab5ff6fc1d0aac7537f1",
136 "notes": "" 133 "notes": ""
137 }, 134 },
138 "11": { 135 "11": {
139 "label": "YouTube [no]", 136 "label": "YouTube [no]",
140 "key": "4c6593d4f6448137939b364b84c81501fadb60f7871fe5fa63c93e97bb5c4648", 137 "key": "4c6593d4f6448137939b364b84c81501fadb60f7871fe5fa63c93e97bb5c4648",
141 "notes": "" 138 "notes": ""
142 }, 139 },
143 "12": { 140 "12": {
144 "label": "DynDns - gcsolaroli", 141 "label": "DynDns - gcsolaroli",
145 "key": "f8ed9e7a3630deed046eda37ebc63ecb4d63668a2f97224d7628fdc53b242467", 142 "key": "f8ed9e7a3630deed046eda37ebc63ecb4d63668a2f97224d7628fdc53b242467",
146 "notes": "" 143 "notes": ""
147 }, 144 },
148 "13": { 145 "13": {
149 "label": "DynDns - clipperz", 146 "label": "DynDns - clipperz",
150 "key": "d8bc295177383a523e67b61b166e0ca956ab4c2ee86800559a009d2716064f6d", 147 "key": "d8bc295177383a523e67b61b166e0ca956ab4c2ee86800559a009d2716064f6d",
151 "notes": "" 148 "notes": ""
152 }, 149 },
153 "14": { 150 "14": {
154 "label": "Bol.it", 151 "label": "Bol.it",
155 "key": "cada5dadeebd8d12190954d21f1a944c8799d034f028be195b448935fcf970c7", 152 "key": "cada5dadeebd8d12190954d21f1a944c8799d034f028be195b448935fcf970c7",
156 "notes": "" 153 "notes": ""
157 }, 154 },
158 "15": { 155 "15": {
159 "label": "Freenigma - clipperz.com", 156 "label": "Freenigma - clipperz.com",
160 "key": "f09cb3790c1110794b834702b8c487c1a42b2508fbe6450a8468477d93790b2e", 157 "key": "f09cb3790c1110794b834702b8c487c1a42b2508fbe6450a8468477d93790b2e",
161 "notes": "" 158 "notes": ""
162 }, 159 },
163 "16": { 160 "16": {
164 "label": "Freenigma", 161 "label": "Freenigma",
165 "key": "4b05738f6faebc147eac5e425054a91d3cc59dd63844e82d1f0864c0ac8efec7", 162 "key": "4b05738f6faebc147eac5e425054a91d3cc59dd63844e82d1f0864c0ac8efec7",
166 "notes": "" 163 "notes": ""
167 }, 164 },
168 "17": { 165 "17": {
169 "label": "clipperz.com - blog", 166 "label": "clipperz.com - blog",
170 "key": "9cc24328bbce18e8713962428d8123e309a12f7e1d9537bc252e134501734003", 167 "key": "9cc24328bbce18e8713962428d8123e309a12f7e1d9537bc252e134501734003",
171 "notes": "" 168 "notes": ""
172 }, 169 },
173 "18": { 170 "18": {
174 "label": "Apple", 171 "label": "Apple",
175 "key": "75f2651af400629c4e5dd8bcdc3a6c691150d23d6e1a4eb263ff810926d1228f", 172 "key": "75f2651af400629c4e5dd8bcdc3a6c691150d23d6e1a4eb263ff810926d1228f",
176 "notes": "" 173 "notes": ""
177 }, 174 },
178 "19": { 175 "19": {
179 "label": ".mac", 176 "label": ".mac",
180 "key": "5934ae96d2e01282effb368d9086c2ba5d1d856ad91dd6f04f5bace26a1c0cbe", 177 "key": "5934ae96d2e01282effb368d9086c2ba5d1d856ad91dd6f04f5bace26a1c0cbe",
181 "notes": "" 178 "notes": ""
182 }, 179 },
183 "20": { 180 "20": {
184 "label": "3nity", 181 "label": "3nity",
185 "key": "33d84c4a91ab053cbf8115c689ede7e504b81199884de449acc257bea534f57f", 182 "key": "33d84c4a91ab053cbf8115c689ede7e504b81199884de449acc257bea534f57f",
186 "notes": "" 183 "notes": ""
187 }, 184 },
188 "21": { 185 "21": {
189 "label": "ACM", 186 "label": "ACM",
190 "key": "b4976bb0892baba81d628513d191de100d89acd58efbb07c823a5bb4abe48a7a", 187 "key": "b4976bb0892baba81d628513d191de100d89acd58efbb07c823a5bb4abe48a7a",
191 "notes": "" 188 "notes": ""
192 }, 189 },
193 "22": { 190 "22": {
194 "label": "Adobe", 191 "label": "Adobe",
195 "key": "d162bc404994a79ec97e0106c3a4edf2f83aca25def130242e11e95e74bd0aaa", 192 "key": "d162bc404994a79ec97e0106c3a4edf2f83aca25def130242e11e95e74bd0aaa",
196 "notes": "" 193 "notes": ""
197 }, 194 },
198 "23": { 195 "23": {
199 "label": "Adobe Photoshop Elements 3", 196 "label": "Adobe Photoshop Elements 3",
200 "key": "18a62c3c2065399819707322f467ff4be030d7939acbe5182c8194599845c428", 197 "key": "18a62c3c2065399819707322f467ff4be030d7939acbe5182c8194599845c428",
201 "notes": "Photoshop Elements 2:\n1057-4312-5223-2206-9509-6837" 198 "notes": "Photoshop Elements 2:\n1057-4312-5223-2206-9509-6837"
202 }, 199 },
203 "24": { 200 "24": {
204 "label": "Agatra", 201 "label": "Agatra",
205 "key": "c35158a21b2af75d414232b742ab738d042314e00209f8fca94c8c704c891f23", 202 "key": "c35158a21b2af75d414232b742ab738d042314e00209f8fca94c8c704c891f23",
206 "notes": "" 203 "notes": ""
207 }, 204 },
208 "25": { 205 "25": {
209 "label": "AIM", 206 "label": "AIM",
210 "key": "8561ac421d845921978387b5e6b362750b57ed08feda8ec12b9378b69f67ceff", 207 "key": "8561ac421d845921978387b5e6b362750b57ed08feda8ec12b9378b69f67ceff",
211 "notes": "" 208 "notes": ""
212 }, 209 },
213 "26": { 210 "26": {
214 "label": "Anna Vespignani", 211 "label": "Anna Vespignani",
215 "key": "79a970af0d2d30643dc2db4d16757395c1f22c311919036c2a22b7581982144a", 212 "key": "79a970af0d2d30643dc2db4d16757395c1f22c311919036c2a22b7581982144a",
216 "notes": "" 213 "notes": ""
217 }, 214 },
218 "27": { 215 "27": {
219 "label": "Bloglines", 216 "label": "Bloglines",
220 "key": "fe81f4df8c42fd81c830f9af408e9b074e77fd430e26d0ee285844fe3b092aec", 217 "key": "fe81f4df8c42fd81c830f9af408e9b074e77fd430e26d0ee285844fe3b092aec",
221 "notes": "" 218 "notes": ""
222 }, 219 },
223 "28": { 220 "28": {
224 "label": "Bow.it", 221 "label": "Bow.it",
225 "key": "64a1a9fec99c9238dc8180a01484a1ccf5f50fcd6e9a95a52b8b49fb9ca00bdc", 222 "key": "64a1a9fec99c9238dc8180a01484a1ccf5f50fcd6e9a95a52b8b49fb9ca00bdc",
226 "notes": "" 223 "notes": ""
227 }, 224 },
228 "29": { 225 "29": {
229 "label": "GMail - feedback", 226 "label": "GMail - feedback",
230 "key": "fad310cb2e6152c3faf78b7183c99f3044f5d31ee364068b80580c271a7784ef", 227 "key": "fad310cb2e6152c3faf78b7183c99f3044f5d31ee364068b80580c271a7784ef",
231 "notes": "" 228 "notes": ""
232 }, 229 },
233 "30": { 230 "30": {
234 "label": "Fineco", 231 "label": "Fineco",
235 "key": "8f99de2635b5dad7987180bc0bff49947eb37cc75d6a5d1ee1f13ed7567465a3", 232 "key": "8f99de2635b5dad7987180bc0bff49947eb37cc75d6a5d1ee1f13ed7567465a3",
236 "notes": "" 233 "notes": ""
237 }, 234 },
238 "31": { 235 "31": {
239 "label": "mon.itor.us", 236 "label": "mon.itor.us",
240 "key": "d2aa7164007c5deac8bb73580a6ab0d051f747e801ecd30284eff725d0ffaba2", 237 "key": "d2aa7164007c5deac8bb73580a6ab0d051f747e801ecd30284eff725d0ffaba2",
241 "notes": "" 238 "notes": ""
242 }, 239 },
243 "32": { 240 "32": {
244 "label": "Lamba Probe - forum", 241 "label": "Lamba Probe - forum",
245 "key": "f73906817fddba4d8f816334cb2fd0cd5ae91bc29bce6a69fdd5cf98fc96911f", 242 "key": "f73906817fddba4d8f816334cb2fd0cd5ae91bc29bce6a69fdd5cf98fc96911f",
246 "notes": "" 243 "notes": ""
247 }, 244 },
248 "33": { 245 "33": {
249 "label": "MeasureMap", 246 "label": "MeasureMap",
250 "key": "2385ce9536ebb7863b6a4c8b1f5c428587e4d6420a4bbcd31b935cb00bbd768e", 247 "key": "2385ce9536ebb7863b6a4c8b1f5c428587e4d6420a4bbcd31b935cb00bbd768e",
251 "notes": "" 248 "notes": ""
252 }, 249 },
253 "34": { 250 "34": {
254 "label": "NGI - Squillo", 251 "label": "NGI - Squillo",
255 "key": "96f20c212be02fb38c8b2dfc83d8e864dd84dcb95297a7fecf9280e1e4dcffe3", 252 "key": "96f20c212be02fb38c8b2dfc83d8e864dd84dcb95297a7fecf9280e1e4dcffe3",
256 "notes": "" 253 "notes": ""
257 }, 254 },
258 "35": { 255 "35": {
259 "label": "NGI - F5", 256 "label": "NGI - F5",
260 "key": "00347769244b208647c24e6a64f8fa4213e97eb2135ecfcb277b341c28616a59", 257 "key": "00347769244b208647c24e6a64f8fa4213e97eb2135ecfcb277b341c28616a59",
261 "notes": "" 258 "notes": ""
262 }, 259 },
263 "36": { 260 "36": {
264 "label": "CVSdude", 261 "label": "CVSdude",
265 "key": "ed0ab5080a29eb1b20927142d21ab8f67b61c2c7b19623bb610af030dfd42c02", 262 "key": "ed0ab5080a29eb1b20927142d21ab8f67b61c2c7b19623bb610af030dfd42c02",
266 "notes": "" 263 "notes": ""
267 }, 264 },
268 "37": { 265 "37": {
269 "label": "Yahoo", 266 "label": "Yahoo",
270 "key": "6380a7655cd790d1f1e6f482e92ae04201568ff0cab887e65102e9396df1b86e", 267 "key": "6380a7655cd790d1f1e6f482e92ae04201568ff0cab887e65102e9396df1b86e",
271 "notes": "note" 268 "notes": "note"
272 } 269 }
273 }, 270 },
274 "directLogins": { 271 "directLogins": {
275 "1": { "record": "1", "label": "R@cine - WebMail", "favicon": "http://www.racine.ra.it/favicon.ico" }, 272 "1": { "record": "1", "label": "R@cine - WebMail", "favicon": "http://www.racine.ra.it/favicon.ico" },
276 "2": { "record": "2", "label": "Amazon sign in", "favicon": "http://www.amazon.com/favicon.ico" }, 273 "2": { "record": "2", "label": "Amazon sign in", "favicon": "http://www.amazon.com/favicon.ico" },
277 "3": { "record": "3", "label": "Aruba - hosting", "favicon": "http://hosting.aruba.it/favicon.ico" }, 274 "3": { "record": "3", "label": "Aruba - hosting", "favicon": "http://hosting.aruba.it/favicon.ico" },
278 "4": { "record": "4", "label": "Aruba - sql hosting", "favicon":"http://mysql.aruba.it/favicon.ico" }, 275 "4": { "record": "4", "label": "Aruba - sql hosting", "favicon":"http://mysql.aruba.it/favicon.ico" },
279 "5": { "record": "5", "label":"clipperz.com - blog", "favicon":"http://www.clipperz.com/favicon.ico" }, 276 "5": { "record": "5", "label":"clipperz.com - blog", "favicon":"http://www.clipperz.com/favicon.ico" },
280 "6": { "record":"6", "label":"DynDns - clipperz", "favicon":"http://www.dyndns.com/favicon.ico" }, 277 "6": { "record":"6", "label":"DynDns - clipperz", "favicon":"http://www.dyndns.com/favicon.ico" },
281 "7": { "record":"7", "label":"DynDns - gcsolaroli", "favicon":"http://www.dyndns.com/favicon.ico" }, 278 "7": { "record":"7", "label":"DynDns - gcsolaroli", "favicon":"http://www.dyndns.com/favicon.ico" },
282 "8":{"record":"8", "label":"GMail - giulio.cesare", "favicon":"http://www.google.com/favicon.ico" }, 279 "8":{"record":"8", "label":"GMail - giulio.cesare", "favicon":"http://www.google.com/favicon.ico" },
283 "9":{"record":"9", "label":"Il manifesto", "favicon":"http://abbonati.ilmanifesto.it/favicon.ico" }, 280 "9":{"record":"9", "label":"Il manifesto", "favicon":"http://abbonati.ilmanifesto.it/favicon.ico" },
284 "10":{"record":"10", "label":"Imap4All.com - account", "favicon":"http://www.imap4all.com/favicon.ico" }, 281 "10":{"record":"10", "label":"Imap4All.com - account", "favicon":"http://www.imap4all.com/favicon.ico" },
285 "11":{"record":"12", "label":"Imap4all.com - WebMail", "favicon":"http://webmail.imap4all.com/favicon.ico" }, 282 "11":{"record":"12", "label":"Imap4all.com - WebMail", "favicon":"http://webmail.imap4all.com/favicon.ico" },
286 "13":{"record":"13", "label":"YouTube [no]", "favicon":"http://www.youtube.com/favicon.ico" }, 283 "13":{"record":"13", "label":"YouTube [no]", "favicon":"http://www.youtube.com/favicon.ico" },
287 "14":{"record":"14", "label":"Apple Store - Italia", "favicon":"http://store.apple.com/favicon.ico" }, 284 "14":{"record":"14", "label":"Apple Store - Italia", "favicon":"http://store.apple.com/favicon.ico" },
288 "15":{"record":"15", "label":"3nity", "favicon":"http://www.3nity.de/favicon.ico" }, 285 "15":{"record":"15", "label":"3nity", "favicon":"http://www.3nity.de/favicon.ico" },
289 "16":{"record":"16", "label":"ACM Web Account", "favicon":"http://portal.acm.org/favicon.ico" }, 286 "16":{"record":"16", "label":"ACM Web Account", "favicon":"http://portal.acm.org/favicon.ico" },
290 "17":{"record":"17", "label":"Adobe - Sign In", "favicon":"http://www.adobe.com/favicon.ico" }, 287 "17":{"record":"17", "label":"Adobe - Sign In", "favicon":"http://www.adobe.com/favicon.ico" },
291 "18":{"record":"18", "label":"Agatra [no]", "favicon":"http://www.agatra.com/favicon.ico" }, 288 "18":{"record":"18", "label":"Agatra [no]", "favicon":"http://www.agatra.com/favicon.ico" },
292 "19":{"record":"19", "label":"AIM [no]", "favicon":"http://my.screenname.aol.com/favicon.ico" }, 289 "19":{"record":"19", "label":"AIM [no]", "favicon":"http://my.screenname.aol.com/favicon.ico" },
293 "20":{"record":"20", "label":"Bloglines", "favicon":"http://www.bloglines.com/favicon.ico" }, 290 "20":{"record":"20", "label":"Bloglines", "favicon":"http://www.bloglines.com/favicon.ico" },
294 "21":{"record":"21", "label":"Bow.it", "favicon":"http://www.bow.it/favicon.ico" }, 291 "21":{"record":"21", "label":"Bow.it", "favicon":"http://www.bow.it/favicon.ico" },
295 "22":{"record":"22", "label":"GMail - Clipperz", "favicon":"http://www.google.com/favicon.ico" }, 292 "22":{"record":"22", "label":"GMail - Clipperz", "favicon":"http://www.google.com/favicon.ico" },
296 "23":{"record":"23", "label":"GMail - feedback", "favicon":"http://www.google.com/favicon.ico" }, 293 "23":{"record":"23", "label":"GMail - feedback", "favicon":"http://www.google.com/favicon.ico" },
297 "24":{"record":"24", "label":"Blogger", "favicon":"http://www.google.com/favicon.ico" }, 294 "24":{"record":"24", "label":"Blogger", "favicon":"http://www.google.com/favicon.ico" },
298 "25":{"record":"25", "label":"NewsGator", "favicon":"http://www.newsgator.com/favicon.ico" }, 295 "25":{"record":"25", "label":"NewsGator", "favicon":"http://www.newsgator.com/favicon.ico" },
299 "26":{"record":"26", "label":"Lambda Probe - forum", "favicon":"http://www.lambdaprobe.org/favicon.ico" }, 296 "26":{"record":"26", "label":"Lambda Probe - forum", "favicon":"http://www.lambdaprobe.org/favicon.ico" },
300 "27":{"record":"27", "label":"Measure Map", "favicon":"http://alpha.measuremap.com/favicon.ico" }, 297 "27":{"record":"27", "label":"Measure Map", "favicon":"http://alpha.measuremap.com/favicon.ico" },
301 "28":{"record":"28", "label":"NGI - Squillo", "favicon":"http://www.ngi.it/favicon.ico" }, 298 "28":{"record":"28", "label":"NGI - Squillo", "favicon":"http://www.ngi.it/favicon.ico" },
302 "29":{"record":"29", "label":"NGI - F5", "favicon":"http://www.ngi.it/favicon.ico" }, 299 "29":{"record":"29", "label":"NGI - F5", "favicon":"http://www.ngi.it/favicon.ico" },
303 "30":{"record":"30", "label":"Yahoo! Mail", "favicon":"http://login.yahoo.com/favicon.ico"} 300 "30":{"record":"30", "label":"Yahoo! Mail", "favicon":"http://login.yahoo.com/favicon.ico"}
304 }, 301 },
305 "preferences":{"preferredLanguage":"en-US"} 302 "preferences":{"preferredLanguage":"en-US"}
306 } 303 }
307/* */ 304/* */
308 305
309//console.profile("encrypt 0.2"); 306//console.profile("encrypt 0.2");
310 encryptedText = Clipperz.PM.Crypto.encryptingFunctions.versions['0.2'].encrypt(password, plainText); 307 encryptedText = Clipperz.PM.Crypto.encryptingFunctions.versions['0.2'].encrypt(password, plainText);
311//console.profileEnd(); 308//console.profileEnd();
312//console.profile("decrypt"); 309//console.profile("decrypt");
313 //decryptedText = Clipperz.PM.Crypto.encryptingFunctions.versions['0.2'].decrypt(password, encryptedText); 310 //decryptedText = Clipperz.PM.Crypto.encryptingFunctions.versions['0.2'].decrypt(password, encryptedText);
314//console.profileEnd(); 311//console.profileEnd();
315 //is(MochiKit.Base.serializeJSON(decryptedText), MochiKit.Base.serializeJSON(plainText), "complex structure encrypted/decrypted"); 312 //is(MochiKit.Base.serializeJSON(decryptedText), MochiKit.Base.serializeJSON(plainText), "complex structure encrypted/decrypted");
316 313
317//console.profile("encrypt 0.3"); 314//console.profile("encrypt 0.3");
318 encryptedText = Clipperz.PM.Crypto.encryptingFunctions.versions['0.3'].encrypt(password, plainText); 315 encryptedText = Clipperz.PM.Crypto.encryptingFunctions.versions['0.3'].encrypt(password, plainText);
319//console.profileEnd(); 316//console.profileEnd();
320 decryptedText = Clipperz.PM.Crypto.encryptingFunctions.versions['0.3'].decrypt(password, encryptedText); 317 decryptedText = Clipperz.PM.Crypto.encryptingFunctions.versions['0.3'].decrypt(password, encryptedText);
321 is(MochiKit.Base.serializeJSON(decryptedText), MochiKit.Base.serializeJSON(plainText), "complex structure encrypted/decrypted"); 318 is(MochiKit.Base.serializeJSON(decryptedText), MochiKit.Base.serializeJSON(plainText), "complex structure encrypted/decrypted");
322 319
323 320
324//############################################################################# 321//#############################################################################
325 322
326} catch (err) { 323} catch (err) {
327 324
328 var s = "test suite failure!\n"; 325 var s = "test suite failure!\n";
329 var o = {}; 326 var o = {};
330 var k = null; 327 var k = null;
331 for (k in err) { 328 for (k in err) {
332 // ensure unique keys?! 329 // ensure unique keys?!
333 if (!o[k]) { 330 if (!o[k]) {
334 s += k + ": " + err[k] + "\n"; 331 s += k + ": " + err[k] + "\n";
335 o[k] = err[k]; 332 o[k] = err[k];
336 } 333 }
337 } 334 }
338 ok ( false, s ); 335 ok ( false, s );
339} 336}
340 337
341</script> 338</script>
342</pre> 339</pre>
343</body> 340</body>
344</html> 341</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/Base.html b/frontend/gamma/tests/tests/Clipperz/Crypto/Base.html
index 86fc49a..0ffcdb8 100644
--- a/frontend/gamma/tests/tests/Clipperz/Crypto/Base.html
+++ b/frontend/gamma/tests/tests/Clipperz/Crypto/Base.html
@@ -1,408 +1,405 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27--> 24-->
28 25
29<html> 26<html>
30<head> 27<head>
31 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 28 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
32 <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script> 29 <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script>
33 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> 30 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
34 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> 31 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
35 32
36 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> 33 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
37 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 34 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
38 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 35 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
39 36
40 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> 37 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
41 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> 38 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Functions.js'></script> 39 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Functions.js'></script>
43 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> 40 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
44 41
45</head> 42</head>
46<body> 43<body>
47<pre id="test"> 44<pre id="test">
48<script type="text/javascript"> 45<script type="text/javascript">
49try { 46try {
50 var secretKey; 47 var secretKey;
51 varpublicKey; 48 varpublicKey;
52 varplainString; 49 varplainString;
53 varencryptedString; 50 varencryptedString;
54 51
55 52
56 secretKey = "s3cr37k39"; 53 secretKey = "s3cr37k39";
57 plainString = "The Quick Brown Fox Jumps Over The Lazy Dog"; 54 plainString = "The Quick Brown Fox Jumps Over The Lazy Dog";
58 encryptedString = Clipperz.Crypto.Base.encryptUsingSecretKey(secretKey, plainString); 55 encryptedString = Clipperz.Crypto.Base.encryptUsingSecretKey(secretKey, plainString);
59 56
60 //------------------------------------------------------------------------- 57 //-------------------------------------------------------------------------
61 // 58 //
62 //Secret key encryption / decryption 59 //Secret key encryption / decryption
63 // 60 //
64 is (isUndefinedOrNull(encryptedString), false, "An encrypted string should not be empty"); 61 is (isUndefinedOrNull(encryptedString), false, "An encrypted string should not be empty");
65 is (plainString, Clipperz.Crypto.Base.decryptUsingSecretKey(secretKey, encryptedString), "I should be able to encrypt and then decrypt safely"); 62 is (plainString, Clipperz.Crypto.Base.decryptUsingSecretKey(secretKey, encryptedString), "I should be able to encrypt and then decrypt safely");
66 63
67 try { 64 try {
68 vardecryptedText; 65 vardecryptedText;
69 66
70 decryptedText = Clipperz.Crypto.Base.decryptUsingSecretKey("anotherKey", encryptedString); 67 decryptedText = Clipperz.Crypto.Base.decryptUsingSecretKey("anotherKey", encryptedString);
71 ok( false, "It should not be possible to decrypt a text with a different passphrase (decrypted text: " + decryptedText + ")" ); 68 ok( false, "It should not be possible to decrypt a text with a different passphrase (decrypted text: " + decryptedText + ")" );
72 } catch (e) { 69 } catch (e) {
73 ok( e instanceof Error, "Trying to decrypt a message with the wrong passphrase raised an error" ); 70 ok( e instanceof Error, "Trying to decrypt a message with the wrong passphrase raised an error" );
74 } 71 }
75 72
76 is (encryptedString == Clipperz.Crypto.Base.encryptUsingSecretKey(secretKey, plainString), false, "Two consecutive encryption of the same text should return different values"); 73 is (encryptedString == Clipperz.Crypto.Base.encryptUsingSecretKey(secretKey, plainString), false, "Two consecutive encryption of the same text should return different values");
77 74
78 secretKey = "trustno1"; 75 secretKey = "trustno1";
79 plainString = "59fed719f8959a468de367f77a33a7536d53b8e4d25ed49ccc89a94cd6899da90415623fb73386e9635034fb65ad5f248445a1c66703f760d64a8271ad342b1"; 76 plainString = "59fed719f8959a468de367f77a33a7536d53b8e4d25ed49ccc89a94cd6899da90415623fb73386e9635034fb65ad5f248445a1c66703f760d64a8271ad342b1";
80 encryptedString = Clipperz.Crypto.Base.encryptUsingSecretKey(secretKey, plainString); 77 encryptedString = Clipperz.Crypto.Base.encryptUsingSecretKey(secretKey, plainString);
81 is (plainString, Clipperz.Crypto.Base.decryptUsingSecretKey(secretKey, encryptedString), "I should be able to encrypt and then decrypt safely"); 78 is (plainString, Clipperz.Crypto.Base.decryptUsingSecretKey(secretKey, encryptedString), "I should be able to encrypt and then decrypt safely");
82 79
83 secretKey = "trustno1"; 80 secretKey = "trustno1";
84 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 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.";
85 encryptedString = Clipperz.Crypto.Base.encryptUsingSecretKey(secretKey, plainString); 82 encryptedString = Clipperz.Crypto.Base.encryptUsingSecretKey(secretKey, plainString);
86 is (plainString, Clipperz.Crypto.Base.decryptUsingSecretKey(secretKey, encryptedString), "I should be able to encrypt and then decrypt safely"); 83 is (plainString, Clipperz.Crypto.Base.decryptUsingSecretKey(secretKey, encryptedString), "I should be able to encrypt and then decrypt safely");
87 84
88 secretKey = "trustno1"; 85 secretKey = "trustno1";
89 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 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";
90 encryptedString = Clipperz.Crypto.Base.encryptUsingSecretKey(secretKey, plainString); 87 encryptedString = Clipperz.Crypto.Base.encryptUsingSecretKey(secretKey, plainString);
91 is (plainString, Clipperz.Crypto.Base.decryptUsingSecretKey(secretKey, encryptedString), "I should be able to encrypt and then decrypt safely"); 88 is (plainString, Clipperz.Crypto.Base.decryptUsingSecretKey(secretKey, encryptedString), "I should be able to encrypt and then decrypt safely");
92 89
93 //secretKey = "trustno1"; 90 //secretKey = "trustno1";
94 //plainString = "{}"; 91 //plainString = "{}";
95 // 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': {'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'}}}";
96 //plainString = "{'tags': {}, 'records': {'07a5a92fcb334f757998ba14f3251f126d038318b3ac5e584bd712804c548084': {'label': 'Un bel record', 'key': '2a3f261c20a6a98dcc82b13fba013130b759f20602b4b13c5760879e087482a4'}}}"; 93 //plainString = "{'tags': {}, 'records': {'07a5a92fcb334f757998ba14f3251f126d038318b3ac5e584bd712804c548084': {'label': 'Un bel record', 'key': '2a3f261c20a6a98dcc82b13fba013130b759f20602b4b13c5760879e087482a4'}}}";
97 //encryptedString = Clipperz.Crypto.Base.encryptUsingSecretKey(secretKey, plainString); 94 //encryptedString = Clipperz.Crypto.Base.encryptUsingSecretKey(secretKey, plainString);
98 //is(encryptedString, "{}", "encrypted value"); 95 //is(encryptedString, "{}", "encrypted value");
99 96
100 97
101 //secretKey = "trustno1"; 98 //secretKey = "trustno1";
102 //encryptedString = "0d43a4544424ffa519f2e43b7a46f703884fd94ff9879479563f6f252a573b253d3e77bc4f5f30f17bd11d2907718921ab8c9e1faccbe4314793fa323eb85eaf1bfbce5f7deea601e15b781782181cbff3c649dafef39abb70e8573e4f9be220f2286b01c3bd51d5c4a79b9d44a27be3b0994667302e301ca3dc074fb1bc7abc03d12b9e58ba0249435a120858c96e8ae99570718541499ab958a8fb92b63390be070ff61fc6ef107061693ab14c1915118cc6671ab7cf99b9cca553d6b5a7c314bffcd933e0a59f056d842a47cfe8571110b4764c5225443210d99b43b80a23c20fe953de3e1329d72cfb20139fe1ca"; 99 //encryptedString = "0d43a4544424ffa519f2e43b7a46f703884fd94ff9879479563f6f252a573b253d3e77bc4f5f30f17bd11d2907718921ab8c9e1faccbe4314793fa323eb85eaf1bfbce5f7deea601e15b781782181cbff3c649dafef39abb70e8573e4f9be220f2286b01c3bd51d5c4a79b9d44a27be3b0994667302e301ca3dc074fb1bc7abc03d12b9e58ba0249435a120858c96e8ae99570718541499ab958a8fb92b63390be070ff61fc6ef107061693ab14c1915118cc6671ab7cf99b9cca553d6b5a7c314bffcd933e0a59f056d842a47cfe8571110b4764c5225443210d99b43b80a23c20fe953de3e1329d72cfb20139fe1ca";
103 //plainString = Clipperz.Crypto.Base.decryptUsingSecretKey(secretKey, encryptedString); 100 //plainString = Clipperz.Crypto.Base.decryptUsingSecretKey(secretKey, encryptedString);
104 //is(plainString, "{}", "decrypted value"); 101 //is(plainString, "{}", "decrypted value");
105 102
106 //------------------------------------------------------------------------- 103 //-------------------------------------------------------------------------
107 // 104 //
108 //Java secret key encryption / JavaScript decryption 105 //Java secret key encryption / JavaScript decryption
109 // 106 //
110 secretKey = "s3cr37k39"; 107 secretKey = "s3cr37k39";
111 plainString = "The Quick Brown Fox Jumps Over The Lazy Dog"; 108 plainString = "The Quick Brown Fox Jumps Over The Lazy Dog";
112 encryptedString = "9be538c3dde4dfab9384c0ef71dc624299fbbe71be8d1fe8991fd6cae88a883cf459d7cd56913a2b69815782cf74d7ce5c2c08034661f7f8aa59cf420e913086896840ebb45102d44d733d32de2a7dc8"; 109 encryptedString = "9be538c3dde4dfab9384c0ef71dc624299fbbe71be8d1fe8991fd6cae88a883cf459d7cd56913a2b69815782cf74d7ce5c2c08034661f7f8aa59cf420e913086896840ebb45102d44d733d32de2a7dc8";
113 is (plainString, Clipperz.Crypto.Base.decryptUsingSecretKey(secretKey, encryptedString), "I should be able to encrypt and then decrypt safely"); 110 is (plainString, Clipperz.Crypto.Base.decryptUsingSecretKey(secretKey, encryptedString), "I should be able to encrypt and then decrypt safely");
114 111
115 //------------------------------------------------------------------------- 112 //-------------------------------------------------------------------------
116 // 113 //
117 //Public key encryption -> Private key decryption 114 //Public key encryption -> Private key decryption
118 // 115 //
119 { 116 {
120 varcleanKey; 117 varcleanKey;
121 vart1, t2; 118 vart1, t2;
122/* 119/*
123 // 120 //
124 // 128 121 // 128
125 // 122 //
126 cleanKey = "248d6a61d20638b8e5c026930c3e6039"; //a33ce45964ff2167f6ecedd419db06c1"; 123 cleanKey = "248d6a61d20638b8e5c026930c3e6039"; //a33ce45964ff2167f6ecedd419db06c1";
127 publicKey = Clipperz.Crypto.Base.publicKeyWithValues( 124 publicKey = Clipperz.Crypto.Base.publicKeyWithValues(
128 "10001", 125 "10001",
129 "202700adbd85e2d7182720c3a0ee19c1", 126 "202700adbd85e2d7182720c3a0ee19c1",
130 "30db31542ace0f7d37a629ee5eba28cb" 127 "30db31542ace0f7d37a629ee5eba28cb"
131 ); 128 );
132 encryptedString = Clipperz.Crypto.Base.encryptUsingPublicKey(publicKey, cleanKey); 129 encryptedString = Clipperz.Crypto.Base.encryptUsingPublicKey(publicKey, cleanKey);
133 130
134 is (isUndefinedOrNull(encryptedString), false, "An encrypted string is not empty - PUBLIC 128"); 131 is (isUndefinedOrNull(encryptedString), false, "An encrypted string is not empty - PUBLIC 128");
135 is (cleanKey, Clipperz.Crypto.Base.decryptUsingPrivateKey(publicKey, encryptedString), "I can encrypt and then decrypt safely - PUBLIC 128"); 132 is (cleanKey, Clipperz.Crypto.Base.decryptUsingPrivateKey(publicKey, encryptedString), "I can encrypt and then decrypt safely - PUBLIC 128");
136 isnt (cleanKey, Clipperz.Crypto.Base.decryptUsingPublicKey(publicKey, encryptedString), "I should not be able to decrypt using again th public key - PUBLIC 128"); 133 isnt (cleanKey, Clipperz.Crypto.Base.decryptUsingPublicKey(publicKey, encryptedString), "I should not be able to decrypt using again th public key - PUBLIC 128");
137*/ 134*/
138/* 135/*
139 // 136 //
140 // 256 137 // 256
141 // 138 //
142 cleanKey = "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1"; 139 cleanKey = "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1";
143 cleanKey = "a3c2863242653caf566b02d8be5d6eb6c816ac212378bcec7ff2bdce8e2ec709"; 140 cleanKey = "a3c2863242653caf566b02d8be5d6eb6c816ac212378bcec7ff2bdce8e2ec709";
144 publicKey = Clipperz.Crypto.Base.publicKeyWithValues( 141 publicKey = Clipperz.Crypto.Base.publicKeyWithValues(
145 "10001", 142 "10001",
146 "8064edb1f26944f6bec2b68789db7ffd08b074d0953b76feca71dc8265c60e9", 143 "8064edb1f26944f6bec2b68789db7ffd08b074d0953b76feca71dc8265c60e9",
147 "2687f5ac6c70f9cab32fcbded7059502f4c7cc95fc3e09a560c68975ac4bf5e3" 144 "2687f5ac6c70f9cab32fcbded7059502f4c7cc95fc3e09a560c68975ac4bf5e3"
148 ); 145 );
149 encryptedString = Clipperz.Crypto.Base.encryptUsingPublicKey(publicKey, cleanKey); 146 encryptedString = Clipperz.Crypto.Base.encryptUsingPublicKey(publicKey, cleanKey);
150 147
151 is (isUndefinedOrNull(encryptedString), false, "An encrypted string is not empty - PUBLIC 256"); 148 is (isUndefinedOrNull(encryptedString), false, "An encrypted string is not empty - PUBLIC 256");
152 is (cleanKey, Clipperz.Crypto.Base.decryptUsingPrivateKey(publicKey, encryptedString), "I can encrypt and then decrypt safely - PUBLIC 256"); 149 is (cleanKey, Clipperz.Crypto.Base.decryptUsingPrivateKey(publicKey, encryptedString), "I can encrypt and then decrypt safely - PUBLIC 256");
153 isnt (cleanKey, Clipperz.Crypto.Base.decryptUsingPublicKey(publicKey, encryptedString), "I should not be able to decrypt using again th public key - PUBLIC 256"); 150 isnt (cleanKey, Clipperz.Crypto.Base.decryptUsingPublicKey(publicKey, encryptedString), "I should not be able to decrypt using again th public key - PUBLIC 256");
154*/ 151*/
155/* 152/*
156 // 153 //
157 //512 154 //512
158 // 155 //
159 cleanKey = "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1"; 156 cleanKey = "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1";
160 publicKey = Clipperz.Crypto.Base.publicKeyWithValues( 157 publicKey = Clipperz.Crypto.Base.publicKeyWithValues(
161 "10001", 158 "10001",
162 "59fed719f8959a468de367f77a33a7536d53b8e4d25ed49ccc89a94cd6899da90415623fb73386e9635034fb65ad5f248445a1c66703f760d64a8271ad342b1", 159 "59fed719f8959a468de367f77a33a7536d53b8e4d25ed49ccc89a94cd6899da90415623fb73386e9635034fb65ad5f248445a1c66703f760d64a8271ad342b1",
163 "8de7066f67be16fcacd05d319b6729cd85fe698c07cec504776146eb7a041d9e3cacbf0fcd86441981c0083eed1f8f1b18393f0b186e47ce1b7b4981417b491" 160 "8de7066f67be16fcacd05d319b6729cd85fe698c07cec504776146eb7a041d9e3cacbf0fcd86441981c0083eed1f8f1b18393f0b186e47ce1b7b4981417b491"
164 ); 161 );
165t1 = new Date().getTime(); 162t1 = new Date().getTime();
166 encryptedString = Clipperz.Crypto.Base.encryptUsingPublicKey(publicKey, cleanKey); 163 encryptedString = Clipperz.Crypto.Base.encryptUsingPublicKey(publicKey, cleanKey);
167t2 = new Date().getTime(); 164t2 = new Date().getTime();
168//is("Encrypting with public key (512)", (t2 - t1)); 165//is("Encrypting with public key (512)", (t2 - t1));
169 166
170 is (isUndefinedOrNull(encryptedString), false, "An encrypted string is not empty - PUBLIC 512"); 167 is (isUndefinedOrNull(encryptedString), false, "An encrypted string is not empty - PUBLIC 512");
171t1 = new Date().getTime(); 168t1 = new Date().getTime();
172 is (cleanKey, Clipperz.Crypto.Base.decryptUsingPrivateKey(publicKey, encryptedString), "I can encrypt and then decrypt safely - PUBLIC 512"); 169 is (cleanKey, Clipperz.Crypto.Base.decryptUsingPrivateKey(publicKey, encryptedString), "I can encrypt and then decrypt safely - PUBLIC 512");
173t2 = new Date().getTime(); 170t2 = new Date().getTime();
174//is("Decrypting with private key (512)", (t2 - t1)); 171//is("Decrypting with private key (512)", (t2 - t1));
175 isnt (cleanKey, Clipperz.Crypto.Base.decryptUsingPublicKey(publicKey, encryptedString), "I should not be able to decrypt using again th public key - PUBLIC 512"); 172 isnt (cleanKey, Clipperz.Crypto.Base.decryptUsingPublicKey(publicKey, encryptedString), "I should not be able to decrypt using again th public key - PUBLIC 512");
176*/ 173*/
177/* 174/*
178 // 175 //
179 //1024 176 //1024
180 // 177 //
181 cleanKey = "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1"; 178 cleanKey = "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1";
182 publicKey = Clipperz.Crypto.Base.publicKeyWithValues( 179 publicKey = Clipperz.Crypto.Base.publicKeyWithValues(
183 "10001", 180 "10001",
184 "12e8da920d4599458e84ec5ef1656161807f427d05eb79182b7418259d6f6c14364d1f5caf9130c8d9d9d6ea71d1bdbc87781a46a16bcb9e672814fed3b9c96ddffe0a1b0955ae68055c8f92fef518a04fc32a2ea8390e617cc5556a251f9ae9eee70a32e579cb3e9f298848a9b3aaf634f5930ffbf74473f7cb6c0cefee1751", 181 "12e8da920d4599458e84ec5ef1656161807f427d05eb79182b7418259d6f6c14364d1f5caf9130c8d9d9d6ea71d1bdbc87781a46a16bcb9e672814fed3b9c96ddffe0a1b0955ae68055c8f92fef518a04fc32a2ea8390e617cc5556a251f9ae9eee70a32e579cb3e9f298848a9b3aaf634f5930ffbf74473f7cb6c0cefee1751",
185 "130ebebd67b16a9ab2c53a437badbf8f01a80c750095a7fcfe95742c3d5ed1abb318babc5cb5d9350fee4da65ee074f65e1758117e6945f0fcfc8137528053ce9d1da8618890dee24e5e0bf8c87795bb1d09eddd544640824ee0dd0ea9fd908d27b0f8a1ae5c37f3647fbf2f5795500ad76c195b3387d0458a8f51b701472301" 182 "130ebebd67b16a9ab2c53a437badbf8f01a80c750095a7fcfe95742c3d5ed1abb318babc5cb5d9350fee4da65ee074f65e1758117e6945f0fcfc8137528053ce9d1da8618890dee24e5e0bf8c87795bb1d09eddd544640824ee0dd0ea9fd908d27b0f8a1ae5c37f3647fbf2f5795500ad76c195b3387d0458a8f51b701472301"
186 ); 183 );
187t1 = new Date().getTime(); 184t1 = new Date().getTime();
188 encryptedString = Clipperz.Crypto.Base.encryptUsingPublicKey(publicKey, cleanKey); 185 encryptedString = Clipperz.Crypto.Base.encryptUsingPublicKey(publicKey, cleanKey);
189t2 = new Date().getTime(); 186t2 = new Date().getTime();
190is("Encrypting with public key (1024)", (t2 - t1)); 187is("Encrypting with public key (1024)", (t2 - t1));
191 188
192 is (isUndefinedOrNull(encryptedString), false, "An encrypted string is not empty - PUBLIC 1024"); 189 is (isUndefinedOrNull(encryptedString), false, "An encrypted string is not empty - PUBLIC 1024");
193t1 = new Date().getTime(); 190t1 = new Date().getTime();
194 is (cleanKey, Clipperz.Crypto.Base.decryptUsingPrivateKey(publicKey, encryptedString), "I can encrypt and then decrypt safely - PUBLIC 1024"); 191 is (cleanKey, Clipperz.Crypto.Base.decryptUsingPrivateKey(publicKey, encryptedString), "I can encrypt and then decrypt safely - PUBLIC 1024");
195t2 = new Date().getTime(); 192t2 = new Date().getTime();
196is("Decrypting with private key (1024)", (t2 - t1)); 193is("Decrypting with private key (1024)", (t2 - t1));
197 isnt (cleanKey, Clipperz.Crypto.Base.decryptUsingPublicKey(publicKey, encryptedString), "I should not be able to decrypt using again th public key - PUBLIC 1024"); 194 isnt (cleanKey, Clipperz.Crypto.Base.decryptUsingPublicKey(publicKey, encryptedString), "I should not be able to decrypt using again th public key - PUBLIC 1024");
198*/ 195*/
199/* 196/*
200 // 197 //
201 //2048 198 //2048
202 // 199 //
203 cleanKey = "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1"; 200 cleanKey = "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1";
204 publicKey = Clipperz.Crypto.Base.publicKeyWithValues( 201 publicKey = Clipperz.Crypto.Base.publicKeyWithValues(
205 "10001", 202 "10001",
206 "409c6fe2b6474762b5c07f4e55ef80d174814dc1fb0fb58e979691116fb3dc433f759ff8a88d1a0f0666862b0b3758c54b7355fa87ee827369381e1f97c5d74944e032c7186b51a956fb49d6deb3aee0b2c7e65fc53bfd46d217764850667ed0363de143f3f3d06d5a0018693ad3dacdf78a18d037ceeccb7508776f27b30852b8b505666a8dca5bfbb455d2f85918f8b5295061c97673c78802c5f5cf4581c7215dc32af8dfb6fc10e9ba51fb5a88abab94157ccecf615e104a91a45e9bee072fe7b388344c1bbad4a8f7d5daeccbadf778d59eff2a491a067bba5343c5a094c61b575fe367ecfcc01c3d208c2f8c05b9496a929b2b72e70160d07d07f248f1", 203 "409c6fe2b6474762b5c07f4e55ef80d174814dc1fb0fb58e979691116fb3dc433f759ff8a88d1a0f0666862b0b3758c54b7355fa87ee827369381e1f97c5d74944e032c7186b51a956fb49d6deb3aee0b2c7e65fc53bfd46d217764850667ed0363de143f3f3d06d5a0018693ad3dacdf78a18d037ceeccb7508776f27b30852b8b505666a8dca5bfbb455d2f85918f8b5295061c97673c78802c5f5cf4581c7215dc32af8dfb6fc10e9ba51fb5a88abab94157ccecf615e104a91a45e9bee072fe7b388344c1bbad4a8f7d5daeccbadf778d59eff2a491a067bba5343c5a094c61b575fe367ecfcc01c3d208c2f8c05b9496a929b2b72e70160d07d07f248f1",
207 "9800012b1e533c2c28187424e1289fd4f7fe67487058f5ac7f27f18476c6c93db20b6d2c63d04ff310c1e7211cf8014adc006176529abc53fd1780274fc2629cf51d627c7465c3cbf4f110c3560e2128b97c4ea8a431f0b2a326fc31899790515ad45874ca75c68ee6695558736490ea895d598b8525bccab3156104d360b115ae25e99e9d899a2219136bad0336eeee0c6d725aa9c3b6b923c1ad95a9057b9deb7b563e05614acc800d9d8ec5de405d74feea722c5146feb80829508180ab5c80bf792b83f07c04c73ce0b3cf0d9f74aa92a4704819d103e58f5d4b8ca750148ba1cbab8eb55f92775b18da427c3a0b592809f3853274841a44b7129ec6a623" 204 "9800012b1e533c2c28187424e1289fd4f7fe67487058f5ac7f27f18476c6c93db20b6d2c63d04ff310c1e7211cf8014adc006176529abc53fd1780274fc2629cf51d627c7465c3cbf4f110c3560e2128b97c4ea8a431f0b2a326fc31899790515ad45874ca75c68ee6695558736490ea895d598b8525bccab3156104d360b115ae25e99e9d899a2219136bad0336eeee0c6d725aa9c3b6b923c1ad95a9057b9deb7b563e05614acc800d9d8ec5de405d74feea722c5146feb80829508180ab5c80bf792b83f07c04c73ce0b3cf0d9f74aa92a4704819d103e58f5d4b8ca750148ba1cbab8eb55f92775b18da427c3a0b592809f3853274841a44b7129ec6a623"
208 ); 205 );
209t1 = new Date().getTime(); 206t1 = new Date().getTime();
210 encryptedString = Clipperz.Crypto.Base.encryptUsingPublicKey(publicKey, cleanKey); 207 encryptedString = Clipperz.Crypto.Base.encryptUsingPublicKey(publicKey, cleanKey);
211t2 = new Date().getTime(); 208t2 = new Date().getTime();
212is("Encrypting with public key (2048)", (t2 - t1)); 209is("Encrypting with public key (2048)", (t2 - t1));
213 210
214 is (isUndefinedOrNull(encryptedString), false, "An encrypted string is not empty - PUBLIC 2048"); 211 is (isUndefinedOrNull(encryptedString), false, "An encrypted string is not empty - PUBLIC 2048");
215t1 = new Date().getTime(); 212t1 = new Date().getTime();
216 is (cleanKey, Clipperz.Crypto.Base.decryptUsingPrivateKey(publicKey, encryptedString), "I can encrypt and then decrypt safely - PUBLIC 2048"); 213 is (cleanKey, Clipperz.Crypto.Base.decryptUsingPrivateKey(publicKey, encryptedString), "I can encrypt and then decrypt safely - PUBLIC 2048");
217t2 = new Date().getTime(); 214t2 = new Date().getTime();
218is("Decrypting with private key (2048)", (t2 - t1)); 215is("Decrypting with private key (2048)", (t2 - t1));
219 isnt (cleanKey, Clipperz.Crypto.Base.decryptUsingPublicKey(publicKey, encryptedString), "I should not be able to decrypt using again th public key - PUBLIC 2048"); 216 isnt (cleanKey, Clipperz.Crypto.Base.decryptUsingPublicKey(publicKey, encryptedString), "I should not be able to decrypt using again th public key - PUBLIC 2048");
220*/ 217*/
221 } 218 }
222 219
223 //------------------------------------------------------------------------- 220 //-------------------------------------------------------------------------
224 // 221 //
225 //Private key encryption -> Public key decryption 222 //Private key encryption -> Public key decryption
226 // 223 //
227 { 224 {
228 varcleanKey; 225 varcleanKey;
229 vart1, t2; 226 vart1, t2;
230/* 227/*
231 // 228 //
232 // 128 229 // 128
233 // 230 //
234 cleanKey = "248d6a61d20638b8e5c026930c3e6039"; //a33ce45964ff2167f6ecedd419db06c1"; 231 cleanKey = "248d6a61d20638b8e5c026930c3e6039"; //a33ce45964ff2167f6ecedd419db06c1";
235 publicKey = Clipperz.Crypto.Base.publicKeyWithValues( 232 publicKey = Clipperz.Crypto.Base.publicKeyWithValues(
236 "10001", 233 "10001",
237 "202700adbd85e2d7182720c3a0ee19c1", 234 "202700adbd85e2d7182720c3a0ee19c1",
238 "30db31542ace0f7d37a629ee5eba28cb" 235 "30db31542ace0f7d37a629ee5eba28cb"
239 ); 236 );
240 encryptedString = Clipperz.Crypto.Base.encryptUsingPrivateKey(publicKey, cleanKey); 237 encryptedString = Clipperz.Crypto.Base.encryptUsingPrivateKey(publicKey, cleanKey);
241 238
242 is (isUndefinedOrNull(encryptedString), false, "An encrypted string is not empty - PRIVATE 128"); 239 is (isUndefinedOrNull(encryptedString), false, "An encrypted string is not empty - PRIVATE 128");
243 is (cleanKey, Clipperz.Crypto.Base.decryptUsingPublicKey(publicKey, encryptedString), "I can encrypt and then decrypt safely - PRIVATE 128"); 240 is (cleanKey, Clipperz.Crypto.Base.decryptUsingPublicKey(publicKey, encryptedString), "I can encrypt and then decrypt safely - PRIVATE 128");
244 isnt (cleanKey, Clipperz.Crypto.Base.decryptUsingPrivateKey(publicKey, encryptedString), "I should not be able to decrypt using again the private key - PRIVATE 128"); 241 isnt (cleanKey, Clipperz.Crypto.Base.decryptUsingPrivateKey(publicKey, encryptedString), "I should not be able to decrypt using again the private key - PRIVATE 128");
245*/ 242*/
246/* 243/*
247 // 244 //
248 // 256 245 // 256
249 // 246 //
250 cleanKey = "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1"; 247 cleanKey = "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1";
251 cleanKey = "a3c2863242653caf566b02d8be5d6eb6c816ac212378bcec7ff2bdce8e2ec709"; 248 cleanKey = "a3c2863242653caf566b02d8be5d6eb6c816ac212378bcec7ff2bdce8e2ec709";
252 publicKey = Clipperz.Crypto.Base.publicKeyWithValues( 249 publicKey = Clipperz.Crypto.Base.publicKeyWithValues(
253 "10001", 250 "10001",
254 "8064edb1f26944f6bec2b68789db7ffd08b074d0953b76feca71dc8265c60e9", 251 "8064edb1f26944f6bec2b68789db7ffd08b074d0953b76feca71dc8265c60e9",
255 "2687f5ac6c70f9cab32fcbded7059502f4c7cc95fc3e09a560c68975ac4bf5e3" 252 "2687f5ac6c70f9cab32fcbded7059502f4c7cc95fc3e09a560c68975ac4bf5e3"
256 ); 253 );
257 encryptedString = Clipperz.Crypto.Base.encryptUsingPrivateKey(publicKey, cleanKey); 254 encryptedString = Clipperz.Crypto.Base.encryptUsingPrivateKey(publicKey, cleanKey);
258 255
259 is (isUndefinedOrNull(encryptedString), false, "An encrypted string is not empty - PRIVATE 256"); 256 is (isUndefinedOrNull(encryptedString), false, "An encrypted string is not empty - PRIVATE 256");
260 is (cleanKey, Clipperz.Crypto.Base.decryptUsingPublicKey(publicKey, encryptedString), "I can encrypt and then decrypt safely - PRIVATE 256"); 257 is (cleanKey, Clipperz.Crypto.Base.decryptUsingPublicKey(publicKey, encryptedString), "I can encrypt and then decrypt safely - PRIVATE 256");
261 isnt (cleanKey, Clipperz.Crypto.Base.decryptUsingPrivateKey(publicKey, encryptedString), "I should not be able to decrypt using again the private key - PRIVATE 256"); 258 isnt (cleanKey, Clipperz.Crypto.Base.decryptUsingPrivateKey(publicKey, encryptedString), "I should not be able to decrypt using again the private key - PRIVATE 256");
262*/ 259*/
263/* 260/*
264 // 261 //
265 //512 262 //512
266 // 263 //
267 cleanKey = "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1"; 264 cleanKey = "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1";
268 publicKey = Clipperz.Crypto.Base.publicKeyWithValues( 265 publicKey = Clipperz.Crypto.Base.publicKeyWithValues(
269 "10001", 266 "10001",
270 "59fed719f8959a468de367f77a33a7536d53b8e4d25ed49ccc89a94cd6899da90415623fb73386e9635034fb65ad5f248445a1c66703f760d64a8271ad342b1", 267 "59fed719f8959a468de367f77a33a7536d53b8e4d25ed49ccc89a94cd6899da90415623fb73386e9635034fb65ad5f248445a1c66703f760d64a8271ad342b1",
271 "8de7066f67be16fcacd05d319b6729cd85fe698c07cec504776146eb7a041d9e3cacbf0fcd86441981c0083eed1f8f1b18393f0b186e47ce1b7b4981417b491" 268 "8de7066f67be16fcacd05d319b6729cd85fe698c07cec504776146eb7a041d9e3cacbf0fcd86441981c0083eed1f8f1b18393f0b186e47ce1b7b4981417b491"
272 ); 269 );
273t1 = new Date().getTime(); 270t1 = new Date().getTime();
274 encryptedString = Clipperz.Crypto.Base.encryptUsingPrivateKey(publicKey, cleanKey); 271 encryptedString = Clipperz.Crypto.Base.encryptUsingPrivateKey(publicKey, cleanKey);
275t2 = new Date().getTime(); 272t2 = new Date().getTime();
276//is("Encrypting with private key (512)", (t2 - t1)); 273//is("Encrypting with private key (512)", (t2 - t1));
277 274
278 is (isUndefinedOrNull(encryptedString), false, "An encrypted string is not empty - PRIVATE 512"); 275 is (isUndefinedOrNull(encryptedString), false, "An encrypted string is not empty - PRIVATE 512");
279t1 = new Date().getTime(); 276t1 = new Date().getTime();
280 is (cleanKey, Clipperz.Crypto.Base.decryptUsingPublicKey(publicKey, encryptedString), "I can encrypt and then decrypt safely - PRIVATE 512"); 277 is (cleanKey, Clipperz.Crypto.Base.decryptUsingPublicKey(publicKey, encryptedString), "I can encrypt and then decrypt safely - PRIVATE 512");
281t2 = new Date().getTime(); 278t2 = new Date().getTime();
282//is("Decrypting with public key (512)", (t2 - t1)); 279//is("Decrypting with public key (512)", (t2 - t1));
283 isnt (cleanKey, Clipperz.Crypto.Base.decryptUsingPrivateKey(publicKey, encryptedString), "I should not be able to decrypt using again th public key - PRIVATE 512"); 280 isnt (cleanKey, Clipperz.Crypto.Base.decryptUsingPrivateKey(publicKey, encryptedString), "I should not be able to decrypt using again th public key - PRIVATE 512");
284*/ 281*/
285/* 282/*
286 // 283 //
287 //1024 284 //1024
288 // 285 //
289 cleanKey = "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1"; 286 cleanKey = "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1";
290 publicKey = Clipperz.Crypto.Base.publicKeyWithValues( 287 publicKey = Clipperz.Crypto.Base.publicKeyWithValues(
291 "10001", 288 "10001",
292 "12e8da920d4599458e84ec5ef1656161807f427d05eb79182b7418259d6f6c14364d1f5caf9130c8d9d9d6ea71d1bdbc87781a46a16bcb9e672814fed3b9c96ddffe0a1b0955ae68055c8f92fef518a04fc32a2ea8390e617cc5556a251f9ae9eee70a32e579cb3e9f298848a9b3aaf634f5930ffbf74473f7cb6c0cefee1751", 289 "12e8da920d4599458e84ec5ef1656161807f427d05eb79182b7418259d6f6c14364d1f5caf9130c8d9d9d6ea71d1bdbc87781a46a16bcb9e672814fed3b9c96ddffe0a1b0955ae68055c8f92fef518a04fc32a2ea8390e617cc5556a251f9ae9eee70a32e579cb3e9f298848a9b3aaf634f5930ffbf74473f7cb6c0cefee1751",
293 "130ebebd67b16a9ab2c53a437badbf8f01a80c750095a7fcfe95742c3d5ed1abb318babc5cb5d9350fee4da65ee074f65e1758117e6945f0fcfc8137528053ce9d1da8618890dee24e5e0bf8c87795bb1d09eddd544640824ee0dd0ea9fd908d27b0f8a1ae5c37f3647fbf2f5795500ad76c195b3387d0458a8f51b701472301" 290 "130ebebd67b16a9ab2c53a437badbf8f01a80c750095a7fcfe95742c3d5ed1abb318babc5cb5d9350fee4da65ee074f65e1758117e6945f0fcfc8137528053ce9d1da8618890dee24e5e0bf8c87795bb1d09eddd544640824ee0dd0ea9fd908d27b0f8a1ae5c37f3647fbf2f5795500ad76c195b3387d0458a8f51b701472301"
294 ); 291 );
295t1 = new Date().getTime(); 292t1 = new Date().getTime();
296 encryptedString = Clipperz.Crypto.Base.encryptUsingPrivateKey(publicKey, cleanKey); 293 encryptedString = Clipperz.Crypto.Base.encryptUsingPrivateKey(publicKey, cleanKey);
297t2 = new Date().getTime(); 294t2 = new Date().getTime();
298is("Encrypting with private key (1024)", (t2 - t1)); 295is("Encrypting with private key (1024)", (t2 - t1));
299 296
300 is (isUndefinedOrNull(encryptedString), false, "An encrypted string is not empty - PRIVATE 1024"); 297 is (isUndefinedOrNull(encryptedString), false, "An encrypted string is not empty - PRIVATE 1024");
301t1 = new Date().getTime(); 298t1 = new Date().getTime();
302 is (cleanKey, Clipperz.Crypto.Base.decryptUsingPublicKey(publicKey, encryptedString), "I can encrypt and then decrypt safely - PRIVATE 1024"); 299 is (cleanKey, Clipperz.Crypto.Base.decryptUsingPublicKey(publicKey, encryptedString), "I can encrypt and then decrypt safely - PRIVATE 1024");
303t2 = new Date().getTime(); 300t2 = new Date().getTime();
304is("Decrypting with public key (1024)", (t2 - t1)); 301is("Decrypting with public key (1024)", (t2 - t1));
305 isnt (cleanKey, Clipperz.Crypto.Base.decryptUsingPrivateKey(publicKey, encryptedString), "I should not be able to decrypt using again th public key - PRIVATE 1024"); 302 isnt (cleanKey, Clipperz.Crypto.Base.decryptUsingPrivateKey(publicKey, encryptedString), "I should not be able to decrypt using again th public key - PRIVATE 1024");
306*/ 303*/
307/* 304/*
308 // 305 //
309 //2048 306 //2048
310 // 307 //
311 cleanKey = "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1"; 308 cleanKey = "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1";
312 publicKey = Clipperz.Crypto.Base.publicKeyWithValues( 309 publicKey = Clipperz.Crypto.Base.publicKeyWithValues(
313 "10001", 310 "10001",
314 "409c6fe2b6474762b5c07f4e55ef80d174814dc1fb0fb58e979691116fb3dc433f759ff8a88d1a0f0666862b0b3758c54b7355fa87ee827369381e1f97c5d74944e032c7186b51a956fb49d6deb3aee0b2c7e65fc53bfd46d217764850667ed0363de143f3f3d06d5a0018693ad3dacdf78a18d037ceeccb7508776f27b30852b8b505666a8dca5bfbb455d2f85918f8b5295061c97673c78802c5f5cf4581c7215dc32af8dfb6fc10e9ba51fb5a88abab94157ccecf615e104a91a45e9bee072fe7b388344c1bbad4a8f7d5daeccbadf778d59eff2a491a067bba5343c5a094c61b575fe367ecfcc01c3d208c2f8c05b9496a929b2b72e70160d07d07f248f1", 311 "409c6fe2b6474762b5c07f4e55ef80d174814dc1fb0fb58e979691116fb3dc433f759ff8a88d1a0f0666862b0b3758c54b7355fa87ee827369381e1f97c5d74944e032c7186b51a956fb49d6deb3aee0b2c7e65fc53bfd46d217764850667ed0363de143f3f3d06d5a0018693ad3dacdf78a18d037ceeccb7508776f27b30852b8b505666a8dca5bfbb455d2f85918f8b5295061c97673c78802c5f5cf4581c7215dc32af8dfb6fc10e9ba51fb5a88abab94157ccecf615e104a91a45e9bee072fe7b388344c1bbad4a8f7d5daeccbadf778d59eff2a491a067bba5343c5a094c61b575fe367ecfcc01c3d208c2f8c05b9496a929b2b72e70160d07d07f248f1",
315 "9800012b1e533c2c28187424e1289fd4f7fe67487058f5ac7f27f18476c6c93db20b6d2c63d04ff310c1e7211cf8014adc006176529abc53fd1780274fc2629cf51d627c7465c3cbf4f110c3560e2128b97c4ea8a431f0b2a326fc31899790515ad45874ca75c68ee6695558736490ea895d598b8525bccab3156104d360b115ae25e99e9d899a2219136bad0336eeee0c6d725aa9c3b6b923c1ad95a9057b9deb7b563e05614acc800d9d8ec5de405d74feea722c5146feb80829508180ab5c80bf792b83f07c04c73ce0b3cf0d9f74aa92a4704819d103e58f5d4b8ca750148ba1cbab8eb55f92775b18da427c3a0b592809f3853274841a44b7129ec6a623" 312 "9800012b1e533c2c28187424e1289fd4f7fe67487058f5ac7f27f18476c6c93db20b6d2c63d04ff310c1e7211cf8014adc006176529abc53fd1780274fc2629cf51d627c7465c3cbf4f110c3560e2128b97c4ea8a431f0b2a326fc31899790515ad45874ca75c68ee6695558736490ea895d598b8525bccab3156104d360b115ae25e99e9d899a2219136bad0336eeee0c6d725aa9c3b6b923c1ad95a9057b9deb7b563e05614acc800d9d8ec5de405d74feea722c5146feb80829508180ab5c80bf792b83f07c04c73ce0b3cf0d9f74aa92a4704819d103e58f5d4b8ca750148ba1cbab8eb55f92775b18da427c3a0b592809f3853274841a44b7129ec6a623"
316 ); 313 );
317t1 = new Date().getTime(); 314t1 = new Date().getTime();
318 encryptedString = Clipperz.Crypto.Base.encryptUsingPrivateKey(publicKey, cleanKey); 315 encryptedString = Clipperz.Crypto.Base.encryptUsingPrivateKey(publicKey, cleanKey);
319t2 = new Date().getTime(); 316t2 = new Date().getTime();
320is("Encrypting with private key (2048)", (t2 - t1)); 317is("Encrypting with private key (2048)", (t2 - t1));
321 318
322 is (isUndefinedOrNull(encryptedString), false, "An encrypted string is not empty - PRIVATE 2048"); 319 is (isUndefinedOrNull(encryptedString), false, "An encrypted string is not empty - PRIVATE 2048");
323t1 = new Date().getTime(); 320t1 = new Date().getTime();
324 is (cleanKey, Clipperz.Crypto.Base.decryptUsingPublicKey(publicKey, encryptedString), "I can encrypt and then decrypt safely - PRIVATE 2048"); 321 is (cleanKey, Clipperz.Crypto.Base.decryptUsingPublicKey(publicKey, encryptedString), "I can encrypt and then decrypt safely - PRIVATE 2048");
325t2 = new Date().getTime(); 322t2 = new Date().getTime();
326is("Decrypting with public key (2048)", (t2 - t1)); 323is("Decrypting with public key (2048)", (t2 - t1));
327 isnt (cleanKey, Clipperz.Crypto.Base.decryptUsingPrivateKey(publicKey, encryptedString), "I should not be able to decrypt using again th public key - PRIVATE 2048"); 324 isnt (cleanKey, Clipperz.Crypto.Base.decryptUsingPrivateKey(publicKey, encryptedString), "I should not be able to decrypt using again th public key - PRIVATE 2048");
328*/ 325*/
329 } 326 }
330 327
331 varoriginalMessage; 328 varoriginalMessage;
332 varprocessedMessage; 329 varprocessedMessage;
333 var expectedResult; 330 var expectedResult;
334 331
335 //------------------------------------------------------------------------- 332 //-------------------------------------------------------------------------
336 // 333 //
337 // HashSHA-256 334 // HashSHA-256
338 // 335 //
339 336
340 originalMessage = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"; 337 originalMessage = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq";
341 expectedResult = "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1"; 338 expectedResult = "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1";
342 processedMessage = Clipperz.Crypto.Base.computeHashValue(originalMessage); 339 processedMessage = Clipperz.Crypto.Base.computeHashValue(originalMessage);
343 is(processedMessage, expectedResult, ""); 340 is(processedMessage, expectedResult, "");
344 341
345 originalMessage = ""; 342 originalMessage = "";
346 expectedResult = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"; 343 expectedResult = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855";
347 processedMessage = Clipperz.Crypto.Base.computeHashValue(originalMessage); 344 processedMessage = Clipperz.Crypto.Base.computeHashValue(originalMessage);
348 is(processedMessage, expectedResult, ""); 345 is(processedMessage, expectedResult, "");
349 346
350 originalMessage = "abc"; 347 originalMessage = "abc";
351 expectedResult = "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad"; 348 expectedResult = "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad";
352 processedMessage = Clipperz.Crypto.Base.computeHashValue(originalMessage); 349 processedMessage = Clipperz.Crypto.Base.computeHashValue(originalMessage);
353 is(processedMessage, expectedResult, ""); 350 is(processedMessage, expectedResult, "");
354 351
355 originalMessage = "message digest"; 352 originalMessage = "message digest";
356 expectedResult = "f7846f55cf23e14eebeab5b4e1550cad5b509e3348fbc4efa3a1413d393cb650"; 353 expectedResult = "f7846f55cf23e14eebeab5b4e1550cad5b509e3348fbc4efa3a1413d393cb650";
357 processedMessage = Clipperz.Crypto.Base.computeHashValue(originalMessage); 354 processedMessage = Clipperz.Crypto.Base.computeHashValue(originalMessage);
358 is(processedMessage, expectedResult, ""); 355 is(processedMessage, expectedResult, "");
359 356
360 originalMessage = "secure hash algorithm"; 357 originalMessage = "secure hash algorithm";
361 expectedResult = "f30ceb2bb2829e79e4ca9753d35a8ecc00262d164cc077080295381cbd643f0d"; 358 expectedResult = "f30ceb2bb2829e79e4ca9753d35a8ecc00262d164cc077080295381cbd643f0d";
362 processedMessage = Clipperz.Crypto.Base.computeHashValue(originalMessage); 359 processedMessage = Clipperz.Crypto.Base.computeHashValue(originalMessage);
363 is(processedMessage, expectedResult, ""); 360 is(processedMessage, expectedResult, "");
364 361
365 originalMessage = "SHA256 is considered to be safe"; 362 originalMessage = "SHA256 is considered to be safe";
366 expectedResult = "6819d915c73f4d1e77e4e1b52d1fa0f9cf9beaead3939f15874bd988e2a23630"; 363 expectedResult = "6819d915c73f4d1e77e4e1b52d1fa0f9cf9beaead3939f15874bd988e2a23630";
367 processedMessage = Clipperz.Crypto.Base.computeHashValue(originalMessage); 364 processedMessage = Clipperz.Crypto.Base.computeHashValue(originalMessage);
368 is(processedMessage, expectedResult, ""); 365 is(processedMessage, expectedResult, "");
369 366
370 originalMessage = "For this sample, this 63-byte string will be used as input data"; 367 originalMessage = "For this sample, this 63-byte string will be used as input data";
371 expectedResult = "f08a78cbbaee082b052ae0708f32fa1e50c5c421aa772ba5dbb406a2ea6be342"; 368 expectedResult = "f08a78cbbaee082b052ae0708f32fa1e50c5c421aa772ba5dbb406a2ea6be342";
372 processedMessage = Clipperz.Crypto.Base.computeHashValue(originalMessage); 369 processedMessage = Clipperz.Crypto.Base.computeHashValue(originalMessage);
373 is(processedMessage, expectedResult, ""); 370 is(processedMessage, expectedResult, "");
374 371
375 originalMessage = "This is exactly 64 bytes long, not counting the terminating byte"; 372 originalMessage = "This is exactly 64 bytes long, not counting the terminating byte";
376 expectedResult = "ab64eff7e88e2e46165e29f2bce41826bd4c7b3552f6b382a9e7d3af47c245f8"; 373 expectedResult = "ab64eff7e88e2e46165e29f2bce41826bd4c7b3552f6b382a9e7d3af47c245f8";
377 processedMessage = Clipperz.Crypto.Base.computeHashValue(originalMessage); 374 processedMessage = Clipperz.Crypto.Base.computeHashValue(originalMessage);
378 is(processedMessage, expectedResult, ""); 375 is(processedMessage, expectedResult, "");
379 376
380 originalMessage = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut urna diam, vulputate quis, tempus vel, pretium in, mauris. Mauris aliquet sem a elit. Nunc molestie rutrum sem."; 377 originalMessage = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut urna diam, vulputate quis, tempus vel, pretium in, mauris. Mauris aliquet sem a elit. Nunc molestie rutrum sem.";
381 expectedResult = "528059709af4087fb8cd4427e291d89f24d8c0429b2a3b6fd152c32ce5b4680f"; 378 expectedResult = "528059709af4087fb8cd4427e291d89f24d8c0429b2a3b6fd152c32ce5b4680f";
382 processedMessage = Clipperz.Crypto.Base.computeHashValue(originalMessage); 379 processedMessage = Clipperz.Crypto.Base.computeHashValue(originalMessage);
383 is(processedMessage, expectedResult, ""); 380 is(processedMessage, expectedResult, "");
384 381
385 //------------------------------------------------------------------------- 382 //-------------------------------------------------------------------------
386 // 383 //
387 // HashMD5 384 // HashMD5
388 // 385 //
389 originalMessage = "59fed719f8959a468de367f77a33a7536d53b8e4d25ed49ccc89a94cd6899da9"; 386 originalMessage = "59fed719f8959a468de367f77a33a7536d53b8e4d25ed49ccc89a94cd6899da9";
390 expectedResult = "fde790d7da7d0d54a8db4ac500f1bbdb"; 387 expectedResult = "fde790d7da7d0d54a8db4ac500f1bbdb";
391 processedMessage = Clipperz.Crypto.Base.computeMD5HashValue(originalMessage); 388 processedMessage = Clipperz.Crypto.Base.computeMD5HashValue(originalMessage);
392 is(processedMessage, expectedResult, ""); 389 is(processedMessage, expectedResult, "");
393 390
394 391
395 392
396 393
397 //------------------------------------------------------------------------- 394 //-------------------------------------------------------------------------
398 // 395 //
399 //Random seed 396 //Random seed
400 // 397 //
401 varrandomSeed; 398 varrandomSeed;
402 399
403 randomSeed = Clipperz.Crypto.Base.generateRandomSeed(); 400 randomSeed = Clipperz.Crypto.Base.generateRandomSeed();
404 is(randomSeed.length, 64, ""); 401 is(randomSeed.length, 64, "");
405 402
406 ok(randomSeed != Clipperz.Crypto.Base.generateRandomSeed(), ""); 403 ok(randomSeed != Clipperz.Crypto.Base.generateRandomSeed(), "");
407 404
408//############################################################################# 405//#############################################################################
diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/BigInt.html b/frontend/gamma/tests/tests/Clipperz/Crypto/BigInt.html
index bdb0cbc..b970a9a 100644
--- a/frontend/gamma/tests/tests/Clipperz/Crypto/BigInt.html
+++ b/frontend/gamma/tests/tests/Clipperz/Crypto/BigInt.html
@@ -1,408 +1,405 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27--> 24-->
28 25
29<html> 26<html>
30<head> 27<head>
31 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 28 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
32 <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script> 29 <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script>
33 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> 30 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
34 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> 31 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
35 32
36 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> 33 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
37 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script> 34 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
38 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 35 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
39 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 36 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
40 37
41 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> 38 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> 39 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
43 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Functions.js'></script> 40 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Functions.js'></script>
44</head> 41</head>
45<body> 42<body>
46<pre id="test"> 43<pre id="test">
47<script type="text/javascript"> 44<script type="text/javascript">
48try { 45try {
49 varbigInt_1; 46 varbigInt_1;
50 varbigInt_2; 47 varbigInt_2;
51 varresult; 48 varresult;
52 varexpectedResult; 49 varexpectedResult;
53 50
54 // 51 //
55 //Constructur and equality test 52 //Constructur and equality test
56 // 53 //
57 bigInt_1 = new Clipperz.Crypto.BigInt("110"); 54 bigInt_1 = new Clipperz.Crypto.BigInt("110");
58 is (bigInt_1.equals(bigInt_1), true, ""); 55 is (bigInt_1.equals(bigInt_1), true, "");
59 56
60 bigInt_1 = new Clipperz.Crypto.BigInt("110"); 57 bigInt_1 = new Clipperz.Crypto.BigInt("110");
61 bigInt_2 = new Clipperz.Crypto.BigInt("110", 10); 58 bigInt_2 = new Clipperz.Crypto.BigInt("110", 10);
62 is (bigInt_1.equals(bigInt_2), true, ""); 59 is (bigInt_1.equals(bigInt_2), true, "");
63 60
64 bigInt_1 = new Clipperz.Crypto.BigInt("110"); 61 bigInt_1 = new Clipperz.Crypto.BigInt("110");
65 bigInt_2 = new Clipperz.Crypto.BigInt(110); 62 bigInt_2 = new Clipperz.Crypto.BigInt(110);
66 is (bigInt_1.equals(bigInt_2), true, ""); 63 is (bigInt_1.equals(bigInt_2), true, "");
67 64
68 bigInt_1 = new Clipperz.Crypto.BigInt(6); 65 bigInt_1 = new Clipperz.Crypto.BigInt(6);
69 bigInt_2 = new Clipperz.Crypto.BigInt("110", 2); 66 bigInt_2 = new Clipperz.Crypto.BigInt("110", 2);
70 is (bigInt_1.equals(bigInt_2), true, ""); 67 is (bigInt_1.equals(bigInt_2), true, "");
71 68
72 bigInt_1 = new Clipperz.Crypto.BigInt(6); 69 bigInt_1 = new Clipperz.Crypto.BigInt(6);
73 bigInt_2 = new Clipperz.Crypto.BigInt("110", 3); 70 bigInt_2 = new Clipperz.Crypto.BigInt("110", 3);
74 is (bigInt_1.equals(bigInt_2), false, ""); 71 is (bigInt_1.equals(bigInt_2), false, "");
75 72
76 73
77 // 74 //
78 //Addition test 75 //Addition test
79 // 76 //
80 bigInt_1 = new Clipperz.Crypto.BigInt(6); 77 bigInt_1 = new Clipperz.Crypto.BigInt(6);
81 bigInt_2 = new Clipperz.Crypto.BigInt(110); 78 bigInt_2 = new Clipperz.Crypto.BigInt(110);
82 result = bigInt_1.add(bigInt_2); 79 result = bigInt_1.add(bigInt_2);
83 expectedResult = new Clipperz.Crypto.BigInt(116); 80 expectedResult = new Clipperz.Crypto.BigInt(116);
84 is (result.equals(expectedResult), true, ""); 81 is (result.equals(expectedResult), true, "");
85 is (result.equals(Clipperz.Crypto.BigInt.add(bigInt_1, bigInt_2)), true, "instance method === static function"); 82 is (result.equals(Clipperz.Crypto.BigInt.add(bigInt_1, bigInt_2)), true, "instance method === static function");
86 83
87 bigInt_1 = new Clipperz.Crypto.BigInt(6); 84 bigInt_1 = new Clipperz.Crypto.BigInt(6);
88 result = bigInt_1.add(6); 85 result = bigInt_1.add(6);
89 expectedResult = new Clipperz.Crypto.BigInt(12); 86 expectedResult = new Clipperz.Crypto.BigInt(12);
90 is (result.equals(expectedResult), true, ""); 87 is (result.equals(expectedResult), true, "");
91 88
92 bigInt_1 = new Clipperz.Crypto.BigInt("16161616161616161616161616161616161616161616161616161"); 89 bigInt_1 = new Clipperz.Crypto.BigInt("16161616161616161616161616161616161616161616161616161");
93 bigInt_2 = new Clipperz.Crypto.BigInt("42424242424242424242424242424242424242424242424242424"); 90 bigInt_2 = new Clipperz.Crypto.BigInt("42424242424242424242424242424242424242424242424242424");
94 result = bigInt_1.add(bigInt_2); 91 result = bigInt_1.add(bigInt_2);
95 expectedResult = new Clipperz.Crypto.BigInt("58585858585858585858585858585858585858585858585858585"); 92 expectedResult = new Clipperz.Crypto.BigInt("58585858585858585858585858585858585858585858585858585");
96 is (result.equals(expectedResult), true, ""); 93 is (result.equals(expectedResult), true, "");
97 94
98 bigInt_1 = new Clipperz.Crypto.BigInt("16161616161616161616161616161616161616161616161616161"); 95 bigInt_1 = new Clipperz.Crypto.BigInt("16161616161616161616161616161616161616161616161616161");
99 bigInt_2 = new Clipperz.Crypto.BigInt("42424242424242424242424242424242424242424242424242424"); 96 bigInt_2 = new Clipperz.Crypto.BigInt("42424242424242424242424242424242424242424242424242424");
100 result = bigInt_1.add(bigInt_2); 97 result = bigInt_1.add(bigInt_2);
101 expectedResult = new Clipperz.Crypto.BigInt("58585858585858585858585851585858585858585858585858585"); 98 expectedResult = new Clipperz.Crypto.BigInt("58585858585858585858585851585858585858585858585858585");
102 is (result.equals(expectedResult), false, ""); 99 is (result.equals(expectedResult), false, "");
103 100
104 bigInt_1 = new Clipperz.Crypto.BigInt("86161616161616161616161616161616161616161616161616161"); 101 bigInt_1 = new Clipperz.Crypto.BigInt("86161616161616161616161616161616161616161616161616161");
105 bigInt_2 = new Clipperz.Crypto.BigInt("42424242424242424242424242424242424242424242424242424"); 102 bigInt_2 = new Clipperz.Crypto.BigInt("42424242424242424242424242424242424242424242424242424");
106 result = bigInt_1.add(bigInt_2); 103 result = bigInt_1.add(bigInt_2);
107 expectedResult = new Clipperz.Crypto.BigInt("128585858585858585858585858585858585858585858585858585"); 104 expectedResult = new Clipperz.Crypto.BigInt("128585858585858585858585858585858585858585858585858585");
108 is (result.equals(expectedResult), true, ""); 105 is (result.equals(expectedResult), true, "");
109 106
110 bigInt_1 = new Clipperz.Crypto.BigInt("6541652165410321654063516540621063540654" + 107 bigInt_1 = new Clipperz.Crypto.BigInt("6541652165410321654063516540621063540654" +
111 "0654065106540654165416521654103216540635" + 108 "0654065106540654165416521654103216540635" +
112 "1654062106354065406540651065406541"); 109 "1654062106354065406540651065406541");
113 bigInt_2 = new Clipperz.Crypto.BigInt("3046540351035403510354035103510351351351" + 110 bigInt_2 = new Clipperz.Crypto.BigInt("3046540351035403510354035103510351351351" +
114 "0351350435103213540634132135401351035403" + 111 "0351350435103213540634132135401351035403" +
115 "5403540354103540"); 112 "5403540354103540");
116 result = bigInt_1.add(bigInt_2); 113 result = bigInt_1.add(bigInt_2);
117 expectedResult = new Clipperz.Crypto.BigInt("6541652165410321657110056891656467051008" + 114 expectedResult = new Clipperz.Crypto.BigInt("6541652165410321657110056891656467051008" +
118 "1005100210054167675767872089206430081269" + 115 "1005100210054167675767872089206430081269" +
119 "2975416119864419441944191419510081"); 116 "2975416119864419441944191419510081");
120 is (result.equals(expectedResult), true, ""); 117 is (result.equals(expectedResult), true, "");
121 118
122 119
123 // 120 //
124 //Moltiplication test 121 //Moltiplication test
125 // 122 //
126 bigInt_1 = new Clipperz.Crypto.BigInt(6); 123 bigInt_1 = new Clipperz.Crypto.BigInt(6);
127 bigInt_2 = new Clipperz.Crypto.BigInt(110); 124 bigInt_2 = new Clipperz.Crypto.BigInt(110);
128 result = bigInt_1.multiply(bigInt_2); 125 result = bigInt_1.multiply(bigInt_2);
129 expectedResult = new Clipperz.Crypto.BigInt(660); 126 expectedResult = new Clipperz.Crypto.BigInt(660);
130 is (result.equals(expectedResult), true, ""); 127 is (result.equals(expectedResult), true, "");
131 128
132 bigInt_1 = new Clipperz.Crypto.BigInt(6); 129 bigInt_1 = new Clipperz.Crypto.BigInt(6);
133 result = bigInt_1.multiply(5); 130 result = bigInt_1.multiply(5);
134 expectedResult = new Clipperz.Crypto.BigInt(30); 131 expectedResult = new Clipperz.Crypto.BigInt(30);
135 is (result.equals(expectedResult), true, ""); 132 is (result.equals(expectedResult), true, "");
136 133
137 bigInt_1 = new Clipperz.Crypto.BigInt("5465465165465465132743540354354032135463" + 134 bigInt_1 = new Clipperz.Crypto.BigInt("5465465165465465132743540354354032135463" +
138 "5435135403513516843052413543054035"); 135 "5435135403513516843052413543054035");
139 bigInt_2 = new Clipperz.Crypto.BigInt("3543513543543213543032135435413054365430" + 136 bigInt_2 = new Clipperz.Crypto.BigInt("3543513543543213543032135435413054365430" +
140 "5130513540351354354305435403"); 137 "5130513540351354354305435403");
141 result = bigInt_1.multiply(bigInt_2); 138 result = bigInt_1.multiply(bigInt_2);
142 expectedResult = new Clipperz.Crypto.BigInt("1936694983559052629352223965314822970014" + 139 expectedResult = new Clipperz.Crypto.BigInt("1936694983559052629352223965314822970014" +
143 "6364423657014976098029153153101751605574" + 140 "6364423657014976098029153153101751605574" +
144 "5077086464435601381095664357540911830059" + 141 "5077086464435601381095664357540911830059" +
145 "9503335163757031001105"); 142 "9503335163757031001105");
146 is (result.equals(expectedResult), true, ""); 143 is (result.equals(expectedResult), true, "");
147 144
148 // 145 //
149 //Module test 146 //Module test
150 // 147 //
151 bigInt_1 = new Clipperz.Crypto.BigInt(106); 148 bigInt_1 = new Clipperz.Crypto.BigInt(106);
152 bigInt_2 = new Clipperz.Crypto.BigInt(10); 149 bigInt_2 = new Clipperz.Crypto.BigInt(10);
153 result = bigInt_1.module(bigInt_2); 150 result = bigInt_1.module(bigInt_2);
154 expectedResult = new Clipperz.Crypto.BigInt(6); 151 expectedResult = new Clipperz.Crypto.BigInt(6);
155 is (result.equals(expectedResult), true, ""); 152 is (result.equals(expectedResult), true, "");
156 153
157 bigInt_1 = new Clipperz.Crypto.BigInt(106); 154 bigInt_1 = new Clipperz.Crypto.BigInt(106);
158 result = bigInt_1.module(10); 155 result = bigInt_1.module(10);
159 expectedResult = new Clipperz.Crypto.BigInt(6); 156 expectedResult = new Clipperz.Crypto.BigInt(6);
160 is (result.equals(expectedResult), true, ""); 157 is (result.equals(expectedResult), true, "");
161 158
162 bigInt_1 = new Clipperz.Crypto.BigInt("5465465465468468465468463541358438543513" + 159 bigInt_1 = new Clipperz.Crypto.BigInt("5465465465468468465468463541358438543513" +
163 "8543135435135423545624354235123512531235" + 160 "8543135435135423545624354235123512531235" +
164 "1356463543840351351305135435121354305413" + 161 "1356463543840351351305135435121354305413" +
165 "543"); 162 "543");
166 163
167 164
168 bigInt_2 = new Clipperz.Crypto.BigInt("3543543213543213540543545463542354385768" + 165 bigInt_2 = new Clipperz.Crypto.BigInt("3543543213543213540543545463542354385768" +
169 "512584354354215"); 166 "512584354354215");
170 result = bigInt_1.module(bigInt_2); 167 result = bigInt_1.module(bigInt_2);
171 expectedResult = new Clipperz.Crypto.BigInt("52689987206612998786765715819079250963638640081836513"); 168 expectedResult = new Clipperz.Crypto.BigInt("52689987206612998786765715819079250963638640081836513");
172 is (result.equals(expectedResult), true, ""); 169 is (result.equals(expectedResult), true, "");
173 170
174 // 171 //
175 //Power (Module) test 172 //Power (Module) test
176 // 173 //
177 bigInt_1 = new Clipperz.Crypto.BigInt(6); 174 bigInt_1 = new Clipperz.Crypto.BigInt(6);
178 bigInt_2 = new Clipperz.Crypto.BigInt(3); 175 bigInt_2 = new Clipperz.Crypto.BigInt(3);
179 result = bigInt_1.powerModule(bigInt_2, new Clipperz.Crypto.BigInt(1000)); 176 result = bigInt_1.powerModule(bigInt_2, new Clipperz.Crypto.BigInt(1000));
180 expectedResult = new Clipperz.Crypto.BigInt(216); 177 expectedResult = new Clipperz.Crypto.BigInt(216);
181 is (result.equals(expectedResult), true, ""); 178 is (result.equals(expectedResult), true, "");
182 179
183 bigInt_1 = new Clipperz.Crypto.BigInt(6); 180 bigInt_1 = new Clipperz.Crypto.BigInt(6);
184 result = bigInt_1.powerModule(3, 1000); 181 result = bigInt_1.powerModule(3, 1000);
185 expectedResult = new Clipperz.Crypto.BigInt(216); 182 expectedResult = new Clipperz.Crypto.BigInt(216);
186 is (result.equals(expectedResult), true, ""); 183 is (result.equals(expectedResult), true, "");
187 184
188 bigInt_1 = new Clipperz.Crypto.BigInt("354354354354687638546846846846846576876468746846846846"); 185 bigInt_1 = new Clipperz.Crypto.BigInt("354354354354687638546846846846846576876468746846846846");
189 bigInt_2 = new Clipperz.Crypto.BigInt("354"); 186 bigInt_2 = new Clipperz.Crypto.BigInt("354");
190 result = bigInt_1.powerModule(bigInt_2, new Clipperz.Crypto.BigInt("3543541354354354354354351354354351354354354354354354")); 187 result = bigInt_1.powerModule(bigInt_2, new Clipperz.Crypto.BigInt("3543541354354354354354351354354351354354354354354354"));
191 expectedResult = new Clipperz.Crypto.BigInt("1957028940698171231089373321334263118681605242465644"); 188 expectedResult = new Clipperz.Crypto.BigInt("1957028940698171231089373321334263118681605242465644");
192 is (result.equals(expectedResult), true, ""); 189 is (result.equals(expectedResult), true, "");
193 190
194 bigInt_1 = new Clipperz.Crypto.BigInt("e0f6c73cf1d3715a0d77dc3a4eb9c66c01d913c91bc22d9672d83958445424a1", 16); 191 bigInt_1 = new Clipperz.Crypto.BigInt("e0f6c73cf1d3715a0d77dc3a4eb9c66c01d913c91bc22d9672d83958445424a1", 16);
195 //is(bigInt_1.toString(16), "e0f6c73cf1d3715a0d77dc3a4eb9c66c01d913c91bc22d9672d83958445424a1", "IE bug"); 192 //is(bigInt_1.toString(16), "e0f6c73cf1d3715a0d77dc3a4eb9c66c01d913c91bc22d9672d83958445424a1", "IE bug");
196 is(bigInt_1.asString(16), "e0f6c73cf1d3715a0d77dc3a4eb9c66c01d913c91bc22d9672d83958445424a1", "fix for IE bug"); 193 is(bigInt_1.asString(16), "e0f6c73cf1d3715a0d77dc3a4eb9c66c01d913c91bc22d9672d83958445424a1", "fix for IE bug");
197 194
198 195
199 bigInt_1 = new Clipperz.Crypto.BigInt("000108cbbacda1f03ea9360301045434ec7d82ba150936df08a229cbb4832ce1", 16); 196 bigInt_1 = new Clipperz.Crypto.BigInt("000108cbbacda1f03ea9360301045434ec7d82ba150936df08a229cbb4832ce1", 16);
200 is(bigInt_1.asString(16, 64), "000108cbbacda1f03ea9360301045434ec7d82ba150936df08a229cbb4832ce1", "fix to ensure the string representation has a minimum fixed length"); 197 is(bigInt_1.asString(16, 64), "000108cbbacda1f03ea9360301045434ec7d82ba150936df08a229cbb4832ce1", "fix to ensure the string representation has a minimum fixed length");
201 198
202/* 199/*
203 // 200 //
204 //Comparison 201 //Comparison
205 // 202 //
206 bigInt_1 = new Clipperz.Crypto.BigInt("0", 10); 203 bigInt_1 = new Clipperz.Crypto.BigInt("0", 10);
207 bigInt_2 = new Clipperz.Crypto.BigInt("0", 10); 204 bigInt_2 = new Clipperz.Crypto.BigInt("0", 10);
208 is (bigInt_1.equals(bigInt_2), true, "bigInt(0) = bigInt(0)"); 205 is (bigInt_1.equals(bigInt_2), true, "bigInt(0) = bigInt(0)");
209 is (bigInt_1.equals(0), true, "bigInt(0) = 0"); 206 is (bigInt_1.equals(0), true, "bigInt(0) = 0");
210 207
211 bigInt_1 = new Clipperz.Crypto.BigInt("000108cbbacda1f03ea9360301045434ec7d82ba150936df08a229cbb4832ce1", 16); 208 bigInt_1 = new Clipperz.Crypto.BigInt("000108cbbacda1f03ea9360301045434ec7d82ba150936df08a229cbb4832ce1", 16);
212 is (bigInt_1.equals(bigInt_2), false, "bigInt(xxxxxx) != bigInt(0)"); 209 is (bigInt_1.equals(bigInt_2), false, "bigInt(xxxxxx) != bigInt(0)");
213 is (bigInt_1.equals(0), false, "bigInt(xxxxx) != 0"); 210 is (bigInt_1.equals(0), false, "bigInt(xxxxx) != 0");
214 211
215 bigInt_1 = new Clipperz.Crypto.BigInt("000108cbbacda1f03ea9360301045434ec7d82ba150936df08a229cbb4832ce1", 16); 212 bigInt_1 = new Clipperz.Crypto.BigInt("000108cbbacda1f03ea9360301045434ec7d82ba150936df08a229cbb4832ce1", 16);
216 bigInt_2 = new Clipperz.Crypto.BigInt("0", 16); 213 bigInt_2 = new Clipperz.Crypto.BigInt("0", 16);
217 is(bigInt_1.compare(bigInt_2), 1, "bigInt(xxxxxx) > bigInt(0)"); 214 is(bigInt_1.compare(bigInt_2), 1, "bigInt(xxxxxx) > bigInt(0)");
218 is(bigInt_2.compare(bigInt_1), -1, "bigInt(0) < bigInt(xxxx)"); 215 is(bigInt_2.compare(bigInt_1), -1, "bigInt(0) < bigInt(xxxx)");
219 216
220 bigInt_1 = new Clipperz.Crypto.BigInt("000108cbbacda1f03ea9360301045434ec7d82ba150936df08a229cbb4832ce1", 16); 217 bigInt_1 = new Clipperz.Crypto.BigInt("000108cbbacda1f03ea9360301045434ec7d82ba150936df08a229cbb4832ce1", 16);
221 bigInt_2 = new Clipperz.Crypto.BigInt("05", 16); 218 bigInt_2 = new Clipperz.Crypto.BigInt("05", 16);
222 is(bigInt_1.compare(bigInt_2), 1, "bigInt(xxxxxx) > bigInt(05)"); 219 is(bigInt_1.compare(bigInt_2), 1, "bigInt(xxxxxx) > bigInt(05)");
223 is(bigInt_2.compare(bigInt_1), -1, "bigInt(05) < bigInt(xxxx)"); 220 is(bigInt_2.compare(bigInt_1), -1, "bigInt(05) < bigInt(xxxx)");
224 221
225 bigInt_1 = new Clipperz.Crypto.BigInt("-10", 10); 222 bigInt_1 = new Clipperz.Crypto.BigInt("-10", 10);
226 bigInt_2 = new Clipperz.Crypto.BigInt("10", 10); 223 bigInt_2 = new Clipperz.Crypto.BigInt("10", 10);
227 is(bigInt_1.equals(bigInt_2), true, "bigInt(-10) - bigInt(10). No negative number are managed"); 224 is(bigInt_1.equals(bigInt_2), true, "bigInt(-10) - bigInt(10). No negative number are managed");
228 225
229 // 226 //
230 //XOR 227 //XOR
231 // 228 //
232 bigInt_1 = new Clipperz.Crypto.BigInt("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16); 229 bigInt_1 = new Clipperz.Crypto.BigInt("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16);
233 bigInt_2 = new Clipperz.Crypto.BigInt("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16); 230 bigInt_2 = new Clipperz.Crypto.BigInt("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16);
234 result = bigInt_1.xor(bigInt_2); 231 result = bigInt_1.xor(bigInt_2);
235 expectedResult = new Clipperz.Crypto.BigInt(0); 232 expectedResult = new Clipperz.Crypto.BigInt(0);
236 is(result.asString(16), expectedResult.asString(16), "a xor a = 0"); 233 is(result.asString(16), expectedResult.asString(16), "a xor a = 0");
237 234
238 // 235 //
239 bigInt_1 = new Clipperz.Crypto.BigInt("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16); 236 bigInt_1 = new Clipperz.Crypto.BigInt("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16);
240 bigInt_2 = new Clipperz.Crypto.BigInt("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b935ca495991b7852b855", 16); 237 bigInt_2 = new Clipperz.Crypto.BigInt("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b935ca495991b7852b855", 16);
241 result = bigInt_1.xor(bigInt_2); 238 result = bigInt_1.xor(bigInt_2);
242 expectedResult = new Clipperz.Crypto.BigInt('295147905179352825856'); 239 expectedResult = new Clipperz.Crypto.BigInt('295147905179352825856');
243 is(result.asString(16), expectedResult.asString(16), "single bit difference"); 240 is(result.asString(16), expectedResult.asString(16), "single bit difference");
244 241
245 // 242 //
246 bigInt_1 = new Clipperz.Crypto.BigInt("01", 16); 243 bigInt_1 = new Clipperz.Crypto.BigInt("01", 16);
247 bigInt_2 = new Clipperz.Crypto.BigInt("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b935ca495991b7852b855", 16); 244 bigInt_2 = new Clipperz.Crypto.BigInt("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b935ca495991b7852b855", 16);
248 result = bigInt_1.xor(bigInt_2); 245 result = bigInt_1.xor(bigInt_2);
249 expectedResult = new Clipperz.Crypto.BigInt('102987336249554097029535212322581322789799900648198034993674544906295017912404'); 246 expectedResult = new Clipperz.Crypto.BigInt('102987336249554097029535212322581322789799900648198034993674544906295017912404');
250 is(result.asString(16), expectedResult.asString(16), "01 xor value"); 247 is(result.asString(16), expectedResult.asString(16), "01 xor value");
251 248
252 // 249 //
253 bigInt_1 = new Clipperz.Crypto.BigInt("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16); 250 bigInt_1 = new Clipperz.Crypto.BigInt("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16);
254 bigInt_2 = new Clipperz.Crypto.BigInt("f3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16); 251 bigInt_2 = new Clipperz.Crypto.BigInt("f3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16);
255 result = bigInt_1.xor(bigInt_2); 252 result = bigInt_1.xor(bigInt_2);
256 expectedResult = new Clipperz.Crypto.BigInt('7237005577332262213973186563042994240829374041602535252466099000494570602496'); 253 expectedResult = new Clipperz.Crypto.BigInt('7237005577332262213973186563042994240829374041602535252466099000494570602496');
257 is(result.asString(16), expectedResult.asString(16), "first bit difference xor"); 254 is(result.asString(16), expectedResult.asString(16), "first bit difference xor");
258 255
259 256
260 // 257 //
261 //isBitSet 258 //isBitSet
262 // 259 //
263 bigInt_1 = new Clipperz.Crypto.BigInt("ff", 16); 260 bigInt_1 = new Clipperz.Crypto.BigInt("ff", 16);
264 result = bigInt_1.isBitSet(1); 261 result = bigInt_1.isBitSet(1);
265 expectedResult = true; 262 expectedResult = true;
266 is(result, expectedResult, "'ff'.isBitSet(1)"); 263 is(result, expectedResult, "'ff'.isBitSet(1)");
267 264
268 bigInt_1 = new Clipperz.Crypto.BigInt("f0", 16); 265 bigInt_1 = new Clipperz.Crypto.BigInt("f0", 16);
269 result = bigInt_1.isBitSet(1); 266 result = bigInt_1.isBitSet(1);
270 expectedResult = false; 267 expectedResult = false;
271 is(result, expectedResult, "'f0'.isBitSet(1)"); 268 is(result, expectedResult, "'f0'.isBitSet(1)");
272 269
273 bigInt_1 = new Clipperz.Crypto.BigInt("f0", 16); 270 bigInt_1 = new Clipperz.Crypto.BigInt("f0", 16);
274 result = bigInt_1.isBitSet(3); 271 result = bigInt_1.isBitSet(3);
275 expectedResult = false; 272 expectedResult = false;
276 is(result, expectedResult, "'f0'.isBitSet(3)"); 273 is(result, expectedResult, "'f0'.isBitSet(3)");
277 274
278 bigInt_1 = new Clipperz.Crypto.BigInt("f0", 16); 275 bigInt_1 = new Clipperz.Crypto.BigInt("f0", 16);
279 result = bigInt_1.isBitSet(4); 276 result = bigInt_1.isBitSet(4);
280 expectedResult = true; 277 expectedResult = true;
281 is(result, expectedResult, "'f0'.isBitSet(4)"); 278 is(result, expectedResult, "'f0'.isBitSet(4)");
282 279
283 bigInt_1 = new Clipperz.Crypto.BigInt("ff00", 16); 280 bigInt_1 = new Clipperz.Crypto.BigInt("ff00", 16);
284 result = bigInt_1.isBitSet(7); 281 result = bigInt_1.isBitSet(7);
285 expectedResult = false; 282 expectedResult = false;
286 is(result, expectedResult, "'ff00'.isBitSet(7)"); 283 is(result, expectedResult, "'ff00'.isBitSet(7)");
287 284
288 bigInt_1 = new Clipperz.Crypto.BigInt("ff00", 16); 285 bigInt_1 = new Clipperz.Crypto.BigInt("ff00", 16);
289 result = bigInt_1.isBitSet(8); 286 result = bigInt_1.isBitSet(8);
290 expectedResult = true; 287 expectedResult = true;
291 is(result, expectedResult, "'ff00'.isBitSet(8)"); 288 is(result, expectedResult, "'ff00'.isBitSet(8)");
292 289
293 // 290 //
294 bigInt_1 = new Clipperz.Crypto.BigInt("05000000000000", 16); 291 bigInt_1 = new Clipperz.Crypto.BigInt("05000000000000", 16);
295 result = bigInt_1.isBitSet(47); 292 result = bigInt_1.isBitSet(47);
296 expectedResult = false; 293 expectedResult = false;
297 is(result, expectedResult, "'05000000000000'.isBitSet(47)"); 294 is(result, expectedResult, "'05000000000000'.isBitSet(47)");
298 295
299 result = bigInt_1.isBitSet(48); 296 result = bigInt_1.isBitSet(48);
300 expectedResult = true; 297 expectedResult = true;
301 is(result, expectedResult, "'05000000000000'.isBitSet(48)"); 298 is(result, expectedResult, "'05000000000000'.isBitSet(48)");
302 299
303 result = bigInt_1.isBitSet(49); 300 result = bigInt_1.isBitSet(49);
304 expectedResult = false; 301 expectedResult = false;
305 is(result, expectedResult, "'05000000000000'.isBitSet(49)"); 302 is(result, expectedResult, "'05000000000000'.isBitSet(49)");
306 303
307 result = bigInt_1.isBitSet(50); 304 result = bigInt_1.isBitSet(50);
308 expectedResult = true; 305 expectedResult = true;
309 is(result, expectedResult, "'05000000000000'.isBitSet(50)"); 306 is(result, expectedResult, "'05000000000000'.isBitSet(50)");
310 307
311 result = bigInt_1.isBitSet(51); 308 result = bigInt_1.isBitSet(51);
312 expectedResult = false; 309 expectedResult = false;
313 is(result, expectedResult, "'05000000000000'.isBitSet(51)"); 310 is(result, expectedResult, "'05000000000000'.isBitSet(51)");
314 311
315 // 312 //
316 bigInt_1 = new Clipperz.Crypto.BigInt("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16); 313 bigInt_1 = new Clipperz.Crypto.BigInt("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16);
317 314
318 result = bigInt_1.isBitSet(52); 315 result = bigInt_1.isBitSet(52);
319 expectedResult = true; 316 expectedResult = true;
320 is(result, expectedResult, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(52)"); 317 is(result, expectedResult, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(52)");
321 318
322 result = bigInt_1.isBitSet(53); 319 result = bigInt_1.isBitSet(53);
323 expectedResult = false; 320 expectedResult = false;
324 is(result, expectedResult, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(53)"); 321 is(result, expectedResult, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(53)");
325 322
326 result = bigInt_1.isBitSet(54); 323 result = bigInt_1.isBitSet(54);
327 expectedResult = false; 324 expectedResult = false;
328 is(result, expectedResult, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(54)"); 325 is(result, expectedResult, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(54)");
329 326
330 result = bigInt_1.isBitSet(55); 327 result = bigInt_1.isBitSet(55);
331 expectedResult = true; 328 expectedResult = true;
332 is(result, expectedResult, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(55)"); 329 is(result, expectedResult, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(55)");
333 330
334 result = bigInt_1.isBitSet(56); 331 result = bigInt_1.isBitSet(56);
335 expectedResult = false; 332 expectedResult = false;
336 is(result, expectedResult, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(56)"); 333 is(result, expectedResult, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(56)");
337 334
338 result = bigInt_1.isBitSet(57); 335 result = bigInt_1.isBitSet(57);
339 expectedResult = false; 336 expectedResult = false;
340 is(result, expectedResult, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(57)"); 337 is(result, expectedResult, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(57)");
341 338
342 result = bigInt_1.isBitSet(58); 339 result = bigInt_1.isBitSet(58);
343 expectedResult = true; 340 expectedResult = true;
344 is(result, expectedResult, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(58)"); 341 is(result, expectedResult, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(58)");
345 342
346 result = bigInt_1.isBitSet(59); 343 result = bigInt_1.isBitSet(59);
347 expectedResult = false; 344 expectedResult = false;
348 is(result, expectedResult, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(59)"); 345 is(result, expectedResult, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(59)");
349 346
350 result = bigInt_1.isBitSet(60); 347 result = bigInt_1.isBitSet(60);
351 expectedResult = false; 348 expectedResult = false;
352 is(result, expectedResult, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(60)"); 349 is(result, expectedResult, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(60)");
353 350
354 // 351 //
355 //shiftLeft 352 //shiftLeft
356 // 353 //
357 bigInt_1 = new Clipperz.Crypto.BigInt("7f", 16); 354 bigInt_1 = new Clipperz.Crypto.BigInt("7f", 16);
358 result = bigInt_1.shiftLeft(1); 355 result = bigInt_1.shiftLeft(1);
359 expectedResult = new Clipperz.Crypto.BigInt('fe', 16); 356 expectedResult = new Clipperz.Crypto.BigInt('fe', 16);
360 is(result.asString(16), expectedResult.asString(16), "'7f'.shiftLeft(1)"); 357 is(result.asString(16), expectedResult.asString(16), "'7f'.shiftLeft(1)");
361 358
362 bigInt_1 = new Clipperz.Crypto.BigInt("ff", 16); 359 bigInt_1 = new Clipperz.Crypto.BigInt("ff", 16);
363 result = bigInt_1.shiftLeft(1); 360 result = bigInt_1.shiftLeft(1);
364 expectedResult = new Clipperz.Crypto.BigInt('01fe', 16); 361 expectedResult = new Clipperz.Crypto.BigInt('01fe', 16);
365 is(result.asString(16), expectedResult.asString(16), "'ff'.shiftLeft(1)"); 362 is(result.asString(16), expectedResult.asString(16), "'ff'.shiftLeft(1)");
366 363
367 bigInt_1 = new Clipperz.Crypto.BigInt("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16); 364 bigInt_1 = new Clipperz.Crypto.BigInt("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16);
368 result = bigInt_1.shiftLeft(2); 365 result = bigInt_1.shiftLeft(2);
369 expectedResult = new Clipperz.Crypto.BigInt('411949344998216388118140849290325291159199602592792139973517588004462660346196', 10); 366 expectedResult = new Clipperz.Crypto.BigInt('411949344998216388118140849290325291159199602592792139973517588004462660346196', 10);
370 is(result.asString(16), expectedResult.asString(16), "bigInt.shiftLeft(10)"); 367 is(result.asString(16), expectedResult.asString(16), "bigInt.shiftLeft(10)");
371 368
372 bigInt_1 = new Clipperz.Crypto.BigInt("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16); 369 bigInt_1 = new Clipperz.Crypto.BigInt("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16);
373 result = bigInt_1.shiftLeft(8); 370 result = bigInt_1.shiftLeft(8);
374 expectedResult = new Clipperz.Crypto.BigInt('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b85500', 16); 371 expectedResult = new Clipperz.Crypto.BigInt('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b85500', 16);
375 is(result.asString(16), expectedResult.asString(16), "bigInt.shiftLeft(8)"); 372 is(result.asString(16), expectedResult.asString(16), "bigInt.shiftLeft(8)");
376 373
377 bigInt_1 = new Clipperz.Crypto.BigInt("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16); 374 bigInt_1 = new Clipperz.Crypto.BigInt("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16);
378 result = bigInt_1.shiftLeft(10); 375 result = bigInt_1.shiftLeft(10);
379 expectedResult = new Clipperz.Crypto.BigInt('105459032319543395358244057418323274536755098263754787833220502529142441048626176', 10); 376 expectedResult = new Clipperz.Crypto.BigInt('105459032319543395358244057418323274536755098263754787833220502529142441048626176', 10);
380 is(result.asString(16), expectedResult.asString(16), "bigInt.shiftLeft(10)"); 377 is(result.asString(16), expectedResult.asString(16), "bigInt.shiftLeft(10)");
381 378
382 bigInt_1 = new Clipperz.Crypto.BigInt("ff", 16); 379 bigInt_1 = new Clipperz.Crypto.BigInt("ff", 16);
383 result = bigInt_1.shiftLeft(4096); 380 result = bigInt_1.shiftLeft(4096);
384 expectedResult = new Clipperz.Crypto.BigInt('266319164760353889206396941232739217557890883507082863997979538237408246532747151496450837043424377376926977212182012023686831226737377369852125202402098145876219029018646049576792205484267848170179157853023266287725961304046416750146445344507869587461686016719979944538177432428730245324189334334817497396705169439104855885416460935698516539852892760625369984672271807592980051379072961966267124963131928067770749329011150668180796667192392027523071601150548205543997146350727148885425131890513407882508735446345822174200042918879518190588482963417582471561436215675823872015307629566605147920139961896995509627341070659007877630760561618021922340198636222738900413041589858099507891702174848695380017286939422770656819923801325579542295611580916900945707539132241939193098989585491346846486694653352501301851631933610655701026861715541355665900384634131852357081890301147104554877895768806174478161952060916705243614916310627428392386264214492834954273769685672081818149530274447979003153864646452529328518204716201193108795473912970645455457215455929896570875795325190705652768977680951535622436287312272907838194995042100153360373621439300266297151905265332115434133380301670205335338558744799343198526203012170200626802804318535680', 10); 381 expectedResult = new Clipperz.Crypto.BigInt('266319164760353889206396941232739217557890883507082863997979538237408246532747151496450837043424377376926977212182012023686831226737377369852125202402098145876219029018646049576792205484267848170179157853023266287725961304046416750146445344507869587461686016719979944538177432428730245324189334334817497396705169439104855885416460935698516539852892760625369984672271807592980051379072961966267124963131928067770749329011150668180796667192392027523071601150548205543997146350727148885425131890513407882508735446345822174200042918879518190588482963417582471561436215675823872015307629566605147920139961896995509627341070659007877630760561618021922340198636222738900413041589858099507891702174848695380017286939422770656819923801325579542295611580916900945707539132241939193098989585491346846486694653352501301851631933610655701026861715541355665900384634131852357081890301147104554877895768806174478161952060916705243614916310627428392386264214492834954273769685672081818149530274447979003153864646452529328518204716201193108795473912970645455457215455929896570875795325190705652768977680951535622436287312272907838194995042100153360373621439300266297151905265332115434133380301670205335338558744799343198526203012170200626802804318535680', 10);
385 is(result.asString(16), expectedResult.asString(16), "bigInt.shiftLeft(4096)"); 382 is(result.asString(16), expectedResult.asString(16), "bigInt.shiftLeft(4096)");
386 383
387 bigInt_1 = new Clipperz.Crypto.BigInt("ff", 16); 384 bigInt_1 = new Clipperz.Crypto.BigInt("ff", 16);
388 result = bigInt_1.shiftLeft(5000); 385 result = bigInt_1.shiftLeft(5000);
389 expectedResult = new Clipperz.Crypto.BigInt('36017909319555363939297846508911757008556852467205798478749046189356513330989041570231272721076143922520578818149998351104871978707844731275672652360293180474918203352225676748028889909508585302690242044220987556901043359920075229167479636668489487021705618421769517884399224788393498408327257966673365451264730932480701037648195190724361287852846952667257156204462064385766889505990099642052739974651257588866645027017486311782036674195285521311468922365736517586569614071211079825802088151607502649165228246449902253708785396560087430392277977851200155957347440614508171640900912431375050142178348130480158080696562512167652410483775588091117019722112093545783277082149415339867358805673644654236371762589715111732737686904860620316822561292797144756685380676343141118415434643259498221414744450502163805872581378284735047416230112208369784803081434462030568662742790926051825877463257023387907801068796855629691810029349692983890802136654401365294584656484852908751516361546884362396124203127393434938355516740711953765305060269622960662047729516459906444429108776596594293559927265789943280929098971285454533928986078946124455350540187565506016643147748500262510780357259199808936108629893209819473029835119866186316144675107047007737043503194737001430981972314376700993832503282107582239603281145093446879837002884732470988727066207277180181469885503549870618810897831820650576980763622189213611885522245978572420535750015505830146119605502167931087454823309031494727688701857532561113118183883936890880', 10); 386 expectedResult = new Clipperz.Crypto.BigInt('36017909319555363939297846508911757008556852467205798478749046189356513330989041570231272721076143922520578818149998351104871978707844731275672652360293180474918203352225676748028889909508585302690242044220987556901043359920075229167479636668489487021705618421769517884399224788393498408327257966673365451264730932480701037648195190724361287852846952667257156204462064385766889505990099642052739974651257588866645027017486311782036674195285521311468922365736517586569614071211079825802088151607502649165228246449902253708785396560087430392277977851200155957347440614508171640900912431375050142178348130480158080696562512167652410483775588091117019722112093545783277082149415339867358805673644654236371762589715111732737686904860620316822561292797144756685380676343141118415434643259498221414744450502163805872581378284735047416230112208369784803081434462030568662742790926051825877463257023387907801068796855629691810029349692983890802136654401365294584656484852908751516361546884362396124203127393434938355516740711953765305060269622960662047729516459906444429108776596594293559927265789943280929098971285454533928986078946124455350540187565506016643147748500262510780357259199808936108629893209819473029835119866186316144675107047007737043503194737001430981972314376700993832503282107582239603281145093446879837002884732470988727066207277180181469885503549870618810897831820650576980763622189213611885522245978572420535750015505830146119605502167931087454823309031494727688701857532561113118183883936890880', 10);
390 is(result.asString(16), expectedResult.asString(16), "bigInt.shiftLeft(4096)"); 387 is(result.asString(16), expectedResult.asString(16), "bigInt.shiftLeft(4096)");
391 388
392 389
393 // 390 //
394 //BigInt compare vs ByteArray compare 391 //BigInt compare vs ByteArray compare
395 // 392 //
396 var bigInt_byteArray_1; 393 var bigInt_byteArray_1;
397 var bigInt_byteArray_2; 394 var bigInt_byteArray_2;
398 395
399 // 396 //
400 bigInt_1 = new Clipperz.Crypto.BigInt("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16); 397 bigInt_1 = new Clipperz.Crypto.BigInt("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16);
401 bigInt_2 = new Clipperz.Crypto.BigInt("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16); 398 bigInt_2 = new Clipperz.Crypto.BigInt("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16);
402 bitInt_byteArray_1 = bigInt_1.asByteArray(); 399 bitInt_byteArray_1 = bigInt_1.asByteArray();
403 bitInt_byteArray_2 = bigInt_2.asByteArray(); 400 bitInt_byteArray_2 = bigInt_2.asByteArray();
404 401
405 result = bigInt_1.compare(bigInt_2); 402 result = bigInt_1.compare(bigInt_2);
406 expectedResult = bitInt_byteArray_1.compare(bitInt_byteArray_2); 403 expectedResult = bitInt_byteArray_1.compare(bitInt_byteArray_2);
407 is(result, expectedResult, "equal compare"); 404 is(result, expectedResult, "equal compare");
408 405
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 ba98167..9ef9146 100644
--- a/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.B283.deferred.html
+++ b/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.B283.deferred.html
@@ -1,155 +1,152 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27--> 24-->
28 25
29<html> 26<html>
30<head> 27<head>
31<!-- - -> 28<!-- - ->
32 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 29 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
33<!- - --> 30<!- - -->
34<!-- --> 31<!-- -->
35 <script type="text/javascript" src="../../../../js/MochiKit/Base.js"></script> 32 <script type="text/javascript" src="../../../../js/MochiKit/Base.js"></script>
36 <script type="text/javascript" src="../../../../js/MochiKit/Async.js"></script> 33 <script type="text/javascript" src="../../../../js/MochiKit/Async.js"></script>
37 <script type="text/javascript" src="../../../../js/MochiKit/DOM.js"></script> 34 <script type="text/javascript" src="../../../../js/MochiKit/DOM.js"></script>
38 <script type="text/javascript" src="../../../../js/MochiKit/Logging.js"></script> 35 <script type="text/javascript" src="../../../../js/MochiKit/Logging.js"></script>
39 <script type="text/javascript" src="../../../../js/MochiKit/Iter.js"></script> 36 <script type="text/javascript" src="../../../../js/MochiKit/Iter.js"></script>
40<!-- --> 37<!-- -->
41 38
42<!-- - -> 39<!-- - ->
43 <script type="text/javascript" src="../../../../js/MochiKit/Style.js"></script> 40 <script type="text/javascript" src="../../../../js/MochiKit/Style.js"></script>
44 <script type="text/javascript" src="../../../../js/MochiKit/Signal.js"></script> 41 <script type="text/javascript" src="../../../../js/MochiKit/Signal.js"></script>
45 <script type="text/javascript" src="../../../../js/MochiKit/Color.js"></script> 42 <script type="text/javascript" src="../../../../js/MochiKit/Color.js"></script>
46 <script type="text/javascript" src="../../../../js/MochiKit/Position.js"></script> 43 <script type="text/javascript" src="../../../../js/MochiKit/Position.js"></script>
47 <script type="text/javascript" src="../../../../js/MochiKit/Visual.js"></script> 44 <script type="text/javascript" src="../../../../js/MochiKit/Visual.js"></script>
48<!- - --> 45<!- - -->
49 46
50 47
51 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> 48 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
52 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> 49 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
53 50
54<!--<script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>--> 51<!--<script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>-->
55<!--<script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>--> 52<!--<script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>-->
56<!--<script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>--> 53<!--<script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>-->
57 54
58 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Value.js'></script> 55 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Value.js'></script>
59 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Point.js'></script> 56 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Point.js'></script>
60 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/FiniteField.js'></script> 57 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/FiniteField.js'></script>
61 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Curve.js'></script> 58 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Curve.js'></script>
62 59
63 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/StandardCurves.js'></script> 60 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/StandardCurves.js'></script>
64 61
65</head> 62</head>
66<body> 63<body>
67<pre id="test"> 64<pre id="test">
68<script type="text/javascript"> 65<script type="text/javascript">
69try { 66try {
70 67
71 var deferredResult; 68 var deferredResult;
72 69
73 70
74 deferredResult = new MochiKit.Async.Deferred(); 71 deferredResult = new MochiKit.Async.Deferred();
75//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 1: " + res); return res;}); 72//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 1: " + res); return res;});
76 73
77 // 74 //
78 //ECC.Curve.multiplication 75 //ECC.Curve.multiplication
79 // 76 //
80 varcurve; 77 varcurve;
81 var f2m; 78 var f2m;
82 var f2m_improved; 79 var f2m_improved;
83 var value; 80 var value;
84 var moduledValue; 81 var moduledValue;
85 var result; 82 var result;
86 var result_improved; 83 var result_improved;
87 var expectedResul; 84 var expectedResul;
88 85
89 f2m = new Clipperz.Crypto.ECC.BinaryField.FiniteField({modulus:new Clipperz.Crypto.ECC.BinaryField.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 000010a1', 16)}) 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)})
90 f2m_improved = Clipperz.Crypto.ECC.StandardCurves.B283().finiteField(); 87 f2m_improved = Clipperz.Crypto.ECC.StandardCurves.B283().finiteField();
91 88
92 curve = Clipperz.Crypto.ECC.StandardCurves.B283(); 89 curve = Clipperz.Crypto.ECC.StandardCurves.B283();
93 90
94/** / 91/** /
95 value = new Clipperz.Crypto.ECC.BinaryField.Value("7b", 16); 92 value = new Clipperz.Crypto.ECC.BinaryField.Value("7b", 16);
96 result = curve.multiply(value, curve.G()); 93 result = curve.multiply(value, curve.G());
97 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Point({ 94 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Point({
98 x: new Clipperz.Crypto.ECC.BinaryField.Value('29705d23a9cda75e43984bdb9a8fd33304682da0f506a69bdbd5f36657e11b41e35fcdd', 16), 95 x: new Clipperz.Crypto.ECC.BinaryField.Value('29705d23a9cda75e43984bdb9a8fd33304682da0f506a69bdbd5f36657e11b41e35fcdd', 16),
99 y: new Clipperz.Crypto.ECC.BinaryField.Value('59157d2ace16563a905361c5206cc0775c3330f4978bddf8aa9916c451cf9951313623b', 16) 96 y: new Clipperz.Crypto.ECC.BinaryField.Value('59157d2ace16563a905361c5206cc0775c3330f4978bddf8aa9916c451cf9951313623b', 16)
100 }); 97 });
101 is(result.x().asString(16), expectedResult.x().asString(16), "ECC.Curve.multiplication: result.x does match"); 98 is(result.x().asString(16), expectedResult.x().asString(16), "ECC.Curve.multiplication: result.x does match");
102 is(result.y().asString(16), expectedResult.y().asString(16), "ECC.Curve.multiplication: result.y does match"); 99 is(result.y().asString(16), expectedResult.y().asString(16), "ECC.Curve.multiplication: result.y does match");
103/ **/ 100/ **/
104 101
105 value = new Clipperz.Crypto.ECC.BinaryField.Value("ba35032a24eb81238251d85824998bebae3b3e09f4d3845256c87585cf62416ee43191", 16); 102 value = new Clipperz.Crypto.ECC.BinaryField.Value("ba35032a24eb81238251d85824998bebae3b3e09f4d3845256c87585cf62416ee43191", 16);
106 103
107//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 6: " + res); return res;}); 104//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 6: " + res); return res;});
108 //deferredResult.addCallback(console.time, 'B283.deferred.multiply - moduled value'); 105 //deferredResult.addCallback(console.time, 'B283.deferred.multiply - moduled value');
109//deferredResult.addBoth(function(res) {MochiKit.Base.logDebug("2 - " + res); return res;}); 106//deferredResult.addBoth(function(res) {MochiKit.Base.logDebug("2 - " + res); return res;});
110//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 7: " + res); return res;}); 107//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 7: " + res); return res;});
111 deferredResult.addMethod(curve, 'deferredMultiply', value, curve.G()); 108 deferredResult.addMethod(curve, 'deferredMultiply', value, curve.G());
112//deferredResult.addBoth(function(res) {MochiKit.Base.logDebug("3 - " + res); return res;}); 109//deferredResult.addBoth(function(res) {MochiKit.Base.logDebug("3 - " + res); return res;});
113//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 8: " + res); return res;}); 110//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 8: " + res); return res;});
114 //deferredResult.addBoth(function(res) {console.timeEnd('B283.deferred.multiply - moduled value'); return res;}); 111 //deferredResult.addBoth(function(res) {console.timeEnd('B283.deferred.multiply - moduled value'); return res;});
115//deferredResult.addBoth(function(res) {MochiKit.Base.logDebug("4 - " + res); return res;}); 112//deferredResult.addBoth(function(res) {MochiKit.Base.logDebug("4 - " + res); return res;});
116//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 9: " + res); return res;}); 113//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 9: " + res); return res;});
117 deferredResult.addCallback(function(res) { 114 deferredResult.addCallback(function(res) {
118 var expectedResult; 115 var expectedResult;
119 116
120 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Point({ 117 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Point({
121 x: new Clipperz.Crypto.ECC.BinaryField.Value('7cf07c0880d1ae59f567a2ce420e78d1fdfc1249df694a60e5d40d23c6dc631e1501b77', 16), 118 x: new Clipperz.Crypto.ECC.BinaryField.Value('7cf07c0880d1ae59f567a2ce420e78d1fdfc1249df694a60e5d40d23c6dc631e1501b77', 16),
122 y: new Clipperz.Crypto.ECC.BinaryField.Value('97d1257d5c98cf71cf481bc0a495e0588150ea904526f503cd600f5e971c39700e95f1', 16) 119 y: new Clipperz.Crypto.ECC.BinaryField.Value('97d1257d5c98cf71cf481bc0a495e0588150ea904526f503cd600f5e971c39700e95f1', 16)
123 }); 120 });
124 121
125 is(res.x().asString(16), expectedResult.x().asString(16), "ECC.Curve.multiplication: result.x does match"); 122 is(res.x().asString(16), expectedResult.x().asString(16), "ECC.Curve.multiplication: result.x does match");
126 is(res.y().asString(16), expectedResult.y().asString(16), "ECC.Curve.multiplication: result.y does match"); 123 is(res.y().asString(16), expectedResult.y().asString(16), "ECC.Curve.multiplication: result.y does match");
127 }) 124 })
128//deferredResult.addBoth(function(res) {MochiKit.Base.logDebug("5 - " + res); return res;}); 125//deferredResult.addBoth(function(res) {MochiKit.Base.logDebug("5 - " + res); return res;});
129//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 10: " + res); return res;}); 126//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 10: " + res); return res;});
130 deferredResult.addBoth(function(res) {SimpleTest.finish(); return res;}); 127 deferredResult.addBoth(function(res) {SimpleTest.finish(); return res;});
131 deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug(res); return res;}); 128 deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug(res); return res;});
132 deferredResult.callback(); 129 deferredResult.callback();
133 130
134 SimpleTest.waitForExplicitFinish(); 131 SimpleTest.waitForExplicitFinish();
135 132
136 //------------------------------------------------------------------------- 133 //-------------------------------------------------------------------------
137} catch (err) { 134} catch (err) {
138 135
139 var s = "test suite failure!\n"; 136 var s = "test suite failure!\n";
140 var o = {}; 137 var o = {};
141 var k = null; 138 var k = null;
142 for (k in err) { 139 for (k in err) {
143 // ensure unique keys?! 140 // ensure unique keys?!
144 if (!o[k]) { 141 if (!o[k]) {
145 s += k + ": " + err[k] + "\n"; 142 s += k + ": " + err[k] + "\n";
146 o[k] = err[k]; 143 o[k] = err[k];
147 } 144 }
148 } 145 }
149 ok ( false, s ); 146 ok ( false, s );
150} 147}
151 148
152</script> 149</script>
153</pre> 150</pre>
154</body> 151</body>
155</html> 152</html>
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 3d7efaa..6024021 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,209 +1,206 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27--> 24-->
28 25
29<html> 26<html>
30<head> 27<head>
31 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 28 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
32 <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script> 29 <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script>
33 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> 30 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
34 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> 31 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
35 32
36 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 33 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
37 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 34 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
38 35
39 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> 36 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
40 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> 37 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
41<!--<script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC.js'></script>--> 38<!--<script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC.js'></script>-->
42 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Value.js'></script> 39 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Value.js'></script>
43 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Point.js'></script> 40 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Point.js'></script>
44 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/FiniteField.js'></script> 41 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/FiniteField.js'></script>
45 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Curve.js'></script> 42 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Curve.js'></script>
46 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Functions.js'></script> 43 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Functions.js'></script>
47</head> 44</head>
48<body> 45<body>
49<pre id="test"> 46<pre id="test">
50<script type="text/javascript"> 47<script type="text/javascript">
51try { 48try {
52 // 49 //
53 //ECC.BinaryFiniteField 50 //ECC.BinaryFiniteField
54 // 51 //
55 varf2m; 52 varf2m;
56 varf2m_improved; 53 varf2m_improved;
57 var a, a1, b; 54 var a, a1, b;
58 var result; 55 var result;
59 var result_improved; 56 var result_improved;
60 var expectedResul; 57 var expectedResul;
61 58
62 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 = new Clipperz.Crypto.ECC.BinaryField.FiniteField({modulus:new Clipperz.Crypto.ECC.BinaryField.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 000010a1', 16)})
63 f2m_improved = Clipperz.Crypto.ECC.StandardCurves.B283().finiteField(); 60 f2m_improved = Clipperz.Crypto.ECC.StandardCurves.B283().finiteField();
64 a = new Clipperz.Crypto.ECC.BinaryField.Value("05c91e41 d9ca17ef 9d8a33c1 a44eba6d 368fde02 1c492077 1a46eb01 a481e5f7 f430749d", 16); 61 a = new Clipperz.Crypto.ECC.BinaryField.Value("05c91e41 d9ca17ef 9d8a33c1 a44eba6d 368fde02 1c492077 1a46eb01 a481e5f7 f430749d", 16);
65 b = new Clipperz.Crypto.ECC.BinaryField.Value("07377071 2de7d57b a803f65f 45786c06 876b8066 db75ec47 81c053b0 a0f78e2c a6ab5187", 16); 62 b = new Clipperz.Crypto.ECC.BinaryField.Value("07377071 2de7d57b a803f65f 45786c06 876b8066 db75ec47 81c053b0 a0f78e2c a6ab5187", 16);
66 63
67 // 64 //
68 //addition 65 //addition
69 // 66 //
70 result = f2m.add(a, b); 67 result = f2m.add(a, b);
71 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("2fe6e30f42dc2943589c59ee136d66bb1e45e64c73ccc309b86b8b104766bdb529b251a", 16); 68 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("2fe6e30f42dc2943589c59ee136d66bb1e45e64c73ccc309b86b8b104766bdb529b251a", 16);
72 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.add"); 69 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.add");
73 70
74 71
75 // 72 //
76 //negation 73 //negation
77 // 74 //
78 result = f2m.negate(a); 75 result = f2m.negate(a);
79 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("5c91e41d9ca17ef9d8a33c1a44eba6d368fde021c4920771a46eb01a481e5f7f430749d", 16); 76 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("5c91e41d9ca17ef9d8a33c1a44eba6d368fde021c4920771a46eb01a481e5f7f430749d", 16);
80 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.negate"); 77 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.negate");
81 78
82 79
83 // 80 //
84 //multiplication 81 //multiplication
85 // 82 //
86 result = f2m.multiply(a, b); 83 result = f2m.multiply(a, b);
87 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("2bacb89668741f6d1f7fd7d3df2f045814086adba11d8bb5f12f3f9851e3b66fbe283cb", 16); 84 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("2bacb89668741f6d1f7fd7d3df2f045814086adba11d8bb5f12f3f9851e3b66fbe283cb", 16);
88 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.multiply"); 85 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.multiply");
89 86
90 87
91 // 88 //
92 //fast multiplication 89 //fast multiplication
93 // 90 //
94 result = f2m.fastMultiply(a, b); 91 result = f2m.fastMultiply(a, b);
95 expectedResult = f2m.multiply(a, b); 92 expectedResult = f2m.multiply(a, b);
96 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.fastMultiply"); 93 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.fastMultiply");
97 94
98 a = new Clipperz.Crypto.ECC.BinaryField.Value("2fe6e30f42dc2943589c59ee136d66bb1e45e64c73ccc309b86b8b104766bdb529b251a", 16); 95 a = new Clipperz.Crypto.ECC.BinaryField.Value("2fe6e30f42dc2943589c59ee136d66bb1e45e64c73ccc309b86b8b104766bdb529b251a", 16);
99 b = new Clipperz.Crypto.ECC.BinaryField.Value("5c91e41d9ca17ef9d8a33c1a44eba6d368fde021c4920771a46eb01a481e5f7f430749d", 16); 96 b = new Clipperz.Crypto.ECC.BinaryField.Value("5c91e41d9ca17ef9d8a33c1a44eba6d368fde021c4920771a46eb01a481e5f7f430749d", 16);
100 result = f2m.fastMultiply(a, b); 97 result = f2m.fastMultiply(a, b);
101 expectedResult = f2m.multiply(a, b); 98 expectedResult = f2m.multiply(a, b);
102 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.B283.fastMultiply"); 99 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.B283.fastMultiply");
103 100
104 // 101 //
105 //square 102 //square
106 // 103 //
107 a = new Clipperz.Crypto.ECC.BinaryField.Value("1111", 16); 104 a = new Clipperz.Crypto.ECC.BinaryField.Value("1111", 16);
108 result = f2m.square(a); 105 result = f2m.square(a);
109 expectedResult = f2m.multiply(a, a); 106 expectedResult = f2m.multiply(a, a);
110 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.square"); 107 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.square");
111 108
112 a = new Clipperz.Crypto.ECC.BinaryField.Value("11111111", 16); 109 a = new Clipperz.Crypto.ECC.BinaryField.Value("11111111", 16);
113 result = f2m.square(a); 110 result = f2m.square(a);
114 expectedResult = f2m.multiply(a, a); 111 expectedResult = f2m.multiply(a, a);
115 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.square"); 112 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.square");
116 113
117 a = new Clipperz.Crypto.ECC.BinaryField.Value("5c91e41d9ca17ef9d8a33c1a44eba6d368fde021c4920771a46eb01a481e5f7f430749d", 16); 114 a = new Clipperz.Crypto.ECC.BinaryField.Value("5c91e41d9ca17ef9d8a33c1a44eba6d368fde021c4920771a46eb01a481e5f7f430749d", 16);
118 result = f2m.square(a); 115 result = f2m.square(a);
119 expectedResult = f2m.multiply(a, a); 116 expectedResult = f2m.multiply(a, a);
120 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.square"); 117 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.square");
121 118
122 119
123 // 120 //
124 //inverse 121 //inverse
125 // 122 //
126 a = new Clipperz.Crypto.ECC.BinaryField.Value("2fe6e30f42dc2943589c59ee136d66bb1e45e64c73ccc309b86b8b104766bdb529b251a", 16); 123 a = new Clipperz.Crypto.ECC.BinaryField.Value("2fe6e30f42dc2943589c59ee136d66bb1e45e64c73ccc309b86b8b104766bdb529b251a", 16);
127 result = f2m.inverse(a); 124 result = f2m.inverse(a);
128 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("3812fc574f3728c60384e141c0e2a808e21adec22dcd407b9e25dd13c6d1bf22defd84a", 16); 125 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("3812fc574f3728c60384e141c0e2a808e21adec22dcd407b9e25dd13c6d1bf22defd84a", 16);
129 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.inverse"); 126 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.inverse");
130 127
131 128
132 // 129 //
133 //module 130 //module
134 // 131 //
135 132
136 a = new Clipperz.Crypto.ECC.BinaryField.Value("015655ebcb09fac51945162a0775f42df6151169826efdc55dea5d17c22adb92e6b1a6ae8311545ad7e0f46f09a5b960855e673db1e803a5b94562161213204ca1f24792e81f060a0aa6c29a492f106cc6d0b0ff4617b736dab590590a8cff9f807a15282544404e6b35841703c9fb00a9cad1d6878d601efc25368bdc51d5ff14a81610f4fe62cb2f452aee520a16", 16); 133 a = new Clipperz.Crypto.ECC.BinaryField.Value("015655ebcb09fac51945162a0775f42df6151169826efdc55dea5d17c22adb92e6b1a6ae8311545ad7e0f46f09a5b960855e673db1e803a5b94562161213204ca1f24792e81f060a0aa6c29a492f106cc6d0b0ff4617b736dab590590a8cff9f807a15282544404e6b35841703c9fb00a9cad1d6878d601efc25368bdc51d5ff14a81610f4fe62cb2f452aee520a16", 16);
137 a1 = new Clipperz.Crypto.ECC.BinaryField.Value("015655ebcb09fac51945162a0775f42df6151169826efdc55dea5d17c22adb92e6b1a6ae8311545ad7e0f46f09a5b960855e673db1e803a5b94562161213204ca1f24792e81f060a0aa6c29a492f106cc6d0b0ff4617b736dab590590a8cff9f807a15282544404e6b35841703c9fb00a9cad1d6878d601efc25368bdc51d5ff14a81610f4fe62cb2f452aee520a16", 16); 134 a1 = new Clipperz.Crypto.ECC.BinaryField.Value("015655ebcb09fac51945162a0775f42df6151169826efdc55dea5d17c22adb92e6b1a6ae8311545ad7e0f46f09a5b960855e673db1e803a5b94562161213204ca1f24792e81f060a0aa6c29a492f106cc6d0b0ff4617b736dab590590a8cff9f807a15282544404e6b35841703c9fb00a9cad1d6878d601efc25368bdc51d5ff14a81610f4fe62cb2f452aee520a16", 16);
138 result = f2m.module(a); 135 result = f2m.module(a);
139 result_improved = f2m_improved.module(a1); 136 result_improved = f2m_improved.module(a1);
140 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("2bacb89668741f6d1f7fd7d3df2f045814086adba11d8bb5f12f3f9851e3b66fbe283cb", 16); 137 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("2bacb89668741f6d1f7fd7d3df2f045814086adba11d8bb5f12f3f9851e3b66fbe283cb", 16);
141 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFiniteField.module"); 138 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFiniteField.module");
142 is(result_improved.asString(16), expectedResult.asString(16), "ECC.BinaryFiniteField.module (improved)"); 139 is(result_improved.asString(16), expectedResult.asString(16), "ECC.BinaryFiniteField.module (improved)");
143 is(result.asString(16), result_improved.asString(16), "standard vs improved 'module' methods"); 140 is(result.asString(16), result_improved.asString(16), "standard vs improved 'module' methods");
144 141
145 142
146 a = new Clipperz.Crypto.ECC.BinaryField.Value("1401ca87b8f144684a2c58ae9308c237789e4bf1f36dd117c150b7d6076dd1da6197fe4c5225a064db0e4222589d5ca50eb6bb6b7147a03f61528438a8767c6a6c4a6883fd6f067112f5c97e74737b38925fafe22cea3e12b868d4ddea5b3341db8fc2e788cab74f0a7a3cc27087a89365945369938650a99217d566e13f80dc87f08273f7411b6b01ef1d399c772a", 16); 143 a = new Clipperz.Crypto.ECC.BinaryField.Value("1401ca87b8f144684a2c58ae9308c237789e4bf1f36dd117c150b7d6076dd1da6197fe4c5225a064db0e4222589d5ca50eb6bb6b7147a03f61528438a8767c6a6c4a6883fd6f067112f5c97e74737b38925fafe22cea3e12b868d4ddea5b3341db8fc2e788cab74f0a7a3cc27087a89365945369938650a99217d566e13f80dc87f08273f7411b6b01ef1d399c772a", 16);
147 a1 = new Clipperz.Crypto.ECC.BinaryField.Value("1401ca87b8f144684a2c58ae9308c237789e4bf1f36dd117c150b7d6076dd1da6197fe4c5225a064db0e4222589d5ca50eb6bb6b7147a03f61528438a8767c6a6c4a6883fd6f067112f5c97e74737b38925fafe22cea3e12b868d4ddea5b3341db8fc2e788cab74f0a7a3cc27087a89365945369938650a99217d566e13f80dc87f08273f7411b6b01ef1d399c772a", 16); 144 a1 = new Clipperz.Crypto.ECC.BinaryField.Value("1401ca87b8f144684a2c58ae9308c237789e4bf1f36dd117c150b7d6076dd1da6197fe4c5225a064db0e4222589d5ca50eb6bb6b7147a03f61528438a8767c6a6c4a6883fd6f067112f5c97e74737b38925fafe22cea3e12b868d4ddea5b3341db8fc2e788cab74f0a7a3cc27087a89365945369938650a99217d566e13f80dc87f08273f7411b6b01ef1d399c772a", 16);
148 result = f2m.module(a); 145 result = f2m.module(a);
149 result_improved = f2m_improved.module(a1); 146 result_improved = f2m_improved.module(a1);
150 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("15e2097d116e745ac47480807cb5eb99dad902728aaf5692241063bc70a5b372dbce798", 16); 147 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("15e2097d116e745ac47480807cb5eb99dad902728aaf5692241063bc70a5b372dbce798", 16);
151 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFiniteField.module (2)"); 148 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFiniteField.module (2)");
152 is(result_improved.asString(16), expectedResult.asString(16), "ECC.BinaryFiniteField.module (improved) (2)"); 149 is(result_improved.asString(16), expectedResult.asString(16), "ECC.BinaryFiniteField.module (improved) (2)");
153 is(result.asString(16), result_improved.asString(16), "standard vs improved 'module' methods (2)"); 150 is(result.asString(16), result_improved.asString(16), "standard vs improved 'module' methods (2)");
154 151
155 152
156 a = new Clipperz.Crypto.ECC.BinaryField.Value("112f5c97e74737b38925fafe22cea3e12b868d4ddea5b3341db8fc2e788cab74f0a7a3cc27087a89365945369938650a99217d566e13f80dc87f08273f7411b6b01ef1d399c772a1401ca87b8f144684a2c58ae9308c237789e4bf1f36dd117c150b7d6076dd1da6197fe4c5225a064db0e4222589d5ca50eb6bb6b7147a03f61528438a8767c6a6c4a6883fd6f067", 16); 153 a = new Clipperz.Crypto.ECC.BinaryField.Value("112f5c97e74737b38925fafe22cea3e12b868d4ddea5b3341db8fc2e788cab74f0a7a3cc27087a89365945369938650a99217d566e13f80dc87f08273f7411b6b01ef1d399c772a1401ca87b8f144684a2c58ae9308c237789e4bf1f36dd117c150b7d6076dd1da6197fe4c5225a064db0e4222589d5ca50eb6bb6b7147a03f61528438a8767c6a6c4a6883fd6f067", 16);
157 a1 = new Clipperz.Crypto.ECC.BinaryField.Value("112f5c97e74737b38925fafe22cea3e12b868d4ddea5b3341db8fc2e788cab74f0a7a3cc27087a89365945369938650a99217d566e13f80dc87f08273f7411b6b01ef1d399c772a1401ca87b8f144684a2c58ae9308c237789e4bf1f36dd117c150b7d6076dd1da6197fe4c5225a064db0e4222589d5ca50eb6bb6b7147a03f61528438a8767c6a6c4a6883fd6f067", 16); 154 a1 = new Clipperz.Crypto.ECC.BinaryField.Value("112f5c97e74737b38925fafe22cea3e12b868d4ddea5b3341db8fc2e788cab74f0a7a3cc27087a89365945369938650a99217d566e13f80dc87f08273f7411b6b01ef1d399c772a1401ca87b8f144684a2c58ae9308c237789e4bf1f36dd117c150b7d6076dd1da6197fe4c5225a064db0e4222589d5ca50eb6bb6b7147a03f61528438a8767c6a6c4a6883fd6f067", 16);
158 result = f2m.module(a); 155 result = f2m.module(a);
159 result_improved = f2m_improved.module(a1); 156 result_improved = f2m_improved.module(a1);
160 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("40f04cec8fe9caedf82adeff7e1aa06dcb9d08e097db8be2ad54b2ddc2e752152395623", 16); 157 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("40f04cec8fe9caedf82adeff7e1aa06dcb9d08e097db8be2ad54b2ddc2e752152395623", 16);
161 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFiniteField.module (3)"); 158 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFiniteField.module (3)");
162 is(result_improved.asString(16), expectedResult.asString(16), "ECC.BinaryFiniteField.module (improved) (3)"); 159 is(result_improved.asString(16), expectedResult.asString(16), "ECC.BinaryFiniteField.module (improved) (3)");
163 is(result.asString(16), result_improved.asString(16), "standard vs improved 'module' methods (3)"); 160 is(result.asString(16), result_improved.asString(16), "standard vs improved 'module' methods (3)");
164 161
165 162
166 a = new Clipperz.Crypto.ECC.BinaryField.Value("02f4bf57710a7e0826a80a339e59e34476c343e75452e4bf4355847e6b41e655ecb08f4c418b172d7963c525c26fdc84ac294a348d3907652f0fcbff3e4c8e2238a478e4277489ce", 16); 163 a = new Clipperz.Crypto.ECC.BinaryField.Value("02f4bf57710a7e0826a80a339e59e34476c343e75452e4bf4355847e6b41e655ecb08f4c418b172d7963c525c26fdc84ac294a348d3907652f0fcbff3e4c8e2238a478e4277489ce", 16);
167 is(a.asString(16), "02f4bf57710a7e0826a80a339e59e34476c343e75452e4bf4355847e6b41e655ecb08f4c418b172d7963c525c26fdc84ac294a348d3907652f0fcbff3e4c8e2238a478e4277489ce", "ECC.BinaryFiniteField - original value as expected (4)") 164 is(a.asString(16), "02f4bf57710a7e0826a80a339e59e34476c343e75452e4bf4355847e6b41e655ecb08f4c418b172d7963c525c26fdc84ac294a348d3907652f0fcbff3e4c8e2238a478e4277489ce", "ECC.BinaryFiniteField - original value as expected (4)")
168 a1 = new Clipperz.Crypto.ECC.BinaryField.Value("02f4bf57710a7e0826a80a339e59e34476c343e75452e4bf4355847e6b41e655ecb08f4c418b172d7963c525c26fdc84ac294a348d3907652f0fcbff3e4c8e2238a478e4277489ce", 16); 165 a1 = new Clipperz.Crypto.ECC.BinaryField.Value("02f4bf57710a7e0826a80a339e59e34476c343e75452e4bf4355847e6b41e655ecb08f4c418b172d7963c525c26fdc84ac294a348d3907652f0fcbff3e4c8e2238a478e4277489ce", 16);
169 result = f2m.module(a); 166 result = f2m.module(a);
170 result_improved = f2m_improved.module(a1); 167 result_improved = f2m_improved.module(a1);
171 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("ba35032a24eb81238251d85824998bebae3b3e09f4d3845256c87585cf62416ee43191", 16); 168 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("ba35032a24eb81238251d85824998bebae3b3e09f4d3845256c87585cf62416ee43191", 16);
172 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFiniteField.module (4)"); 169 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFiniteField.module (4)");
173 is(result_improved.asString(16), expectedResult.asString(16), "ECC.BinaryFiniteField.module (improved) (4)"); 170 is(result_improved.asString(16), expectedResult.asString(16), "ECC.BinaryFiniteField.module (improved) (4)");
174 is(result_improved.asString(16), "ba35032a24eb81238251d85824998bebae3b3e09f4d3845256c87585cf62416ee43191", "ECC.BinaryFinetField.module (static check) (4)"); 171 is(result_improved.asString(16), "ba35032a24eb81238251d85824998bebae3b3e09f4d3845256c87585cf62416ee43191", "ECC.BinaryFinetField.module (static check) (4)");
175 is(result.asString(16), result_improved.asString(16), "standard vs improved 'module' methods (4)"); 172 is(result.asString(16), result_improved.asString(16), "standard vs improved 'module' methods (4)");
176 173
177 is(a.asString(16), "02f4bf57710a7e0826a80a339e59e34476c343e75452e4bf4355847e6b41e655ecb08f4c418b172d7963c525c26fdc84ac294a348d3907652f0fcbff3e4c8e2238a478e4277489ce", "ECC.BinaryFiniteField - original value preserved by standard method (4)") 174 is(a.asString(16), "02f4bf57710a7e0826a80a339e59e34476c343e75452e4bf4355847e6b41e655ecb08f4c418b172d7963c525c26fdc84ac294a348d3907652f0fcbff3e4c8e2238a478e4277489ce", "ECC.BinaryFiniteField - original value preserved by standard method (4)")
178 is(a1.asString(16), "02f4bf57710a7e0826a80a339e59e34476c343e75452e4bf4355847e6b41e655ecb08f4c418b172d7963c525c26fdc84ac294a348d3907652f0fcbff3e4c8e2238a478e4277489ce", "ECC.BinaryFiniteField - original value preserved by improved method (4)") 175 is(a1.asString(16), "02f4bf57710a7e0826a80a339e59e34476c343e75452e4bf4355847e6b41e655ecb08f4c418b172d7963c525c26fdc84ac294a348d3907652f0fcbff3e4c8e2238a478e4277489ce", "ECC.BinaryFiniteField - original value preserved by improved method (4)")
179 176
180 177
181 a = new Clipperz.Crypto.ECC.BinaryField.Value("2f4bf57710a7e0826a80a339e59e34476c343e75452e4bf4355847e6b41e655ecb08f4c418b172d7963c525c26fdc84ac294a348d3907652f0fcbff3e4c8e2238a478e4277489ce", 16); 178 a = new Clipperz.Crypto.ECC.BinaryField.Value("2f4bf57710a7e0826a80a339e59e34476c343e75452e4bf4355847e6b41e655ecb08f4c418b172d7963c525c26fdc84ac294a348d3907652f0fcbff3e4c8e2238a478e4277489ce", 16);
182 result_improved = f2m_improved.module(a); 179 result_improved = f2m_improved.module(a);
183 result = f2m.module(a); 180 result = f2m.module(a);
184 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("ba35032a24eb81238251d85824998bebae3b3e09f4d3845256c87585cf62416ee43191", 16); 181 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("ba35032a24eb81238251d85824998bebae3b3e09f4d3845256c87585cf62416ee43191", 16);
185 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFiniteField.module (5)"); 182 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFiniteField.module (5)");
186 is(result_improved.asString(16), expectedResult.asString(16), "ECC.BinaryFiniteField.module (improved) (5)"); 183 is(result_improved.asString(16), expectedResult.asString(16), "ECC.BinaryFiniteField.module (improved) (5)");
187 is(result_improved.asString(16), "ba35032a24eb81238251d85824998bebae3b3e09f4d3845256c87585cf62416ee43191", "ECC.BinaryFinetField.module (static check) (5)"); 184 is(result_improved.asString(16), "ba35032a24eb81238251d85824998bebae3b3e09f4d3845256c87585cf62416ee43191", "ECC.BinaryFinetField.module (static check) (5)");
188 is(result.asString(16), result_improved.asString(16), "standard vs improved 'module' methods (5)"); 185 is(result.asString(16), result_improved.asString(16), "standard vs improved 'module' methods (5)");
189 186
190 //------------------------------------------------------------------------- 187 //-------------------------------------------------------------------------
191} catch (err) { 188} catch (err) {
192 189
193 var s = "test suite failure!\n"; 190 var s = "test suite failure!\n";
194 var o = {}; 191 var o = {};
195 var k = null; 192 var k = null;
196 for (k in err) { 193 for (k in err) {
197 // ensure unique keys?! 194 // ensure unique keys?!
198 if (!o[k]) { 195 if (!o[k]) {
199 s += k + ": " + err[k] + "\n"; 196 s += k + ": " + err[k] + "\n";
200 o[k] = err[k]; 197 o[k] = err[k];
201 } 198 }
202 } 199 }
203 ok ( false, s ); 200 ok ( false, s );
204} 201}
205 202
206</script> 203</script>
207</pre> 204</pre>
208</body> 205</body>
209</html> 206</html>
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 6bddb26..5a7a4f7 100644
--- a/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.FiniteField.html
+++ b/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.FiniteField.html
@@ -1,183 +1,180 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27--> 24-->
28 25
29<html> 26<html>
30<head> 27<head>
31 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 28 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
32 <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script> 29 <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script>
33 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> 30 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
34 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> 31 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
35 32
36 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 33 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
37 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 34 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
38 35
39 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> 36 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
40 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> 37 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
41<!--<script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC.js'></script>--> 38<!--<script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC.js'></script>-->
42 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Value.js'></script> 39 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Value.js'></script>
43 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Point.js'></script> 40 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Point.js'></script>
44 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/FiniteField.js'></script> 41 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/FiniteField.js'></script>
45 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Curve.js'></script> 42 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Curve.js'></script>
46 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Functions.js'></script> 43 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Functions.js'></script>
47</head> 44</head>
48<body> 45<body>
49<pre id="test"> 46<pre id="test">
50<script type="text/javascript"> 47<script type="text/javascript">
51try { 48try {
52 // 49 //
53 //ECC.BinaryFiniteField 50 //ECC.BinaryFiniteField
54 // 51 //
55 varf2m; 52 varf2m;
56 varf2m_improved; 53 varf2m_improved;
57 var a, b; 54 var a, b;
58 var result; 55 var result;
59 var result_improved; 56 var result_improved;
60 var expectedResul; 57 var expectedResul;
61 58
62 f2m = new Clipperz.Crypto.ECC.BinaryField.FiniteField({modulus:new Clipperz.Crypto.ECC.BinaryField.Value('80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000425', 16)}) 59 f2m = new Clipperz.Crypto.ECC.BinaryField.FiniteField({modulus:new Clipperz.Crypto.ECC.BinaryField.Value('80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000425', 16)})
63 f2m_improved = Clipperz.Crypto.ECC.StandardCurves.B571().finiteField(); 60 f2m_improved = Clipperz.Crypto.ECC.StandardCurves.B571().finiteField();
64 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 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);
65 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 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);
66 63
67 // 64 //
68 //addition 65 //addition
69 // 66 //
70 result = f2m.add(a, b); 67 result = f2m.add(a, b);
71 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("52e96105fb673dbc309a250b1c661d65318c6bc2dc86223dce84bf87fe17aae91305d80752ddaeded570714c1a539af9797c63d1f545832a92d8c1f97026ddcdc54995064a874d", 16); 68 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("52e96105fb673dbc309a250b1c661d65318c6bc2dc86223dce84bf87fe17aae91305d80752ddaeded570714c1a539af9797c63d1f545832a92d8c1f97026ddcdc54995064a874d", 16);
72 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.add"); 69 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.add");
73 70
74 71
75 // 72 //
76 //negation 73 //negation
77 // 74 //
78 result = f2m.negate(a); 75 result = f2m.negate(a);
79 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("1401ca87b8f144684a2c58ae9308c237789e4bf1f36dd117c150b7d6076dd1da6197fe4c5225a064db0e4222589d5ca50eb6bb6b7147a03f61528438a8767c6a6c4a6883fd6f067", 16); 76 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("1401ca87b8f144684a2c58ae9308c237789e4bf1f36dd117c150b7d6076dd1da6197fe4c5225a064db0e4222589d5ca50eb6bb6b7147a03f61528438a8767c6a6c4a6883fd6f067", 16);
80 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.negate"); 77 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.negate");
81 78
82 79
83 // 80 //
84 //multiplication 81 //multiplication
85 // 82 //
86 result = f2m.multiply(a, b); 83 result = f2m.multiply(a, b);
87 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("4f8e4c0ae7664b284d3b4cb1b3f9568a1ce6e6e96b5381e184fe0822cb3d5c3a3f01ffd0206355d9e5c4853472bb33cf6b2d861d6b48c39d33a360e9a63ad2f7102f92e68a12312", 16); 84 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("4f8e4c0ae7664b284d3b4cb1b3f9568a1ce6e6e96b5381e184fe0822cb3d5c3a3f01ffd0206355d9e5c4853472bb33cf6b2d861d6b48c39d33a360e9a63ad2f7102f92e68a12312", 16);
88 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.multiply"); 85 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.multiply");
89 86
90 87
91 // 88 //
92 //fast multiplication 89 //fast multiplication
93 // 90 //
94 result = f2m.fastMultiply(a, b); 91 result = f2m.fastMultiply(a, b);
95 expectedResult = f2m.multiply(a, b); 92 expectedResult = f2m.multiply(a, b);
96 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.fastMultiply"); 93 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.fastMultiply");
97 94
98 a = new Clipperz.Crypto.ECC.BinaryField.Value("52e96105fb673dbc309a250b1c661d65318c6bc2dc86223dce84bf87fe17aae91305d80752ddaeded570714c1a539af9797c63d1f545832a92d8c1f97026ddcdc54995064a874d", 16); 95 a = new Clipperz.Crypto.ECC.BinaryField.Value("52e96105fb673dbc309a250b1c661d65318c6bc2dc86223dce84bf87fe17aae91305d80752ddaeded570714c1a539af9797c63d1f545832a92d8c1f97026ddcdc54995064a874d", 16);
99 b = new Clipperz.Crypto.ECC.BinaryField.Value("1401ca87b8f144684a2c58ae9308c237789e4bf1f36dd117c150b7d6076dd1da6197fe4c5225a064db0e4222589d5ca50eb6bb6b7147a03f61528438a8767c6a6c4a6883fd6f067", 16); 96 b = new Clipperz.Crypto.ECC.BinaryField.Value("1401ca87b8f144684a2c58ae9308c237789e4bf1f36dd117c150b7d6076dd1da6197fe4c5225a064db0e4222589d5ca50eb6bb6b7147a03f61528438a8767c6a6c4a6883fd6f067", 16);
100 result = f2m.fastMultiply(a, b); 97 result = f2m.fastMultiply(a, b);
101 expectedResult = f2m.multiply(a, b); 98 expectedResult = f2m.multiply(a, b);
102 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.fastMultiply"); 99 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.fastMultiply");
103 100
104 // 101 //
105 //square 102 //square
106 // 103 //
107 a = new Clipperz.Crypto.ECC.BinaryField.Value("1111", 16); 104 a = new Clipperz.Crypto.ECC.BinaryField.Value("1111", 16);
108 result = f2m.square(a); 105 result = f2m.square(a);
109 expectedResult = f2m.multiply(a, a); 106 expectedResult = f2m.multiply(a, a);
110 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.square"); 107 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.square");
111 108
112 a = new Clipperz.Crypto.ECC.BinaryField.Value("11111111", 16); 109 a = new Clipperz.Crypto.ECC.BinaryField.Value("11111111", 16);
113 result = f2m.square(a); 110 result = f2m.square(a);
114 expectedResult = f2m.multiply(a, a); 111 expectedResult = f2m.multiply(a, a);
115 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.square"); 112 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.square");
116 113
117 a = new Clipperz.Crypto.ECC.BinaryField.Value("1401ca87b8f144684a2c58ae9308c237789e4bf1f36dd117c150b7d6076dd1da6197fe4c5225a064db0e4222589d5ca50eb6bb6b7147a03f61528438a8767c6a6c4a6883fd6f067", 16); 114 a = new Clipperz.Crypto.ECC.BinaryField.Value("1401ca87b8f144684a2c58ae9308c237789e4bf1f36dd117c150b7d6076dd1da6197fe4c5225a064db0e4222589d5ca50eb6bb6b7147a03f61528438a8767c6a6c4a6883fd6f067", 16);
118 result = f2m.square(a); 115 result = f2m.square(a);
119 expectedResult = f2m.multiply(a, a); 116 expectedResult = f2m.multiply(a, a);
120 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.square"); 117 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.square");
121 118
122 119
123 // 120 //
124 //inverse 121 //inverse
125 // 122 //
126 a = new Clipperz.Crypto.ECC.BinaryField.Value("1401ca87b8f144684a2c58ae9308c237789e4bf1f36dd117c150b7d6076dd1da6197fe4c5225a064db0e4222589d5ca50eb6bb6b7147a03f61528438a8767c6a6c4a6883fd6f067", 16); 123 a = new Clipperz.Crypto.ECC.BinaryField.Value("1401ca87b8f144684a2c58ae9308c237789e4bf1f36dd117c150b7d6076dd1da6197fe4c5225a064db0e4222589d5ca50eb6bb6b7147a03f61528438a8767c6a6c4a6883fd6f067", 16);
127 result = f2m.inverse(a); 124 result = f2m.inverse(a);
128 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("1f898c60983c4e807e619b9cbe528585fc33aaae419d5e5cb2107269ccdcf21d5ad5b5d78d37fa435a0d0a8a75f2506240c325c6a2eee1a03008f9e1b9c6c0a511b730cdaf9b97e", 16); 125 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("1f898c60983c4e807e619b9cbe528585fc33aaae419d5e5cb2107269ccdcf21d5ad5b5d78d37fa435a0d0a8a75f2506240c325c6a2eee1a03008f9e1b9c6c0a511b730cdaf9b97e", 16);
129 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.inverse"); 126 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.inverse");
130 127
131 128
132 // 129 //
133 //module 130 //module
134 // 131 //
135 132
136 a = new Clipperz.Crypto.ECC.BinaryField.Value("015655ebcb09fac51945162a0775f42df6151169826efdc55dea5d17c22adb92e6b1a6ae8311545ad7e0f46f09a5b960855e673db1e803a5b94562161213204ca1f24792e81f060a0aa6c29a492f106cc6d0b0ff4617b736dab590590a8cff9f807a15282544404e6b35841703c9fb00a9cad1d6878d601efc25368bdc51d5ff14a81610f4fe62cb2f452aee520a16", 16); 133 a = new Clipperz.Crypto.ECC.BinaryField.Value("015655ebcb09fac51945162a0775f42df6151169826efdc55dea5d17c22adb92e6b1a6ae8311545ad7e0f46f09a5b960855e673db1e803a5b94562161213204ca1f24792e81f060a0aa6c29a492f106cc6d0b0ff4617b736dab590590a8cff9f807a15282544404e6b35841703c9fb00a9cad1d6878d601efc25368bdc51d5ff14a81610f4fe62cb2f452aee520a16", 16);
137 a1 = new Clipperz.Crypto.ECC.BinaryField.Value("015655ebcb09fac51945162a0775f42df6151169826efdc55dea5d17c22adb92e6b1a6ae8311545ad7e0f46f09a5b960855e673db1e803a5b94562161213204ca1f24792e81f060a0aa6c29a492f106cc6d0b0ff4617b736dab590590a8cff9f807a15282544404e6b35841703c9fb00a9cad1d6878d601efc25368bdc51d5ff14a81610f4fe62cb2f452aee520a16", 16); 134 a1 = new Clipperz.Crypto.ECC.BinaryField.Value("015655ebcb09fac51945162a0775f42df6151169826efdc55dea5d17c22adb92e6b1a6ae8311545ad7e0f46f09a5b960855e673db1e803a5b94562161213204ca1f24792e81f060a0aa6c29a492f106cc6d0b0ff4617b736dab590590a8cff9f807a15282544404e6b35841703c9fb00a9cad1d6878d601efc25368bdc51d5ff14a81610f4fe62cb2f452aee520a16", 16);
138 result = f2m.module(a); 135 result = f2m.module(a);
139 result_improved = f2m_improved.module(a1); 136 result_improved = f2m_improved.module(a1);
140 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("4f8e4c0ae7664b284d3b4cb1b3f9568a1ce6e6e96b5381e184fe0822cb3d5c3a3f01ffd0206355d9e5c4853472bb33cf6b2d861d6b48c39d33a360e9a63ad2f7102f92e68a12312", 16); 137 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("4f8e4c0ae7664b284d3b4cb1b3f9568a1ce6e6e96b5381e184fe0822cb3d5c3a3f01ffd0206355d9e5c4853472bb33cf6b2d861d6b48c39d33a360e9a63ad2f7102f92e68a12312", 16);
141 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.module"); 138 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.module");
142 is(result_improved.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.module (improved)"); 139 is(result_improved.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.module (improved)");
143 //is(result.asString(16), result_improved.asString(16), "standard vs improved 'module' methods"); 140 //is(result.asString(16), result_improved.asString(16), "standard vs improved 'module' methods");
144 141
145 142
146 a = new Clipperz.Crypto.ECC.BinaryField.Value("1401ca87b8f144684a2c58ae9308c237789e4bf1f36dd117c150b7d6076dd1da6197fe4c5225a064db0e4222589d5ca50eb6bb6b7147a03f61528438a8767c6a6c4a6883fd6f067112f5c97e74737b38925fafe22cea3e12b868d4ddea5b3341db8fc2e788cab74f0a7a3cc27087a89365945369938650a99217d566e13f80dc87f08273f7411b6b01ef1d399c772a", 16); 143 a = new Clipperz.Crypto.ECC.BinaryField.Value("1401ca87b8f144684a2c58ae9308c237789e4bf1f36dd117c150b7d6076dd1da6197fe4c5225a064db0e4222589d5ca50eb6bb6b7147a03f61528438a8767c6a6c4a6883fd6f067112f5c97e74737b38925fafe22cea3e12b868d4ddea5b3341db8fc2e788cab74f0a7a3cc27087a89365945369938650a99217d566e13f80dc87f08273f7411b6b01ef1d399c772a", 16);
147 a1 = new Clipperz.Crypto.ECC.BinaryField.Value("1401ca87b8f144684a2c58ae9308c237789e4bf1f36dd117c150b7d6076dd1da6197fe4c5225a064db0e4222589d5ca50eb6bb6b7147a03f61528438a8767c6a6c4a6883fd6f067112f5c97e74737b38925fafe22cea3e12b868d4ddea5b3341db8fc2e788cab74f0a7a3cc27087a89365945369938650a99217d566e13f80dc87f08273f7411b6b01ef1d399c772a", 16); 144 a1 = new Clipperz.Crypto.ECC.BinaryField.Value("1401ca87b8f144684a2c58ae9308c237789e4bf1f36dd117c150b7d6076dd1da6197fe4c5225a064db0e4222589d5ca50eb6bb6b7147a03f61528438a8767c6a6c4a6883fd6f067112f5c97e74737b38925fafe22cea3e12b868d4ddea5b3341db8fc2e788cab74f0a7a3cc27087a89365945369938650a99217d566e13f80dc87f08273f7411b6b01ef1d399c772a", 16);
148 result = f2m.module(a); 145 result = f2m.module(a);
149 result_improved = f2m_improved.module(a1); 146 result_improved = f2m_improved.module(a1);
150 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("1704018ce75dc462a5ccd1eb18b8002ecb8536c616ec625f440f6888f8c32387e53a5cb3b6050688e9b64a32215a385ee98c518d6a484d5ac0ceeafa825743c84b075bdfabc341b", 16); 147 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("1704018ce75dc462a5ccd1eb18b8002ecb8536c616ec625f440f6888f8c32387e53a5cb3b6050688e9b64a32215a385ee98c518d6a484d5ac0ceeafa825743c84b075bdfabc341b", 16);
151 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.module (2)"); 148 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.module (2)");
152 is(result_improved.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.module (improved) (2)"); 149 is(result_improved.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.module (improved) (2)");
153 is(a.asString(16), "1401ca87b8f144684a2c58ae9308c237789e4bf1f36dd117c150b7d6076dd1da6197fe4c5225a064db0e4222589d5ca50eb6bb6b7147a03f61528438a8767c6a6c4a6883fd6f067112f5c97e74737b38925fafe22cea3e12b868d4ddea5b3341db8fc2e788cab74f0a7a3cc27087a89365945369938650a99217d566e13f80dc87f08273f7411b6b01ef1d399c772a", "ECC.BinaryFinetField.module (2)"); 150 is(a.asString(16), "1401ca87b8f144684a2c58ae9308c237789e4bf1f36dd117c150b7d6076dd1da6197fe4c5225a064db0e4222589d5ca50eb6bb6b7147a03f61528438a8767c6a6c4a6883fd6f067112f5c97e74737b38925fafe22cea3e12b868d4ddea5b3341db8fc2e788cab74f0a7a3cc27087a89365945369938650a99217d566e13f80dc87f08273f7411b6b01ef1d399c772a", "ECC.BinaryFinetField.module (2)");
154 is(a1.asString(16), "1401ca87b8f144684a2c58ae9308c237789e4bf1f36dd117c150b7d6076dd1da6197fe4c5225a064db0e4222589d5ca50eb6bb6b7147a03f61528438a8767c6a6c4a6883fd6f067112f5c97e74737b38925fafe22cea3e12b868d4ddea5b3341db8fc2e788cab74f0a7a3cc27087a89365945369938650a99217d566e13f80dc87f08273f7411b6b01ef1d399c772a", "ECC.BinaryFinetField.module (2)"); 151 is(a1.asString(16), "1401ca87b8f144684a2c58ae9308c237789e4bf1f36dd117c150b7d6076dd1da6197fe4c5225a064db0e4222589d5ca50eb6bb6b7147a03f61528438a8767c6a6c4a6883fd6f067112f5c97e74737b38925fafe22cea3e12b868d4ddea5b3341db8fc2e788cab74f0a7a3cc27087a89365945369938650a99217d566e13f80dc87f08273f7411b6b01ef1d399c772a", "ECC.BinaryFinetField.module (2)");
155 152
156 153
157 a = new Clipperz.Crypto.ECC.BinaryField.Value("112f5c97e74737b38925fafe22cea3e12b868d4ddea5b3341db8fc2e788cab74f0a7a3cc27087a89365945369938650a99217d566e13f80dc87f08273f7411b6b01ef1d399c772a1401ca87b8f144684a2c58ae9308c237789e4bf1f36dd117c150b7d6076dd1da6197fe4c5225a064db0e4222589d5ca50eb6bb6b7147a03f61528438a8767c6a6c4a6883fd6f067", 16); 154 a = new Clipperz.Crypto.ECC.BinaryField.Value("112f5c97e74737b38925fafe22cea3e12b868d4ddea5b3341db8fc2e788cab74f0a7a3cc27087a89365945369938650a99217d566e13f80dc87f08273f7411b6b01ef1d399c772a1401ca87b8f144684a2c58ae9308c237789e4bf1f36dd117c150b7d6076dd1da6197fe4c5225a064db0e4222589d5ca50eb6bb6b7147a03f61528438a8767c6a6c4a6883fd6f067", 16);
158 result = f2m.module(a); 155 result = f2m.module(a);
159 result_improved = f2m_improved.module(a); 156 result_improved = f2m_improved.module(a);
160 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("e160dd4a436e63877e1343d06576beaa66e06863ffe4335be38d6a37460a62d11133584a5bc6ac0590e18942e1fa88bb64a4d9fc6c1fd7b55d7e57b50b70a9e7cb2ed904ad77f4", 16); 157 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("e160dd4a436e63877e1343d06576beaa66e06863ffe4335be38d6a37460a62d11133584a5bc6ac0590e18942e1fa88bb64a4d9fc6c1fd7b55d7e57b50b70a9e7cb2ed904ad77f4", 16);
161 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.module (2)"); 158 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.module (2)");
162 is(result_improved.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.module (improved) (2)"); 159 is(result_improved.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.module (improved) (2)");
163 160
164 //------------------------------------------------------------------------- 161 //-------------------------------------------------------------------------
165} catch (err) { 162} catch (err) {
166 163
167 var s = "test suite failure!\n"; 164 var s = "test suite failure!\n";
168 var o = {}; 165 var o = {};
169 var k = null; 166 var k = null;
170 for (k in err) { 167 for (k in err) {
171 // ensure unique keys?! 168 // ensure unique keys?!
172 if (!o[k]) { 169 if (!o[k]) {
173 s += k + ": " + err[k] + "\n"; 170 s += k + ": " + err[k] + "\n";
174 o[k] = err[k]; 171 o[k] = err[k];
175 } 172 }
176 } 173 }
177 ok ( false, s ); 174 ok ( false, s );
178} 175}
179 176
180</script> 177</script>
181</pre> 178</pre>
182</body> 179</body>
183</html> 180</html>
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 885bcc4..c58cf42 100644
--- a/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.Value.html
+++ b/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.Value.html
@@ -1,408 +1,405 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27--> 24-->
28 25
29<html> 26<html>
30<head> 27<head>
31 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 28 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
32 <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script> 29 <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script>
33 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> 30 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
34 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> 31 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
35 32
36 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 33 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
37 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 34 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
38 35
39 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> 36 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
40 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> 37 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
41<!--<script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC.js'></script>--> 38<!--<script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC.js'></script>-->
42 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Value.js'></script> 39 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Value.js'></script>
43 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Point.js'></script> 40 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Point.js'></script>
44 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/FiniteField.js'></script> 41 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/FiniteField.js'></script>
45 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Curve.js'></script> 42 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Curve.js'></script>
46 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Functions.js'></script> 43 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Functions.js'></script>
47</head> 44</head>
48<body> 45<body>
49<pre id="test"> 46<pre id="test">
50<script type="text/javascript"> 47<script type="text/javascript">
51try { 48try {
52 var value_1; 49 var value_1;
53 var value_2; 50 var value_2;
54 51
55 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("a", 16); 52 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("a", 16);
56 is(value_1.asString(16), "0a"); 53 is(value_1.asString(16), "0a");
57 54
58 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("ffff", 16); 55 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("ffff", 16);
59 is(value_1.asString(16), "ffff"); 56 is(value_1.asString(16), "ffff");
60 57
61 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("7fff", 16); 58 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("7fff", 16);
62 is(value_1.asString(16), "7fff"); 59 is(value_1.asString(16), "7fff");
63 60
64 is(parseInt("ffff", 16), 65535); 61 is(parseInt("ffff", 16), 65535);
65 is(parseInt("ffffff", 16), 16777215); 62 is(parseInt("ffffff", 16), 16777215);
66 is(parseInt("ffffffff", 16), 4294967295); 63 is(parseInt("ffffffff", 16), 4294967295);
67 is(parseInt("ffffffffff", 16), 1099511627775); 64 is(parseInt("ffffffffff", 16), 1099511627775);
68 is(parseInt("ffffffffffff", 16), 281474976710655); 65 is(parseInt("ffffffffffff", 16), 281474976710655);
69 is(parseInt("ffffffffffffff", 16), 72057594037927940); 66 is(parseInt("ffffffffffffff", 16), 72057594037927940);
70 is(parseInt("ffffffffffffffff", 16), 18446744073709552000); 67 is(parseInt("ffffffffffffffff", 16), 18446744073709552000);
71 is(parseInt("10000000000000000", 16), 18446744073709552001); 68 is(parseInt("10000000000000000", 16), 18446744073709552001);
72 is(parseInt("10000000000000001", 16), 18446744073709552002); 69 is(parseInt("10000000000000001", 16), 18446744073709552002);
73 is(parseInt("10000000000000009", 16), 18446744073709552010); 70 is(parseInt("10000000000000009", 16), 18446744073709552010);
74 71
75 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("000108cbbacda1f03ea9360301045434ec7d82ba150936df08a229cbb4832ce1", 16); 72 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("000108cbbacda1f03ea9360301045434ec7d82ba150936df08a229cbb4832ce1", 16);
76 is(value_1.wordSize(), 8, "check the number of words of a 64 char hex string using the 'wordSize' method"); 73 is(value_1.wordSize(), 8, "check the number of words of a 64 char hex string using the 'wordSize' method");
77 74
78 // 000108cb bacda1f0 3ea93603 01045434 ec7d82ba 150936df 08a229cb b4832ce1 75 // 000108cb bacda1f0 3ea93603 01045434 ec7d82ba 150936df 08a229cb b4832ce1
79 is(value_1.value()[0], parseInt("b4832ce1", 16), "word[0]"); 76 is(value_1.value()[0], parseInt("b4832ce1", 16), "word[0]");
80 is(value_1.value()[1], parseInt("08a229cb", 16), "word[1]"); 77 is(value_1.value()[1], parseInt("08a229cb", 16), "word[1]");
81 is(value_1.value()[2], parseInt("150936df", 16), "word[2]"); 78 is(value_1.value()[2], parseInt("150936df", 16), "word[2]");
82 is(value_1.value()[3], parseInt("ec7d82ba", 16), "word[3]"); 79 is(value_1.value()[3], parseInt("ec7d82ba", 16), "word[3]");
83 is(value_1.value()[4], parseInt("01045434", 16), "word[4]"); 80 is(value_1.value()[4], parseInt("01045434", 16), "word[4]");
84 is(value_1.value()[5], parseInt("3ea93603", 16), "word[5]"); 81 is(value_1.value()[5], parseInt("3ea93603", 16), "word[5]");
85 is(value_1.value()[6], parseInt("bacda1f0", 16), "word[6]"); 82 is(value_1.value()[6], parseInt("bacda1f0", 16), "word[6]");
86 is(value_1.value()[7], parseInt("000108cb", 16), "word[7]"); 83 is(value_1.value()[7], parseInt("000108cb", 16), "word[7]");
87 84
88 is(value_1.asString(16), "0108cbbacda1f03ea9360301045434ec7d82ba150936df08a229cbb4832ce1", "asString(16)"); 85 is(value_1.asString(16), "0108cbbacda1f03ea9360301045434ec7d82ba150936df08a229cbb4832ce1", "asString(16)");
89 86
90 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value('10 00000000 00000000', 16); 87 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value('10 00000000 00000000', 16);
91 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.wordSize(), 3, "check the number of words of a value with only a bit set on the first slot of byte at position 17");
92 is(value_1.value()[0], parseInt("00000000", 16), "word[0]"); 89 is(value_1.value()[0], parseInt("00000000", 16), "word[0]");
93 is(value_1.value()[1], parseInt("00000000", 16), "word[1]"); 90 is(value_1.value()[1], parseInt("00000000", 16), "word[1]");
94 is(value_1.value()[2], parseInt("10", 16), "word[2]"); 91 is(value_1.value()[2], parseInt("10", 16), "word[2]");
95 is(value_1.asString(16), "100000000000000000", "2^17 asString(16)"); 92 is(value_1.asString(16), "100000000000000000", "2^17 asString(16)");
96 93
97 // 94 //
98 //XOR 95 //XOR
99 // 96 //
100 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855', 16); 97 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855', 16);
101 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855', 16); 98 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855', 16);
102 result = value_1.xor(value_2); 99 result = value_1.xor(value_2);
103 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value('0', 16); 100 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value('0', 16);
104 is(result.asString(16), expectedResult.asString(16), "a xor a = 0"); 101 is(result.asString(16), expectedResult.asString(16), "a xor a = 0");
105 102
106 // 103 //
107 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value('e3b0c442 98fc1c14 9afbf4c8 996fb924 27ae41e4 649b934c a495991b 7852b855', 16); 104 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value('e3b0c442 98fc1c14 9afbf4c8 996fb924 27ae41e4 649b934c a495991b 7852b855', 16);
108 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value('e3b0c442 98fc1c14 9afbf4c8 996fb924 27ae41e4 649b935c a495991b 7852b855', 16); 105 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value('e3b0c442 98fc1c14 9afbf4c8 996fb924 27ae41e4 649b935c a495991b 7852b855', 16);
109 result = value_1.xor(value_2); 106 result = value_1.xor(value_2);
110 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value('10 00000000 00000000', 16); 107 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value('10 00000000 00000000', 16);
111 is(result.asString(16), expectedResult.asString(16), "single bit difference"); 108 is(result.asString(16), expectedResult.asString(16), "single bit difference");
112 109
113 // 110 //
114 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("01", 16); 111 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("01", 16);
115 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b935ca495991b7852b855', 16); 112 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b935ca495991b7852b855', 16);
116 result = value_1.xor(value_2); 113 result = value_1.xor(value_2);
117 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b935ca495991b7852b854', 16); 114 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b935ca495991b7852b854', 16);
118 is(result.asString(16), expectedResult.asString(16), "01 xor value"); 115 is(result.asString(16), expectedResult.asString(16), "01 xor value");
119 116
120 // 117 //
121 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855', 16); 118 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855', 16);
122 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value('f3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855', 16); 119 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value('f3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855', 16);
123 result = value_1.xor(value_2); 120 result = value_1.xor(value_2);
124 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value('1000000000000000000000000000000000000000000000000000000000000000', 16); 121 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value('1000000000000000000000000000000000000000000000000000000000000000', 16);
125 is(result.asString(16), expectedResult.asString(16), "first bit difference xor"); 122 is(result.asString(16), expectedResult.asString(16), "first bit difference xor");
126 123
127 // 124 //
128 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value('84a2c58a', 16); 125 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value('84a2c58a', 16);
129 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value('38925faf', 16); 126 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value('38925faf', 16);
130 result = value_1.xor(value_2); 127 result = value_1.xor(value_2);
131 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value('bc309a25', 16); 128 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value('bc309a25', 16);
132 is(result.asString(16), expectedResult.asString(16), "84a2c58a XOR 38925faf = bc309a25"); 129 is(result.asString(16), expectedResult.asString(16), "84a2c58a XOR 38925faf = bc309a25");
133 130
134 // 131 //
135 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("01401ca87b8f144684a2c58ae9308c237789e4bf1f36dd117c150b7d6076dd1da6197fe4c5225a064db0e4222589d5ca50eb6bb6b7147a03f61528438a8767c6a6c4a6883fd6f067", 16); 132 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("01401ca87b8f144684a2c58ae9308c237789e4bf1f36dd117c150b7d6076dd1da6197fe4c5225a064db0e4222589d5ca50eb6bb6b7147a03f61528438a8767c6a6c4a6883fd6f067", 16);
136 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("0112f5c97e74737b38925fafe22cea3e12b868d4ddea5b3341db8fc2e788cab74f0a7a3cc27087a89365945369938650a99217d566e13f80dc87f08273f7411b6b01ef1d399c772a", 16); 133 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("0112f5c97e74737b38925fafe22cea3e12b868d4ddea5b3341db8fc2e788cab74f0a7a3cc27087a89365945369938650a99217d566e13f80dc87f08273f7411b6b01ef1d399c772a", 16);
137 result = value_1.xor(value_2); 134 result = value_1.xor(value_2);
138 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value('0052e96105fb673dbc309a250b1c661d65318c6bc2dc86223dce84bf87fe17aae91305d80752ddaeded570714c1a539af9797c63d1f545832a92d8c1f97026ddcdc54995064a874d', 16); 135 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value('0052e96105fb673dbc309a250b1c661d65318c6bc2dc86223dce84bf87fe17aae91305d80752ddaeded570714c1a539af9797c63d1f545832a92d8c1f97026ddcdc54995064a874d', 16);
139 is(result.asString(16), expectedResult.asString(16), "xor"); 136 is(result.asString(16), expectedResult.asString(16), "xor");
140 137
141 138
142 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000425", 16); 139 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000425", 16);
143 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("01ebcb09fac51945162a0775f42df6151169826efdc55dea5d17c22adb92e6b1a6ae8311545ad7e0f46f09a5b960855e673db1e803a5b94562161213204ca1f24792e81f06a4f816429a492f106cc6d0b0ff4617b736dab590590a8cff9f807a15282544404e6b35841703c9fb00a9cad1d6878d601efc25368bdc51d5ff14a81610f4fe62cb2f452aee520a16", 16); 140 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("01ebcb09fac51945162a0775f42df6151169826efdc55dea5d17c22adb92e6b1a6ae8311545ad7e0f46f09a5b960855e673db1e803a5b94562161213204ca1f24792e81f06a4f816429a492f106cc6d0b0ff4617b736dab590590a8cff9f807a15282544404e6b35841703c9fb00a9cad1d6878d601efc25368bdc51d5ff14a81610f4fe62cb2f452aee520a16", 16);
144 result = value_2.xor(value_1.shiftLeft(value_2.bitSize() - value_1.bitSize())); 141 result = value_2.xor(value_1.shiftLeft(value_2.bitSize() - value_1.bitSize()));
145 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("ebcb09fac51945162a0775f42df6151169826efdc55dea5d17c22adb92e6b1a6ae8311545ad7e0f46f09a5b960855e673db1e803a5b94562161213204ca1f24792e81f06a4f892e29a492f106cc6d0b0ff4617b736dab590590a8cff9f807a15282544404e6b35841703c9fb00a9cad1d6878d601efc25368bdc51d5ff14a81610f4fe62cb2f452aee520a16", 16); 142 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("ebcb09fac51945162a0775f42df6151169826efdc55dea5d17c22adb92e6b1a6ae8311545ad7e0f46f09a5b960855e673db1e803a5b94562161213204ca1f24792e81f06a4f892e29a492f106cc6d0b0ff4617b736dab590590a8cff9f807a15282544404e6b35841703c9fb00a9cad1d6878d601efc25368bdc51d5ff14a81610f4fe62cb2f452aee520a16", 16);
146 is(result.asString(16), expectedResult.asString(16), "xor"); 143 is(result.asString(16), expectedResult.asString(16), "xor");
147 is(result.bitSize(), 1120, "xor.bitSize"); 144 is(result.bitSize(), 1120, "xor.bitSize");
148 is(result.wordSize(), 35, "result wordSize"); 145 is(result.wordSize(), 35, "result wordSize");
149 is(expectedResult.bitSize(), 1120, "xor.bitSize"); 146 is(expectedResult.bitSize(), 1120, "xor.bitSize");
150 is(expectedResult.wordSize(), 35, "expectedResult wordSize"); 147 is(expectedResult.wordSize(), 35, "expectedResult wordSize");
151 is(result.compare(expectedResult), 0, "compare"); 148 is(result.compare(expectedResult), 0, "compare");
152 149
153 150
154 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000425", 16); 151 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000425", 16);
155 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("ebcb09fac51945162a0775f42df6151169826efdc55dea5d17c22adb92e6b1a6ae8311545ad7e0f46f09a5b960855e673db1e803a5b94562161213204ca1f24792e81f06a4f892e29a492f106cc6d0b0ff4617b736dab590590a8cff9f807a15282544404e6b35841703c9fb00a9cad1d6878d601efc25368bdc51d5ff14a81610f4fe62cb2f452aee520a16", 16); 152 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("ebcb09fac51945162a0775f42df6151169826efdc55dea5d17c22adb92e6b1a6ae8311545ad7e0f46f09a5b960855e673db1e803a5b94562161213204ca1f24792e81f06a4f892e29a492f106cc6d0b0ff4617b736dab590590a8cff9f807a15282544404e6b35841703c9fb00a9cad1d6878d601efc25368bdc51d5ff14a81610f4fe62cb2f452aee520a16", 16);
156 result = value_2.xor(value_1.shiftLeft(value_2.bitSize() - value_1.bitSize())); 153 result = value_2.xor(value_1.shiftLeft(value_2.bitSize() - value_1.bitSize()));
157 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("6bcb09fac51945162a0775f42df6151169826efdc55dea5d17c22adb92e6b1a6ae8311545ad7e0f46f09a5b960855e673db1e803a5b94562161213204ca1f24792e81f06a4f8d0b29a492f106cc6d0b0ff4617b736dab590590a8cff9f807a15282544404e6b35841703c9fb00a9cad1d6878d601efc25368bdc51d5ff14a81610f4fe62cb2f452aee520a16", 16); 154 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("6bcb09fac51945162a0775f42df6151169826efdc55dea5d17c22adb92e6b1a6ae8311545ad7e0f46f09a5b960855e673db1e803a5b94562161213204ca1f24792e81f06a4f8d0b29a492f106cc6d0b0ff4617b736dab590590a8cff9f807a15282544404e6b35841703c9fb00a9cad1d6878d601efc25368bdc51d5ff14a81610f4fe62cb2f452aee520a16", 16);
158 is(result.asString(16), expectedResult.asString(16), "xor"); 155 is(result.asString(16), expectedResult.asString(16), "xor");
159 is(result.bitSize(), 1119, "xor.bitSize"); 156 is(result.bitSize(), 1119, "xor.bitSize");
160 is(expectedResult.bitSize(), 1119, "xor.bitSize"); 157 is(expectedResult.bitSize(), 1119, "xor.bitSize");
161 is(result.compare(expectedResult), 0, "compare"); 158 is(result.compare(expectedResult), 0, "compare");
162 //value_1 = 159 //value_1 =
163 //value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000042500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 16); 160 //value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000042500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 16);
164 161
165 162
166 value_1 = (new Clipperz.Crypto.ECC.BinaryField.Value("10101010 01010101 00000000", 16)).value(); 163 value_1 = (new Clipperz.Crypto.ECC.BinaryField.Value("10101010 01010101 00000000", 16)).value();
167 value_2 = (new Clipperz.Crypto.ECC.BinaryField.Value("10101010", 16)).value(); 164 value_2 = (new Clipperz.Crypto.ECC.BinaryField.Value("10101010", 16)).value();
168 result = new Clipperz.Crypto.ECC.BinaryField.Value(Clipperz.Crypto.ECC.BinaryField.Value._xor(value_1, value_2, 2)); 165 result = new Clipperz.Crypto.ECC.BinaryField.Value(Clipperz.Crypto.ECC.BinaryField.Value._xor(value_1, value_2, 2));
169 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("01010101 00000000", 16); 166 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("01010101 00000000", 16);
170 is(result.asString(16), expectedResult.asString(16), "xor with offset 2"); 167 is(result.asString(16), expectedResult.asString(16), "xor with offset 2");
171 168
172 value_1 = (new Clipperz.Crypto.ECC.BinaryField.Value(" 10101010 01010101 00000000", 16)).value(); 169 value_1 = (new Clipperz.Crypto.ECC.BinaryField.Value(" 10101010 01010101 00000000", 16)).value();
173 value_2 = (new Clipperz.Crypto.ECC.BinaryField.Value("10101010 10101010", 16)).value(); 170 value_2 = (new Clipperz.Crypto.ECC.BinaryField.Value("10101010 10101010", 16)).value();
174 result = new Clipperz.Crypto.ECC.BinaryField.Value(Clipperz.Crypto.ECC.BinaryField.Value._xor(value_1, value_2, 2)); 171 result = new Clipperz.Crypto.ECC.BinaryField.Value(Clipperz.Crypto.ECC.BinaryField.Value._xor(value_1, value_2, 2));
175 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("10101010 00000000 01010101 00000000", 16); 172 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("10101010 00000000 01010101 00000000", 16);
176 is(result.asString(16), expectedResult.asString(16), "xor with offset 2 (2)"); 173 is(result.asString(16), expectedResult.asString(16), "xor with offset 2 (2)");
177 174
178 // 175 //
179 //isZero 176 //isZero
180 // 177 //
181 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value('0', 16); 178 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value('0', 16);
182 is(value_1.isZero(), true, "0.isZero() == true"); 179 is(value_1.isZero(), true, "0.isZero() == true");
183 180
184 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value('1', 16); 181 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value('1', 16);
185 is(value_1.isZero(), false, "1.isZero() == false"); 182 is(value_1.isZero(), false, "1.isZero() == false");
186 183
187 // 184 //
188 //Comparison 185 //Comparison
189 // 186 //
190 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("0", 16); 187 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("0", 16);
191 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("0", 16); 188 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("0", 16);
192 is (value_1.compare(value_2), 0, "BinaryField.value(0) = BinaryField.value(0)"); 189 is (value_1.compare(value_2), 0, "BinaryField.value(0) = BinaryField.value(0)");
193 //is (value_1.compare(0), 0, "BinaryField.value(0) = 0"); 190 //is (value_1.compare(0), 0, "BinaryField.value(0) = 0");
194 191
195 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("000108cbbacda1f03ea9360301045434ec7d82ba150936df08a229cbb4832ce1", 16); 192 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("000108cbbacda1f03ea9360301045434ec7d82ba150936df08a229cbb4832ce1", 16);
196 is (value_1.compare(value_2), 1, "BinaryField.value(xxxxxx) != BinaryField.value(0)"); 193 is (value_1.compare(value_2), 1, "BinaryField.value(xxxxxx) != BinaryField.value(0)");
197 194
198 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("000108cbbacda1f03ea9360301045434ec7d82ba150936df08a229cbb4832ce1", 16); 195 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("000108cbbacda1f03ea9360301045434ec7d82ba150936df08a229cbb4832ce1", 16);
199 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("0", 16); 196 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("0", 16);
200 is(value_1.compare(value_2), 1, "BinaryField.value(xxxxxx) > BinaryField.value(0)"); 197 is(value_1.compare(value_2), 1, "BinaryField.value(xxxxxx) > BinaryField.value(0)");
201 is(value_2.compare(value_1), -1, "BinaryField.value(0) < BinaryField.value(xxxx)"); 198 is(value_2.compare(value_1), -1, "BinaryField.value(0) < BinaryField.value(xxxx)");
202 199
203 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("000108cbbacda1f03ea9360301045434ec7d82ba150936df08a229cbb4832ce1", 16); 200 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("000108cbbacda1f03ea9360301045434ec7d82ba150936df08a229cbb4832ce1", 16);
204 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("05", 16); 201 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("05", 16);
205 is(value_1.compare(value_2), 1, "BinaryField.value(xxxxxx) > BinaryField.value(05)"); 202 is(value_1.compare(value_2), 1, "BinaryField.value(xxxxxx) > BinaryField.value(05)");
206 is(value_2.compare(value_1), -1, "BinaryField.value(05) < BinaryField.value(xxxx)"); 203 is(value_2.compare(value_1), -1, "BinaryField.value(05) < BinaryField.value(xxxx)");
207 204
208 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("-10", 16); 205 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("-10", 16);
209 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("10", 16); 206 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("10", 16);
210 is(value_1.compare(value_2), -1, "BinaryField.value(-10) - BinaryField.value(10). No negative number are managed"); 207 is(value_1.compare(value_2), -1, "BinaryField.value(-10) - BinaryField.value(10). No negative number are managed");
211 208
212 // 209 //
213 //more comparison 210 //more comparison
214 // 211 //
215 212
216 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16); 213 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16);
217 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16); 214 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16);
218 result = value_1.compare(value_2); 215 result = value_1.compare(value_2);
219 is(result, 0, "equal compare"); 216 is(result, 0, "equal compare");
220 217
221 // 218 //
222 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("e3b0c442", 16); 219 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("e3b0c442", 16);
223 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("f3b0c442", 16); 220 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("f3b0c442", 16);
224 result = value_1.compare(value_2); 221 result = value_1.compare(value_2);
225 is(result, -1, "second term with one more bit at the leftmost - compare (1)"); 222 is(result, -1, "second term with one more bit at the leftmost - compare (1)");
226 223
227 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("e3b0c442 98fc1c14", 16); 224 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("e3b0c442 98fc1c14", 16);
228 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("f3b0c442 98fc1c14", 16); 225 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("f3b0c442 98fc1c14", 16);
229 result = value_1.compare(value_2); 226 result = value_1.compare(value_2);
230 is(result, -1, "second term with one more bit at the leftmost - compare (2)"); 227 is(result, -1, "second term with one more bit at the leftmost - compare (2)");
231 228
232 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("e3b0c442 98fc1c14 9afbf4c8", 16); 229 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("e3b0c442 98fc1c14 9afbf4c8", 16);
233 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("f3b0c442 98fc1c14 9afbf4c8", 16); 230 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("f3b0c442 98fc1c14 9afbf4c8", 16);
234 result = value_1.compare(value_2); 231 result = value_1.compare(value_2);
235 is(result, -1, "second term with one more bit at the leftmost - compare (3)"); 232 is(result, -1, "second term with one more bit at the leftmost - compare (3)");
236 233
237 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("e3b0c442 98fc1c14 9afbf4c8 996fb924 27ae41e4 649b934c a495991b 7852b855", 16); 234 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("e3b0c442 98fc1c14 9afbf4c8 996fb924 27ae41e4 649b934c a495991b 7852b855", 16);
238 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("f3b0c442 98fc1c14 9afbf4c8 996fb924 27ae41e4 649b934c a495991b 7852b855", 16); 235 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("f3b0c442 98fc1c14 9afbf4c8 996fb924 27ae41e4 649b934c a495991b 7852b855", 16);
239 result = value_1.compare(value_2); 236 result = value_1.compare(value_2);
240 is(result, -1, "second term with one more bit at the leftmost - compare (n)"); 237 is(result, -1, "second term with one more bit at the leftmost - compare (n)");
241 238
242 // 239 //
243 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("f3b0c442", 16); 240 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("f3b0c442", 16);
244 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("e3b0c442", 16); 241 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("e3b0c442", 16);
245 result = value_1.compare(value_2); 242 result = value_1.compare(value_2);
246 is(result, 1, "first term with one more bit at the leftmost - compare (1)"); 243 is(result, 1, "first term with one more bit at the leftmost - compare (1)");
247 244
248 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("f3b0c442 98fc1c14", 16); 245 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("f3b0c442 98fc1c14", 16);
249 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("e3b0c442 98fc1c14", 16); 246 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("e3b0c442 98fc1c14", 16);
250 result = value_1.compare(value_2); 247 result = value_1.compare(value_2);
251 is(result, 1, "first term with one more bit at the leftmost - compare (2)"); 248 is(result, 1, "first term with one more bit at the leftmost - compare (2)");
252 249
253 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("f3b0c442 98fc1c14 9afbf4c8 996fb924 27ae41e4 649b934c a495991b 7852b855", 16); 250 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("f3b0c442 98fc1c14 9afbf4c8 996fb924 27ae41e4 649b934c a495991b 7852b855", 16);
254 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("e3b0c442 98fc1c14 9afbf4c8 996fb924 27ae41e4 649b934c a495991b 7852b855", 16); 251 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("e3b0c442 98fc1c14 9afbf4c8 996fb924 27ae41e4 649b934c a495991b 7852b855", 16);
255 result = value_1.compare(value_2); 252 result = value_1.compare(value_2);
256 is(result, 1, "first term with one more bit at the leftmost - compare (n)"); 253 is(result, 1, "first term with one more bit at the leftmost - compare (n)");
257 254
258 // 255 //
259 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("e3b0c44298fc1c149afbf4c8996fb92427af41e4649b934ca495991b7852b855", 16); 256 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("e3b0c44298fc1c149afbf4c8996fb92427af41e4649b934ca495991b7852b855", 16);
260 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16); 257 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16);
261 result = value_1.compare(value_2); 258 result = value_1.compare(value_2);
262 is(result, 1, "first term with one more bit in the middle - compare"); 259 is(result, 1, "first term with one more bit in the middle - compare");
263 260
264 // 261 //
265 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("e3b0c44298fc1c149afbf4c8996fb92427af41e4649b934ca495991b7852b855", 16); 262 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("e3b0c44298fc1c149afbf4c8996fb92427af41e4649b934ca495991b7852b855", 16);
266 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("e3b0c44298fc1c149afbf4c8996fb92427aeffffffffffffffffffffffffffff", 16); 263 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("e3b0c44298fc1c149afbf4c8996fb92427aeffffffffffffffffffffffffffff", 16);
267 result = value_1.compare(value_2); 264 result = value_1.compare(value_2);
268 is(result, 1, "first term with one more bit in the middle - compare"); 265 is(result, 1, "first term with one more bit in the middle - compare");
269 266
270 // 267 //
271 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16); 268 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16);
272 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("05", 16); 269 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value("05", 16);
273 result = value_1.compare(value_2); 270 result = value_1.compare(value_2);
274 is(result, 1, "equal compare"); 271 is(result, 1, "equal compare");
275 272
276 273
277 274
278 // 275 //
279 //isBitSet 276 //isBitSet
280 // 277 //
281 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("ff", 16); 278 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("ff", 16);
282 result = value_1.isBitSet(1); 279 result = value_1.isBitSet(1);
283 expectedResult = true; 280 expectedResult = true;
284 is(result, expectedResult, "'ff'.isBitSet(1)"); 281 is(result, expectedResult, "'ff'.isBitSet(1)");
285 282
286 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("f0", 16); 283 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("f0", 16);
287 result =value_1.isBitSet(1); 284 result =value_1.isBitSet(1);
288 expectedResult = false; 285 expectedResult = false;
289 is(result, expectedResult, "'f0'.isBitSet(1)"); 286 is(result, expectedResult, "'f0'.isBitSet(1)");
290 287
291 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("f0", 16); 288 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("f0", 16);
292 result = value_1.isBitSet(3); 289 result = value_1.isBitSet(3);
293 expectedResult = false; 290 expectedResult = false;
294 is(result, expectedResult, "'f0'.isBitSet(3)"); 291 is(result, expectedResult, "'f0'.isBitSet(3)");
295 292
296 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("f0", 16); 293 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("f0", 16);
297 result = value_1.isBitSet(4); 294 result = value_1.isBitSet(4);
298 expectedResult = true; 295 expectedResult = true;
299 is(result, expectedResult, "'f0'.isBitSet(4)"); 296 is(result, expectedResult, "'f0'.isBitSet(4)");
300 297
301 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("ff00", 16); 298 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("ff00", 16);
302 result = value_1.isBitSet(7); 299 result = value_1.isBitSet(7);
303 expectedResult = false; 300 expectedResult = false;
304 is(result, expectedResult, "'ff00'.isBitSet(7)"); 301 is(result, expectedResult, "'ff00'.isBitSet(7)");
305 302
306 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("ff00", 16); 303 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("ff00", 16);
307 result = value_1.isBitSet(8); 304 result = value_1.isBitSet(8);
308 expectedResult = true; 305 expectedResult = true;
309 is(result, expectedResult, "'ff00'.isBitSet(8)"); 306 is(result, expectedResult, "'ff00'.isBitSet(8)");
310 307
311 // 308 //
312 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("05000000000000", 16); 309 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("05000000000000", 16);
313 result = value_1.isBitSet(47); 310 result = value_1.isBitSet(47);
314 expectedResult = false; 311 expectedResult = false;
315 is(result, expectedResult, "'05000000000000'.isBitSet(47)"); 312 is(result, expectedResult, "'05000000000000'.isBitSet(47)");
316 313
317 result = value_1.isBitSet(48); 314 result = value_1.isBitSet(48);
318 expectedResult = true; 315 expectedResult = true;
319 is(result, expectedResult, "'05000000000000'.isBitSet(48)"); 316 is(result, expectedResult, "'05000000000000'.isBitSet(48)");
320 317
321 result = value_1.isBitSet(49); 318 result = value_1.isBitSet(49);
322 expectedResult = false; 319 expectedResult = false;
323 is(result, expectedResult, "'05000000000000'.isBitSet(49)"); 320 is(result, expectedResult, "'05000000000000'.isBitSet(49)");
324 321
325 result = value_1.isBitSet(50); 322 result = value_1.isBitSet(50);
326 expectedResult = true; 323 expectedResult = true;
327 is(result, expectedResult, "'05000000000000'.isBitSet(50)"); 324 is(result, expectedResult, "'05000000000000'.isBitSet(50)");
328 325
329 result = value_1.isBitSet(51); 326 result = value_1.isBitSet(51);
330 expectedResult = false; 327 expectedResult = false;
331 is(result, expectedResult, "'05000000000000'.isBitSet(51)"); 328 is(result, expectedResult, "'05000000000000'.isBitSet(51)");
332 329
333 // 330 //
334 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16); 331 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16);
335 332
336 result = value_1.isBitSet(52); 333 result = value_1.isBitSet(52);
337 is(result, true, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(52)"); 334 is(result, true, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(52)");
338 335
339 result = value_1.isBitSet(53); 336 result = value_1.isBitSet(53);
340 is(result, false, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(53)"); 337 is(result, false, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(53)");
341 338
342 result = value_1.isBitSet(54); 339 result = value_1.isBitSet(54);
343 is(result, false, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(54)"); 340 is(result, false, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(54)");
344 341
345 result = value_1.isBitSet(55); 342 result = value_1.isBitSet(55);
346 is(result, true, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(55)"); 343 is(result, true, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(55)");
347 344
348 result = value_1.isBitSet(56); 345 result = value_1.isBitSet(56);
349 is(result, false, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(56)"); 346 is(result, false, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(56)");
350 347
351 result = value_1.isBitSet(57); 348 result = value_1.isBitSet(57);
352 is(result, false, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(57)"); 349 is(result, false, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(57)");
353 350
354 result = value_1.isBitSet(58); 351 result = value_1.isBitSet(58);
355 is(result, true, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(58)"); 352 is(result, true, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(58)");
356 353
357 result = value_1.isBitSet(59); 354 result = value_1.isBitSet(59);
358 is(result, false, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(59)"); 355 is(result, false, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(59)");
359 356
360 result = value_1.isBitSet(60); 357 result = value_1.isBitSet(60);
361 is(result, false, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(60)"); 358 is(result, false, "'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'.isBitSet(60)");
362 359
363 360
364 // 361 //
365 //shiftLeft 362 //shiftLeft
366 // 363 //
367 364
368 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("7f", 16); 365 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("7f", 16);
369 result = value_1.shiftLeft(1); 366 result = value_1.shiftLeft(1);
370 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value('fe', 16); 367 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value('fe', 16);
371 is(result.asString(16), expectedResult.asString(16), "'7f'.shiftLeft(1)"); 368 is(result.asString(16), expectedResult.asString(16), "'7f'.shiftLeft(1)");
372 369
373 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("ff", 16); 370 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("ff", 16);
374 result = value_1.shiftLeft(1); 371 result = value_1.shiftLeft(1);
375 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value('01fe', 16); 372 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value('01fe', 16);
376 is(result.asString(16), expectedResult.asString(16), "'ff'.shiftLeft(1)"); 373 is(result.asString(16), expectedResult.asString(16), "'ff'.shiftLeft(1)");
377 374
378 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value( 'ffff', 16); 375 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value( 'ffff', 16);
379 expectedResult =new Clipperz.Crypto.ECC.BinaryField.Value('ffff00', 16); 376 expectedResult =new Clipperz.Crypto.ECC.BinaryField.Value('ffff00', 16);
380 result = value_1.shiftLeft(8); 377 result = value_1.shiftLeft(8);
381 is(result.asString(16), expectedResult.asString(16), "ffff.shiftLeft(8)"); 378 is(result.asString(16), expectedResult.asString(16), "ffff.shiftLeft(8)");
382 379
383 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value( '80000000', 16); 380 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value( '80000000', 16);
384 expectedResult =new Clipperz.Crypto.ECC.BinaryField.Value('1 00000000', 16); 381 expectedResult =new Clipperz.Crypto.ECC.BinaryField.Value('1 00000000', 16);
385 result = value_1.shiftLeft(1); 382 result = value_1.shiftLeft(1);
386 is(result.compare(expectedResult) == 0, true, '8000000.shiftLeft(1).compare'); 383 is(result.compare(expectedResult) == 0, true, '8000000.shiftLeft(1).compare');
387 is(result.asString(16), expectedResult.asString(16), "80000000.shiftLeft(1)"); 384 is(result.asString(16), expectedResult.asString(16), "80000000.shiftLeft(1)");
388 385
389 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value('20000000', 16); 386 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value('20000000', 16);
390 expectedResult =new Clipperz.Crypto.ECC.BinaryField.Value('40000000', 16); 387 expectedResult =new Clipperz.Crypto.ECC.BinaryField.Value('40000000', 16);
391 result = value_1.shiftLeft(1); 388 result = value_1.shiftLeft(1);
392 is(result.compare(expectedResult) == 0, true, '2000000.shiftLeft(1).compare'); 389 is(result.compare(expectedResult) == 0, true, '2000000.shiftLeft(1).compare');
393 is(result.asString(16), expectedResult.asString(16), "20000000.shiftLeft(1)"); 390 is(result.asString(16), expectedResult.asString(16), "20000000.shiftLeft(1)");
394 391
395 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value('40000000', 16); 392 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value('40000000', 16);
396 expectedResult =new Clipperz.Crypto.ECC.BinaryField.Value('80000000', 16); 393 expectedResult =new Clipperz.Crypto.ECC.BinaryField.Value('80000000', 16);
397 result = value_1.shiftLeft(1); 394 result = value_1.shiftLeft(1);
398 is(result.compare(expectedResult) == 0, true, '4000000.shiftLeft(1).compare'); 395 is(result.compare(expectedResult) == 0, true, '4000000.shiftLeft(1).compare');
399 is(result.asString(16), expectedResult.asString(16), "40000000.shiftLeft(1)"); 396 is(result.asString(16), expectedResult.asString(16), "40000000.shiftLeft(1)");
400 397
401 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value( 'ff7fffff', 16); 398 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value( 'ff7fffff', 16);
402 expectedResult =new Clipperz.Crypto.ECC.BinaryField.Value('ff 7fffff00', 16); 399 expectedResult =new Clipperz.Crypto.ECC.BinaryField.Value('ff 7fffff00', 16);
403 result = value_1.shiftLeft(8); 400 result = value_1.shiftLeft(8);
404 is(result.asString(16), expectedResult.asString(16), "ff7fffff.shiftLeft(8)"); 401 is(result.asString(16), expectedResult.asString(16), "ff7fffff.shiftLeft(8)");
405 402
406 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value( 'ffffffff', 16); 403 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value( 'ffffffff', 16);
407 expectedResult =new Clipperz.Crypto.ECC.BinaryField.Value('ff ffffff00', 16); 404 expectedResult =new Clipperz.Crypto.ECC.BinaryField.Value('ff ffffff00', 16);
408 result = value_1.shiftLeft(8); 405 result = value_1.shiftLeft(8);
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 b53a9a1..b784f66 100644
--- a/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.K283.deferred.html
+++ b/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.K283.deferred.html
@@ -1,160 +1,157 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27--> 24-->
28 25
29<html> 26<html>
30<head> 27<head>
31<!-- - -> 28<!-- - ->
32 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 29 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
33<!- - --> 30<!- - -->
34<!-- --> 31<!-- -->
35 <script type="text/javascript" src="../../../../js/MochiKit/Base.js"></script> 32 <script type="text/javascript" src="../../../../js/MochiKit/Base.js"></script>
36 <script type="text/javascript" src="../../../../js/MochiKit/Async.js"></script> 33 <script type="text/javascript" src="../../../../js/MochiKit/Async.js"></script>
37 <script type="text/javascript" src="../../../../js/MochiKit/DOM.js"></script> 34 <script type="text/javascript" src="../../../../js/MochiKit/DOM.js"></script>
38 <script type="text/javascript" src="../../../../js/MochiKit/Logging.js"></script> 35 <script type="text/javascript" src="../../../../js/MochiKit/Logging.js"></script>
39 <script type="text/javascript" src="../../../../js/MochiKit/Iter.js"></script> 36 <script type="text/javascript" src="../../../../js/MochiKit/Iter.js"></script>
40<!-- --> 37<!-- -->
41 38
42<!-- - -> 39<!-- - ->
43 <script type="text/javascript" src="../../../../js/MochiKit/Style.js"></script> 40 <script type="text/javascript" src="../../../../js/MochiKit/Style.js"></script>
44 <script type="text/javascript" src="../../../../js/MochiKit/Signal.js"></script> 41 <script type="text/javascript" src="../../../../js/MochiKit/Signal.js"></script>
45 <script type="text/javascript" src="../../../../js/MochiKit/Color.js"></script> 42 <script type="text/javascript" src="../../../../js/MochiKit/Color.js"></script>
46 <script type="text/javascript" src="../../../../js/MochiKit/Position.js"></script> 43 <script type="text/javascript" src="../../../../js/MochiKit/Position.js"></script>
47 <script type="text/javascript" src="../../../../js/MochiKit/Visual.js"></script> 44 <script type="text/javascript" src="../../../../js/MochiKit/Visual.js"></script>
48<!- - --> 45<!- - -->
49 46
50 47
51 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> 48 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
52 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> 49 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
53 50
54<!--<script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>--> 51<!--<script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>-->
55<!--<script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>--> 52<!--<script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>-->
56<!--<script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>--> 53<!--<script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>-->
57 54
58<!--<script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Value.js'></script>--> 55<!--<script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Value.js'></script>-->
59<!--<script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Point.js'></script>--> 56<!--<script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Point.js'></script>-->
60<!--<script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/FiniteField.js'></script>--> 57<!--<script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/FiniteField.js'></script>-->
61<!--<script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Curve.js'></script>--> 58<!--<script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Curve.js'></script>-->
62 59
63 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/Koblitz/Value.js'></script> 60 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/Koblitz/Value.js'></script>
64 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/Koblitz/Point.js'></script> 61 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/Koblitz/Point.js'></script>
65 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/Koblitz/FiniteField.js'></script> 62 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/Koblitz/FiniteField.js'></script>
66 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/Koblitz/Curve.js'></script> 63 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/Koblitz/Curve.js'></script>
67 64
68 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/StandardCurves.js'></script> 65 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/StandardCurves.js'></script>
69 66
70</head> 67</head>
71<body> 68<body>
72<pre id="test"> 69<pre id="test">
73<script type="text/javascript"> 70<script type="text/javascript">
74try { 71try {
75 72
76 var deferredResult; 73 var deferredResult;
77 74
78 75
79 deferredResult = new MochiKit.Async.Deferred(); 76 deferredResult = new MochiKit.Async.Deferred();
80//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 1: " + res); return res;}); 77//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 1: " + res); return res;});
81 78
82 // 79 //
83 //ECC.Curve.multiplication 80 //ECC.Curve.multiplication
84 // 81 //
85 varcurve; 82 varcurve;
86 var f2m; 83 var f2m;
87 var f2m_improved; 84 var f2m_improved;
88 var value; 85 var value;
89 var moduledValue; 86 var moduledValue;
90 var result; 87 var result;
91 var result_improved; 88 var result_improved;
92 var expectedResul; 89 var expectedResul;
93 90
94 f2m = new Clipperz.Crypto.ECC.Koblitz.FiniteField({modulus:new Clipperz.Crypto.ECC.Koblitz.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 000010a1', 16)}) 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)})
95 f2m_improved = Clipperz.Crypto.ECC.StandardCurves.K283().finiteField(); 92 f2m_improved = Clipperz.Crypto.ECC.StandardCurves.K283().finiteField();
96 93
97 curve = Clipperz.Crypto.ECC.StandardCurves.K283(); 94 curve = Clipperz.Crypto.ECC.StandardCurves.K283();
98 95
99/** / 96/** /
100 value = new Clipperz.Crypto.ECC.Koblitz.Value("7b", 16); 97 value = new Clipperz.Crypto.ECC.Koblitz.Value("7b", 16);
101 result = curve.multiply(value, curve.G()); 98 result = curve.multiply(value, curve.G());
102 expectedResult = new Clipperz.Crypto.ECC.Koblitz.Point({ 99 expectedResult = new Clipperz.Crypto.ECC.Koblitz.Point({
103 x: new Clipperz.Crypto.ECC.Koblitz.Value('29705d23a9cda75e43984bdb9a8fd33304682da0f506a69bdbd5f36657e11b41e35fcdd', 16), 100 x: new Clipperz.Crypto.ECC.Koblitz.Value('29705d23a9cda75e43984bdb9a8fd33304682da0f506a69bdbd5f36657e11b41e35fcdd', 16),
104 y: new Clipperz.Crypto.ECC.Koblitz.Value('59157d2ace16563a905361c5206cc0775c3330f4978bddf8aa9916c451cf9951313623b', 16) 101 y: new Clipperz.Crypto.ECC.Koblitz.Value('59157d2ace16563a905361c5206cc0775c3330f4978bddf8aa9916c451cf9951313623b', 16)
105 }); 102 });
106 is(result.x().asString(16), expectedResult.x().asString(16), "ECC.Curve.multiplication: result.x does match"); 103 is(result.x().asString(16), expectedResult.x().asString(16), "ECC.Curve.multiplication: result.x does match");
107 is(result.y().asString(16), expectedResult.y().asString(16), "ECC.Curve.multiplication: result.y does match"); 104 is(result.y().asString(16), expectedResult.y().asString(16), "ECC.Curve.multiplication: result.y does match");
108/ **/ 105/ **/
109 106
110 value = new Clipperz.Crypto.ECC.Koblitz.Value("ba35032a24eb81238251d85824998bebae3b3e09f4d3845256c87585cf62416ee43191", 16); 107 value = new Clipperz.Crypto.ECC.Koblitz.Value("ba35032a24eb81238251d85824998bebae3b3e09f4d3845256c87585cf62416ee43191", 16);
111 108
112//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 6: " + res); return res;}); 109//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 6: " + res); return res;});
113 //deferredResult.addCallback(console.time, 'K283.deferred.multiply - moduled value'); 110 //deferredResult.addCallback(console.time, 'K283.deferred.multiply - moduled value');
114//deferredResult.addBoth(function(res) {MochiKit.Base.logDebug("2 - " + res); return res;}); 111//deferredResult.addBoth(function(res) {MochiKit.Base.logDebug("2 - " + res); return res;});
115//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 7: " + res); return res;}); 112//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 7: " + res); return res;});
116 deferredResult.addMethod(curve, 'deferredMultiply', value, curve.G()); 113 deferredResult.addMethod(curve, 'deferredMultiply', value, curve.G());
117//deferredResult.addBoth(function(res) {MochiKit.Base.logDebug("3 - " + res); return res;}); 114//deferredResult.addBoth(function(res) {MochiKit.Base.logDebug("3 - " + res); return res;});
118//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 8: " + res); return res;}); 115//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 8: " + res); return res;});
119 //deferredResult.addBoth(function(res) {console.timeEnd('K283.deferred.multiply - moduled value'); return res;}); 116 //deferredResult.addBoth(function(res) {console.timeEnd('K283.deferred.multiply - moduled value'); return res;});
120//deferredResult.addBoth(function(res) {MochiKit.Base.logDebug("4 - " + res); return res;}); 117//deferredResult.addBoth(function(res) {MochiKit.Base.logDebug("4 - " + res); return res;});
121//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 9: " + res); return res;}); 118//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 9: " + res); return res;});
122 deferredResult.addCallback(function(res) { 119 deferredResult.addCallback(function(res) {
123 var expectedResult; 120 var expectedResult;
124 121
125 expectedResult = new Clipperz.Crypto.ECC.Koblitz.Point({ 122 expectedResult = new Clipperz.Crypto.ECC.Koblitz.Point({
126 x: new Clipperz.Crypto.ECC.Koblitz.Value('7cf07c0880d1ae59f567a2ce420e78d1fdfc1249df694a60e5d40d23c6dc631e1501b77', 16), 123 x: new Clipperz.Crypto.ECC.Koblitz.Value('7cf07c0880d1ae59f567a2ce420e78d1fdfc1249df694a60e5d40d23c6dc631e1501b77', 16),
127 y: new Clipperz.Crypto.ECC.Koblitz.Value('97d1257d5c98cf71cf481bc0a495e0588150ea904526f503cd600f5e971c39700e95f1', 16) 124 y: new Clipperz.Crypto.ECC.Koblitz.Value('97d1257d5c98cf71cf481bc0a495e0588150ea904526f503cd600f5e971c39700e95f1', 16)
128 }); 125 });
129 126
130 is(res.x().asString(16), expectedResult.x().asString(16), "ECC.Curve.multiplication: result.x does match"); 127 is(res.x().asString(16), expectedResult.x().asString(16), "ECC.Curve.multiplication: result.x does match");
131 is(res.y().asString(16), expectedResult.y().asString(16), "ECC.Curve.multiplication: result.y does match"); 128 is(res.y().asString(16), expectedResult.y().asString(16), "ECC.Curve.multiplication: result.y does match");
132 }) 129 })
133//deferredResult.addBoth(function(res) {MochiKit.Base.logDebug("5 - " + res); return res;}); 130//deferredResult.addBoth(function(res) {MochiKit.Base.logDebug("5 - " + res); return res;});
134//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 10: " + res); return res;}); 131//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 10: " + res); return res;});
135 deferredResult.addBoth(function(res) {SimpleTest.finish(); return res;}); 132 deferredResult.addBoth(function(res) {SimpleTest.finish(); return res;});
136//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 11: " + res); return res;}); 133//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 11: " + res); return res;});
137 deferredResult.callback(); 134 deferredResult.callback();
138 135
139 SimpleTest.waitForExplicitFinish(); 136 SimpleTest.waitForExplicitFinish();
140 137
141 //------------------------------------------------------------------------- 138 //-------------------------------------------------------------------------
142} catch (err) { 139} catch (err) {
143 140
144 var s = "test suite failure!\n"; 141 var s = "test suite failure!\n";
145 var o = {}; 142 var o = {};
146 var k = null; 143 var k = null;
147 for (k in err) { 144 for (k in err) {
148 // ensure unique keys?! 145 // ensure unique keys?!
149 if (!o[k]) { 146 if (!o[k]) {
150 s += k + ": " + err[k] + "\n"; 147 s += k + ": " + err[k] + "\n";
151 o[k] = err[k]; 148 o[k] = err[k];
152 } 149 }
153 } 150 }
154 ok ( false, s ); 151 ok ( false, s );
155} 152}
156 153
157</script> 154</script>
158</pre> 155</pre>
159</body> 156</body>
160</html> 157</html>
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 1342349..2968894 100644
--- a/frontend/gamma/tests/tests/Clipperz/Crypto/JSCrypto_vs_Clipperz.html
+++ b/frontend/gamma/tests/tests/Clipperz/Crypto/JSCrypto_vs_Clipperz.html
@@ -1,70 +1,67 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27--> 24-->
28 25
29<html> 26<html>
30<head> 27<head>
31 <title>Clipperz.Crypto.JSCrypto_vs_Clipperz - tests</title> 28 <title>Clipperz.Crypto.JSCrypto_vs_Clipperz - tests</title>
32 29
33 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> 30 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
34 31
35 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 32 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
36 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> 33 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
37 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> 34 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
38 35
39 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script> 36 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script>
40 37
41 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> 38 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script> 39 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
43 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 40 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
44 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 41 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
45 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script> 42 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script>
46 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script> 43 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
47 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> 44 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
48 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> 45 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
49 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script> 46 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
50 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> 47 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
51 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script> 48 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
52 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script> 49 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script>
53 50
54 <script type='text/javascript' src='./jscrypto.js'></script> 51 <script type='text/javascript' src='./jscrypto.js'></script>
55 52
56 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.Async.js"></script> 53 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.Async.js"></script>
57 54
58</head> 55</head>
59<body> 56<body>
60 57
61<pre id="test"> 58<pre id="test">
62 <script type="text/javascript"> 59 <script type="text/javascript">
63 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."; 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.";
64 var longIsoLatin1Text = "¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùù"; 61 var longIsoLatin1Text = "¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùù";
65 var longUtf8Text = "客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之"; 62 var longUtf8Text = "客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之";
66 </script> 63 </script>
67 <script type="text/javascript" src="JSCrypto_vs_Clipperz.test.js"></script> 64 <script type="text/javascript" src="JSCrypto_vs_Clipperz.test.js"></script>
68</pre> 65</pre>
69</body> 66</body>
70</html> 67</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 7dc688c..1580e6c 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,408 +1,405 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29//function logElapsedTime(aDescription, aStartTime, anEndTime) { 26//function logElapsedTime(aDescription, aStartTime, anEndTime) {
30 //MochiKit.Logging.logDebug(aDescription + " - took " + (anEndTime - aStartTime) + "ms"); 27 //MochiKit.Logging.logDebug(aDescription + " - took " + (anEndTime - aStartTime) + "ms");
31 //SimpleTest.ok(true, aDescription + " - took " + (anEndTime - aStartTime) + "ms"); 28 //SimpleTest.ok(true, aDescription + " - took " + (anEndTime - aStartTime) + "ms");
32//} 29//}
33 30
34 var asciiTestString = longAsciiText; 31 var asciiTestString = longAsciiText;
35//asciiTestString = asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString; 32//asciiTestString = asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString;
36//asciiTestString = asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString; 33//asciiTestString = asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString;
37//asciiTestString = asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString; 34//asciiTestString = asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString;
38//asciiTestString = asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString; 35//asciiTestString = asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString;
39//asciiTestString = asciiTestString + asciiTestString; 36//asciiTestString = asciiTestString + asciiTestString;
40//asciiTestString = asciiTestString + asciiTestString; 37//asciiTestString = asciiTestString + asciiTestString;
41 38
42 var isoLatin1TestString= longIsoLatin1Text; 39 var isoLatin1TestString= longIsoLatin1Text;
43//isoLatin1TestString = isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString; 40//isoLatin1TestString = isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString;
44//isoLatin1TestString = isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString; 41//isoLatin1TestString = isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString;
45//isoLatin1TestString = isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString; 42//isoLatin1TestString = isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString;
46//isoLatin1TestString = isoLatin1TestString + isoLatin1TestString; 43//isoLatin1TestString = isoLatin1TestString + isoLatin1TestString;
47//isoLatin1TestString = isoLatin1TestString + isoLatin1TestString; 44//isoLatin1TestString = isoLatin1TestString + isoLatin1TestString;
48 45
49 var utf8TestString = longUtf8Text; 46 var utf8TestString = longUtf8Text;
50//utf8TestString = utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString; 47//utf8TestString = utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString;
51//utf8TestString = utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString; 48//utf8TestString = utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString;
52//utf8TestString = utf8TestString + utf8TestString; 49//utf8TestString = utf8TestString + utf8TestString;
53//utf8TestString = utf8TestString + utf8TestString; 50//utf8TestString = utf8TestString + utf8TestString;
54 51
55var times = { 52var times = {
56 'Clipperz': {}, 53 'Clipperz': {},
57 'JSCrypto': {} 54 'JSCrypto': {}
58}; 55};
59 56
60function appendResults (aDescription, aTimer) { 57function appendResults (aDescription, aTimer) {
61 MochiKit.DOM.appendChildNodes(MochiKit.DOM.getElement('timerTBODY'), 58 MochiKit.DOM.appendChildNodes(MochiKit.DOM.getElement('timerTBODY'),
62 MochiKit.DOM.TR(null, 59 MochiKit.DOM.TR(null,
63 MochiKit.DOM.TH({align:'left'}, aDescription), 60 MochiKit.DOM.TH({align:'left'}, aDescription),
64 MochiKit.DOM.TH(null, aTimer['ascii']['encrypt'] + ' - ' + aTimer['ascii']['decrypt'])//, 61 MochiKit.DOM.TH(null, aTimer['ascii']['encrypt'] + ' - ' + aTimer['ascii']['decrypt'])//,
65 // MochiKit.DOM.TH(null, aTimer['isoLatin1']['encrypt']+ ' - ' + aTimer['isoLatin1']['decrypt']), 62 // MochiKit.DOM.TH(null, aTimer['isoLatin1']['encrypt']+ ' - ' + aTimer['isoLatin1']['decrypt']),
66 // MochiKit.DOM.TH(null, aTimer['utf8']['encrypt'] + ' - ' + aTimer['utf8']['decrypt']) 63 // MochiKit.DOM.TH(null, aTimer['utf8']['encrypt'] + ' - ' + aTimer['utf8']['decrypt'])
67 ) 64 )
68 ); 65 );
69 66
70} 67}
71 68
72//============================================================================= 69//=============================================================================
73 70
74function timeRegularFunction (aDescription, aString, anEncryptFunction, aDecryptFunction, aTimer, aKey) { 71function timeRegularFunction (aDescription, aString, anEncryptFunction, aDecryptFunction, aTimer, aKey) {
75 var start; 72 var start;
76 var end; 73 var end;
77 var encryptTime; 74 var encryptTime;
78 var decryptTime; 75 var decryptTime;
79 var ciphertext; 76 var ciphertext;
80 var plaintext; 77 var plaintext;
81 78
82 79
83 start = new Date(); 80 start = new Date();
84 ciphertext = anEncryptFunction('trustno1', aString); 81 ciphertext = anEncryptFunction('trustno1', aString);
85 end = new Date(); 82 end = new Date();
86 encryptTime = end - start; 83 encryptTime = end - start;
87 84
88 start = new Date(); 85 start = new Date();
89 plaintext = aDecryptFunction('trustno1', ciphertext); 86 plaintext = aDecryptFunction('trustno1', ciphertext);
90 end = new Date(); 87 end = new Date();
91 decryptTime = end - start; 88 decryptTime = end - start;
92 aTimer[aKey] = { 'encrypt': encryptTime, 'decrypt': decryptTime }; 89 aTimer[aKey] = { 'encrypt': encryptTime, 'decrypt': decryptTime };
93 SimpleTest.is(aString, plaintext, aDescription); 90 SimpleTest.is(aString, plaintext, aDescription);
94} 91}
95/* 92/*
96function timeRegularFunction (anEncryptFunction, aDecryptFunction, aTimer) { 93function timeRegularFunction (anEncryptFunction, aDecryptFunction, aTimer) {
97 var start; 94 var start;
98 var end; 95 var end;
99 var encryptTime; 96 var encryptTime;
100 var decryptTime; 97 var decryptTime;
101 var ciphertext; 98 var ciphertext;
102 var plaintext; 99 var plaintext;
103 100
104 101
105 start = new Date(); 102 start = new Date();
106 ciphertext = anEncryptFunction('trustno1', asciiTestString); 103 ciphertext = anEncryptFunction('trustno1', asciiTestString);
107 end = new Date(); 104 end = new Date();
108 encryptTime = end - start; 105 encryptTime = end - start;
109 106
110 start = new Date(); 107 start = new Date();
111 plaintext = aDecryptFunction('trustno1', ciphertext); 108 plaintext = aDecryptFunction('trustno1', ciphertext);
112 end = new Date(); 109 end = new Date();
113 decryptTime = end - start; 110 decryptTime = end - start;
114 aTimer['ascii'] = { 'encrypt': encryptTime, 'decrypt': decryptTime }; 111 aTimer['ascii'] = { 'encrypt': encryptTime, 'decrypt': decryptTime };
115 SimpleTest.is(asciiTestString, plaintext, "Encrypt/decrypt the ASCII text"); 112 SimpleTest.is(asciiTestString, plaintext, "Encrypt/decrypt the ASCII text");
116 113
117 114
118 start = new Date(); 115 start = new Date();
119 ciphertext = anEncryptFunction('trustno1', isoLatin1TestString); 116 ciphertext = anEncryptFunction('trustno1', isoLatin1TestString);
120 end = new Date(); 117 end = new Date();
121 encryptTime = end - start; 118 encryptTime = end - start;
122 119
123 start = new Date(); 120 start = new Date();
124 plaintext = aDecryptFunction('trustno1', ciphertext); 121 plaintext = aDecryptFunction('trustno1', ciphertext);
125 end = new Date(); 122 end = new Date();
126 decryptTime = end - start; 123 decryptTime = end - start;
127 aTimer['isoLatin1'] = { 'encrypt': encryptTime, 'decrypt': decryptTime }; 124 aTimer['isoLatin1'] = { 'encrypt': encryptTime, 'decrypt': decryptTime };
128 SimpleTest.is(isoLatin1TestString, plaintext, "Encrypt/decrypt the ISO-Latin 1 text"); 125 SimpleTest.is(isoLatin1TestString, plaintext, "Encrypt/decrypt the ISO-Latin 1 text");
129 126
130 127
131 start = new Date(); 128 start = new Date();
132 ciphertext = anEncryptFunction('trustno1', utf8TestString); 129 ciphertext = anEncryptFunction('trustno1', utf8TestString);
133 end = new Date(); 130 end = new Date();
134 encryptTime = end - start; 131 encryptTime = end - start;
135 132
136 start = new Date(); 133 start = new Date();
137 plaintext = aDecryptFunction('trustno1', ciphertext); 134 plaintext = aDecryptFunction('trustno1', ciphertext);
138 end = new Date(); 135 end = new Date();
139 decryptTime = end - start; 136 decryptTime = end - start;
140 aTimer['utf8'] = { 'encrypt': encryptTime, 'decrypt': decryptTime }; 137 aTimer['utf8'] = { 'encrypt': encryptTime, 'decrypt': decryptTime };
141 SimpleTest.is(utf8TestString, plaintext, "Encrypt/decrypt the UTF-8 text"); 138 SimpleTest.is(utf8TestString, plaintext, "Encrypt/decrypt the UTF-8 text");
142} 139}
143*/ 140*/
144function timeDeferredFunction (aDescription, aString, anEncryptFunction, aDecryptFunction, aTimer, aKey, someTestArgs) { 141function timeDeferredFunction (aDescription, aString, anEncryptFunction, aDecryptFunction, aTimer, aKey, someTestArgs) {
145 var start; 142 var start;
146 var end; 143 var end;
147 144
148 var deferredResult; 145 var deferredResult;
149 146
150 aTimer[aKey] = {}; 147 aTimer[aKey] = {};
151 148
152 deferredResult = new Clipperz.Async.Deferred("timeDeferredFunction", someTestArgs); 149 deferredResult = new Clipperz.Async.Deferred("timeDeferredFunction", someTestArgs);
153 deferredResult.addCallback(function (aValue) { start = new Date(); return aValue}); 150 deferredResult.addCallback(function (aValue) { start = new Date(); return aValue});
154 deferredResult.addCallback(anEncryptFunction, 'trustno1', aString); 151 deferredResult.addCallback(anEncryptFunction, 'trustno1', aString);
155 deferredResult.addCallback(function (aValue) { 152 deferredResult.addCallback(function (aValue) {
156 end = new Date(); 153 end = new Date();
157 aTimer[aKey]['encrypt'] = end-start; 154 aTimer[aKey]['encrypt'] = end-start;
158 return aValue; 155 return aValue;
159 }); 156 });
160 deferredResult.addCallback(function (aValue) { start = new Date(); return aValue}); 157 deferredResult.addCallback(function (aValue) { start = new Date(); return aValue});
161 deferredResult.addCallback(aDecryptFunction, 'trustno1'); 158 deferredResult.addCallback(aDecryptFunction, 'trustno1');
162 deferredResult.addCallback(function (aValue) { 159 deferredResult.addCallback(function (aValue) {
163 end = new Date(); 160 end = new Date();
164 aTimer[aKey]['decrypt'] = end-start; 161 aTimer[aKey]['decrypt'] = end-start;
165 return aValue; 162 return aValue;
166 }); 163 });
167 deferredResult.addCallback(function (aValue) { 164 deferredResult.addCallback(function (aValue) {
168 SimpleTest.is(aString, aValue, aDescription); 165 SimpleTest.is(aString, aValue, aDescription);
169 }); 166 });
170 167
171 deferredResult.callback(); 168 deferredResult.callback();
172 169
173 return deferredResult; 170 return deferredResult;
174} 171}
175 172
176//============================================================================= 173//=============================================================================
177 174
178function encryptUsingJSCrypto (aKey, aValue) { 175function encryptUsingJSCrypto (aKey, aValue) {
179 var salt; 176 var salt;
180 var key; 177 var key;
181 var cipher; 178 var cipher;
182 var iv; 179 var iv;
183 var plaintext; 180 var plaintext;
184 var ciphertext; 181 var ciphertext;
185 var tag; 182 var tag;
186 var adata; 183 var adata;
187 184
188 salt = [1,2,3,4,5,6,7,8]; 185 salt = [1,2,3,4,5,6,7,8];
189 key = generateKey(aKey, salt); 186 key = generateKey(aKey, salt);
190 187
191 cipher = new aes(key, CCM); 188 cipher = new aes(key, CCM);
192 iv = Random.random_words(4); 189 iv = Random.random_words(4);
193 190
194 plaintext = aValue; 191 plaintext = aValue;
195 ciphertext = []; 192 ciphertext = [];
196 tag = []; 193 tag = [];
197 adata = ""; 194 adata = "";
198 195
199 cipher.encrypt(iv, plaintext, ciphertext, adata, tag); 196 cipher.encrypt(iv, plaintext, ciphertext, adata, tag);
200 197
201 return ciphertext; 198 return ciphertext;
202} 199}
203 200
204//----------------------------------------------------------------------------- 201//-----------------------------------------------------------------------------
205 202
206function decryptUsingJSCrypto (aKey, aValue) { 203function decryptUsingJSCrypto (aKey, aValue) {
207 var salt; 204 var salt;
208 var key; 205 var key;
209 var cipher; 206 var cipher;
210 var ciphertext; 207 var ciphertext;
211 var plaintext; 208 var plaintext;
212 var tag; 209 var tag;
213 var adata; 210 var adata;
214 211
215 salt = [1,2,3,4,5,6,7,8]; 212 salt = [1,2,3,4,5,6,7,8];
216 key = generateKey(aKey, salt); 213 key = generateKey(aKey, salt);
217 tag = []; 214 tag = [];
218 adata = ""; 215 adata = "";
219 216
220 cipher = new aes(key, CCM); 217 cipher = new aes(key, CCM);
221 ciphertext = aValue; 218 ciphertext = aValue;
222 plaintext = cipher.decrypt(ciphertext, adata, tag); 219 plaintext = cipher.decrypt(ciphertext, adata, tag);
223 220
224 return plaintext; 221 return plaintext;
225} 222}
226 223
227//============================================================================= 224//=============================================================================
228 225
229function encryptUsingClipperz (aKey, aValue) { 226function encryptUsingClipperz (aKey, aValue) {
230 var key; 227 var key;
231 var value; 228 var value;
232 var data; 229 var data;
233 var encryptedData; 230 var encryptedData;
234 231
235 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey)); 232 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
236 value = aValue; 233 value = aValue;
237 data = new Clipperz.ByteArray(value); 234 data = new Clipperz.ByteArray(value);
238 encryptedData = Clipperz.Crypto.AES.encrypt(key, data); 235 encryptedData = Clipperz.Crypto.AES.encrypt(key, data);
239 return encryptedData.toBase64String(); 236 return encryptedData.toBase64String();
240} 237}
241 238
242//----------------------------------------------------------------------------- 239//-----------------------------------------------------------------------------
243 240
244function decryptUsingClipperz (aKey, aValue) { 241function decryptUsingClipperz (aKey, aValue) {
245 var key; 242 var key;
246 var value; 243 var value;
247 var decryptedData; 244 var decryptedData;
248 245
249 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey)); 246 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
250 value = new Clipperz.ByteArray().appendBase64String(aValue); 247 value = new Clipperz.ByteArray().appendBase64String(aValue);
251 248
252 decryptedData = Clipperz.Crypto.AES.decrypt(key, value).asString(); 249 decryptedData = Clipperz.Crypto.AES.decrypt(key, value).asString();
253 250
254 return decryptedData; 251 return decryptedData;
255} 252}
256 253
257//============================================================================= 254//=============================================================================
258 255
259function encryptUsingClipperzAndJSON (aKey, aValue) { 256function encryptUsingClipperzAndJSON (aKey, aValue) {
260 var key; 257 var key;
261 var value; 258 var value;
262 var data; 259 var data;
263 var encryptedData; 260 var encryptedData;
264 261
265 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey)); 262 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
266 value = Clipperz.Base.serializeJSON(aValue); 263 value = Clipperz.Base.serializeJSON(aValue);
267 data = new Clipperz.ByteArray(value); 264 data = new Clipperz.ByteArray(value);
268 encryptedData = Clipperz.Crypto.AES.encrypt(key, data); 265 encryptedData = Clipperz.Crypto.AES.encrypt(key, data);
269 return encryptedData.toBase64String(); 266 return encryptedData.toBase64String();
270} 267}
271 268
272//----------------------------------------------------------------------------- 269//-----------------------------------------------------------------------------
273 270
274function decryptUsingClipperzAndJSON (aKey, aValue) { 271function decryptUsingClipperzAndJSON (aKey, aValue) {
275 var key; 272 var key;
276 var value; 273 var value;
277 var decryptedData; 274 var decryptedData;
278 275
279 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey)); 276 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
280 value = new Clipperz.ByteArray().appendBase64String(aValue); 277 value = new Clipperz.ByteArray().appendBase64String(aValue);
281 278
282 decryptedData = Clipperz.Crypto.AES.decrypt(key, value).asString(); 279 decryptedData = Clipperz.Crypto.AES.decrypt(key, value).asString();
283 280
284 return Clipperz.Base.evalJSON(decryptedData); 281 return Clipperz.Base.evalJSON(decryptedData);
285} 282}
286 283
287//============================================================================= 284//=============================================================================
288 285
289function deferredEncryptUsingClipperz (aKey, aValue) { 286function deferredEncryptUsingClipperz (aKey, aValue) {
290 var deferredResult; 287 var deferredResult;
291 varkey; 288 varkey;
292 var data; 289 var data;
293 290
294 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey)); 291 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
295 data = new Clipperz.ByteArray(aValue); 292 data = new Clipperz.ByteArray(aValue);
296 293
297 deferredResult = new Clipperz.Async.Deferred("Clipperz.deferredEncrypt", {trace:false}); 294 deferredResult = new Clipperz.Async.Deferred("Clipperz.deferredEncrypt", {trace:false});
298 deferredResult.addCallback(Clipperz.Crypto.AES.deferredEncrypt, key, data); 295 deferredResult.addCallback(Clipperz.Crypto.AES.deferredEncrypt, key, data);
299 deferredResult.addCallback(function(aResult) { 296 deferredResult.addCallback(function(aResult) {
300 return aResult.toBase64String(); 297 return aResult.toBase64String();
301 }) 298 })
302 deferredResult.callback(); 299 deferredResult.callback();
303 300
304 return deferredResult; 301 return deferredResult;
305} 302}
306 303
307//----------------------------------------------------------------------------- 304//-----------------------------------------------------------------------------
308 305
309function deferredDecryptUsingClipperz (aKey, aValue) { 306function deferredDecryptUsingClipperz (aKey, aValue) {
310 var key, value; 307 var key, value;
311 308
312 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey)); 309 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
313 value = new Clipperz.ByteArray().appendBase64String(aValue); 310 value = new Clipperz.ByteArray().appendBase64String(aValue);
314 311
315 deferredResult = new Clipperz.Async.Deferred("Clipperz.deferredDecrypt", {trace:false}); 312 deferredResult = new Clipperz.Async.Deferred("Clipperz.deferredDecrypt", {trace:false});
316 deferredResult.addCallback(Clipperz.Crypto.AES.deferredDecrypt, key, value); 313 deferredResult.addCallback(Clipperz.Crypto.AES.deferredDecrypt, key, value);
317 deferredResult.addCallback(function(aResult) { 314 deferredResult.addCallback(function(aResult) {
318 return aResult.asString(); 315 return aResult.asString();
319 }); 316 });
320 deferredResult.callback(); 317 deferredResult.callback();
321 318
322 return deferredResult; 319 return deferredResult;
323} 320}
324 321
325//============================================================================= 322//=============================================================================
326 323
327var tests = { 324var tests = {
328 325
329 //------------------------------------------------------------------------- 326 //-------------------------------------------------------------------------
330 327
331 'encryptMultipleStringsUsingClipperzFunctions': function (someTestArgs) { 328 'encryptMultipleStringsUsingClipperzFunctions': function (someTestArgs) {
332 // timeRegularFunction(encryptUsingClipperz, decryptUsingClipperz, times['Clipperz']['Regular']); 329 // timeRegularFunction(encryptUsingClipperz, decryptUsingClipperz, times['Clipperz']['Regular']);
333 times['Clipperz']['NO JSON'] = {}; 330 times['Clipperz']['NO JSON'] = {};
334 331
335 timeRegularFunction("Clipperz - NO JSON - Ascii", asciiTestString, encryptUsingClipperz, decryptUsingClipperz, times['Clipperz']['NO JSON'], 'ascii'); 332 timeRegularFunction("Clipperz - NO JSON - Ascii", asciiTestString, encryptUsingClipperz, decryptUsingClipperz, times['Clipperz']['NO JSON'], 'ascii');
336 timeRegularFunction("Clipperz - NO JSON - ISO Latin 1", isoLatin1TestString,encryptUsingClipperz, decryptUsingClipperz, times['Clipperz']['NO JSON'], 'isoLatin1'); 333 timeRegularFunction("Clipperz - NO JSON - ISO Latin 1", isoLatin1TestString,encryptUsingClipperz, decryptUsingClipperz, times['Clipperz']['NO JSON'], 'isoLatin1');
337 timeRegularFunction("Clipperz - NO JSON - UTF-8", utf8TestString, encryptUsingClipperz, decryptUsingClipperz, times['Clipperz']['NO JSON'], 'utf8'); 334 timeRegularFunction("Clipperz - NO JSON - UTF-8", utf8TestString, encryptUsingClipperz, decryptUsingClipperz, times['Clipperz']['NO JSON'], 'utf8');
338 335
339 appendResults("Clipperz - NO JSON", times['Clipperz']['NO JSON']); 336 appendResults("Clipperz - NO JSON", times['Clipperz']['NO JSON']);
340 }, 337 },
341 338
342 //------------------------------------------------------------------------- 339 //-------------------------------------------------------------------------
343 340
344 'encryptMultipleStringsUsingClipperzAndJSONFunctions': function (someTestArgs) { 341 'encryptMultipleStringsUsingClipperzAndJSONFunctions': function (someTestArgs) {
345 // timeRegularFunction(encryptUsingClipperzAndJSON, decryptUsingClipperzAndJSON, times['Clipperz']['JSON']); 342 // timeRegularFunction(encryptUsingClipperzAndJSON, decryptUsingClipperzAndJSON, times['Clipperz']['JSON']);
346 times['Clipperz']['JSON'] = {}; 343 times['Clipperz']['JSON'] = {};
347 344
348 timeRegularFunction("Clipperz - JSON - Ascii", asciiTestString, encryptUsingClipperzAndJSON, decryptUsingClipperzAndJSON, times['Clipperz']['JSON'], 'ascii'); 345 timeRegularFunction("Clipperz - JSON - Ascii", asciiTestString, encryptUsingClipperzAndJSON, decryptUsingClipperzAndJSON, times['Clipperz']['JSON'], 'ascii');
349 timeRegularFunction("Clipperz - JSON - ISO Latin 1", isoLatin1TestString,encryptUsingClipperzAndJSON, decryptUsingClipperzAndJSON, times['Clipperz']['JSON'], 'isoLatin1'); 346 timeRegularFunction("Clipperz - JSON - ISO Latin 1", isoLatin1TestString,encryptUsingClipperzAndJSON, decryptUsingClipperzAndJSON, times['Clipperz']['JSON'], 'isoLatin1');
350 timeRegularFunction("Clipperz - JSON - UTF-8", utf8TestString, encryptUsingClipperzAndJSON, decryptUsingClipperzAndJSON, times['Clipperz']['JSON'], 'utf8'); 347 timeRegularFunction("Clipperz - JSON - UTF-8", utf8TestString, encryptUsingClipperzAndJSON, decryptUsingClipperzAndJSON, times['Clipperz']['JSON'], 'utf8');
351 348
352 appendResults("Clipperz - JSON", times['Clipperz']['JSON']); 349 appendResults("Clipperz - JSON", times['Clipperz']['JSON']);
353 }, 350 },
354 351
355 //------------------------------------------------------------------------- 352 //-------------------------------------------------------------------------
356 353
357 'encryptMultipleStringsUsingClipperzDeferredFunctions': function (someTestArgs) { 354 'encryptMultipleStringsUsingClipperzDeferredFunctions': function (someTestArgs) {
358 times['Clipperz']['Deferred'] = {}; 355 times['Clipperz']['Deferred'] = {};
359 times['Clipperz']['Deferred [NO JSON]'] = {}; 356 times['Clipperz']['Deferred [NO JSON]'] = {};
360 357
361 return Clipperz.Async.callbacks("encryptMultipleStringsUsingClipperzDeferredFunctions", [ 358 return Clipperz.Async.callbacks("encryptMultipleStringsUsingClipperzDeferredFunctions", [
362 MochiKit.Base.partial(timeDeferredFunction, "Deferred Ascii", asciiTestString, deferredEncryptUsingClipperz, deferredDecryptUsingClipperz, times['Clipperz']['Deferred [NO JSON]'], 'ascii', someTestArgs), 359 MochiKit.Base.partial(timeDeferredFunction, "Deferred Ascii", asciiTestString, deferredEncryptUsingClipperz, deferredDecryptUsingClipperz, times['Clipperz']['Deferred [NO JSON]'], 'ascii', someTestArgs),
363 // MochiKit.Base.partial(timeDeferredFunction, "Deferred IsoLatin1", isoLatin1TestString, deferredEncryptUsingClipperz, deferredDecryptUsingClipperz, times['Clipperz']['Deferred [NO JSON]'], 'isoLatin1',someTestArgs), 360 // MochiKit.Base.partial(timeDeferredFunction, "Deferred IsoLatin1", isoLatin1TestString, deferredEncryptUsingClipperz, deferredDecryptUsingClipperz, times['Clipperz']['Deferred [NO JSON]'], 'isoLatin1',someTestArgs),
364 // MochiKit.Base.partial(timeDeferredFunction, "Deferred UTF-8", utf8TestString, deferredEncryptUsingClipperz, deferredDecryptUsingClipperz, times['Clipperz']['Deferred [NO JSON]'], 'utf8', someTestArgs), 361 // MochiKit.Base.partial(timeDeferredFunction, "Deferred UTF-8", utf8TestString, deferredEncryptUsingClipperz, deferredDecryptUsingClipperz, times['Clipperz']['Deferred [NO JSON]'], 'utf8', someTestArgs),
365 362
366 MochiKit.Base.partial(appendResults, "Clipperz - deferred [NO JSON]", times['Clipperz']['Deferred [NO JSON]']), 363 MochiKit.Base.partial(appendResults, "Clipperz - deferred [NO JSON]", times['Clipperz']['Deferred [NO JSON]']),
367 364
368 MochiKit.Base.partial(timeDeferredFunction, "Deferred Ascii", asciiTestString, Clipperz.PM.Crypto.encryptingFunctions.versions['0.3'].deferredEncrypt, Clipperz.PM.Crypto.encryptingFunctions.versions['0.3'].deferredDecrypt, times['Clipperz']['Deferred'], 'ascii', someTestArgs), 365 MochiKit.Base.partial(timeDeferredFunction, "Deferred Ascii", asciiTestString, Clipperz.PM.Crypto.encryptingFunctions.versions['0.3'].deferredEncrypt, Clipperz.PM.Crypto.encryptingFunctions.versions['0.3'].deferredDecrypt, times['Clipperz']['Deferred'], 'ascii', someTestArgs),
369 // MochiKit.Base.partial(timeDeferredFunction, "Deferred IsoLatin1", isoLatin1TestString, Clipperz.PM.Crypto.encryptingFunctions.versions['0.3'].deferredEncrypt, Clipperz.PM.Crypto.encryptingFunctions.versions['0.3'].deferredDecrypt, times['Clipperz']['Deferred'], 'isoLatin1',someTestArgs), 366 // MochiKit.Base.partial(timeDeferredFunction, "Deferred IsoLatin1", isoLatin1TestString, Clipperz.PM.Crypto.encryptingFunctions.versions['0.3'].deferredEncrypt, Clipperz.PM.Crypto.encryptingFunctions.versions['0.3'].deferredDecrypt, times['Clipperz']['Deferred'], 'isoLatin1',someTestArgs),
370 // MochiKit.Base.partial(timeDeferredFunction, "Deferred UTF-8", utf8TestString, Clipperz.PM.Crypto.encryptingFunctions.versions['0.3'].deferredEncrypt, Clipperz.PM.Crypto.encryptingFunctions.versions['0.3'].deferredDecrypt, times['Clipperz']['Deferred'], 'utf8', someTestArgs), 367 // MochiKit.Base.partial(timeDeferredFunction, "Deferred UTF-8", utf8TestString, Clipperz.PM.Crypto.encryptingFunctions.versions['0.3'].deferredEncrypt, Clipperz.PM.Crypto.encryptingFunctions.versions['0.3'].deferredDecrypt, times['Clipperz']['Deferred'], 'utf8', someTestArgs),
371 368
372 MochiKit.Base.partial(appendResults, "Clipperz - PM", times['Clipperz']['Deferred']) 369 MochiKit.Base.partial(appendResults, "Clipperz - PM", times['Clipperz']['Deferred'])
373 ], someTestArgs); 370 ], someTestArgs);
374 }, 371 },
375 372
376 //------------------------------------------------------------------------- 373 //-------------------------------------------------------------------------
377 374
378 'encryptMultipleStringsUsingJSCryptoFunctions': function (someTestArgs) { 375 'encryptMultipleStringsUsingJSCryptoFunctions': function (someTestArgs) {
379 timeRegularFunction("JSCrypto - Ascii", asciiTestString, encryptUsingJSCrypto, decryptUsingJSCrypto, times['JSCrypto'], 'ascii'); 376 timeRegularFunction("JSCrypto - Ascii", asciiTestString, encryptUsingJSCrypto, decryptUsingJSCrypto, times['JSCrypto'], 'ascii');
380 timeRegularFunction("JSCrypto - ISO Latin 1", isoLatin1TestString,encryptUsingJSCrypto, decryptUsingJSCrypto, times['JSCrypto'], 'isoLatin1'); 377 timeRegularFunction("JSCrypto - ISO Latin 1", isoLatin1TestString,encryptUsingJSCrypto, decryptUsingJSCrypto, times['JSCrypto'], 'isoLatin1');
381 timeRegularFunction("JSCrypto - UTF-8", utf8TestString, encryptUsingJSCrypto, decryptUsingJSCrypto, times['JSCrypto'], 'utf8'); 378 timeRegularFunction("JSCrypto - UTF-8", utf8TestString, encryptUsingJSCrypto, decryptUsingJSCrypto, times['JSCrypto'], 'utf8');
382 379
383 appendResults("JSCrypto", times['JSCrypto']); 380 appendResults("JSCrypto", times['JSCrypto']);
384 }, 381 },
385 382
386 //------------------------------------------------------------------------- 383 //-------------------------------------------------------------------------
387 'syntaxFix': MochiKit.Base.noop 384 'syntaxFix': MochiKit.Base.noop
388}; 385};
389 386
390//############################################################################# 387//#############################################################################
391 388
392SimpleTest.waitForExplicitFinish(); 389SimpleTest.waitForExplicitFinish();
393Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); 390Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
394Random.set_default_paranoia(0); 391Random.set_default_paranoia(0);
395 392
396//Random.addEventListener("seeded", MochiKit.Base.partial(SimpleTest.runDeferredTests, "Clipperz.Crypto.JSCrypto_vs_Clipperz", tests, {trace:false})); 393//Random.addEventListener("seeded", MochiKit.Base.partial(SimpleTest.runDeferredTests, "Clipperz.Crypto.JSCrypto_vs_Clipperz", tests, {trace:false}));
397//Random.addEventListener("seeded", function () { console.log("SEEDED!")}); 394//Random.addEventListener("seeded", function () { console.log("SEEDED!")});
398 395
399 396
400MochiKit.DOM.appendChildNodes(MochiKit.DOM.currentDocument().body, 397MochiKit.DOM.appendChildNodes(MochiKit.DOM.currentDocument().body,
401 MochiKit.DOM.TABLE({border:'1', cellpadding:'4', cellspacing:'0'}, 398 MochiKit.DOM.TABLE({border:'1', cellpadding:'4', cellspacing:'0'},
402 MochiKit.DOM.THEAD(), 399 MochiKit.DOM.THEAD(),
403 MochiKit.DOM.TBODY({id:'timerTBODY'}, 400 MochiKit.DOM.TBODY({id:'timerTBODY'},
404 MochiKit.DOM.TR(null, 401 MochiKit.DOM.TR(null,
405 MochiKit.DOM.TH(null, "algorithm"), 402 MochiKit.DOM.TH(null, "algorithm"),
406 MochiKit.DOM.TH(null, "ascii [" + asciiTestString.length + "]"), 403 MochiKit.DOM.TH(null, "ascii [" + asciiTestString.length + "]"),
407 MochiKit.DOM.TH(null, "ISO Latin 1 [" + isoLatin1TestString.length * 2 + "]"), 404 MochiKit.DOM.TH(null, "ISO Latin 1 [" + isoLatin1TestString.length * 2 + "]"),
408 MochiKit.DOM.TH(null, "UTF 8 [" + utf8TestString.length * 3 + "]") 405 MochiKit.DOM.TH(null, "UTF 8 [" + utf8TestString.length * 3 + "]")
diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/PRNG.html b/frontend/gamma/tests/tests/Clipperz/Crypto/PRNG.html
index 7ffd691..438d96f 100644
--- a/frontend/gamma/tests/tests/Clipperz/Crypto/PRNG.html
+++ b/frontend/gamma/tests/tests/Clipperz/Crypto/PRNG.html
@@ -1,117 +1,114 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27--> 24-->
28 25
29<html> 26<html>
30<head> 27<head>
31 <script> jslog_config_enabled = true; </script> 28 <script> jslog_config_enabled = true; </script>
32 29
33 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 30 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
34 <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script> 31 <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script>
35 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> 32 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
36 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> 33 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
37 34
38 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> 35 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
39 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script> 36 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
40 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 37 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
41 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script> 38 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 39 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
43 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script> 40 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script>
44 41
45<!--<script type='text/javascript' src='../../../../js/Clipperz/Crypto/Statistics.js'></script>--> 42<!--<script type='text/javascript' src='../../../../js/Clipperz/Crypto/Statistics.js'></script>-->
46 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> 43 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
47 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> 44 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
48 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script> 45 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
49 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> 46 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
50 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script> 47 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
51</head> 48</head>
52<body> 49<body>
53<pre id="test"> 50<pre id="test">
54<script type="text/javascript"> 51<script type="text/javascript">
55test_PRNG = function() { 52test_PRNG = function() {
56 varrand1, rand2; 53 varrand1, rand2;
57 var i,c; 54 var i,c;
58 55
59 c = 10; 56 c = 10;
60 for (i=0; i<c; i++) { 57 for (i=0; i<c; i++) {
61 // jslog.debug(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString()); 58 // jslog.debug(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString());
62 } 59 }
63 60
64 rand1 = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(1); 61 rand1 = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(1);
65 is(rand1.byteAtIndex(0) <= 255, true, "getRandomByte returns always a single byte"); 62 is(rand1.byteAtIndex(0) <= 255, true, "getRandomByte returns always a single byte");
66 63
67 rand2 = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(1); 64 rand2 = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(1);
68 is(rand1.equals(rand2), false, "getRandomByte should almost always return two different values when called into sequence"); 65 is(rand1.equals(rand2), false, "getRandomByte should almost always return two different values when called into sequence");
69 66
70 67
71 rand1 = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32); 68 rand1 = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32);
72 rand2 = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32); 69 rand2 = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32);
73 is(rand1.equals(rand2), false, "getRandomByte should almost always return two different values when called into sequence"); 70 is(rand1.equals(rand2), false, "getRandomByte should almost always return two different values when called into sequence");
74 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(rand1.split(0,1).equals(rand2.split(0,1)), false, "getRandomByte should almost always return two different values when called into sequence");
75 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 1", "Value for random test"); 72 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 1", "Value for random test");
76 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 2", "Value for random test"); 73 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 2", "Value for random test");
77 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 3", "Value for random test"); 74 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 3", "Value for random test");
78 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 4", "Value for random test"); 75 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 4", "Value for random test");
79 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 5", "Value for random test"); 76 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 5", "Value for random test");
80 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 6", "Value for random test"); 77 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 6", "Value for random test");
81 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 7", "Value for random test"); 78 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 7", "Value for random test");
82 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 8", "Value for random test"); 79 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 8", "Value for random test");
83 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 9", "Value for random test"); 80 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 9", "Value for random test");
84 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 10", "Value for random test"); 81 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 10", "Value for random test");
85 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 11", "Value for random test"); 82 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 11", "Value for random test");
86 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 12", "Value for random test"); 83 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 12", "Value for random test");
87 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 13", "Value for random test"); 84 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 13", "Value for random test");
88 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 14", "Value for random test"); 85 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 14", "Value for random test");
89//jslog.debug(rand1.toHexString()); 86//jslog.debug(rand1.toHexString());
90//jslog.debug(rand2.toHexString()); 87//jslog.debug(rand2.toHexString());
91 88
92 SimpleTest.finish(); 89 SimpleTest.finish();
93} 90}
94 91
95try { 92try {
96 MochiKit.Signal.connect(Clipperz.Crypto.PRNG.defaultRandomGenerator(), 'readyToGenerateRandomBytes', test_PRNG); 93 MochiKit.Signal.connect(Clipperz.Crypto.PRNG.defaultRandomGenerator(), 'readyToGenerateRandomBytes', test_PRNG);
97 Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); 94 Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
98 SimpleTest.waitForExplicitFinish(); 95 SimpleTest.waitForExplicitFinish();
99} catch (err) { 96} catch (err) {
100 97
101 var s = "test suite failure!\n"; 98 var s = "test suite failure!\n";
102 var o = {}; 99 var o = {};
103 var k = null; 100 var k = null;
104 for (k in err) { 101 for (k in err) {
105 // ensure unique keys?! 102 // ensure unique keys?!
106 if (!o[k]) { 103 if (!o[k]) {
107 s += k + ": " + err[k] + "\n"; 104 s += k + ": " + err[k] + "\n";
108 o[k] = err[k]; 105 o[k] = err[k];
109 } 106 }
110 } 107 }
111 ok ( false, s ); 108 ok ( false, s );
112} 109}
113 110
114</script> 111</script>
115</pre> 112</pre>
116</body> 113</body>
117</html> 114</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/RSA.html b/frontend/gamma/tests/tests/Clipperz/Crypto/RSA.html
index 468a987..f29f894 100644
--- a/frontend/gamma/tests/tests/Clipperz/Crypto/RSA.html
+++ b/frontend/gamma/tests/tests/Clipperz/Crypto/RSA.html
@@ -1,90 +1,87 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27--> 24-->
28 25
29<html> 26<html>
30<head> 27<head>
31 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 28 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
32 <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script> 29 <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script>
33 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> 30 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
34 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> 31 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
35 32
36 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 33 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
37 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script> 34 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script>
38 35
39 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> 36 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
40 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> 37 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
41 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/RSA.js'></script> 38 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/RSA.js'></script>
42 39
43</head> 40</head>
44<body> 41<body>
45<pre id="test"> 42<pre id="test">
46<script type="text/javascript"> 43<script type="text/javascript">
47try { 44try {
48 varrsaPublicKey; 45 varrsaPublicKey;
49 varrandomValue; 46 varrandomValue;
50 varpublicEncryptedValue; 47 varpublicEncryptedValue;
51 var privateEncryptedValue; 48 var privateEncryptedValue;
52 49
53 varstartTime; 50 varstartTime;
54 varendTime; 51 varendTime;
55 52
56 53
57startTime=new Date(); 54startTime=new Date();
58 rsaPublicKey = Clipperz.Crypto.RSA.generatePublicKey(512); 55 rsaPublicKey = Clipperz.Crypto.RSA.generatePublicKey(512);
59 56
60endTime=new Date(); 57endTime=new Date();
61is(true, true, 'Time to generate the RSA public key (size 512 bit): '+(endTime.getTime()-startTime.getTime())/1000.0); 58is(true, true, 'Time to generate the RSA public key (size 512 bit): '+(endTime.getTime()-startTime.getTime())/1000.0);
62 59
63 randomValue = Clipperz.Crypto.Base.generateRandomSeed(); 60 randomValue = Clipperz.Crypto.Base.generateRandomSeed();
64 publicEncryptedValue = Clipperz.Crypto.RSA.encryptUsingPublicKey(rsaPublicKey, randomValue); 61 publicEncryptedValue = Clipperz.Crypto.RSA.encryptUsingPublicKey(rsaPublicKey, randomValue);
65 privateEncryptedValue = Clipperz.Crypto.RSA.encryptUsingPrivateKey(rsaPublicKey, randomValue); 62 privateEncryptedValue = Clipperz.Crypto.RSA.encryptUsingPrivateKey(rsaPublicKey, randomValue);
66 63
67 is(publicEncryptedValue == privateEncryptedValue, false); 64 is(publicEncryptedValue == privateEncryptedValue, false);
68 is(Clipperz.Crypto.RSA.decryptUsingPrivateKey(rsaPublicKey, publicEncryptedValue), randomValue); 65 is(Clipperz.Crypto.RSA.decryptUsingPrivateKey(rsaPublicKey, publicEncryptedValue), randomValue);
69 is(Clipperz.Crypto.RSA.decryptUsingPublicKey(rsaPublicKey, privateEncryptedValue), randomValue); 66 is(Clipperz.Crypto.RSA.decryptUsingPublicKey(rsaPublicKey, privateEncryptedValue), randomValue);
70 67
71 //------------------------------------------------------------------------- 68 //-------------------------------------------------------------------------
72} catch (err) { 69} catch (err) {
73 70
74 var s = "test suite failure!\n"; 71 var s = "test suite failure!\n";
75 var o = {}; 72 var o = {};
76 var k = null; 73 var k = null;
77 for (k in err) { 74 for (k in err) {
78 // ensure unique keys?! 75 // ensure unique keys?!
79 if (!o[k]) { 76 if (!o[k]) {
80 s += k + ": " + err[k] + "\n"; 77 s += k + ": " + err[k] + "\n";
81 o[k] = err[k]; 78 o[k] = err[k];
82 } 79 }
83 } 80 }
84 ok ( false, s ); 81 ok ( false, s );
85} 82}
86 83
87</script> 84</script>
88</pre> 85</pre>
89</body> 86</body>
90</html> 87</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/SHA.html b/frontend/gamma/tests/tests/Clipperz/Crypto/SHA.html
index 1c88213..a580491 100644
--- a/frontend/gamma/tests/tests/Clipperz/Crypto/SHA.html
+++ b/frontend/gamma/tests/tests/Clipperz/Crypto/SHA.html
@@ -1,175 +1,172 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27--> 24-->
28 25
29<html> 26<html>
30<head> 27<head>
31 <title>Clipperz.Crypto.SHA - TEST</title> 28 <title>Clipperz.Crypto.SHA - TEST</title>
32 29
33 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 30 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
34 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> 31 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
35 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> 32 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
36 33
37 <script type='text/javascript' src='../../../js/JSON/json2.js'></script> 34 <script type='text/javascript' src='../../../js/JSON/json2.js'></script>
38 35
39 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> 36 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
40 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script> 37 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
41 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 38 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 39 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
43 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script> 40 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
44 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script> 41 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script>
45 42
46 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> 43 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
47 44
48 45
49 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.Async.js"></script> 46 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.Async.js"></script>
50 47
51</head> 48</head>
52<body> 49<body>
53<pre id="test"> 50<pre id="test">
54<script type="text/javascript" src="SHA.test.js"></script> 51<script type="text/javascript" src="SHA.test.js"></script>
55</pre> 52</pre>
56</body> 53</body>
57</html> 54</html>
58 55
59 56
60 57
61<!-- html> 58<!-- html>
62<head> 59<head>
63 <script> 60 <script>
64 jslog_config_enabled = true; 61 jslog_config_enabled = true;
65 clipperz_profiling_enabled = true; 62 clipperz_profiling_enabled = true;
66 </script> 63 </script>
67 64
68 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 65 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
69 <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script> 66 <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script>
70 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> 67 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
71 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> 68 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
72 69
73 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> 70 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
74 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script> 71 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
75 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 72 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
76 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 73 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
77 74
78 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> 75 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
79</head> 76</head>
80<body> 77<body>
81<pre id="test"> 78<pre id="test">
82<script type="text/javascript"> 79<script type="text/javascript">
83 80
84try { 81try {
85 varbyteArray; 82 varbyteArray;
86 varhash; 83 varhash;
87 var longText; 84 var longText;
88 var startTime, endTime; 85 var startTime, endTime;
89 86
90 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 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.";
91 88
92 //------------------------------------------------------------------------- 89 //-------------------------------------------------------------------------
93 // 90 //
94 //Test of SHA-256 algorithm 91 //Test of SHA-256 algorithm
95 // 92 //
96 //------------------------------------------------------------------------- 93 //-------------------------------------------------------------------------
97 94
98 byteArray = new Clipperz.ByteArray(); 95 byteArray = new Clipperz.ByteArray();
99 hash = Clipperz.Crypto.SHA.sha256(byteArray); 96 hash = Clipperz.Crypto.SHA.sha256(byteArray);
100 is(hash.toHexString(), "0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "sha256('')"); 97 is(hash.toHexString(), "0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "sha256('')");
101 98
102 byteArray = new Clipperz.ByteArray("0xbd"); 99 byteArray = new Clipperz.ByteArray("0xbd");
103 hash = Clipperz.Crypto.SHA.sha256(byteArray); 100 hash = Clipperz.Crypto.SHA.sha256(byteArray);
104 is(hash.toHexString(), "0x68325720aabd7c82f30f554b313d0570c95accbb7dc4b5aae11204c08ffe732b", "sha256('0xbd')"); 101 is(hash.toHexString(), "0x68325720aabd7c82f30f554b313d0570c95accbb7dc4b5aae11204c08ffe732b", "sha256('0xbd')");
105 102
106 byteArray = new Clipperz.ByteArray("0x5fd4"); 103 byteArray = new Clipperz.ByteArray("0x5fd4");
107 hash = Clipperz.Crypto.SHA.sha256(byteArray); 104 hash = Clipperz.Crypto.SHA.sha256(byteArray);
108 is(hash.toHexString(), "0x7c4fbf484498d21b487b9d61de8914b2eadaf2698712936d47c3ada2558f6788", "sha256('0x5fd4')"); 105 is(hash.toHexString(), "0x7c4fbf484498d21b487b9d61de8914b2eadaf2698712936d47c3ada2558f6788", "sha256('0x5fd4')");
109 106
110 byteArray = new Clipperz.ByteArray("0xc98c8e55"); 107 byteArray = new Clipperz.ByteArray("0xc98c8e55");
111 hash = Clipperz.Crypto.SHA.sha256(byteArray); 108 hash = Clipperz.Crypto.SHA.sha256(byteArray);
112 is(hash.toHexString(), "0x7abc22c0ae5af26ce93dbb94433a0e0b2e119d014f8e7f65bd56c61ccccd9504", "sha256('0xc98c8e55')"); 109 is(hash.toHexString(), "0x7abc22c0ae5af26ce93dbb94433a0e0b2e119d014f8e7f65bd56c61ccccd9504", "sha256('0xc98c8e55')");
113 110
114 byteArray = new Clipperz.ByteArray("0x0df1cd526b5a4edd"); 111 byteArray = new Clipperz.ByteArray("0x0df1cd526b5a4edd");
115 hash = Clipperz.Crypto.SHA.sha256(byteArray); 112 hash = Clipperz.Crypto.SHA.sha256(byteArray);
116 is(hash.toHexString(), "0x47f527210d6e8f940b5082fec01b7305908fa2b49ea3ae597c19a3986097153c", "sha256('0x0df1cd526b5a4edd')"); 113 is(hash.toHexString(), "0x47f527210d6e8f940b5082fec01b7305908fa2b49ea3ae597c19a3986097153c", "sha256('0x0df1cd526b5a4edd')");
117 114
118 byteArray = new Clipperz.ByteArray("0xfdf4700984ee11b70af1880d0e0fefd4"); 115 byteArray = new Clipperz.ByteArray("0xfdf4700984ee11b70af1880d0e0fefd4");
119 hash = Clipperz.Crypto.SHA.sha256(byteArray); 116 hash = Clipperz.Crypto.SHA.sha256(byteArray);
120 is(hash.toHexString(), 117 is(hash.toHexString(),
121 "0xb01ae16eed3b4a770f127b98469ba26fe3d8e9f59d8a2983214afe6cff0e6b6c", 118 "0xb01ae16eed3b4a770f127b98469ba26fe3d8e9f59d8a2983214afe6cff0e6b6c",
122 "sha256('0xfdf4700984ee11b70af1880d0e0fefd4')"); 119 "sha256('0xfdf4700984ee11b70af1880d0e0fefd4')");
123 120
124 byteArray = new Clipperz.ByteArray("0x8cf53d90077df9a043bf8d10b470b144784411c93a4d504556834dae3ea4a5bb"); 121 byteArray = new Clipperz.ByteArray("0x8cf53d90077df9a043bf8d10b470b144784411c93a4d504556834dae3ea4a5bb");
125 hash = Clipperz.Crypto.SHA.sha256(byteArray); 122 hash = Clipperz.Crypto.SHA.sha256(byteArray);
126 is(hash.toHexString(), 123 is(hash.toHexString(),
127 "0x56059e8cb3c2978b198208bf5ca1e1ea5659b737a506324b7cec75b5ebaf057d", 124 "0x56059e8cb3c2978b198208bf5ca1e1ea5659b737a506324b7cec75b5ebaf057d",
128 "sha256('0x8cf53d90077df9a043bf8d10b470b144784411c93a4d504556834dae3ea4a5bb')"); 125 "sha256('0x8cf53d90077df9a043bf8d10b470b144784411c93a4d504556834dae3ea4a5bb')");
129 126
130 byteArray = new Clipperz.ByteArray("0xeebcf5cd6b12c90db64ff71a0e08ccd956e170a50dad769480d6b1fb3eff4934cde90f9e9b930ee637a66285c10f4e8a"); 127 byteArray = new Clipperz.ByteArray("0xeebcf5cd6b12c90db64ff71a0e08ccd956e170a50dad769480d6b1fb3eff4934cde90f9e9b930ee637a66285c10f4e8a");
131 hash = Clipperz.Crypto.SHA.sha256(byteArray); 128 hash = Clipperz.Crypto.SHA.sha256(byteArray);
132 is(hash.toHexString(), 129 is(hash.toHexString(),
133 "0xc117b9dce689c399ec99008788cd5d24d8396fab7d96315c4f3fe6d56da63bb3", 130 "0xc117b9dce689c399ec99008788cd5d24d8396fab7d96315c4f3fe6d56da63bb3",
134 "sha256('0xeebcf5cd6b12c90db64ff71a0e08ccd956e170a50dad769480d6b1fb3eff4934cde90f9e9b930ee637a66285c10f4e8a')"); 131 "sha256('0xeebcf5cd6b12c90db64ff71a0e08ccd956e170a50dad769480d6b1fb3eff4934cde90f9e9b930ee637a66285c10f4e8a')");
135 132
136 byteArray = new Clipperz.ByteArray("0x3592ecfd1eac618fd390e7a9c24b656532509367c21a0eac1212ac83c0b20cd896eb72b801c4d212c5452bbbf09317b50c5c9fb1997553d2bbc29bb42f5748ad"); 133 byteArray = new Clipperz.ByteArray("0x3592ecfd1eac618fd390e7a9c24b656532509367c21a0eac1212ac83c0b20cd896eb72b801c4d212c5452bbbf09317b50c5c9fb1997553d2bbc29bb42f5748ad");
137 hash = Clipperz.Crypto.SHA.sha256(byteArray); 134 hash = Clipperz.Crypto.SHA.sha256(byteArray);
138 is(hash.toHexString(), 135 is(hash.toHexString(),
139 "0x105a60865830ac3a371d3843324d4bb5fa8ec0e02ddaa389ad8da4f10215c454", 136 "0x105a60865830ac3a371d3843324d4bb5fa8ec0e02ddaa389ad8da4f10215c454",
140 "sha256('0x3592ecfd1eac618fd390e7a9c24b656532509367c21a0eac1212ac83c0b20cd896eb72b801c4d212c5452bbbf09317b50c5c9fb1997553d2bbc29bb42f5748ad')"); 137 "sha256('0x3592ecfd1eac618fd390e7a9c24b656532509367c21a0eac1212ac83c0b20cd896eb72b801c4d212c5452bbbf09317b50c5c9fb1997553d2bbc29bb42f5748ad')");
141 138
142 139
143 byteArray = new Clipperz.ByteArray(longText); 140 byteArray = new Clipperz.ByteArray(longText);
144startTime = new Date(); 141startTime = new Date();
145//console.profile("SHA256"); 142//console.profile("SHA256");
146 hash = Clipperz.Crypto.SHA.sha256(byteArray); 143 hash = Clipperz.Crypto.SHA.sha256(byteArray);
147//console.profileEnd("SHA256"); 144//console.profileEnd("SHA256");
148endTime = new Date(); 145endTime = new Date();
149 is(hash.toHexString(), 146 is(hash.toHexString(),
150 "0xf6fac13c06784e0fbc61a3d25c41c9984840a8b617a2beb57cf6fa3e5e4a8949", 147 "0xf6fac13c06784e0fbc61a3d25c41c9984840a8b617a2beb57cf6fa3e5e4a8949",
151 "sha256(longText)"); 148 "sha256(longText)");
152 is((endTime - startTime) < 500, true, "Long text hash performance (" + (endTime - startTime) + ")"); 149 is((endTime - startTime) < 500, true, "Long text hash performance (" + (endTime - startTime) + ")");
153 MochiKit.Logging.logDebug("elapsed time: " + (endTime - startTime)); 150 MochiKit.Logging.logDebug("elapsed time: " + (endTime - startTime));
154 151
155//############################################################################# 152//#############################################################################
156 153
157} catch (err) { 154} catch (err) {
158 155
159 var s = "test suite failure!\n"; 156 var s = "test suite failure!\n";
160 var o = {}; 157 var o = {};
161 var k = null; 158 var k = null;
162 for (k in err) { 159 for (k in err) {
163 // ensure unique keys?! 160 // ensure unique keys?!
164 if (!o[k]) { 161 if (!o[k]) {
165 s += k + ": " + err[k] + "\n"; 162 s += k + ": " + err[k] + "\n";
166 o[k] = err[k]; 163 o[k] = err[k];
167 } 164 }
168 } 165 }
169 ok ( false, s ); 166 ok ( false, s );
170} 167}
171 168
172</script> 169</script>
173</pre> 170</pre>
174</body> 171</body>
175</html --> 172</html -->
diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/SHA.test.js b/frontend/gamma/tests/tests/Clipperz/Crypto/SHA.test.js
index c9f1f3b..2864aaf 100644
--- a/frontend/gamma/tests/tests/Clipperz/Crypto/SHA.test.js
+++ b/frontend/gamma/tests/tests/Clipperz/Crypto/SHA.test.js
@@ -1,84 +1,81 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29var testSHA = function (aValue, anExpectedResult) { 26var testSHA = function (aValue, anExpectedResult) {
30 var byteArrayValue; 27 var byteArrayValue;
31 28
32 byteArrayValue = new Clipperz.ByteArray(aValue); 29 byteArrayValue = new Clipperz.ByteArray(aValue);
33 hash = Clipperz.Crypto.SHA.sha256(byteArrayValue); 30 hash = Clipperz.Crypto.SHA.sha256(byteArrayValue);
34 is(hash.toHexString(), anExpectedResult, "sha256(' " + byteArrayValue.toHexString() + "')"); 31 is(hash.toHexString(), anExpectedResult, "sha256(' " + byteArrayValue.toHexString() + "')");
35 32
36} 33}
37 34
38 35
39var tests = { 36var tests = {
40 37
41 'basic_tests': function (someTestArgs) { 38 'basic_tests': function (someTestArgs) {
42 testSHA('', '0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'); 39 testSHA('', '0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855');
43 testSHA('0xbd', '0x68325720aabd7c82f30f554b313d0570c95accbb7dc4b5aae11204c08ffe732b'); 40 testSHA('0xbd', '0x68325720aabd7c82f30f554b313d0570c95accbb7dc4b5aae11204c08ffe732b');
44 testSHA('0x5fd4', '0x7c4fbf484498d21b487b9d61de8914b2eadaf2698712936d47c3ada2558f6788'); 41 testSHA('0x5fd4', '0x7c4fbf484498d21b487b9d61de8914b2eadaf2698712936d47c3ada2558f6788');
45 testSHA('0xc98c8e55', '0x7abc22c0ae5af26ce93dbb94433a0e0b2e119d014f8e7f65bd56c61ccccd9504'); 42 testSHA('0xc98c8e55', '0x7abc22c0ae5af26ce93dbb94433a0e0b2e119d014f8e7f65bd56c61ccccd9504');
46 testSHA('0x0df1cd526b5a4edd', '0x47f527210d6e8f940b5082fec01b7305908fa2b49ea3ae597c19a3986097153c'); 43 testSHA('0x0df1cd526b5a4edd', '0x47f527210d6e8f940b5082fec01b7305908fa2b49ea3ae597c19a3986097153c');
47 testSHA('0xfdf4700984ee11b70af1880d0e0fefd4', '0xb01ae16eed3b4a770f127b98469ba26fe3d8e9f59d8a2983214afe6cff0e6b6c'); 44 testSHA('0xfdf4700984ee11b70af1880d0e0fefd4', '0xb01ae16eed3b4a770f127b98469ba26fe3d8e9f59d8a2983214afe6cff0e6b6c');
48 testSHA('0x8cf53d90077df9a043bf8d10b470b144784411c93a4d504556834dae3ea4a5bb', '0x56059e8cb3c2978b198208bf5ca1e1ea5659b737a506324b7cec75b5ebaf057d'); 45 testSHA('0x8cf53d90077df9a043bf8d10b470b144784411c93a4d504556834dae3ea4a5bb', '0x56059e8cb3c2978b198208bf5ca1e1ea5659b737a506324b7cec75b5ebaf057d');
49 testSHA('0xeebcf5cd6b12c90db64ff71a0e08ccd956e170a50dad769480d6b1fb3eff4934cde90f9e9b930ee637a66285c10f4e8a', '0xc117b9dce689c399ec99008788cd5d24d8396fab7d96315c4f3fe6d56da63bb3'); 46 testSHA('0xeebcf5cd6b12c90db64ff71a0e08ccd956e170a50dad769480d6b1fb3eff4934cde90f9e9b930ee637a66285c10f4e8a', '0xc117b9dce689c399ec99008788cd5d24d8396fab7d96315c4f3fe6d56da63bb3');
50 testSHA('0x3592ecfd1eac618fd390e7a9c24b656532509367c21a0eac1212ac83c0b20cd896eb72b801c4d212c5452bbbf09317b50c5c9fb1997553d2bbc29bb42f5748ad', '0x105a60865830ac3a371d3843324d4bb5fa8ec0e02ddaa389ad8da4f10215c454'); 47 testSHA('0x3592ecfd1eac618fd390e7a9c24b656532509367c21a0eac1212ac83c0b20cd896eb72b801c4d212c5452bbbf09317b50c5c9fb1997553d2bbc29bb42f5748ad', '0x105a60865830ac3a371d3843324d4bb5fa8ec0e02ddaa389ad8da4f10215c454');
51 48
52 }, 49 },
53 50
54 //------------------------------------------------------------------------- 51 //-------------------------------------------------------------------------
55 52
56 'aldo_cortesi_tests': function (someTestArgs) { 53 'aldo_cortesi_tests': function (someTestArgs) {
57 testSHA('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa','0xa3f01b6939256127582ac8ae9fb47a382a244680806a3f613a118851c1ca1d47'); 54 testSHA('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa','0xa3f01b6939256127582ac8ae9fb47a382a244680806a3f613a118851c1ca1d47');
58 testSHA('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa','0xb35439a4ac6f0948b6d6f9e3c6af0f5f590ce20f1bde7090ef7970686ec6738a'); 55 testSHA('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa','0xb35439a4ac6f0948b6d6f9e3c6af0f5f590ce20f1bde7090ef7970686ec6738a');
59 testSHA('0x79', '0xa1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa'); 56 testSHA('0x79', '0xa1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa');
60 testSHA('0x80', '0x76be8b528d0075f7aae98d6fa57a6d3c83ae480a8469e668d7b0af968995ac71'); 57 testSHA('0x80', '0x76be8b528d0075f7aae98d6fa57a6d3c83ae480a8469e668d7b0af968995ac71');
61 }, 58 },
62 59
63 //------------------------------------------------------------------------- 60 //-------------------------------------------------------------------------
64 61
65 'longTextPerformance_test': function (someTestArgs) { 62 'longTextPerformance_test': function (someTestArgs) {
66 var longText; 63 var longText;
67 var startTime; 64 var startTime;
68 var endTime; 65 var endTime;
69 66
70 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."; 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.";
71 startTime = new Date(); 68 startTime = new Date();
72 testSHA(longText, '0xf6fac13c06784e0fbc61a3d25c41c9984840a8b617a2beb57cf6fa3e5e4a8949'); 69 testSHA(longText, '0xf6fac13c06784e0fbc61a3d25c41c9984840a8b617a2beb57cf6fa3e5e4a8949');
73 endTime = new Date(); 70 endTime = new Date();
74 71
75 is((endTime - startTime) < 100, true, "Long text hash performance (" + (endTime - startTime) + ")"); 72 is((endTime - startTime) < 100, true, "Long text hash performance (" + (endTime - startTime) + ")");
76 }, 73 },
77 74
78 //------------------------------------------------------------------------- 75 //-------------------------------------------------------------------------
79 'syntaxFix': MochiKit.Base.noop 76 'syntaxFix': MochiKit.Base.noop
80} 77}
81 78
82//============================================================================= 79//=============================================================================
83 80
84SimpleTest.runDeferredTests("Clipperz.Crypto.SHA", tests, {trace:false}); 81SimpleTest.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 63278c4..d0ee153 100644
--- a/frontend/gamma/tests/tests/Clipperz/Crypto/SRP.html
+++ b/frontend/gamma/tests/tests/Clipperz/Crypto/SRP.html
@@ -1,161 +1,158 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27--> 24-->
28 25
29<html> 26<html>
30<head> 27<head>
31 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 28 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
32 <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script> 29 <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script>
33 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> 30 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
34 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> 31 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
35 32
36 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> 33 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
37 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script> 34 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
38 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 35 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
39 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 36 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
40 37
41 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> 38 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> 39 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
43 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> 40 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
44 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script> 41 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
45 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script> 42 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
46 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script> 43 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script>
47</head> 44</head>
48<body> 45<body>
49<pre id="test"> 46<pre id="test">
50<script type="text/javascript"> 47<script type="text/javascript">
51hashString = function(aValue) { 48hashString = function(aValue) {
52 return Clipperz.Crypto.SHA.sha256(new Clipperz.ByteArray(aValue)).toHexString().substring(2) 49 return Clipperz.Crypto.SHA.sha256(new Clipperz.ByteArray(aValue)).toHexString().substring(2)
53} 50}
54try { 51try {
55 varusername; 52 varusername;
56 varpassphrase; 53 varpassphrase;
57 54
58 var C; 55 var C;
59 var P; 56 var P;
60 var encryptedText_1; 57 var encryptedText_1;
61 var encryptedText_2; 58 var encryptedText_2;
62 varsalt; 59 varsalt;
63 varx; 60 varx;
64 var v; 61 var v;
65 var v1; 62 var v1;
66 63
67 username = "giulio.cesare"; 64 username = "giulio.cesare";
68 passphrase = "trustno1"; 65 passphrase = "trustno1";
69 66
70 C = hashString(username); 67 C = hashString(username);
71 is (C, "bde3c7b5fdcd9d6ce72782ca1ae912fc4397d668fcb3a73a04e5d47852670c4a", "C"); 68 is (C, "bde3c7b5fdcd9d6ce72782ca1ae912fc4397d668fcb3a73a04e5d47852670c4a", "C");
72 69
73 P = hashString(passphrase + username); 70 P = hashString(passphrase + username);
74 is (P, "d79f5c5a04e91e1c85fb64cb6ee9481cb52c181047f69da02cd6c3ce6d058a76", "P"); 71 is (P, "d79f5c5a04e91e1c85fb64cb6ee9481cb52c181047f69da02cd6c3ce6d058a76", "P");
75 72
76 salt = "cf1fa93393ade60318b8276f1f39420098419445005a7dc9117975fe1f8d9988"; 73 salt = "cf1fa93393ade60318b8276f1f39420098419445005a7dc9117975fe1f8d9988";
77 74
78 x = hashString(salt + P); 75 x = hashString(salt + P);
79 is(x, "21fe88a158e420aade86e00b5eb12a4c19bf15482fa34c542c90b1afdbd5b5fd", "x"); 76 is(x, "21fe88a158e420aade86e00b5eb12a4c19bf15482fa34c542c90b1afdbd5b5fd", "x");
80 77
81 v = Clipperz.Crypto.SRP.g().powerModule(new Clipperz.Crypto.BigInt(x, 16), Clipperz.Crypto.SRP.n()); 78 v = Clipperz.Crypto.SRP.g().powerModule(new Clipperz.Crypto.BigInt(x, 16), Clipperz.Crypto.SRP.n());
82 is(v.asString(10), "33816467430011076413789931449607305355248467973000153409872503376381719918118", "v"); 79 is(v.asString(10), "33816467430011076413789931449607305355248467973000153409872503376381719918118", "v");
83 is(v.asString(16), "4ac37139dbf32ebabd2c43f91dd085066d3c457d059efd5902d32ed247fcb626", "v (base 16)"); 80 is(v.asString(16), "4ac37139dbf32ebabd2c43f91dd085066d3c457d059efd5902d32ed247fcb626", "v (base 16)");
84 81
85 //encryptedText_1 = Clipperz.Crypto.Base.encryptUsingSecretKey(passphrase, username); 82 //encryptedText_1 = Clipperz.Crypto.Base.encryptUsingSecretKey(passphrase, username);
86 //encryptedText_2 = Clipperz.Crypto.Base.encryptUsingSecretKey(passphrase, username); 83 //encryptedText_2 = Clipperz.Crypto.Base.encryptUsingSecretKey(passphrase, username);
87 //is (encryptedText_1 != encryptedText_2, true, "Two round of encryption (with random padding bits) should NOT produce the same result"); 84 //is (encryptedText_1 != encryptedText_2, true, "Two round of encryption (with random padding bits) should NOT produce the same result");
88 85
89 //------------------------------------------------------------------------- 86 //-------------------------------------------------------------------------
90 87
91 username = "giulio.cesare.debug"; 88 username = "giulio.cesare.debug";
92 passphrase = "trustno1"; 89 passphrase = "trustno1";
93 90
94 C = hashString(username); 91 C = hashString(username);
95 is (C, "fa1af609123b97a10d676158ed538d4657a89ac33a102b22bd9a66712039e208", "C"); 92 is (C, "fa1af609123b97a10d676158ed538d4657a89ac33a102b22bd9a66712039e208", "C");
96 93
97 P = hashString(passphrase + username); 94 P = hashString(passphrase + username);
98 is (P, "e1bfba03dd626b12f29458a6ad63fb2c01b4765548504e1e2f6b1503c82e4253", "P"); 95 is (P, "e1bfba03dd626b12f29458a6ad63fb2c01b4765548504e1e2f6b1503c82e4253", "P");
99 96
100 salt = "cf1fa93393ade60318b8276f1f39420098419445005a7dc9117975fe1f8d9988"; 97 salt = "cf1fa93393ade60318b8276f1f39420098419445005a7dc9117975fe1f8d9988";
101 98
102 x = hashString(salt + P); 99 x = hashString(salt + P);
103 is(x, "93d4af3cdcd2447a745d309826dff3161feed4b15f32db8e909ff032a2bc8fb8", "x"); 100 is(x, "93d4af3cdcd2447a745d309826dff3161feed4b15f32db8e909ff032a2bc8fb8", "x");
104 101
105 v = Clipperz.Crypto.SRP.g().powerModule(new Clipperz.Crypto.BigInt(x, 16), Clipperz.Crypto.SRP.n()); 102 v = Clipperz.Crypto.SRP.g().powerModule(new Clipperz.Crypto.BigInt(x, 16), Clipperz.Crypto.SRP.n());
106 is(v.asString(10), "115049747015252903452664067168789229427785288458366249918596663144588656606556", "v"); 103 is(v.asString(10), "115049747015252903452664067168789229427785288458366249918596663144588656606556", "v");
107 104
108 //encryptedText_1 = Clipperz.Crypto.Base.encryptUsingSecretKey(passphrase, username); 105 //encryptedText_1 = Clipperz.Crypto.Base.encryptUsingSecretKey(passphrase, username);
109 //encryptedText_2 = Clipperz.Crypto.Base.encryptUsingSecretKey(passphrase, username); 106 //encryptedText_2 = Clipperz.Crypto.Base.encryptUsingSecretKey(passphrase, username);
110 //is (encryptedText_1 != encryptedText_2, true, "Two round of encryption (with random padding bits) should NOT produce the same result"); 107 //is (encryptedText_1 != encryptedText_2, true, "Two round of encryption (with random padding bits) should NOT produce the same result");
111 108
112 //------------------------------------------------------------------------- 109 //-------------------------------------------------------------------------
113 110
114 var srpConnection; 111 var srpConnection;
115 var C, P, salt; 112 var C, P, salt;
116 113
117 C = "da8602c2f847306f4eb9acdaad925277d1fad1408f173f128a078aea15e60b1e"; 114 C = "da8602c2f847306f4eb9acdaad925277d1fad1408f173f128a078aea15e60b1e";
118 P = "77643559beca49dd21c1c31db10bb0a9009662cb504413dc3fa3b7303c7e02ba"; 115 P = "77643559beca49dd21c1c31db10bb0a9009662cb504413dc3fa3b7303c7e02ba";
119 salt ="000108cbbacda1f03ea9360301045434ec7d82ba150936df08a229cbb4832ce1"; 116 salt ="000108cbbacda1f03ea9360301045434ec7d82ba150936df08a229cbb4832ce1";
120 117
121 srpConnection = new Clipperz.Crypto.SRP.Connection({C:C, P:P, hash:Clipperz.Crypto.SHA.sha_d256}); 118 srpConnection = new Clipperz.Crypto.SRP.Connection({C:C, P:P, hash:Clipperz.Crypto.SHA.sha_d256});
122 srpConnection._a = new Clipperz.Crypto.BigInt("37532428169486597638072888476611365392249575518156687476805936694442691012367", 10); 119 srpConnection._a = new Clipperz.Crypto.BigInt("37532428169486597638072888476611365392249575518156687476805936694442691012367", 10);
123 srpConnection.set_s(new Clipperz.Crypto.BigInt(salt, 16)); 120 srpConnection.set_s(new Clipperz.Crypto.BigInt(salt, 16));
124 is (srpConnection.s().asString(16, 64), salt, "salt read/write is coherent"); 121 is (srpConnection.s().asString(16, 64), salt, "salt read/write is coherent");
125 srpConnection.set_B(new Clipperz.Crypto.BigInt("123541032067854367017620977654446651448957899464139861291542193929199957895435", 10)); 122 srpConnection.set_B(new Clipperz.Crypto.BigInt("123541032067854367017620977654446651448957899464139861291542193929199957895435", 10));
126 123
127 is(srpConnection.serverSideCredentialsWithSalt(salt).v, 124 is(srpConnection.serverSideCredentialsWithSalt(salt).v,
128 "c73169c8236d37bf9ef11a2349e3064b7dc6e883a58d64443ea9235677520030", 125 "c73169c8236d37bf9ef11a2349e3064b7dc6e883a58d64443ea9235677520030",
129 "server side credentials - v" 126 "server side credentials - v"
130 ) 127 )
131 is(srpConnection.S(), "84134227508133659832466942692590826994401065200828529664948840490489960952050", "Server side 'S'"); 128 is(srpConnection.S(), "84134227508133659832466942692590826994401065200828529664948840490489960952050", "Server side 'S'");
132//MochiKit.Logging.logDebug("=== serverSideCredentials: " + MochiKit.Base.serializeJSON(srpConnection.serverSideCredentialsWithSalt(salt))); 129//MochiKit.Logging.logDebug("=== serverSideCredentials: " + MochiKit.Base.serializeJSON(srpConnection.serverSideCredentialsWithSalt(salt)));
133 130
134 srpConnection = new Clipperz.Crypto.SRP.Connection({C:C, P:P, hash:Clipperz.Crypto.SHA.sha_d256}); 131 srpConnection = new Clipperz.Crypto.SRP.Connection({C:C, P:P, hash:Clipperz.Crypto.SHA.sha_d256});
135 try { 132 try {
136 srpConnection.set_B(new Clipperz.Crypto.BigInt("0", 10)); 133 srpConnection.set_B(new Clipperz.Crypto.BigInt("0", 10));
137 ok(false, "Setting B to 0 should raise an exception"); 134 ok(false, "Setting B to 0 should raise an exception");
138 } catch(e) { 135 } catch(e) {
139 ok(true, "Setting B to 0 should raise an exception"); 136 ok(true, "Setting B to 0 should raise an exception");
140 } 137 }
141 //------------------------------------------------------------------------- 138 //-------------------------------------------------------------------------
142 139
143} catch (err) { 140} catch (err) {
144 141
145 var s = "test suite failure!\n"; 142 var s = "test suite failure!\n";
146 var o = {}; 143 var o = {};
147 var k = null; 144 var k = null;
148 for (k in err) { 145 for (k in err) {
149 // ensure unique keys?! 146 // ensure unique keys?!
150 if (!o[k]) { 147 if (!o[k]) {
151 s += k + ": " + err[k] + "\n"; 148 s += k + ": " + err[k] + "\n";
152 o[k] = err[k]; 149 o[k] = err[k];
153 } 150 }
154 } 151 }
155 ok ( false, s ); 152 ok ( false, s );
156} 153}
157 154
158</script> 155</script>
159</pre> 156</pre>
160</body> 157</body>
161</html> 158</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/Usage.html b/frontend/gamma/tests/tests/Clipperz/Crypto/Usage.html
index 63f7610..8920915 100644
--- a/frontend/gamma/tests/tests/Clipperz/Crypto/Usage.html
+++ b/frontend/gamma/tests/tests/Clipperz/Crypto/Usage.html
@@ -1,122 +1,119 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27--> 24-->
28 25
29<html> 26<html>
30<head> 27<head>
31 <title>Clipperz.Crypto.Usage - TEST</title> 28 <title>Clipperz.Crypto.Usage - TEST</title>
32 29
33 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 30 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
34 <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script> 31 <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script>
35 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> 32 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
36 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> 33 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
37 34
38 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script> 35 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script>
39 36
40 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> 37 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
41 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script> 38 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 39 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
43 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script> 40 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
44 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 41 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
45 42
46 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> 43 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
47 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script> 44 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
48 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script> 45 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
49 46
50</head> 47</head>
51<body> 48<body>
52<pre id="test"> 49<pre id="test">
53<script type="text/javascript"> 50<script type="text/javascript">
54Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); 51Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
55 52
56MochiKit.Base.update(Clipperz, { 53MochiKit.Base.update(Clipperz, {
57 'PM': { 54 'PM': {
58 'Crypto': { 55 'Crypto': {
59 'passwordEntropy': function(aValue) { 56 'passwordEntropy': function(aValue) {
60 var result; 57 var result;
61 varbitPerChar; 58 varbitPerChar;
62 59
63 bitPerChar = 4; 60 bitPerChar = 4;
64 if (/[a-z]/.test(aValue)) { 61 if (/[a-z]/.test(aValue)) {
65 bitPerChar ++; 62 bitPerChar ++;
66 } 63 }
67 if (/[A-Z]/.test(aValue)) { 64 if (/[A-Z]/.test(aValue)) {
68 bitPerChar ++; 65 bitPerChar ++;
69 } 66 }
70 if (/[^a-zA-Z0-9]/.test(aValue)) { 67 if (/[^a-zA-Z0-9]/.test(aValue)) {
71 bitPerChar ++; 68 bitPerChar ++;
72 } 69 }
73 //MochiKit.Logging.logDebug("--- bitPerChar: " + bitPerChar); 70 //MochiKit.Logging.logDebug("--- bitPerChar: " + bitPerChar);
74 71
75 result = aValue.length * bitPerChar; 72 result = aValue.length * bitPerChar;
76 73
77 return result; 74 return result;
78 } 75 }
79 } 76 }
80 } 77 }
81}) 78})
82 79
83try { 80try {
84 var keyValue; 81 var keyValue;
85 var keyEntropy; 82 var keyEntropy;
86 varkey; 83 varkey;
87 var plainText; 84 var plainText;
88 var cypherText; 85 var cypherText;
89 var randomBytes; 86 var randomBytes;
90 var hashedValue; 87 var hashedValue;
91 88
92 key = Clipperz.Crypto.SHA.sha256(new Clipperz.ByteArray("This is my long and complex passphrase")); 89 key = Clipperz.Crypto.SHA.sha256(new Clipperz.ByteArray("This is my long and complex passphrase"));
93 keyEntropy = Clipperz.PM.Crypto.passwordEntropy(key); 90 keyEntropy = Clipperz.PM.Crypto.passwordEntropy(key);
94 91
95 cypherText = Clipperz.Crypto.AES.encrypt(key, new Clipperz.ByteArray("some text to encrypt")); 92 cypherText = Clipperz.Crypto.AES.encrypt(key, new Clipperz.ByteArray("some text to encrypt"));
96 plainText = Clipperz.Crypto.AES.decrypt(key, cypherText).asString(); 93 plainText = Clipperz.Crypto.AES.decrypt(key, cypherText).asString();
97 is(plainText, "some text to encrypt"); 94 is(plainText, "some text to encrypt");
98 95
99 randomBytes = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(256/8); 96 randomBytes = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(256/8);
100 hashedValue = Clipperz.Crypto.SHA.sha256(new Clipperz.ByteArray("text to hash")); 97 hashedValue = Clipperz.Crypto.SHA.sha256(new Clipperz.ByteArray("text to hash"));
101 98
102//############################################################################# 99//#############################################################################
103 100
104} catch (err) { 101} catch (err) {
105 102
106 var s = "test suite failure!\n"; 103 var s = "test suite failure!\n";
107 var o = {}; 104 var o = {};
108 var k = null; 105 var k = null;
109 for (k in err) { 106 for (k in err) {
110 // ensure unique keys?! 107 // ensure unique keys?!
111 if (!o[k]) { 108 if (!o[k]) {
112 s += k + ": " + err[k] + "\n"; 109 s += k + ": " + err[k] + "\n";
113 o[k] = err[k]; 110 o[k] = err[k];
114 } 111 }
115 } 112 }
116 ok ( false, s ); 113 ok ( false, s );
117} 114}
118 115
119</script> 116</script>
120</pre> 117</pre>
121</body> 118</body>
122</html> 119</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/index.html b/frontend/gamma/tests/tests/Clipperz/Crypto/index.html
index 67487ac..dd63ceb 100644
--- a/frontend/gamma/tests/tests/Clipperz/Crypto/index.html
+++ b/frontend/gamma/tests/tests/Clipperz/Crypto/index.html
@@ -1,58 +1,55 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27--> 24-->
28 25
29<html> 26<html>
30<head> 27<head>
31 <title>Clipperz.Crypto.* - tests</title> 28 <title>Clipperz.Crypto.* - tests</title>
32 29
33 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 30 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
34 <script type="text/javascript" src="../../../SimpleTest/TestRunner.js"></script> 31 <script type="text/javascript" src="../../../SimpleTest/TestRunner.js"></script>
35</head> 32</head>
36<body> 33<body>
37<script> 34<script>
38TestRunner.runTests( 35TestRunner.runTests(
39 'AES.html', 36 'AES.html',
40 'AES.performance.html', 37 'AES.performance.html',
41 'Base.html', 38 'Base.html',
42 'BigInt.html', 39 'BigInt.html',
43 40
44 //'ECC.B283.deferred.html', 41 //'ECC.B283.deferred.html',
45 //'ECC.BinaryField.FiniteField.html', 42 //'ECC.BinaryField.FiniteField.html',
46 //'ECC.BinaryField.FiniteField.B283.html', 43 //'ECC.BinaryField.FiniteField.B283.html',
47 //'ECC.BinaryField.Value.html', 44 //'ECC.BinaryField.Value.html',
48 //#'ECC.K283.deferred.html', 45 //#'ECC.K283.deferred.html',
49 46
50 'PRNG.html', 47 'PRNG.html',
51 //'RSA.html', 48 //'RSA.html',
52 'SHA.html', 49 'SHA.html',
53 'SRP.html', 50 'SRP.html',
54 'Usage.html' 51 'Usage.html'
55); 52);
56</script> 53</script>
57</body> 54</body>
58</html> \ No newline at end of file 55</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 e9db091..9a0d5fa 100644
--- a/frontend/gamma/tests/tests/Clipperz/Crypto/jscrypto.js
+++ b/frontend/gamma/tests/tests/Clipperz/Crypto/jscrypto.js
@@ -1,408 +1,405 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29/* jsCrypto 26/* jsCrypto
30Core AES 27Core AES
31 28
32Emily Stark (estark@stanford.edu) 29Emily Stark (estark@stanford.edu)
33Mike Hamburg (mhamburg@stanford.edu) 30Mike Hamburg (mhamburg@stanford.edu)
34Dan Boneh (dabo@cs.stanford.edu) 31Dan Boneh (dabo@cs.stanford.edu)
35 32
36Symmetric AES in Javascript using precomputed lookup tables for round transformations rather for speed improvements 33Symmetric AES in Javascript using precomputed lookup tables for round transformations rather for speed improvements
37and code size reduction. Provides authenticated encryption in OCB and CCM modes. 34and code size reduction. Provides authenticated encryption in OCB and CCM modes.
38Parts of this code are based on the OpenSSL implementation of AES: http://www.openssl.org 35Parts of this code are based on the OpenSSL implementation of AES: http://www.openssl.org
39 36
40Public domain, 2009. 37Public domain, 2009.
41 38
42*/ 39*/
43 40
44 41
45// CCM mode is the default 42// CCM mode is the default
46var CCM = 1, OCB = 2; 43var CCM = 1, OCB = 2;
47 44
48/* aes object constructor. Takes as arguments: 45/* aes object constructor. Takes as arguments:
49- 16-byte key, or an array of 4 32-bit words 46- 16-byte key, or an array of 4 32-bit words
50- Optionally specify a mode (aes.OCB or aes.CCM). Defaults to CCM 47- Optionally specify a mode (aes.OCB or aes.CCM). Defaults to CCM
51- Optionally specify a MAC tag length for integrity. Defaults to 16 bytes 48- Optionally specify a MAC tag length for integrity. Defaults to 16 bytes
52*/ 49*/
53function aes(key, mode, Tlen) { 50function aes(key, mode, Tlen) {
54 // initialize objects for CCM and OCB modes 51 // initialize objects for CCM and OCB modes
55 this._CCM = new cipherCCM(this); 52 this._CCM = new cipherCCM(this);
56 this._OCB = new cipherOCB(this); 53 this._OCB = new cipherOCB(this);
57 54
58 this._decryptScheduled = false; 55 this._decryptScheduled = false;
59 56
60 if (mode) this._mode = mode; 57 if (mode) this._mode = mode;
61 else this._mode = OCB; 58 else this._mode = OCB;
62 59
63 // AES round constants 60 // AES round constants
64 this._RCON = [ 61 this._RCON = [
65 [0x00, 0x00, 0x00, 0x00], 62 [0x00, 0x00, 0x00, 0x00],
66 [0x01, 0x00, 0x00, 0x00], 63 [0x01, 0x00, 0x00, 0x00],
67 [0x02, 0x00, 0x00, 0x00], 64 [0x02, 0x00, 0x00, 0x00],
68 [0x04, 0x00, 0x00, 0x00], 65 [0x04, 0x00, 0x00, 0x00],
69 [0x08, 0x00, 0x00, 0x00], 66 [0x08, 0x00, 0x00, 0x00],
70 [0x10, 0x00, 0x00, 0x00], 67 [0x10, 0x00, 0x00, 0x00],
71 [0x20, 0x00, 0x00, 0x00], 68 [0x20, 0x00, 0x00, 0x00],
72 [0x40, 0x00, 0x00, 0x00], 69 [0x40, 0x00, 0x00, 0x00],
73 [0x80, 0x00, 0x00, 0x00], 70 [0x80, 0x00, 0x00, 0x00],
74 [0x1b, 0x00, 0x00, 0x00], 71 [0x1b, 0x00, 0x00, 0x00],
75 [0x36, 0x00, 0x00, 0x00] 72 [0x36, 0x00, 0x00, 0x00]
76 ]; 73 ];
77 74
78 this._key_len = 16; 75 this._key_len = 16;
79 if (key.length == 4) { 76 if (key.length == 4) {
80 this._key = []; 77 this._key = [];
81 aes.wordsToBytes(key, this._key); 78 aes.wordsToBytes(key, this._key);
82 } 79 }
83 else 80 else
84 this._key = key; 81 this._key = key;
85 82
86 if (Tlen) this._Tlen = Tlen; 83 if (Tlen) this._Tlen = Tlen;
87 else this._Tlen = 16; // tag length in bytes 84 else this._Tlen = 16; // tag length in bytes
88 85
89 this._nr = 10; 86 this._nr = 10;
90 87
91 // initialize tables that will be precomputed 88 // initialize tables that will be precomputed
92 this._SBOX = []; 89 this._SBOX = [];
93 this._INV_SBOX = []; 90 this._INV_SBOX = [];
94 this._T = new Array(4); 91 this._T = new Array(4);
95 this._Tin = new Array(4); 92 this._Tin = new Array(4);
96 for (var i=0; i < 4; i++) { 93 for (var i=0; i < 4; i++) {
97 this._T[i] = []; 94 this._T[i] = [];
98 this._Tin[i] = []; 95 this._Tin[i] = [];
99 } 96 }
100 97
101 this._precompute(); 98 this._precompute();
102 this.scheduleEncrypt(); 99 this.scheduleEncrypt();
103 100
104 // initialize encryption and decryption buffers 101 // initialize encryption and decryption buffers
105 this._ctBuffer = []; 102 this._ctBuffer = [];
106 this._ptBuffer = []; 103 this._ptBuffer = [];
107} 104}
108 105
109 106
110////////////////// 107//////////////////
111// KEY SCHEDULING 108// KEY SCHEDULING
112////////////////// 109//////////////////
113 110
114aes.prototype.scheduleEncrypt = function () { 111aes.prototype.scheduleEncrypt = function () {
115 this._decryptScheduled = false; 112 this._decryptScheduled = false;
116 113
117 this._w = new Array(this._nr+1); 114 this._w = new Array(this._nr+1);
118 this._w[0] = new Array(4); 115 this._w[0] = new Array(4);
119 for (var i=0; i < 4; i++) 116 for (var i=0; i < 4; i++)
120 this._w[0][i] = this._key[i]; 117 this._w[0][i] = this._key[i];
121 var temp = new Array(4); 118 var temp = new Array(4);
122 for (var i=1; i < this._nr+1; i++) { 119 for (var i=1; i < this._nr+1; i++) {
123 temp[0] = this._w[i-1][3]; 120 temp[0] = this._w[i-1][3];
124 this._w[i] = new Array(4); 121 this._w[i] = new Array(4);
125 temp[0] = (this._T[2][(temp[0]>>>16)&0xff] & 0xff000000) ^ (this._T[3][(temp[0]>>>8)&0xff]&0x00ff0000) ^ (this._T[0][(temp[0]&0xff)]&0x0000ff00) ^ (this._T[1][(temp[0]>>>24)]&0x000000ff) ^ (this._RCON[i][0]<<24); 122 temp[0] = (this._T[2][(temp[0]>>>16)&0xff] & 0xff000000) ^ (this._T[3][(temp[0]>>>8)&0xff]&0x00ff0000) ^ (this._T[0][(temp[0]&0xff)]&0x0000ff00) ^ (this._T[1][(temp[0]>>>24)]&0x000000ff) ^ (this._RCON[i][0]<<24);
126 this._w[i][0] = this._w[i-1][0] ^ temp[0]; 123 this._w[i][0] = this._w[i-1][0] ^ temp[0];
127 for (var j=1; j < 4; j++) { 124 for (var j=1; j < 4; j++) {
128 temp[j] = this._w[i][j-1]; 125 temp[j] = this._w[i][j-1];
129 this._w[i][j] = this._w[i-1][j] ^ temp[j]; 126 this._w[i][j] = this._w[i-1][j] ^ temp[j];
130 } 127 }
131 } 128 }
132}; 129};
133 130
134aes.prototype.scheduleDecrypt = function() { 131aes.prototype.scheduleDecrypt = function() {
135 132
136 if (!this._w) this.scheduleEncrypt(); 133 if (!this._w) this.scheduleEncrypt();
137 this._decryptScheduled = true; 134 this._decryptScheduled = true;
138 var temp = []; 135 var temp = [];
139 var j = this._w.length-1; 136 var j = this._w.length-1;
140 for (var i=0; i<j; i++) { 137 for (var i=0; i<j; i++) {
141 temp[0] = this._w[i][0]; 138 temp[0] = this._w[i][0];
142 temp[1] = this._w[i][1]; 139 temp[1] = this._w[i][1];
143 temp[2] = this._w[i][2]; 140 temp[2] = this._w[i][2];
144 temp[3] = this._w[i][3]; 141 temp[3] = this._w[i][3];
145 this._w[i][0] = this._w[j][0]; 142 this._w[i][0] = this._w[j][0];
146 this._w[i][1] = this._w[j][1]; 143 this._w[i][1] = this._w[j][1];
147 this._w[i][2] = this._w[j][2]; 144 this._w[i][2] = this._w[j][2];
148 this._w[i][3] = this._w[j][3]; 145 this._w[i][3] = this._w[j][3];
149 this._w[j][0] = temp[0]; 146 this._w[j][0] = temp[0];
150 this._w[j][1] = temp[1]; 147 this._w[j][1] = temp[1];
151 this._w[j][2] = temp[2]; 148 this._w[j][2] = temp[2];
152 this._w[j][3] = temp[3]; 149 this._w[j][3] = temp[3];
153 j--; 150 j--;
154 } 151 }
155 152
156 var td0 = this._Tin[0], td1 = this._Tin[1], td2 = this._Tin[2], td3 = this._Tin[3], te1 = this._T[1]; 153 var td0 = this._Tin[0], td1 = this._Tin[1], td2 = this._Tin[2], td3 = this._Tin[3], te1 = this._T[1];
157 for (var i=1; i < this._w.length-1; i++) { 154 for (var i=1; i < this._w.length-1; i++) {
158 this._w[i][0] = td0[te1[(this._w[i][0] >>> 24) ] & 0xff] ^ 155 this._w[i][0] = td0[te1[(this._w[i][0] >>> 24) ] & 0xff] ^
159 td1[te1[(this._w[i][0] >>> 16) & 0xff] & 0xff] ^ 156 td1[te1[(this._w[i][0] >>> 16) & 0xff] & 0xff] ^
160 td2[te1[(this._w[i][0] >>> 8) & 0xff] & 0xff] ^ 157 td2[te1[(this._w[i][0] >>> 8) & 0xff] & 0xff] ^
161 td3[te1[(this._w[i][0] ) & 0xff] & 0xff]; 158 td3[te1[(this._w[i][0] ) & 0xff] & 0xff];
162 this._w[i][1] = td0[te1[(this._w[i][1] >>> 24) ] & 0xff] ^ 159 this._w[i][1] = td0[te1[(this._w[i][1] >>> 24) ] & 0xff] ^
163 td1[te1[(this._w[i][1] >>> 16) & 0xff] & 0xff] ^ 160 td1[te1[(this._w[i][1] >>> 16) & 0xff] & 0xff] ^
164 td2[te1[(this._w[i][1] >>> 8) & 0xff] & 0xff] ^ 161 td2[te1[(this._w[i][1] >>> 8) & 0xff] & 0xff] ^
165 td3[te1[(this._w[i][1] ) & 0xff] & 0xff]; 162 td3[te1[(this._w[i][1] ) & 0xff] & 0xff];
166 this._w[i][2] = td0[te1[(this._w[i][2] >>> 24) ] & 0xff] ^ 163 this._w[i][2] = td0[te1[(this._w[i][2] >>> 24) ] & 0xff] ^
167 td1[te1[(this._w[i][2] >>> 16) & 0xff] & 0xff] ^ 164 td1[te1[(this._w[i][2] >>> 16) & 0xff] & 0xff] ^
168 td2[te1[(this._w[i][2] >>> 8) & 0xff] & 0xff] ^ 165 td2[te1[(this._w[i][2] >>> 8) & 0xff] & 0xff] ^
169 td3[te1[(this._w[i][2] ) & 0xff] & 0xff]; 166 td3[te1[(this._w[i][2] ) & 0xff] & 0xff];
170 this._w[i][3] = td0[te1[(this._w[i][3] >>> 24) ] & 0xff] ^ 167 this._w[i][3] = td0[te1[(this._w[i][3] >>> 24) ] & 0xff] ^
171 td1[te1[(this._w[i][3] >>> 16) & 0xff] & 0xff] ^ 168 td1[te1[(this._w[i][3] >>> 16) & 0xff] & 0xff] ^
172 td2[te1[(this._w[i][3] >>> 8) & 0xff] & 0xff] ^ 169 td2[te1[(this._w[i][3] >>> 8) & 0xff] & 0xff] ^
173 td3[te1[(this._w[i][3] ) & 0xff] & 0xff]; 170 td3[te1[(this._w[i][3] ) & 0xff] & 0xff];
174 } 171 }
175}; 172};
176 173
177 174
178///////////////////////// 175/////////////////////////
179// ENCRYPTION/DECRYPTION 176// ENCRYPTION/DECRYPTION
180///////////////////////// 177/////////////////////////
181 178
182 179
183/* Authenticated encryption on a multi-block message in OCB or CCM mode. 180/* Authenticated encryption on a multi-block message in OCB or CCM mode.
184iv should be an array of 32-bit words - either 4 words for OCB mode or 1, 2, or 3 words for CCM. 181iv should be an array of 32-bit words - either 4 words for OCB mode or 1, 2, or 3 words for CCM.
185Use a unique IV for every message encrypted. 182Use a unique IV for every message encrypted.
186The plaintext argument will be encrypted and MACed; adata will be sent in plaintext but MACed. 183The plaintext argument will be encrypted and MACed; adata will be sent in plaintext but MACed.
187Plaintext and adata are strings. 184Plaintext and adata are strings.
188ciphertext is an array of bytes. tag is an array of 32-bit words. 185ciphertext is an array of bytes. tag is an array of 32-bit words.
189*/ 186*/
190aes.prototype.encrypt = function(iv, plaintext, ciphertext, adata, tag) { 187aes.prototype.encrypt = function(iv, plaintext, ciphertext, adata, tag) {
191 var plaintextBytes = [], adataBytes = []; 188 var plaintextBytes = [], adataBytes = [];
192 aes.asciiToBytes(plaintext, plaintextBytes); 189 aes.asciiToBytes(plaintext, plaintextBytes);
193 aes.asciiToBytes(adata, adataBytes); 190 aes.asciiToBytes(adata, adataBytes);
194 191
195 this._iv = iv; 192 this._iv = iv;
196 if (this._mode == CCM) 193 if (this._mode == CCM)
197 this._CCM.encrypt(plaintextBytes, ciphertext, adataBytes, tag); 194 this._CCM.encrypt(plaintextBytes, ciphertext, adataBytes, tag);
198 else if (this._mode == OCB) { 195 else if (this._mode == OCB) {
199 this._OCB.encrypt(plaintextBytes, ciphertext, adataBytes, tag); 196 this._OCB.encrypt(plaintextBytes, ciphertext, adataBytes, tag);
200 } 197 }
201 198
202 // prepend to the ciphertext the length of the iv (in bytes) and the iv 199 // prepend to the ciphertext the length of the iv (in bytes) and the iv
203 var ivbytes=[]; 200 var ivbytes=[];
204 aes.wordsToBytes(iv, ivbytes); 201 aes.wordsToBytes(iv, ivbytes);
205 var ct = [iv.length*4].concat(ivbytes, ciphertext); 202 var ct = [iv.length*4].concat(ivbytes, ciphertext);
206 for (var i=0; i < ct.length; i++) ciphertext[i] = ct[i]; 203 for (var i=0; i < ct.length; i++) ciphertext[i] = ct[i];
207 204
208 for (var i=0; i < ciphertext.length; i++) 205 for (var i=0; i < ciphertext.length; i++)
209 this._ctBuffer[this._ctBuffer.length] = ciphertext[i]; 206 this._ctBuffer[this._ctBuffer.length] = ciphertext[i];
210 207
211}; 208};
212 209
213/* Authenticated decryption on a multi-block ciphertext in OCB or CCM mode. 210/* Authenticated decryption on a multi-block ciphertext in OCB or CCM mode.
214ciphertext is an array of bytes. tag is an array of 32-bit words. 211ciphertext is an array of bytes. tag is an array of 32-bit words.
215plaintext and adata are strings. 212plaintext and adata are strings.
216*/ 213*/
217aes.prototype.decrypt = function(ciphertext, adata, tag) { 214aes.prototype.decrypt = function(ciphertext, adata, tag) {
218 var ivlen = ciphertext[0]; 215 var ivlen = ciphertext[0];
219 var ivbytes = ciphertext.slice(1, ivlen+1); 216 var ivbytes = ciphertext.slice(1, ivlen+1);
220 var iv = []; 217 var iv = [];
221 aes.bytesToWords(ivbytes, iv); 218 aes.bytesToWords(ivbytes, iv);
222 this._iv = iv; 219 this._iv = iv;
223 var ct = ciphertext.slice(ivlen+1); 220 var ct = ciphertext.slice(ivlen+1);
224 221
225 var valid = false; 222 var valid = false;
226 var plaintextBytes = [], adataBytes = []; 223 var plaintextBytes = [], adataBytes = [];
227 aes.asciiToBytes(adata, adataBytes); 224 aes.asciiToBytes(adata, adataBytes);
228 if (this._mode == CCM) 225 if (this._mode == CCM)
229 valid = this._CCM.decrypt(ct, plaintextBytes, adataBytes); 226 valid = this._CCM.decrypt(ct, plaintextBytes, adataBytes);
230 else if (this._mode == OCB) 227 else if (this._mode == OCB)
231 valid = this._OCB.decrypt(ct, plaintextBytes, adataBytes, tag); 228 valid = this._OCB.decrypt(ct, plaintextBytes, adataBytes, tag);
232 if (valid) { 229 if (valid) {
233 var plaintext = aes.bytesToAscii(plaintextBytes); 230 var plaintext = aes.bytesToAscii(plaintextBytes);
234 for (var i=0; i < plaintext.length; i++) 231 for (var i=0; i < plaintext.length; i++)
235 this._ptBuffer[this._ptBuffer.length] = plaintext.charAt(i); 232 this._ptBuffer[this._ptBuffer.length] = plaintext.charAt(i);
236 return plaintext; 233 return plaintext;
237 } 234 }
238 return ""; 235 return "";
239}; 236};
240 237
241// MACs (but doesn't encrypt) data using CMAC (in CCM mode) or PMAC (in OCB mode) 238// MACs (but doesn't encrypt) data using CMAC (in CCM mode) or PMAC (in OCB mode)
242aes.prototype.sign = function(data, tag) { 239aes.prototype.sign = function(data, tag) {
243 if (this._mode == CCM) 240 if (this._mode == CCM)
244 this._CCM.CMAC(data, "", tag, this._Tlen, false); 241 this._CCM.CMAC(data, "", tag, this._Tlen, false);
245 else if (this._mode == OCB) { 242 else if (this._mode == OCB) {
246 this._OCB.PMAC(data, tag); 243 this._OCB.PMAC(data, tag);
247 } 244 }
248}; 245};
249 246
250// Verifies a CMAC or PMAC tag 247// Verifies a CMAC or PMAC tag
251aes.prototype.verify = function(data, tag) { 248aes.prototype.verify = function(data, tag) {
252 var validTag = []; 249 var validTag = [];
253 if (this._mode == CCM) 250 if (this._mode == CCM)
254 this._CCM.CMAC(data, "", validTag, this._Tlen, false); 251 this._CCM.CMAC(data, "", validTag, this._Tlen, false);
255 else if (this._mode == OCB) { 252 else if (this._mode == OCB) {
256 this._OCB.PMAC(data, validTag); 253 this._OCB.PMAC(data, validTag);
257 } 254 }
258 if (validTag.length != tag.length) return false; 255 if (validTag.length != tag.length) return false;
259 for (var i=0; i < tag.length; i++) { 256 for (var i=0; i < tag.length; i++) {
260 if (tag[i] != validTag[i]) return false; 257 if (tag[i] != validTag[i]) return false;
261 } 258 }
262 return true; 259 return true;
263}; 260};
264 261
265/* Encrypts a single block message in AES. Takes the plaintext, an array in which to dump 262/* Encrypts a single block message in AES. Takes the plaintext, an array in which to dump
266the ciphertext, and a boolean decrypt argument. If set to true, this function acts as 263the ciphertext, and a boolean decrypt argument. If set to true, this function acts as
267a decryption function. 264a decryption function.
268block and ciphertext are both arrays of 4 32-bit words. 265block and ciphertext are both arrays of 4 32-bit words.
269*/ 266*/
270aes.prototype.encryptBlock = function(block, ciphertext, decrypt) { 267aes.prototype.encryptBlock = function(block, ciphertext, decrypt) {
271 if (!decrypt && this._decryptScheduled) this.scheduleEncrypt(); 268 if (!decrypt && this._decryptScheduled) this.scheduleEncrypt();
272 269
273 // get key schedule 270 // get key schedule
274 var w = this._w; 271 var w = this._w;
275 // load round transformation tables 272 // load round transformation tables
276 var te0, te1, te2, te3; 273 var te0, te1, te2, te3;
277 if (decrypt) { 274 if (decrypt) {
278 te0 = this._Tin[0]; 275 te0 = this._Tin[0];
279 te1 = this._Tin[1]; 276 te1 = this._Tin[1];
280 te2 = this._Tin[2]; 277 te2 = this._Tin[2];
281 te3 = this._Tin[3]; 278 te3 = this._Tin[3];
282 } else { 279 } else {
283 te0 = this._T[0]; 280 te0 = this._T[0];
284 te1 = this._T[1]; 281 te1 = this._T[1];
285 te2 = this._T[2]; 282 te2 = this._T[2];
286 te3 = this._T[3]; 283 te3 = this._T[3];
287 } 284 }
288 285
289 // perform rounds 286 // perform rounds
290 var rk = w[0]; 287 var rk = w[0];
291 var s0 = block[0] ^ rk[0]; 288 var s0 = block[0] ^ rk[0];
292 var s1 = block[1] ^ rk[1]; 289 var s1 = block[1] ^ rk[1];
293 var s2 = block[2] ^ rk[2]; 290 var s2 = block[2] ^ rk[2];
294 var s3 = block[3] ^ rk[3]; 291 var s3 = block[3] ^ rk[3];
295 var t0,t1,t2,t3; 292 var t0,t1,t2,t3;
296 rk = w[1]; 293 rk = w[1];
297 var order = []; 294 var order = [];
298 for (var round = 1; round < w.length-1; round++) { 295 for (var round = 1; round < w.length-1; round++) {
299 order = [s1, s2, s3, s0]; 296 order = [s1, s2, s3, s0];
300 if (decrypt) order = [s3, s0, s1, s2]; 297 if (decrypt) order = [s3, s0, s1, s2];
301 t0 = te0[(s0>>>24)] ^ te1[(order[0]>>>16) & 0xff]^ te2[(s2>>>8)&0xff] ^ te3[order[2]&0xff] ^ rk[0]; 298 t0 = te0[(s0>>>24)] ^ te1[(order[0]>>>16) & 0xff]^ te2[(s2>>>8)&0xff] ^ te3[order[2]&0xff] ^ rk[0];
302 t1 = te0[(s1>>>24)] ^ te1[(order[1]>>>16) & 0xff]^ te2[(s3>>>8)&0xff] ^ te3[order[3]&0xff] ^ rk[1]; 299 t1 = te0[(s1>>>24)] ^ te1[(order[1]>>>16) & 0xff]^ te2[(s3>>>8)&0xff] ^ te3[order[3]&0xff] ^ rk[1];
303 t2 = te0[(s2>>>24)] ^ te1[(order[2]>>>16) & 0xff]^ te2[(s0>>>8)&0xff] ^ te3[order[0]&0xff] ^ rk[2]; 300 t2 = te0[(s2>>>24)] ^ te1[(order[2]>>>16) & 0xff]^ te2[(s0>>>8)&0xff] ^ te3[order[0]&0xff] ^ rk[2];
304 t3 = te0[(s3>>>24)] ^ te1[(order[3]>>>16) & 0xff]^ te2[(s1>>>8)&0xff] ^ te3[order[1]&0xff] ^ rk[3]; 301 t3 = te0[(s3>>>24)] ^ te1[(order[3]>>>16) & 0xff]^ te2[(s1>>>8)&0xff] ^ te3[order[1]&0xff] ^ rk[3];
305 s0 = t0; 302 s0 = t0;
306 s1 = t1; 303 s1 = t1;
307 s2 = t2; 304 s2 = t2;
308 s3 = t3; 305 s3 = t3;
309 rk = w[round+1]; 306 rk = w[round+1];
310 } 307 }
311 if (decrypt) { 308 if (decrypt) {
312 s0 = ((this._INV_SBOX[(t0>>>24)])<<24) ^ ((this._INV_SBOX[(t3>>>16)&0xff])<<16) ^ ((this._INV_SBOX[(t2>>>8)&0xff])<<8) ^ (this._INV_SBOX[(t1)&0xff]) ^ rk[0]; 309 s0 = ((this._INV_SBOX[(t0>>>24)])<<24) ^ ((this._INV_SBOX[(t3>>>16)&0xff])<<16) ^ ((this._INV_SBOX[(t2>>>8)&0xff])<<8) ^ (this._INV_SBOX[(t1)&0xff]) ^ rk[0];
313 s1 = ((this._INV_SBOX[(t1>>>24)])<<24) ^ ((this._INV_SBOX[(t0>>>16)&0xff])<<16) ^ ((this._INV_SBOX[(t3>>>8)&0xff])<<8) ^ (this._INV_SBOX[(t2)&0xff]) ^ rk[1] 310 s1 = ((this._INV_SBOX[(t1>>>24)])<<24) ^ ((this._INV_SBOX[(t0>>>16)&0xff])<<16) ^ ((this._INV_SBOX[(t3>>>8)&0xff])<<8) ^ (this._INV_SBOX[(t2)&0xff]) ^ rk[1]
314 s2 = ((this._INV_SBOX[(t2>>>24)])<<24) ^ ((this._INV_SBOX[(t1>>>16)&0xff])<<16) ^ ((this._INV_SBOX[(t0>>>8)&0xff])<<8) ^ (this._INV_SBOX[(t3)&0xff]) ^ rk[2]; 311 s2 = ((this._INV_SBOX[(t2>>>24)])<<24) ^ ((this._INV_SBOX[(t1>>>16)&0xff])<<16) ^ ((this._INV_SBOX[(t0>>>8)&0xff])<<8) ^ (this._INV_SBOX[(t3)&0xff]) ^ rk[2];
315 s3 = (this._INV_SBOX[(t3>>>24)]<<24) ^ (this._INV_SBOX[(t2>>>16)&0xff]<<16) ^ (this._INV_SBOX[(t1>>>8)&0xff]<<8) ^ (this._INV_SBOX[(t0)&0xff]) ^ rk[3]; 312 s3 = (this._INV_SBOX[(t3>>>24)]<<24) ^ (this._INV_SBOX[(t2>>>16)&0xff]<<16) ^ (this._INV_SBOX[(t1>>>8)&0xff]<<8) ^ (this._INV_SBOX[(t0)&0xff]) ^ rk[3];
316 } else { 313 } else {
317 s0 = (te2[t0>>>24]&0xff000000) ^ (te3[(t1>>>16)&0xff]&0x00ff0000) ^ (te0[(t2>>>8)&0xff]&0x0000ff00) ^ (te1[(t3)&0xff]&0x000000ff) ^ rk[0]; 314 s0 = (te2[t0>>>24]&0xff000000) ^ (te3[(t1>>>16)&0xff]&0x00ff0000) ^ (te0[(t2>>>8)&0xff]&0x0000ff00) ^ (te1[(t3)&0xff]&0x000000ff) ^ rk[0];
318 s1 = (te2[t1>>>24]&0xff000000) ^ (te3[(t2>>>16)&0xff]&0x00ff0000) ^ (te0[(t3>>>8)&0xff]&0x0000ff00) ^ (te1[(t0)&0xff]&0x000000ff) ^ rk[1]; 315 s1 = (te2[t1>>>24]&0xff000000) ^ (te3[(t2>>>16)&0xff]&0x00ff0000) ^ (te0[(t3>>>8)&0xff]&0x0000ff00) ^ (te1[(t0)&0xff]&0x000000ff) ^ rk[1];
319 s2 = (te2[t2>>>24]&0xff000000) ^ (te3[(t3>>>16)&0xff]&0x00ff0000) ^ (te0[(t0>>>8)&0xff]&0x0000ff00) ^ (te1[(t1)&0xff]&0x000000ff) ^ rk[2]; 316 s2 = (te2[t2>>>24]&0xff000000) ^ (te3[(t3>>>16)&0xff]&0x00ff0000) ^ (te0[(t0>>>8)&0xff]&0x0000ff00) ^ (te1[(t1)&0xff]&0x000000ff) ^ rk[2];
320 s3 = (te2[t3>>>24]&0xff000000) ^ (te3[(t0>>>16)&0xff]&0x00ff0000) ^ (te0[(t1>>>8)&0xff]&0x0000ff00) ^ (te1[(t2)&0xff]&0x000000ff) ^ rk[3]; 317 s3 = (te2[t3>>>24]&0xff000000) ^ (te3[(t0>>>16)&0xff]&0x00ff0000) ^ (te0[(t1>>>8)&0xff]&0x0000ff00) ^ (te1[(t2)&0xff]&0x000000ff) ^ rk[3];
321 } 318 }
322 ciphertext[0] = s0; 319 ciphertext[0] = s0;
323 ciphertext[1] = s1; 320 ciphertext[1] = s1;
324 ciphertext[2] = s2; 321 ciphertext[2] = s2;
325 ciphertext[3] = s3; 322 ciphertext[3] = s3;
326}; 323};
327 324
328// As above, block and plaintext are arrays of 4 32-bit words. 325// As above, block and plaintext are arrays of 4 32-bit words.
329aes.prototype.decryptBlock = function(block, plaintext) { 326aes.prototype.decryptBlock = function(block, plaintext) {
330 if (!this._decryptScheduled) this.scheduleDecrypt(); 327 if (!this._decryptScheduled) this.scheduleDecrypt();
331 328
332 this.encryptBlock(block, plaintext, true); 329 this.encryptBlock(block, plaintext, true);
333}; 330};
334 331
335 332
336//////////////////// 333////////////////////
337// HELPER FUNCTIONS 334// HELPER FUNCTIONS
338//////////////////// 335////////////////////
339 336
340aes._hex = function(n) { 337aes._hex = function(n) {
341 var out = "",i,digits="0123456789ABCDEF"; 338 var out = "",i,digits="0123456789ABCDEF";
342 for (i=0; i<8; i++) { 339 for (i=0; i<8; i++) {
343 var digit = n&0xF; 340 var digit = n&0xF;
344 out = digits.substring(digit,digit+1) + out; 341 out = digits.substring(digit,digit+1) + out;
345 n = n >>> 4; 342 n = n >>> 4;
346 } 343 }
347 return out; 344 return out;
348} 345}
349 346
350aes._hexall = function(nn) { 347aes._hexall = function(nn) {
351 var out = "",i; 348 var out = "",i;
352 for (i=0;i<nn.length;i++) { 349 for (i=0;i<nn.length;i++) {
353 if (i%4 == 0) out+= "<br/>\n"; 350 if (i%4 == 0) out+= "<br/>\n";
354 else if (i) out += " "; 351 else if (i) out += " ";
355 out += aes._hex(nn[i]); 352 out += aes._hex(nn[i]);
356 } 353 }
357 return out; 354 return out;
358} 355}
359 356
360aes.bytesToAscii = function(bytes) { 357aes.bytesToAscii = function(bytes) {
361 var ascii = ""; 358 var ascii = "";
362 var len = bytes.length; 359 var len = bytes.length;
363 for (var i=0; i < len; i++) { 360 for (var i=0; i < len; i++) {
364 ascii = ascii + String.fromCharCode(bytes[i]); 361 ascii = ascii + String.fromCharCode(bytes[i]);
365 } 362 }
366 return ascii; 363 return ascii;
367}; 364};
368 365
369aes.asciiToBytes = function(ascii, bytes) { 366aes.asciiToBytes = function(ascii, bytes) {
370 var len = ascii.length; 367 var len = ascii.length;
371 for (var i=0; i < len; i++) 368 for (var i=0; i < len; i++)
372 bytes[i] = ascii.charCodeAt(i); 369 bytes[i] = ascii.charCodeAt(i);
373}; 370};
374 371
375aes.wordsToBytes = function(words, bytes) { 372aes.wordsToBytes = function(words, bytes) {
376 var bitmask = 1; 373 var bitmask = 1;
377 for (var i=0; i < 7; i++) bitmask = (bitmask << 1) | 1; 374 for (var i=0; i < 7; i++) bitmask = (bitmask << 1) | 1;
378 for (var i=0; i < words.length; i++) { 375 for (var i=0; i < words.length; i++) {
379 var bstart = i*4; 376 var bstart = i*4;
380 for (var j=0; j < 4; j++) { 377 for (var j=0; j < 4; j++) {
381 bytes[bstart+j] = (words[i] & (bitmask << (8*(3-j)))) >>> (8*(3-j)); 378 bytes[bstart+j] = (words[i] & (bitmask << (8*(3-j)))) >>> (8*(3-j));
382 } 379 }
383 } 380 }
384}; 381};
385 382
386aes.bytesToWords = function(bytes, words) { 383aes.bytesToWords = function(bytes, words) {
387 var paddedBytes = bytes.slice(); 384 var paddedBytes = bytes.slice();
388 while (paddedBytes.length % 4 != 0) paddedBytes.push(0); 385 while (paddedBytes.length % 4 != 0) paddedBytes.push(0);
389 var num_words = Math.floor(paddedBytes.length/4); 386 var num_words = Math.floor(paddedBytes.length/4);
390 for (var j=0; j < num_words; j++) 387 for (var j=0; j < num_words; j++)
391 words[j] = ((paddedBytes[(j<<2)+3]) | (paddedBytes[(j<<2)+2] << 8) | (paddedBytes[(j<<2)+1] << 16) | (paddedBytes[j<<2] << 24)); 388 words[j] = ((paddedBytes[(j<<2)+3]) | (paddedBytes[(j<<2)+2] << 8) | (paddedBytes[(j<<2)+1] << 16) | (paddedBytes[j<<2] << 24));
392}; 389};
393 390
394 391
395/////////////////////////////////////// 392///////////////////////////////////////
396// KEY DERIVATION 393// KEY DERIVATION
397////////////////////////////////////// 394//////////////////////////////////////
398 395
399// password is a string, presumably a password entered by the user. 396// password is a string, presumably a password entered by the user.
400// salt is eight random bytes associated with each user 397// salt is eight random bytes associated with each user
401// This function returns an array of bytes of length 16 398// This function returns an array of bytes of length 16
402function generateKey(password, salt) { 399function generateKey(password, salt) {
403 var pwBytes = []; 400 var pwBytes = [];
404 aes.asciiToBytes(password, pwBytes); 401 aes.asciiToBytes(password, pwBytes);
405 var pwWords = [], saltWords = []; 402 var pwWords = [], saltWords = [];
406 aes.bytesToWords(pwBytes, pwWords); 403 aes.bytesToWords(pwBytes, pwWords);
407 aes.bytesToWords(salt, saltWords); 404 aes.bytesToWords(salt, saltWords);
408 405
diff --git a/frontend/gamma/tests/tests/Clipperz/DOM.html b/frontend/gamma/tests/tests/Clipperz/DOM.html
index 2060215..782b1fe 100644
--- a/frontend/gamma/tests/tests/Clipperz/DOM.html
+++ b/frontend/gamma/tests/tests/Clipperz/DOM.html
@@ -1,58 +1,55 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27--> 24-->
28 25
29<html> 26<html>
30<head> 27<head>
31 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script> 28 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script>
32 <script type="text/javascript" src="../../SimpleTest/SimpleTest.js"></script> 29 <script type="text/javascript" src="../../SimpleTest/SimpleTest.js"></script>
33 <link rel="stylesheet" type="text/css" href="../../SimpleTest/test.css"> 30 <link rel="stylesheet" type="text/css" href="../../SimpleTest/test.css">
34 31
35 <script type='text/javascript' src='../../../js/JSON/json2.js'></script> 32 <script type='text/javascript' src='../../../js/JSON/json2.js'></script>
36 33
37 <script type='text/javascript' src='../../../js/Clipperz/YUI/Utils.js'></script> 34 <script type='text/javascript' src='../../../js/Clipperz/YUI/Utils.js'></script>
38 <script type='text/javascript' src='../../../js/Clipperz/YUI/DomHelper.js'></script> 35 <script type='text/javascript' src='../../../js/Clipperz/YUI/DomHelper.js'></script>
39 <script type='text/javascript' src='../../../js/Clipperz/Base.js'></script> 36 <script type='text/javascript' src='../../../js/Clipperz/Base.js'></script>
40 <script type='text/javascript' src='../../../js/Clipperz/DOM.js'></script> 37 <script type='text/javascript' src='../../../js/Clipperz/DOM.js'></script>
41 <script type='text/javascript' src='../../../js/Clipperz/Logging.js'></script> 38 <script type='text/javascript' src='../../../js/Clipperz/Logging.js'></script>
42 39
43 <script type='text/javascript' src='../../../js/Clipperz/Crypto/Base.js'></script> 40 <script type='text/javascript' src='../../../js/Clipperz/Crypto/Base.js'></script>
44</head> 41</head>
45<body> 42<body>
46 43
47<pre id="test"> 44<pre id="test">
48<script> 45<script>
49 Clipperz_IEisBroken = false; 46 Clipperz_IEisBroken = false;
50</script> 47</script>
51 48
52<!--[if IE]><script> 49<!--[if IE]><script>
53Clipperz_IEisBroken = true; 50Clipperz_IEisBroken = true;
54</script><![endif]--> 51</script><![endif]-->
55<script type="text/javascript" src="DOM.test.js"></script> 52<script type="text/javascript" src="DOM.test.js"></script>
56</pre> 53</pre>
57</body> 54</body>
58</html> 55</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/DOM.test.js b/frontend/gamma/tests/tests/Clipperz/DOM.test.js
index a2aafc5..e8c6225 100644
--- a/frontend/gamma/tests/tests/Clipperz/DOM.test.js
+++ b/frontend/gamma/tests/tests/Clipperz/DOM.test.js
@@ -1,82 +1,79 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29try { 26try {
30 var template; 27 var template;
31 var templateArgs; 28 var templateArgs;
32 var element; 29 var element;
33 var rowElement; 30 var rowElement;
34 var tdElement; 31 var tdElement;
35 32
36 template = Clipperz.DOM.Helper.createTemplate( 33 template = Clipperz.DOM.Helper.createTemplate(
37 [ 34 [
38 {tag:'td', children:[{tag:'img', cls:'favicon', src:'{faviconUrl}'}]}, 35 {tag:'td', children:[{tag:'img', cls:'favicon', src:'{faviconUrl}'}]},
39 {tag:'td', children:[{tag:'a', href:'#', cls:'title', html:'{cardTitle}'}]}, 36 {tag:'td', children:[{tag:'a', href:'#', cls:'title', html:'{cardTitle}'}]},
40 {tag:'td', children:[{tag:'span', cls:'directLogins', id:'{directLoginsID}'}]}, 37 {tag:'td', children:[{tag:'span', cls:'directLogins', id:'{directLoginsID}'}]},
41 {tag:'td', children:[{tag:'span', cls:'latestUpdate', html:'{latestUpdate}'}]}, 38 {tag:'td', children:[{tag:'span', cls:'latestUpdate', html:'{latestUpdate}'}]},
42 {tag:'td'} 39 {tag:'td'}
43 ] 40 ]
44 ); 41 );
45 42
46 templateArgs = { 43 templateArgs = {
47 cardTitle: "Amazon.com", 44 cardTitle: "Amazon.com",
48 directLoginsID: "Clipperz_PM_Components_directLogins_58", 45 directLoginsID: "Clipperz_PM_Components_directLogins_58",
49 faviconUrl: "http://www.amazon.com/favicon.ico", 46 faviconUrl: "http://www.amazon.com/favicon.ico",
50 latestUpdate: "", 47 latestUpdate: "",
51 reference: "13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551" 48 reference: "13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551"
52 } 49 }
53 50
54 element = Clipperz.DOM.Helper.append(document.body, {tag:'table', children:[ 51 element = Clipperz.DOM.Helper.append(document.body, {tag:'table', children:[
55 {tag:'theader'}, 52 {tag:'theader'},
56 {tag:'tbody', children:[ 53 {tag:'tbody', children:[
57 {tag:'tr', id:'testRow'} 54 {tag:'tr', id:'testRow'}
58 ]}, 55 ]},
59 {tag:'tfooter'} 56 {tag:'tfooter'}
60 ]}); 57 ]});
61 ok(element != null, "created the TABLE"); 58 ok(element != null, "created the TABLE");
62 59
63 rowElement = Clipperz.DOM.get('testRow'); 60 rowElement = Clipperz.DOM.get('testRow');
64 ok(testRow != null, "created the ROW"); 61 ok(testRow != null, "created the ROW");
65 62
66 template.append(rowElement, templateArgs); 63 template.append(rowElement, templateArgs);
67 tdElement = Clipperz.DOM.get(templateArgs['directLoginsID']); 64 tdElement = Clipperz.DOM.get(templateArgs['directLoginsID']);
68 ok(tdElement != null, "created the TD"); 65 ok(tdElement != null, "created the TD");
69 66
70} catch (err) { 67} catch (err) {
71 var s = "test suite failure!\n"; 68 var s = "test suite failure!\n";
72 var o = {}; 69 var o = {};
73 var k = null; 70 var k = null;
74 for (k in err) { 71 for (k in err) {
75 // ensure unique keys?! 72 // ensure unique keys?!
76 if (!o[k]) { 73 if (!o[k]) {
77 s += k + ": " + err[k] + "\n"; 74 s += k + ": " + err[k] + "\n";
78 o[k] = err[k]; 75 o[k] = err[k];
79 } 76 }
80 } 77 }
81 ok ( false, s ); 78 ok ( false, s );
82} 79}
diff --git a/frontend/gamma/tests/tests/Clipperz/Date.html b/frontend/gamma/tests/tests/Clipperz/Date.html
index 5712a52..1f425c8 100644
--- a/frontend/gamma/tests/tests/Clipperz/Date.html
+++ b/frontend/gamma/tests/tests/Clipperz/Date.html
@@ -1,54 +1,51 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27--> 24-->
28 25
29<html> 26<html>
30<head> 27<head>
31 <title>Clipperz.Date - TEST</title> 28 <title>Clipperz.Date - TEST</title>
32 29
33 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script> 30 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script>
34 <script type="text/javascript" src="../../SimpleTest/SimpleTest.js"></script> 31 <script type="text/javascript" src="../../SimpleTest/SimpleTest.js"></script>
35 <link rel="stylesheet" type="text/css" href="../../SimpleTest/test.css"> 32 <link rel="stylesheet" type="text/css" href="../../SimpleTest/test.css">
36 33
37 <script type='text/javascript' src='../../../js/JSON/json2.js'></script> 34 <script type='text/javascript' src='../../../js/JSON/json2.js'></script>
38 35
39 <script type='text/javascript' src='../../../js/Clipperz/YUI/Utils.js'></script> 36 <script type='text/javascript' src='../../../js/Clipperz/YUI/Utils.js'></script>
40 <script type='text/javascript' src='../../../js/Clipperz/Base.js'></script> 37 <script type='text/javascript' src='../../../js/Clipperz/Base.js'></script>
41 <script type='text/javascript' src='../../../js/Clipperz/Date.js'></script> 38 <script type='text/javascript' src='../../../js/Clipperz/Date.js'></script>
42 <script type='text/javascript' src='../../../js/Clipperz/Logging.js'></script> 39 <script type='text/javascript' src='../../../js/Clipperz/Logging.js'></script>
43 <script type='text/javascript' src='../../../js/Clipperz/Async.js'></script> 40 <script type='text/javascript' src='../../../js/Clipperz/Async.js'></script>
44 41
45 42
46 <script type="text/javascript" src="../../SimpleTest/SimpleTest.Async.js"></script> 43 <script type="text/javascript" src="../../SimpleTest/SimpleTest.Async.js"></script>
47 44
48</head> 45</head>
49<body> 46<body>
50<pre id="test"> 47<pre id="test">
51<script type="text/javascript" src="Date.test.js"></script> 48<script type="text/javascript" src="Date.test.js"></script>
52</pre> 49</pre>
53</body> 50</body>
54</html> 51</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/Date.test.js b/frontend/gamma/tests/tests/Clipperz/Date.test.js
index 06f7dc8..f184fd6 100644
--- a/frontend/gamma/tests/tests/Clipperz/Date.test.js
+++ b/frontend/gamma/tests/tests/Clipperz/Date.test.js
@@ -1,66 +1,63 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29var tests = { 26var tests = {
30 27
31 '001_test': function () { 28 '001_test': function () {
32 vardate; 29 vardate;
33 var locale; 30 var locale;
34 31
35 // date = new Date(0); 32 // date = new Date(0);
36 // date.setMilliseconds(Date.parse("Fri, 21 Sep 2007 10:04:24 UTC")); 33 // date.setMilliseconds(Date.parse("Fri, 21 Sep 2007 10:04:24 UTC"));
37 34
38 date = new Date(Date.parse("Fri, 21 Sep 2007 10:04:24 UTC")); 35 date = new Date(Date.parse("Fri, 21 Sep 2007 10:04:24 UTC"));
39 36
40 locale = { 37 locale = {
41 'amDesignation':"am", 38 'amDesignation':"am",
42 'pmDesignation':"pm", 39 'pmDesignation':"pm",
43 // 'shortDateFormat':"d/m/y", 40 // 'shortDateFormat':"d/m/y",
44 // 'longDateFormat':"", 41 // 'longDateFormat':"",
45 'months': ["January", "February", "March","April", 42 'months': ["January", "February", "March","April",
46 "May", "June", "July", "August", 43 "May", "June", "July", "August",
47 "September", "October", "November", "December"], 44 "September", "October", "November", "December"],
48 'shortMonths': ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], 45 'shortMonths': ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
49 'days': ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], 46 'days': ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
50 'shortDays': ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ] 47 'shortDays': ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ]
51 } 48 }
52 49
53 is(Clipperz.Date.formatDateWithPHPLikeTemplateAndLocale(date, "d/m/y", locale), '21/09/07', "formatDate - 1"); 50 is(Clipperz.Date.formatDateWithPHPLikeTemplateAndLocale(date, "d/m/y", locale), '21/09/07', "formatDate - 1");
54 is(Clipperz.Date.formatDateWithPHPLikeTemplateAndLocale(date, "D M Y", locale), 'Fri Sep 2007', "formatDate - 2"); 51 is(Clipperz.Date.formatDateWithPHPLikeTemplateAndLocale(date, "D M Y", locale), 'Fri Sep 2007', "formatDate - 2");
55 is(Clipperz.Date.formatDateWithPHPLikeTemplateAndLocale(date, "D, d M Y", locale), 'Fri, 21 Sep 2007', "formatDate - 3"); 52 is(Clipperz.Date.formatDateWithPHPLikeTemplateAndLocale(date, "D, d M Y", locale), 'Fri, 21 Sep 2007', "formatDate - 3");
56 is(Clipperz.Date.formatDateWithPHPLikeTemplateAndLocale(date, "D, d M Y H:i:s", locale), 'Fri, 21 Sep 2007 12:04:24', "formatDate - 4"); 53 is(Clipperz.Date.formatDateWithPHPLikeTemplateAndLocale(date, "D, d M Y H:i:s", locale), 'Fri, 21 Sep 2007 12:04:24', "formatDate - 4");
57 // is(Clipperz.Date.formatDateWithPHPLikeTemplateAndLocale(date, "D, d M Y H:i:s (T)", locale), 'Fri, 21 Sep 2007 11:04:24 (CEST)', "formatDate - 5"); 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");
58 }, 55 },
59 56
60 //------------------------------------------------------------------------- 57 //-------------------------------------------------------------------------
61 'syntaxFix': MochiKit.Base.noop 58 'syntaxFix': MochiKit.Base.noop
62} 59}
63 60
64//============================================================================= 61//=============================================================================
65 62
66SimpleTest.runDeferredTests("Clipperz.Date", tests, {trace:false}); 63SimpleTest.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 5bfb8c7..3c407f7 100644
--- a/frontend/gamma/tests/tests/Clipperz/KeePassExportProcessor.data.js
+++ b/frontend/gamma/tests/tests/Clipperz/KeePassExportProcessor.data.js
@@ -1,408 +1,405 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29var testData = {} 26var testData = {}
30 27
31testData['Barb_Newman_data'] = ""; 28testData['Barb_Newman_data'] = "";
32testData['Barb_Newman_data'] = testData['Barb_Newman_data'] + 29testData['Barb_Newman_data'] = testData['Barb_Newman_data'] +
33 "[Domain Administration Account]" + "\n" + 30 "[Domain Administration Account]" + "\n" +
34 "Group: Windows" + "\n" + 31 "Group: Windows" + "\n" +
35 "User Name: _ABC" + "\n" + 32 "User Name: _ABC" + "\n" +
36 "URL: " + "\n" + 33 "URL: " + "\n" +
37 "Password: 123456" + "\n" + 34 "Password: 123456" + "\n" +
38 "Notes: " + "\n" + 35 "Notes: " + "\n" +
39 "" + "\n" + 36 "" + "\n" +
40 "[Enquiro Domain]" + "\n" + 37 "[Enquiro Domain]" + "\n" +
41 "Group: Windows" + "\n" + 38 "Group: Windows" + "\n" +
42 "User Name: ABC" + "\n" + 39 "User Name: ABC" + "\n" +
43 "URL: " + "\n" + 40 "URL: " + "\n" +
44 "Password: 123456" + "\n" + 41 "Password: 123456" + "\n" +
45 "Notes: This is an Exchange Mailbox checked by IT/Programming" + "\n" + 42 "Notes: This is an Exchange Mailbox checked by IT/Programming" + "\n" +
46 "" + "\n" + 43 "" + "\n" +
47 "[Enquiro Domain Administrator Account]" + "\n" + 44 "[Enquiro Domain Administrator Account]" + "\n" +
48 "Group: Windows" + "\n" + 45 "Group: Windows" + "\n" +
49 "User Name: ENQUIRO\ABC" + "\n" + 46 "User Name: ENQUIRO\ABC" + "\n" +
50 "URL: " + "\n" + 47 "URL: " + "\n" +
51 "Password: 123456" + "\n" + 48 "Password: 123456" + "\n" +
52 "Notes: Obsolete" + "\n" + 49 "Notes: Obsolete" + "\n" +
53 "" + "\n" + 50 "" + "\n" +
54 "[Enquiro Domain Administrator Account]" + "\n" + 51 "[Enquiro Domain Administrator Account]" + "\n" +
55 "Group: Windows" + "\n" + 52 "Group: Windows" + "\n" +
56 "User Name: ENQUIRO\ABC" + "\n" + 53 "User Name: ENQUIRO\ABC" + "\n" +
57 "URL: " + "\n" + 54 "URL: " + "\n" +
58 "Password: 123456" + "\n" + 55 "Password: 123456" + "\n" +
59 "Notes: Changed on 07 Sep 2007 by Randy Kissick" + "\n" + 56 "Notes: Changed on 07 Sep 2007 by Randy Kissick" + "\n" +
60 "" + "\n" + 57 "" + "\n" +
61 "[Enquiro Domain Previous Administrator Account]" + "\n" + 58 "[Enquiro Domain Previous Administrator Account]" + "\n" +
62 "Group: Windows" + "\n" + 59 "Group: Windows" + "\n" +
63 "User Name: ENQUIRO\ABC" + "\n" + 60 "User Name: ENQUIRO\ABC" + "\n" +
64 "URL: " + "\n" + 61 "URL: " + "\n" +
65 "Password: 123456" + "\n" + 62 "Password: 123456" + "\n" +
66 "Notes: ENSQL1" + "\n" + 63 "Notes: ENSQL1" + "\n" +
67 "" + "\n" + 64 "" + "\n" +
68 "[Local Administrator Account for most Machines]" + "\n" + 65 "[Local Administrator Account for most Machines]" + "\n" +
69 "Group: Windows" + "\n" + 66 "Group: Windows" + "\n" +
70 "User Name: ABC" + "\n" + 67 "User Name: ABC" + "\n" +
71 "URL: " + "\n" + 68 "URL: " + "\n" +
72 "Password: 123456" + "\n" + 69 "Password: 123456" + "\n" +
73 "Notes: " + "\n" + 70 "Notes: " + "\n" +
74 "" + "\n" + 71 "" + "\n" +
75 "[Local Administrator Account for some Machines]" + "\n" + 72 "[Local Administrator Account for some Machines]" + "\n" +
76 "Group: Windows" + "\n" + 73 "Group: Windows" + "\n" +
77 "User Name: ABC" + "\n" + 74 "User Name: ABC" + "\n" +
78 "URL: " + "\n" + 75 "URL: " + "\n" +
79 "Password: 123456" + "\n" + 76 "Password: 123456" + "\n" +
80 "Notes: " + "\n" + 77 "Notes: " + "\n" +
81 "" + "\n" + 78 "" + "\n" +
82 "[Bugzilla]" + "\n" + 79 "[Bugzilla]" + "\n" +
83 "Group: Hardware" + "\n" + 80 "Group: Hardware" + "\n" +
84 "User Name: ABC" + "\n" + 81 "User Name: ABC" + "\n" +
85 "URL: " + "\n" + 82 "URL: " + "\n" +
86 "Password: 123456" + "\n" + 83 "Password: 123456" + "\n" +
87 "Notes: BUGZILLA" + "\n" + 84 "Notes: BUGZILLA" + "\n" +
88 "" + "\n" + 85 "" + "\n" +
89 "[Client Services Linux Box]" + "\n" + 86 "[Client Services Linux Box]" + "\n" +
90 "Group: Hardware" + "\n" + 87 "Group: Hardware" + "\n" +
91 "User Name: ABC" + "\n" + 88 "User Name: ABC" + "\n" +
92 "URL: " + "\n" + 89 "URL: " + "\n" +
93 "Password: 123456" + "\n" + 90 "Password: 123456" + "\n" +
94 "Notes: 192.168.1.141" + "\n" + 91 "Notes: 192.168.1.141" + "\n" +
95 "" + "\n" + 92 "" + "\n" +
96 "[ENSQL2 BIOS]" + "\n" + 93 "[ENSQL2 BIOS]" + "\n" +
97 "Group: Hardware" + "\n" + 94 "Group: Hardware" + "\n" +
98 "User Name: " + "\n" + 95 "User Name: " + "\n" +
99 "URL: " + "\n" + 96 "URL: " + "\n" +
100 "Password: 123456" + "\n" + 97 "Password: 123456" + "\n" +
101 "Notes: " + "\n" + 98 "Notes: " + "\n" +
102 "" + "\n" + 99 "" + "\n" +
103 "[Eye Tracking PC]" + "\n" + 100 "[Eye Tracking PC]" + "\n" +
104 "Group: Hardware" + "\n" + 101 "Group: Hardware" + "\n" +
105 "User Name: ABC" + "\n" + 102 "User Name: ABC" + "\n" +
106 "URL: " + "\n" + 103 "URL: " + "\n" +
107 "Password: 123456" + "\n" + 104 "Password: 123456" + "\n" +
108 "Notes: " + "\n" + 105 "Notes: " + "\n" +
109 "" + "\n" + 106 "" + "\n" +
110 "[IT Linux Box (Brainiac)]" + "\n" + 107 "[IT Linux Box (Brainiac)]" + "\n" +
111 "Group: Hardware" + "\n" + 108 "Group: Hardware" + "\n" +
112 "User Name: ABC" + "\n" + 109 "User Name: ABC" + "\n" +
113 "URL: " + "\n" + 110 "URL: " + "\n" +
114 "Password: 123456" + "\n" + 111 "Password: 123456" + "\n" +
115 "Notes: " + "\n" + 112 "Notes: " + "\n" +
116 "" + "\n" + 113 "" + "\n" +
117 "[Maizal - Contract Developer Machine]" + "\n" + 114 "[Maizal - Contract Developer Machine]" + "\n" +
118 "Group: Hardware" + "\n" + 115 "Group: Hardware" + "\n" +
119 "User Name: ABC" + "\n" + 116 "User Name: ABC" + "\n" +
120 "URL: 199.185.139.69:3399" + "\n" + 117 "URL: 199.185.139.69:3399" + "\n" +
121 "Password: 123456" + "\n" + 118 "Password: 123456" + "\n" +
122 "Notes: Software Development Contractors use remote access to access this machine.\r\n\r\nTested August 08.\r\n\r\nBe sure to send the info via two different delivery methods." + "\n" + 119 "Notes: Software Development Contractors use remote access to access this machine.\r\n\r\nTested August 08.\r\n\r\nBe sure to send the info via two different delivery methods." + "\n" +
123 "" + "\n" + 120 "" + "\n" +
124 "[NETGEAR WGR614v3]" + "\n" + 121 "[NETGEAR WGR614v3]" + "\n" +
125 "Group: Hardware" + "\n" + 122 "Group: Hardware" + "\n" +
126 "User Name: ABC" + "\n" + 123 "User Name: ABC" + "\n" +
127 "URL: " + "\n" + 124 "URL: " + "\n" +
128 "Password: 123456" + "\n" + 125 "Password: 123456" + "\n" +
129 "Notes: (192.168.1.11)" + "\n" + 126 "Notes: (192.168.1.11)" + "\n" +
130 "" + "\n" + 127 "" + "\n" +
131 "[SEP Firewall (192.168.1.1)]" + "\n" + 128 "[SEP Firewall (192.168.1.1)]" + "\n" +
132 "Group: Hardware" + "\n" + 129 "Group: Hardware" + "\n" +
133 "User Name: ABC" + "\n" + 130 "User Name: ABC" + "\n" +
134 "URL: " + "\n" + 131 "URL: " + "\n" +
135 "Password: 123456" + "\n" + 132 "Password: 123456" + "\n" +
136 "Notes: Changed to this on 2007/01/31" + "\n" + 133 "Notes: Changed to this on 2007/01/31" + "\n" +
137 "" + "\n" + 134 "" + "\n" +
138 "[SEP Firewall (192.168.1.1)]" + "\n" + 135 "[SEP Firewall (192.168.1.1)]" + "\n" +
139 "Group: Hardware" + "\n" + 136 "Group: Hardware" + "\n" +
140 "User Name: ABC" + "\n" + 137 "User Name: ABC" + "\n" +
141 "URL: " + "\n" + 138 "URL: " + "\n" +
142 "Password: 123456" + "\n" + 139 "Password: 123456" + "\n" +
143 "Notes: 192.168.1.1" + "\n" + 140 "Notes: 192.168.1.1" + "\n" +
144 "" + "\n" + 141 "" + "\n" +
145 "[UPS]" + "\n" + 142 "[UPS]" + "\n" +
146 "Group: Hardware" + "\n" + 143 "Group: Hardware" + "\n" +
147 "User Name: ABC" + "\n" + 144 "User Name: ABC" + "\n" +
148 "URL: " + "\n" + 145 "URL: " + "\n" +
149 "Password: 123456" + "\n" + 146 "Password: 123456" + "\n" +
150 "Notes: " + "\n" + 147 "Notes: " + "\n" +
151 "" + "\n" + 148 "" + "\n" +
152 "[Wireless WPA-PSK]" + "\n" + 149 "[Wireless WPA-PSK]" + "\n" +
153 "Group: Hardware" + "\n" + 150 "Group: Hardware" + "\n" +
154 "User Name: " + "\n" + 151 "User Name: " + "\n" +
155 "URL: " + "\n" + 152 "URL: " + "\n" +
156 "Password: synergize" + "\n" + 153 "Password: synergize" + "\n" +
157 "Notes: " + "\n" + 154 "Notes: " + "\n" +
158 "" + "\n" + 155 "" + "\n" +
159 "[Gord's Laptop Adminstrator 123456" + "\n" + 156 "[Gord's Laptop Adminstrator 123456" + "\n" +
160 "Group: Hardware" + "\n" + 157 "Group: Hardware" + "\n" +
161 "User Name: ABC" + "\n" + 158 "User Name: ABC" + "\n" +
162 "URL: " + "\n" + 159 "URL: " + "\n" +
163 "Password: 123456" + "\n" + 160 "Password: 123456" + "\n" +
164 "Notes: " + "\n" + 161 "Notes: " + "\n" +
165 "" + "\n" + 162 "" + "\n" +
166 "[Wireless Access Point]" + "\n" + 163 "[Wireless Access Point]" + "\n" +
167 "Group: Hardware" + "\n" + 164 "Group: Hardware" + "\n" +
168 "User Name: SSID: ENWRLSS" + "\n" + 165 "User Name: SSID: ENWRLSS" + "\n" +
169 "URL: " + "\n" + 166 "URL: " + "\n" +
170 "Password: 123456" + "\n" + 167 "Password: 123456" + "\n" +
171 "Notes: WPA (TKIP) key is in password 123456" + "\n" + 168 "Notes: WPA (TKIP) key is in password 123456" + "\n" +
172 "" + "\n" + 169 "" + "\n" +
173 "[Adobe Account]" + "\n" + 170 "[Adobe Account]" + "\n" +
174 "Group: Websites" + "\n" + 171 "Group: Websites" + "\n" +
175 "User Name: ABC" + "\n" + 172 "User Name: ABC" + "\n" +
176 "URL: " + "\n" + 173 "URL: " + "\n" +
177 "Password: 123456" + "\n" + 174 "Password: 123456" + "\n" +
178 "Notes: " + "\n" + 175 "Notes: " + "\n" +
179 "" + "\n" + 176 "" + "\n" +
180 "[APC UPS Website]" + "\n" + 177 "[APC UPS Website]" + "\n" +
181 "Group: Websites" + "\n" + 178 "Group: Websites" + "\n" +
182 "User Name: ABC" + "\n" + 179 "User Name: ABC" + "\n" +
183 "URL: " + "\n" + 180 "URL: " + "\n" +
184 "Password: 123456" + "\n" + 181 "Password: 123456" + "\n" +
185 "Notes: Web site for UPS Drivers/Manuals" + "\n" + 182 "Notes: Web site for UPS Drivers/Manuals" + "\n" +
186 "" + "\n" + 183 "" + "\n" +
187 "[ask.enquiro.com admin]" + "\n" + 184 "[ask.enquiro.com admin]" + "\n" +
188 "Group: Websites" + "\n" + 185 "Group: Websites" + "\n" +
189 "User Name: ABC" + "\n" + 186 "User Name: ABC" + "\n" +
190 "URL: ask.enquiro.com" + "\n" + 187 "URL: ask.enquiro.com" + "\n" +
191 "Password: 123456" + "\n" + 188 "Password: 123456" + "\n" +
192 "Notes: Jody is the admin\r\nChris is the editor" + "\n" + 189 "Notes: Jody is the admin\r\nChris is the editor" + "\n" +
193 "" + "\n" + 190 "" + "\n" +
194 "[ask.enquiro.com ftp]" + "\n" + 191 "[ask.enquiro.com ftp]" + "\n" +
195 "Group: Websites" + "\n" + 192 "Group: Websites" + "\n" +
196 "User Name: ABC" + "\n" + 193 "User Name: ABC" + "\n" +
197 "URL: ask.enquiro.com" + "\n" + 194 "URL: ask.enquiro.com" + "\n" +
198 "Password: 123456" + "\n" + 195 "Password: 123456" + "\n" +
199 "Notes: ftp.ask.enquiro.com\r\nchanged 02 Jun 08" + "\n" + 196 "Notes: ftp.ask.enquiro.com\r\nchanged 02 Jun 08" + "\n" +
200 "" + "\n" + 197 "" + "\n" +
201 "[BulkRegister]" + "\n" + 198 "[BulkRegister]" + "\n" +
202 "Group: Websites" + "\n" + 199 "Group: Websites" + "\n" +
203 "User Name: ABC " + "\n" + 200 "User Name: ABC " + "\n" +
204 "URL: https://www.bulkregister.com/Login.asp?" + "\n" + 201 "URL: https://www.bulkregister.com/Login.asp?" + "\n" +
205 "Password: 123456" + "\n" + 202 "Password: 123456" + "\n" +
206 "Notes: Used for domain registrations" + "\n" + 203 "Notes: Used for domain registrations" + "\n" +
207 "" + "\n" + 204 "" + "\n" +
208 "[controlpanel.provisiondata.com]" + "\n" + 205 "[controlpanel.provisiondata.com]" + "\n" +
209 "Group: Websites" + "\n" + 206 "Group: Websites" + "\n" +
210 "User Name: ABC" + "\n" + 207 "User Name: ABC" + "\n" +
211 "URL: " + "\n" + 208 "URL: " + "\n" +
212 "Password: 123456" + "\n" + 209 "Password: 123456" + "\n" +
213 "Notes: SEIReports.com Email address management" + "\n" + 210 "Notes: SEIReports.com Email address management" + "\n" +
214 "" + "\n" + 211 "" + "\n" +
215 "[controlpanel.provisiondata.com]" + "\n" + 212 "[controlpanel.provisiondata.com]" + "\n" +
216 "Group: Websites" + "\n" + 213 "Group: Websites" + "\n" +
217 "User Name: " + "\n" + 214 "User Name: " + "\n" +
218 "URL: " + "\n" + 215 "URL: " + "\n" +
219 "Password: " + "\n" + 216 "Password: " + "\n" +
220 "Notes: Searchengineposition.com Email address management" + "\n" + 217 "Notes: Searchengineposition.com Email address management" + "\n" +
221 "" + "\n" + 218 "" + "\n" +
222 "[Dell Canada]" + "\n" + 219 "[Dell Canada]" + "\n" +
223 "Group: Websites" + "\n" + 220 "Group: Websites" + "\n" +
224 "User Name: ABC" + "\n" + 221 "User Name: ABC" + "\n" +
225 "URL: " + "\n" + 222 "URL: " + "\n" +
226 "Password: 123456" + "\n" + 223 "Password: 123456" + "\n" +
227 "Notes: Used to order equirpment from Dell\r\nCredit Card information is Tracy Kalancha AmEx" + "\n" + 224 "Notes: Used to order equirpment from Dell\r\nCredit Card information is Tracy Kalancha AmEx" + "\n" +
228 "" + "\n" + 225 "" + "\n" +
229 "[Feedback Server]" + "\n" + 226 "[Feedback Server]" + "\n" +
230 "Group: Websites" + "\n" + 227 "Group: Websites" + "\n" +
231 "User Name: ABC" + "\n" + 228 "User Name: ABC" + "\n" +
232 "URL: http://www.nsurvey.org/members/login.aspx" + "\n" + 229 "URL: http://www.nsurvey.org/members/login.aspx" + "\n" +
233 "Password: 123456" + "\n" + 230 "Password: 123456" + "\n" +
234 "Notes: " + "\n" + 231 "Notes: " + "\n" +
235 "" + "\n" + 232 "" + "\n" +
236 "[ftp.enquiro.com]" + "\n" + 233 "[ftp.enquiro.com]" + "\n" +
237 "Group: Websites" + "\n" + 234 "Group: Websites" + "\n" +
238 "User Name: ABC" + "\n" + 235 "User Name: ABC" + "\n" +
239 "URL: " + "\n" + 236 "URL: " + "\n" +
240 "Password: 123456" + "\n" + 237 "Password: 123456" + "\n" +
241 "Notes: TYRANUS (199.60.252.157)\r\nchanged 25 Jun 08" + "\n" + 238 "Notes: TYRANUS (199.60.252.157)\r\nchanged 25 Jun 08" + "\n" +
242 "" + "\n" + 239 "" + "\n" +
243 "[ftp.enquirolabs.com]" + "\n" + 240 "[ftp.enquirolabs.com]" + "\n" +
244 "Group: Websites" + "\n" + 241 "Group: Websites" + "\n" +
245 "User Name: ABC" + "\n" + 242 "User Name: ABC" + "\n" +
246 "URL: enquirolabs.com" + "\n" + 243 "URL: enquirolabs.com" + "\n" +
247 "Password: 123456" + "\n" + 244 "Password: 123456" + "\n" +
248 "Notes: Changed 04 Jun 08" + "\n" + 245 "Notes: Changed 04 Jun 08" + "\n" +
249 "" + "\n" + 246 "" + "\n" +
250 "[ftp://ftp.b2bexpertseries.com]" + "\n" + 247 "[ftp://ftp.b2bexpertseries.com]" + "\n" +
251 "Group: Websites" + "\n" + 248 "Group: Websites" + "\n" +
252 "User Name: ABC" + "\n" + 249 "User Name: ABC" + "\n" +
253 "URL: b2bexpertseries.com" + "\n" + 250 "URL: b2bexpertseries.com" + "\n" +
254 "Password: 123456" + "\n" + 251 "Password: 123456" + "\n" +
255 "Notes: Changed 02 Jun 08" + "\n" + 252 "Notes: Changed 02 Jun 08" + "\n" +
256 "" + "\n" + 253 "" + "\n" +
257 "[HSBC Bank Account]" + "\n" + 254 "[HSBC Bank Account]" + "\n" +
258 "Group: Websites" + "\n" + 255 "Group: Websites" + "\n" +
259 "User Name: ABC" + "\n" + 256 "User Name: ABC" + "\n" +
260 "URL: hsbc.ca" + "\n" + 257 "URL: hsbc.ca" + "\n" +
261 "Password: " + "\n" + 258 "Password: " + "\n" +
262 "Notes: What is my Mother's Name: BARBARA\r\nSecurity Code is generated by the Security Device - you have 10 seconds to enter it." + "\n" + 259 "Notes: What is my Mother's Name: BARBARA\r\nSecurity Code is generated by the Security Device - you have 10 seconds to enter it." + "\n" +
263 "" + "\n" + 260 "" + "\n" +
264 "[HSBC Fx Trading]" + "\n" + 261 "[HSBC Fx Trading]" + "\n" +
265 "Group: Websites" + "\n" + 262 "Group: Websites" + "\n" +
266 "User Name: ABC" + "\n" + 263 "User Name: ABC" + "\n" +
267 "URL: https://fxtrading.hsbc.ca/fx-canada/login.html" + "\n" + 264 "URL: https://fxtrading.hsbc.ca/fx-canada/login.html" + "\n" +
268 "Password: 123456" + "\n" + 265 "Password: 123456" + "\n" +
269 "Notes: Doug to advise when he changes the password. Software requests change on a regular basis." + "\n" + 266 "Notes: Doug to advise when he changes the password. Software requests change on a regular basis." + "\n" +
270 "" + "\n" + 267 "" + "\n" +
271 "[Industry Canada - Canadian Company Capabilities (CCC)]" + "\n" + 268 "[Industry Canada - Canadian Company Capabilities (CCC)]" + "\n" +
272 "Group: Websites" + "\n" + 269 "Group: Websites" + "\n" +
273 "User Name: ABC" + "\n" + 270 "User Name: ABC" + "\n" +
274 "URL: http://www.ic.gc.ca" + "\n" + 271 "URL: http://www.ic.gc.ca" + "\n" +
275 "Password: 123456" + "\n" + 272 "Password: 123456" + "\n" +
276 "Notes: Our listing: http://www.ic.gc.ca/app/ccc/srch/nvgt.do;jsessionid=0000RKFbMEOs2xvyRNoCF4pH3Ym:1247nks53?lang=eng&prtl=1&profile=cmpltPrfl&V_TOKEN=1203707557897&V_SEARCH.command=navigate&V_SEARCH.docsStart=1&V_SEARCH.resultsJSP=/prfl.do&V_DOCUMENT.docRank=1&V_SEARCH.docsCount=3&estblmntNo=234567061957&profileId=\r\n\r\nAndrew is responsible to update" + "\n" + 273 "Notes: Our listing: http://www.ic.gc.ca/app/ccc/srch/nvgt.do;jsessionid=0000RKFbMEOs2xvyRNoCF4pH3Ym:1247nks53?lang=eng&prtl=1&profile=cmpltPrfl&V_TOKEN=1203707557897&V_SEARCH.command=navigate&V_SEARCH.docsStart=1&V_SEARCH.resultsJSP=/prfl.do&V_DOCUMENT.docRank=1&V_SEARCH.docsCount=3&estblmntNo=234567061957&profileId=\r\n\r\nAndrew is responsible to update" + "\n" +
277 "" + "\n" + 274 "" + "\n" +
278 "[Internet Secure CAD 1086]" + "\n" + 275 "[Internet Secure CAD 1086]" + "\n" +
279 "Group: Websites" + "\n" + 276 "Group: Websites" + "\n" +
280 "User Name: ABC" + "\n" + 277 "User Name: ABC" + "\n" +
281 "URL: https://www.internetsecure.com/merchants/" + "\n" + 278 "URL: https://www.internetsecure.com/merchants/" + "\n" +
282 "Password: 123456" + "\n" + 279 "Password: 123456" + "\n" +
283 "Notes: Doug to advise when he changes the password. Software requests change on a regular basis." + "\n" + 280 "Notes: Doug to advise when he changes the password. Software requests change on a regular basis." + "\n" +
284 "" + "\n" + 281 "" + "\n" +
285 "[Internet Secure USD 1087]" + "\n" + 282 "[Internet Secure USD 1087]" + "\n" +
286 "Group: Websites" + "\n" + 283 "Group: Websites" + "\n" +
287 "User Name: ABC" + "\n" + 284 "User Name: ABC" + "\n" +
288 "URL: https://www.internetsecure.com/merchants/" + "\n" + 285 "URL: https://www.internetsecure.com/merchants/" + "\n" +
289 "Password: 123456" + "\n" + 286 "Password: 123456" + "\n" +
290 "Notes: Doug to advise when he changes the password. Software requests change on a regular basis." + "\n" + 287 "Notes: Doug to advise when he changes the password. Software requests change on a regular basis." + "\n" +
291 "" + "\n" + 288 "" + "\n" +
292 "[louisville.net-radar.com]" + "\n" + 289 "[louisville.net-radar.com]" + "\n" +
293 "Group: Websites" + "\n" + 290 "Group: Websites" + "\n" +
294 "User Name: ABC" + "\n" + 291 "User Name: ABC" + "\n" +
295 "URL: " + "\n" + 292 "URL: " + "\n" +
296 "Password: 123456" + "\n" + 293 "Password: 123456" + "\n" +
297 "Notes: FTP/FrontPage" + "\n" + 294 "Notes: FTP/FrontPage" + "\n" +
298 "" + "\n" + 295 "" + "\n" +
299 "[Microsoft Licensing Program eOpen]" + "\n" + 296 "[Microsoft Licensing Program eOpen]" + "\n" +
300 "Group: Websites" + "\n" + 297 "Group: Websites" + "\n" +
301 "User Name: ABC" + "\n" + 298 "User Name: ABC" + "\n" +
302 "URL: https://eOpen.microsoft.com" + "\n" + 299 "URL: https://eOpen.microsoft.com" + "\n" +
303 "Password: 123456" + "\n" + 300 "Password: 123456" + "\n" +
304 "Notes: Used to record all Microsoft licensing information" + "\n" + 301 "Notes: Used to record all Microsoft licensing information" + "\n" +
305 "" + "\n" + 302 "" + "\n" +
306 "[OSTEC Job Site]" + "\n" + 303 "[OSTEC Job Site]" + "\n" +
307 "Group: Websites" + "\n" + 304 "Group: Websites" + "\n" +
308 "User Name: ABC" + "\n" + 305 "User Name: ABC" + "\n" +
309 "URL: " + "\n" + 306 "URL: " + "\n" +
310 "Password: 123456" + "\n" + 307 "Password: 123456" + "\n" +
311 "Notes: " + "\n" + 308 "Notes: " + "\n" +
312 "" + "\n" + 309 "" + "\n" +
313 "[OutOfMyGord.com Blog Login]" + "\n" + 310 "[OutOfMyGord.com Blog Login]" + "\n" +
314 "Group: Websites" + "\n" + 311 "Group: Websites" + "\n" +
315 "User Name: ABC" + "\n" + 312 "User Name: ABC" + "\n" +
316 "URL: " + "\n" + 313 "URL: " + "\n" +
317 "Password: 123456" + "\n" + 314 "Password: 123456" + "\n" +
318 "Notes: VADER" + "\n" + 315 "Notes: VADER" + "\n" +
319 "" + "\n" + 316 "" + "\n" +
320 "[OutOfMyGord.com Web Site]" + "\n" + 317 "[OutOfMyGord.com Web Site]" + "\n" +
321 "Group: Websites" + "\n" + 318 "Group: Websites" + "\n" +
322 "User Name: ABC" + "\n" + 319 "User Name: ABC" + "\n" +
323 "URL: " + "\n" + 320 "URL: " + "\n" +
324 "Password: 123456" + "\n" + 321 "Password: 123456" + "\n" +
325 "Notes: VADER" + "\n" + 322 "Notes: VADER" + "\n" +
326 "" + "\n" + 323 "" + "\n" +
327 "[Paypal@enquiro.com]" + "\n" + 324 "[Paypal@enquiro.com]" + "\n" +
328 "Group: Websites" + "\n" + 325 "Group: Websites" + "\n" +
329 "User Name: ABC" + "\n" + 326 "User Name: ABC" + "\n" +
330 "URL: " + "\n" + 327 "URL: " + "\n" +
331 "Password: 123456" + "\n" + 328 "Password: 123456" + "\n" +
332 "Notes: " + "\n" + 329 "Notes: " + "\n" +
333 "" + "\n" + 330 "" + "\n" +
334 "[PRWeb]" + "\n" + 331 "[PRWeb]" + "\n" +
335 "Group: Websites" + "\n" + 332 "Group: Websites" + "\n" +
336 "User Name: shermantracy" + "\n" + 333 "User Name: shermantracy" + "\n" +
337 "URL: " + "\n" + 334 "URL: " + "\n" +
338 "Password: 123456" + "\n" + 335 "Password: 123456" + "\n" +
339 "Notes: " + "\n" + 336 "Notes: " + "\n" +
340 "" + "\n" + 337 "" + "\n" +
341 "[ScanMail Logon]" + "\n" + 338 "[ScanMail Logon]" + "\n" +
342 "Group: Websites" + "\n" + 339 "Group: Websites" + "\n" +
343 "User Name: ABC" + "\n" + 340 "User Name: ABC" + "\n" +
344 "URL: " + "\n" + 341 "URL: " + "\n" +
345 "Password: 123456" + "\n" + 342 "Password: 123456" + "\n" +
346 "Notes: Scanmail Logon (Anti-Spam)" + "\n" + 343 "Notes: Scanmail Logon (Anti-Spam)" + "\n" +
347 "" + "\n" + 344 "" + "\n" +
348 "[secure.searchengineposition.com]" + "\n" + 345 "[secure.searchengineposition.com]" + "\n" +
349 "Group: Websites" + "\n" + 346 "Group: Websites" + "\n" +
350 "User Name: " + "\n" + 347 "User Name: " + "\n" +
351 "URL: " + "\n" + 348 "URL: " + "\n" +
352 "Password: 123456" + "\n" + 349 "Password: 123456" + "\n" +
353 "Notes: TYRANUS (199.60.252.237)" + "\n" + 350 "Notes: TYRANUS (199.60.252.237)" + "\n" +
354 "" + "\n" + 351 "" + "\n" +
355 "[seireports.com]" + "\n" + 352 "[seireports.com]" + "\n" +
356 "Group: Websites" + "\n" + 353 "Group: Websites" + "\n" +
357 "User Name: ABC" + "\n" + 354 "User Name: ABC" + "\n" +
358 "URL: http://www.seireports.com/" + "\n" + 355 "URL: http://www.seireports.com/" + "\n" +
359 "Password: 123456" + "\n" + 356 "Password: 123456" + "\n" +
360 "Notes: " + "\n" + 357 "Notes: " + "\n" +
361 "" + "\n" + 358 "" + "\n" +
362 "[sepreports.com]" + "\n" + 359 "[sepreports.com]" + "\n" +
363 "Group: Websites" + "\n" + 360 "Group: Websites" + "\n" +
364 "User Name: ABC" + "\n" + 361 "User Name: ABC" + "\n" +
365 "URL: http://www.sepreports.com" + "\n" + 362 "URL: http://www.sepreports.com" + "\n" +
366 "Password: 123456" + "\n" + 363 "Password: 123456" + "\n" +
367 "Notes: Used for monthly client reporting" + "\n" + 364 "Notes: Used for monthly client reporting" + "\n" +
368 "" + "\n" + 365 "" + "\n" +
369 "[septraffic.com]" + "\n" + 366 "[septraffic.com]" + "\n" +
370 "Group: Websites" + "\n" + 367 "Group: Websites" + "\n" +
371 "User Name: ABC" + "\n" + 368 "User Name: ABC" + "\n" +
372 "URL: " + "\n" + 369 "URL: " + "\n" +
373 "Password: 123456" + "\n" + 370 "Password: 123456" + "\n" +
374 "Notes: " + "\n" + 371 "Notes: " + "\n" +
375 "" + "\n" + 372 "" + "\n" +
376 "[Spiceworks]" + "\n" + 373 "[Spiceworks]" + "\n" +
377 "Group: Websites" + "\n" + 374 "Group: Websites" + "\n" +
378 "User Name: ABC" + "\n" + 375 "User Name: ABC" + "\n" +
379 "URL: http://endc3:9675/dashboard" + "\n" + 376 "URL: http://endc3:9675/dashboard" + "\n" +
380 "Password: 123456" + "\n" + 377 "Password: 123456" + "\n" +
381 "Notes: Is installed on endc3. \r\nIt's used to inventory the hardware attached to the network. \r\nIt's scheduled to run daily at 10:00am. \r\nMachine's must be on to be detected.\r\n\r\nNote: first character of password is a zero\r\n\r\n\r\nhttp://www.spiceworks.com" + "\n" + 378 "Notes: Is installed on endc3. \r\nIt's used to inventory the hardware attached to the network. \r\nIt's scheduled to run daily at 10:00am. \r\nMachine's must be on to be detected.\r\n\r\nNote: first character of password is a zero\r\n\r\n\r\nhttp://www.spiceworks.com" + "\n" +
382 "" + "\n" + 379 "" + "\n" +
383 "[SurveyMonkey Enquiro]" + "\n" + 380 "[SurveyMonkey Enquiro]" + "\n" +
384 "Group: Websites" + "\n" + 381 "Group: Websites" + "\n" +
385 "User Name: ABC" + "\n" + 382 "User Name: ABC" + "\n" +
386 "URL: http://www.surveymonkey.com" + "\n" + 383 "URL: http://www.surveymonkey.com" + "\n" +
387 "Password: 123456" + "\n" + 384 "Password: 123456" + "\n" +
388 "Notes: Used for small Enquiro surveys that aren't research related" + "\n" + 385 "Notes: Used for small Enquiro surveys that aren't research related" + "\n" +
389 "" + "\n" + 386 "" + "\n" +
390 "[SwishZone]" + "\n" + 387 "[SwishZone]" + "\n" +
391 "Group: Websites" + "\n" + 388 "Group: Websites" + "\n" +
392 "User Name: ABC" + "\n" + 389 "User Name: ABC" + "\n" +
393 "URL: " + "\n" + 390 "URL: " + "\n" +
394 "Password: 123456" + "\n" + 391 "Password: 123456" + "\n" +
395 "Notes: " + "\n" + 392 "Notes: " + "\n" +
396 "" + "\n" + 393 "" + "\n" +
397 "[Tobii.com]" + "\n" + 394 "[Tobii.com]" + "\n" +
398 "Group: Websites" + "\n" + 395 "Group: Websites" + "\n" +
399 "User Name: " + "\n" + 396 "User Name: " + "\n" +
400 "URL: " + "\n" + 397 "URL: " + "\n" +
401 "Password: " + "\n" + 398 "Password: " + "\n" +
402 "Notes: Tobii Website Logon" + "\n" + 399 "Notes: Tobii Website Logon" + "\n" +
403 "" + "\n" + 400 "" + "\n" +
404 "[Trend Micro]" + "\n" + 401 "[Trend Micro]" + "\n" +
405 "Group: Websites" + "\n" + 402 "Group: Websites" + "\n" +
406 "User Name: ABC" + "\n" + 403 "User Name: ABC" + "\n" +
407 "URL: https://olr.trendmicro.com/registration/" + "\n" + 404 "URL: https://olr.trendmicro.com/registration/" + "\n" +
408 "Password: 123456" + "\n" + 405 "Password: 123456" + "\n" +
diff --git a/frontend/gamma/tests/tests/Clipperz/KeePassExportProcessor.html b/frontend/gamma/tests/tests/Clipperz/KeePassExportProcessor.html
index a8a1317..969b517 100644
--- a/frontend/gamma/tests/tests/Clipperz/KeePassExportProcessor.html
+++ b/frontend/gamma/tests/tests/Clipperz/KeePassExportProcessor.html
@@ -1,59 +1,56 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27--> 24-->
28 25
29<html> 26<html>
30<head> 27<head>
31 <title>Clipperz.KeePassExportProcessor - test</title> 28 <title>Clipperz.KeePassExportProcessor - test</title>
32 29
33 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script> 30 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script>
34 <script type="text/javascript" src="../../SimpleTest/SimpleTest.js"></script> 31 <script type="text/javascript" src="../../SimpleTest/SimpleTest.js"></script>
35 <link rel="stylesheet" type="text/css" href="../../SimpleTest/test.css"> 32 <link rel="stylesheet" type="text/css" href="../../SimpleTest/test.css">
36 33
37 <script type='text/javascript' src='../../../js/JSON/json2.js'></script> 34 <script type='text/javascript' src='../../../js/JSON/json2.js'></script>
38 35
39 <script type='text/javascript' src='../../../js/Clipperz/YUI/Utils.js'></script> 36 <script type='text/javascript' src='../../../js/Clipperz/YUI/Utils.js'></script>
40 <script type='text/javascript' src='../../../js/Clipperz/Base.js'></script> 37 <script type='text/javascript' src='../../../js/Clipperz/Base.js'></script>
41 <script type='text/javascript' src='../../../js/Clipperz/ByteArray.js'></script> 38 <script type='text/javascript' src='../../../js/Clipperz/ByteArray.js'></script>
42 <script type='text/javascript' src='../../../js/Clipperz/Logging.js'></script> 39 <script type='text/javascript' src='../../../js/Clipperz/Logging.js'></script>
43 <script type='text/javascript' src='../../../js/Clipperz/Async.js'></script> 40 <script type='text/javascript' src='../../../js/Clipperz/Async.js'></script>
44 <script type='text/javascript' src='../../../js/Clipperz/KeePassExportProcessor.js'></script> 41 <script type='text/javascript' src='../../../js/Clipperz/KeePassExportProcessor.js'></script>
45 42
46 <script type="text/javascript" src="../../SimpleTest/SimpleTest.Async.js"></script> 43 <script type="text/javascript" src="../../SimpleTest/SimpleTest.Async.js"></script>
47 44
48 <!-- script type="text/javascript" src="./KeePassExportProcessor.data.js"></script> 45 <!-- script type="text/javascript" src="./KeePassExportProcessor.data.js"></script>
49 <script type="text/javascript" src="./KeePassExportProcessor.test.js"></script --> 46 <script type="text/javascript" src="./KeePassExportProcessor.test.js"></script -->
50 47
51</head> 48</head>
52<body> 49<body>
53 50
54<pre id="test"> 51<pre id="test">
55<script type="text/javascript" src="./KeePassExportProcessor.data.js"></script> 52<script type="text/javascript" src="./KeePassExportProcessor.data.js"></script>
56<script type="text/javascript" src="./KeePassExportProcessor.test.js"></script> 53<script type="text/javascript" src="./KeePassExportProcessor.test.js"></script>
57</pre> 54</pre>
58</body> 55</body>
59</html> 56</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/KeePassExportProcessor.test.js b/frontend/gamma/tests/tests/Clipperz/KeePassExportProcessor.test.js
index 0ce4c91..4d1aa12 100644
--- a/frontend/gamma/tests/tests/Clipperz/KeePassExportProcessor.test.js
+++ b/frontend/gamma/tests/tests/Clipperz/KeePassExportProcessor.test.js
@@ -1,141 +1,138 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29var tests = { 26var tests = {
30 27
31 //------------------------------------------------------------------------- 28 //-------------------------------------------------------------------------
32 29
33 'test1_test': function (someTestArgs) { 30 'test1_test': function (someTestArgs) {
34 var deferredResult; 31 var deferredResult;
35 varkeePassProcessor; 32 varkeePassProcessor;
36 33
37 keePassProcessor = new Clipperz.KeePassExportProcessor(); 34 keePassProcessor = new Clipperz.KeePassExportProcessor();
38 35
39 deferredResult = new Clipperz.Async.Deferred("test1_test", someTestArgs); 36 deferredResult = new Clipperz.Async.Deferred("test1_test", someTestArgs);
40 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" }); 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" });
41 deferredResult.addMethod(keePassProcessor, 'deferredParse'); 38 deferredResult.addMethod(keePassProcessor, 'deferredParse');
42 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"); }); 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"); });
43 deferredResult.addErrback(function(anError) { is("ERROR", anError) }); 40 deferredResult.addErrback(function(anError) { is("ERROR", anError) });
44 41
45 deferredResult.callback(); 42 deferredResult.callback();
46 43
47 return deferredResult; 44 return deferredResult;
48 }, 45 },
49 46
50 'test2_test': function (someTestArgs) { 47 'test2_test': function (someTestArgs) {
51 var deferredResult; 48 var deferredResult;
52 varkeePassProcessor; 49 varkeePassProcessor;
53 50
54 keePassProcessor = new Clipperz.KeePassExportProcessor(); 51 keePassProcessor = new Clipperz.KeePassExportProcessor();
55 52
56 deferredResult = new Clipperz.Async.Deferred("test2_test", someTestArgs); 53 deferredResult = new Clipperz.Async.Deferred("test2_test", someTestArgs);
57 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" }); 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" });
58 deferredResult.addMethod(keePassProcessor, 'deferredParse'); 55 deferredResult.addMethod(keePassProcessor, 'deferredParse');
59 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"); }); 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"); });
60 deferredResult.addErrback(function(anError) { is("ERROR", anError) }); 57 deferredResult.addErrback(function(anError) { is("ERROR", anError) });
61 58
62 deferredResult.callback(); 59 deferredResult.callback();
63 60
64 return deferredResult; 61 return deferredResult;
65 }, 62 },
66 63
67 'test3_test': function (someTestArgs) { 64 'test3_test': function (someTestArgs) {
68 var deferredResult; 65 var deferredResult;
69 varkeePassProcessor; 66 varkeePassProcessor;
70 67
71 keePassProcessor = new Clipperz.KeePassExportProcessor(); 68 keePassProcessor = new Clipperz.KeePassExportProcessor();
72 69
73 deferredResult = new Clipperz.Async.Deferred("test3_test", someTestArgs); 70 deferredResult = new Clipperz.Async.Deferred("test3_test", someTestArgs);
74 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" }); 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" });
75 deferredResult.addMethod(keePassProcessor, 'deferredParse'); 72 deferredResult.addMethod(keePassProcessor, 'deferredParse');
76 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"); }); 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"); });
77 deferredResult.addErrback(function(anError) { is("ERROR", anError) }); 74 deferredResult.addErrback(function(anError) { is("ERROR", anError) });
78 75
79 deferredResult.callback(); 76 deferredResult.callback();
80 77
81 return deferredResult; 78 return deferredResult;
82 }, 79 },
83 80
84 //------------------------------------------------------------------------- 81 //-------------------------------------------------------------------------
85 82
86 'Barb_Newman_test': function (someTestArgs) { 83 'Barb_Newman_test': function (someTestArgs) {
87 var deferredResult; 84 var deferredResult;
88 varkeePassProcessor; 85 varkeePassProcessor;
89 86
90 keePassProcessor = new Clipperz.KeePassExportProcessor(); 87 keePassProcessor = new Clipperz.KeePassExportProcessor();
91 88
92 deferredResult = new Clipperz.Async.Deferred("Barb_Newman_test", someTestArgs); 89 deferredResult = new Clipperz.Async.Deferred("Barb_Newman_test", someTestArgs);
93 // deferredResult.addCallback(function () { return testData['Barb_Newman_data']; }); 90 // deferredResult.addCallback(function () { return testData['Barb_Newman_data']; });
94 deferredResult.addMethod(keePassProcessor, 'deferredParse'); 91 deferredResult.addMethod(keePassProcessor, 'deferredParse');
95 deferredResult.addBoth(function(aResult) { 92 deferredResult.addBoth(function(aResult) {
96 SimpleTest.is(aResult.length, 121, "Barb's data contains 121 records"); 93 SimpleTest.is(aResult.length, 121, "Barb's data contains 121 records");
97 return aResult; 94 return aResult;
98 }); 95 });
99 deferredResult.addBoth(function(aResult) { 96 deferredResult.addBoth(function(aResult) {
100 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"); 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");
101 return aResult; 98 return aResult;
102 }); 99 });
103 // deferredResult.callback(); 100 // deferredResult.callback();
104 deferredResult.callback(testData['Barb_Newman_data']); 101 deferredResult.callback(testData['Barb_Newman_data']);
105 102
106 return deferredResult; 103 return deferredResult;
107 }, 104 },
108 105
109 //------------------------------------------------------------------------- 106 //-------------------------------------------------------------------------
110/* 107/*
111 'Jordan_Curzon_test': function (someTestArgs) { 108 'Jordan_Curzon_test': function (someTestArgs) {
112 var deferredResult; 109 var deferredResult;
113 varkeePassProcessor; 110 varkeePassProcessor;
114 111
115 keePassProcessor = new Clipperz.KeePassExportProcessor(); 112 keePassProcessor = new Clipperz.KeePassExportProcessor();
116 113
117 deferredResult = new Clipperz.Async.Deferred("Jordan_Curzon_test", someTestArgs); 114 deferredResult = new Clipperz.Async.Deferred("Jordan_Curzon_test", someTestArgs);
118 deferredResult.addCallback(function () { return testData['Jordan_Curzon_data']; }); 115 deferredResult.addCallback(function () { return testData['Jordan_Curzon_data']; });
119 deferredResult.addMethod(keePassProcessor, 'deferredParse'); 116 deferredResult.addMethod(keePassProcessor, 'deferredParse');
120 deferredResult.addBoth(function(aResult) { 117 deferredResult.addBoth(function(aResult) {
121 SimpleTest.is(aResult.length, 2, "Jordarn's data contains 2 records"); 118 SimpleTest.is(aResult.length, 2, "Jordarn's data contains 2 records");
122 return aResult; 119 return aResult;
123 }); 120 });
124 deferredResult.addBoth(function(aResult) { 121 deferredResult.addBoth(function(aResult) {
125 SimpleTest.is(MochiKit.Base.serializeJSON(aResult[0]), "{\"Title\":\"Allstate\", \"Username\":\"jones\", \"Url\":\"allstate.com\", \"Password\":\"bobfred\", \"Comment\":\"\"}", "Barb's first record data matches"); 122 SimpleTest.is(MochiKit.Base.serializeJSON(aResult[0]), "{\"Title\":\"Allstate\", \"Username\":\"jones\", \"Url\":\"allstate.com\", \"Password\":\"bobfred\", \"Comment\":\"\"}", "Barb's first record data matches");
126 return aResult; 123 return aResult;
127 }); 124 });
128 deferredResult.callback(); 125 deferredResult.callback();
129 126
130 return deferredResult; 127 return deferredResult;
131 }, 128 },
132 */ 129 */
133 //------------------------------------------------------------------------- 130 //-------------------------------------------------------------------------
134 'syntaxFix': MochiKit.Base.noop 131 'syntaxFix': MochiKit.Base.noop
135}; 132};
136 133
137 134
138 135
139//############################################################################# 136//#############################################################################
140 137
141SimpleTest.runDeferredTests("Clipperz.KeyPassExportProcessor", tests, {trace:false}); 138SimpleTest.runDeferredTests("Clipperz.KeyPassExportProcessor", tests, {trace:false});
diff --git a/frontend/gamma/tests/tests/Clipperz/KeyValueObjectStore.html b/frontend/gamma/tests/tests/Clipperz/KeyValueObjectStore.html
index f856f98..ece8a9c 100644
--- a/frontend/gamma/tests/tests/Clipperz/KeyValueObjectStore.html
+++ b/frontend/gamma/tests/tests/Clipperz/KeyValueObjectStore.html
@@ -1,52 +1,49 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27--> 24-->
28 25
29<html> 26<html>
30<head> 27<head>
31 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script> 28 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script>
32 <script type="text/javascript" src="../../SimpleTest/SimpleTest.js"></script> 29 <script type="text/javascript" src="../../SimpleTest/SimpleTest.js"></script>
33 <link rel="stylesheet" type="text/css" href="../../SimpleTest/test.css"> 30 <link rel="stylesheet" type="text/css" href="../../SimpleTest/test.css">
34 31
35 <script type='text/javascript' src='../../../js/JSON/json2.js'></script> 32 <script type='text/javascript' src='../../../js/JSON/json2.js'></script>
36 33
37 <script type='text/javascript' src='../../../js/Clipperz/YUI/Utils.js'></script> 34 <script type='text/javascript' src='../../../js/Clipperz/YUI/Utils.js'></script>
38 <script type='text/javascript' src='../../../js/Clipperz/Base.js'></script> 35 <script type='text/javascript' src='../../../js/Clipperz/Base.js'></script>
39 <script type='text/javascript' src='../../../js/Clipperz/ByteArray.js'></script> 36 <script type='text/javascript' src='../../../js/Clipperz/ByteArray.js'></script>
40 <script type='text/javascript' src='../../../js/Clipperz/Logging.js'></script> 37 <script type='text/javascript' src='../../../js/Clipperz/Logging.js'></script>
41 <script type='text/javascript' src='../../../js/Clipperz/Async.js'></script> 38 <script type='text/javascript' src='../../../js/Clipperz/Async.js'></script>
42 39
43 <script type='text/javascript' src='../../../js/Clipperz/KeyValueObjectStore.js'></script> 40 <script type='text/javascript' src='../../../js/Clipperz/KeyValueObjectStore.js'></script>
44 <script type="text/javascript" src="../../SimpleTest/SimpleTest.Async.js"></script> 41 <script type="text/javascript" src="../../SimpleTest/SimpleTest.Async.js"></script>
45</head> 42</head>
46<body> 43<body>
47 44
48<pre id="test"> 45<pre id="test">
49<script type="text/javascript" src="KeyValueObjectStore.test.js"></script> 46<script type="text/javascript" src="KeyValueObjectStore.test.js"></script>
50</pre> 47</pre>
51</body> 48</body>
52</html> 49</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/KeyValueObjectStore.test.js b/frontend/gamma/tests/tests/Clipperz/KeyValueObjectStore.test.js
index 53cf5d3..ac56386 100644
--- a/frontend/gamma/tests/tests/Clipperz/KeyValueObjectStore.test.js
+++ b/frontend/gamma/tests/tests/Clipperz/KeyValueObjectStore.test.js
@@ -1,255 +1,252 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29var tests = { 26var tests = {
30 27
31 //------------------------------------------------------------------------- 28 //-------------------------------------------------------------------------
32 29
33 'simple_tests': function() { 30 'simple_tests': function() {
34 vardeferredResult; 31 vardeferredResult;
35 32
36 deferredResult = new Clipperz.Async.Deferred("simple_tests", {trace:false}); 33 deferredResult = new Clipperz.Async.Deferred("simple_tests", {trace:false});
37 deferredResult.addCallback(function() { 34 deferredResult.addCallback(function() {
38 varobjectStore; 35 varobjectStore;
39 36
40 objectStore = new Clipperz.KeyValueObjectStore(); 37 objectStore = new Clipperz.KeyValueObjectStore();
41 38
42 ok(objectStore != null, "created an object store"); 39 ok(objectStore != null, "created an object store");
43 40
44 objectStore.setValue('key', "value"); 41 objectStore.setValue('key', "value");
45 is(objectStore.getValue('key'), "value", "can store and read a value to a simple key"); 42 is(objectStore.getValue('key'), "value", "can store and read a value to a simple key");
46 43
47 objectStore.setValue('key', "overwritten value"); 44 objectStore.setValue('key', "overwritten value");
48 is(objectStore.getValue('key'), "overwritten value", "using the same key overwrites the previous value"); 45 is(objectStore.getValue('key'), "overwritten value", "using the same key overwrites the previous value");
49 46
50 objectStore.setValue('record.keys', [1, 2, 3]); 47 objectStore.setValue('record.keys', [1, 2, 3]);
51 is( 48 is(
52 MochiKit.Base.compare(objectStore.getValue('record'), {'keys': [1,2,3]}), 49 MochiKit.Base.compare(objectStore.getValue('record'), {'keys': [1,2,3]}),
53 0, 50 0,
54 "getting a partial key returns the whole content associate with that key" 51 "getting a partial key returns the whole content associate with that key"
55 ); 52 );
56 is( 53 is(
57 MochiKit.Base.compare(objectStore.getValue('record.keys'), [1,2,3]), 54 MochiKit.Base.compare(objectStore.getValue('record.keys'), [1,2,3]),
58 0, 55 0,
59 "accessing data using a key.path return the matching content" 56 "accessing data using a key.path return the matching content"
60 ); 57 );
61 is( 58 is(
62 MochiKit.Base.compare(objectStore.getValue('record.keys.1'), 2), 59 MochiKit.Base.compare(objectStore.getValue('record.keys.1'), 2),
63 0, 60 0,
64 "accessing data using a key.path return the matching content, even inside an array" 61 "accessing data using a key.path return the matching content, even inside an array"
65 ); 62 );
66 63
67 is( 64 is(
68 objectStore.setValue('key', "value"), 65 objectStore.setValue('key', "value"),
69 "value", 66 "value",
70 "setting a value return the value itself, as a convenience to chain deferred methods" 67 "setting a value return the value itself, as a convenience to chain deferred methods"
71 ); 68 );
72 69
73 is( 70 is(
74 objectStore.getValue('not_set_key'), 71 objectStore.getValue('not_set_key'),
75 null, 72 null,
76 "accessing a previously undefined key will return null" 73 "accessing a previously undefined key will return null"
77 ); 74 );
78 is( 75 is(
79 objectStore.getValue('record.not_set_key'), 76 objectStore.getValue('record.not_set_key'),
80 null, 77 null,
81 "accessing a previously undefined key will return null, even if part of the path is defined" 78 "accessing a previously undefined key will return null, even if part of the path is defined"
82 ); 79 );
83 is( 80 is(
84 objectStore.getValue('not_set_path.not_set_key'), 81 objectStore.getValue('not_set_path.not_set_key'),
85 null, 82 null,
86 "accessing a previously undefined key will return null, even if using a completely undefined path" 83 "accessing a previously undefined key will return null, even if using a completely undefined path"
87 ); 84 );
88 85
89 objectStore.removeAllData(); 86 objectStore.removeAllData();
90 is( 87 is(
91 objectStore.getValue('key'), 88 objectStore.getValue('key'),
92 null, 89 null,
93 "getting a value after a 'removeAllData' return no value" 90 "getting a value after a 'removeAllData' return no value"
94 ); 91 );
95 92
96 }); 93 });
97 94
98 deferredResult.callback(); 95 deferredResult.callback();
99 96
100 return deferredResult; 97 return deferredResult;
101 }, 98 },
102 99
103 //------------------------------------------------------------------------- 100 //-------------------------------------------------------------------------
104 101
105 'simple_deferredGetOrSet_test': function () { 102 'simple_deferredGetOrSet_test': function () {
106 vardeferredResult; 103 vardeferredResult;
107 varobjectStore; 104 varobjectStore;
108 var testValue; 105 var testValue;
109 106
110 objectStore = new Clipperz.KeyValueObjectStore(); 107 objectStore = new Clipperz.KeyValueObjectStore();
111 testValue = "nifty test value"; 108 testValue = "nifty test value";
112 109
113 deferredResult = new Clipperz.Async.Deferred("simple_deferredGetOrSet_test", {trace:false}); 110 deferredResult = new Clipperz.Async.Deferred("simple_deferredGetOrSet_test", {trace:false});
114 deferredResult.addMethod(objectStore, 'setValue', 'key', testValue); 111 deferredResult.addMethod(objectStore, 'setValue', 'key', testValue);
115 deferredResult.addMethod(objectStore, 'deferredGetOrSet', 'key', function() {return testValue}); 112 deferredResult.addMethod(objectStore, 'deferredGetOrSet', 'key', function() {return testValue});
116 deferredResult.addCallback(function(aResult) { 113 deferredResult.addCallback(function(aResult) {
117 SimpleTest.is(aResult, testValue, "deferredGetOrSet works when accessing data already present on the object store"); 114 SimpleTest.is(aResult, testValue, "deferredGetOrSet works when accessing data already present on the object store");
118 }) 115 })
119 deferredResult.callback(); 116 deferredResult.callback();
120 }, 117 },
121 118
122 //------------------------------------------------------------------------- 119 //-------------------------------------------------------------------------
123 120
124 'deferredGetOrSet_test': function () { 121 'deferredGetOrSet_test': function () {
125 vardeferredResult; 122 vardeferredResult;
126 varobjectStore; 123 varobjectStore;
127 var testValue; 124 var testValue;
128 125
129 objectStore = new Clipperz.KeyValueObjectStore(); 126 objectStore = new Clipperz.KeyValueObjectStore();
130 testValue = "nifty test value"; 127 testValue = "nifty test value";
131 128
132 deferredResult = new Clipperz.Async.Deferred("deferredGetOrSet_test", {trace:false}); 129 deferredResult = new Clipperz.Async.Deferred("deferredGetOrSet_test", {trace:false});
133 deferredResult.addMethod(objectStore, 'setValue', 'key.path', testValue); 130 deferredResult.addMethod(objectStore, 'setValue', 'key.path', testValue);
134 deferredResult.addMethod(objectStore, 'deferredGetOrSet', 'key', function() {return {'path': testValue}; }); 131 deferredResult.addMethod(objectStore, 'deferredGetOrSet', 'key', function() {return {'path': testValue}; });
135 deferredResult.addCallback(function(aResult) { 132 deferredResult.addCallback(function(aResult) {
136 SimpleTest.is(aResult['path'], testValue, "deferredGetOrSet works when accessing data already present on the object store"); 133 SimpleTest.is(aResult['path'], testValue, "deferredGetOrSet works when accessing data already present on the object store");
137 }) 134 })
138 deferredResult.callback(); 135 deferredResult.callback();
139 }, 136 },
140 137
141 //------------------------------------------------------------------------- 138 //-------------------------------------------------------------------------
142 139
143 'simple_deferredGetOrSet_withMissingValue_test': function () { 140 'simple_deferredGetOrSet_withMissingValue_test': function () {
144 vardeferredResult; 141 vardeferredResult;
145 varobjectStore; 142 varobjectStore;
146 var testValue; 143 var testValue;
147 144
148 objectStore = new Clipperz.KeyValueObjectStore(); 145 objectStore = new Clipperz.KeyValueObjectStore();
149 testValue = "nifty test value"; 146 testValue = "nifty test value";
150 147
151 deferredResult = new Clipperz.Async.Deferred("simple_deferredGetOrSet_withMissingValue_test", {trace:false}); 148 deferredResult = new Clipperz.Async.Deferred("simple_deferredGetOrSet_withMissingValue_test", {trace:false});
152 deferredResult.addMethod(objectStore, 'deferredGetOrSet', 'key', function() {return testValue}); 149 deferredResult.addMethod(objectStore, 'deferredGetOrSet', 'key', function() {return testValue});
153 deferredResult.addCallback(function(aResult) { 150 deferredResult.addCallback(function(aResult) {
154 SimpleTest.is(aResult, testValue, "deferredGetOrSet works when accessing data already present on the object store"); 151 SimpleTest.is(aResult, testValue, "deferredGetOrSet works when accessing data already present on the object store");
155 }) 152 })
156 deferredResult.callback(); 153 deferredResult.callback();
157 }, 154 },
158 155
159 //------------------------------------------------------------------------- 156 //-------------------------------------------------------------------------
160 157
161 'deferredGetOrSet_withMissingValue_test': function () { 158 'deferredGetOrSet_withMissingValue_test': function () {
162 vardeferredResult; 159 vardeferredResult;
163 varobjectStore; 160 varobjectStore;
164 var testValue; 161 var testValue;
165 162
166 objectStore = new Clipperz.KeyValueObjectStore(); 163 objectStore = new Clipperz.KeyValueObjectStore();
167 testValue = "nifty test value"; 164 testValue = "nifty test value";
168 165
169 deferredResult = new Clipperz.Async.Deferred("deferredGetOrSet_withMissingValue_test", {trace:false}); 166 deferredResult = new Clipperz.Async.Deferred("deferredGetOrSet_withMissingValue_test", {trace:false});
170 deferredResult.addMethod(objectStore, 'deferredGetOrSet', 'key', function() {return {'path': testValue}; }); 167 deferredResult.addMethod(objectStore, 'deferredGetOrSet', 'key', function() {return {'path': testValue}; });
171 deferredResult.addCallback(function(aResult) { 168 deferredResult.addCallback(function(aResult) {
172 SimpleTest.is(aResult['path'], testValue, "deferredGetOrSet works when accessing data already present on the object store"); 169 SimpleTest.is(aResult['path'], testValue, "deferredGetOrSet works when accessing data already present on the object store");
173 }) 170 })
174 deferredResult.callback(); 171 deferredResult.callback();
175 }, 172 },
176 173
177 //------------------------------------------------------------------------- 174 //-------------------------------------------------------------------------
178 175
179 'deleteObjectKey': function () { 176 'deleteObjectKey': function () {
180 varsomeValues; 177 varsomeValues;
181 var objectStore; 178 var objectStore;
182 179
183 someValues = { 180 someValues = {
184 'key1': { 181 'key1': {
185 'key1_1': "value 1.1", 182 'key1_1': "value 1.1",
186 'key1_2': "value 1.2" 183 'key1_2': "value 1.2"
187 }, 184 },
188 'key2': { 185 'key2': {
189 'key2_1': { 186 'key2_1': {
190 'key2.1.1': "value 2.1.1", 187 'key2.1.1': "value 2.1.1",
191 'key2.1.2': "value 2.1.2" 188 'key2.1.2': "value 2.1.2"
192 }, 189 },
193 'key2_2': "value 2.2" 190 'key2_2': "value 2.2"
194 } 191 }
195 } 192 }
196 193
197 objectStore = new Clipperz.KeyValueObjectStore(); 194 objectStore = new Clipperz.KeyValueObjectStore();
198 objectStore.initWithValues(someValues); 195 objectStore.initWithValues(someValues);
199 objectStore.removeValue('key2.key2_1'); 196 objectStore.removeValue('key2.key2_1');
200 197
201 SimpleTest.is(objectStore.getValue('key1.key1_1'), "value 1.1", "The first element is still there"); 198 SimpleTest.is(objectStore.getValue('key1.key1_1'), "value 1.1", "The first element is still there");
202 SimpleTest.is(objectStore.getValue('key1.key1_2'), "value 1.2", "The second element is still there"); 199 SimpleTest.is(objectStore.getValue('key1.key1_2'), "value 1.2", "The second element is still there");
203 SimpleTest.is(objectStore.getValue('key2.key2_1'), null, "The deleted element is actually gone"); 200 SimpleTest.is(objectStore.getValue('key2.key2_1'), null, "The deleted element is actually gone");
204 SimpleTest.is(MochiKit.Base.keys(objectStore.getValue('key2')).length, 1, "Even the key is not stored anylonger"); 201 SimpleTest.is(MochiKit.Base.keys(objectStore.getValue('key2')).length, 1, "Even the key is not stored anylonger");
205 SimpleTest.is(objectStore.getValue('key2.key2_2'), "value 2.2", "The sibling of the deleted element is still there"); 202 SimpleTest.is(objectStore.getValue('key2.key2_2'), "value 2.2", "The sibling of the deleted element is still there");
206 }, 203 },
207 204
208 //------------------------------------------------------------------------- 205 //-------------------------------------------------------------------------
209 206
210 'accessDataUsingANumericKey': function () { 207 'accessDataUsingANumericKey': function () {
211 varsomeValues; 208 varsomeValues;
212 var objectStore; 209 var objectStore;
213 210
214 someValues = { 211 someValues = {
215 '1': "value 1", 212 '1': "value 1",
216 '2': "value 2" 213 '2': "value 2"
217 } 214 }
218 215
219 objectStore = new Clipperz.KeyValueObjectStore(); 216 objectStore = new Clipperz.KeyValueObjectStore();
220 objectStore.initWithValues(someValues); 217 objectStore.initWithValues(someValues);
221 218
222 SimpleTest.is(objectStore.getValue(1), "value 1", "The first element is accessed even using a numeric key"); 219 SimpleTest.is(objectStore.getValue(1), "value 1", "The first element is accessed even using a numeric key");
223 220
224 objectStore.setValue(3, "value 3"); 221 objectStore.setValue(3, "value 3");
225 SimpleTest.is(objectStore.getValue('3'), "value 3", "I can set the value using a numeric key and get it with a string key"); 222 SimpleTest.is(objectStore.getValue('3'), "value 3", "I can set the value using a numeric key and get it with a string key");
226 }, 223 },
227 224
228 //------------------------------------------------------------------------- 225 //-------------------------------------------------------------------------
229 226
230 'isEmpty_test': function () { 227 'isEmpty_test': function () {
231 varsomeValues; 228 varsomeValues;
232 var objectStore; 229 var objectStore;
233 230
234 someValues = { 231 someValues = {
235 '1': "value 1", 232 '1': "value 1",
236 '2': "value 2" 233 '2': "value 2"
237 } 234 }
238 235
239 objectStore = new Clipperz.KeyValueObjectStore(); 236 objectStore = new Clipperz.KeyValueObjectStore();
240 SimpleTest.is(objectStore.isEmpty(), true, "A newly initialized KeyValueStore is empty"); 237 SimpleTest.is(objectStore.isEmpty(), true, "A newly initialized KeyValueStore is empty");
241 238
242 objectStore.initWithValues(someValues); 239 objectStore.initWithValues(someValues);
243 SimpleTest.is(objectStore.isEmpty(), false, "Once the KeyValueStore is initialized with some values, it is no logner empty"); 240 SimpleTest.is(objectStore.isEmpty(), false, "Once the KeyValueStore is initialized with some values, it is no logner empty");
244 241
245 objectStore.removeAllData(); 242 objectStore.removeAllData();
246 SimpleTest.is(objectStore.isEmpty(), true, "A KeyValueStore is empty after invoking the 'removeAllData' method"); 243 SimpleTest.is(objectStore.isEmpty(), true, "A KeyValueStore is empty after invoking the 'removeAllData' method");
247 }, 244 },
248 245
249 //------------------------------------------------------------------------- 246 //-------------------------------------------------------------------------
250 'syntaxFix': MochiKit.Base.noop 247 'syntaxFix': MochiKit.Base.noop
251}; 248};
252 249
253//############################################################################# 250//#############################################################################
254 251
255SimpleTest.runDeferredTests("Clipperz.KeyValueObjectStore", tests, {trace:false}); 252SimpleTest.runDeferredTests("Clipperz.KeyValueObjectStore", tests, {trace:false});
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/BookmarkletProcessor.html b/frontend/gamma/tests/tests/Clipperz/PM/BookmarkletProcessor.html
index 9bd344e..b61057c 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/BookmarkletProcessor.html
+++ b/frontend/gamma/tests/tests/Clipperz/PM/BookmarkletProcessor.html
@@ -1,59 +1,56 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27--> 24-->
28 25
29<html> 26<html>
30<head> 27<head>
31 <title>Clipperz.PM.BookmarkletProcessor - test</title> 28 <title>Clipperz.PM.BookmarkletProcessor - test</title>
32 29
33 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 30 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
34 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> 31 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
35 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> 32 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
36 33
37 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script> 34 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script>
38 35
39 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> 36 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
40 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 37 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
41 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 38 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script> 39 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
43 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script> 40 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script>
44 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script> 41 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script>
45 42
46 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings.js'></script> 43 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings.js'></script>
47 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script> 44 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script>
48 <script type='text/javascript' src='../../../../js/Clipperz/PM/BookmarkletProcessor.js'></script> 45 <script type='text/javascript' src='../../../../js/Clipperz/PM/BookmarkletProcessor.js'></script>
49 46
50 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.Async.js"></script> 47 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.Async.js"></script>
51 48
52</head> 49</head>
53<body> 50<body>
54 51
55<pre id="test"> 52<pre id="test">
56<script type="text/javascript" src="BookmarkletProcessor.test.js"></script> 53<script type="text/javascript" src="BookmarkletProcessor.test.js"></script>
57</pre> 54</pre>
58</body> 55</body>
59</html> 56</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/BookmarkletProcessor.test.js b/frontend/gamma/tests/tests/Clipperz/PM/BookmarkletProcessor.test.js
index 21776a3..45bf76b 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/BookmarkletProcessor.test.js
+++ b/frontend/gamma/tests/tests/Clipperz/PM/BookmarkletProcessor.test.js
@@ -1,132 +1,129 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29function testBookmarkletConfigurationString (aConfiguration, shouldFail, aMessage) { 26function testBookmarkletConfigurationString (aConfiguration, shouldFail, aMessage) {
30 //var configuration; 27 //var configuration;
31 28
32//try { 29//try {
33 //configuration = Clipperz.Base.evalJSON(aConfiguration); 30 //configuration = Clipperz.Base.evalJSON(aConfiguration);
34//} catch (exception) { 31//} catch (exception) {
35 //console.log("EXCEPTION", exception); 32 //console.log("EXCEPTION", exception);
36 //throw exception; 33 //throw exception;
37//} 34//}
38 35
39//console.log("configuration", configuration); 36//console.log("configuration", configuration);
40 37
41 if (shouldFail == true) { 38 if (shouldFail == true) {
42 try { 39 try {
43 Clipperz.PM.BookmarkletProcessor.checkBookmarkletConfiguration(aConfiguration); 40 Clipperz.PM.BookmarkletProcessor.checkBookmarkletConfiguration(aConfiguration);
44 SimpleTest.ok(false, "vulnerability not caught - " + aMessage); 41 SimpleTest.ok(false, "vulnerability not caught - " + aMessage);
45 } catch(exception) { 42 } catch(exception) {
46 SimpleTest.ok(true, "vulnerability correctly caught - " + aMessage); 43 SimpleTest.ok(true, "vulnerability correctly caught - " + aMessage);
47 } 44 }
48 } else { 45 } else {
49 try { 46 try {
50 Clipperz.PM.BookmarkletProcessor.checkBookmarkletConfiguration(aConfiguration); 47 Clipperz.PM.BookmarkletProcessor.checkBookmarkletConfiguration(aConfiguration);
51 SimpleTest.ok(true, "configuration correctly checked - " + aMessage); 48 SimpleTest.ok(true, "configuration correctly checked - " + aMessage);
52 } catch(exception) { 49 } catch(exception) {
53 SimpleTest.ok(false, "configuration wrongly caught as malicious - " + aMessage); 50 SimpleTest.ok(false, "configuration wrongly caught as malicious - " + aMessage);
54 // console.log(exception); 51 // console.log(exception);
55 } 52 }
56 } 53 }
57} 54}
58 55
59//############################################################################# 56//#############################################################################
60 57
61var tests = { 58var tests = {
62 59
63 //------------------------------------------------------------------------- 60 //-------------------------------------------------------------------------
64 61
65 'simpleAmazonConfiguration_test': function () { 62 'simpleAmazonConfiguration_test': function () {
66 var bookmarkletConfigurationString; 63 var bookmarkletConfigurationString;
67 64
68 bookmarkletConfigurationString = "{"+ 65 bookmarkletConfigurationString = "{"+
69 "\"page\": {\"title\": \"Sign In\"},\n" + 66 "\"page\": {\"title\": \"Sign In\"},\n" +
70 "\"form\": {" + 67 "\"form\": {" +
71 "\"attributes\": {" + 68 "\"attributes\": {" +
72 "\"action\": \"https://www.amazon.com/gp/flex/sign-in/select.html\",\n" + 69 "\"action\": \"https://www.amazon.com/gp/flex/sign-in/select.html\",\n" +
73 "\"method\": \"post\"" + 70 "\"method\": \"post\"" +
74 "},\n" + 71 "},\n" +
75 "\"inputs\": [" + 72 "\"inputs\": [" +
76 "{\"type\": \"hidden\",\n\"name\": \"path\",\n\"value\": \"/gp/yourstore\"},\n" + 73 "{\"type\": \"hidden\",\n\"name\": \"path\",\n\"value\": \"/gp/yourstore\"},\n" +
77 "{\"type\": \"hidden\",\n\"name\": \"useRedirectOnSuccess\",\n\"value\": \"1\"},\n" + 74 "{\"type\": \"hidden\",\n\"name\": \"useRedirectOnSuccess\",\n\"value\": \"1\"},\n" +
78 "{\"type\": \"hidden\",\n\"name\": \"query\",\n\"value\": \"signIn=1&action=sign-out&useRedirectOnSuccess=1&path=/gp/yourstore&ref_=pd_irl_gw_r\"},\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" +
79 "{\"type\": \"hidden\",\n\"name\": \"mode\",\n\"value\": \"\"},\n" + 76 "{\"type\": \"hidden\",\n\"name\": \"mode\",\n\"value\": \"\"},\n" +
80 "{\"type\": \"hidden\",\n\"name\": \"redirectProtocol\",\n\"value\": \"\"},\n" + 77 "{\"type\": \"hidden\",\n\"name\": \"redirectProtocol\",\n\"value\": \"\"},\n" +
81 "{\"type\": \"hidden\",\n\"name\": \"pageAction\",\n\"value\": \"/gp/yourstore\"},\n" + 78 "{\"type\": \"hidden\",\n\"name\": \"pageAction\",\n\"value\": \"/gp/yourstore\"},\n" +
82 "{\"type\": \"hidden\",\n\"name\": \"disableCorpSignUp\",\n\"value\": \"\"},\n" + 79 "{\"type\": \"hidden\",\n\"name\": \"disableCorpSignUp\",\n\"value\": \"\"},\n" +
83 "{\"type\": \"hidden\",\n\"name\": \"protocol\",\n\"value\": \"https\"},\n" + 80 "{\"type\": \"hidden\",\n\"name\": \"protocol\",\n\"value\": \"https\"},\n" +
84 "{\"type\": \"hidden\",\n\"name\": \"sessionId\",\n\"value\": \"105-1479357-7902864\"},\n" + 81 "{\"type\": \"hidden\",\n\"name\": \"sessionId\",\n\"value\": \"105-1479357-7902864\"},\n" +
85 "{\"type\": \"hidden\",\n\"name\": \"referer\",\n\"value\": \"flex\"},\n" + 82 "{\"type\": \"hidden\",\n\"name\": \"referer\",\n\"value\": \"flex\"},\n" +
86 "{\"type\": \"text\",\n\"name\": \"email\",\n\"value\": \"\"},\n" + 83 "{\"type\": \"text\",\n\"name\": \"email\",\n\"value\": \"\"},\n" +
87 "{\"type\": \"password\",\n\"name\": \"password\",\n\"value\": \"\"},\n" + 84 "{\"type\": \"password\",\n\"name\": \"password\",\n\"value\": \"\"},\n" +
88 "{\"type\": \"hidden\",\n\"name\": \"metadata1\",\n\"value\": \"Firefox 3.0.3 Mac\"},\n" + 85 "{\"type\": \"hidden\",\n\"name\": \"metadata1\",\n\"value\": \"Firefox 3.0.3 Mac\"},\n" +
89 "{\"type\": \"hidden\",\n\"name\": \"metadataf1\",\n\"value\": \"\"},\n" + 86 "{\"type\": \"hidden\",\n\"name\": \"metadataf1\",\n\"value\": \"\"},\n" +
90 "{\"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" + 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" +
91 "{\"type\": \"hidden\",\n\"name\": \"metadata3\",\n\"value\": \"timezone: -1 execution time: 3\"},\n" + 88 "{\"type\": \"hidden\",\n\"name\": \"metadata3\",\n\"value\": \"timezone: -1 execution time: 3\"},\n" +
92 "{\"name\": \"action\",\n\"type\": \"radio\",\n\"options\": [" + 89 "{\"name\": \"action\",\n\"type\": \"radio\",\n\"options\": [" +
93 "{\"value\": \"new-user\",\n\"checked\": false},\n" + 90 "{\"value\": \"new-user\",\n\"checked\": false},\n" +
94 "{\"value\": \"sign-in\",\n\"checked\": true}" + 91 "{\"value\": \"sign-in\",\n\"checked\": true}" +
95 "]}" + 92 "]}" +
96 "]" + 93 "]" +
97 "},\n" + 94 "},\n" +
98 "\"version\": \"0.2.3\"" + 95 "\"version\": \"0.2.3\"" +
99 "}"; 96 "}";
100 testBookmarkletConfigurationString(bookmarkletConfigurationString, false, "regular Amazon.com configuration"); 97 testBookmarkletConfigurationString(bookmarkletConfigurationString, false, "regular Amazon.com configuration");
101 }, 98 },
102 99
103 //------------------------------------------------------------------------- 100 //-------------------------------------------------------------------------
104 101
105 'hackedConfigurationWithXSSAttackVectorReadyToBeTriggeredWhenActivatingTheDirectLogin_test': function () { 102 'hackedConfigurationWithXSSAttackVectorReadyToBeTriggeredWhenActivatingTheDirectLogin_test': function () {
106 var bookmarkletConfigurationString; 103 var bookmarkletConfigurationString;
107 104
108 bookmarkletConfigurationString = "{" + 105 bookmarkletConfigurationString = "{" +
109 "\"page\": {\"title\": \"Example Attack\"}," + 106 "\"page\": {\"title\": \"Example Attack\"}," +
110 "\"form\": { " + 107 "\"form\": { " +
111 "\"attributes\": { " + 108 "\"attributes\": { " +
112 "\"action\": \"javascript:opener.document.body.innerHTML = 'hacked!';close();\", " + 109 "\"action\": \"javascript:opener.document.body.innerHTML = 'hacked!';close();\", " +
113 "\"style\": \"-moz-binding:url('http://ha.ckers.org/xssmoz.xml#xss')\", " + 110 "\"style\": \"-moz-binding:url('http://ha.ckers.org/xssmoz.xml#xss')\", " +
114 "\"method\": null " + 111 "\"method\": null " +
115 "}, " + 112 "}, " +
116 "\"inputs\": [" + 113 "\"inputs\": [" +
117 "{\"type\": \"text\", \"name\": \"username\", \"value\": \"\"}, " + 114 "{\"type\": \"text\", \"name\": \"username\", \"value\": \"\"}, " +
118 "{\"type\": \"password\", \"name\": \"password\", \"value\": \"\"}" + 115 "{\"type\": \"password\", \"name\": \"password\", \"value\": \"\"}" +
119 "]" + 116 "]" +
120 "}," + 117 "}," +
121 "\"version\": \"0.2.3\" " + 118 "\"version\": \"0.2.3\" " +
122 "}"; 119 "}";
123 testBookmarkletConfigurationString(bookmarkletConfigurationString, false, "hacked configuration that is trying to inject a XSS attack vector. It should not fail, as it is responsability of the direct login to avoid triggering such attack vector"); 120 testBookmarkletConfigurationString(bookmarkletConfigurationString, false, "hacked configuration that is trying to inject a XSS attack vector. It should not fail, as it is responsability of the direct login to avoid triggering such attack vector");
124 }, 121 },
125 122
126 //------------------------------------------------------------------------- 123 //-------------------------------------------------------------------------
127 'syntaxFix': MochiKit.Base.noop 124 'syntaxFix': MochiKit.Base.noop
128} 125}
129 126
130//############################################################################# 127//#############################################################################
131 128
132SimpleTest.runDeferredTests("Clipperz.PM.BookmarkletProcessor", tests, {trace:false}); 129SimpleTest.runDeferredTests("Clipperz.PM.BookmarkletProcessor", tests, {trace:false});
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/Connection.data.js b/frontend/gamma/tests/tests/Clipperz/PM/Connection.data.js
index 9dec232..3e01411 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/Connection.data.js
+++ b/frontend/gamma/tests/tests/Clipperz/PM/Connection.data.js
@@ -1,408 +1,405 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29testData = { 26testData = {
30 27
31 //------------------------------------------------------------------------- 28 //-------------------------------------------------------------------------
32 29
33 'joe_clipperz_offline_copy_data': { 30 'joe_clipperz_offline_copy_data': {
34 users:{ 31 users:{
35 'catchAllUser': { 32 'catchAllUser': {
36 __masterkey_test_value__: 'masterkey', 33 __masterkey_test_value__: 'masterkey',
37 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00', 34 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00',
38 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00' 35 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00'
39 }, 36 },
40 'f527cdd90d0d47f8524b4e165398ad1455eba515d04abd101d1e93b3c6ae0674': { 37 'f527cdd90d0d47f8524b4e165398ad1455eba515d04abd101d1e93b3c6ae0674': {
41 s: '186f0c40bf73f2af236eaa6c429df225efa933050c9aae65240e93b7b362e3ee', 38 s: '186f0c40bf73f2af236eaa6c429df225efa933050c9aae65240e93b7b362e3ee',
42 v: 'ac61a6e325ecf329926a86084f591d8852d0ad3e4a6080f2adc901b82395ecaf', 39 v: 'ac61a6e325ecf329926a86084f591d8852d0ad3e4a6080f2adc901b82395ecaf',
43 version: '0.2', 40 version: '0.2',
44 maxNumberOfRecords: '100', 41 maxNumberOfRecords: '100',
45 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"}', 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"}',
46 statistics: 'SfGy/4mpXQdDOv+Bcfie4Yt/', 43 statistics: 'SfGy/4mpXQdDOv+Bcfie4Yt/',
47 userDetailsVersion: '0.3', 44 userDetailsVersion: '0.3',
48 records: { 45 records: {
49 '062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80': { 46 '062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80': {
50 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', 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',
51 version: '0.2', 48 version: '0.2',
52 creationDate: 'Wed Mar 14 15:46:44 CET 2007', 49 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
53 updateDate: 'Wed Mar 14 15:46:44 CET 2007', 50 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
54 accessDate: 'Mon Jan 19 16:10:04 CET 2009', 51 accessDate: 'Mon Jan 19 16:10:04 CET 2009',
55 currentVersion: '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3', 52 currentVersion: '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3',
56 versions: { 53 versions: {
57 '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3': { 54 '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3': {
58 header: '####', 55 header: '####',
59 data: 'GCNNIhDQjMJQZGVSf+95fPtU6eOnFWVhuGm86r8WZGVR2Gf2EjbG1OJ0ZIGpZ/AXgirCMpo5AFxJe0Bay8IYg+xmBqMFhwFxzAgJBYCIts+raSaNRipuY8dTEqDxAqD1cChcG8EhSoiFgQ0fG0I7nNEUDJi0pIt4/ygBcwvAhuAenEp9ZW+oQA0+YysPQRqkz3IieFaOoSEbe5/SqpUilV4q1gTVyzNXvrxzxx+rlvEyGFgFN+vgtUZ1NrwlPk4gVksTpylvv6CFaMGEWKhgMG6efo0rJckKosaJTu1pldJdnmMK4EKNMLOd+jZ6pEhEhYyadrA4+zYU5TlmZA6ASzTaps8piSwZodoi9qY0ch2StK4mAbzeEGe2HdfHuAU9Tyq3Ppk3+VfNdKgpQfYrQOiSlXbKzK636tzXTN/gyrfOTHjBrRl117ywibgSX63ayAYNfcLpKotC', 56 data: 'GCNNIhDQjMJQZGVSf+95fPtU6eOnFWVhuGm86r8WZGVR2Gf2EjbG1OJ0ZIGpZ/AXgirCMpo5AFxJe0Bay8IYg+xmBqMFhwFxzAgJBYCIts+raSaNRipuY8dTEqDxAqD1cChcG8EhSoiFgQ0fG0I7nNEUDJi0pIt4/ygBcwvAhuAenEp9ZW+oQA0+YysPQRqkz3IieFaOoSEbe5/SqpUilV4q1gTVyzNXvrxzxx+rlvEyGFgFN+vgtUZ1NrwlPk4gVksTpylvv6CFaMGEWKhgMG6efo0rJckKosaJTu1pldJdnmMK4EKNMLOd+jZ6pEhEhYyadrA4+zYU5TlmZA6ASzTaps8piSwZodoi9qY0ch2StK4mAbzeEGe2HdfHuAU9Tyq3Ppk3+VfNdKgpQfYrQOiSlXbKzK636tzXTN/gyrfOTHjBrRl117ywibgSX63ayAYNfcLpKotC',
60 version: '0.2', 57 version: '0.2',
61 creationDate: 'Wed Mar 14 15:46:44 CET 2007', 58 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
62 updateDate: 'Wed Mar 14 15:46:44 CET 2007', 59 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
63 accessDate: 'Mon Jan 19 16:10:04 CET 2009' 60 accessDate: 'Mon Jan 19 16:10:04 CET 2009'
64 } 61 }
65 } 62 }
66 }, 63 },
67 '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d': { 64 '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d': {
68 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', 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',
69 version: '0.3', 66 version: '0.3',
70 creationDate: 'Fri Oct 17 16:49:20 CEST 2008', 67 creationDate: 'Fri Oct 17 16:49:20 CEST 2008',
71 updateDate: 'Mon Oct 27 08:58:49 CET 2008', 68 updateDate: 'Mon Oct 27 08:58:49 CET 2008',
72 accessDate: 'Mon Jan 19 16:09:39 CET 2009', 69 accessDate: 'Mon Jan 19 16:09:39 CET 2009',
73 currentVersion: '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac', 70 currentVersion: '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac',
74 versions: { 71 versions: {
75 '0ae362285f103722abbd046eee2b7d10aeae6a1d05cbaf2081392ce9df882bcf': { 72 '0ae362285f103722abbd046eee2b7d10aeae6a1d05cbaf2081392ce9df882bcf': {
76 header: '####', 73 header: '####',
77 data: 'sG6TUmPSEPFpiJ5YdtghWHmHbvUK63tZCZ+Q5iz2ALas//jN+lZCBhZcjEwPEJskBkK2R0MyAh14wWGh2bBHMjsokgTe+L+x+0c/Zi0epE/IC9gtOBhsTe/hZ2e2xOGF/SbzET3DAAYXvxduZ36f7SvvFnrkkKvpj8wGSdTFcBmzqMb9DL2bRyRCLGLMzE3F1a0q5CufCIRz2TgHm+Uw+kfvvwC7ig/F/5iLW90Ypz3vmEtMEFYFHZ9a8Oh0rsXGfevbMhFqALoywzihQEe/NiB8dwn7GEdYKSQ35rhvZh29ULWOZinqmg0ONe0HYaxx7DbKsVoue57S0CIUlgHLajzHfLfqQg2sFI0OT8TnHsGg0YZ6mM2EdKmEjJiER0cP', 74 data: 'sG6TUmPSEPFpiJ5YdtghWHmHbvUK63tZCZ+Q5iz2ALas//jN+lZCBhZcjEwPEJskBkK2R0MyAh14wWGh2bBHMjsokgTe+L+x+0c/Zi0epE/IC9gtOBhsTe/hZ2e2xOGF/SbzET3DAAYXvxduZ36f7SvvFnrkkKvpj8wGSdTFcBmzqMb9DL2bRyRCLGLMzE3F1a0q5CufCIRz2TgHm+Uw+kfvvwC7ig/F/5iLW90Ypz3vmEtMEFYFHZ9a8Oh0rsXGfevbMhFqALoywzihQEe/NiB8dwn7GEdYKSQ35rhvZh29ULWOZinqmg0ONe0HYaxx7DbKsVoue57S0CIUlgHLajzHfLfqQg2sFI0OT8TnHsGg0YZ6mM2EdKmEjJiER0cP',
78 version: '0.3', 75 version: '0.3',
79 creationDate: 'Fri Oct 17 17:00:31 CEST 2008', 76 creationDate: 'Fri Oct 17 17:00:31 CEST 2008',
80 updateDate: 'Fri Oct 17 17:00:31 CEST 2008', 77 updateDate: 'Fri Oct 17 17:00:31 CEST 2008',
81 accessDate: 'Fri Oct 17 17:00:31 CEST 2008' 78 accessDate: 'Fri Oct 17 17:00:31 CEST 2008'
82 }, 79 },
83 '10f45664bbd979a92f37886f1ecc6e52e49798b16dc997aecd37259ad9b2090e': { 80 '10f45664bbd979a92f37886f1ecc6e52e49798b16dc997aecd37259ad9b2090e': {
84 header: '####', 81 header: '####',
85 data: 'RdKVaV/WWWchrCse3KtcXd47Bfm6IAwjqVUpaxoed3HeunI42AAm7xYYSjeK8edHpbNRJbhobBAX5OZtWIp/HmgkobKM8CIiWxrWz89FqyrbnPD7+fXdtgF2yTax/0sC1l0ibncdOuJKX6U829oPlXCpXIOjlomc4wEEAD/5V6FbORvdZ9IE/ME3LsG2y02cT2tIpx6+R6wC/PKXhZA2UDsTE6R2Op2BtIzpVORZLXsdyAp/4wvWQxq90i9cEpbsVQsMB10JVyNHNsRTFhIlHi9MVCaMxQvcrwRElMj/Y9x3RbsFzSGKqFLqdg7Fn/U+KYkpYtsgHv9hraPIb9lV5FH16+iItU/HBM6FGezIj1ZkoQ+dgjPfSjTZzgzDYwyb', 82 data: 'RdKVaV/WWWchrCse3KtcXd47Bfm6IAwjqVUpaxoed3HeunI42AAm7xYYSjeK8edHpbNRJbhobBAX5OZtWIp/HmgkobKM8CIiWxrWz89FqyrbnPD7+fXdtgF2yTax/0sC1l0ibncdOuJKX6U829oPlXCpXIOjlomc4wEEAD/5V6FbORvdZ9IE/ME3LsG2y02cT2tIpx6+R6wC/PKXhZA2UDsTE6R2Op2BtIzpVORZLXsdyAp/4wvWQxq90i9cEpbsVQsMB10JVyNHNsRTFhIlHi9MVCaMxQvcrwRElMj/Y9x3RbsFzSGKqFLqdg7Fn/U+KYkpYtsgHv9hraPIb9lV5FH16+iItU/HBM6FGezIj1ZkoQ+dgjPfSjTZzgzDYwyb',
86 version: '0.3', 83 version: '0.3',
87 creationDate: 'Fri Oct 17 16:49:20 CEST 2008', 84 creationDate: 'Fri Oct 17 16:49:20 CEST 2008',
88 updateDate: 'Fri Oct 17 16:49:20 CEST 2008', 85 updateDate: 'Fri Oct 17 16:49:20 CEST 2008',
89 accessDate: 'Fri Oct 17 16:54:23 CEST 2008' 86 accessDate: 'Fri Oct 17 16:54:23 CEST 2008'
90 }, 87 },
91 '2fa7b67e569d5e268d2b70b3d4d3a960d7e437e1937bcb324b67d0b9441db8ba': { 88 '2fa7b67e569d5e268d2b70b3d4d3a960d7e437e1937bcb324b67d0b9441db8ba': {
92 header: '####', 89 header: '####',
93 data: 'dpnI2qKjk0+bfyKktw4ZCWf+rWZ12hO5bda39CwD29JH7KtdpLCLe2LoLd+KKF2wOdpDsoI2iTiwRgFpt77e7DoWJABxq/0aaRCVN9XpqZo08iHiYhJyNlIszO8CdEhX+M3AeZqzTnd6fs91VfIEWggvku2Z+jwr0CbclY6FnOcNnS+1fj+W79Z9XC383GOm2ujjfo3SX/fyNQSw8aX+7AgJIRGR9uHK7M1cVfsNNTbmDb/HDgLlYZ1Pqm/9poHpmS7G4HUoRM2/WjI0R6F48dy5s8vZRi11SCnlnj5oRykScJj6wh2DltbCyesiaTpAjP6MQjTXsZzKpaosaQcQClZw+w6hDD2cA54IaBIv2j5KAHyhxDh2ERdwbdnCsDKPz4+zP+fmKfW295d4OY0l1NCSdcY+75HWTmBWRAooZeDTo7AE8m5sRwxewE0Y8J2MLUYsrs7Rl4kbZCiRRHU7cs+us3fq2DVn2OLGEbkRrK3kA9swT9W8ABqINoA79+DmDaIr6TGxe5AlHkCAl5sYAN4g42UX1NKhl4fWI1Scj9O1Ixds/1UUvqzavld0mE2cR9yt6LntjE5sQSAaexvymAJbU5IIM5NTk7NlY7G3PEvAPjcUsL9SGw==', 90 data: 'dpnI2qKjk0+bfyKktw4ZCWf+rWZ12hO5bda39CwD29JH7KtdpLCLe2LoLd+KKF2wOdpDsoI2iTiwRgFpt77e7DoWJABxq/0aaRCVN9XpqZo08iHiYhJyNlIszO8CdEhX+M3AeZqzTnd6fs91VfIEWggvku2Z+jwr0CbclY6FnOcNnS+1fj+W79Z9XC383GOm2ujjfo3SX/fyNQSw8aX+7AgJIRGR9uHK7M1cVfsNNTbmDb/HDgLlYZ1Pqm/9poHpmS7G4HUoRM2/WjI0R6F48dy5s8vZRi11SCnlnj5oRykScJj6wh2DltbCyesiaTpAjP6MQjTXsZzKpaosaQcQClZw+w6hDD2cA54IaBIv2j5KAHyhxDh2ERdwbdnCsDKPz4+zP+fmKfW295d4OY0l1NCSdcY+75HWTmBWRAooZeDTo7AE8m5sRwxewE0Y8J2MLUYsrs7Rl4kbZCiRRHU7cs+us3fq2DVn2OLGEbkRrK3kA9swT9W8ABqINoA79+DmDaIr6TGxe5AlHkCAl5sYAN4g42UX1NKhl4fWI1Scj9O1Ixds/1UUvqzavld0mE2cR9yt6LntjE5sQSAaexvymAJbU5IIM5NTk7NlY7G3PEvAPjcUsL9SGw==',
94 version: '0.3', 91 version: '0.3',
95 creationDate: 'Fri Oct 17 17:00:13 CEST 2008', 92 creationDate: 'Fri Oct 17 17:00:13 CEST 2008',
96 updateDate: 'Fri Oct 17 17:00:13 CEST 2008', 93 updateDate: 'Fri Oct 17 17:00:13 CEST 2008',
97 accessDate: 'Fri Oct 17 17:00:13 CEST 2008' 94 accessDate: 'Fri Oct 17 17:00:13 CEST 2008'
98 }, 95 },
99 '5a17723c34226d8cd663f91b11bfa14979e694e461818113ec8abf7194b46b6b': { 96 '5a17723c34226d8cd663f91b11bfa14979e694e461818113ec8abf7194b46b6b': {
100 header: '####', 97 header: '####',
101 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==', 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==',
102 version: '0.3', 99 version: '0.3',
103 creationDate: 'Fri Oct 17 16:59:31 CEST 2008', 100 creationDate: 'Fri Oct 17 16:59:31 CEST 2008',
104 updateDate: 'Fri Oct 17 16:59:31 CEST 2008', 101 updateDate: 'Fri Oct 17 16:59:31 CEST 2008',
105 accessDate: 'Fri Oct 17 16:59:31 CEST 2008' 102 accessDate: 'Fri Oct 17 16:59:31 CEST 2008'
106 }, 103 },
107 '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac': { 104 '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac': {
108 header: '####', 105 header: '####',
109 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==', 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==',
110 version: '0.3', 107 version: '0.3',
111 creationDate: 'Mon Oct 27 08:58:49 CET 2008', 108 creationDate: 'Mon Oct 27 08:58:49 CET 2008',
112 updateDate: 'Mon Oct 27 08:58:49 CET 2008', 109 updateDate: 'Mon Oct 27 08:58:49 CET 2008',
113 accessDate: 'Mon Jan 19 16:09:39 CET 2009' 110 accessDate: 'Mon Jan 19 16:09:39 CET 2009'
114 }, 111 },
115 'b57a2d2ffafa8029123362071c09709bb9192f06a17140440f0e41d22143148f': { 112 'b57a2d2ffafa8029123362071c09709bb9192f06a17140440f0e41d22143148f': {
116 header: '####', 113 header: '####',
117 data: 'PQ53T2Vo2D8PoLI1qNX//jLaVZFTDTYk6geT9+4RoThTxvlJ+beDPnQzgYhd9iASaF9GQEEL8JxsBnNpEPa6JPOY4ndFLmDLyFDKXMprxq1UIbzFV6kFoYAk3uCCCa3UCDzdr1KXB2CiiF9HrilaA+xkm8krAvH8I5kZD+j23gByz5cAFvXg7A77KEURpjujURL65DW5M+ceIjo6OXaPW9VO03xhqGt/M47ayObpoEGJZn+X9C8s0SE5wOXHbn38YZlRI480OMvtDAxbEYUeQKMmzu6lO4Nw5hhOUjoPSLr/i3tmDx3nPcDwnSafx6jyA4y31eW6yazqTEOP5I5ArC5mUrF7mAAiFvbHIsMoF8PLj6MONlRIOZgbf9HzCpFdt8xBrX/TXp3LaSAj2XTWgSTFI2cgmU3qqPyibvIfUsB5cVHQCXi692JpC+B85axJ0FLyMl5w3vq0txlPkf6q+dadPYDaLHGZEmDjkWScA1GM5xPJHWFwqGE7ejgXKG0sMYsMKWYk+F2LEUmMHtEvSlpgJBntvcQ1ZjYQxeu4hg5txu1ykkif6fXgkXF6wn6qu+5caeJeNhWtAB4q7WVD47111woYMdkmX7AnDTXSAQ==', 114 data: 'PQ53T2Vo2D8PoLI1qNX//jLaVZFTDTYk6geT9+4RoThTxvlJ+beDPnQzgYhd9iASaF9GQEEL8JxsBnNpEPa6JPOY4ndFLmDLyFDKXMprxq1UIbzFV6kFoYAk3uCCCa3UCDzdr1KXB2CiiF9HrilaA+xkm8krAvH8I5kZD+j23gByz5cAFvXg7A77KEURpjujURL65DW5M+ceIjo6OXaPW9VO03xhqGt/M47ayObpoEGJZn+X9C8s0SE5wOXHbn38YZlRI480OMvtDAxbEYUeQKMmzu6lO4Nw5hhOUjoPSLr/i3tmDx3nPcDwnSafx6jyA4y31eW6yazqTEOP5I5ArC5mUrF7mAAiFvbHIsMoF8PLj6MONlRIOZgbf9HzCpFdt8xBrX/TXp3LaSAj2XTWgSTFI2cgmU3qqPyibvIfUsB5cVHQCXi692JpC+B85axJ0FLyMl5w3vq0txlPkf6q+dadPYDaLHGZEmDjkWScA1GM5xPJHWFwqGE7ejgXKG0sMYsMKWYk+F2LEUmMHtEvSlpgJBntvcQ1ZjYQxeu4hg5txu1ykkif6fXgkXF6wn6qu+5caeJeNhWtAB4q7WVD47111woYMdkmX7AnDTXSAQ==',
118 version: '0.3', 115 version: '0.3',
119 creationDate: 'Fri Oct 17 16:57:17 CEST 2008', 116 creationDate: 'Fri Oct 17 16:57:17 CEST 2008',
120 updateDate: 'Fri Oct 17 16:57:17 CEST 2008', 117 updateDate: 'Fri Oct 17 16:57:17 CEST 2008',
121 accessDate: 'Fri Oct 17 16:57:17 CEST 2008' 118 accessDate: 'Fri Oct 17 16:57:17 CEST 2008'
122 }, 119 },
123 'b713e0a1e2664ac7bfa7ba887329ea023204d10298973e322983b82b222debf6': { 120 'b713e0a1e2664ac7bfa7ba887329ea023204d10298973e322983b82b222debf6': {
124 header: '####', 121 header: '####',
125 data: 'H3gIieYrH7Oy8LEWCZpl9vGp9qYdHNCoBNGijYqlcfXt+1JYvPj1abPp12xLNrDUHfaOZklU2Ip4tOf0CDNhgAan7LYyPqFoy9ss2f9/5RLcbjwiIwSduySIL322HTAwqlzlBt/qaJdHHPUrczmu0fb7fT+0dO4gCL/e/IjcHLefUUgNPAbpHG0Nv0+4lNwKZkIQM3tLRtfJyFBIgWKcMcP1XMic33kr24rwybR8Pb0CHZrOOvvUiGqyoED3ZTZf1twUDVNXO7MWCAC5dBc6/Mk/vSmbbGhppXAH02N0g8G5qzZfp3UVikls55VNhRYLHByVsgpkbIrKXyZnBPTwzm7qefpYAXDOgO+164L66/Art2FYGqZQRZLuh5r8oF38', 122 data: 'H3gIieYrH7Oy8LEWCZpl9vGp9qYdHNCoBNGijYqlcfXt+1JYvPj1abPp12xLNrDUHfaOZklU2Ip4tOf0CDNhgAan7LYyPqFoy9ss2f9/5RLcbjwiIwSduySIL322HTAwqlzlBt/qaJdHHPUrczmu0fb7fT+0dO4gCL/e/IjcHLefUUgNPAbpHG0Nv0+4lNwKZkIQM3tLRtfJyFBIgWKcMcP1XMic33kr24rwybR8Pb0CHZrOOvvUiGqyoED3ZTZf1twUDVNXO7MWCAC5dBc6/Mk/vSmbbGhppXAH02N0g8G5qzZfp3UVikls55VNhRYLHByVsgpkbIrKXyZnBPTwzm7qefpYAXDOgO+164L66/Art2FYGqZQRZLuh5r8oF38',
126 version: '0.3', 123 version: '0.3',
127 creationDate: 'Fri Oct 17 16:58:00 CEST 2008', 124 creationDate: 'Fri Oct 17 16:58:00 CEST 2008',
128 updateDate: 'Fri Oct 17 16:58:00 CEST 2008', 125 updateDate: 'Fri Oct 17 16:58:00 CEST 2008',
129 accessDate: 'Fri Oct 17 16:58:00 CEST 2008' 126 accessDate: 'Fri Oct 17 16:58:00 CEST 2008'
130 }, 127 },
131 'c4cea1cd88a86b05f48a99896a37967c3456228283a0406331ca9f67c6f29f97': { 128 'c4cea1cd88a86b05f48a99896a37967c3456228283a0406331ca9f67c6f29f97': {
132 header: '####', 129 header: '####',
133 data: '1znWPwc9JwCe7iOFiUd2iGm4xJd+824B4VRqEtzCQkW46tg25RWfo7XagvK46USB7t6pC8WMLU0M/EC47KucsfpWUqHGbseoXT/8g8E8GoLnIsk9qFyJG7LGd1sUvqBgszLZwjWWG3t9zifmpW5nY9GialBYNmeSLS3bg5xDH+eCEilUUfDe7zGuVSuu/XkHacv/DYUst97e+6u44F7H8Kv8dTywJZpqbmveNPeWfCej2aBXdVV616J5lIRaj2uIYuQYG7blYJh9KZ7yLStdPndl6h65hIJpfWo0PM8nLJuo0lWNHz7misrutnmxJEjkwVIZ5YAmqp1Zz3VC8zw4IxkXrC/sPmp4PaNXgKz9ZJRaY2KV69WmHf7BUQ3QneGngbT0tN526SS5qDFwTGiuIlnYGWvTB2jVrbns68n/d8Fps8sSWfJBvvXJUEkaZB+1WqNilOPGXvyJ5k2O/iucFbRlxwlEHDny+AgsbtXZdp8cHQ4C/O4G0mnUMZuS38gn6e2kQ55mUhxKeORM+J6Rx1y4Iiu9KKNbxyS5eBpAlFB4xS/o35CS4g309vyOEhi37F24bpp4pM0xEPG4mcc/IyChHzaHUGEp1IX1ZO/r3ut9RIN2QWrGLUlZV/9rFKpLLAy6BkY/g8VYNrV8PztOL3rqy/qwqNZouONwPw8w8SA=', 130 data: '1znWPwc9JwCe7iOFiUd2iGm4xJd+824B4VRqEtzCQkW46tg25RWfo7XagvK46USB7t6pC8WMLU0M/EC47KucsfpWUqHGbseoXT/8g8E8GoLnIsk9qFyJG7LGd1sUvqBgszLZwjWWG3t9zifmpW5nY9GialBYNmeSLS3bg5xDH+eCEilUUfDe7zGuVSuu/XkHacv/DYUst97e+6u44F7H8Kv8dTywJZpqbmveNPeWfCej2aBXdVV616J5lIRaj2uIYuQYG7blYJh9KZ7yLStdPndl6h65hIJpfWo0PM8nLJuo0lWNHz7misrutnmxJEjkwVIZ5YAmqp1Zz3VC8zw4IxkXrC/sPmp4PaNXgKz9ZJRaY2KV69WmHf7BUQ3QneGngbT0tN526SS5qDFwTGiuIlnYGWvTB2jVrbns68n/d8Fps8sSWfJBvvXJUEkaZB+1WqNilOPGXvyJ5k2O/iucFbRlxwlEHDny+AgsbtXZdp8cHQ4C/O4G0mnUMZuS38gn6e2kQ55mUhxKeORM+J6Rx1y4Iiu9KKNbxyS5eBpAlFB4xS/o35CS4g309vyOEhi37F24bpp4pM0xEPG4mcc/IyChHzaHUGEp1IX1ZO/r3ut9RIN2QWrGLUlZV/9rFKpLLAy6BkY/g8VYNrV8PztOL3rqy/qwqNZouONwPw8w8SA=',
134 version: '0.3', 131 version: '0.3',
135 creationDate: 'Fri Oct 17 17:01:59 CEST 2008', 132 creationDate: 'Fri Oct 17 17:01:59 CEST 2008',
136 updateDate: 'Fri Oct 17 17:01:59 CEST 2008', 133 updateDate: 'Fri Oct 17 17:01:59 CEST 2008',
137 accessDate: 'Mon Oct 27 08:57:58 CET 2008' 134 accessDate: 'Mon Oct 27 08:57:58 CET 2008'
138 } 135 }
139 } 136 }
140 }, 137 },
141 '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551': { 138 '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551': {
142 data: '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', 139 data: '0/BjzyY6jeh71hwgASQphLMgnLz6WJJPg7sDskLKo5gCumpebgHBPqN0OPyHqTq4Lyt7Um++ckx2VA4yoX4cojXC7FBnscHtN18RlVNRvkfhhFPWBZhFwuVZxlFNb/IueDSjKR3dJahbTqao2AU3HXp0xOdsO5Mb2CfMz1/C4rtDuv5ee7GJNEv2hb2tBTzxbB8PZ/TKYZhlfgV3rJ2Hc509OeX/PuD8oYB7sUnB9UhDZP7pVY0Vz3LP/dFUf1cPGFh7bnxxYNphpJ2SxhIUdgxpmP6UCFxdLbCBXv13+7OlhCaO2eGfsO4Qch996otkSrVxfTvOTLuwiwSqU7hLlvOSzm9in69Rf35ZC7bKcZIdZkTNPeV0a+dR6j3LY7dBvIzd08OtBSqOdQqo/6isG8vaQPLVcWkFFZ//iHGgjTIduSoyzMb/y9cr8J1Qj1uTayUVAHQywCYdKgT4UccLoyt96vKHRcPCw6iepEfSrc3aZOtTg/aS3j2CGTih0i0gfrA4EbeQtIfobthsbTF6Oq5xjrIAMv2LRiJ+8JPj6xw8ODvM8SUN/3UxlYKsqDpWOW4tOztQAMSijoGtBswIl+mLr2p50Cul4n8ENfrilyAX4AcxUFSbH6tVd19ErQLsj+T2H5qhIF0Ifo5NxL9bj+Gx/5ul6dGH6Et9dvaHv+CZ3FKc7wrvItd6GXexc0SC16VfEOUps8yBahEHvNYAo/r5UG+wDCMhstHzEjiSV7TJ5ozjf+C2N+5A81TpJS+zfXhuiyupburyjYX8KQfXSvc28FG9CsgD9u9NcUuqC8L0K6MTB7k8RPSrG9xcBowqFDaH3/afLBsKWHEx87TiaZ7GbxKKmiINJk833pNZMYt36dr0fT0AH6WkvD4iSIWcFjvAHrW0CUBjOkhooAxjLDwNS4xBcgL0uGf61ygYBUH9zV+JqC3pullYzc7gL6Z1uKTdB9+Rzq/1NfZGUjVrsIepYO6k3Jf2j77qRNofSVtLr7VudUv297mIypV4jFNG/RoPFtQ2WSbHZIYIVepPCqWkQQ3VaaBZd8NToEYPjeSP7FQCrIjDtH5JVc649wgkEHdLS/q/lsToyCQh/47fiaEU/OJUX6UrzLG50J8+b+ijzIE3A3hZJf6nBnUbcUsEN1WzNHama57tMsWCUoxfcsZjEeSk8CzUjEFvxToKpESwRX7jDS7uWyRjuIHE56nuy7Rhzy7kP3hjE7eZQGMA7h3yxItDxa0hjvUO46IjZpmfyLIftSd323J9K7y9x3q0OGs6cNMNll+M8eSwHgooJbAGYjftIYVQ7t3l19LKEpnemXuObFFJQMvu6KQFRkHS3A2OROzC7hy3w5nSZP9Nqvygvc8Nj5x2IlHlK+pZeQi9E9WU6mGKIPzAOjSZg1FRLULUmahWgXGvJVIoVbHL1WX0/+g1BVsVcEZEAviRczTaFYVrH3zUIb0hql9p5EmHXwINnWMpbL1oh2LEsOUIpRCzjeBX1om6QCwyrXKzE5WkKcsQ7WbVvJf2q8Vdj3r3I8D9Kr+a7QqnAKm1GdwS+e5PcapxDzyhIAw0AsrOyWpIHFKvoJGl9/CWiD6Q+WxLDjG/KC3ms5P6hxY2Oxyakmmp0JGMtSIpOIV4cUyxfnFQ0LVX+vcrM9DpwZNHYLfyEVgg68xpLkUhUSHqYQhHgMe9oyFrzjmnU+EAzBY2vn7ZRrzxEowFipZpmlxFb81V9KRLT2l+3sUZ2yym7Y81HNdY4u1NKw2a3kwNryk0lID5FlbqvswxDJ60aWKFl2jrRW+EUoAX0mmGLk4lw1TYMKimngJap2ukwFky5/yn5KwCq4GjTkxzD35A52hFbDq5juINpyuFKb5X6sTkzxmIQ6d+1ePO6+kkN5RrZwjM2022BDoKJ95OyaR6kqUsIikDrgxHQUD6LR/2RMZapGa0B9klNlPm2phmQtAy3HLWfByXxRTHv7CP0keJl0f43LCHx/XPglb+QCs7mkgBIlp55xWugdKiBgMxzBkpjYWIXaaRkJcFrd8VmAwrXuRBvxVFzXh9/jHxuUMYv4WPaNX0SIhiNzaJsQCj5GRc4ftGD6Ot5rOaYjOxVM4yiFRzJMCgjCJPkL8EkU4l3M0GP3udgCfVqoHVFAAKmgdHB4o+hR4F8JA8U9+OCAMdZ+U0TL0oCcZPvQqVKi0b+5dePa8xTLYzOAuO7KF2TvKIujYqkumvg3zauUxxq7Ncklv+ddruQd3KAJ+H7rB9+g/6mTUpdyhNs91BD+QO0q3AYqmtTjSb6eJ2cmz7h6hA4xdg1Pel/sn+B3dePy7BVXLe/G2p5W34L0ZItuAJlIUo8JqE7IJ+BDJ2HPHMT4t/QIde6A76LDvKzalpZ5k5DXwnwGIj4DUdMXgYB8GdtTAhusOraNCNXTCyqU+EchYrO6o9UOURzd8wWj49jce/XROvWtKBuVbAXDNZzcIR8ALmpNTJKv0fz2Y/9/yxxvKN1dpBkLj+MpAw2++NEyylGhMC5C5f5m8pBApYziN84s4O3JQ3khW/1UttQl4=',
143 version: '0.2', 140 version: '0.2',
144 creationDate: 'Wed Mar 14 14:53:11 CET 2007', 141 creationDate: 'Wed Mar 14 14:53:11 CET 2007',
145 updateDate: 'Tue Apr 17 19:17:52 CEST 2007', 142 updateDate: 'Tue Apr 17 19:17:52 CEST 2007',
146 accessDate: 'Mon Jan 19 16:09:25 CET 2009', 143 accessDate: 'Mon Jan 19 16:09:25 CET 2009',
147 currentVersion: '88943d709c3ea2442d4f58eaaec6409276037e5a37e0a6d167b9dad9e947e854', 144 currentVersion: '88943d709c3ea2442d4f58eaaec6409276037e5a37e0a6d167b9dad9e947e854',
148 versions: { 145 versions: {
149 '106a1116d22c2395906a346da4d830c7afbd2da9a46210d0b7a11de238016783': { 146 '106a1116d22c2395906a346da4d830c7afbd2da9a46210d0b7a11de238016783': {
150 header: '####', 147 header: '####',
151 data: 'jgDUvByveAFnchBQKhiHGYDNDtj/7Aja2RePMer0FCOkkEu5GRAiLkxA3/DD3eiU+g+mCxnjnOaEIYL1O5o0+JP08XapsblZHTRKfveeFfs6sWwuqEHGYULBaXx4XSfK2B12HgpBwa5aD49489AkuyXi7t/aAXcKKJcLB1sC61DI3NsmajUaXHBi31Sp7nKAUpMuiWyguW0JVfH6KUPqyldVDBTBqHAis37c1qoR6aFHFfGgAfb35+syfmPRgemujMRkj2XO6dbt9zAYlHVSYFp9393rwPZoyBfXMMdDtSTmq7H9qbmx31GecHZlFN3NymtPPDYUbQ9mpPVRbxE9NjtiPrI5eGFvb++OdOx75PKjYjCAPWWFZ+4aryNn+h+yqab7pAuoG03ACVVrAFIOn09g1ssol/vqvalulEf3hAIviedyiNAC9D0UDHtzUwyIiELvR9qouXLZ', 148 data: 'jgDUvByveAFnchBQKhiHGYDNDtj/7Aja2RePMer0FCOkkEu5GRAiLkxA3/DD3eiU+g+mCxnjnOaEIYL1O5o0+JP08XapsblZHTRKfveeFfs6sWwuqEHGYULBaXx4XSfK2B12HgpBwa5aD49489AkuyXi7t/aAXcKKJcLB1sC61DI3NsmajUaXHBi31Sp7nKAUpMuiWyguW0JVfH6KUPqyldVDBTBqHAis37c1qoR6aFHFfGgAfb35+syfmPRgemujMRkj2XO6dbt9zAYlHVSYFp9393rwPZoyBfXMMdDtSTmq7H9qbmx31GecHZlFN3NymtPPDYUbQ9mpPVRbxE9NjtiPrI5eGFvb++OdOx75PKjYjCAPWWFZ+4aryNn+h+yqab7pAuoG03ACVVrAFIOn09g1ssol/vqvalulEf3hAIviedyiNAC9D0UDHtzUwyIiELvR9qouXLZ',
152 version: '0.2', 149 version: '0.2',
153 creationDate: 'Tue Apr 17 19:13:41 CEST 2007', 150 creationDate: 'Tue Apr 17 19:13:41 CEST 2007',
154 updateDate: 'Tue Apr 17 19:13:41 CEST 2007', 151 updateDate: 'Tue Apr 17 19:13:41 CEST 2007',
155 accessDate: 'Tue Apr 17 19:13:41 CEST 2007' 152 accessDate: 'Tue Apr 17 19:13:41 CEST 2007'
156 }, 153 },
157 '111a8a4b6b912b808a93cf5e8785ca223112628d05f0bfc5dfe1eb40cb72ed8a': { 154 '111a8a4b6b912b808a93cf5e8785ca223112628d05f0bfc5dfe1eb40cb72ed8a': {
158 header: '####', 155 header: '####',
159 data: 't524etHmXljCnLC+IM+WPD8Q5VE7wDsSHVNZzFU4hQzk119t/N/vhtfHYz5HgNstU5T8c7h7RHKvFk5f+4ZwgNgDqSH7H2PrH+7/bV8+uuqbe+/3GYOvELjTF7v3xMyYs1B7ruHpT+291HVNZqxajqCl/+9nbG0e5feqNsTXWUTdLzF0szJuCTNr2I+fhxAO0LRVaf8h+MBPYyuBDnfFDuKm899IsgF9YoYRvjaYO69DkElvf4VP2jrXIJsRnGIUfUaIS/wQ54+X4JBZM/9M09MVOw1SVe+cwG+P3xyPUkqnSb77ECo86C0MktzeYFmPnPv2SM2KFA6slctXsyudoaNlReh1k+6no5J5BjaawTfqYjYrAtWSPsuhxYVsZym/X2CVbkz4rMSn+J5Uio9N5uZ6AqgCKdhAJlwzVb3fIIJwvFpVpy/0LMskb7aG2i4eAxwzx1H6rD3Y', 156 data: 't524etHmXljCnLC+IM+WPD8Q5VE7wDsSHVNZzFU4hQzk119t/N/vhtfHYz5HgNstU5T8c7h7RHKvFk5f+4ZwgNgDqSH7H2PrH+7/bV8+uuqbe+/3GYOvELjTF7v3xMyYs1B7ruHpT+291HVNZqxajqCl/+9nbG0e5feqNsTXWUTdLzF0szJuCTNr2I+fhxAO0LRVaf8h+MBPYyuBDnfFDuKm899IsgF9YoYRvjaYO69DkElvf4VP2jrXIJsRnGIUfUaIS/wQ54+X4JBZM/9M09MVOw1SVe+cwG+P3xyPUkqnSb77ECo86C0MktzeYFmPnPv2SM2KFA6slctXsyudoaNlReh1k+6no5J5BjaawTfqYjYrAtWSPsuhxYVsZym/X2CVbkz4rMSn+J5Uio9N5uZ6AqgCKdhAJlwzVb3fIIJwvFpVpy/0LMskb7aG2i4eAxwzx1H6rD3Y',
160 version: '0.2', 157 version: '0.2',
161 creationDate: 'Wed Mar 14 14:53:11 CET 2007', 158 creationDate: 'Wed Mar 14 14:53:11 CET 2007',
162 updateDate: 'Wed Mar 14 14:53:11 CET 2007', 159 updateDate: 'Wed Mar 14 14:53:11 CET 2007',
163 accessDate: 'Wed Mar 14 15:24:35 CET 2007' 160 accessDate: 'Wed Mar 14 15:24:35 CET 2007'
164 }, 161 },
165 '144d6eff3eb5f1cb70c8906741d88018cdeeae3a618ac4066598ad6b04242364': { 162 '144d6eff3eb5f1cb70c8906741d88018cdeeae3a618ac4066598ad6b04242364': {
166 header: '####', 163 header: '####',
167 data: 'NPgSZF0eSOzy0/Ns+15Nz4bjSwh4o7fWYgKgwXLRFrF8y3EdbiOH7AiEmmPrCpT1raeYLWCcDIrRTz+/9uvIrz6kK6BjU2emr8YdyLai+PTCRY0SafWS3QiYixX6DJiKIt0SC2F6dfmSHwNsbfTHilFhVXn6wXTJpWvC+sRzw+h42cYpQp0BoLSuFV7vPz/+wtuQdl28BiBgLzGsrtPud0tPcfldGox6Ia/1SrOPcqUr0tnFlNQiUvPU7N0JZgRNyr1PfpAEhmYRI7aEJidsZ36vGQpE0ZQMmQE/9tLS/InALRZT1YXfMsytf0o3y4QlgJrvRgBL7fGiQOZJpU7igLk15xAwU+OLIaYIbr2xlKDJvndHOcrFoYKry9/A/aZSnEYv79wsaf64bBgIVD2WJGLuSFFmzlFnbg/O4kGTin3A8XBpvFA9V6iCMvnEMkrqxD3Qgf7WhxFE1A==', 164 data: 'NPgSZF0eSOzy0/Ns+15Nz4bjSwh4o7fWYgKgwXLRFrF8y3EdbiOH7AiEmmPrCpT1raeYLWCcDIrRTz+/9uvIrz6kK6BjU2emr8YdyLai+PTCRY0SafWS3QiYixX6DJiKIt0SC2F6dfmSHwNsbfTHilFhVXn6wXTJpWvC+sRzw+h42cYpQp0BoLSuFV7vPz/+wtuQdl28BiBgLzGsrtPud0tPcfldGox6Ia/1SrOPcqUr0tnFlNQiUvPU7N0JZgRNyr1PfpAEhmYRI7aEJidsZ36vGQpE0ZQMmQE/9tLS/InALRZT1YXfMsytf0o3y4QlgJrvRgBL7fGiQOZJpU7igLk15xAwU+OLIaYIbr2xlKDJvndHOcrFoYKry9/A/aZSnEYv79wsaf64bBgIVD2WJGLuSFFmzlFnbg/O4kGTin3A8XBpvFA9V6iCMvnEMkrqxD3Qgf7WhxFE1A==',
168 version: '0.2', 165 version: '0.2',
169 creationDate: 'Wed Mar 14 15:33:00 CET 2007', 166 creationDate: 'Wed Mar 14 15:33:00 CET 2007',
170 updateDate: 'Wed Mar 14 15:33:00 CET 2007', 167 updateDate: 'Wed Mar 14 15:33:00 CET 2007',
171 accessDate: 'Tue Apr 17 19:12:56 CEST 2007' 168 accessDate: 'Tue Apr 17 19:12:56 CEST 2007'
172 }, 169 },
173 '1f1bdb7a21440ac20c6d913d676aa30dc360252d27059e77df51a1be36b2e263': { 170 '1f1bdb7a21440ac20c6d913d676aa30dc360252d27059e77df51a1be36b2e263': {
174 header: '####', 171 header: '####',
175 data: 'TaOHH6IoHPKLLoyLyvsBszgsPPcDs6CiLVXzXuXjFSTrhPxzUw9suSsisgDRRs0ncjZ6BCyqoCxMnw6QVvGN4viUwYVR8AWdCg0NMQZ+LkNfq/2WN0M3KyASI8sIdMCwTb57NzOn9soB1HmmmETZfjr7HpY2cc+lS5/4f5rxI8XTEK60lLed+aEuJamAjeZUdgIyu30mMKKjxPfY3Y9iWMwn1OD0zF0mAW+hyEoMhhK7EYlWKCy+4qN0QM+yNFXQyERb04o2n4XrM+qr9df1GtbQMH8igK5VzXIrKjdHjKoLo9G7D7mfx6mRLsmoAJuE0R8gyzotgdBpOgWasHJ82iWEa1dLRKBHJ1d0Lnumv22tvYfasx2DIR5Tmx3kIQ3hFieLSXq48cYMiaZH/IbLiapIOlMgtWDow8JuySBLei/8FAV8jCxSc1Ui/SjbuK/kCvywaSOhDVIxGw==', 172 data: 'TaOHH6IoHPKLLoyLyvsBszgsPPcDs6CiLVXzXuXjFSTrhPxzUw9suSsisgDRRs0ncjZ6BCyqoCxMnw6QVvGN4viUwYVR8AWdCg0NMQZ+LkNfq/2WN0M3KyASI8sIdMCwTb57NzOn9soB1HmmmETZfjr7HpY2cc+lS5/4f5rxI8XTEK60lLed+aEuJamAjeZUdgIyu30mMKKjxPfY3Y9iWMwn1OD0zF0mAW+hyEoMhhK7EYlWKCy+4qN0QM+yNFXQyERb04o2n4XrM+qr9df1GtbQMH8igK5VzXIrKjdHjKoLo9G7D7mfx6mRLsmoAJuE0R8gyzotgdBpOgWasHJ82iWEa1dLRKBHJ1d0Lnumv22tvYfasx2DIR5Tmx3kIQ3hFieLSXq48cYMiaZH/IbLiapIOlMgtWDow8JuySBLei/8FAV8jCxSc1Ui/SjbuK/kCvywaSOhDVIxGw==',
176 version: '0.2', 173 version: '0.2',
177 creationDate: 'Wed Mar 14 15:26:35 CET 2007', 174 creationDate: 'Wed Mar 14 15:26:35 CET 2007',
178 updateDate: 'Wed Mar 14 15:26:35 CET 2007', 175 updateDate: 'Wed Mar 14 15:26:35 CET 2007',
179 accessDate: 'Wed Mar 14 15:26:35 CET 2007' 176 accessDate: 'Wed Mar 14 15:26:35 CET 2007'
180 }, 177 },
181 '70720f026f37b571e9765d27c51d3d60c7be0293c3266f1f987c8de9c6b5c416': { 178 '70720f026f37b571e9765d27c51d3d60c7be0293c3266f1f987c8de9c6b5c416': {
182 header: '####', 179 header: '####',
183 data: 'NYaYljcgfzrlN1DVgrbyj4AeVhXGjXPho3IQwEKD3ZOx/yEZxldCNSyFsrk7PoRB8Q1T/6VV4CGa4HLRSB7QVCrtVqWyu4KbbmFoX8NIQ0H3xv+TSo3S/b3dldUeyW32ScaGbspaf8nFf0CffsgpGusd+kHdiE3gSLJvH9y5j47KgpyyX4TteVzqgez4dcXIs5tdzJq2eUlknwU4651QeKIuRSmRaDRhhOP4yRgUo/qXMlTJFmHviCh+IumvBdmDoPe3Vc1vZ1r8PxpDJLvDoB8GTDE42NhqHfVrew9ym1xlTD9wswwIEikfOyTq3JM857qPOHRqSqthEvr4WHbm1VW5PReIyse0lugGyOzqtCnADp9NvNI440VjaTd4NBQqF7XrRm56+1u1uTdfYGFV5BRiH1KmrM1sxXQ6PlOF9Lou45ALo20xxvJOLKG0RKLMr8gmVT2bNtOSJw==', 180 data: 'NYaYljcgfzrlN1DVgrbyj4AeVhXGjXPho3IQwEKD3ZOx/yEZxldCNSyFsrk7PoRB8Q1T/6VV4CGa4HLRSB7QVCrtVqWyu4KbbmFoX8NIQ0H3xv+TSo3S/b3dldUeyW32ScaGbspaf8nFf0CffsgpGusd+kHdiE3gSLJvH9y5j47KgpyyX4TteVzqgez4dcXIs5tdzJq2eUlknwU4651QeKIuRSmRaDRhhOP4yRgUo/qXMlTJFmHviCh+IumvBdmDoPe3Vc1vZ1r8PxpDJLvDoB8GTDE42NhqHfVrew9ym1xlTD9wswwIEikfOyTq3JM857qPOHRqSqthEvr4WHbm1VW5PReIyse0lugGyOzqtCnADp9NvNI440VjaTd4NBQqF7XrRm56+1u1uTdfYGFV5BRiH1KmrM1sxXQ6PlOF9Lou45ALo20xxvJOLKG0RKLMr8gmVT2bNtOSJw==',
184 version: '0.2', 181 version: '0.2',
185 creationDate: 'Wed Mar 14 15:30:09 CET 2007', 182 creationDate: 'Wed Mar 14 15:30:09 CET 2007',
186 updateDate: 'Wed Mar 14 15:30:09 CET 2007', 183 updateDate: 'Wed Mar 14 15:30:09 CET 2007',
187 accessDate: 'Wed Mar 14 15:30:09 CET 2007' 184 accessDate: 'Wed Mar 14 15:30:09 CET 2007'
188 }, 185 },
189 '88943d709c3ea2442d4f58eaaec6409276037e5a37e0a6d167b9dad9e947e854': { 186 '88943d709c3ea2442d4f58eaaec6409276037e5a37e0a6d167b9dad9e947e854': {
190 header: '####', 187 header: '####',
191 data: 'xI3WXddQLFtLVzxJaZWQaw8wAgSuXLjLnyoNXnFuLecTH0BzU36PatglVh2HK3LM8aDLzzbHILdlLNnJ9CY+YnhmGh8hswF9oKTgq0Wsesgdc20QhSMNFFjmMljY1LSXmcAYK04Q5mIzi6Pe/04DRdj+e4zbe5QI4vEBhp/ohEpxZnNqc4BoX6J0eVf6LA1pwrKWvxzMxorWsJrrr+mn3svdlF437n+MMr89k5sQJogufes2GZ9tTvVZ4247ITxXqxgAhwXtbuIs/A5UqqnNdsxlHfpLKG5KjxB6F0h7TtFA3gkZCve5UmAibBnoBCFaIVWQyVq+VO9iqDm3DeXsK2pepvgIvpSID8Poy+uwN7T95mivAsHG5p7MtgN9KwQzNW3Iu+BfO9FlPBMngSk8L29So2CIXe6lEsXSGEi5Yrgyo6hZi6IkGCXwIQ7TCEMnlQEGyKnnAVik', 188 data: 'xI3WXddQLFtLVzxJaZWQaw8wAgSuXLjLnyoNXnFuLecTH0BzU36PatglVh2HK3LM8aDLzzbHILdlLNnJ9CY+YnhmGh8hswF9oKTgq0Wsesgdc20QhSMNFFjmMljY1LSXmcAYK04Q5mIzi6Pe/04DRdj+e4zbe5QI4vEBhp/ohEpxZnNqc4BoX6J0eVf6LA1pwrKWvxzMxorWsJrrr+mn3svdlF437n+MMr89k5sQJogufes2GZ9tTvVZ4247ITxXqxgAhwXtbuIs/A5UqqnNdsxlHfpLKG5KjxB6F0h7TtFA3gkZCve5UmAibBnoBCFaIVWQyVq+VO9iqDm3DeXsK2pepvgIvpSID8Poy+uwN7T95mivAsHG5p7MtgN9KwQzNW3Iu+BfO9FlPBMngSk8L29So2CIXe6lEsXSGEi5Yrgyo6hZi6IkGCXwIQ7TCEMnlQEGyKnnAVik',
192 version: '0.2', 189 version: '0.2',
193 creationDate: 'Tue Apr 17 19:17:52 CEST 2007', 190 creationDate: 'Tue Apr 17 19:17:52 CEST 2007',
194 updateDate: 'Tue Apr 17 19:17:52 CEST 2007', 191 updateDate: 'Tue Apr 17 19:17:52 CEST 2007',
195 accessDate: 'Mon Jan 19 16:09:25 CET 2009' 192 accessDate: 'Mon Jan 19 16:09:25 CET 2009'
196 }, 193 },
197 '9588b523f39cdfc14efa1e15ea7716c2d8eac45d8efd7bfeb19d716f9df72d66': { 194 '9588b523f39cdfc14efa1e15ea7716c2d8eac45d8efd7bfeb19d716f9df72d66': {
198 header: '####', 195 header: '####',
199 data: 'q6DKkxhgDFs1XkqOYf6dvojPF+yhJbniTLFpSOS+I1sum3EZIJfYxJXyi2Jx3KOVNBMILw1+vrSLe/fh5SSWj8ZBoeppkPPLjyRNdiUyd4IfcRM5OSv2YcTxCubKCH2kIMFAzY/29A6ZGPG+AN8/kxkEHc1fxKaNcj2Cs8qejNR8yK1iKT1Ut9VfEee+Eqy2Ohgdq8wL/xAD5mUzdqHeQl8BY16pXGIYncLxMzR+EJ8E5jJTuGv3O41UbO31lvBSfCt2pfz2MrtsuqNoI8LBHJkcR6t17Bj+rHZUniHlyxSW/1rQJ1NnwpPgUJ1fhfQJZM8Faoif+0bvWFY4xWs/tCCD7oEvf0xM0I3FfcJLbYX8M+wyO08t9BmGdEjnr3VUcuS9qKaJRpdpMP7aQf+vJvioeQDXdOJ6Ceo3BDFc6JdNta1Qc+agGzN2KPbIPrLDL+08hWl61yu3GQ==', 196 data: 'q6DKkxhgDFs1XkqOYf6dvojPF+yhJbniTLFpSOS+I1sum3EZIJfYxJXyi2Jx3KOVNBMILw1+vrSLe/fh5SSWj8ZBoeppkPPLjyRNdiUyd4IfcRM5OSv2YcTxCubKCH2kIMFAzY/29A6ZGPG+AN8/kxkEHc1fxKaNcj2Cs8qejNR8yK1iKT1Ut9VfEee+Eqy2Ohgdq8wL/xAD5mUzdqHeQl8BY16pXGIYncLxMzR+EJ8E5jJTuGv3O41UbO31lvBSfCt2pfz2MrtsuqNoI8LBHJkcR6t17Bj+rHZUniHlyxSW/1rQJ1NnwpPgUJ1fhfQJZM8Faoif+0bvWFY4xWs/tCCD7oEvf0xM0I3FfcJLbYX8M+wyO08t9BmGdEjnr3VUcuS9qKaJRpdpMP7aQf+vJvioeQDXdOJ6Ceo3BDFc6JdNta1Qc+agGzN2KPbIPrLDL+08hWl61yu3GQ==',
200 version: '0.2', 197 version: '0.2',
201 creationDate: 'Wed Mar 14 15:27:35 CET 2007', 198 creationDate: 'Wed Mar 14 15:27:35 CET 2007',
202 updateDate: 'Wed Mar 14 15:27:35 CET 2007', 199 updateDate: 'Wed Mar 14 15:27:35 CET 2007',
203 accessDate: 'Wed Mar 14 15:27:35 CET 2007' 200 accessDate: 'Wed Mar 14 15:27:35 CET 2007'
204 }, 201 },
205 'e5b71df0d4d79a195c7ec3288dd7738069837a7c4da3bccc1ebc05d8e4f19d79': { 202 'e5b71df0d4d79a195c7ec3288dd7738069837a7c4da3bccc1ebc05d8e4f19d79': {
206 header: '####', 203 header: '####',
207 data: '1NvK9Y5r0Q880BfB1W5IqdOR77mmqQU0d1GL1XUeQT75R2EgYE9rK1X1jLygCXboPhxzegEe7TDhUsn5XcHN0LkXcLYz8gD/7+He2HiTFxoHd2oQbI3ceBxDJ7+5kWA6Aiqy42QSCuA+TWIQcDVthSyFU7nNdqNxeBYeXiI4jgwcH3xvm0+pBf1OYLtywjUK1JwntP6o68b1LMQJFinDG+sqRcm25ggaZyxDtoLh1IBdSpmXk0papRnyyTGNgsws78dLxnH0Iqxb7FhqYfgLDIvN3i7+IALI0lF0EuTS0hSPlr/1fTz1/6bVt++wI9GpUsrdafUJJMPerXoCK+gAP8EMneLq4f5487HIkwWh1qON6Hvpg+tB95NOSJpqE72VpVxN4+wTQWyDMhfjqXBuQ1wKvTsD/mUsdinU0Wb/YT/zIWBNZPdqur0rjOC+mrOtSdlYSCH89Jj2', 204 data: '1NvK9Y5r0Q880BfB1W5IqdOR77mmqQU0d1GL1XUeQT75R2EgYE9rK1X1jLygCXboPhxzegEe7TDhUsn5XcHN0LkXcLYz8gD/7+He2HiTFxoHd2oQbI3ceBxDJ7+5kWA6Aiqy42QSCuA+TWIQcDVthSyFU7nNdqNxeBYeXiI4jgwcH3xvm0+pBf1OYLtywjUK1JwntP6o68b1LMQJFinDG+sqRcm25ggaZyxDtoLh1IBdSpmXk0papRnyyTGNgsws78dLxnH0Iqxb7FhqYfgLDIvN3i7+IALI0lF0EuTS0hSPlr/1fTz1/6bVt++wI9GpUsrdafUJJMPerXoCK+gAP8EMneLq4f5487HIkwWh1qON6Hvpg+tB95NOSJpqE72VpVxN4+wTQWyDMhfjqXBuQ1wKvTsD/mUsdinU0Wb/YT/zIWBNZPdqur0rjOC+mrOtSdlYSCH89Jj2',
208 version: '0.2', 205 version: '0.2',
209 creationDate: 'Tue Apr 17 19:15:09 CEST 2007', 206 creationDate: 'Tue Apr 17 19:15:09 CEST 2007',
210 updateDate: 'Tue Apr 17 19:15:09 CEST 2007', 207 updateDate: 'Tue Apr 17 19:15:09 CEST 2007',
211 accessDate: 'Tue Apr 17 19:17:01 CEST 2007' 208 accessDate: 'Tue Apr 17 19:17:01 CEST 2007'
212 } 209 }
213 } 210 }
214 }, 211 },
215 '36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113': { 212 '36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113': {
216 data: '6fhueIibbxKRA7Mtb9TPcWiUKajnikM3D7PbOROBkE39Vw9E/nG8KrtJlwwPQeOGCFhssO/KX3ymYehCR8rfaEL1f9pfdh5x69mSxKRlOmtEknWqUgPzcb1yPenRbQagERadh0LF4zu91M4WjXK9qynEHoxI/pBhwQb1IsnhwtXl4ELtajudv+2Hv3p75v4XOXFsGQMsHPY+Zw7dkFFA8EXhvuxjiGvnxCUkFwNICFRdHTEovkW3VSerLdrYo5lDgjY6ebr/g7wDGuu4RLfUK4+HpzFwZ0+aOrjpFq2ePg2xObvkkMNNjZ2PcR6Cue0sf+aNqzIHIlFPpY2Hmrob8+bwxocKA6aagBu7z5GiUmZNXGE/Vtr/WWBV2+xIJyzXZPet0MLmSnGiALjPJveeKnnFdDtA929ydcAb8efc0/snfU/uDoXDiO5SWEQ8DDNjj1bSo7VPTtvZyFormE1KjqimqSwaUJzbIS4CxPnoDezaBtQmlG4z8mc8jXq1HfPu7s9PUzcbG30gbF0ch2pDj4h47AhE0ZoeiV+VYZTaYateSifQXKBQKjPcuh9PQyDI0HVua3itbbwxXpRubEM4fbvlcd+7gu+Zq03slYICD07fP0I6XGrRHVTfYpDbEb4GJBvRIeZLwRTQzOeFbPLpBU9Lv3zXxfHfcHy9oK+giIxefPdY1ZR2ZFPKOO0xYJsTr0vmTuXeXzy56bKl+yP2lFst5l9QG8j2JcQEotDV1KQS6mbcLjfIpEnltu5fc2t10Q25Noh+F3kF+LcMIYsDjwanojYlOC93mZl01hmSJdimRTk9otjlRTyC7NWwiyy7fe5IyVi7ACNPZyeUYJUPtKWcPbT73Vtf8W3/+HdhmyYNyMQ9PDCBb9WKMon+qW2+ZVH5yv/KqMHRY1fflAfxpHNhrCkwqcAAGw+G/cetbvQjpkfVT2/u/uLupMsITN2Tgvr/8D2IMm3cyDBUCshrp0AfzARRygHFK4x/0uLfCtQSNjw6zMK8mn80R5aS5bZi5gRS8JBMZ4Q0iG4kBlLpIYtsXSBwl8faljjdl/4XvNNWWrdGJn2k0eM4cESlOFFk4s3Yu0Zspo17nKAHINjHAiP3VlhuKSnk5C9hMU5i3vZO8anQmx9UEwUgQVm22azCjyNtUl6jVPYSNsal7A==', 213 data: '6fhueIibbxKRA7Mtb9TPcWiUKajnikM3D7PbOROBkE39Vw9E/nG8KrtJlwwPQeOGCFhssO/KX3ymYehCR8rfaEL1f9pfdh5x69mSxKRlOmtEknWqUgPzcb1yPenRbQagERadh0LF4zu91M4WjXK9qynEHoxI/pBhwQb1IsnhwtXl4ELtajudv+2Hv3p75v4XOXFsGQMsHPY+Zw7dkFFA8EXhvuxjiGvnxCUkFwNICFRdHTEovkW3VSerLdrYo5lDgjY6ebr/g7wDGuu4RLfUK4+HpzFwZ0+aOrjpFq2ePg2xObvkkMNNjZ2PcR6Cue0sf+aNqzIHIlFPpY2Hmrob8+bwxocKA6aagBu7z5GiUmZNXGE/Vtr/WWBV2+xIJyzXZPet0MLmSnGiALjPJveeKnnFdDtA929ydcAb8efc0/snfU/uDoXDiO5SWEQ8DDNjj1bSo7VPTtvZyFormE1KjqimqSwaUJzbIS4CxPnoDezaBtQmlG4z8mc8jXq1HfPu7s9PUzcbG30gbF0ch2pDj4h47AhE0ZoeiV+VYZTaYateSifQXKBQKjPcuh9PQyDI0HVua3itbbwxXpRubEM4fbvlcd+7gu+Zq03slYICD07fP0I6XGrRHVTfYpDbEb4GJBvRIeZLwRTQzOeFbPLpBU9Lv3zXxfHfcHy9oK+giIxefPdY1ZR2ZFPKOO0xYJsTr0vmTuXeXzy56bKl+yP2lFst5l9QG8j2JcQEotDV1KQS6mbcLjfIpEnltu5fc2t10Q25Noh+F3kF+LcMIYsDjwanojYlOC93mZl01hmSJdimRTk9otjlRTyC7NWwiyy7fe5IyVi7ACNPZyeUYJUPtKWcPbT73Vtf8W3/+HdhmyYNyMQ9PDCBb9WKMon+qW2+ZVH5yv/KqMHRY1fflAfxpHNhrCkwqcAAGw+G/cetbvQjpkfVT2/u/uLupMsITN2Tgvr/8D2IMm3cyDBUCshrp0AfzARRygHFK4x/0uLfCtQSNjw6zMK8mn80R5aS5bZi5gRS8JBMZ4Q0iG4kBlLpIYtsXSBwl8faljjdl/4XvNNWWrdGJn2k0eM4cESlOFFk4s3Yu0Zspo17nKAHINjHAiP3VlhuKSnk5C9hMU5i3vZO8anQmx9UEwUgQVm22azCjyNtUl6jVPYSNsal7A==',
217 version: '0.3', 214 version: '0.3',
218 creationDate: 'Wed Mar 14 18:39:35 CET 2007', 215 creationDate: 'Wed Mar 14 18:39:35 CET 2007',
219 updateDate: 'Mon Oct 27 09:16:14 CET 2008', 216 updateDate: 'Mon Oct 27 09:16:14 CET 2008',
220 accessDate: 'Mon Jan 19 16:09:35 CET 2009', 217 accessDate: 'Mon Jan 19 16:09:35 CET 2009',
221 currentVersion: 'a96a6d8b9ac73fcdf874d8a8534ffb2d43da8f5222e96a4a29bd2ae437619463', 218 currentVersion: 'a96a6d8b9ac73fcdf874d8a8534ffb2d43da8f5222e96a4a29bd2ae437619463',
222 versions: { 219 versions: {
223 '381201fd3b67549bd6630841e8902be1499f3ff0c3514dd464ad9679f22f3561': { 220 '381201fd3b67549bd6630841e8902be1499f3ff0c3514dd464ad9679f22f3561': {
224 header: '####', 221 header: '####',
225 data: 'DgjIW4YcJAYnckuEUzBFkfEC841LuanGopPgp+YkyMn3xuzdpGq/ObLFMVQaeAuyErh1B0REHPbq0E/SRUZbeXLXWN720GU4GXvY5bnen2h7pHvl/H4yz+kvyKh3EHJmmBjuz8s0kclFJQB48lter+G93TEmUaFke9c9m0IkKlgzwZ/PQKZyIyfZA09KFaozdSxdFRbswZj2Vq8Df2PQsKLapZWX1wYQ3lXOcyvNdTULy9MCXwPwX6te6hTLWxQOiSPsvB8LItlhQUsSbrJcJEvWPlBupPu5SeI25zDnqKDETPep63Ks2GWf45nXZzYYmQMzL0l2cenYFxlE18TcOd1Ms24TQ/iDKMhi60zZoo13qjVT5AKZ80KNu46t08qbACxjv/LeK2aM5TNycTFixGskPywpnb6MCo8ibRe5rs1WcTJRMD04sNoiuriivO2fiyo4rxjfdyfueMlOz+Zeztk=', 222 data: 'DgjIW4YcJAYnckuEUzBFkfEC841LuanGopPgp+YkyMn3xuzdpGq/ObLFMVQaeAuyErh1B0REHPbq0E/SRUZbeXLXWN720GU4GXvY5bnen2h7pHvl/H4yz+kvyKh3EHJmmBjuz8s0kclFJQB48lter+G93TEmUaFke9c9m0IkKlgzwZ/PQKZyIyfZA09KFaozdSxdFRbswZj2Vq8Df2PQsKLapZWX1wYQ3lXOcyvNdTULy9MCXwPwX6te6hTLWxQOiSPsvB8LItlhQUsSbrJcJEvWPlBupPu5SeI25zDnqKDETPep63Ks2GWf45nXZzYYmQMzL0l2cenYFxlE18TcOd1Ms24TQ/iDKMhi60zZoo13qjVT5AKZ80KNu46t08qbACxjv/LeK2aM5TNycTFixGskPywpnb6MCo8ibRe5rs1WcTJRMD04sNoiuriivO2fiyo4rxjfdyfueMlOz+Zeztk=',
226 version: '0.2', 223 version: '0.2',
227 creationDate: 'Wed Mar 14 18:39:55 CET 2007', 224 creationDate: 'Wed Mar 14 18:39:55 CET 2007',
228 updateDate: 'Wed Mar 14 18:39:55 CET 2007', 225 updateDate: 'Wed Mar 14 18:39:55 CET 2007',
229 accessDate: 'Mon Oct 27 09:07:56 CET 2008' 226 accessDate: 'Mon Oct 27 09:07:56 CET 2008'
230 }, 227 },
231 '99dc86ebeb20a3db0c5393d6d94bc1150187b04316a876970dbbcf517b55d6f2': { 228 '99dc86ebeb20a3db0c5393d6d94bc1150187b04316a876970dbbcf517b55d6f2': {
232 header: '####', 229 header: '####',
233 data: 'AJwqCWNKC9z8DC4TUI0hWnqHvQ40Y/x+jXylnVAkyO2QYQcqg51odLFSfgP0GiGEGPYwDc+kUxRrfO+ITgTNm+hHi2iIWkP/ljAC+AQ56MAEKsU/USTbvl6ShZ0XTAdRpwI/oqqOhYThVs6jTm/J8+lx4tWoMtNj835py88c/9eW26pLQubr7VysLSWuIMi+iDp7zXZZz/0gxGKDe5xNq4MGIYw8/OK1iJCOsjBdrRygLlS/Mz9sRlKkwdrDsohtRG0F/NdsIoaU4FttGs/rY91SCedvHy6ovh0zXhxOO44O6MiMbP085D1jCjWJn9S1RBxjxc368MGfMJeZja87nuvgSnLS2tGDL6zFtVJMNcH/7GqQPXZv/sNEykDNWpypchCnwYUJxvBVb45FcUzagPm+SSiekWK1hrEntZkZuEhQZp7Ud9RcENpa5h7wXUJSV1vPl8xBylx9HWmxez7D9OYRqbOlCRAEDqup4ahNhYB9', 230 data: 'AJwqCWNKC9z8DC4TUI0hWnqHvQ40Y/x+jXylnVAkyO2QYQcqg51odLFSfgP0GiGEGPYwDc+kUxRrfO+ITgTNm+hHi2iIWkP/ljAC+AQ56MAEKsU/USTbvl6ShZ0XTAdRpwI/oqqOhYThVs6jTm/J8+lx4tWoMtNj835py88c/9eW26pLQubr7VysLSWuIMi+iDp7zXZZz/0gxGKDe5xNq4MGIYw8/OK1iJCOsjBdrRygLlS/Mz9sRlKkwdrDsohtRG0F/NdsIoaU4FttGs/rY91SCedvHy6ovh0zXhxOO44O6MiMbP085D1jCjWJn9S1RBxjxc368MGfMJeZja87nuvgSnLS2tGDL6zFtVJMNcH/7GqQPXZv/sNEykDNWpypchCnwYUJxvBVb45FcUzagPm+SSiekWK1hrEntZkZuEhQZp7Ud9RcENpa5h7wXUJSV1vPl8xBylx9HWmxez7D9OYRqbOlCRAEDqup4ahNhYB9',
234 version: '0.3', 231 version: '0.3',
235 creationDate: 'Mon Oct 27 09:09:11 CET 2008', 232 creationDate: 'Mon Oct 27 09:09:11 CET 2008',
236 updateDate: 'Mon Oct 27 09:09:11 CET 2008', 233 updateDate: 'Mon Oct 27 09:09:11 CET 2008',
237 accessDate: 'Mon Oct 27 09:15:58 CET 2008' 234 accessDate: 'Mon Oct 27 09:15:58 CET 2008'
238 }, 235 },
239 '9fbfcd3e7fe30d549a813f0e6c1be58ed45c3ae7305d7367bffefa097b424ee6': { 236 '9fbfcd3e7fe30d549a813f0e6c1be58ed45c3ae7305d7367bffefa097b424ee6': {
240 header: '####', 237 header: '####',
241 data: 'nZ+Lc5LWWLxnPvUrRrHhxG35PHq7GMbVENHfV1oS0Qw7/63NecssNoEbiOwFVMjAshvfUK7IjnzyvfQhNtFRbj2yzHOTWCd0eJ0O0MmvGzjpUntSDu9/G8RFeEu9jDKugwi/NhOa5legjT9pcsEAqR4s4NN/Ac6juQb6D/Z6Wd6wO0JQhT5/QPk1KllDpDeo2i/GPUKvEi/dXpik0KQcVLVylU82rf6hwEgvRQi+j0O5hnFW1E4ttxClrnPBEBv60jkNwcIpD0r+rvomDe8+398xUuB4DVDJoM+WUYfu6Sm3qI0yBfET+tJvjn8WsHhKTgZpOc2BXC7EdF99nNEg6kV5pSxV6AUA1XUz5kW+YfcSzAXzUH74OqroC0SucHe4+BtRKnbJy4h5vRfjTD+FJaj1Va02cxSR55tQhxm/k67z0QeyB98dnU1l/pPHwBlIWa1eR74gswNSeQ2jrzu5JeQ=', 238 data: 'nZ+Lc5LWWLxnPvUrRrHhxG35PHq7GMbVENHfV1oS0Qw7/63NecssNoEbiOwFVMjAshvfUK7IjnzyvfQhNtFRbj2yzHOTWCd0eJ0O0MmvGzjpUntSDu9/G8RFeEu9jDKugwi/NhOa5legjT9pcsEAqR4s4NN/Ac6juQb6D/Z6Wd6wO0JQhT5/QPk1KllDpDeo2i/GPUKvEi/dXpik0KQcVLVylU82rf6hwEgvRQi+j0O5hnFW1E4ttxClrnPBEBv60jkNwcIpD0r+rvomDe8+398xUuB4DVDJoM+WUYfu6Sm3qI0yBfET+tJvjn8WsHhKTgZpOc2BXC7EdF99nNEg6kV5pSxV6AUA1XUz5kW+YfcSzAXzUH74OqroC0SucHe4+BtRKnbJy4h5vRfjTD+FJaj1Va02cxSR55tQhxm/k67z0QeyB98dnU1l/pPHwBlIWa1eR74gswNSeQ2jrzu5JeQ=',
242 version: '0.2', 239 version: '0.2',
243 creationDate: 'Wed Mar 14 18:39:35 CET 2007', 240 creationDate: 'Wed Mar 14 18:39:35 CET 2007',
244 updateDate: 'Wed Mar 14 18:39:35 CET 2007', 241 updateDate: 'Wed Mar 14 18:39:35 CET 2007',
245 accessDate: 'Wed Mar 14 18:39:35 CET 2007' 242 accessDate: 'Wed Mar 14 18:39:35 CET 2007'
246 }, 243 },
247 'a96a6d8b9ac73fcdf874d8a8534ffb2d43da8f5222e96a4a29bd2ae437619463': { 244 'a96a6d8b9ac73fcdf874d8a8534ffb2d43da8f5222e96a4a29bd2ae437619463': {
248 header: '####', 245 header: '####',
249 data: 'm3yhZu81UAjCY6U2Knrgg8mK+LX35Y/iZgIEm8MuRDAlg6UUz9Z1Anu63COFV08YyYQRuBzTgR9YQ8wrUD1S9FG2ZmtCDemqvd+5OUMgdn4sK7G3CuzAc5osOa5neU2m4y19WuobkGnhO78ko7pVVjO42q0DeMT92uFL6KE/2UCkWlq5SdFyS5qXEJEWs2IO5C8nVpdlO/eZ36Pl2+v+afl3QQMTthCVIUR4/zVP2ajbO48yjDXhYxzskFjtXMYLApEn0wO0dcifcsYhPkozz6Locrt/R6IZXnfZfuW5XXHbqhutoJFPK6L6t0Ib3B2r1TNkPaMsVs2g5V1g3ENRd0IlbG/uBk2o5tgeu6gOYlA1scEiL+/ad9ZxiqYB2ENCGZ8DXA4VNMnzxVPbO96OIUCb9suV0fldGOg=', 246 data: 'm3yhZu81UAjCY6U2Knrgg8mK+LX35Y/iZgIEm8MuRDAlg6UUz9Z1Anu63COFV08YyYQRuBzTgR9YQ8wrUD1S9FG2ZmtCDemqvd+5OUMgdn4sK7G3CuzAc5osOa5neU2m4y19WuobkGnhO78ko7pVVjO42q0DeMT92uFL6KE/2UCkWlq5SdFyS5qXEJEWs2IO5C8nVpdlO/eZ36Pl2+v+afl3QQMTthCVIUR4/zVP2ajbO48yjDXhYxzskFjtXMYLApEn0wO0dcifcsYhPkozz6Locrt/R6IZXnfZfuW5XXHbqhutoJFPK6L6t0Ib3B2r1TNkPaMsVs2g5V1g3ENRd0IlbG/uBk2o5tgeu6gOYlA1scEiL+/ad9ZxiqYB2ENCGZ8DXA4VNMnzxVPbO96OIUCb9suV0fldGOg=',
250 version: '0.3', 247 version: '0.3',
251 creationDate: 'Mon Oct 27 09:16:14 CET 2008', 248 creationDate: 'Mon Oct 27 09:16:14 CET 2008',
252 updateDate: 'Mon Oct 27 09:16:14 CET 2008', 249 updateDate: 'Mon Oct 27 09:16:14 CET 2008',
253 accessDate: 'Mon Jan 19 16:09:35 CET 2009' 250 accessDate: 'Mon Jan 19 16:09:35 CET 2009'
254 } 251 }
255 } 252 }
256 }, 253 },
257 '507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a': { 254 '507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a': {
258 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', 255 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',
259 version: '0.2', 256 version: '0.2',
260 creationDate: 'Wed Mar 14 16:01:24 CET 2007', 257 creationDate: 'Wed Mar 14 16:01:24 CET 2007',
261 updateDate: 'Wed Mar 14 16:01:24 CET 2007', 258 updateDate: 'Wed Mar 14 16:01:24 CET 2007',
262 accessDate: 'Mon Jan 19 16:10:11 CET 2009', 259 accessDate: 'Mon Jan 19 16:10:11 CET 2009',
263 currentVersion: '395eb58606138588dcd7e659065db48775610cc1e90cbd03368c063e02e55c8b', 260 currentVersion: '395eb58606138588dcd7e659065db48775610cc1e90cbd03368c063e02e55c8b',
264 versions: { 261 versions: {
265 '395eb58606138588dcd7e659065db48775610cc1e90cbd03368c063e02e55c8b': { 262 '395eb58606138588dcd7e659065db48775610cc1e90cbd03368c063e02e55c8b': {
266 header: '####', 263 header: '####',
267 data: 'sgq3FGcsnlbhTLetMa3TQQE6uFZv/JL6Awha1066IimKoAtQGbAr6E1+mxRmvJle91sL7oRfi6suvDanYHfAI+rrG6qCOtESn70ssS+aGFyO3XwFgypzG/Qa34bjxJ16Aqd93H8IdhzdtOxs2Qmou3CjyxbT7Cq+YW/fAo1WfctL4yE4GBNPWC5lfebxSmINlBY+zTjhv9Pf2aK6vL4p3obHl+zhz0YdKAMBwbDyCLa9tYvhGBnq/W6lFUsyZCPVJJP3bQCQww0TNCcLJLm+SYVSiC0NwCQJq+yNqDkWTvv41p5EDB06eOQ2VqC7l4i/JLE/ql9h9Z++gck74/Qs3ppdVdG7sTzWyPya4v3RW2OTc1awFRZipAX5Zd7I97dyw6Yym4y+/9UT8z8iMDYykQ4+QnOhksDIE9a8q6agDF/rbZ/BCRcMWbFylGTdudk26mu0GdPiuLDu', 264 data: 'sgq3FGcsnlbhTLetMa3TQQE6uFZv/JL6Awha1066IimKoAtQGbAr6E1+mxRmvJle91sL7oRfi6suvDanYHfAI+rrG6qCOtESn70ssS+aGFyO3XwFgypzG/Qa34bjxJ16Aqd93H8IdhzdtOxs2Qmou3CjyxbT7Cq+YW/fAo1WfctL4yE4GBNPWC5lfebxSmINlBY+zTjhv9Pf2aK6vL4p3obHl+zhz0YdKAMBwbDyCLa9tYvhGBnq/W6lFUsyZCPVJJP3bQCQww0TNCcLJLm+SYVSiC0NwCQJq+yNqDkWTvv41p5EDB06eOQ2VqC7l4i/JLE/ql9h9Z++gck74/Qs3ppdVdG7sTzWyPya4v3RW2OTc1awFRZipAX5Zd7I97dyw6Yym4y+/9UT8z8iMDYykQ4+QnOhksDIE9a8q6agDF/rbZ/BCRcMWbFylGTdudk26mu0GdPiuLDu',
268 version: '0.2', 265 version: '0.2',
269 creationDate: 'Wed Mar 14 16:01:24 CET 2007', 266 creationDate: 'Wed Mar 14 16:01:24 CET 2007',
270 updateDate: 'Wed Mar 14 16:01:24 CET 2007', 267 updateDate: 'Wed Mar 14 16:01:24 CET 2007',
271 accessDate: 'Mon Jan 19 16:10:11 CET 2009' 268 accessDate: 'Mon Jan 19 16:10:11 CET 2009'
272 } 269 }
273 } 270 }
274 }, 271 },
275 '5cdac63b317f3942da38f3a3de3b7f0e5d6678200951c6216230295550f63fb4': { 272 '5cdac63b317f3942da38f3a3de3b7f0e5d6678200951c6216230295550f63fb4': {
276 data: 'Xs+z3VzIqsWa7dGBqepwq75lTsx3yemNhTdRYYDDc3Kzpycyp961SgnKXHjE51266mfmj85ASFi/FKCOwk17lbD5UT3iawtc3TdgrQ18vBhBsmOA2F4JAa4yC58bTaXbyld3c4izDp7i9+iyRaFN52NWJznN82SXuRtPdWRtAxXB1V5Tyg==', 273 data: 'Xs+z3VzIqsWa7dGBqepwq75lTsx3yemNhTdRYYDDc3Kzpycyp961SgnKXHjE51266mfmj85ASFi/FKCOwk17lbD5UT3iawtc3TdgrQ18vBhBsmOA2F4JAa4yC58bTaXbyld3c4izDp7i9+iyRaFN52NWJznN82SXuRtPdWRtAxXB1V5Tyg==',
277 version: '0.3', 274 version: '0.3',
278 creationDate: 'Mon Jan 05 17:45:25 CET 2009', 275 creationDate: 'Mon Jan 05 17:45:25 CET 2009',
279 updateDate: 'Mon Jan 05 17:45:25 CET 2009', 276 updateDate: 'Mon Jan 05 17:45:25 CET 2009',
280 accessDate: 'Mon Jan 19 16:10:21 CET 2009', 277 accessDate: 'Mon Jan 19 16:10:21 CET 2009',
281 currentVersion: '00b3a4cd7400cfc1e7f7b369bdc3dcdaa50d6020233e131b30d755c89249ea9d', 278 currentVersion: '00b3a4cd7400cfc1e7f7b369bdc3dcdaa50d6020233e131b30d755c89249ea9d',
282 versions: { 279 versions: {
283 '00b3a4cd7400cfc1e7f7b369bdc3dcdaa50d6020233e131b30d755c89249ea9d': { 280 '00b3a4cd7400cfc1e7f7b369bdc3dcdaa50d6020233e131b30d755c89249ea9d': {
284 header: '####', 281 header: '####',
285 data: 'uGAV9pZTjrTwBy24TX/OUQwGmgzTnXv1JBIxdGkeoLCUhP9tAjbpUVylrUI5+VRrFYkXYyZ0o2HEgKrun2f3PODTxlmAbfkUldOV5tyV/EUxN0vYSBtgsMpqQm3bOKRIAo/uzrhSE3iwMjvKOTH2jUrkmX6hmqhXWZfa4X231GovrnOjek8c7t+LUBmmIjXEr2GSc/UbBoFnni+Q7ZArwtU68xoeCjLame1e8Y9wvCO8gIfAzXQAHsDgzn1MVeiWIqiCBTs8YKCO1yaxZpkzXV0yWzX+bHyXlKWwAk7Fu9w0CuaRULZmRCQhv+MMDw8DEXciTm0R5dRiVmSCFBy8cL9qlSeSX0GlnKl8E4/TSqvhMJblwJJsgmGSZ9cEt2u0E08tHxKuoeaaT1rpAOoiqx+z7BdhqjWOQZOGM4gR3EwqvOQoNYFUaXjAdmiUzW+e+TgE1IBQ8udRFl/D2zCcqFO90Hgc7hHsTDI3aGYvi6bHADu8hFpmZtJAjOMv1JgCX4Hm4n+SsbHd0DIfkEUMeGlVO47lcGWBZNRRm7xl8luZ4sZn', 282 data: 'uGAV9pZTjrTwBy24TX/OUQwGmgzTnXv1JBIxdGkeoLCUhP9tAjbpUVylrUI5+VRrFYkXYyZ0o2HEgKrun2f3PODTxlmAbfkUldOV5tyV/EUxN0vYSBtgsMpqQm3bOKRIAo/uzrhSE3iwMjvKOTH2jUrkmX6hmqhXWZfa4X231GovrnOjek8c7t+LUBmmIjXEr2GSc/UbBoFnni+Q7ZArwtU68xoeCjLame1e8Y9wvCO8gIfAzXQAHsDgzn1MVeiWIqiCBTs8YKCO1yaxZpkzXV0yWzX+bHyXlKWwAk7Fu9w0CuaRULZmRCQhv+MMDw8DEXciTm0R5dRiVmSCFBy8cL9qlSeSX0GlnKl8E4/TSqvhMJblwJJsgmGSZ9cEt2u0E08tHxKuoeaaT1rpAOoiqx+z7BdhqjWOQZOGM4gR3EwqvOQoNYFUaXjAdmiUzW+e+TgE1IBQ8udRFl/D2zCcqFO90Hgc7hHsTDI3aGYvi6bHADu8hFpmZtJAjOMv1JgCX4Hm4n+SsbHd0DIfkEUMeGlVO47lcGWBZNRRm7xl8luZ4sZn',
286 version: '0.3', 283 version: '0.3',
287 creationDate: 'Mon Jan 05 17:45:25 CET 2009', 284 creationDate: 'Mon Jan 05 17:45:25 CET 2009',
288 updateDate: 'Mon Jan 05 17:45:25 CET 2009', 285 updateDate: 'Mon Jan 05 17:45:25 CET 2009',
289 accessDate: 'Mon Jan 19 16:10:21 CET 2009' 286 accessDate: 'Mon Jan 19 16:10:21 CET 2009'
290 } 287 }
291 } 288 }
292 }, 289 },
293 '6026370f3db3860d2c46a08e389a7e906dc14f98c8444b21be9a7e9f405a2728': { 290 '6026370f3db3860d2c46a08e389a7e906dc14f98c8444b21be9a7e9f405a2728': {
294 data: '3oUg1TD+Lu4ou06j/MddOTXDqRM+qSKD+6Iuzia1Hop1w7v/BXidqeoKJZQI2VY9oO9B70Nr3B3wDROF+ycy6Rq+FM/xqUGHKXn1lAaSc6Wgj6TLQ6eRF6YZKSPqTj7TDWyw/2pEWk4HjcT8drTrCaC02tzAXMhYWlYPQPW4fUdq4hawoHIdopUN3vafQuFjY47OhqXKav3bNao=', 291 data: '3oUg1TD+Lu4ou06j/MddOTXDqRM+qSKD+6Iuzia1Hop1w7v/BXidqeoKJZQI2VY9oO9B70Nr3B3wDROF+ycy6Rq+FM/xqUGHKXn1lAaSc6Wgj6TLQ6eRF6YZKSPqTj7TDWyw/2pEWk4HjcT8drTrCaC02tzAXMhYWlYPQPW4fUdq4hawoHIdopUN3vafQuFjY47OhqXKav3bNao=',
295 version: '0.2', 292 version: '0.2',
296 creationDate: 'Tue Apr 17 16:36:08 CEST 2007', 293 creationDate: 'Tue Apr 17 16:36:08 CEST 2007',
297 updateDate: 'Tue Apr 17 16:36:08 CEST 2007', 294 updateDate: 'Tue Apr 17 16:36:08 CEST 2007',
298 accessDate: 'Mon Jan 19 16:09:33 CET 2009', 295 accessDate: 'Mon Jan 19 16:09:33 CET 2009',
299 currentVersion: 'bf8d46022179715d9d27e0a256b56b50828a771c3c6b46fe36fb2982dcb3b4cc', 296 currentVersion: 'bf8d46022179715d9d27e0a256b56b50828a771c3c6b46fe36fb2982dcb3b4cc',
300 versions: { 297 versions: {
301 'bf8d46022179715d9d27e0a256b56b50828a771c3c6b46fe36fb2982dcb3b4cc': { 298 'bf8d46022179715d9d27e0a256b56b50828a771c3c6b46fe36fb2982dcb3b4cc': {
302 header: '####', 299 header: '####',
303 data: 'fehYRMkg/wFj2t/aWu7szbXwrCyCDpjQN4UNck4/OiDlth70a2ve6ow5lAi2jgdlV9WiFrPejfa8dD0Z1g19jx+BBsuUYnBEKD0K+NapdJBBeI0We2nj9nYIij2dfZVx7cuvhy8sN6+DdylUQLsFHbga+Gi5hWcMuULT4GOAIy2WanSQL1RSR4ruA6zm/t+VVboEkkm7PPT+w3LuRl3wRaD4a8ZwYiSV/SzgWooFrh2S3YOUeshdaGCiYpTbXscsOxsCxc11i6wQGBqYSjksmtZDvEegdQdzCmxvq4jaVWJElYYS3av612nD5K/w7Zei6RccBiODBPATjrIczYg7HwmQxIM/6QI9/LQn0LP0yqRVUUtfzaODf0uWNpFzml9l/1lwXuBJyQFBp7H7Th46ekw9yEuPD00oZ+eXvKwbwfUU0JshT4hnEBtIjM8fH974PU0y95f0yLAJ1+M6DVXCxGsBix2aKJx9fuZP4KGpaXg6qCb/6327rph7MGomcrGPIiDjYwD/NTMdGluc55OZfGXtOZUaJCUM6nihqDwU7Ly1ZzYorgcvkX/t/0RNcOkFzGYNByp7mdcotyiHqCDKspqz9mEXAd7Noz3HO5GFpPqbRo7htDigGU1f7dvgbbfRoTz17Bt9Mw==', 300 data: 'fehYRMkg/wFj2t/aWu7szbXwrCyCDpjQN4UNck4/OiDlth70a2ve6ow5lAi2jgdlV9WiFrPejfa8dD0Z1g19jx+BBsuUYnBEKD0K+NapdJBBeI0We2nj9nYIij2dfZVx7cuvhy8sN6+DdylUQLsFHbga+Gi5hWcMuULT4GOAIy2WanSQL1RSR4ruA6zm/t+VVboEkkm7PPT+w3LuRl3wRaD4a8ZwYiSV/SzgWooFrh2S3YOUeshdaGCiYpTbXscsOxsCxc11i6wQGBqYSjksmtZDvEegdQdzCmxvq4jaVWJElYYS3av612nD5K/w7Zei6RccBiODBPATjrIczYg7HwmQxIM/6QI9/LQn0LP0yqRVUUtfzaODf0uWNpFzml9l/1lwXuBJyQFBp7H7Th46ekw9yEuPD00oZ+eXvKwbwfUU0JshT4hnEBtIjM8fH974PU0y95f0yLAJ1+M6DVXCxGsBix2aKJx9fuZP4KGpaXg6qCb/6327rph7MGomcrGPIiDjYwD/NTMdGluc55OZfGXtOZUaJCUM6nihqDwU7Ly1ZzYorgcvkX/t/0RNcOkFzGYNByp7mdcotyiHqCDKspqz9mEXAd7Noz3HO5GFpPqbRo7htDigGU1f7dvgbbfRoTz17Bt9Mw==',
304 version: '0.2', 301 version: '0.2',
305 creationDate: 'Tue Apr 17 16:36:08 CEST 2007', 302 creationDate: 'Tue Apr 17 16:36:08 CEST 2007',
306 updateDate: 'Tue Apr 17 16:36:08 CEST 2007', 303 updateDate: 'Tue Apr 17 16:36:08 CEST 2007',
307 accessDate: 'Mon Jan 19 16:09:33 CET 2009' 304 accessDate: 'Mon Jan 19 16:09:33 CET 2009'
308 } 305 }
309 } 306 }
310 }, 307 },
311 '6c25be8e145efb26a1abd59590522f73fb2e3dbc139af2217074d9e2ba92c16a': { 308 '6c25be8e145efb26a1abd59590522f73fb2e3dbc139af2217074d9e2ba92c16a': {
312 data: 'b2mcYUi59l434kGl7ij6dBu3063UL1dToMIu3Zsa9RV9RzeLKnezJhLKunqoAm7KwiJeqDo/REexHI1cshGYtHasVXXuyJfMx1grH7yhoWnkSRF4Sax6w5E5wnGkEpGJHOxXJ9rOjWHZ7yqCUUCB/dqLw4FwPOtRb/ynkBEYztEJA6EKGJuz0vrrTOsT8HMXtj/w6MEZ7qI3fPs=', 309 data: 'b2mcYUi59l434kGl7ij6dBu3063UL1dToMIu3Zsa9RV9RzeLKnezJhLKunqoAm7KwiJeqDo/REexHI1cshGYtHasVXXuyJfMx1grH7yhoWnkSRF4Sax6w5E5wnGkEpGJHOxXJ9rOjWHZ7yqCUUCB/dqLw4FwPOtRb/ynkBEYztEJA6EKGJuz0vrrTOsT8HMXtj/w6MEZ7qI3fPs=',
313 version: '0.2', 310 version: '0.2',
314 creationDate: 'Mon Apr 02 19:12:44 CEST 2007', 311 creationDate: 'Mon Apr 02 19:12:44 CEST 2007',
315 updateDate: 'Mon Apr 02 19:12:44 CEST 2007', 312 updateDate: 'Mon Apr 02 19:12:44 CEST 2007',
316 accessDate: 'Mon Jan 19 16:10:08 CET 2009', 313 accessDate: 'Mon Jan 19 16:10:08 CET 2009',
317 currentVersion: '2f60193c0fc0e3f2f178955e1c68759675acdf691bcb918cfad329a5a97cfaf3', 314 currentVersion: '2f60193c0fc0e3f2f178955e1c68759675acdf691bcb918cfad329a5a97cfaf3',
318 versions: { 315 versions: {
319 '2f60193c0fc0e3f2f178955e1c68759675acdf691bcb918cfad329a5a97cfaf3': { 316 '2f60193c0fc0e3f2f178955e1c68759675acdf691bcb918cfad329a5a97cfaf3': {
320 header: '####', 317 header: '####',
321 data: 'pZEWSdYIkrX8/r6OYmO0GEuKG9baUgn40Bmw7hXZBd/kfWuRjWsL4/pc5F5Ojrx+N0dxmQn5ZqKAzOOri29Rm4ruxnCbyK+oDsCDyMSnWy/VJcvystnDKzKmBRQVAOSEJtzEb3OtGzvqm0PQ1Dhx1YUAx7L6KlXysmG9h9+MjOcErRL9/1x1LZ33ytR+zK4LvTAb7gN5/9QgwysFyCkNP8bG4nyCzPMiUrBnP0odMTUvDkJDlY0Oia6VjGW6oNxnGIgA5fDraRrW4JH2oejQcrL7+X+jpCp05g==', 318 data: 'pZEWSdYIkrX8/r6OYmO0GEuKG9baUgn40Bmw7hXZBd/kfWuRjWsL4/pc5F5Ojrx+N0dxmQn5ZqKAzOOri29Rm4ruxnCbyK+oDsCDyMSnWy/VJcvystnDKzKmBRQVAOSEJtzEb3OtGzvqm0PQ1Dhx1YUAx7L6KlXysmG9h9+MjOcErRL9/1x1LZ33ytR+zK4LvTAb7gN5/9QgwysFyCkNP8bG4nyCzPMiUrBnP0odMTUvDkJDlY0Oia6VjGW6oNxnGIgA5fDraRrW4JH2oejQcrL7+X+jpCp05g==',
322 version: '0.2', 319 version: '0.2',
323 creationDate: 'Mon Apr 02 19:12:44 CEST 2007', 320 creationDate: 'Mon Apr 02 19:12:44 CEST 2007',
324 updateDate: 'Mon Apr 02 19:12:44 CEST 2007', 321 updateDate: 'Mon Apr 02 19:12:44 CEST 2007',
325 accessDate: 'Mon Jan 19 16:10:08 CET 2009' 322 accessDate: 'Mon Jan 19 16:10:08 CET 2009'
326 } 323 }
327 } 324 }
328 }, 325 },
329 '6d45c2fec275b7482d41c76b20507100cfb6ab49922b876f9dd3040d361f4a18': { 326 '6d45c2fec275b7482d41c76b20507100cfb6ab49922b876f9dd3040d361f4a18': {
330 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==', 327 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==',
331 version: '0.2', 328 version: '0.2',
332 creationDate: 'Wed Mar 14 19:09:05 CET 2007', 329 creationDate: 'Wed Mar 14 19:09:05 CET 2007',
333 updateDate: 'Wed Mar 14 19:09:05 CET 2007', 330 updateDate: 'Wed Mar 14 19:09:05 CET 2007',
334 accessDate: 'Mon Jan 19 16:10:15 CET 2009', 331 accessDate: 'Mon Jan 19 16:10:15 CET 2009',
335 currentVersion: 'e85f085a8ed42d2def7adc796b66a2e0a4c3c88d9f3e785eb12a6f5619d945c5', 332 currentVersion: 'e85f085a8ed42d2def7adc796b66a2e0a4c3c88d9f3e785eb12a6f5619d945c5',
336 versions: { 333 versions: {
337 'e85f085a8ed42d2def7adc796b66a2e0a4c3c88d9f3e785eb12a6f5619d945c5': { 334 'e85f085a8ed42d2def7adc796b66a2e0a4c3c88d9f3e785eb12a6f5619d945c5': {
338 header: '####', 335 header: '####',
339 data: 'BbXNAy0GcKKyDPiwhP1Jk9mIi3uXMHQdhuxpDvoR2C3YITOUBpurxGhhvmCg+a9pS+fKJdZPxL2mPbJj6GfWTEsm7K/ECEjrVkSTHi6PTUUgYVbCumq9EHjUspos+7VrifZry3c73+qAvIKamvUlNB86TchMpOXVJIyx8UgRX+bdhrxk9ZCEVOiLCG1zGPX8IzmcxPmBRZFlHYqE4ibhl/CLEzWXZBYCofTusClhOh7YM/jBgvDt64W7aIN2y2KiKwmFySkFZdnOvbAb34tXVimwqjqWPvPwd6MujQeX1bmaDD7Y0kXac8CJxqasIezLo2WqzLUbEXdIHGilkaPT2ZKpKhKkpHJHFrV2lVuQJVqwPUr0Gf9qMKgVnsyU8kUfq9ox+fhH70+v7BQSjT7bxxDLs0UesQeL7G4SqvNet5hPI4GQEpOY8p5MUFReIBTRm72NQEU=', 336 data: 'BbXNAy0GcKKyDPiwhP1Jk9mIi3uXMHQdhuxpDvoR2C3YITOUBpurxGhhvmCg+a9pS+fKJdZPxL2mPbJj6GfWTEsm7K/ECEjrVkSTHi6PTUUgYVbCumq9EHjUspos+7VrifZry3c73+qAvIKamvUlNB86TchMpOXVJIyx8UgRX+bdhrxk9ZCEVOiLCG1zGPX8IzmcxPmBRZFlHYqE4ibhl/CLEzWXZBYCofTusClhOh7YM/jBgvDt64W7aIN2y2KiKwmFySkFZdnOvbAb34tXVimwqjqWPvPwd6MujQeX1bmaDD7Y0kXac8CJxqasIezLo2WqzLUbEXdIHGilkaPT2ZKpKhKkpHJHFrV2lVuQJVqwPUr0Gf9qMKgVnsyU8kUfq9ox+fhH70+v7BQSjT7bxxDLs0UesQeL7G4SqvNet5hPI4GQEpOY8p5MUFReIBTRm72NQEU=',
340 version: '0.2', 337 version: '0.2',
341 creationDate: 'Wed Mar 14 19:09:05 CET 2007', 338 creationDate: 'Wed Mar 14 19:09:05 CET 2007',
342 updateDate: 'Wed Mar 14 19:09:05 CET 2007', 339 updateDate: 'Wed Mar 14 19:09:05 CET 2007',
343 accessDate: 'Mon Jan 19 16:10:15 CET 2009' 340 accessDate: 'Mon Jan 19 16:10:15 CET 2009'
344 } 341 }
345 } 342 }
346 }, 343 },
347 '7bb69b6366a8012f181c01e368ba18d4f7a82bcabb4959189736ad124c4bbfbb': { 344 '7bb69b6366a8012f181c01e368ba18d4f7a82bcabb4959189736ad124c4bbfbb': {
348 data: 'wYPZIt0UHiNVefNwtGc7z7Lu3YoQrXdfKmWqilZp8yeIrNfSLB9p60DLMrL3GDq/CsvDYkGAZgj1C/6NVnzVsXsJKq7NDZn1UPOGt+hCnw3lEVbD7zHkoMM4VgFDn1sZdjLe8wdpIFfdlQESTipT3GVXv3swG2qX2O2yuwtlopR8yZQTLg==', 345 data: 'wYPZIt0UHiNVefNwtGc7z7Lu3YoQrXdfKmWqilZp8yeIrNfSLB9p60DLMrL3GDq/CsvDYkGAZgj1C/6NVnzVsXsJKq7NDZn1UPOGt+hCnw3lEVbD7zHkoMM4VgFDn1sZdjLe8wdpIFfdlQESTipT3GVXv3swG2qX2O2yuwtlopR8yZQTLg==',
349 version: '0.3', 346 version: '0.3',
350 creationDate: 'Mon Jan 05 17:44:30 CET 2009', 347 creationDate: 'Mon Jan 05 17:44:30 CET 2009',
351 updateDate: 'Mon Jan 05 17:44:30 CET 2009', 348 updateDate: 'Mon Jan 05 17:44:30 CET 2009',
352 accessDate: 'Mon Jan 19 16:10:18 CET 2009', 349 accessDate: 'Mon Jan 19 16:10:18 CET 2009',
353 currentVersion: '23f5fb503e54c0cafe3d4944ddaf40bc74fab8b5d96e2bbddf693b1afb225e5b', 350 currentVersion: '23f5fb503e54c0cafe3d4944ddaf40bc74fab8b5d96e2bbddf693b1afb225e5b',
354 versions: { 351 versions: {
355 '23f5fb503e54c0cafe3d4944ddaf40bc74fab8b5d96e2bbddf693b1afb225e5b': { 352 '23f5fb503e54c0cafe3d4944ddaf40bc74fab8b5d96e2bbddf693b1afb225e5b': {
356 header: '####', 353 header: '####',
357 data: 'IpYj+7t3DhSVD8r9PkLbF5xpGrHhg8omY014P1vkT2KkGDEUj+ekQAbQ1g66Z7oNhRDpjS1/dcDjzH0IIQLjGuQ0oRfL0xZefVTx3N88ZLE39m3cJz10K2xyg3xp06jFBmdNJuCkgRhMzeUXeEJujw4lS2kv7cO04Uh2Maui6jDR7E498rgePY3L32vG1S66li/xU1vPjNn06aFTqSYxUL17/mlJNbgp3XWjGC+l0dXLLfXy1wOm+/I3zp2caTs+a2zDUZ15s+3XeaAWpBH7QCaQsvsQmoBqPbMvkjOQwW3taDvV7Hvkh+qTjCEcLjRFwhZkMNn3N2ewcLWQa2aVIjxt6Z0F4s/1URztWlKVzCfto8RmrLajYRn3ggG12kX2xDJFjNPNfs/7A3tMn+FqXQCCNG5GI06JZ32aQfpnjtmXScUuEs8UeFgsNeYclQhcm5R0sUwISK+D345B8859w+4+9OTY38NgYQQ9o/tmpCjWj1tLYLx/m/GcR2em7iyDpBdcnWUb+tK6Ah89qvXriHwPLSNzhOH2wxmi7nXTRQWMv7g2', 354 data: 'IpYj+7t3DhSVD8r9PkLbF5xpGrHhg8omY014P1vkT2KkGDEUj+ekQAbQ1g66Z7oNhRDpjS1/dcDjzH0IIQLjGuQ0oRfL0xZefVTx3N88ZLE39m3cJz10K2xyg3xp06jFBmdNJuCkgRhMzeUXeEJujw4lS2kv7cO04Uh2Maui6jDR7E498rgePY3L32vG1S66li/xU1vPjNn06aFTqSYxUL17/mlJNbgp3XWjGC+l0dXLLfXy1wOm+/I3zp2caTs+a2zDUZ15s+3XeaAWpBH7QCaQsvsQmoBqPbMvkjOQwW3taDvV7Hvkh+qTjCEcLjRFwhZkMNn3N2ewcLWQa2aVIjxt6Z0F4s/1URztWlKVzCfto8RmrLajYRn3ggG12kX2xDJFjNPNfs/7A3tMn+FqXQCCNG5GI06JZ32aQfpnjtmXScUuEs8UeFgsNeYclQhcm5R0sUwISK+D345B8859w+4+9OTY38NgYQQ9o/tmpCjWj1tLYLx/m/GcR2em7iyDpBdcnWUb+tK6Ah89qvXriHwPLSNzhOH2wxmi7nXTRQWMv7g2',
358 version: '0.3', 355 version: '0.3',
359 creationDate: 'Mon Jan 05 17:44:30 CET 2009', 356 creationDate: 'Mon Jan 05 17:44:30 CET 2009',
360 updateDate: 'Mon Jan 05 17:44:30 CET 2009', 357 updateDate: 'Mon Jan 05 17:44:30 CET 2009',
361 accessDate: 'Mon Jan 19 16:10:18 CET 2009' 358 accessDate: 'Mon Jan 19 16:10:18 CET 2009'
362 } 359 }
363 } 360 }
364 }, 361 },
365 '8b18e8593b5bc2f7ea39a5fab222047034ef2f380fee05be0fa6e1c0972fea39': { 362 '8b18e8593b5bc2f7ea39a5fab222047034ef2f380fee05be0fa6e1c0972fea39': {
366 data: 'pOMTY3PnUAbwMLDEYNJCMzp4iIA42YWr6gqoomg+P40e7LFUtbt/RQRelQwNIztyUSVLl0rilkZZkBUVvxrtTqvibKITCjJQGQIzvcb+Yl4mNosl2Rpp0xxMU03f1+G7eGbuCc5hJXYVAglhEYplaAPzHbRWXMY8iZXZPBuLVf5PN+rdpgAfkGeZ7Uf9RsQ9p/EglrWXYnTwXi3saUfzIjfvSHm5C+dXTY3FHpIc1YkjFrdVgMkhYQGV60JtZcwFtCEL2NpVljAbRgHoIXTOkzUvep4vxrtfBBWWMuAWEI06432gtnH6IQbrR6jOpwuMt7k/09qy/fARPHs3r4qTJ9r2uqWHJ7tjJw+IChQPC+3l5HcPpFURiw8LGAN1NyY1hUrF6N84RSn7AKS0bLa5qN++5lcjjxn/k8+JqmeUqN1/SYIbGwNnJeZ0vA8yvOxnD20iVADX5kOVqJDwXRPLaF6Oz9KkbOrmANCh+PmGw1i6PduB+FgAU4HViYCw5IGOUZ30Pm1NJofqfbhXvgzn7ey2+kUIAwDyOUpJ9fW+9jW/JU4rcawmzwBYN2V8apOoyc3wQJICm2984wIfVBpygCOZM0QDyVgNo57qKtYH3yMDQSkKvpEUmuhklMYhcV+4X5ggdqx7lYXO9IMDnFf2ZDiZyieTlOlRv/nNVecUB177Xpnq2e+X/ik2rCQWVrIymiV6ltr1DEv0krXKfvXGG/FMZHUmo3m+B5bG4xVhmt0GnHseqvY2Vrl9NksLgq3hTDOGSGIy5Nv8kfrd8B4/6Tavh0SumiyXnrTXyYXzCK9E7IqO/0KAln63VkcHsbOtS8mj1drN0YQ2KKaeIW+Yr3Gm0pbcODsgA6aFfz1itZVeovBqUklhXS+/Es8J8xOSvvSyD/TmlFjuErHa+wwNQvftosfwk9ZTt0eIJS5aLHdU2QsCjdfSy0DEPkk2siGhBX5ZhRzqyIAyXApSmy+e7PIqn/dDR51+D1ZHwoTQyTrd+F08jBWZgU/OvS8MRxNZSxQwsi7bcWZG+w0utrIDB8eSOMVBXI5XBeJb4h5Bzut18C1shGHeGkSJp04=', 363 data: 'pOMTY3PnUAbwMLDEYNJCMzp4iIA42YWr6gqoomg+P40e7LFUtbt/RQRelQwNIztyUSVLl0rilkZZkBUVvxrtTqvibKITCjJQGQIzvcb+Yl4mNosl2Rpp0xxMU03f1+G7eGbuCc5hJXYVAglhEYplaAPzHbRWXMY8iZXZPBuLVf5PN+rdpgAfkGeZ7Uf9RsQ9p/EglrWXYnTwXi3saUfzIjfvSHm5C+dXTY3FHpIc1YkjFrdVgMkhYQGV60JtZcwFtCEL2NpVljAbRgHoIXTOkzUvep4vxrtfBBWWMuAWEI06432gtnH6IQbrR6jOpwuMt7k/09qy/fARPHs3r4qTJ9r2uqWHJ7tjJw+IChQPC+3l5HcPpFURiw8LGAN1NyY1hUrF6N84RSn7AKS0bLa5qN++5lcjjxn/k8+JqmeUqN1/SYIbGwNnJeZ0vA8yvOxnD20iVADX5kOVqJDwXRPLaF6Oz9KkbOrmANCh+PmGw1i6PduB+FgAU4HViYCw5IGOUZ30Pm1NJofqfbhXvgzn7ey2+kUIAwDyOUpJ9fW+9jW/JU4rcawmzwBYN2V8apOoyc3wQJICm2984wIfVBpygCOZM0QDyVgNo57qKtYH3yMDQSkKvpEUmuhklMYhcV+4X5ggdqx7lYXO9IMDnFf2ZDiZyieTlOlRv/nNVecUB177Xpnq2e+X/ik2rCQWVrIymiV6ltr1DEv0krXKfvXGG/FMZHUmo3m+B5bG4xVhmt0GnHseqvY2Vrl9NksLgq3hTDOGSGIy5Nv8kfrd8B4/6Tavh0SumiyXnrTXyYXzCK9E7IqO/0KAln63VkcHsbOtS8mj1drN0YQ2KKaeIW+Yr3Gm0pbcODsgA6aFfz1itZVeovBqUklhXS+/Es8J8xOSvvSyD/TmlFjuErHa+wwNQvftosfwk9ZTt0eIJS5aLHdU2QsCjdfSy0DEPkk2siGhBX5ZhRzqyIAyXApSmy+e7PIqn/dDR51+D1ZHwoTQyTrd+F08jBWZgU/OvS8MRxNZSxQwsi7bcWZG+w0utrIDB8eSOMVBXI5XBeJb4h5Bzut18C1shGHeGkSJp04=',
367 version: '0.2', 364 version: '0.2',
368 creationDate: 'Tue May 01 01:10:17 CEST 2007', 365 creationDate: 'Tue May 01 01:10:17 CEST 2007',
369 updateDate: 'Tue May 01 01:13:27 CEST 2007', 366 updateDate: 'Tue May 01 01:13:27 CEST 2007',
370 accessDate: 'Mon Jan 19 16:10:02 CET 2009', 367 accessDate: 'Mon Jan 19 16:10:02 CET 2009',
371 currentVersion: 'd175358ea0b9d32c23e4bceff2020eae9a8459466abc18d4399d988e733fc0f8', 368 currentVersion: 'd175358ea0b9d32c23e4bceff2020eae9a8459466abc18d4399d988e733fc0f8',
372 versions: { 369 versions: {
373 '8a032b53f7356e2d8b28665211abbe2cf1c79fd8eee4752e83cebdced1c19911': { 370 '8a032b53f7356e2d8b28665211abbe2cf1c79fd8eee4752e83cebdced1c19911': {
374 header: '####', 371 header: '####',
375 data: 'OXpNHHSkdsaD91hw2LER+9XKpf8+bh/O+OcLSgG/gAx228UpifOCD4HTAOs0C7IJ5zhAq1L9NjCGb1QWWTFErYEtDEBRBV4kogscP9HWPxYyZHxjwPI0wE7Ri2eD4Rma76Utb+xVnXWuT+vNb8eRUCK8Ur1rlhYafS0uzAYvVqHDNfZaICksxeVQojil/kSPZDMu8ASz5pMNFNCF4SlwDKPRrJJDbNZ62A3px59YJtsla91DGVyOLhb7VNRxEwnXyxENfP78yA6OjvQDc2KhKFUpHbZws54IolLK1I1mY/Z8BiDXPSnOa694Q1eZxy1Kx/jLINZUIPgGg1++YWITx213awOISdf7Oy0/dUpu10Vr1hgAqCVlDp0IuGK01CswRzEdLVpUk1DaGHuin1rryZx9vThUkEJgQQc3ivr8', 372 data: 'OXpNHHSkdsaD91hw2LER+9XKpf8+bh/O+OcLSgG/gAx228UpifOCD4HTAOs0C7IJ5zhAq1L9NjCGb1QWWTFErYEtDEBRBV4kogscP9HWPxYyZHxjwPI0wE7Ri2eD4Rma76Utb+xVnXWuT+vNb8eRUCK8Ur1rlhYafS0uzAYvVqHDNfZaICksxeVQojil/kSPZDMu8ASz5pMNFNCF4SlwDKPRrJJDbNZ62A3px59YJtsla91DGVyOLhb7VNRxEwnXyxENfP78yA6OjvQDc2KhKFUpHbZws54IolLK1I1mY/Z8BiDXPSnOa694Q1eZxy1Kx/jLINZUIPgGg1++YWITx213awOISdf7Oy0/dUpu10Vr1hgAqCVlDp0IuGK01CswRzEdLVpUk1DaGHuin1rryZx9vThUkEJgQQc3ivr8',
376 version: '0.2', 373 version: '0.2',
377 creationDate: 'Tue May 01 01:10:17 CEST 2007', 374 creationDate: 'Tue May 01 01:10:17 CEST 2007',
378 updateDate: 'Tue May 01 01:10:17 CEST 2007', 375 updateDate: 'Tue May 01 01:10:17 CEST 2007',
379 accessDate: 'Tue May 01 01:10:17 CEST 2007' 376 accessDate: 'Tue May 01 01:10:17 CEST 2007'
380 }, 377 },
381 'd175358ea0b9d32c23e4bceff2020eae9a8459466abc18d4399d988e733fc0f8': { 378 'd175358ea0b9d32c23e4bceff2020eae9a8459466abc18d4399d988e733fc0f8': {
382 header: '####', 379 header: '####',
383 data: 'tvSUu+NPKHkwt/ZLXdLGdDm4jSxTEtJfsecdpjJ9UGN3Y2EBCmijU5i7q+hMfNDqBJ4/m5Ayju4zYDAKGp2pt8l1TFoDurITdFcV12jL8j3dc4TTD//uC6OtowRN+altgC1Xc0LsSvEPabjAlwfVC5xqirfm5t2mVmnFZ/GALkGLGxRJRduylT6goPwfunkVGwUdqMa3md+9mwYn2gm7CyC0lpcKX8AZ3B4Oa656yRa9m3Wjgb007TtorLIpZO2MzVwxcHBqqy7YpN+zpmZz6Md9VK3L4F724tuXXWnDeVzGxBO7aZVr62hwPMXM6ibCjUScsaS4f0chivA/tBJoyx7OqKhBxREGeGjpHTeLxyHcekbwXhXyeqxBuwG93yGKutUhGLVYcXwe8/+xSeaBGj/j2RWutKbNKG2yQyNPGj2cxJWsR4YfOQJTSOSWT3K6Mmf+r6hLhIo=', 380 data: 'tvSUu+NPKHkwt/ZLXdLGdDm4jSxTEtJfsecdpjJ9UGN3Y2EBCmijU5i7q+hMfNDqBJ4/m5Ayju4zYDAKGp2pt8l1TFoDurITdFcV12jL8j3dc4TTD//uC6OtowRN+altgC1Xc0LsSvEPabjAlwfVC5xqirfm5t2mVmnFZ/GALkGLGxRJRduylT6goPwfunkVGwUdqMa3md+9mwYn2gm7CyC0lpcKX8AZ3B4Oa656yRa9m3Wjgb007TtorLIpZO2MzVwxcHBqqy7YpN+zpmZz6Md9VK3L4F724tuXXWnDeVzGxBO7aZVr62hwPMXM6ibCjUScsaS4f0chivA/tBJoyx7OqKhBxREGeGjpHTeLxyHcekbwXhXyeqxBuwG93yGKutUhGLVYcXwe8/+xSeaBGj/j2RWutKbNKG2yQyNPGj2cxJWsR4YfOQJTSOSWT3K6Mmf+r6hLhIo=',
384 version: '0.2', 381 version: '0.2',
385 creationDate: 'Tue May 01 01:13:27 CEST 2007', 382 creationDate: 'Tue May 01 01:13:27 CEST 2007',
386 updateDate: 'Tue May 01 01:13:27 CEST 2007', 383 updateDate: 'Tue May 01 01:13:27 CEST 2007',
387 accessDate: 'Mon Jan 19 16:10:02 CET 2009' 384 accessDate: 'Mon Jan 19 16:10:02 CET 2009'
388 } 385 }
389 } 386 }
390 }, 387 },
391 '9dcd2a8a0fcb7e57d234dc4fea347f020a6a01793e40cf56a0d22379e590e291': { 388 '9dcd2a8a0fcb7e57d234dc4fea347f020a6a01793e40cf56a0d22379e590e291': {
392 data: 'xXZUJjgxn62OqnzAvScHJNo4WjYEFp1vQ4ueBe1sk8dH4pXZUKV6m9c1d2cLUgBj4rUNP5cC66GiFHV7G5BDZGLrfrxUlYU6BWvzAz4eG463pRDhHXQgPrhlIGDlK6ovaIsjwaifvHaEfLREoXvLFluqu406KG58guhtWdIFK0rLypyRo8uyltGbTz8wZdu8atY/JYQnb8NaAf4=', 389 data: 'xXZUJjgxn62OqnzAvScHJNo4WjYEFp1vQ4ueBe1sk8dH4pXZUKV6m9c1d2cLUgBj4rUNP5cC66GiFHV7G5BDZGLrfrxUlYU6BWvzAz4eG463pRDhHXQgPrhlIGDlK6ovaIsjwaifvHaEfLREoXvLFluqu406KG58guhtWdIFK0rLypyRo8uyltGbTz8wZdu8atY/JYQnb8NaAf4=',
393 version: '0.2', 390 version: '0.2',
394 creationDate: 'Wed Mar 21 16:29:06 CET 2007', 391 creationDate: 'Wed Mar 21 16:29:06 CET 2007',
395 updateDate: 'Wed Mar 21 16:29:06 CET 2007', 392 updateDate: 'Wed Mar 21 16:29:06 CET 2007',
396 accessDate: 'Mon Jan 19 16:10:01 CET 2009', 393 accessDate: 'Mon Jan 19 16:10:01 CET 2009',
397 currentVersion: '5da9ecc65677d03f4f31c0f12f000caa4930394a99af8187c05e74b99c851aa7', 394 currentVersion: '5da9ecc65677d03f4f31c0f12f000caa4930394a99af8187c05e74b99c851aa7',
398 versions: { 395 versions: {
399 '5da9ecc65677d03f4f31c0f12f000caa4930394a99af8187c05e74b99c851aa7': { 396 '5da9ecc65677d03f4f31c0f12f000caa4930394a99af8187c05e74b99c851aa7': {
400 header: '####', 397 header: '####',
401 data: '7wg/yWfSasUjJKV/5ygFfteazVSdqEJ8xGAqtS7m/W2q3rOR+2fr99Il2TzxXCnOe5zV+iir2tOqPQt6BCGbVf0NVwZtvfO/lvfMc7DIwyWuhZ0sS44LBTD9VY9fruuIegktVHSNBoJTCIfAHN/ut1iB80+51An+TdpYT3SGAVM4RdenQ9IdvDOnQo2KE0E7BzHekga800VJrbqI8aJEtmm5mOjte2xHYSPFDCtwURQclwxbNv32hAY/IUkaejqg93WGIzHIIK0+SSDzQwHYQo4yzVGCKKy75eghpvGyg1zbzlv372bND+OuA3laocARFfe4rRd5I5nh8vmSJ+vybh3EIJJzloD+qWk6hsEagkYI0RYu9I2uOfA8drmZ02GV5/ySDsBHX7uhaTPGx4J22rNJoj8s1L7UoaohUHFvUerBvQTir2LPbzqT+B07wZOU0ibtHlaN5C2XMKRxfvGATeR+2J3l7WisCIoRdpQcPFHA7nlTTShBiCVstLxolvd7MMzPOilsi3ecxXLQSeWara4JILqXQCJ4yLbQCMnSpIrZ3TXbwbPZ8fjKjogHNUaBPnmd1hWoc7IVvK9RSFBEdCh9U/hbyPMCiSjdsUCTclmhFmhiVIlB73IyWixmLwHSWSl/ckMxcUK6rB0IPuWcT8iJkxfqOziFhMvC/cNydpN5Nj4WX21c/1M7lVlX10FRx6NIYH5szEXULmLnkfEwr35G9mKJwR2pgZ272UiW2cH64/+M+Kh7XnPbQKxTwVR3FOhR/qdSHeA8MTc9FDslFaTT6YSeJEPoQiLg4c4UdbB7w5nA0o4qg82hiiJbTfT2zFHZeeWOpVO1z4V8SidJrQkh8aL1/Is7KaDVNfL+Lx73gfO6tdSviCJJhD29iTgn+MW4MlGwpeLKpvq+LkXNXi/CVjIa1VqtR/Flk2BqwT2hccgw6E1ML+QdW1n3TvTtdLIvSGheOM5kLdnF76e8Nj0kHDFbnxQMlO7lutngaNBRAvhvSLccT76TMG4OTxNZk5aOre6AIOuUfrFD3KDeOqWie5zpkvTOd/JK/JDFYgbYQh8AqhwJ7VWUH49vfd6AqfwHwdNWymI05F6/0Co4xoQ6qN+iYNConUXz78Uo7AraJuBDQ3a24+wL2mLjnc8jUDFUaAKM6gZUv9+bx1vk6zVdaZcuqgZc6dcyo5Oy8lmbJ/SmRb8BF/Q2nW3SDv77R+p0bKPLmjcytczlMNct58Q1LoiLnGck5v0wByQ0XIMd', 398 data: '7wg/yWfSasUjJKV/5ygFfteazVSdqEJ8xGAqtS7m/W2q3rOR+2fr99Il2TzxXCnOe5zV+iir2tOqPQt6BCGbVf0NVwZtvfO/lvfMc7DIwyWuhZ0sS44LBTD9VY9fruuIegktVHSNBoJTCIfAHN/ut1iB80+51An+TdpYT3SGAVM4RdenQ9IdvDOnQo2KE0E7BzHekga800VJrbqI8aJEtmm5mOjte2xHYSPFDCtwURQclwxbNv32hAY/IUkaejqg93WGIzHIIK0+SSDzQwHYQo4yzVGCKKy75eghpvGyg1zbzlv372bND+OuA3laocARFfe4rRd5I5nh8vmSJ+vybh3EIJJzloD+qWk6hsEagkYI0RYu9I2uOfA8drmZ02GV5/ySDsBHX7uhaTPGx4J22rNJoj8s1L7UoaohUHFvUerBvQTir2LPbzqT+B07wZOU0ibtHlaN5C2XMKRxfvGATeR+2J3l7WisCIoRdpQcPFHA7nlTTShBiCVstLxolvd7MMzPOilsi3ecxXLQSeWara4JILqXQCJ4yLbQCMnSpIrZ3TXbwbPZ8fjKjogHNUaBPnmd1hWoc7IVvK9RSFBEdCh9U/hbyPMCiSjdsUCTclmhFmhiVIlB73IyWixmLwHSWSl/ckMxcUK6rB0IPuWcT8iJkxfqOziFhMvC/cNydpN5Nj4WX21c/1M7lVlX10FRx6NIYH5szEXULmLnkfEwr35G9mKJwR2pgZ272UiW2cH64/+M+Kh7XnPbQKxTwVR3FOhR/qdSHeA8MTc9FDslFaTT6YSeJEPoQiLg4c4UdbB7w5nA0o4qg82hiiJbTfT2zFHZeeWOpVO1z4V8SidJrQkh8aL1/Is7KaDVNfL+Lx73gfO6tdSviCJJhD29iTgn+MW4MlGwpeLKpvq+LkXNXi/CVjIa1VqtR/Flk2BqwT2hccgw6E1ML+QdW1n3TvTtdLIvSGheOM5kLdnF76e8Nj0kHDFbnxQMlO7lutngaNBRAvhvSLccT76TMG4OTxNZk5aOre6AIOuUfrFD3KDeOqWie5zpkvTOd/JK/JDFYgbYQh8AqhwJ7VWUH49vfd6AqfwHwdNWymI05F6/0Co4xoQ6qN+iYNConUXz78Uo7AraJuBDQ3a24+wL2mLjnc8jUDFUaAKM6gZUv9+bx1vk6zVdaZcuqgZc6dcyo5Oy8lmbJ/SmRb8BF/Q2nW3SDv77R+p0bKPLmjcytczlMNct58Q1LoiLnGck5v0wByQ0XIMd',
402 version: '0.2', 399 version: '0.2',
403 creationDate: 'Wed Mar 21 16:29:06 CET 2007', 400 creationDate: 'Wed Mar 21 16:29:06 CET 2007',
404 updateDate: 'Wed Mar 21 16:29:06 CET 2007', 401 updateDate: 'Wed Mar 21 16:29:06 CET 2007',
405 accessDate: 'Mon Jan 19 16:10:01 CET 2009' 402 accessDate: 'Mon Jan 19 16:10:01 CET 2009'
406 } 403 }
407 } 404 }
408 }, 405 },
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/Connection.html b/frontend/gamma/tests/tests/Clipperz/PM/Connection.html
index 181a3bf..e2a3394 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/Connection.html
+++ b/frontend/gamma/tests/tests/Clipperz/PM/Connection.html
@@ -1,71 +1,68 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27--> 24-->
28 25
29<html> 26<html>
30<head> 27<head>
31 <title>Clipperz.PM.Connection - test</title> 28 <title>Clipperz.PM.Connection - test</title>
32 29
33 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 30 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
34 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> 31 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
35 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> 32 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
36 33
37 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script> 34 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script>
38 35
39 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> 36 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
40 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 37 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
41 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 38 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script> 39 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
43 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script> 40 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script>
44 <script type='text/javascript' src='../../../../js/Clipperz/Signal.js'></script> 41 <script type='text/javascript' src='../../../../js/Clipperz/Signal.js'></script>
45 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script> 42 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script>
46 43
47 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> 44 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
48 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> 45 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
49 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script> 46 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
50 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> 47 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
51 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script> 48 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
52 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script> 49 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script>
53 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script> 50 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script>
54 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script> 51 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script>
55 <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>
56 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script> 53 <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.Test.js'></script> 54 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script>
58 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script> 55 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script>
59 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script> 56 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script>
60 57
61 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.Async.js"></script> 58 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.Async.js"></script>
62 59
63</head> 60</head>
64<body> 61<body>
65 62
66<pre id="test"> 63<pre id="test">
67<script type="text/javascript" src="Connection.data.js"></script> 64<script type="text/javascript" src="Connection.data.js"></script>
68<script type="text/javascript" src="Connection.test.js"></script> 65<script type="text/javascript" src="Connection.test.js"></script>
69</pre> 66</pre>
70</body> 67</body>
71</html> 68</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/Connection.test.js b/frontend/gamma/tests/tests/Clipperz/PM/Connection.test.js
index e4d0d15..9d0036a 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/Connection.test.js
+++ b/frontend/gamma/tests/tests/Clipperz/PM/Connection.test.js
@@ -1,255 +1,252 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); 26Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
30 27
31var tests = { 28var tests = {
32 29
33 //------------------------------------------------------------------------- 30 //-------------------------------------------------------------------------
34 31
35 'simple_tests': function () { 32 'simple_tests': function () {
36 vardeferredResult; 33 vardeferredResult;
37 34
38 deferredResult = new Clipperz.Async.Deferred("simple_tests", {trace:false}); 35 deferredResult = new Clipperz.Async.Deferred("simple_tests", {trace:false});
39 deferredResult.addCallback(function() { 36 deferredResult.addCallback(function() {
40 var connection; 37 var connection;
41 38
42 SimpleTest.is(Clipperz.PM.Connection.communicationProtocol.versions['current'], Clipperz.PM.Connection.SRP['1.1'], "the current connection is 1.1"); 39 SimpleTest.is(Clipperz.PM.Connection.communicationProtocol.versions['current'], Clipperz.PM.Connection.SRP['1.1'], "the current connection is 1.1");
43 40
44 connection = new Clipperz.PM.Connection.communicationProtocol.versions['current'](); 41 connection = new Clipperz.PM.Connection.communicationProtocol.versions['current']();
45 SimpleTest.ok(connection != null, "can create a connection with the 'current' communication protocol"); 42 SimpleTest.ok(connection != null, "can create a connection with the 'current' communication protocol");
46 43
47 SimpleTest.is(connection.proxy(), Clipperz.PM.Proxy.defaultProxy, "the connection uses the defaultProxy if no proxy is specified on the constructor"); 44 SimpleTest.is(connection.proxy(), Clipperz.PM.Proxy.defaultProxy, "the connection uses the defaultProxy if no proxy is specified on the constructor");
48 }); 45 });
49 46
50 deferredResult.callback(); 47 deferredResult.callback();
51 48
52 return deferredResult; 49 return deferredResult;
53 }, 50 },
54 51
55 //------------------------------------------------------------------------- 52 //-------------------------------------------------------------------------
56 53
57 'simpleProxy_tests': function () { 54 'simpleProxy_tests': function () {
58 vardeferredResult; 55 vardeferredResult;
59 56
60 deferredResult = new Clipperz.Async.Deferred("simple_tests", {trace:false}); 57 deferredResult = new Clipperz.Async.Deferred("simple_tests", {trace:false});
61 deferredResult.addCallback(function() { 58 deferredResult.addCallback(function() {
62 var connection; 59 var connection;
63 var proxy; 60 var proxy;
64 61
65 proxy = new Clipperz.PM.Proxy(); 62 proxy = new Clipperz.PM.Proxy();
66 connection = new Clipperz.PM.Connection.communicationProtocol.versions['current']({proxy:proxy}); 63 connection = new Clipperz.PM.Connection.communicationProtocol.versions['current']({proxy:proxy});
67 SimpleTest.is(connection.proxy(), proxy, "the connection uses the specified proxy, when present"); 64 SimpleTest.is(connection.proxy(), proxy, "the connection uses the specified proxy, when present");
68 }); 65 });
69 66
70 deferredResult.callback(); 67 deferredResult.callback();
71 68
72 return deferredResult; 69 return deferredResult;
73 }, 70 },
74 71
75 //------------------------------------------------------------------------- 72 //-------------------------------------------------------------------------
76 73
77 'login_test': function () { 74 'login_test': function () {
78 var deferredResult; 75 var deferredResult;
79 var connection; 76 var connection;
80 var proxy; 77 var proxy;
81 78
82 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, shouldCheckExpectedRequests:true}); 79 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, shouldCheckExpectedRequests:true});
83 connection = new Clipperz.PM.Connection.communicationProtocol.versions['current']({ 80 connection = new Clipperz.PM.Connection.communicationProtocol.versions['current']({
84 proxy: proxy, 81 proxy: proxy,
85 getCredentialsFunction: function() { return {username:'joe', password:'clipperz'}; } 82 getCredentialsFunction: function() { return {username:'joe', password:'clipperz'}; }
86 }); 83 });
87 84
88 deferredResult = new Clipperz.Async.Deferred("login_tests", {trace:false}); 85 deferredResult = new Clipperz.Async.Deferred("login_tests", {trace:false});
89 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); 86 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
90 deferredResult.addCallback(function() { 87 deferredResult.addCallback(function() {
91 proxy.expectedRequests().unshift({ 88 proxy.expectedRequests().unshift({
92 name: "First handshake step", 89 name: "First handshake step",
93 functionName: 'handshake', 90 functionName: 'handshake',
94 parameters: { 91 parameters: {
95 parameters: { 92 parameters: {
96 message: MochiKit.Base.partial(MochiKit.Base.operator.eq, "connect"), 93 message: MochiKit.Base.partial(MochiKit.Base.operator.eq, "connect"),
97 version: MochiKit.Base.partial(MochiKit.Base.operator.eq, "0.2"), 94 version: MochiKit.Base.partial(MochiKit.Base.operator.eq, "0.2"),
98 parameters: { 95 parameters: {
99 C: MochiKit.Base.partial(MochiKit.Base.operator.eq, "f527cdd90d0d47f8524b4e165398ad1455eba515d04abd101d1e93b3c6ae0674"), 96 C: MochiKit.Base.partial(MochiKit.Base.operator.eq, "f527cdd90d0d47f8524b4e165398ad1455eba515d04abd101d1e93b3c6ae0674"),
100 A: MochiKit.Base.operator.truth 97 A: MochiKit.Base.operator.truth
101 } 98 }
102 } 99 }
103 } 100 }
104 }); 101 });
105 }); 102 });
106 deferredResult.addCallback(function() { 103 deferredResult.addCallback(function() {
107 proxy.expectedRequests().unshift({ 104 proxy.expectedRequests().unshift({
108 name: "Second handshake step", 105 name: "Second handshake step",
109 functionName: 'handshake', 106 functionName: 'handshake',
110 parameters: { 107 parameters: {
111 parameters: { 108 parameters: {
112 message: MochiKit.Base.partial(MochiKit.Base.operator.eq, "credentialCheck"), 109 message: MochiKit.Base.partial(MochiKit.Base.operator.eq, "credentialCheck"),
113 version: MochiKit.Base.partial(MochiKit.Base.operator.eq, "0.2"), 110 version: MochiKit.Base.partial(MochiKit.Base.operator.eq, "0.2"),
114 parameters: { 111 parameters: {
115 M1: MochiKit.Base.operator.truth 112 M1: MochiKit.Base.operator.truth
116 } 113 }
117 } 114 }
118 } 115 }
119 }); 116 });
120 }); 117 });
121 deferredResult.addMethod(connection, 'login'/*, 'joe', 'clipperz'*/); 118 deferredResult.addMethod(connection, 'login'/*, 'joe', 'clipperz'*/);
122 deferredResult.addCallback(function(aResult) { 119 deferredResult.addCallback(function(aResult) {
123 SimpleTest.is(aResult.result, 'done', "successfully logged in"); 120 SimpleTest.is(aResult.result, 'done', "successfully logged in");
124 }) 121 })
125 deferredResult.addErrback(SimpleTest.ok, false, "the login procedure should succeed, and NOT going through this code path"); 122 deferredResult.addErrback(SimpleTest.ok, false, "the login procedure should succeed, and NOT going through this code path");
126 deferredResult.callback(); 123 deferredResult.callback();
127 124
128 return deferredResult; 125 return deferredResult;
129 }, 126 },
130 127
131 //------------------------------------------------------------------------- 128 //-------------------------------------------------------------------------
132 129
133 'login_with_toll_test': function () { 130 'login_with_toll_test': function () {
134 var deferredResult; 131 var deferredResult;
135 var connection; 132 var connection;
136 var proxy; 133 var proxy;
137 134
138 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, shouldCheckExpectedRequests:true}); 135 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, shouldCheckExpectedRequests:true});
139 connection = new Clipperz.PM.Connection.communicationProtocol.versions['current']({ 136 connection = new Clipperz.PM.Connection.communicationProtocol.versions['current']({
140 proxy:proxy, 137 proxy:proxy,
141 getCredentialsFunction: function() { return {username:'joe', password:'clipperz'}; } 138 getCredentialsFunction: function() { return {username:'joe', password:'clipperz'}; }
142 }); 139 });
143 140
144 deferredResult = new Clipperz.Async.Deferred("login_with_toll_test", {trace:false}); 141 deferredResult = new Clipperz.Async.Deferred("login_with_toll_test", {trace:false});
145 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); 142 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
146 deferredResult.addCallback(function() { 143 deferredResult.addCallback(function() {
147 proxy.expectedRequests().unshift({ 144 proxy.expectedRequests().unshift({
148 name: "knock step", 145 name: "knock step",
149 functionName: 'knock', 146 functionName: 'knock',
150 parameters: { 147 parameters: {
151 requestType: MochiKit.Base.partial(MochiKit.Base.operator.eq, "CONNECT") 148 requestType: MochiKit.Base.partial(MochiKit.Base.operator.eq, "CONNECT")
152 } 149 }
153 }); 150 });
154 }); 151 });
155 deferredResult.addCallback(function() { 152 deferredResult.addCallback(function() {
156 proxy.expectedRequests().unshift({ 153 proxy.expectedRequests().unshift({
157 name: "First handshake step", 154 name: "First handshake step",
158 functionName: 'handshake', 155 functionName: 'handshake',
159 parameters: { 156 parameters: {
160 parameters: { 157 parameters: {
161 message: MochiKit.Base.partial(MochiKit.Base.operator.eq, "connect"), 158 message: MochiKit.Base.partial(MochiKit.Base.operator.eq, "connect"),
162 version: MochiKit.Base.partial(MochiKit.Base.operator.eq, "0.2"), 159 version: MochiKit.Base.partial(MochiKit.Base.operator.eq, "0.2"),
163 parameters: { 160 parameters: {
164 C: MochiKit.Base.partial(MochiKit.Base.operator.eq, "f527cdd90d0d47f8524b4e165398ad1455eba515d04abd101d1e93b3c6ae0674"), 161 C: MochiKit.Base.partial(MochiKit.Base.operator.eq, "f527cdd90d0d47f8524b4e165398ad1455eba515d04abd101d1e93b3c6ae0674"),
165 A: MochiKit.Base.operator.truth 162 A: MochiKit.Base.operator.truth
166 } 163 }
167 }, 164 },
168 toll: { 165 toll: {
169 targetValue: MochiKit.Base.operator.truth, 166 targetValue: MochiKit.Base.operator.truth,
170 toll: MochiKit.Base.operator.truth 167 toll: MochiKit.Base.operator.truth
171 } 168 }
172 } 169 }
173 }); 170 });
174 }); 171 });
175 deferredResult.addCallback(function() { 172 deferredResult.addCallback(function() {
176 proxy.expectedRequests().unshift({ 173 proxy.expectedRequests().unshift({
177 name: "Second handshake step", 174 name: "Second handshake step",
178 functionName: 'handshake', 175 functionName: 'handshake',
179 parameters: { 176 parameters: {
180 parameters: { 177 parameters: {
181 message: MochiKit.Base.partial(MochiKit.Base.operator.eq, "credentialCheck"), 178 message: MochiKit.Base.partial(MochiKit.Base.operator.eq, "credentialCheck"),
182 version: MochiKit.Base.partial(MochiKit.Base.operator.eq, "0.2"), 179 version: MochiKit.Base.partial(MochiKit.Base.operator.eq, "0.2"),
183 parameters: { 180 parameters: {
184 M1: MochiKit.Base.operator.truth 181 M1: MochiKit.Base.operator.truth
185 } 182 }
186 }, 183 },
187 toll: { 184 toll: {
188 targetValue: MochiKit.Base.operator.truth, 185 targetValue: MochiKit.Base.operator.truth,
189 toll: MochiKit.Base.operator.truth 186 toll: MochiKit.Base.operator.truth
190 } 187 }
191 } 188 }
192 }); 189 });
193 }); 190 });
194 deferredResult.addMethod(connection, 'login'/*, 'joe', 'clipperz'*/); 191 deferredResult.addMethod(connection, 'login'/*, 'joe', 'clipperz'*/);
195 deferredResult.addCallback(function(aResult) { 192 deferredResult.addCallback(function(aResult) {
196 SimpleTest.is(aResult.result, 'done', "successfully logged in"); 193 SimpleTest.is(aResult.result, 'done', "successfully logged in");
197 }) 194 })
198 deferredResult.callback(); 195 deferredResult.callback();
199 196
200 return deferredResult; 197 return deferredResult;
201 }, 198 },
202 199
203 //------------------------------------------------------------------------- 200 //-------------------------------------------------------------------------
204 201
205 'getUserDetails_test': function () { 202 'getUserDetails_test': function () {
206 var deferredResult; 203 var deferredResult;
207 var connection; 204 var connection;
208 var proxy; 205 var proxy;
209 206
210 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, shouldCheckExpectedRequests:false}); 207 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, shouldCheckExpectedRequests:false});
211 connection = new Clipperz.PM.Connection.communicationProtocol.versions['current']({ 208 connection = new Clipperz.PM.Connection.communicationProtocol.versions['current']({
212 proxy:proxy, 209 proxy:proxy,
213 getCredentialsFunction: function() { return {username:'joe', password:'clipperz'}; } 210 getCredentialsFunction: function() { return {username:'joe', password:'clipperz'}; }
214 }); 211 });
215 212
216 deferredResult = new Clipperz.Async.Deferred("getUserDetails_test", {trace:false}); 213 deferredResult = new Clipperz.Async.Deferred("getUserDetails_test", {trace:false});
217 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); 214 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
218 deferredResult.addMethod(connection, 'login'/*, 'joe', 'clipperz'*/); 215 deferredResult.addMethod(connection, 'login'/*, 'joe', 'clipperz'*/);
219 deferredResult.addCallback(function(aResult) { 216 deferredResult.addCallback(function(aResult) {
220 SimpleTest.is(aResult.result, 'done', "successfully logged in"); 217 SimpleTest.is(aResult.result, 'done', "successfully logged in");
221 }); 218 });
222 deferredResult.addMethod(proxy, 'setShouldCheckExpectedRequests', [ 219 deferredResult.addMethod(proxy, 'setShouldCheckExpectedRequests', [
223 { 220 {
224 name: "Get user details", 221 name: "Get user details",
225 functionName: 'message', 222 functionName: 'message',
226 parameters: { 223 parameters: {
227 parameters: { 224 parameters: {
228 message: MochiKit.Base.partial(MochiKit.Base.operator.eq, "getUserDetails"), 225 message: MochiKit.Base.partial(MochiKit.Base.operator.eq, "getUserDetails"),
229 srpSharedSecret: MochiKit.Base.operator.truth 226 srpSharedSecret: MochiKit.Base.operator.truth
230 }, 227 },
231 toll: { 228 toll: {
232 targetValue: MochiKit.Base.operator.truth, 229 targetValue: MochiKit.Base.operator.truth,
233 toll: MochiKit.Base.operator.truth 230 toll: MochiKit.Base.operator.truth
234 } 231 }
235 } 232 }
236 } 233 }
237 ]); 234 ]);
238 deferredResult.addMethod(connection, 'message', 'getUserDetails'); 235 deferredResult.addMethod(connection, 'message', 'getUserDetails');
239 deferredResult.addCallback(function(aResult) { 236 deferredResult.addCallback(function(aResult) {
240 SimpleTest.ok(aResult['header'] != null, "got user details - header"); 237 SimpleTest.ok(aResult['header'] != null, "got user details - header");
241 SimpleTest.ok(aResult['statistics'] != null, "got user details - statistics"); 238 SimpleTest.ok(aResult['statistics'] != null, "got user details - statistics");
242 SimpleTest.ok(aResult['version'] == '0.3', "got user details - version"); 239 SimpleTest.ok(aResult['version'] == '0.3', "got user details - version");
243 }); 240 });
244 deferredResult.callback(); 241 deferredResult.callback();
245 242
246 return deferredResult; 243 return deferredResult;
247 }, 244 },
248 245
249 //------------------------------------------------------------------------- 246 //-------------------------------------------------------------------------
250 'syntaxFix': MochiKit.Base.noop 247 'syntaxFix': MochiKit.Base.noop
251}; 248};
252 249
253//############################################################################# 250//#############################################################################
254 251
255SimpleTest.runDeferredTests("Clipperz.PM.Connection", tests, {trace:false}); 252SimpleTest.runDeferredTests("Clipperz.PM.Connection", tests, {trace:false});
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/Crypto.html b/frontend/gamma/tests/tests/Clipperz/PM/Crypto.html
index f95e994..044658e 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/Crypto.html
+++ b/frontend/gamma/tests/tests/Clipperz/PM/Crypto.html
@@ -1,281 +1,278 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27--> 24-->
28 25
29<html> 26<html>
30<head> 27<head>
31 <title>Clipperz.PM.Crypto - TEST</title> 28 <title>Clipperz.PM.Crypto - TEST</title>
32 29
33 <script> 30 <script>
34 jslog_config_enabled = true; 31 jslog_config_enabled = true;
35 clipperz_profiling_enabled = true; 32 clipperz_profiling_enabled = true;
36 </script> 33 </script>
37 34
38 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 35 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
39 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> 36 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
40 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> 37 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
41 38
42 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script> 39 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script>
43 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> 40 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
44 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script> 41 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
45 42
46 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 43 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
47 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 44 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
48 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script> 45 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
49 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script> 46 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script>
50 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script> 47 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script>
51 <script type='text/javascript' src='../../../../js/Clipperz/Profile.js'></script> 48 <script type='text/javascript' src='../../../../js/Clipperz/Profile.js'></script>
52 49
53 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> 50 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
54 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script> 51 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
55 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script> 52 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
56 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> 53 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
57 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> 54 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
58 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script> 55 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script>
59 56
60 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script> 57 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script>
61 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script> 58 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script>
62 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script> 59 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script>
63 60
64 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.Async.js"></script> 61 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.Async.js"></script>
65<!-- 62<!--
66 <script> 63 <script>
67 MochiKit.DOM.addLoadEvent(MochiKit.Base.partial(MochiKit.LoggingPane.createLoggingPane, true)); 64 MochiKit.DOM.addLoadEvent(MochiKit.Base.partial(MochiKit.LoggingPane.createLoggingPane, true));
68 MochiKit.Logging.logger.useNativeConsole = true; 65 MochiKit.Logging.logger.useNativeConsole = true;
69 </script> 66 </script>
70--> 67-->
71</head> 68</head>
72<body> 69<body>
73<pre id="test"> 70<pre id="test">
74 71
75<script type="text/javascript"> 72<script type="text/javascript">
76 73
77 74
78Clipperz_PM_Crypt_test = function() { 75Clipperz_PM_Crypt_test = function() {
79 varkey; 76 varkey;
80 77
81 var plainData; 78 var plainData;
82 var encryptedData; 79 var encryptedData;
83 var decryptedData; 80 var decryptedData;
84 81
85 var result; 82 var result;
86 var expectedResult; 83 var expectedResult;
87 84
88 var plainText; 85 var plainText;
89 var longPlainText; 86 var longPlainText;
90 87
91 key = 'trustno1'; 88 key = 'trustno1';
92 89
93 plainText = "Lorem ipsum dolor sit amet"; 90 plainText = "Lorem ipsum dolor sit amet";
94 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."; 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.";
95 92
96 // 93 //
97 //hashing 94 //hashing
98 // 95 //
99 plainData = new Clipperz.ByteArray(plainText); 96 plainData = new Clipperz.ByteArray(plainText);
100 97
101 result = Clipperz.PM.Crypto.encryptingFunctions.versions['0.1'].hash(plainData); 98 result = Clipperz.PM.Crypto.encryptingFunctions.versions['0.1'].hash(plainData);
102 is(result.length(), (256/8), "encryptingFunctions.versions[0.1].hash generate a 256 bit signature with a short text"); 99 is(result.length(), (256/8), "encryptingFunctions.versions[0.1].hash generate a 256 bit signature with a short text");
103 100
104 result = Clipperz.PM.Crypto.encryptingFunctions.versions['0.2'].hash(plainData); 101 result = Clipperz.PM.Crypto.encryptingFunctions.versions['0.2'].hash(plainData);
105 is(result.length(), (256/8), "encryptingFunctions.versions[0.2].hash generate a 256 bit signature with a short text"); 102 is(result.length(), (256/8), "encryptingFunctions.versions[0.2].hash generate a 256 bit signature with a short text");
106 103
107 104
108 plainData = new Clipperz.ByteArray(longPlainText); 105 plainData = new Clipperz.ByteArray(longPlainText);
109 106
110 result = Clipperz.PM.Crypto.encryptingFunctions.versions['0.1'].hash(plainData); 107 result = Clipperz.PM.Crypto.encryptingFunctions.versions['0.1'].hash(plainData);
111 is(result.length(), (256/8), "encryptingFunctions.versions[0.1].hash generate a 256 bit signature with a long text"); 108 is(result.length(), (256/8), "encryptingFunctions.versions[0.1].hash generate a 256 bit signature with a long text");
112 109
113 result = Clipperz.PM.Crypto.encryptingFunctions.versions['0.2'].hash(plainData); 110 result = Clipperz.PM.Crypto.encryptingFunctions.versions['0.2'].hash(plainData);
114 is(result.length(), (256/8), "encryptingFunctions.versions[0.2].hash generate a 256 bit signature with a long text"); 111 is(result.length(), (256/8), "encryptingFunctions.versions[0.2].hash generate a 256 bit signature with a long text");
115 112
116 113
117 // 114 //
118 //encrypting / decripting 115 //encrypting / decripting
119 // 116 //
120 plainData = plainText; 117 plainData = plainText;
121 118
122 encryptedData = Clipperz.PM.Crypto.encryptingFunctions.versions['0.1'].encrypt(key, plainData); 119 encryptedData = Clipperz.PM.Crypto.encryptingFunctions.versions['0.1'].encrypt(key, plainData);
123 decryptedData = Clipperz.PM.Crypto.encryptingFunctions.versions['0.1'].decrypt(key, encryptedData); 120 decryptedData = Clipperz.PM.Crypto.encryptingFunctions.versions['0.1'].decrypt(key, encryptedData);
124 is(plainData.toString(), decryptedData.toString(), "encryptingFunctions.versions[0.1] of encrypt/decrypt functions work with a short text"); 121 is(plainData.toString(), decryptedData.toString(), "encryptingFunctions.versions[0.1] of encrypt/decrypt functions work with a short text");
125 122
126 encryptedData = Clipperz.PM.Crypto.encryptingFunctions.versions['0.2'].encrypt(key, plainData); 123 encryptedData = Clipperz.PM.Crypto.encryptingFunctions.versions['0.2'].encrypt(key, plainData);
127 decryptedData = Clipperz.PM.Crypto.encryptingFunctions.versions['0.2'].decrypt(key, encryptedData); 124 decryptedData = Clipperz.PM.Crypto.encryptingFunctions.versions['0.2'].decrypt(key, encryptedData);
128 is(plainData.toString(), decryptedData.toString(), "encryptingFunctions.versions[0.2] of encrypt/decrypt functions work with a short text"); 125 is(plainData.toString(), decryptedData.toString(), "encryptingFunctions.versions[0.2] of encrypt/decrypt functions work with a short text");
129 126
130//console.time("encrypt-256-short"); 127//console.time("encrypt-256-short");
131 encryptedData = Clipperz.PM.Crypto.encryptingFunctions.versions['0.3'].encrypt(key, plainData); 128 encryptedData = Clipperz.PM.Crypto.encryptingFunctions.versions['0.3'].encrypt(key, plainData);
132//console.timeEnd("encrypt-256-short"); 129//console.timeEnd("encrypt-256-short");
133//console.time("decrypt-256-short"); 130//console.time("decrypt-256-short");
134 decryptedData = Clipperz.PM.Crypto.encryptingFunctions.versions['0.3'].decrypt(key, encryptedData); 131 decryptedData = Clipperz.PM.Crypto.encryptingFunctions.versions['0.3'].decrypt(key, encryptedData);
135//console.timeEnd("decrypt-256-short"); 132//console.timeEnd("decrypt-256-short");
136 is(plainData.toString(), decryptedData.toString(), "encryptingFunctions.versions[0.3] of encrypt/decrypt functions work with a short text"); 133 is(plainData.toString(), decryptedData.toString(), "encryptingFunctions.versions[0.3] of encrypt/decrypt functions work with a short text");
137 134
138 135
139 plainData = longPlainText + longPlainText + longPlainText + longPlainText + longPlainText + longPlainText + longPlainText + longPlainText; 136 plainData = longPlainText + longPlainText + longPlainText + longPlainText + longPlainText + longPlainText + longPlainText + longPlainText;
140 137
141/* 138/*
142 encryptedData = Clipperz.PM.Crypto.encryptingFunctions.versions['0.1'].encrypt(key, plainData); 139 encryptedData = Clipperz.PM.Crypto.encryptingFunctions.versions['0.1'].encrypt(key, plainData);
143 decryptedData = Clipperz.PM.Crypto.encryptingFunctions.versions['0.1'].decrypt(key, encryptedData); 140 decryptedData = Clipperz.PM.Crypto.encryptingFunctions.versions['0.1'].decrypt(key, encryptedData);
144 is(plainData, decryptedData, "encryptingFunctions.versions[0.1] of encrypt/decrypt functions work with a long text"); 141 is(plainData, decryptedData, "encryptingFunctions.versions[0.1] of encrypt/decrypt functions work with a long text");
145 142
146 encryptedData = Clipperz.PM.Crypto.encryptingFunctions.versions['0.2'].encrypt(key, plainData); 143 encryptedData = Clipperz.PM.Crypto.encryptingFunctions.versions['0.2'].encrypt(key, plainData);
147 decryptedData = Clipperz.PM.Crypto.encryptingFunctions.versions['0.2'].decrypt(key, encryptedData); 144 decryptedData = Clipperz.PM.Crypto.encryptingFunctions.versions['0.2'].decrypt(key, encryptedData);
148 is(plainData, decryptedData, "encryptingFunctions.versions[0.2] of encrypt/decrypt functions work with a long text"); 145 is(plainData, decryptedData, "encryptingFunctions.versions[0.2] of encrypt/decrypt functions work with a long text");
149 146
150 encryptedData = Clipperz.PM.Crypto.encryptingFunctions.versions['0.3'].encrypt(key, plainData); 147 encryptedData = Clipperz.PM.Crypto.encryptingFunctions.versions['0.3'].encrypt(key, plainData);
151 decryptedData = Clipperz.PM.Crypto.encryptingFunctions.versions['0.3'].decrypt(key, encryptedData); 148 decryptedData = Clipperz.PM.Crypto.encryptingFunctions.versions['0.3'].decrypt(key, encryptedData);
152 is(plainData, decryptedData, "encryptingFunctions.versions[0.3] of encrypt/decrypt functions work with a long text"); 149 is(plainData, decryptedData, "encryptingFunctions.versions[0.3] of encrypt/decrypt functions work with a long text");
153*/ 150*/
154 151
155 { 152 {
156 var deferredResult; 153 var deferredResult;
157 var startTime; 154 var startTime;
158 // var nonce; 155 // var nonce;
159 156
160 // nonce = new Clipperz.ByteArray("0x00000000000000000000000000000000"); 157 // nonce = new Clipperz.ByteArray("0x00000000000000000000000000000000");
161 plainData = plainData + plainData + plainData + plainData + plainData + plainData + plainData + plainData; 158 plainData = plainData + plainData + plainData + plainData + plainData + plainData + plainData + plainData;
162MochiKit.Logging.logDebug("plainData length: " + plainData.length); 159MochiKit.Logging.logDebug("plainData length: " + plainData.length);
163 startTime = new Date(); 160 startTime = new Date();
164 161
165 deferredResult = new MochiKit.Async.Deferred(); 162 deferredResult = new MochiKit.Async.Deferred();
166 163
167 deferredResult.addCallback(function() { 164 deferredResult.addCallback(function() {
168 return Clipperz.PM.Crypto.deferredEncrypt({key:key, value:plainData, version:'0.3'}); 165 return Clipperz.PM.Crypto.deferredEncrypt({key:key, value:plainData, version:'0.3'});
169 // return Clipperz.PM.Crypto.encrypt(key, plainData, '0.3' / *Clipperz.PM.Crypto.encryptingFunctions.currentVersion* /); 166 // return Clipperz.PM.Crypto.encrypt(key, plainData, '0.3' / *Clipperz.PM.Crypto.encryptingFunctions.currentVersion* /);
170 }); 167 });
171 deferredResult.addCallback(function(aResult) { 168 deferredResult.addCallback(function(aResult) {
172 MochiKit.Logging.logDebug("encrypting: " + (new Date() - startTime)); 169 MochiKit.Logging.logDebug("encrypting: " + (new Date() - startTime));
173 startTime = new Date(); 170 startTime = new Date();
174 return aResult; 171 return aResult;
175 }); 172 });
176 deferredResult.addCallback(MochiKit.Async.wait, 1); 173 deferredResult.addCallback(MochiKit.Async.wait, 1);
177 deferredResult.addCallback(function(aResult) { 174 deferredResult.addCallback(function(aResult) {
178 MochiKit.Logging.logDebug("pause: " + (new Date() - startTime)); 175 MochiKit.Logging.logDebug("pause: " + (new Date() - startTime));
179 startTime = new Date(); 176 startTime = new Date();
180 return aResult; 177 return aResult;
181 }); 178 });
182 deferredResult.addCallback(function(anEncryptedValue) { 179 deferredResult.addCallback(function(anEncryptedValue) {
183 return Clipperz.PM.Crypto.deferredDecrypt({key:key, value:anEncryptedValue, version:'0.3'}); 180 return Clipperz.PM.Crypto.deferredDecrypt({key:key, value:anEncryptedValue, version:'0.3'});
184 }); 181 });
185 deferredResult.addCallback(function(aResult) { 182 deferredResult.addCallback(function(aResult) {
186 MochiKit.Logging.logDebug("decrypting: " + (new Date() - startTime)); 183 MochiKit.Logging.logDebug("decrypting: " + (new Date() - startTime));
187 startTime = new Date(); 184 startTime = new Date();
188 return aResult; 185 return aResult;
189 }); 186 });
190 deferredResult.addCallback(MochiKit.Async.wait, 1); 187 deferredResult.addCallback(MochiKit.Async.wait, 1);
191 deferredResult.addBoth(function(aDecryptedValue) { 188 deferredResult.addBoth(function(aDecryptedValue) {
192 is(plainData, aDecryptedValue, "deferredEncript/deferredDecript functions work with a long text"); 189 is(plainData, aDecryptedValue, "deferredEncript/deferredDecript functions work with a long text");
193 }); 190 });
194 191
195 192
196 193
197/* 194/*
198 deferredResult.addCallback(function(aResult) { 195 deferredResult.addCallback(function(aResult) {
199 var i,c; 196 var i,c;
200 var currentChar; 197 var currentChar;
201 var unicode; 198 var unicode;
202 199
203 unicode = 150; 200 unicode = 150;
204 201
205 c = 100000; 202 c = 100000;
206 startTime = new Date(); 203 startTime = new Date();
207 for (i=0; i<c; i++) { 204 for (i=0; i<c; i++) {
208 currentChar = String.fromCharCode(unicode+1); 205 currentChar = String.fromCharCode(unicode+1);
209 } 206 }
210 MochiKit.Logging.logDebug("String.fromCharCode: " + (new Date() - startTime)); 207 MochiKit.Logging.logDebug("String.fromCharCode: " + (new Date() - startTime));
211 }); 208 });
212 209
213 deferredResult.addCallback(function(aResult) { 210 deferredResult.addCallback(function(aResult) {
214 var i,c; 211 var i,c;
215 var currentByte; 212 var currentByte;
216 var unicode; 213 var unicode;
217 214
218 currentByte = 150; 215 currentByte = 150;
219 216
220 c = 100000; 217 c = 100000;
221 startTime = new Date(); 218 startTime = new Date();
222 for (i=0; i<c; i++) { 219 for (i=0; i<c; i++) {
223 unicode = (currentByte & 0x0f) << (6+6); 220 unicode = (currentByte & 0x0f) << (6+6);
224 } 221 }
225 MochiKit.Logging.logDebug("(currentByte & 0x0f) << (6+6): " + (new Date() - startTime)); 222 MochiKit.Logging.logDebug("(currentByte & 0x0f) << (6+6): " + (new Date() - startTime));
226 }); 223 });
227 224
228 deferredResult.addCallback(function(aResult) { 225 deferredResult.addCallback(function(aResult) {
229 var i,c; 226 var i,c;
230 var currentByte; 227 var currentByte;
231 var byteArray; 228 var byteArray;
232 229
233 currentByte = 150; 230 currentByte = 150;
234 231
235 byteArray = new Clipperz.ByteArray(plainData); 232 byteArray = new Clipperz.ByteArray(plainData);
236 c = byteArray.length(); 233 c = byteArray.length();
237 startTime = new Date(); 234 startTime = new Date();
238 for (i=0; i<c; i++) { 235 for (i=0; i<c; i++) {
239 currentByte = byteArray.byteAtIndex(i); 236 currentByte = byteArray.byteAtIndex(i);
240 } 237 }
241 MochiKit.Logging.logDebug("byteAtIndex: " + (new Date() - startTime)); 238 MochiKit.Logging.logDebug("byteAtIndex: " + (new Date() - startTime));
242 }); 239 });
243*/ 240*/
244 241
245 deferredResult.addBoth(function() { 242 deferredResult.addBoth(function() {
246 SimpleTest.ok(true, "COMPLETED all tests"); 243 SimpleTest.ok(true, "COMPLETED all tests");
247 SimpleTest.finish(); 244 SimpleTest.finish();
248 }) 245 })
249 246
250 deferredResult.callback(); 247 deferredResult.callback();
251 } 248 }
252 249
253 SimpleTest.waitForExplicitFinish(); 250 SimpleTest.waitForExplicitFinish();
254} 251}
255 252
256//############################################################################# 253//#############################################################################
257 254
258try { 255try {
259 MochiKit.Signal.connect(Clipperz.Crypto.PRNG.defaultRandomGenerator(), 'readyToGenerateRandomBytes', Clipperz_PM_Crypt_test); 256 MochiKit.Signal.connect(Clipperz.Crypto.PRNG.defaultRandomGenerator(), 'readyToGenerateRandomBytes', Clipperz_PM_Crypt_test);
260 257
261 Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); 258 Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
262 SimpleTest.waitForExplicitFinish(); 259 SimpleTest.waitForExplicitFinish();
263} catch (err) { 260} catch (err) {
264 261
265 var s = "test suite failure!\n"; 262 var s = "test suite failure!\n";
266 var o = {}; 263 var o = {};
267 var k = null; 264 var k = null;
268 for (k in err) { 265 for (k in err) {
269 // ensure unique keys?! 266 // ensure unique keys?!
270 if (!o[k]) { 267 if (!o[k]) {
271 s += k + ": " + err[k] + "\n"; 268 s += k + ": " + err[k] + "\n";
272 o[k] = err[k]; 269 o[k] = err[k];
273 } 270 }
274 } 271 }
275 ok ( false, s ); 272 ok ( false, s );
276} 273}
277 274
278</script> 275</script>
279</pre> 276</pre>
280</body> 277</body>
281</html> 278</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/Crypto_performanceEvaluation.html b/frontend/gamma/tests/tests/Clipperz/PM/Crypto_performanceEvaluation.html
index 094a58d..e8ce0bc 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/Crypto_performanceEvaluation.html
+++ b/frontend/gamma/tests/tests/Clipperz/PM/Crypto_performanceEvaluation.html
@@ -1,153 +1,150 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27--> 24-->
28 25
29<html> 26<html>
30<head> 27<head>
31 <title>Clipperz.PM.Crypt - Performance evaluation - TEST</title> 28 <title>Clipperz.PM.Crypt - Performance evaluation - TEST</title>
32 29
33 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 30 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
34 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> 31 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
35 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> 32 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
36 33
37 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script> 34 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script>
38 35
39 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> 36 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
40 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 37 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
41 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 38 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script> 39 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
43 40
44 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> 41 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
45 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script> 42 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
46 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script> 43 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
47 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> 44 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
48 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> 45 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
49 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script> 46 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script>
50 47
51 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script> 48 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script>
52 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script> 49 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script>
53 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script> 50 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script>
54 51
55<!--< script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES_other_implementation.js'>< /script> --> 52<!--< script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES_other_implementation.js'>< /script> -->
56 53
57</head> 54</head>
58<body> 55<body>
59<pre id="test"> 56<pre id="test">
60 57
61<script type="text/javascript"> 58<script type="text/javascript">
62 59
63try { 60try {
64 var key; 61 var key;
65 var shortText; 62 var shortText;
66 var longText; 63 var longText;
67 var veryLongText; 64 var veryLongText;
68 var byteArray; 65 var byteArray;
69 varplainText; 66 varplainText;
70 var encryptedText; 67 var encryptedText;
71 var decryptedText; 68 var decryptedText;
72 var startTime, endTime; 69 var startTime, endTime;
73 var startTime1, endTime1; 70 var startTime1, endTime1;
74 var ClipperzCryptoVersion; 71 var ClipperzCryptoVersion;
75 var i,c; 72 var i,c;
76 73
77 ClipperzCryptoVersion = '0.3'; 74 ClipperzCryptoVersion = '0.3';
78 Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); 75 Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
79 key = 'trustno1'; 76 key = 'trustno1';
80 77
81 shortText = "Lorem ipsum dolor sit amet"; 78 shortText = "Lorem ipsum dolor sit amet";
82 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."; 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.";
83 veryLongText = ""; 80 veryLongText = "";
84 c = 100; 81 c = 100;
85 for (i=0; i<100; i++) { 82 for (i=0; i<100; i++) {
86 veryLongText += longText; 83 veryLongText += longText;
87 } 84 }
88 nonce = new Clipperz.ByteArray(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); 85 nonce = new Clipperz.ByteArray(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
89 86
90 87
91 //-------------------------------------------------------------- 88 //--------------------------------------------------------------
92 // 89 //
93 // longTextencryption performance 90 // longTextencryption performance
94 // 91 //
95 //-------------------------------------------------------------- 92 //--------------------------------------------------------------
96 93
97 plainText = longText; 94 plainText = longText;
98 95
99startTime = new Date(); 96startTime = new Date();
100 encryptedText = Clipperz.PM.Crypto.encryptingFunctions.versions[ClipperzCryptoVersion].encrypt(key, plainText, nonce); 97 encryptedText = Clipperz.PM.Crypto.encryptingFunctions.versions[ClipperzCryptoVersion].encrypt(key, plainText, nonce);
101endTime = new Date(); 98endTime = new Date();
102//console.log("[1] encryption time: " + (endTime - startTime)); 99//console.log("[1] encryption time: " + (endTime - startTime));
103 is((endTime - startTime < 350), true, "[1] Need to improve some more (" + (endTime - startTime) + ")"); 100 is((endTime - startTime < 350), true, "[1] Need to improve some more (" + (endTime - startTime) + ")");
104 is(encryptedText, "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", "encrypted text"); 101 is(encryptedText, "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", "encrypted text");
105 decryptedText = Clipperz.PM.Crypto.encryptingFunctions.versions[ClipperzCryptoVersion].decrypt(key, encryptedText); 102 decryptedText = Clipperz.PM.Crypto.encryptingFunctions.versions[ClipperzCryptoVersion].decrypt(key, encryptedText);
106 is(decryptedText, plainText, "encrypt <-> decrypt works (specifying the nonce)"); 103 is(decryptedText, plainText, "encrypt <-> decrypt works (specifying the nonce)");
107 104
108startTime = new Date(); 105startTime = new Date();
109 encryptedText = Clipperz.PM.Crypto.encryptingFunctions.versions[ClipperzCryptoVersion].encrypt(key, plainText); 106 encryptedText = Clipperz.PM.Crypto.encryptingFunctions.versions[ClipperzCryptoVersion].encrypt(key, plainText);
110endTime = new Date(); 107endTime = new Date();
111//console.log("[2] encryption time: " + (endTime - startTime)); 108//console.log("[2] encryption time: " + (endTime - startTime));
112 is((endTime - startTime < 350), true, "[2] Need to improve some more (" + (endTime - startTime) + ")"); 109 is((endTime - startTime < 350), true, "[2] Need to improve some more (" + (endTime - startTime) + ")");
113 decryptedText = Clipperz.PM.Crypto.encryptingFunctions.versions[ClipperzCryptoVersion].decrypt(key, encryptedText); 110 decryptedText = Clipperz.PM.Crypto.encryptingFunctions.versions[ClipperzCryptoVersion].decrypt(key, encryptedText);
114 is(decryptedText, plainText, "encrypt <-> decrypt works"); 111 is(decryptedText, plainText, "encrypt <-> decrypt works");
115 112
116 //-------------------------------------------------------------- 113 //--------------------------------------------------------------
117 // 114 //
118 // veryLongTextencryption performance 115 // veryLongTextencryption performance
119 // 116 //
120 //-------------------------------------------------------------- 117 //--------------------------------------------------------------
121/* 118/*
122 plainText = veryLongText; 119 plainText = veryLongText;
123 120
124startTime = new Date(); 121startTime = new Date();
125 encryptedText = Clipperz.PM.Crypto.encryptingFunctions.versions[ClipperzCryptoVersion].encrypt(key, plainText); 122 encryptedText = Clipperz.PM.Crypto.encryptingFunctions.versions[ClipperzCryptoVersion].encrypt(key, plainText);
126endTime = new Date(); 123endTime = new Date();
127//console.log("[3] encryption time: " + (endTime - startTime)); 124//console.log("[3] encryption time: " + (endTime - startTime));
128 is((endTime - startTime < 35000), true, "[3] Need to improve some more (" + (endTime - startTime) + ")"); 125 is((endTime - startTime < 35000), true, "[3] Need to improve some more (" + (endTime - startTime) + ")");
129 decryptedText = Clipperz.PM.Crypto.encryptingFunctions.versions[ClipperzCryptoVersion].decrypt(key, encryptedText); 126 decryptedText = Clipperz.PM.Crypto.encryptingFunctions.versions[ClipperzCryptoVersion].decrypt(key, encryptedText);
130 is(decryptedText, plainText, "encrypt <-> decrypt works"); 127 is(decryptedText, plainText, "encrypt <-> decrypt works");
131*/ 128*/
132 129
133//############################################################################# 130//#############################################################################
134 131
135} catch (err) { 132} catch (err) {
136 133
137 var s = "test suite failure!\n"; 134 var s = "test suite failure!\n";
138 var o = {}; 135 var o = {};
139 var k = null; 136 var k = null;
140 for (k in err) { 137 for (k in err) {
141 // ensure unique keys?! 138 // ensure unique keys?!
142 if (!o[k]) { 139 if (!o[k]) {
143 s += k + ": " + err[k] + "\n"; 140 s += k + ": " + err[k] + "\n";
144 o[k] = err[k]; 141 o[k] = err[k];
145 } 142 }
146 } 143 }
147 ok ( false, s ); 144 ok ( false, s );
148} 145}
149 146
150</script> 147</script>
151</pre> 148</pre>
152</body> 149</body>
153</html> 150</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/Crypto_test.html b/frontend/gamma/tests/tests/Clipperz/PM/Crypto_test.html
index f5b0a60..dc01dae 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/Crypto_test.html
+++ b/frontend/gamma/tests/tests/Clipperz/PM/Crypto_test.html
@@ -1,169 +1,166 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27--> 24-->
28 25
29<html> 26<html>
30<head> 27<head>
31 <title>Clipperz.PM.Crypto - TEST</title> 28 <title>Clipperz.PM.Crypto - TEST</title>
32 29
33 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 30 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
34 31
35 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script> 32 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script>
36 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> 33 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
37 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script> 34 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
38 35
39 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 36 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
40 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 37 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
41 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script> 38 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script> 39 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script>
43 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script> 40 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
44 41
45 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> 42 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
46 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script> 43 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
47 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script> 44 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
48 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> 45 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
49 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> 46 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
50 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script> 47 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script>
51 48
52 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script> 49 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script>
53 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script> 50 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script>
54 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script> 51 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script>
55 52
56 53
57<!-- ================================================================================ --> <script> 54<!-- ================================================================================ --> <script>
58//MochiKit.DOM.addLoadEvent(MochiKit.Base.partial(MochiKit.LoggingPane.createLoggingPane, true)); 55//MochiKit.DOM.addLoadEvent(MochiKit.Base.partial(MochiKit.LoggingPane.createLoggingPane, true));
59//MochiKit.Logging.logger.useNativeConsole = true; 56//MochiKit.Logging.logger.useNativeConsole = true;
60 57
61//----------------------------------------------------------------------------- 58//-----------------------------------------------------------------------------
62 59
63encodePassword = function (anEvent) { 60encodePassword = function (anEvent) {
64 varusername; 61 varusername;
65 var password; 62 var password;
66 var encodedPassword; 63 var encodedPassword;
67 var srpConnection; 64 var srpConnection;
68 65
69 anEvent.stop(); 66 anEvent.stop();
70 67
71 srpConnection = new Clipperz.PM.Connection.SRP['1.1'](); 68 srpConnection = new Clipperz.PM.Connection.SRP['1.1']();
72 69
73 username = MochiKit.DOM.getElement('username').value; 70 username = MochiKit.DOM.getElement('username').value;
74 passphrase = MochiKit.DOM.getElement('passphrase').value; 71 passphrase = MochiKit.DOM.getElement('passphrase').value;
75 encodedPassword = srpConnection.normalizedCredentials({'username':username , 'password':passphrase })['password']; 72 encodedPassword = srpConnection.normalizedCredentials({'username':username , 'password':passphrase })['password'];
76 73
77 MochiKit.DOM.getElement('encodedPassword').value = encodedPassword; 74 MochiKit.DOM.getElement('encodedPassword').value = encodedPassword;
78} 75}
79 76
80//----------------------------------------------------------------------------- 77//-----------------------------------------------------------------------------
81 78
82decryptData = function (anEvent) { 79decryptData = function (anEvent) {
83 vardeferredResult; 80 vardeferredResult;
84 varkey; 81 varkey;
85 varversion; 82 varversion;
86 var value; 83 var value;
87 84
88 key = MochiKit.DOM.getElement('key').value; 85 key = MochiKit.DOM.getElement('key').value;
89 version = MochiKit.DOM.getElement('version').value; 86 version = MochiKit.DOM.getElement('version').value;
90 value = MochiKit.DOM.getElement('encryptedText').value; 87 value = MochiKit.DOM.getElement('encryptedText').value;
91 88
92 anEvent.stop(); 89 anEvent.stop();
93 90
94 deferredResult = new Clipperz.Async.Deferred("Decrypted data", {trace:false}); 91 deferredResult = new Clipperz.Async.Deferred("Decrypted data", {trace:false});
95 deferredResult.addCallback(Clipperz.PM.Crypto.deferredDecrypt, {key:key, version:version, value:value}); 92 deferredResult.addCallback(Clipperz.PM.Crypto.deferredDecrypt, {key:key, version:version, value:value});
96 deferredResult.addCallback(Clipperz.Base.serializeJSON); 93 deferredResult.addCallback(Clipperz.Base.serializeJSON);
97 deferredResult.addCallback(function (aValue) { 94 deferredResult.addCallback(function (aValue) {
98 MochiKit.DOM.getElement('decryptedText').value = aValue; 95 MochiKit.DOM.getElement('decryptedText').value = aValue;
99 }); 96 });
100 deferredResult.addErrback(alert); 97 deferredResult.addErrback(alert);
101 98
102 deferredResult.callback(); 99 deferredResult.callback();
103} 100}
104 101
105//----------------------------------------------------------------------------- 102//-----------------------------------------------------------------------------
106 103
107encryptData = function (anEvent) { 104encryptData = function (anEvent) {
108 vardeferredResult; 105 vardeferredResult;
109 varkey; 106 varkey;
110 varversion; 107 varversion;
111 var value; 108 var value;
112 109
113 key = MochiKit.DOM.getElement('key').value; 110 key = MochiKit.DOM.getElement('key').value;
114 version = MochiKit.DOM.getElement('version').value; 111 version = MochiKit.DOM.getElement('version').value;
115 value = Clipperz.Base.evalJSON(MochiKit.DOM.getElement('decryptedText').value); 112 value = Clipperz.Base.evalJSON(MochiKit.DOM.getElement('decryptedText').value);
116 113
117 anEvent.stop(); 114 anEvent.stop();
118 115
119 deferredResult = new Clipperz.Async.Deferred("Encrypted data", {trace:false}); 116 deferredResult = new Clipperz.Async.Deferred("Encrypted data", {trace:false});
120 deferredResult.addCallback(Clipperz.PM.Crypto.deferredEncrypt, {key:key, version:version, value:value}); 117 deferredResult.addCallback(Clipperz.PM.Crypto.deferredEncrypt, {key:key, version:version, value:value});
121 deferredResult.addCallback(function (aValue) { 118 deferredResult.addCallback(function (aValue) {
122 MochiKit.DOM.getElement('encryptedText').value = aValue; 119 MochiKit.DOM.getElement('encryptedText').value = aValue;
123 }); 120 });
124 deferredResult.addErrback(alert); 121 deferredResult.addErrback(alert);
125 122
126 deferredResult.callback(); 123 deferredResult.callback();
127} 124}
128 125
129//----------------------------------------------------------------------------- 126//-----------------------------------------------------------------------------
130 127
131init = function () { 128init = function () {
132 Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); 129 Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
133 130
134 131
135 MochiKit.Signal.connect('decryptForm', 'onsubmit', decryptData) 132 MochiKit.Signal.connect('decryptForm', 'onsubmit', decryptData)
136 MochiKit.Signal.connect('decryptButton', 'onclick', decryptData) 133 MochiKit.Signal.connect('decryptButton', 'onclick', decryptData)
137 MochiKit.Signal.connect('encryptButton', 'onclick', encryptData) 134 MochiKit.Signal.connect('encryptButton', 'onclick', encryptData)
138 135
139 //MochiKit.Signal.connect('encodePassword', 'onclick', encodePassword) 136 //MochiKit.Signal.connect('encodePassword', 'onclick', encodePassword)
140} 137}
141 138
142//----------------------------------------------------------------------------- 139//-----------------------------------------------------------------------------
143 140
144MochiKit.DOM.addLoadEvent(init); 141MochiKit.DOM.addLoadEvent(init);
145 142
146</script> <!-- =============================================================================== --> 143</script> <!-- =============================================================================== -->
147 144
148</head> 145</head>
149<body> 146<body>
150<!-- 147<!--
151 <form id='computeKey'> 148 <form id='computeKey'>
152 <input type='text' name='username' value='' id='username' size='30'/> 149 <input type='text' name='username' value='' id='username' size='30'/>
153 <input type='text' name='passphrase' value='' id='passphrase' size='30'/> 150 <input type='text' name='passphrase' value='' id='passphrase' size='30'/>
154 <input type='button' name='encode' value='encode' id='encodePassword'> 151 <input type='button' name='encode' value='encode' id='encodePassword'>
155 <input type='text' name='encodedPassword' value='' id='encodedPassword' size='30'/> 152 <input type='text' name='encodedPassword' value='' id='encodedPassword' size='30'/>
156 </form> 153 </form>
157 <hr> 154 <hr>
158--> 155-->
159 <form id='decryptForm'> 156 <form id='decryptForm'>
160 <div><textarea id='encryptedText' cols='80' rows='20'></textarea></div> 157 <div><textarea id='encryptedText' cols='80' rows='20'></textarea></div>
161 <div><input type='text' name='key' value='' id='key' size='30'/></div> 158 <div><input type='text' name='key' value='' id='key' size='30'/></div>
162 <div><input type='text' name='version' value='0.3' id='version' /></div> 159 <div><input type='text' name='version' value='0.3' id='version' /></div>
163 <div><input type='button' name='decrypt' value='decrypt' id='decryptButton'> <input type='button' name='encrypt' value='encrypt' id='encryptButton'></div> 160 <div><input type='button' name='decrypt' value='decrypt' id='decryptButton'> <input type='button' name='encrypt' value='encrypt' id='encryptButton'></div>
164 <hr> 161 <hr>
165 <div><textarea id='decryptedText' cols='80' rows='20' style="background-color: lightgrey;">&lt;result&gt;</textarea></div> 162 <div><textarea id='decryptedText' cols='80' rows='20' style="background-color: lightgrey;">&lt;result&gt;</textarea></div>
166 </form> 163 </form>
167 164
168</body> 165</body>
169</html> \ No newline at end of file 166</html> \ No newline at end of file
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/DirectLogin.html b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/DirectLogin.html
index e11adfd..0a5bcfb 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/DirectLogin.html
+++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/DirectLogin.html
@@ -1,103 +1,100 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27--> 24-->
28 25
29<html> 26<html>
30<head> 27<head>
31 <title>Clipperz.PM.DataModel.DirectLogin - test</title> 28 <title>Clipperz.PM.DataModel.DirectLogin - test</title>
32 29
33 <script type="text/javascript" src="../../../../../js/MochiKit/MochiKit.js"></script> 30 <script type="text/javascript" src="../../../../../js/MochiKit/MochiKit.js"></script>
34 <script type="text/javascript" src="../../../../SimpleTest/SimpleTest.js"></script> 31 <script type="text/javascript" src="../../../../SimpleTest/SimpleTest.js"></script>
35 <link rel="stylesheet" type="text/css" href="../../../../SimpleTest/test.css"> 32 <link rel="stylesheet" type="text/css" href="../../../../SimpleTest/test.css">
36 33
37 <script type='text/javascript' src='../../../../../js/JSON/json2.js'></script> 34 <script type='text/javascript' src='../../../../../js/JSON/json2.js'></script>
38 35
39 <script type='text/javascript' src='../../../../../js/Clipperz/YUI/Utils.js'></script> 36 <script type='text/javascript' src='../../../../../js/Clipperz/YUI/Utils.js'></script>
40 <script type='text/javascript' src='../../../../../js/Clipperz/Base.js'></script> 37 <script type='text/javascript' src='../../../../../js/Clipperz/Base.js'></script>
41 <script type='text/javascript' src='../../../../../js/Clipperz/Date.js'></script> 38 <script type='text/javascript' src='../../../../../js/Clipperz/Date.js'></script>
42 <script type='text/javascript' src='../../../../../js/Clipperz/ByteArray.js'></script> 39 <script type='text/javascript' src='../../../../../js/Clipperz/ByteArray.js'></script>
43 <script type='text/javascript' src='../../../../../js/Clipperz/Logging.js'></script> 40 <script type='text/javascript' src='../../../../../js/Clipperz/Logging.js'></script>
44 <script type='text/javascript' src='../../../../../js/Clipperz/Async.js'></script> 41 <script type='text/javascript' src='../../../../../js/Clipperz/Async.js'></script>
45 <script type='text/javascript' src='../../../../../js/Clipperz/Signal.js'></script> 42 <script type='text/javascript' src='../../../../../js/Clipperz/Signal.js'></script>
46 <script type='text/javascript' src='../../../../../js/Clipperz/KeyValueObjectStore.js'></script> 43 <script type='text/javascript' src='../../../../../js/Clipperz/KeyValueObjectStore.js'></script>
47 44
48 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/Base.js'></script> 45 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/Base.js'></script>
49 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/BigInt.js'></script> 46 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/BigInt.js'></script>
50 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/AES.js'></script> 47 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/AES.js'></script>
51 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/SHA.js'></script> 48 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/SHA.js'></script>
52 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/PRNG.js'></script> 49 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/PRNG.js'></script>
53 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/SRP.js'></script> 50 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/SRP.js'></script>
54 51
55 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Toll.js'></script> 52 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Toll.js'></script>
56 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy.js'></script> 53 <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> 54 <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> 55 <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> 56 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script>
60 57
61 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Connection.js'></script> 58 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Connection.js'></script>
62 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Crypto.js'></script> 59 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Crypto.js'></script>
63 60
64 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Strings.js'></script> 61 <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> 62 <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> 63 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Date.js'></script>
67 <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>
68 <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>
69 <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>
70 <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>
71 <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>
72 <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>
73 <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>
74 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.js'></script> 71 <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> 72 <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> 73 <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> 74 <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> 75 <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> 76 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/OneTimePassword.js'></script>
80 77
81 <script type="text/javascript" src="../../../../SimpleTest/SimpleTest.Async.js"></script> 78 <script type="text/javascript" src="../../../../SimpleTest/SimpleTest.Async.js"></script>
82<script> 79<script>
83 Clipperz_IEisBroken = false; 80 Clipperz_IEisBroken = false;
84</script> 81</script>
85 82
86<!--[if IE]><script> 83<!--[if IE]><script>
87Clipperz_IEisBroken = true; 84Clipperz_IEisBroken = true;
88Clipperz_normalizedNewLine = '\x0d\x0a'; 85Clipperz_normalizedNewLine = '\x0d\x0a';
89</script><![endif]--> 86</script><![endif]-->
90 87
91</head> 88</head>
92<body> 89<body>
93 90
94<pre id="test"> 91<pre id="test">
95<script> 92<script>
96 Clipperz.PM.Strings.Languages.setSelectedLanguage('en-us'); 93 Clipperz.PM.Strings.Languages.setSelectedLanguage('en-us');
97</script> 94</script>
98<script type="text/javascript" src="User.data.js"></script> 95<script type="text/javascript" src="User.data.js"></script>
99<script type="text/javascript" src="User.data.old.js"></script> 96<script type="text/javascript" src="User.data.old.js"></script>
100<script type="text/javascript" src="DirectLogin.test.js"></script> 97<script type="text/javascript" src="DirectLogin.test.js"></script>
101</pre> 98</pre>
102</body> 99</body>
103</html> 100</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 d385c8c..7df0971 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/DirectLogin.test.js
+++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/DirectLogin.test.js
@@ -1,195 +1,192 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); 26Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
30 27
31var tests = { 28var tests = {
32 29
33/* 30/*
34 user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); 31 user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}});
35 ... 32 ...
36 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']); 33 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']);
37 deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); 34 deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13');
38 35
39 36
40 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); 37 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
41 ... 38 ...
42 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); 39 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
43 deferredResult.addMethod(user, 'getRecord', '5cdac63b317f3942da38f3a3de3b7f0e5d6678200951c6216230295550f63fb4'); //WEB PASSWORD (0) 40 deferredResult.addMethod(user, 'getRecord', '5cdac63b317f3942da38f3a3de3b7f0e5d6678200951c6216230295550f63fb4'); //WEB PASSWORD (0)
44 deferredResult.addMethod(user, 'getRecord', '36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113'); //DIGG (1) 41 deferredResult.addMethod(user, 'getRecord', '36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113'); //DIGG (1)
45 deferredResult.addMethod(user, 'getRecord', 'c0ce9130ca365bb02418d4305ea1d29e49c3f0e96d44b9d3cb6b4b6843d25065'); //SAP (2) 42 deferredResult.addMethod(user, 'getRecord', 'c0ce9130ca365bb02418d4305ea1d29e49c3f0e96d44b9d3cb6b4b6843d25065'); //SAP (2)
46 deferredResult.addMethod(user, 'getRecord', 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'); //YAHOO (4) 43 deferredResult.addMethod(user, 'getRecord', 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'); //YAHOO (4)
47 DirectLogin references 44 DirectLogin references
48 - dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496 //Yahoo! Mail 45 - dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496 //Yahoo! Mail
49 - aa18149164302d5dbe7e2d3724565b9550e00887b49978559783b2e38c625584 //(Yahoo! Groups) 46 - aa18149164302d5dbe7e2d3724565b9550e00887b49978559783b2e38c625584 //(Yahoo! Groups)
50 - 6f7bbc4e42ea462b5246e6f51c3f86056bec50601ce2de6067c8c1d26f21c07f //(Flickr) 47 - 6f7bbc4e42ea462b5246e6f51c3f86056bec50601ce2de6067c8c1d26f21c07f //(Flickr)
51 - a7b32e72502804bf2946a2a8856139cbbb759c5777e6b3e673db1fdf7e3bd06e //(My Yahoo!) 48 - a7b32e72502804bf2946a2a8856139cbbb759c5777e6b3e673db1fdf7e3bd06e //(My Yahoo!)
52*/ 49*/
53 //------------------------------------------------------------------------- 50 //-------------------------------------------------------------------------
54 51
55 'editDirectLoginLabel_test': function (someTestArgs) { 52 'editDirectLoginLabel_test': function (someTestArgs) {
56 var deferredResult; 53 var deferredResult;
57 var proxy; 54 var proxy;
58 var user; 55 var user;
59 56
60 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); 57 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false});
61 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); 58 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
62 59
63 deferredResult = new Clipperz.Async.Deferred("editDirectLoginLabel_test", someTestArgs); 60 deferredResult = new Clipperz.Async.Deferred("editDirectLoginLabel_test", someTestArgs);
64 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); 61 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
65 deferredResult.addMethod(user, 'login'); 62 deferredResult.addMethod(user, 'login');
66 deferredResult.addMethod(user, 'getRecord', 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'); //YAHOO (4) 63 deferredResult.addMethod(user, 'getRecord', 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'); //YAHOO (4)
67 deferredResult.addMethodcaller('directLogins'); 64 deferredResult.addMethodcaller('directLogins');
68 deferredResult.addCallback(MochiKit.Base.itemgetter('dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496')); 65 deferredResult.addCallback(MochiKit.Base.itemgetter('dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496'));
69 deferredResult.addCallback(function (aDirectLogin) { 66 deferredResult.addCallback(function (aDirectLogin) {
70 var innerDeferredResult; 67 var innerDeferredResult;
71 var updatedLabel; 68 var updatedLabel;
72 69
73 updatedLabel = "updated Yahoo! Mail label"; 70 updatedLabel = "updated Yahoo! Mail label";
74 71
75 innerDeferredResult = new Clipperz.Async.Deferred("editDirectLoginLabel_test <inner>", someTestArgs); 72 innerDeferredResult = new Clipperz.Async.Deferred("editDirectLoginLabel_test <inner>", someTestArgs);
76 innerDeferredResult.addMethod(aDirectLogin, 'label'); 73 innerDeferredResult.addMethod(aDirectLogin, 'label');
77 innerDeferredResult.addTest("Yahoo! Mail", "The label of the selected direct login is correct."); 74 innerDeferredResult.addTest("Yahoo! Mail", "The label of the selected direct login is correct.");
78 innerDeferredResult.addMethod(aDirectLogin, 'setLabel', updatedLabel); 75 innerDeferredResult.addMethod(aDirectLogin, 'setLabel', updatedLabel);
79 76
80 innerDeferredResult.addMethod(aDirectLogin, 'label'); 77 innerDeferredResult.addMethod(aDirectLogin, 'label');
81 innerDeferredResult.addTest(updatedLabel, "The DirectLogin returns the correct label even before committing data."); 78 innerDeferredResult.addTest(updatedLabel, "The DirectLogin returns the correct label even before committing data.");
82 79
83 innerDeferredResult.addMethod(user, 'hasPendingChanges'); 80 innerDeferredResult.addMethod(user, 'hasPendingChanges');
84 innerDeferredResult.addTest(true, "When changing the label of a DirectLogin, the user should report pending changes."); 81 innerDeferredResult.addTest(true, "When changing the label of a DirectLogin, the user should report pending changes.");
85 82
86//innerDeferredResult.addCallback(function () { console.log("+_+_+_+_+_+_+_+_+_+_+_+ >>>")}); 83//innerDeferredResult.addCallback(function () { console.log("+_+_+_+_+_+_+_+_+_+_+_+ >>>")});
87 innerDeferredResult.addMethod(user, 'saveChanges'); 84 innerDeferredResult.addMethod(user, 'saveChanges');
88//innerDeferredResult.addCallback(function () { console.log("+_+_+_+_+_+_+_+_+_+_+_+ <<<")}); 85//innerDeferredResult.addCallback(function () { console.log("+_+_+_+_+_+_+_+_+_+_+_+ <<<")});
89 innerDeferredResult.addMethod(user, 'hasPendingChanges'); 86 innerDeferredResult.addMethod(user, 'hasPendingChanges');
90 innerDeferredResult.addTest(false, "After saving changes there should be no pending changes left."); 87 innerDeferredResult.addTest(false, "After saving changes there should be no pending changes left.");
91 88
92 innerDeferredResult.addMethod(aDirectLogin, 'label'); 89 innerDeferredResult.addMethod(aDirectLogin, 'label');
93 innerDeferredResult.addTest(updatedLabel, "The DirectLogin returns the correct label even after committing data."); 90 innerDeferredResult.addTest(updatedLabel, "The DirectLogin returns the correct label even after committing data.");
94 91
95 innerDeferredResult.callback(); 92 innerDeferredResult.callback();
96 93
97 return innerDeferredResult; 94 return innerDeferredResult;
98 }) 95 })
99 96
100 deferredResult.callback(); 97 deferredResult.callback();
101 98
102 return deferredResult; 99 return deferredResult;
103 }, 100 },
104 101
105 //------------------------------------------------------------------------- 102 //-------------------------------------------------------------------------
106 103
107 'editDirectLoginLabel_thanResetItToThePreviousValue_test': function (someTestArgs) { 104 'editDirectLoginLabel_thanResetItToThePreviousValue_test': function (someTestArgs) {
108 var deferredResult; 105 var deferredResult;
109 var proxy; 106 var proxy;
110 var user; 107 var user;
111 108
112 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); 109 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false});
113 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); 110 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
114 111
115 deferredResult = new Clipperz.Async.Deferred("editDirectLoginLabel_thanResetItToThePreviousValue_test", someTestArgs); 112 deferredResult = new Clipperz.Async.Deferred("editDirectLoginLabel_thanResetItToThePreviousValue_test", someTestArgs);
116 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); 113 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
117 deferredResult.addMethod(user, 'login'); 114 deferredResult.addMethod(user, 'login');
118 deferredResult.addMethod(user, 'getRecord', 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'); //YAHOO (4) 115 deferredResult.addMethod(user, 'getRecord', 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'); //YAHOO (4)
119 deferredResult.addMethodcaller('directLogins'); 116 deferredResult.addMethodcaller('directLogins');
120 deferredResult.addCallback(MochiKit.Base.itemgetter('dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496')); 117 deferredResult.addCallback(MochiKit.Base.itemgetter('dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496'));
121 deferredResult.addCallback(function (aDirectLogin) { 118 deferredResult.addCallback(function (aDirectLogin) {
122 var innerDeferredResult; 119 var innerDeferredResult;
123 var originalLabel; 120 var originalLabel;
124 var updatedLabel; 121 var updatedLabel;
125 122
126 originalLabel = "Yahoo! Mail"; 123 originalLabel = "Yahoo! Mail";
127 updatedLabel = "updated Yahoo! Mail label"; 124 updatedLabel = "updated Yahoo! Mail label";
128 125
129 innerDeferredResult = new Clipperz.Async.Deferred("editDirectLoginLabel_thanResetItToThePreviousValue_test <inner>", someTestArgs); 126 innerDeferredResult = new Clipperz.Async.Deferred("editDirectLoginLabel_thanResetItToThePreviousValue_test <inner>", someTestArgs);
130 innerDeferredResult.addMethod(aDirectLogin, 'label'); 127 innerDeferredResult.addMethod(aDirectLogin, 'label');
131 innerDeferredResult.addTest(originalLabel, "The label of the selected direct login is correct."); 128 innerDeferredResult.addTest(originalLabel, "The label of the selected direct login is correct.");
132 innerDeferredResult.addMethod(aDirectLogin, 'setLabel', updatedLabel); 129 innerDeferredResult.addMethod(aDirectLogin, 'setLabel', updatedLabel);
133 130
134 innerDeferredResult.addMethod(aDirectLogin, 'label'); 131 innerDeferredResult.addMethod(aDirectLogin, 'label');
135 innerDeferredResult.addTest(updatedLabel, "The DirectLogin returns the correct label even before committing data."); 132 innerDeferredResult.addTest(updatedLabel, "The DirectLogin returns the correct label even before committing data.");
136 133
137 innerDeferredResult.addMethod(user, 'hasPendingChanges'); 134 innerDeferredResult.addMethod(user, 'hasPendingChanges');
138 innerDeferredResult.addTest(true, "When changing the label of a DirectLogin, the user should report pending changes [2]."); 135 innerDeferredResult.addTest(true, "When changing the label of a DirectLogin, the user should report pending changes [2].");
139 136
140 innerDeferredResult.addMethod(aDirectLogin, 'setLabel', originalLabel); 137 innerDeferredResult.addMethod(aDirectLogin, 'setLabel', originalLabel);
141 138
142 innerDeferredResult.addMethod(aDirectLogin, 'hasPendingChanges'); 139 innerDeferredResult.addMethod(aDirectLogin, 'hasPendingChanges');
143 innerDeferredResult.addTest(false, "Restoring the original label, the directLogin should report no pending changes."); 140 innerDeferredResult.addTest(false, "Restoring the original label, the directLogin should report no pending changes.");
144 141
145 innerDeferredResult.addMethod(aDirectLogin.record(), 'hasPendingChanges'); 142 innerDeferredResult.addMethod(aDirectLogin.record(), 'hasPendingChanges');
146 innerDeferredResult.addTest(false, "Restoring the original label, the record should report no pending changes."); 143 innerDeferredResult.addTest(false, "Restoring the original label, the record should report no pending changes.");
147 144
148 innerDeferredResult.addMethod(user, 'hasPendingChanges'); 145 innerDeferredResult.addMethod(user, 'hasPendingChanges');
149 innerDeferredResult.addTest(false, "Restoring the original label, the user should report no pending changes."); 146 innerDeferredResult.addTest(false, "Restoring the original label, the user should report no pending changes.");
150 147
151 innerDeferredResult.callback(); 148 innerDeferredResult.callback();
152 149
153 return innerDeferredResult; 150 return innerDeferredResult;
154 }) 151 })
155 152
156 deferredResult.callback(); 153 deferredResult.callback();
157 154
158 return deferredResult; 155 return deferredResult;
159 }, 156 },
160 157
161 //------------------------------------------------------------------------- 158 //-------------------------------------------------------------------------
162/* 159/*
163 'bindingValues_test': function (someTestArgs) { 160 'bindingValues_test': function (someTestArgs) {
164 var deferredResult; 161 var deferredResult;
165 var proxy; 162 var proxy;
166 var user; 163 var user;
167 164
168 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); 165 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false});
169 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); 166 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
170 167
171 deferredResult = new Clipperz.Async.Deferred("DirectLogin.bindingValues_test", someTestArgs); 168 deferredResult = new Clipperz.Async.Deferred("DirectLogin.bindingValues_test", someTestArgs);
172 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); 169 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
173 deferredResult.addMethod(user, 'login'); 170 deferredResult.addMethod(user, 'login');
174 deferredResult.addMethod(user, 'getRecord', 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'); //YAHOO (4) 171 deferredResult.addMethod(user, 'getRecord', 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'); //YAHOO (4)
175 deferredResult.addMethodcaller('directLogins'); 172 deferredResult.addMethodcaller('directLogins');
176 deferredResult.addCallback(MochiKit.Base.itemgetter('dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496')); 173 deferredResult.addCallback(MochiKit.Base.itemgetter('dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496'));
177 deferredResult.addMethodcaller('bindingValues'); 174 deferredResult.addMethodcaller('bindingValues');
178 deferredResult.addCallback(function (someBindingValues) { 175 deferredResult.addCallback(function (someBindingValues) {
179 SimpleTest.is(MochiKit.Base.keys(someBindingValues).length, 2, "there should be 2 bindings for this direct login"); 176 SimpleTest.is(MochiKit.Base.keys(someBindingValues).length, 2, "there should be 2 bindings for this direct login");
180 SimpleTest.is(someBindingValues['login'], 'joe.clipperz', "the login field should be filled with 'joe.clipperz'"); 177 SimpleTest.is(someBindingValues['login'], 'joe.clipperz', "the login field should be filled with 'joe.clipperz'");
181 SimpleTest.is(someBindingValues['passwd'], 'enfvDG1RxAsl', "the passwd field should be filled with 'enfvDG1RxAsl'"); 178 SimpleTest.is(someBindingValues['passwd'], 'enfvDG1RxAsl', "the passwd field should be filled with 'enfvDG1RxAsl'");
182 }) 179 })
183 180
184 deferredResult.callback(); 181 deferredResult.callback();
185 182
186 return deferredResult; 183 return deferredResult;
187 }, 184 },
188*/ 185*/
189 //------------------------------------------------------------------------- 186 //-------------------------------------------------------------------------
190 'syntaxFix': MochiKit.Base.noop 187 'syntaxFix': MochiKit.Base.noop
191}; 188};
192 189
193//############################################################################# 190//#############################################################################
194 191
195SimpleTest.runDeferredTests("Clipperz.PM.DataModel.DirectLogin", tests, {trace:false}); 192SimpleTest.runDeferredTests("Clipperz.PM.DataModel.DirectLogin", tests, {trace:false});
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 6c0bf49..1678515 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/DirectLoginConfigurations.data.js
+++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/DirectLoginConfigurations.data.js
@@ -1,33 +1,30 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29directLoginConfigurations = { 26directLoginConfigurations = {
30 '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}', 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}',
31 '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"}', 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"}',
32 __syntaxFix__: "syntax fix" 29 __syntaxFix__: "syntax fix"
33}; \ No newline at end of file 30}; \ 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 699c06d..3297ab4 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/EncryptedRemoteObject.html
+++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/EncryptedRemoteObject.html
@@ -1,66 +1,63 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27--> 24-->
28 25
29<html> 26<html>
30<head> 27<head>
31 <title>Clipperz.PM.DataModel.EncryptedRemoteObject - test</title> 28 <title>Clipperz.PM.DataModel.EncryptedRemoteObject - test</title>
32 29
33 <script type="text/javascript" src="../../../../../js/MochiKit/MochiKit.js"></script> 30 <script type="text/javascript" src="../../../../../js/MochiKit/MochiKit.js"></script>
34 <script type="text/javascript" src="../../../../SimpleTest/SimpleTest.js"></script> 31 <script type="text/javascript" src="../../../../SimpleTest/SimpleTest.js"></script>
35 <link rel="stylesheet" type="text/css" href="../../../../SimpleTest/test.css"> 32 <link rel="stylesheet" type="text/css" href="../../../../SimpleTest/test.css">
36 33
37 <script type='text/javascript' src='../../../../../js/JSON/json2.js'></script> 34 <script type='text/javascript' src='../../../../../js/JSON/json2.js'></script>
38 35
39 <script type='text/javascript' src='../../../../../js/Clipperz/YUI/Utils.js'></script> 36 <script type='text/javascript' src='../../../../../js/Clipperz/YUI/Utils.js'></script>
40 <script type='text/javascript' src='../../../../../js/Clipperz/Base.js'></script> 37 <script type='text/javascript' src='../../../../../js/Clipperz/Base.js'></script>
41 <script type='text/javascript' src='../../../../../js/Clipperz/ByteArray.js'></script> 38 <script type='text/javascript' src='../../../../../js/Clipperz/ByteArray.js'></script>
42 <script type='text/javascript' src='../../../../../js/Clipperz/Logging.js'></script> 39 <script type='text/javascript' src='../../../../../js/Clipperz/Logging.js'></script>
43 <script type='text/javascript' src='../../../../../js/Clipperz/Async.js'></script> 40 <script type='text/javascript' src='../../../../../js/Clipperz/Async.js'></script>
44 <script type='text/javascript' src='../../../../../js/Clipperz/Signal.js'></script> 41 <script type='text/javascript' src='../../../../../js/Clipperz/Signal.js'></script>
45 <script type='text/javascript' src='../../../../../js/Clipperz/KeyValueObjectStore.js'></script> 42 <script type='text/javascript' src='../../../../../js/Clipperz/KeyValueObjectStore.js'></script>
46 43
47 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/Base.js'></script> 44 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/Base.js'></script>
48 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/BigInt.js'></script> 45 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/BigInt.js'></script>
49 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/AES.js'></script> 46 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/AES.js'></script>
50 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/SHA.js'></script> 47 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/SHA.js'></script>
51 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/PRNG.js'></script> 48 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/PRNG.js'></script>
52 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/SRP.js'></script> 49 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/SRP.js'></script>
53 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy.js'></script> 50 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy.js'></script>
54 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Connection.js'></script> 51 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Connection.js'></script>
55 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Crypto.js'></script> 52 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Crypto.js'></script>
56 53
57 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/EncryptedRemoteObject.js'></script> 54 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/EncryptedRemoteObject.js'></script>
58 <script type="text/javascript" src="../../../../SimpleTest/SimpleTest.Async.js"></script> 55 <script type="text/javascript" src="../../../../SimpleTest/SimpleTest.Async.js"></script>
59</head> 56</head>
60<body> 57<body>
61 58
62<pre id="test"> 59<pre id="test">
63<script type="text/javascript" src="EncryptedRemoteObject.test.js"></script> 60<script type="text/javascript" src="EncryptedRemoteObject.test.js"></script>
64</pre> 61</pre>
65</body> 62</body>
66</html> 63</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 0a4fe0c..9c50c43 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/EncryptedRemoteObject.test.js
+++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/EncryptedRemoteObject.test.js
@@ -1,225 +1,222 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); 26Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
30 27
31var tests = { 28var tests = {
32 29
33 //------------------------------------------------------------------------- 30 //-------------------------------------------------------------------------
34 31
35 'simple_tests': function(someTestArgs) { 32 'simple_tests': function(someTestArgs) {
36 vardeferredResult; 33 vardeferredResult;
37 varencryptedRemoteObject; 34 varencryptedRemoteObject;
38 35
39 varkey; 36 varkey;
40 var version; 37 var version;
41 var rawData; 38 var rawData;
42 39
43 key = "just a random key"; 40 key = "just a random key";
44 version = Clipperz.PM.Crypto.encryptingFunctions.currentVersion; 41 version = Clipperz.PM.Crypto.encryptingFunctions.currentVersion;
45 rawData = "just a random text to encrypt"; 42 rawData = "just a random text to encrypt";
46 43
47 encryptedRemoteObject = new Clipperz.PM.DataModel.EncryptedRemoteObject({ 44 encryptedRemoteObject = new Clipperz.PM.DataModel.EncryptedRemoteObject({
48 'retrieveKeyFunction': MochiKit.Base.noop, 45 'retrieveKeyFunction': MochiKit.Base.noop,
49 'retrieveRemoteDataFunction':function () { return "--"}, 46 'retrieveRemoteDataFunction':function () { return "--"},
50 'encryptedDataKeypath': '--', 47 'encryptedDataKeypath': '--',
51 'encryptedVersionKeypath': '--' 48 'encryptedVersionKeypath': '--'
52 }); 49 });
53 SimpleTest.ok(encryptedRemoteObject != null, "create an encryptedRemoteObject"); 50 SimpleTest.ok(encryptedRemoteObject != null, "create an encryptedRemoteObject");
54 51
55 deferredResult = Clipperz.Async.callbacks("EncryptedRemoteObject.test - simple_tests", [ 52 deferredResult = Clipperz.Async.callbacks("EncryptedRemoteObject.test - simple_tests", [
56 MochiKit.Base.method(encryptedRemoteObject, 'getRemoteData'), 53 MochiKit.Base.method(encryptedRemoteObject, 'getRemoteData'),
57 function(aResult) { 54 function(aResult) {
58 SimpleTest.is(aResult, "--", "setting and getting serverData works"); 55 SimpleTest.is(aResult, "--", "setting and getting serverData works");
59 } 56 }
60 ], someTestArgs); 57 ], someTestArgs);
61 58
62 return deferredResult; 59 return deferredResult;
63 }, 60 },
64 61
65 //------------------------------------------------------------------------- 62 //-------------------------------------------------------------------------
66 63
67 'decrypt_test': function (someTestArgs) { 64 'decrypt_test': function (someTestArgs) {
68 vardeferredResult; 65 vardeferredResult;
69 varencryptedRemoteObject; 66 varencryptedRemoteObject;
70 varkey; 67 varkey;
71 var version; 68 var version;
72 var rawData; 69 var rawData;
73 70
74 key = "just a random key"; 71 key = "just a random key";
75 version = Clipperz.PM.Crypto.encryptingFunctions.currentVersion; 72 version = Clipperz.PM.Crypto.encryptingFunctions.currentVersion;
76 rawData = "just a random text to encrypt"; 73 rawData = "just a random text to encrypt";
77 74
78 encryptedRemoteObject = new Clipperz.PM.DataModel.EncryptedRemoteObject({ 75 encryptedRemoteObject = new Clipperz.PM.DataModel.EncryptedRemoteObject({
79 'retrieveKeyFunction': MochiKit.Base.partial(MochiKit.Async.succeed, key), 76 'retrieveKeyFunction': MochiKit.Base.partial(MochiKit.Async.succeed, key),
80 'retrieveRemoteDataFunction':MochiKit.Base.partial(Clipperz.Async.callbacks, "EncryptedRemoteObject.test - decrypt_test <encrypt data>", [ 77 'retrieveRemoteDataFunction':MochiKit.Base.partial(Clipperz.Async.callbacks, "EncryptedRemoteObject.test - decrypt_test <encrypt data>", [
81 MochiKit.Base.partial(Clipperz.PM.Crypto.deferredEncrypt, {key:key, value:rawData, version:version}), 78 MochiKit.Base.partial(Clipperz.PM.Crypto.deferredEncrypt, {key:key, value:rawData, version:version}),
82 function (someEncryptedData) { 79 function (someEncryptedData) {
83 return { 80 return {
84 'data': someEncryptedData, 81 'data': someEncryptedData,
85 'version': version 82 'version': version
86 } 83 }
87 } 84 }
88 ], someTestArgs)//, 85 ], someTestArgs)//,
89 // 'encryptedDataKeypath': 'data', 86 // 'encryptedDataKeypath': 'data',
90 // 'encryptedVersionKeypath': 'version' 87 // 'encryptedVersionKeypath': 'version'
91 }); 88 });
92 89
93 deferredResult = new Clipperz.Async.Deferred("decrypt_test", someTestArgs); 90 deferredResult = new Clipperz.Async.Deferred("decrypt_test", someTestArgs);
94 deferredResult.addMethod(encryptedRemoteObject, 'getDecryptedData'); 91 deferredResult.addMethod(encryptedRemoteObject, 'getDecryptedData');
95 deferredResult.addCallback(function (aResult) { 92 deferredResult.addCallback(function (aResult) {
96 SimpleTest.is(aResult, rawData, "encrypt and decrypt works"); 93 SimpleTest.is(aResult, rawData, "encrypt and decrypt works");
97 }) 94 })
98 deferredResult.callback(); 95 deferredResult.callback();
99 96
100 return deferredResult; 97 return deferredResult;
101 }, 98 },
102 99
103 //------------------------------------------------------------------------- 100 //-------------------------------------------------------------------------
104 101
105 'getValue_test': function (someTestArgs) { 102 'getValue_test': function (someTestArgs) {
106 vardeferredResult; 103 vardeferredResult;
107 varencryptedRemoteObject; 104 varencryptedRemoteObject;
108 varkey; 105 varkey;
109 var version; 106 var version;
110 var rawData; 107 var rawData;
111 108
112 key = "just a random key"; 109 key = "just a random key";
113 version = Clipperz.PM.Crypto.encryptingFunctions.currentVersion; 110 version = Clipperz.PM.Crypto.encryptingFunctions.currentVersion;
114 rawData = { 111 rawData = {
115 key1: 'value1', 112 key1: 'value1',
116 key2: 'value2' 113 key2: 'value2'
117 }; 114 };
118 115
119 encryptedRemoteObject = new Clipperz.PM.DataModel.EncryptedRemoteObject({ 116 encryptedRemoteObject = new Clipperz.PM.DataModel.EncryptedRemoteObject({
120 'reference': "testReference", 117 'reference': "testReference",
121 'retrieveKeyFunction': MochiKit.Base.partial(MochiKit.Async.succeed, key), 118 'retrieveKeyFunction': MochiKit.Base.partial(MochiKit.Async.succeed, key),
122 'retrieveRemoteDataFunction':MochiKit.Base.partial(Clipperz.Async.callbacks, "EncryptedRemoteObject.test - decrypt_test <encrypt data>", [ 119 'retrieveRemoteDataFunction':MochiKit.Base.partial(Clipperz.Async.callbacks, "EncryptedRemoteObject.test - decrypt_test <encrypt data>", [
123 MochiKit.Base.partial(Clipperz.PM.Crypto.deferredEncrypt, {key:key, value:rawData, version:version}), 120 MochiKit.Base.partial(Clipperz.PM.Crypto.deferredEncrypt, {key:key, value:rawData, version:version}),
124 function (someEncryptedData) { 121 function (someEncryptedData) {
125 return { 122 return {
126 'data': someEncryptedData, 123 'data': someEncryptedData,
127 'version': version 124 'version': version
128 } 125 }
129 } 126 }
130 ], someTestArgs)//, 127 ], someTestArgs)//,
131 // 'encryptedDataKeypath': 'data', 128 // 'encryptedDataKeypath': 'data',
132 // 'encryptedVersionKeypath': 'version' 129 // 'encryptedVersionKeypath': 'version'
133 }); 130 });
134 131
135 deferredResult = new Clipperz.Async.Deferred("decrypt_test", someTestArgs); 132 deferredResult = new Clipperz.Async.Deferred("decrypt_test", someTestArgs);
136 133
137 deferredResult.addMethod(encryptedRemoteObject, 'getValue', 'key1'); 134 deferredResult.addMethod(encryptedRemoteObject, 'getValue', 'key1');
138 deferredResult.addTest('value1', "getting 'key1' works"); 135 deferredResult.addTest('value1', "getting 'key1' works");
139 deferredResult.addMethod(encryptedRemoteObject, 'hasAnyCleanTextData'); 136 deferredResult.addMethod(encryptedRemoteObject, 'hasAnyCleanTextData');
140 deferredResult.addTest(true, "After accessing a value, hasAnyCleanTextData returns false"); 137 deferredResult.addTest(true, "After accessing a value, hasAnyCleanTextData returns false");
141 138
142 deferredResult.addMethod(encryptedRemoteObject, 'hasPendingChanges'); 139 deferredResult.addMethod(encryptedRemoteObject, 'hasPendingChanges');
143 deferredResult.addTest(false, "if nothing has changed, the object should return not pending changes"); 140 deferredResult.addTest(false, "if nothing has changed, the object should return not pending changes");
144 141
145 deferredResult.addMethod(encryptedRemoteObject, 'deleteAllCleanTextData'); 142 deferredResult.addMethod(encryptedRemoteObject, 'deleteAllCleanTextData');
146 deferredResult.addMethod(encryptedRemoteObject, 'hasAnyCleanTextData'); 143 deferredResult.addMethod(encryptedRemoteObject, 'hasAnyCleanTextData');
147 deferredResult.addTest(false, "After deleting all cleanTextData, hasAnyCleanTextData returns false"); 144 deferredResult.addTest(false, "After deleting all cleanTextData, hasAnyCleanTextData returns false");
148 145
149 deferredResult.addMethod(encryptedRemoteObject, 'getValue', 'key1'); 146 deferredResult.addMethod(encryptedRemoteObject, 'getValue', 'key1');
150 deferredResult.addTest('value1', "getting 'key1' (also after a lock) works correctly"); 147 deferredResult.addTest('value1', "getting 'key1' (also after a lock) works correctly");
151 148
152 deferredResult.addMethod(encryptedRemoteObject, 'setValue', 'key1', 'new value1'); 149 deferredResult.addMethod(encryptedRemoteObject, 'setValue', 'key1', 'new value1');
153 deferredResult.addMethod(encryptedRemoteObject, 'getValue', 'key1'); 150 deferredResult.addMethod(encryptedRemoteObject, 'getValue', 'key1');
154 deferredResult.addTest('new value1', "after setting a new value, it is correctly returned"); 151 deferredResult.addTest('new value1', "after setting a new value, it is correctly returned");
155 152
156 deferredResult.addMethod(encryptedRemoteObject, 'values'); 153 deferredResult.addMethod(encryptedRemoteObject, 'values');
157 deferredResult.addCallback(function (someValues) { 154 deferredResult.addCallback(function (someValues) {
158 SimpleTest.is(someValues['key1'], 'new value1', "the value got straight from the objectStore is correct"); 155 SimpleTest.is(someValues['key1'], 'new value1', "the value got straight from the objectStore is correct");
159 }); 156 });
160 157
161 deferredResult.addMethod(encryptedRemoteObject, 'hasPendingChanges'); 158 deferredResult.addMethod(encryptedRemoteObject, 'hasPendingChanges');
162 deferredResult.addTest(true, "once a value has been changed, the object should return that there're some pending changes"); 159 deferredResult.addTest(true, "once a value has been changed, the object should return that there're some pending changes");
163 160
164 deferredResult.addMethod(encryptedRemoteObject, 'revertChanges'); 161 deferredResult.addMethod(encryptedRemoteObject, 'revertChanges');
165 deferredResult.addMethod(encryptedRemoteObject, 'hasPendingChanges'); 162 deferredResult.addMethod(encryptedRemoteObject, 'hasPendingChanges');
166 deferredResult.addTest(false, "reverting the changes should return the object to its initial state, without any peding changes"); 163 deferredResult.addTest(false, "reverting the changes should return the object to its initial state, without any peding changes");
167 164
168 deferredResult.addMethod(encryptedRemoteObject, 'getValue', 'key1'); 165 deferredResult.addMethod(encryptedRemoteObject, 'getValue', 'key1');
169 deferredResult.addTest('value1', "also the value of the changed item has been restored"); 166 deferredResult.addTest('value1', "also the value of the changed item has been restored");
170 167
171 deferredResult.callback(); 168 deferredResult.callback();
172 169
173 return deferredResult; 170 return deferredResult;
174 }, 171 },
175 172
176 //------------------------------------------------------------------------- 173 //-------------------------------------------------------------------------
177 174
178 'encrypt_with_new_object_test': function (someTestArgs) { 175 'encrypt_with_new_object_test': function (someTestArgs) {
179 vardeferredResult; 176 vardeferredResult;
180 varencryptedRemoteObject; 177 varencryptedRemoteObject;
181 varkey; 178 varkey;
182 // var version; 179 // var version;
183 // var rawData; 180 // var rawData;
184 181
185 key = "just a random key"; 182 key = "just a random key";
186 // version = Clipperz.PM.Crypto.encryptingFunctions.currentVersion; 183 // version = Clipperz.PM.Crypto.encryptingFunctions.currentVersion;
187 // rawData = "just a random text to encrypt"; 184 // rawData = "just a random text to encrypt";
188 185
189 encryptedRemoteObject = new Clipperz.PM.DataModel.EncryptedRemoteObject({ 186 encryptedRemoteObject = new Clipperz.PM.DataModel.EncryptedRemoteObject({
190 'retrieveRemoteDataFunction':MochiKit.Base.noop 187 'retrieveRemoteDataFunction':MochiKit.Base.noop
191 }); 188 });
192 189
193 encryptedRemoteObject.setValue('key1', "value1"); 190 encryptedRemoteObject.setValue('key1', "value1");
194 encryptedRemoteObject.setValue('key2', "value2"); 191 encryptedRemoteObject.setValue('key2', "value2");
195 encryptedRemoteObject.setValue('key3', "value3"); 192 encryptedRemoteObject.setValue('key3', "value3");
196 193
197 deferredResult = new Clipperz.Async.Deferred("encrypt_with_new_object_test", someTestArgs); 194 deferredResult = new Clipperz.Async.Deferred("encrypt_with_new_object_test", someTestArgs);
198 deferredResult.addMethod(encryptedRemoteObject, 'prepareRemoteDataWithKey', key); 195 deferredResult.addMethod(encryptedRemoteObject, 'prepareRemoteDataWithKey', key);
199 deferredResult.addCallback(MochiKit.Base.itemgetter('data')); 196 deferredResult.addCallback(MochiKit.Base.itemgetter('data'));
200 deferredResult.collectResults({ 197 deferredResult.collectResults({
201 'key': MochiKit.Base.partial(MochiKit.Async.succeed, key), 198 'key': MochiKit.Base.partial(MochiKit.Async.succeed, key),
202 'value':MochiKit.Async.succeed, 199 'value':MochiKit.Async.succeed,
203 'version':MochiKit.Base.partial(MochiKit.Async.succeed, Clipperz.PM.Crypto.encryptingFunctions.currentVersion) 200 'version':MochiKit.Base.partial(MochiKit.Async.succeed, Clipperz.PM.Crypto.encryptingFunctions.currentVersion)
204 }); 201 });
205 deferredResult.addCallback(Clipperz.PM.Crypto.deferredDecrypt); 202 deferredResult.addCallback(Clipperz.PM.Crypto.deferredDecrypt);
206 deferredResult.addCallback(function (aResult) { 203 deferredResult.addCallback(function (aResult) {
207 SimpleTest.is(aResult['key1'], "value1", "encrypt and decrypt works for first element"); 204 SimpleTest.is(aResult['key1'], "value1", "encrypt and decrypt works for first element");
208 SimpleTest.is(aResult['key2'], "value2", "encrypt and decrypt works for second element"); 205 SimpleTest.is(aResult['key2'], "value2", "encrypt and decrypt works for second element");
209 SimpleTest.is(aResult['key3'], "value3", "encrypt and decrypt works for third element"); 206 SimpleTest.is(aResult['key3'], "value3", "encrypt and decrypt works for third element");
210 }) 207 })
211 deferredResult.callback(); 208 deferredResult.callback();
212 209
213 return deferredResult; 210 return deferredResult;
214 }, 211 },
215 212
216 //------------------------------------------------------------------------- 213 //-------------------------------------------------------------------------
217 //------------------------------------------------------------------------- 214 //-------------------------------------------------------------------------
218 //------------------------------------------------------------------------- 215 //-------------------------------------------------------------------------
219 //------------------------------------------------------------------------- 216 //-------------------------------------------------------------------------
220 'syntaxFix': MochiKit.Base.noop 217 'syntaxFix': MochiKit.Base.noop
221}; 218};
222 219
223//############################################################################# 220//#############################################################################
224 221
225SimpleTest.runDeferredTests("Clipperz.PM.DataModel.EncryptedRemoteObject", tests, {trace:false}); 222SimpleTest.runDeferredTests("Clipperz.PM.DataModel.EncryptedRemoteObject", tests, {trace:false});
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/OneTimePassword.html b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/OneTimePassword.html
index a9bac22..7861b80 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/OneTimePassword.html
+++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/OneTimePassword.html
@@ -1,105 +1,102 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27--> 24-->
28 25
29<html> 26<html>
30<head> 27<head>
31 <title>Clipperz.PM.DataModel.User - test</title> 28 <title>Clipperz.PM.DataModel.User - test</title>
32 29
33 <script type="text/javascript" src="../../../../../js/MochiKit/MochiKit.js"></script> 30 <script type="text/javascript" src="../../../../../js/MochiKit/MochiKit.js"></script>
34 <script type="text/javascript" src="../../../../SimpleTest/SimpleTest.js"></script> 31 <script type="text/javascript" src="../../../../SimpleTest/SimpleTest.js"></script>
35 <link rel="stylesheet" type="text/css" href="../../../../SimpleTest/test.css"> 32 <link rel="stylesheet" type="text/css" href="../../../../SimpleTest/test.css">
36 33
37 <script type='text/javascript' src='../../../../../js/JSON/json2.js'></script> 34 <script type='text/javascript' src='../../../../../js/JSON/json2.js'></script>
38 35
39 <script type='text/javascript' src='../../../../../js/Clipperz/YUI/Utils.js'></script> 36 <script type='text/javascript' src='../../../../../js/Clipperz/YUI/Utils.js'></script>
40 <script type='text/javascript' src='../../../../../js/Clipperz/Base.js'></script> 37 <script type='text/javascript' src='../../../../../js/Clipperz/Base.js'></script>
41 <script type='text/javascript' src='../../../../../js/Clipperz/Date.js'></script> 38 <script type='text/javascript' src='../../../../../js/Clipperz/Date.js'></script>
42 <script type='text/javascript' src='../../../../../js/Clipperz/ByteArray.js'></script> 39 <script type='text/javascript' src='../../../../../js/Clipperz/ByteArray.js'></script>
43 <script type='text/javascript' src='../../../../../js/Clipperz/Logging.js'></script> 40 <script type='text/javascript' src='../../../../../js/Clipperz/Logging.js'></script>
44 <script type='text/javascript' src='../../../../../js/Clipperz/Async.js'></script> 41 <script type='text/javascript' src='../../../../../js/Clipperz/Async.js'></script>
45 <script type='text/javascript' src='../../../../../js/Clipperz/Signal.js'></script> 42 <script type='text/javascript' src='../../../../../js/Clipperz/Signal.js'></script>
46 <script type='text/javascript' src='../../../../../js/Clipperz/KeyValueObjectStore.js'></script> 43 <script type='text/javascript' src='../../../../../js/Clipperz/KeyValueObjectStore.js'></script>
47 44
48 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/Base.js'></script> 45 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/Base.js'></script>
49 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/BigInt.js'></script> 46 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/BigInt.js'></script>
50 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/AES.js'></script> 47 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/AES.js'></script>
51 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/SHA.js'></script> 48 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/SHA.js'></script>
52 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/PRNG.js'></script> 49 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/PRNG.js'></script>
53 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/SRP.js'></script> 50 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/SRP.js'></script>
54 51
55 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Toll.js'></script> 52 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Toll.js'></script>
56 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy.js'></script> 53 <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> 54 <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> 55 <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> 56 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script>
60 57
61 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Connection.js'></script> 58 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Connection.js'></script>
62 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Crypto.js'></script> 59 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Crypto.js'></script>
63 60
64 <script type='text/javascript' src='../../../../../js/Clipperz/PM/UI/Common/Controllers/DirectLoginRunner.js'></script> 61 <script type='text/javascript' src='../../../../../js/Clipperz/PM/UI/Common/Controllers/DirectLoginRunner.js'></script>
65 62
66 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Strings.js'></script> 63 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Strings.js'></script>
67 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script> 64 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script>
68 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Date.js'></script> 65 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Date.js'></script>
69 <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>
70 <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>
71 <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>
72 <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>
73 <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>
74 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLoginInput.js'></script> 71 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLoginInput.js'></script>
75 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLoginBinding.js'></script> 72 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLoginBinding.js'></script>
76 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLoginFormValue.js'></script> 73 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLoginFormValue.js'></script>
77 <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>
78 <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>
79 <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>
80 <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>
81 <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>
82 <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>
83 80
84 <script type="text/javascript" src="../../../../SimpleTest/SimpleTest.Async.js"></script> 81 <script type="text/javascript" src="../../../../SimpleTest/SimpleTest.Async.js"></script>
85<script> 82<script>
86 Clipperz_IEisBroken = false; 83 Clipperz_IEisBroken = false;
87</script> 84</script>
88 85
89<!--[if IE]><script> 86<!--[if IE]><script>
90Clipperz_IEisBroken = true; 87Clipperz_IEisBroken = true;
91Clipperz_normalizedNewLine = '\x0d\x0a'; 88Clipperz_normalizedNewLine = '\x0d\x0a';
92</script><![endif]--> 89</script><![endif]-->
93 90
94</head> 91</head>
95<body> 92<body>
96 93
97<pre id="test"> 94<pre id="test">
98<script> 95<script>
99 Clipperz.PM.Strings.Languages.setSelectedLanguage('en-us'); 96 Clipperz.PM.Strings.Languages.setSelectedLanguage('en-us');
100</script> 97</script>
101<script type="text/javascript" src="User.data.js"></script> 98<script type="text/javascript" src="User.data.js"></script>
102<script type="text/javascript" src="OneTimePassword.test.js"></script> 99<script type="text/javascript" src="OneTimePassword.test.js"></script>
103</pre> 100</pre>
104</body> 101</body>
105</html> 102</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 0171714..85aae4e 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/OneTimePassword.test.js
+++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/OneTimePassword.test.js
@@ -1,198 +1,195 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); 26Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
30 27
31var tests = { 28var tests = {
32 29
33 //------------------------------------------------------------------------- 30 //-------------------------------------------------------------------------
34 31
35 'isValidOneTimePasswordValue_test': function (someTestArgs) { 32 'isValidOneTimePasswordValue_test': function (someTestArgs) {
36 var otp; 33 var otp;
37 var notOTP; 34 var notOTP;
38 35
39 otp = 'yaxx k7ww - f8y6 tqz5 - 58b6 th44 - 9cwv q0fg'; 36 otp = 'yaxx k7ww - f8y6 tqz5 - 58b6 th44 - 9cwv q0fg';
40 SimpleTest.is(Clipperz.PM.DataModel.OneTimePassword.isValidOneTimePasswordValue(otp), true, "isValidOneTimePasswordValue [expect true] - test 1"); 37 SimpleTest.is(Clipperz.PM.DataModel.OneTimePassword.isValidOneTimePasswordValue(otp), true, "isValidOneTimePasswordValue [expect true] - test 1");
41 38
42 notOTP = 'trustno1'; 39 notOTP = 'trustno1';
43 SimpleTest.is(Clipperz.PM.DataModel.OneTimePassword.isValidOneTimePasswordValue(notOTP), false, "isValidOneTimePasswordValue [expect false] - test 1"); 40 SimpleTest.is(Clipperz.PM.DataModel.OneTimePassword.isValidOneTimePasswordValue(notOTP), false, "isValidOneTimePasswordValue [expect false] - test 1");
44 41
45 return MochiKit.Async.succeed('done'); 42 return MochiKit.Async.succeed('done');
46 }, 43 },
47 44
48 //------------------------------------------------------------------------- 45 //-------------------------------------------------------------------------
49 46
50 'loginUsingOtp_test': function (someTestArgs) { 47 'loginUsingOtp_test': function (someTestArgs) {
51 var deferredResult; 48 var deferredResult;
52 var proxy; 49 var proxy;
53 var user, user2; 50 var user, user2;
54 var username; 51 var username;
55 var passphrase; 52 var passphrase;
56 53
57 username = "test"; 54 username = "test";
58 passphrase = "yaxx k7ww - f8y6 tqz5 - 58b6 th44 - 9cwv q0fg"; //OTP 55 passphrase = "yaxx k7ww - f8y6 tqz5 - 58b6 th44 - 9cwv q0fg"; //OTP
59 56
60 proxy =new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); 57 proxy =new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false});
61 user =new Clipperz.PM.DataModel.User({username:username, getPassphraseFunction:function () { return passphrase;}}); 58 user =new Clipperz.PM.DataModel.User({username:username, getPassphraseFunction:function () { return passphrase;}});
62 user2 =new Clipperz.PM.DataModel.User({username:username, getPassphraseFunction:function () { return passphrase;}}); 59 user2 =new Clipperz.PM.DataModel.User({username:username, getPassphraseFunction:function () { return passphrase;}});
63 60
64 deferredResult = new Clipperz.Async.Deferred("loginUsingOtp_test", someTestArgs); 61 deferredResult = new Clipperz.Async.Deferred("loginUsingOtp_test", someTestArgs);
65 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_with_otps']); 62 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_with_otps']);
66 63
67 deferredResult.addMethod(user, 'login'); 64 deferredResult.addMethod(user, 'login');
68 deferredResult.addMethod(user, 'getRecords'); 65 deferredResult.addMethod(user, 'getRecords');
69 deferredResult.addCallback(MochiKit.Base.itemgetter('length')); 66 deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
70 deferredResult.addTest(1, "This account has one single card"); 67 deferredResult.addTest(1, "This account has one single card");
71 68
72 deferredResult.addMethod(user, 'getOneTimePasswords'); 69 deferredResult.addMethod(user, 'getOneTimePasswords');
73 deferredResult.addCallback(MochiKit.Base.itemgetter('length')); 70 deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
74 deferredResult.addTest(1, "This account has one OTP"); 71 deferredResult.addTest(1, "This account has one OTP");
75 72
76 deferredResult.addMethod(user, 'getOneTimePasswords'); 73 deferredResult.addMethod(user, 'getOneTimePasswords');
77 deferredResult.addCallback(MochiKit.Base.itemgetter(0)); 74 deferredResult.addCallback(MochiKit.Base.itemgetter(0));
78 deferredResult.addCallback(MochiKit.Base.methodcaller('status')); 75 deferredResult.addCallback(MochiKit.Base.methodcaller('status'));
79 deferredResult.addTest('USED', "The available OTP has been unsed to login, and should be marked accordingly"); 76 deferredResult.addTest('USED', "The available OTP has been unsed to login, and should be marked accordingly");
80 77
81 deferredResult.addMethod(user2, 'login'); 78 deferredResult.addMethod(user2, 'login');
82 deferredResult.shouldFail("trying to login using the same OTP twice"); 79 deferredResult.shouldFail("trying to login using the same OTP twice");
83 80
84 deferredResult.callback(); 81 deferredResult.callback();
85 82
86 return deferredResult; 83 return deferredResult;
87 }, 84 },
88 85
89 //------------------------------------------------------------------------- 86 //-------------------------------------------------------------------------
90 87
91 'changePassphraseAndLoginUsingOtp_test': function (someTestArgs) { 88 'changePassphraseAndLoginUsingOtp_test': function (someTestArgs) {
92 var deferredResult; 89 var deferredResult;
93 var proxy; 90 var proxy;
94 var user; 91 var user;
95 var user2; 92 var user2;
96 var user3; 93 var user3;
97 var otp; 94 var otp;
98 95
99 otp = "yaxx k7ww - f8y6 tqz5 - 58b6 th44 - 9cwv q0fg"; //OTP 96 otp = "yaxx k7ww - f8y6 tqz5 - 58b6 th44 - 9cwv q0fg"; //OTP
100 97
101 newPassphrase = 'tset'; 98 newPassphrase = 'tset';
102 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); 99 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false});
103 user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); 100 user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}});
104 user2 = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return otp;}}); 101 user2 = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return otp;}});
105 102
106 deferredResult = new Clipperz.Async.Deferred("changePassphraseAndLoginUsingOtp_test", someTestArgs); 103 deferredResult = new Clipperz.Async.Deferred("changePassphraseAndLoginUsingOtp_test", someTestArgs);
107 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_with_otps']); 104 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_with_otps']);
108 105
109 deferredResult.addMethod(user, 'login'); 106 deferredResult.addMethod(user, 'login');
110 107
111 deferredResult.addMethod(user, 'getRecords'); 108 deferredResult.addMethod(user, 'getRecords');
112 deferredResult.addCallback(MochiKit.Base.itemgetter('length')); 109 deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
113 deferredResult.addTest(1, "This account has only a single card"); 110 deferredResult.addTest(1, "This account has only a single card");
114 111
115 deferredResult.addMethod(user, 'changePassphrase', newPassphrase); 112 deferredResult.addMethod(user, 'changePassphrase', newPassphrase);
116 deferredResult.addMethod(user, 'logout'); 113 deferredResult.addMethod(user, 'logout');
117 114
118 deferredResult.addMethod(user2, 'login'); 115 deferredResult.addMethod(user2, 'login');
119 deferredResult.addMethod(user2, 'getRecords'); 116 deferredResult.addMethod(user2, 'getRecords');
120 deferredResult.addCallback(MochiKit.Base.itemgetter('length')); 117 deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
121 deferredResult.addTest(1, "This account has oly a single card"); 118 deferredResult.addTest(1, "This account has oly a single card");
122 deferredResult.addMethod(user2, 'logout'); 119 deferredResult.addMethod(user2, 'logout');
123 120
124 deferredResult.callback(); 121 deferredResult.callback();
125 122
126 return deferredResult; 123 return deferredResult;
127 }, 124 },
128 125
129 //------------------------------------------------------------------------- 126 //-------------------------------------------------------------------------
130 127
131 'loginUsingOtpAndWrongUsername_test': function (someTestArgs) { 128 'loginUsingOtpAndWrongUsername_test': function (someTestArgs) {
132 var deferredResult; 129 var deferredResult;
133 var proxy; 130 var proxy;
134 var user, user2; 131 var user, user2;
135 var username; 132 var username;
136 var wrongUsername; 133 var wrongUsername;
137 var passphrase; 134 var passphrase;
138 135
139 username = "test"; 136 username = "test";
140 wrongUsername = "tset"; 137 wrongUsername = "tset";
141 passphrase = "yaxx k7ww - f8y6 tqz5 - 58b6 th44 - 9cwv q0fg"; //OTP 138 passphrase = "yaxx k7ww - f8y6 tqz5 - 58b6 th44 - 9cwv q0fg"; //OTP
142 139
143 proxy =new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); 140 proxy =new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false});
144 user =new Clipperz.PM.DataModel.User({username:wrongUsername, getPassphraseFunction:function () { return passphrase;}}); 141 user =new Clipperz.PM.DataModel.User({username:wrongUsername, getPassphraseFunction:function () { return passphrase;}});
145 user2 =new Clipperz.PM.DataModel.User({username:username, getPassphraseFunction:function () { return passphrase;}}); 142 user2 =new Clipperz.PM.DataModel.User({username:username, getPassphraseFunction:function () { return passphrase;}});
146 143
147 deferredResult = new Clipperz.Async.Deferred("loginUsingOtpAndWrongUsername_test", someTestArgs); 144 deferredResult = new Clipperz.Async.Deferred("loginUsingOtpAndWrongUsername_test", someTestArgs);
148 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_with_otps']); 145 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_with_otps']);
149 146
150 deferredResult.addMethod(user, 'login'); 147 deferredResult.addMethod(user, 'login');
151 deferredResult.shouldFail("login in using the wrong username with the OTP should fail"); 148 deferredResult.shouldFail("login in using the wrong username with the OTP should fail");
152 149
153 deferredResult.addMethod(user2, 'login'); 150 deferredResult.addMethod(user2, 'login');
154 deferredResult.shouldFail("trying to reuse the same OTP should fail, even if now it is used with the correct username"); 151 deferredResult.shouldFail("trying to reuse the same OTP should fail, even if now it is used with the correct username");
155 152
156 deferredResult.callback(); 153 deferredResult.callback();
157 154
158 return deferredResult; 155 return deferredResult;
159 }, 156 },
160 157
161 //------------------------------------------------------------------------- 158 //-------------------------------------------------------------------------
162 159
163 'loginUserWithAPassphraseLookingExactlyLikeAnOTP_test': function (someTestArgs) { 160 'loginUserWithAPassphraseLookingExactlyLikeAnOTP_test': function (someTestArgs) {
164 var deferredResult; 161 var deferredResult;
165 var proxy; 162 var proxy;
166 var user; 163 var user;
167 var username; 164 var username;
168 var passphrase; 165 var passphrase;
169 166
170 username = "otp_user"; 167 username = "otp_user";
171 passphrase = "yaxx k7ww - f8y6 tqz5 - 58b6 th44 - 9cwv q0fg"; //passphrase 168 passphrase = "yaxx k7ww - f8y6 tqz5 - 58b6 th44 - 9cwv q0fg"; //passphrase
172 169
173 proxy =new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); 170 proxy =new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false});
174 user =new Clipperz.PM.DataModel.User({username:username, getPassphraseFunction:function () { return passphrase;}}); 171 user =new Clipperz.PM.DataModel.User({username:username, getPassphraseFunction:function () { return passphrase;}});
175 172
176 deferredResult = new Clipperz.Async.Deferred("loginUserWithAPassphraseLookingExactlyLikeAnOTP_test", someTestArgs); 173 deferredResult = new Clipperz.Async.Deferred("loginUserWithAPassphraseLookingExactlyLikeAnOTP_test", someTestArgs);
177 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['otp_user_test']); 174 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['otp_user_test']);
178 175
179 deferredResult.addMethod(user, 'login'); 176 deferredResult.addMethod(user, 'login');
180 deferredResult.addMethod(user, 'getRecords'); 177 deferredResult.addMethod(user, 'getRecords');
181 deferredResult.addCallback(MochiKit.Base.itemgetter('length')); 178 deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
182 deferredResult.addTest(1, "This account has one single card"); 179 deferredResult.addTest(1, "This account has one single card");
183 180
184 deferredResult.callback(); 181 deferredResult.callback();
185 182
186 return deferredResult; 183 return deferredResult;
187 }, 184 },
188 185
189 //------------------------------------------------------------------------- 186 //-------------------------------------------------------------------------
190 //------------------------------------------------------------------------- 187 //-------------------------------------------------------------------------
191 'syntaxFix': MochiKit.Base.noop 188 'syntaxFix': MochiKit.Base.noop
192}; 189};
193 190
194 191
195 192
196//############################################################################# 193//#############################################################################
197 194
198SimpleTest.runDeferredTests("Clipperz.PM.DataModel.OneTimePassword", tests, {trace:false}); 195SimpleTest.runDeferredTests("Clipperz.PM.DataModel.OneTimePassword", tests, {trace:false});
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/Record.html b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/Record.html
index c349e0d..3685a7a 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/Record.html
+++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/Record.html
@@ -1,98 +1,95 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27--> 24-->
28 25
29<html> 26<html>
30<head> 27<head>
31 <title>Clipperz.PM.DataModel.Record - test</title> 28 <title>Clipperz.PM.DataModel.Record - test</title>
32 29
33 <script type="text/javascript" src="../../../../../js/MochiKit/MochiKit.js"></script> 30 <script type="text/javascript" src="../../../../../js/MochiKit/MochiKit.js"></script>
34 <script type="text/javascript" src="../../../../SimpleTest/SimpleTest.js"></script> 31 <script type="text/javascript" src="../../../../SimpleTest/SimpleTest.js"></script>
35 <link rel="stylesheet" type="text/css" href="../../../../SimpleTest/test.css"> 32 <link rel="stylesheet" type="text/css" href="../../../../SimpleTest/test.css">
36 33
37 <script type='text/javascript' src='../../../../../js/JSON/json2.js'></script> 34 <script type='text/javascript' src='../../../../../js/JSON/json2.js'></script>
38 35
39 <script type='text/javascript' src='../../../../../js/Clipperz/YUI/Utils.js'></script> 36 <script type='text/javascript' src='../../../../../js/Clipperz/YUI/Utils.js'></script>
40 <script type='text/javascript' src='../../../../../js/Clipperz/Base.js'></script> 37 <script type='text/javascript' src='../../../../../js/Clipperz/Base.js'></script>
41 <script type='text/javascript' src='../../../../../js/Clipperz/Date.js'></script> 38 <script type='text/javascript' src='../../../../../js/Clipperz/Date.js'></script>
42 <script type='text/javascript' src='../../../../../js/Clipperz/ByteArray.js'></script> 39 <script type='text/javascript' src='../../../../../js/Clipperz/ByteArray.js'></script>
43 <script type='text/javascript' src='../../../../../js/Clipperz/Logging.js'></script> 40 <script type='text/javascript' src='../../../../../js/Clipperz/Logging.js'></script>
44 <script type='text/javascript' src='../../../../../js/Clipperz/Async.js'></script> 41 <script type='text/javascript' src='../../../../../js/Clipperz/Async.js'></script>
45 <script type='text/javascript' src='../../../../../js/Clipperz/Signal.js'></script> 42 <script type='text/javascript' src='../../../../../js/Clipperz/Signal.js'></script>
46 <script type='text/javascript' src='../../../../../js/Clipperz/KeyValueObjectStore.js'></script> 43 <script type='text/javascript' src='../../../../../js/Clipperz/KeyValueObjectStore.js'></script>
47 44
48 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/Base.js'></script> 45 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/Base.js'></script>
49 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/BigInt.js'></script> 46 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/BigInt.js'></script>
50 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/AES.js'></script> 47 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/AES.js'></script>
51 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/SHA.js'></script> 48 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/SHA.js'></script>
52 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/PRNG.js'></script> 49 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/PRNG.js'></script>
53 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/SRP.js'></script> 50 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/SRP.js'></script>
54 51
55 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Toll.js'></script> 52 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Toll.js'></script>
56 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Strings.js'></script> 53 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Strings.js'></script>
57 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script> 54 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script>
58 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Date.js'></script> 55 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Date.js'></script>
59 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy.js'></script> 56 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy.js'></script>
60 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script> 57 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script>
61 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script> 58 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script>
62 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script> 59 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script>
63 60
64 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Connection.js'></script> 61 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Connection.js'></script>
65 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Crypto.js'></script> 62 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Crypto.js'></script>
66 63
67 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Strings.js'></script> 64 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Strings.js'></script>
68 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script> 65 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script>
69 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Date.js'></script> 66 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Date.js'></script>
70 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/EncryptedRemoteObject.js'></script> 67 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/EncryptedRemoteObject.js'></script>
71 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/Record.js'></script> 68 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/Record.js'></script>
72 <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.js'></script>
73 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/Record.Version.Field.js'></script> 70 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/Record.Version.Field.js'></script>
74 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLogin.js'></script> 71 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLogin.js'></script>
75 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLoginInput.js'></script> 72 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLoginInput.js'></script>
76 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLoginBinding.js'></script> 73 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLoginBinding.js'></script>
77 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLoginFormValue.js'></script> 74 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLoginFormValue.js'></script>
78 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.js'></script> 75 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.js'></script>
79 <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.Legacy.js'></script>
80 <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.RecordIndex.js'></script>
81 <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.Preferences.js'></script>
82 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.Header.OneTimePasswords.js'></script> 79 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.Header.OneTimePasswords.js'></script>
83 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/OneTimePassword.js'></script> 80 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/OneTimePassword.js'></script>
84 81
85 <script type="text/javascript" src="../../../../SimpleTest/SimpleTest.Async.js"></script> 82 <script type="text/javascript" src="../../../../SimpleTest/SimpleTest.Async.js"></script>
86</head> 83</head>
87<body> 84<body>
88 85
89<pre id="test"> 86<pre id="test">
90<script> 87<script>
91 Clipperz.PM.Strings.Languages.setSelectedLanguage('en-us'); 88 Clipperz.PM.Strings.Languages.setSelectedLanguage('en-us');
92</script> 89</script>
93<script type="text/javascript" src="DirectLoginConfigurations.data.js"></script> 90<script type="text/javascript" src="DirectLoginConfigurations.data.js"></script>
94<script type="text/javascript" src="User.data.js"></script> 91<script type="text/javascript" src="User.data.js"></script>
95<script type="text/javascript" src="Record.test.js"></script> 92<script type="text/javascript" src="Record.test.js"></script>
96</pre> 93</pre>
97</body> 94</body>
98</html> 95</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 7d024d9..667e2ae 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/Record.test.js
+++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/Record.test.js
@@ -1,408 +1,405 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); 26Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
30 27
31var tests = { 28var tests = {
32 29
33 //------------------------------------------------------------------------- 30 //-------------------------------------------------------------------------
34 31
35 'recordUseOf_retrieveIndexDataFunction_and_getRemoteDataFunction_test': function (someTestArgs) { 32 'recordUseOf_retrieveIndexDataFunction_and_getRemoteDataFunction_test': function (someTestArgs) {
36 var deferredResult; 33 var deferredResult;
37 var record; 34 var record;
38 35
39//console.log("#### new Clipperz.PM.DataModel.Record [5]"); 36//console.log("#### new Clipperz.PM.DataModel.Record [5]");
40 record = new Clipperz.PM.DataModel.Record({ 37 record = new Clipperz.PM.DataModel.Record({
41 'reference': '<<< record reference >>>', 38 'reference': '<<< record reference >>>',
42 'retrieveKeyFunction': MochiKit.Base.noop, 39 'retrieveKeyFunction': MochiKit.Base.noop,
43 'retrieveRemoteDataFunction': function (aRecordReference) { 40 'retrieveRemoteDataFunction': function (aRecordReference) {
44 SimpleTest.is(aRecordReference, '<<< record reference >>>', "Record correctly passes its record reference when asking for encrypted data"); 41 SimpleTest.is(aRecordReference, '<<< record reference >>>', "Record correctly passes its record reference when asking for encrypted data");
45 return MochiKit.Async.succeed({ 42 return MochiKit.Async.succeed({
46 // fake server payload 43 // fake server payload
47 'data': "#### fake encrypted data ####", 44 'data': "#### fake encrypted data ####",
48 'version': "0.x", 45 'version': "0.x",
49 'currentVersion': { 46 'currentVersion': {
50 'reference': "<<< fake record version reference >>>", 47 'reference': "<<< fake record version reference >>>",
51 'data': "#### fake encrypted data ####", 48 'data': "#### fake encrypted data ####",
52 'version': "0.x" 49 'version': "0.x"
53 } 50 }
54 }); 51 });
55 }, 52 },
56 'updateDate': "Thu, 10 May 2007 13:01:21 UTC", 53 'updateDate': "Thu, 10 May 2007 13:01:21 UTC",
57 // 'encryptedDataKeypath': 'data', 54 // 'encryptedDataKeypath': 'data',
58 // 'encryptedVersionKeypath': 'version', 55 // 'encryptedVersionKeypath': 'version',
59 56
60 'retrieveIndexDataFunction':function (aRecordReference) { 57 'retrieveIndexDataFunction':function (aRecordReference) {
61 SimpleTest.is(aRecordReference, '<<< record reference >>>', "Record correctly passes its record reference when asking for index data"); 58 SimpleTest.is(aRecordReference, '<<< record reference >>>', "Record correctly passes its record reference when asking for index data");
62 return MochiKit.Async.succeed({ 59 return MochiKit.Async.succeed({
63 key:'<< key >>', 60 key:'<< key >>',
64 label:'<< label >>', 61 label:'<< label >>',
65 notes:'<< notes >>' 62 notes:'<< notes >>'
66 }); 63 });
67 }, 64 },
68 'updateIndexDataFunction': MochiKit.Base.noop 65 'updateIndexDataFunction': MochiKit.Base.noop
69 66
70 }); 67 });
71 68
72 deferredResult = new Clipperz.Async.Deferred("recordUseOf_retrieveIndexDataFunction_and_getEncryptedDataFunction_test", someTestArgs); 69 deferredResult = new Clipperz.Async.Deferred("recordUseOf_retrieveIndexDataFunction_and_getEncryptedDataFunction_test", someTestArgs);
73 deferredResult.addMethod(record, 'label'); 70 deferredResult.addMethod(record, 'label');
74 deferredResult.addTest('<< label >>', "Record returns the right value for label"); 71 deferredResult.addTest('<< label >>', "Record returns the right value for label");
75 deferredResult.addMethod(record, 'notes'); 72 deferredResult.addMethod(record, 'notes');
76 deferredResult.addTest('<< notes >>', "Record returns the right value for notes - even the legacy one, stored on the header"); 73 deferredResult.addTest('<< notes >>', "Record returns the right value for notes - even the legacy one, stored on the header");
77 deferredResult.addMethod(record, 'getRemoteData'); 74 deferredResult.addMethod(record, 'getRemoteData');
78 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")); 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"));
79 deferredResult.callback(); 76 deferredResult.callback();
80 77
81 return deferredResult; 78 return deferredResult;
82 }, 79 },
83 80
84 //------------------------------------------------------------------------- 81 //-------------------------------------------------------------------------
85 82
86 'createRecordWithoutAllRequiredParameters_test': function (someTestArgs) { 83 'createRecordWithoutAllRequiredParameters_test': function (someTestArgs) {
87 varrecord; 84 varrecord;
88 85
89 try { 86 try {
90//console.log("#### new Clipperz.PM.DataModel.Record [6]"); 87//console.log("#### new Clipperz.PM.DataModel.Record [6]");
91 record = new Clipperz.PM.DataModel.Record({reference:'--'}); 88 record = new Clipperz.PM.DataModel.Record({reference:'--'});
92 SimpleTest.ok(false, "creating a record without all parameters should raise an exception"); 89 SimpleTest.ok(false, "creating a record without all parameters should raise an exception");
93 } catch(exception) { 90 } catch(exception) {
94 // SimpleTest.is(exception.name, "Clipperz.Base.exception.MandatoryParameter", "creating a record without all parameters raises an exception"); 91 // SimpleTest.is(exception.name, "Clipperz.Base.exception.MandatoryParameter", "creating a record without all parameters raises an exception");
95 SimpleTest.ok(/Clipperz\.Base\.exception\.MandatoryParameter.*/.test(exception.name), "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");
96 } 93 }
97 }, 94 },
98 95
99 //------------------------------------------------------------------------- 96 //-------------------------------------------------------------------------
100 97
101 'recordFromOldData_version_0.1_test': function (someTestArgs) { 98 'recordFromOldData_version_0.1_test': function (someTestArgs) {
102 var deferredResult; 99 var deferredResult;
103 var proxy; 100 var proxy;
104 var user; 101 var user;
105 var recordID; 102 var recordID;
106 103
107//console.log("#### new Clipperz.PM.DataModel.Record [7]"); 104//console.log("#### new Clipperz.PM.DataModel.Record [7]");
108/* 105/*
109 record = new Clipperz.PM.DataModel.Record({ 106 record = new Clipperz.PM.DataModel.Record({
110 'reference':'05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a', 107 'reference':'05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a',
111 'retrieveKeyFunction': MochiKit.Base.partial(MochiKit.Async.succeed, 'e038652297f981d5ca917d88fa2c4c3251a12c0fa41bf7313a4d24a9738fe6c6'), 108 'retrieveKeyFunction': MochiKit.Base.partial(MochiKit.Async.succeed, 'e038652297f981d5ca917d88fa2c4c3251a12c0fa41bf7313a4d24a9738fe6c6'),
112 'retrieveRemoteDataFunction':MochiKit.Base.partial(MochiKit.Async.succeed, { 109 'retrieveRemoteDataFunction':MochiKit.Base.partial(MochiKit.Async.succeed, {
113 'data': '4ec19a7093534e7dcf7c796b889283c6cec224b1895720ba3ff43ce091dc72c61fd5ea56def418ba3f15239f73228c6c8558585311f5e6673efe57482a1f9c9fe71e921576989eace671ec543685e3ad8f976bbfa4c2dbc629fab936c227d4fd4da3a1561ea79e553bae7b758ff91762572c1448a2d18bec797e12721238ef5ba18ddf1fba8ae773a8debe1040b3b158220aec6be9c7190687139f589a30d9c8887792fd7040e3c7cf3f9999fb9dde1f9f334d17c996996d538a7e374ac93135acafdaf5fce738a1702182897b63d2cb8e308b94156473cba63dcc557d17dcbdb55fcff63d9ba5edf68c42855052e34207d6fabe94fe024c3db616b45f494da42c62224d3897e320080072cc442d4212e7b1e8d5b3d9e3c25d48f4e7c37112ef4c6b2c0c8aff0bd3ce05694370e4378701463dde26c7c0322f8a9eb5a724106039b16b35050a9a9b5717b2eec803efa962b88b9655742f5e7b180ea567449671fb5a2ce563d8b47bc25705821938192eae420391c208182a788dd06fb6448b9858a4104a14efd7717671c65cd08fd979a4da7c01712bc5d4e949a10ef1ea65caf1f07cee34b063bab01bfb7a59047fef30c3059ea652f1c92b9e72aac515ac8851756703772e1fa05384ee7f0d5c7a3c', 110 'data': '4ec19a7093534e7dcf7c796b889283c6cec224b1895720ba3ff43ce091dc72c61fd5ea56def418ba3f15239f73228c6c8558585311f5e6673efe57482a1f9c9fe71e921576989eace671ec543685e3ad8f976bbfa4c2dbc629fab936c227d4fd4da3a1561ea79e553bae7b758ff91762572c1448a2d18bec797e12721238ef5ba18ddf1fba8ae773a8debe1040b3b158220aec6be9c7190687139f589a30d9c8887792fd7040e3c7cf3f9999fb9dde1f9f334d17c996996d538a7e374ac93135acafdaf5fce738a1702182897b63d2cb8e308b94156473cba63dcc557d17dcbdb55fcff63d9ba5edf68c42855052e34207d6fabe94fe024c3db616b45f494da42c62224d3897e320080072cc442d4212e7b1e8d5b3d9e3c25d48f4e7c37112ef4c6b2c0c8aff0bd3ce05694370e4378701463dde26c7c0322f8a9eb5a724106039b16b35050a9a9b5717b2eec803efa962b88b9655742f5e7b180ea567449671fb5a2ce563d8b47bc25705821938192eae420391c208182a788dd06fb6448b9858a4104a14efd7717671c65cd08fd979a4da7c01712bc5d4e949a10ef1ea65caf1f07cee34b063bab01bfb7a59047fef30c3059ea652f1c92b9e72aac515ac8851756703772e1fa05384ee7f0d5c7a3c',
114 'version': '0.1', 111 'version': '0.1',
115 'currentVersion': { 112 'currentVersion': {
116 'reference': '05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a', 113 'reference': '05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a',
117 'data': '4ec19a7093534e7dcf7c796b889283c6cec224b1895720ba3ff43ce091dc72c61fd5ea56def418ba3f15239f73228c6c8558585311f5e6673efe57482a1f9c9fe71e921576989eace671ec543685e3ad8f976bbfa4c2dbc629fab936c227d4fd4da3a1561ea79e553bae7b758ff91762572c1448a2d18bec797e12721238ef5ba18ddf1fba8ae773a8debe1040b3b158220aec6be9c7190687139f589a30d9c8887792fd7040e3c7cf3f9999fb9dde1f9f334d17c996996d538a7e374ac93135acafdaf5fce738a1702182897b63d2cb8e308b94156473cba63dcc557d17dcbdb55fcff63d9ba5edf68c42855052e34207d6fabe94fe024c3db616b45f494da42c62224d3897e320080072cc442d4212e7b1e8d5b3d9e3c25d48f4e7c37112ef4c6b2c0c8aff0bd3ce05694370e4378701463dde26c7c0322f8a9eb5a724106039b16b35050a9a9b5717b2eec803efa962b88b9655742f5e7b180ea567449671fb5a2ce563d8b47bc25705821938192eae420391c208182a788dd06fb6448b9858a4104a14efd7717671c65cd08fd979a4da7c01712bc5d4e949a10ef1ea65caf1f07cee34b063bab01bfb7a59047fef30c3059ea652f1c92b9e72aac515ac8851756703772e1fa05384ee7f0d5c7a3c', 114 'data': '4ec19a7093534e7dcf7c796b889283c6cec224b1895720ba3ff43ce091dc72c61fd5ea56def418ba3f15239f73228c6c8558585311f5e6673efe57482a1f9c9fe71e921576989eace671ec543685e3ad8f976bbfa4c2dbc629fab936c227d4fd4da3a1561ea79e553bae7b758ff91762572c1448a2d18bec797e12721238ef5ba18ddf1fba8ae773a8debe1040b3b158220aec6be9c7190687139f589a30d9c8887792fd7040e3c7cf3f9999fb9dde1f9f334d17c996996d538a7e374ac93135acafdaf5fce738a1702182897b63d2cb8e308b94156473cba63dcc557d17dcbdb55fcff63d9ba5edf68c42855052e34207d6fabe94fe024c3db616b45f494da42c62224d3897e320080072cc442d4212e7b1e8d5b3d9e3c25d48f4e7c37112ef4c6b2c0c8aff0bd3ce05694370e4378701463dde26c7c0322f8a9eb5a724106039b16b35050a9a9b5717b2eec803efa962b88b9655742f5e7b180ea567449671fb5a2ce563d8b47bc25705821938192eae420391c208182a788dd06fb6448b9858a4104a14efd7717671c65cd08fd979a4da7c01712bc5d4e949a10ef1ea65caf1f07cee34b063bab01bfb7a59047fef30c3059ea652f1c92b9e72aac515ac8851756703772e1fa05384ee7f0d5c7a3c',
118 'version': '0.1' 115 'version': '0.1'
119 } 116 }
120 117
121 }), 118 }),
122 119
123 'retrieveIndexDataFunction':MochiKit.Base.partial(MochiKit.Async.succeed, { 120 'retrieveIndexDataFunction':MochiKit.Base.partial(MochiKit.Async.succeed, {
124 // 'key': 'e038652297f981d5ca917d88fa2c4c3251a12c0fa41bf7313a4d24a9738fe6c6', 121 // 'key': 'e038652297f981d5ca917d88fa2c4c3251a12c0fa41bf7313a4d24a9738fe6c6',
125 'label': '<< label >>', 122 'label': '<< label >>',
126 'notes': '<< notes >>' 123 'notes': '<< notes >>'
127 }), 124 }),
128 'updateIndexDataFunction': MochiKit.Base.noop, 125 'updateIndexDataFunction': MochiKit.Base.noop,
129 'updateDate': 'Mon Oct 02 10:01:52 CEST 2006' 126 'updateDate': 'Mon Oct 02 10:01:52 CEST 2006'
130 }); 127 });
131*/ 128*/
132 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false}); 129 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false});
133 user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); 130 user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}});
134 recordID = "05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a"; 131 recordID = "05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a";
135 132
136 deferredResult = new Clipperz.Async.Deferred("recordFromOldData_version_0.1_test", someTestArgs); 133 deferredResult = new Clipperz.Async.Deferred("recordFromOldData_version_0.1_test", someTestArgs);
137 134
138 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_someExtraOldData']); 135 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_someExtraOldData']);
139 deferredResult.addMethod(user, 'login'); 136 deferredResult.addMethod(user, 'login');
140 137
141 deferredResult.addMethod(user, 'getRecord', recordID); 138 deferredResult.addMethod(user, 'getRecord', recordID);
142 deferredResult.addMethodcaller('hasAnyCleanTextData'); 139 deferredResult.addMethodcaller('hasAnyCleanTextData');
143 deferredResult.addTest(false, "When first loaded, the record has no clean text data"); 140 deferredResult.addTest(false, "When first loaded, the record has no clean text data");
144 141
145 deferredResult.addMethod(user, 'getRecord', recordID); 142 deferredResult.addMethod(user, 'getRecord', recordID);
146 deferredResult.addMethodcaller('label'); 143 deferredResult.addMethodcaller('label');
147 deferredResult.addTest("Card encoded with an old algorithm", "Record returns the right value for label"); 144 deferredResult.addTest("Card encoded with an old algorithm", "Record returns the right value for label");
148 145
149 deferredResult.addMethod(user, 'getRecord', recordID); 146 deferredResult.addMethod(user, 'getRecord', recordID);
150 deferredResult.addMethodcaller('notes'); 147 deferredResult.addMethodcaller('notes');
151 deferredResult.addTest("", "Record returns the right value for notes - even the legacy one, stored on the header"); 148 deferredResult.addTest("", "Record returns the right value for notes - even the legacy one, stored on the header");
152 149
153 deferredResult.addMethod(user, 'getRecord', recordID); 150 deferredResult.addMethod(user, 'getRecord', recordID);
154 deferredResult.addMethodcaller('hasAnyCleanTextData'); 151 deferredResult.addMethodcaller('hasAnyCleanTextData');
155 deferredResult.addTest(true, "After reading some values, the record has some clean text data"); 152 deferredResult.addTest(true, "After reading some values, the record has some clean text data");
156 153
157 deferredResult.addMethod(user, 'getRecord', recordID); 154 deferredResult.addMethod(user, 'getRecord', recordID);
158 deferredResult.addMethodcaller('fields'); 155 deferredResult.addMethodcaller('fields');
159 deferredResult.addCallback(function (someFields) { 156 deferredResult.addCallback(function (someFields) {
160 SimpleTest.is(MochiKit.Base.values(someFields).length, 6, "the card has 6 fields"); 157 SimpleTest.is(MochiKit.Base.values(someFields).length, 6, "the card has 6 fields");
161 }); 158 });
162 deferredResult.callback(); 159 deferredResult.callback();
163 160
164 return deferredResult; 161 return deferredResult;
165 162
166 }, 163 },
167 164
168 //------------------------------------------------------------------------- 165 //-------------------------------------------------------------------------
169 166
170 'removeDirectLogin': function (someTestArgs) { 167 'removeDirectLogin': function (someTestArgs) {
171 var deferredResult; 168 var deferredResult;
172 var proxy; 169 var proxy;
173 var user; 170 var user;
174 171
175 var recordID = 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'; //YAHOO (4) 172 var recordID = 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'; //YAHOO (4)
176 var directLoginID ='dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496'; 173 var directLoginID ='dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496';
177 174
178 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false}); 175 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false});
179 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); 176 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
180 user2 = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); 177 user2 = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
181 178
182 deferredResult = new Clipperz.Async.Deferred("Record.test.removeDirectLogin", someTestArgs); 179 deferredResult = new Clipperz.Async.Deferred("Record.test.removeDirectLogin", someTestArgs);
183 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); 180 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
184 deferredResult.addMethod(user, 'login'); 181 deferredResult.addMethod(user, 'login');
185 deferredResult.addMethod(user, 'getRecord', recordID); 182 deferredResult.addMethod(user, 'getRecord', recordID);
186 deferredResult.addMethodcaller('directLogins'); 183 deferredResult.addMethodcaller('directLogins');
187 deferredResult.addCallback(MochiKit.Base.itemgetter(directLoginID)); 184 deferredResult.addCallback(MochiKit.Base.itemgetter(directLoginID));
188 deferredResult.addMethodcaller('remove'); 185 deferredResult.addMethodcaller('remove');
189 186
190 deferredResult.addMethod(user, 'getRecord', recordID); 187 deferredResult.addMethod(user, 'getRecord', recordID);
191 deferredResult.addMethodcaller('hasPendingChanges'); 188 deferredResult.addMethodcaller('hasPendingChanges');
192 deferredResult.addTest(true, "removing a direct login to a record should result in pending changes on the record"); 189 deferredResult.addTest(true, "removing a direct login to a record should result in pending changes on the record");
193 190
194 deferredResult.addMethod(user, 'saveChanges'); 191 deferredResult.addMethod(user, 'saveChanges');
195 deferredResult.addMethod(user, 'hasPendingChanges'); 192 deferredResult.addMethod(user, 'hasPendingChanges');
196 deferredResult.addTest(false, "after saving there should be not any pending changes"); 193 deferredResult.addTest(false, "after saving there should be not any pending changes");
197 194
198 deferredResult.addMethod(user, 'getRecord', recordID); 195 deferredResult.addMethod(user, 'getRecord', recordID);
199 deferredResult.addMethodcaller('directLogins'); 196 deferredResult.addMethodcaller('directLogins');
200 deferredResult.addCallback(MochiKit.Base.keys); 197 deferredResult.addCallback(MochiKit.Base.keys);
201 deferredResult.addCallback(MochiKit.Base.itemgetter('length')); 198 deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
202 deferredResult.addTest(3, "after saving changes, the record should have only 3 direct logins"); 199 deferredResult.addTest(3, "after saving changes, the record should have only 3 direct logins");
203 200
204 deferredResult.addMethod(user2, 'login'); 201 deferredResult.addMethod(user2, 'login');
205 deferredResult.addMethod(user2, 'getRecord', recordID); 202 deferredResult.addMethod(user2, 'getRecord', recordID);
206 deferredResult.addMethodcaller('directLogins'); 203 deferredResult.addMethodcaller('directLogins');
207 deferredResult.addCallback(MochiKit.Base.keys); 204 deferredResult.addCallback(MochiKit.Base.keys);
208 deferredResult.addCallback(MochiKit.Base.itemgetter('length')); 205 deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
209 deferredResult.addTest(3, "also reloading all the data with a new user, the direct logins should always be 3"); 206 deferredResult.addTest(3, "also reloading all the data with a new user, the direct logins should always be 3");
210 207
211 deferredResult.callback(); 208 deferredResult.callback();
212 209
213 return deferredResult; 210 return deferredResult;
214 }, 211 },
215 212
216 //------------------------------------------------------------------------- 213 //-------------------------------------------------------------------------
217 214
218 'removeDirectLoginAndRevertChanges': function (someTestArgs) { 215 'removeDirectLoginAndRevertChanges': function (someTestArgs) {
219 var deferredResult; 216 var deferredResult;
220 var proxy; 217 var proxy;
221 var user; 218 var user;
222 219
223 var recordID = 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'; 220 var recordID = 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d';
224 var directLoginID ='dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496'; 221 var directLoginID ='dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496';
225 222
226 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false}); 223 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false});
227 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); 224 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
228 225
229 deferredResult = new Clipperz.Async.Deferred("Record.test.removeDirectLoginAndRevertChanges", someTestArgs); 226 deferredResult = new Clipperz.Async.Deferred("Record.test.removeDirectLoginAndRevertChanges", someTestArgs);
230 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); 227 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
231 deferredResult.addMethod(user, 'login'); 228 deferredResult.addMethod(user, 'login');
232 229
233 deferredResult.addMethod(user, 'getDirectLogins'); 230 deferredResult.addMethod(user, 'getDirectLogins');
234 deferredResult.addCallback(MochiKit.Base.itemgetter('length')); 231 deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
235 deferredResult.addTest(22, "the user has 22 initially"); 232 deferredResult.addTest(22, "the user has 22 initially");
236 233
237 deferredResult.addMethod(user, 'getRecord', recordID); 234 deferredResult.addMethod(user, 'getRecord', recordID);
238 deferredResult.addMethodcaller('directLogins'); 235 deferredResult.addMethodcaller('directLogins');
239 deferredResult.addCallback(MochiKit.Base.keys); 236 deferredResult.addCallback(MochiKit.Base.keys);
240 deferredResult.addCallback(MochiKit.Base.itemgetter('length')); 237 deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
241 deferredResult.addTest(4, "the selected record has 4 direct logins"); 238 deferredResult.addTest(4, "the selected record has 4 direct logins");
242 239
243 deferredResult.addMethod(user, 'getRecord', recordID); 240 deferredResult.addMethod(user, 'getRecord', recordID);
244 deferredResult.addMethodcaller('directLogins'); 241 deferredResult.addMethodcaller('directLogins');
245 deferredResult.addCallback(MochiKit.Base.itemgetter(directLoginID)); 242 deferredResult.addCallback(MochiKit.Base.itemgetter(directLoginID));
246 deferredResult.addMethodcaller('remove'); 243 deferredResult.addMethodcaller('remove');
247 244
248 deferredResult.addMethod(user, 'getRecord', recordID); 245 deferredResult.addMethod(user, 'getRecord', recordID);
249 deferredResult.addMethodcaller('hasPendingChanges'); 246 deferredResult.addMethodcaller('hasPendingChanges');
250 deferredResult.addTest(true, "removing a direct login to a record should result in pending changes on the record"); 247 deferredResult.addTest(true, "removing a direct login to a record should result in pending changes on the record");
251 248
252 deferredResult.addMethod(user, 'revertChanges'); 249 deferredResult.addMethod(user, 'revertChanges');
253 deferredResult.addMethod(user, 'hasPendingChanges'); 250 deferredResult.addMethod(user, 'hasPendingChanges');
254 deferredResult.addTest(false, "after reverting the changes, the user should not have pending changes"); 251 deferredResult.addTest(false, "after reverting the changes, the user should not have pending changes");
255 252
256 deferredResult.addMethod(user, 'getDirectLogins'); 253 deferredResult.addMethod(user, 'getDirectLogins');
257 deferredResult.addCallback(MochiKit.Base.itemgetter('length')); 254 deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
258 deferredResult.addTest(22, "after reverting the changes, the user should still have 22 direct logins"); 255 deferredResult.addTest(22, "after reverting the changes, the user should still have 22 direct logins");
259 256
260 deferredResult.addMethod(user, 'getRecord', recordID); 257 deferredResult.addMethod(user, 'getRecord', recordID);
261 deferredResult.addMethodcaller('directLogins'); 258 deferredResult.addMethodcaller('directLogins');
262 deferredResult.addCallback(MochiKit.Base.keys); 259 deferredResult.addCallback(MochiKit.Base.keys);
263 deferredResult.addCallback(MochiKit.Base.itemgetter('length')); 260 deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
264 deferredResult.addTest(4, "after reverting the changes, the record should still have 4 direct logins"); 261 deferredResult.addTest(4, "after reverting the changes, the record should still have 4 direct logins");
265 262
266 deferredResult.callback(); 263 deferredResult.callback();
267 264
268 return deferredResult; 265 return deferredResult;
269 }, 266 },
270 267
271 //------------------------------------------------------------------------- 268 //-------------------------------------------------------------------------
272 269
273 'addDirectLoginAndRevertChanges': function (someTestArgs) { 270 'addDirectLoginAndRevertChanges': function (someTestArgs) {
274 var deferredResult; 271 var deferredResult;
275 var proxy; 272 var proxy;
276 var user, user2; 273 var user, user2;
277 var recordID = 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'; //YAHOO (4) 274 var recordID = 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'; //YAHOO (4)
278 var directLoginReference; 275 var directLoginReference;
279 276
280 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false}); 277 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false});
281 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); 278 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
282 user2 = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); 279 user2 = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
283 280
284 deferredResult = new Clipperz.Async.Deferred("Record.test.addDirectLoginAndRevertChanges", someTestArgs); 281 deferredResult = new Clipperz.Async.Deferred("Record.test.addDirectLoginAndRevertChanges", someTestArgs);
285 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); 282 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
286 deferredResult.addMethod(user, 'login'); 283 deferredResult.addMethod(user, 'login');
287 284
288 deferredResult.addMethod(user, 'getRecord', recordID); 285 deferredResult.addMethod(user, 'getRecord', recordID);
289 deferredResult.setValue('record'); 286 deferredResult.setValue('record');
290 deferredResult.addMethodcaller('directLogins'); 287 deferredResult.addMethodcaller('directLogins');
291 deferredResult.addCallback(MochiKit.Base.keys); 288 deferredResult.addCallback(MochiKit.Base.keys);
292 deferredResult.addCallback(MochiKit.Base.itemgetter('length')); 289 deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
293 deferredResult.addTest(4, "the record, when initially loaded, has 4 direct logins"); 290 deferredResult.addTest(4, "the record, when initially loaded, has 4 direct logins");
294 291
295 deferredResult.getValue('record'); 292 deferredResult.getValue('record');
296 deferredResult.addMethodcaller('createNewDirectLogin'); 293 deferredResult.addMethodcaller('createNewDirectLogin');
297 deferredResult.setValue('directLogin'); 294 deferredResult.setValue('directLogin');
298 295
299 deferredResult.getValue('directLogin'); 296 deferredResult.getValue('directLogin');
300 deferredResult.addMethodcaller('setLabel', "New direct login"); 297 deferredResult.addMethodcaller('setLabel', "New direct login");
301 298
302 deferredResult.getValue('directLogin'); 299 deferredResult.getValue('directLogin');
303 deferredResult.addMethodcaller('setBookmarkletConfiguration', '{"page": {"title": "Parallels Account"}, "form": {"attributes": {"action": "https://www.parallels.com/account/", "method": "post"}, "inputs": [{"type": "text", "name": "Email", "value": ""}, {"type": "password", "name": "Password", "value": ""}]}, "version": "0.2.3"}'); 300 deferredResult.addMethodcaller('setBookmarkletConfiguration', '{"page": {"title": "Parallels Account"}, "form": {"attributes": {"action": "https://www.parallels.com/account/", "method": "post"}, "inputs": [{"type": "text", "name": "Email", "value": ""}, {"type": "password", "name": "Password", "value": ""}]}, "version": "0.2.3"}');
304 301
305 deferredResult.addMethod(user, 'revertChanges'); 302 deferredResult.addMethod(user, 'revertChanges');
306//deferredResult.addCallback(function () { console.log("###################################"); }); 303//deferredResult.addCallback(function () { console.log("###################################"); });
307 deferredResult.addMethod(user, 'hasPendingChanges'); 304 deferredResult.addMethod(user, 'hasPendingChanges');
308 deferredResult.addTest(false, "after reverting the changes, the user should NOT have pending changes"); 305 deferredResult.addTest(false, "after reverting the changes, the user should NOT have pending changes");
309 306
310 deferredResult.getValue('record'); 307 deferredResult.getValue('record');
311 deferredResult.addMethodcaller('hasPendingChanges'); 308 deferredResult.addMethodcaller('hasPendingChanges');
312 deferredResult.addTest(false, "after reverting the changes, the record should NOT have pending changes"); 309 deferredResult.addTest(false, "after reverting the changes, the record should NOT have pending changes");
313 310
314 deferredResult.addMethod(user2, 'login'); 311 deferredResult.addMethod(user2, 'login');
315 312
316 deferredResult.addMethod(user2, 'getRecord', recordID); 313 deferredResult.addMethod(user2, 'getRecord', recordID);
317 deferredResult.setValue('record_2'); 314 deferredResult.setValue('record_2');
318 deferredResult.addMethodcaller('directLogins'); 315 deferredResult.addMethodcaller('directLogins');
319 deferredResult.addCallback(MochiKit.Base.keys); 316 deferredResult.addCallback(MochiKit.Base.keys);
320 deferredResult.addCallback(MochiKit.Base.itemgetter('length')); 317 deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
321 deferredResult.addTest(4, "the record, when reloaded from scratch, has still 4 direct logins"); 318 deferredResult.addTest(4, "the record, when reloaded from scratch, has still 4 direct logins");
322 319
323 deferredResult.callback(); 320 deferredResult.callback();
324 321
325 return deferredResult; 322 return deferredResult;
326 }, 323 },
327 324
328 //------------------------------------------------------------------------- 325 //-------------------------------------------------------------------------
329 326
330 'addDirectLoginAndSaveChanges': function (someTestArgs) { 327 'addDirectLoginAndSaveChanges': function (someTestArgs) {
331 var deferredResult; 328 var deferredResult;
332 var proxy; 329 var proxy;
333 var user, user2; 330 var user, user2;
334 var recordID = 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'; //YAHOO (4) 331 var recordID = 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'; //YAHOO (4)
335 var directLoginReference; 332 var directLoginReference;
336 333
337 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false}); 334 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false});
338 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); 335 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
339 user2 = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); 336 user2 = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
340 337
341 deferredResult = new Clipperz.Async.Deferred("Record.test.addDirectLoginAndSaveChanges", someTestArgs); 338 deferredResult = new Clipperz.Async.Deferred("Record.test.addDirectLoginAndSaveChanges", someTestArgs);
342 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); 339 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
343 deferredResult.addMethod(user, 'login'); 340 deferredResult.addMethod(user, 'login');
344 341
345 deferredResult.addMethod(user, 'getRecord', recordID); 342 deferredResult.addMethod(user, 'getRecord', recordID);
346 deferredResult.addMethodcaller('hasAnyCleanTextData'); 343 deferredResult.addMethodcaller('hasAnyCleanTextData');
347 deferredResult.addTest(false, "When first loaded, the record has no clean text data [2]"); 344 deferredResult.addTest(false, "When first loaded, the record has no clean text data [2]");
348 345
349 deferredResult.addMethod(user, 'getRecord', recordID); 346 deferredResult.addMethod(user, 'getRecord', recordID);
350 deferredResult.setValue('record'); 347 deferredResult.setValue('record');
351 deferredResult.addMethodcaller('directLogins'); 348 deferredResult.addMethodcaller('directLogins');
352 deferredResult.addCallback(MochiKit.Base.keys); 349 deferredResult.addCallback(MochiKit.Base.keys);
353 deferredResult.addCallback(MochiKit.Base.itemgetter('length')); 350 deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
354 deferredResult.addTest(4, "the selected record has 4 direct logins"); 351 deferredResult.addTest(4, "the selected record has 4 direct logins");
355 352
356 deferredResult.addMethod(user, 'getRecord', recordID); 353 deferredResult.addMethod(user, 'getRecord', recordID);
357 deferredResult.addMethodcaller('hasAnyCleanTextData'); 354 deferredResult.addMethodcaller('hasAnyCleanTextData');
358 deferredResult.addTest(false, "Still no clean text data is stored on the record, as all accessed data are stored on the index"); 355 deferredResult.addTest(false, "Still no clean text data is stored on the record, as all accessed data are stored on the index");
359 356
360 deferredResult.addMethod(user, 'hasAnyCleanTextData'); 357 deferredResult.addMethod(user, 'hasAnyCleanTextData');
361 deferredResult.addTest(true, "the user has some clean text data"); 358 deferredResult.addTest(true, "the user has some clean text data");
362 359
363 deferredResult.getValue('record'); 360 deferredResult.getValue('record');
364 deferredResult.addMethodcaller('createNewDirectLogin'); 361 deferredResult.addMethodcaller('createNewDirectLogin');
365 deferredResult.setValue('directLogin'); 362 deferredResult.setValue('directLogin');
366 363
367 deferredResult.getValue('directLogin'); 364 deferredResult.getValue('directLogin');
368 deferredResult.addMethodcaller('label'); 365 deferredResult.addMethodcaller('label');
369 deferredResult.addTest(null, "The label of a initially created direct login is empty"); 366 deferredResult.addTest(null, "The label of a initially created direct login is empty");
370 367
371 deferredResult.getValue('directLogin'); 368 deferredResult.getValue('directLogin');
372 deferredResult.addMethodcaller('bookmarkletConfiguration'); 369 deferredResult.addMethodcaller('bookmarkletConfiguration');
373 deferredResult.addTest('', "The bookmaraklet configuration of a initially created direct login is empty"); 370 deferredResult.addTest('', "The bookmaraklet configuration of a initially created direct login is empty");
374 371
375 deferredResult.getValue('directLogin'); 372 deferredResult.getValue('directLogin');
376 deferredResult.addMethodcaller('bindings'); 373 deferredResult.addMethodcaller('bindings');
377 deferredResult.addCallback(Clipperz.Async.Test.isDeeply({}, "The bindings of a initially created direct login is empty")); 374 deferredResult.addCallback(Clipperz.Async.Test.isDeeply({}, "The bindings of a initially created direct login is empty"));
378 375
379 deferredResult.getValue('directLogin'); 376 deferredResult.getValue('directLogin');
380 deferredResult.addMethodcaller('setLabel', "New direct login"); 377 deferredResult.addMethodcaller('setLabel', "New direct login");
381 378
382 deferredResult.getValue('directLogin'); 379 deferredResult.getValue('directLogin');
383 deferredResult.addMethodcaller('setBookmarkletConfiguration', directLoginConfigurations['Parallels']); 380 deferredResult.addMethodcaller('setBookmarkletConfiguration', directLoginConfigurations['Parallels']);
384 381
385 deferredResult.getValue('directLogin'); 382 deferredResult.getValue('directLogin');
386 deferredResult.addMethodcaller('bindings'); 383 deferredResult.addMethodcaller('bindings');
387 deferredResult.addCallback(MochiKit.Base.itemgetter('Email')); 384 deferredResult.addCallback(MochiKit.Base.itemgetter('Email'));
388 deferredResult.addMethodcaller('setFieldKey', '4cfaf1e782086e7527bd0e0cc82b67eb773e8157ad0c5babe516f7bc945a02a9'); //"userID" 385 deferredResult.addMethodcaller('setFieldKey', '4cfaf1e782086e7527bd0e0cc82b67eb773e8157ad0c5babe516f7bc945a02a9'); //"userID"
389 386
390 deferredResult.getValue('directLogin'); 387 deferredResult.getValue('directLogin');
391 deferredResult.addMethodcaller('bindings'); 388 deferredResult.addMethodcaller('bindings');
392 deferredResult.addCallback(MochiKit.Base.itemgetter('Password')); 389 deferredResult.addCallback(MochiKit.Base.itemgetter('Password'));
393 deferredResult.addMethodcaller('setFieldKey', 'ef2dee54322bf401540657d469e158a50e9228bc0a192a31d2e3ee56a77e565b'); //"password" 390 deferredResult.addMethodcaller('setFieldKey', 'ef2dee54322bf401540657d469e158a50e9228bc0a192a31d2e3ee56a77e565b'); //"password"
394 391
395 deferredResult.getValue('directLogin'); 392 deferredResult.getValue('directLogin');
396 deferredResult.addMethodcaller('favicon'), 393 deferredResult.addMethodcaller('favicon'),
397 deferredResult.addTest('http://www.parallels.com/favicon.ico', "the original favicon is the expected one"), 394 deferredResult.addTest('http://www.parallels.com/favicon.ico', "the original favicon is the expected one"),
398 395
399 deferredResult.getValue('directLogin'); 396 deferredResult.getValue('directLogin');
400 deferredResult.addMethodcaller('reference'); 397 deferredResult.addMethodcaller('reference');
401 deferredResult.addCallback(function (aReference) { 398 deferredResult.addCallback(function (aReference) {
402 directLoginReference = aReference; 399 directLoginReference = aReference;
403 }); 400 });
404 401
405 deferredResult.addMethod(user, 'hasPendingChanges'); 402 deferredResult.addMethod(user, 'hasPendingChanges');
406 deferredResult.addTest(true, "after adding a new direct login, the user should have pending changes"); 403 deferredResult.addTest(true, "after adding a new direct login, the user should have pending changes");
407 404
408 deferredResult.getValue('record'); 405 deferredResult.getValue('record');
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 5684dbd..96c6962 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.data.js
+++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.data.js
@@ -1,408 +1,405 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29testData = { 26testData = {
30 27
31 //----------------------------------------------------------------------------- 28 //-----------------------------------------------------------------------------
32 29
33 'simpleLogin_001': function () { return { 30 'simpleLogin_001': function () { return {
34 'users': [ 31 'users': [
35 { 32 {
36 'username': "joe", 33 'username': "joe",
37 'passphrase': "eoj", 34 'passphrase': "eoj",
38 'version': "0.2", 35 'version': "0.2",
39 'connectionVersion':"0.2", 36 'connectionVersion':"0.2",
40 'records':{ 37 'records':{
41 'record 1': { 38 'record 1': {
42 'notes':"Some notes here", 39 'notes':"Some notes here",
43 'fields':[ 40 'fields':[
44 { 'name': "username", 'value': "joe", 'type': "text" }, 41 { 'name': "username", 'value': "joe", 'type': "text" },
45 { 'name': "password", 'value': "1234", 'type': "password"} 42 { 'name': "password", 'value': "1234", 'type': "password"}
46 ], 43 ],
47 'directLogins':{ 44 'directLogins':{
48 "record 1 direct login": { 45 "record 1 direct login": {
49 'configuration':"", 46 'configuration':"",
50 'bindings':[ 47 'bindings':[
51 ], 48 ],
52 'favicon':"http://www.example.com/favicon.ico" 49 'favicon':"http://www.example.com/favicon.ico"
53 } 50 }
54 } 51 }
55 } 52 }
56 }, 53 },
57 'otp':[ 54 'otp':[
58 "12345678 90abcdef 12345678 90abcdef", 55 "12345678 90abcdef 12345678 90abcdef",
59 "fedcba09 87654321 fedcba09 87654321" 56 "fedcba09 87654321 fedcba09 87654321"
60 ] 57 ]
61 } 58 }
62 ] 59 ]
63 };}(), 60 };}(),
64 61
65 //----------------------------------------------------------------------------- 62 //-----------------------------------------------------------------------------
66 63
67 'joe_clipperz_offline_copy_data': function () { return { 64 'joe_clipperz_offline_copy_data': function () { return {
68 users:{ 65 users:{
69 'catchAllUser': { 66 'catchAllUser': {
70 __masterkey_test_value__: 'masterkey', 67 __masterkey_test_value__: 'masterkey',
71 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00', 68 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00',
72 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00' 69 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00'
73 }, 70 },
74 'f527cdd90d0d47f8524b4e165398ad1455eba515d04abd101d1e93b3c6ae0674': { 71 'f527cdd90d0d47f8524b4e165398ad1455eba515d04abd101d1e93b3c6ae0674': {
75 s: '186f0c40bf73f2af236eaa6c429df225efa933050c9aae65240e93b7b362e3ee', 72 s: '186f0c40bf73f2af236eaa6c429df225efa933050c9aae65240e93b7b362e3ee',
76 v: 'ac61a6e325ecf329926a86084f591d8852d0ad3e4a6080f2adc901b82395ecaf', 73 v: 'ac61a6e325ecf329926a86084f591d8852d0ad3e4a6080f2adc901b82395ecaf',
77 version: '0.2', 74 version: '0.2',
78 maxNumberOfRecords: '100', 75 maxNumberOfRecords: '100',
79 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"}', 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"}',
80 statistics: 'SfGy/4mpXQdDOv+Bcfie4Yt/', 77 statistics: 'SfGy/4mpXQdDOv+Bcfie4Yt/',
81 userDetailsVersion: '0.3', 78 userDetailsVersion: '0.3',
82 records: { 79 records: {
83 '062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80': { 80 '062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80': {
84 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', 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',
85 version: '0.2', 82 version: '0.2',
86 creationDate: 'Wed Mar 14 15:46:44 CET 2007', 83 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
87 updateDate: 'Wed Mar 14 15:46:44 CET 2007', 84 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
88 accessDate: 'Mon Jan 19 16:10:04 CET 2009', 85 accessDate: 'Mon Jan 19 16:10:04 CET 2009',
89 currentVersion: '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3', 86 currentVersion: '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3',
90 versions: { 87 versions: {
91 '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3': { 88 '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3': {
92 header: '####', 89 header: '####',
93 data: 'GCNNIhDQjMJQZGVSf+95fPtU6eOnFWVhuGm86r8WZGVR2Gf2EjbG1OJ0ZIGpZ/AXgirCMpo5AFxJe0Bay8IYg+xmBqMFhwFxzAgJBYCIts+raSaNRipuY8dTEqDxAqD1cChcG8EhSoiFgQ0fG0I7nNEUDJi0pIt4/ygBcwvAhuAenEp9ZW+oQA0+YysPQRqkz3IieFaOoSEbe5/SqpUilV4q1gTVyzNXvrxzxx+rlvEyGFgFN+vgtUZ1NrwlPk4gVksTpylvv6CFaMGEWKhgMG6efo0rJckKosaJTu1pldJdnmMK4EKNMLOd+jZ6pEhEhYyadrA4+zYU5TlmZA6ASzTaps8piSwZodoi9qY0ch2StK4mAbzeEGe2HdfHuAU9Tyq3Ppk3+VfNdKgpQfYrQOiSlXbKzK636tzXTN/gyrfOTHjBrRl117ywibgSX63ayAYNfcLpKotC', 90 data: 'GCNNIhDQjMJQZGVSf+95fPtU6eOnFWVhuGm86r8WZGVR2Gf2EjbG1OJ0ZIGpZ/AXgirCMpo5AFxJe0Bay8IYg+xmBqMFhwFxzAgJBYCIts+raSaNRipuY8dTEqDxAqD1cChcG8EhSoiFgQ0fG0I7nNEUDJi0pIt4/ygBcwvAhuAenEp9ZW+oQA0+YysPQRqkz3IieFaOoSEbe5/SqpUilV4q1gTVyzNXvrxzxx+rlvEyGFgFN+vgtUZ1NrwlPk4gVksTpylvv6CFaMGEWKhgMG6efo0rJckKosaJTu1pldJdnmMK4EKNMLOd+jZ6pEhEhYyadrA4+zYU5TlmZA6ASzTaps8piSwZodoi9qY0ch2StK4mAbzeEGe2HdfHuAU9Tyq3Ppk3+VfNdKgpQfYrQOiSlXbKzK636tzXTN/gyrfOTHjBrRl117ywibgSX63ayAYNfcLpKotC',
94 version: '0.2', 91 version: '0.2',
95 creationDate: 'Wed Mar 14 15:46:44 CET 2007', 92 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
96 updateDate: 'Wed Mar 14 15:46:44 CET 2007', 93 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
97 accessDate: 'Mon Jan 19 16:10:04 CET 2009' 94 accessDate: 'Mon Jan 19 16:10:04 CET 2009'
98 } 95 }
99 } 96 }
100 }, 97 },
101 '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d': { 98 '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d': {
102 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', 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',
103 version: '0.3', 100 version: '0.3',
104 creationDate: 'Fri Oct 17 16:49:20 CEST 2008', 101 creationDate: 'Fri Oct 17 16:49:20 CEST 2008',
105 updateDate: 'Mon Oct 27 08:58:49 CET 2008', 102 updateDate: 'Mon Oct 27 08:58:49 CET 2008',
106 accessDate: 'Mon Jan 19 16:09:39 CET 2009', 103 accessDate: 'Mon Jan 19 16:09:39 CET 2009',
107 currentVersion: '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac', 104 currentVersion: '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac',
108 versions: { 105 versions: {
109 '0ae362285f103722abbd046eee2b7d10aeae6a1d05cbaf2081392ce9df882bcf': { 106 '0ae362285f103722abbd046eee2b7d10aeae6a1d05cbaf2081392ce9df882bcf': {
110 header: '####', 107 header: '####',
111 data: 'sG6TUmPSEPFpiJ5YdtghWHmHbvUK63tZCZ+Q5iz2ALas//jN+lZCBhZcjEwPEJskBkK2R0MyAh14wWGh2bBHMjsokgTe+L+x+0c/Zi0epE/IC9gtOBhsTe/hZ2e2xOGF/SbzET3DAAYXvxduZ36f7SvvFnrkkKvpj8wGSdTFcBmzqMb9DL2bRyRCLGLMzE3F1a0q5CufCIRz2TgHm+Uw+kfvvwC7ig/F/5iLW90Ypz3vmEtMEFYFHZ9a8Oh0rsXGfevbMhFqALoywzihQEe/NiB8dwn7GEdYKSQ35rhvZh29ULWOZinqmg0ONe0HYaxx7DbKsVoue57S0CIUlgHLajzHfLfqQg2sFI0OT8TnHsGg0YZ6mM2EdKmEjJiER0cP', 108 data: 'sG6TUmPSEPFpiJ5YdtghWHmHbvUK63tZCZ+Q5iz2ALas//jN+lZCBhZcjEwPEJskBkK2R0MyAh14wWGh2bBHMjsokgTe+L+x+0c/Zi0epE/IC9gtOBhsTe/hZ2e2xOGF/SbzET3DAAYXvxduZ36f7SvvFnrkkKvpj8wGSdTFcBmzqMb9DL2bRyRCLGLMzE3F1a0q5CufCIRz2TgHm+Uw+kfvvwC7ig/F/5iLW90Ypz3vmEtMEFYFHZ9a8Oh0rsXGfevbMhFqALoywzihQEe/NiB8dwn7GEdYKSQ35rhvZh29ULWOZinqmg0ONe0HYaxx7DbKsVoue57S0CIUlgHLajzHfLfqQg2sFI0OT8TnHsGg0YZ6mM2EdKmEjJiER0cP',
112 version: '0.3', 109 version: '0.3',
113 creationDate: 'Fri Oct 17 17:00:31 CEST 2008', 110 creationDate: 'Fri Oct 17 17:00:31 CEST 2008',
114 updateDate: 'Fri Oct 17 17:00:31 CEST 2008', 111 updateDate: 'Fri Oct 17 17:00:31 CEST 2008',
115 accessDate: 'Fri Oct 17 17:00:31 CEST 2008' 112 accessDate: 'Fri Oct 17 17:00:31 CEST 2008'
116 }, 113 },
117 '10f45664bbd979a92f37886f1ecc6e52e49798b16dc997aecd37259ad9b2090e': { 114 '10f45664bbd979a92f37886f1ecc6e52e49798b16dc997aecd37259ad9b2090e': {
118 header: '####', 115 header: '####',
119 data: 'RdKVaV/WWWchrCse3KtcXd47Bfm6IAwjqVUpaxoed3HeunI42AAm7xYYSjeK8edHpbNRJbhobBAX5OZtWIp/HmgkobKM8CIiWxrWz89FqyrbnPD7+fXdtgF2yTax/0sC1l0ibncdOuJKX6U829oPlXCpXIOjlomc4wEEAD/5V6FbORvdZ9IE/ME3LsG2y02cT2tIpx6+R6wC/PKXhZA2UDsTE6R2Op2BtIzpVORZLXsdyAp/4wvWQxq90i9cEpbsVQsMB10JVyNHNsRTFhIlHi9MVCaMxQvcrwRElMj/Y9x3RbsFzSGKqFLqdg7Fn/U+KYkpYtsgHv9hraPIb9lV5FH16+iItU/HBM6FGezIj1ZkoQ+dgjPfSjTZzgzDYwyb', 116 data: 'RdKVaV/WWWchrCse3KtcXd47Bfm6IAwjqVUpaxoed3HeunI42AAm7xYYSjeK8edHpbNRJbhobBAX5OZtWIp/HmgkobKM8CIiWxrWz89FqyrbnPD7+fXdtgF2yTax/0sC1l0ibncdOuJKX6U829oPlXCpXIOjlomc4wEEAD/5V6FbORvdZ9IE/ME3LsG2y02cT2tIpx6+R6wC/PKXhZA2UDsTE6R2Op2BtIzpVORZLXsdyAp/4wvWQxq90i9cEpbsVQsMB10JVyNHNsRTFhIlHi9MVCaMxQvcrwRElMj/Y9x3RbsFzSGKqFLqdg7Fn/U+KYkpYtsgHv9hraPIb9lV5FH16+iItU/HBM6FGezIj1ZkoQ+dgjPfSjTZzgzDYwyb',
120 version: '0.3', 117 version: '0.3',
121 creationDate: 'Fri Oct 17 16:49:20 CEST 2008', 118 creationDate: 'Fri Oct 17 16:49:20 CEST 2008',
122 updateDate: 'Fri Oct 17 16:49:20 CEST 2008', 119 updateDate: 'Fri Oct 17 16:49:20 CEST 2008',
123 accessDate: 'Fri Oct 17 16:54:23 CEST 2008' 120 accessDate: 'Fri Oct 17 16:54:23 CEST 2008'
124 }, 121 },
125 '2fa7b67e569d5e268d2b70b3d4d3a960d7e437e1937bcb324b67d0b9441db8ba': { 122 '2fa7b67e569d5e268d2b70b3d4d3a960d7e437e1937bcb324b67d0b9441db8ba': {
126 header: '####', 123 header: '####',
127 data: 'dpnI2qKjk0+bfyKktw4ZCWf+rWZ12hO5bda39CwD29JH7KtdpLCLe2LoLd+KKF2wOdpDsoI2iTiwRgFpt77e7DoWJABxq/0aaRCVN9XpqZo08iHiYhJyNlIszO8CdEhX+M3AeZqzTnd6fs91VfIEWggvku2Z+jwr0CbclY6FnOcNnS+1fj+W79Z9XC383GOm2ujjfo3SX/fyNQSw8aX+7AgJIRGR9uHK7M1cVfsNNTbmDb/HDgLlYZ1Pqm/9poHpmS7G4HUoRM2/WjI0R6F48dy5s8vZRi11SCnlnj5oRykScJj6wh2DltbCyesiaTpAjP6MQjTXsZzKpaosaQcQClZw+w6hDD2cA54IaBIv2j5KAHyhxDh2ERdwbdnCsDKPz4+zP+fmKfW295d4OY0l1NCSdcY+75HWTmBWRAooZeDTo7AE8m5sRwxewE0Y8J2MLUYsrs7Rl4kbZCiRRHU7cs+us3fq2DVn2OLGEbkRrK3kA9swT9W8ABqINoA79+DmDaIr6TGxe5AlHkCAl5sYAN4g42UX1NKhl4fWI1Scj9O1Ixds/1UUvqzavld0mE2cR9yt6LntjE5sQSAaexvymAJbU5IIM5NTk7NlY7G3PEvAPjcUsL9SGw==', 124 data: 'dpnI2qKjk0+bfyKktw4ZCWf+rWZ12hO5bda39CwD29JH7KtdpLCLe2LoLd+KKF2wOdpDsoI2iTiwRgFpt77e7DoWJABxq/0aaRCVN9XpqZo08iHiYhJyNlIszO8CdEhX+M3AeZqzTnd6fs91VfIEWggvku2Z+jwr0CbclY6FnOcNnS+1fj+W79Z9XC383GOm2ujjfo3SX/fyNQSw8aX+7AgJIRGR9uHK7M1cVfsNNTbmDb/HDgLlYZ1Pqm/9poHpmS7G4HUoRM2/WjI0R6F48dy5s8vZRi11SCnlnj5oRykScJj6wh2DltbCyesiaTpAjP6MQjTXsZzKpaosaQcQClZw+w6hDD2cA54IaBIv2j5KAHyhxDh2ERdwbdnCsDKPz4+zP+fmKfW295d4OY0l1NCSdcY+75HWTmBWRAooZeDTo7AE8m5sRwxewE0Y8J2MLUYsrs7Rl4kbZCiRRHU7cs+us3fq2DVn2OLGEbkRrK3kA9swT9W8ABqINoA79+DmDaIr6TGxe5AlHkCAl5sYAN4g42UX1NKhl4fWI1Scj9O1Ixds/1UUvqzavld0mE2cR9yt6LntjE5sQSAaexvymAJbU5IIM5NTk7NlY7G3PEvAPjcUsL9SGw==',
128 version: '0.3', 125 version: '0.3',
129 creationDate: 'Fri Oct 17 17:00:13 CEST 2008', 126 creationDate: 'Fri Oct 17 17:00:13 CEST 2008',
130 updateDate: 'Fri Oct 17 17:00:13 CEST 2008', 127 updateDate: 'Fri Oct 17 17:00:13 CEST 2008',
131 accessDate: 'Fri Oct 17 17:00:13 CEST 2008' 128 accessDate: 'Fri Oct 17 17:00:13 CEST 2008'
132 }, 129 },
133 '5a17723c34226d8cd663f91b11bfa14979e694e461818113ec8abf7194b46b6b': { 130 '5a17723c34226d8cd663f91b11bfa14979e694e461818113ec8abf7194b46b6b': {
134 header: '####', 131 header: '####',
135 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==', 132 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==',
136 version: '0.3', 133 version: '0.3',
137 creationDate: 'Fri Oct 17 16:59:31 CEST 2008', 134 creationDate: 'Fri Oct 17 16:59:31 CEST 2008',
138 updateDate: 'Fri Oct 17 16:59:31 CEST 2008', 135 updateDate: 'Fri Oct 17 16:59:31 CEST 2008',
139 accessDate: 'Fri Oct 17 16:59:31 CEST 2008' 136 accessDate: 'Fri Oct 17 16:59:31 CEST 2008'
140 }, 137 },
141 '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac': { 138 '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac': {
142 header: '####', 139 header: '####',
143 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==', 140 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==',
144 version: '0.3', 141 version: '0.3',
145 creationDate: 'Mon Oct 27 08:58:49 CET 2008', 142 creationDate: 'Mon Oct 27 08:58:49 CET 2008',
146 updateDate: 'Mon Oct 27 08:58:49 CET 2008', 143 updateDate: 'Mon Oct 27 08:58:49 CET 2008',
147 accessDate: 'Mon Jan 19 16:09:39 CET 2009' 144 accessDate: 'Mon Jan 19 16:09:39 CET 2009'
148 }, 145 },
149 'b57a2d2ffafa8029123362071c09709bb9192f06a17140440f0e41d22143148f': { 146 'b57a2d2ffafa8029123362071c09709bb9192f06a17140440f0e41d22143148f': {
150 header: '####', 147 header: '####',
151 data: 'PQ53T2Vo2D8PoLI1qNX//jLaVZFTDTYk6geT9+4RoThTxvlJ+beDPnQzgYhd9iASaF9GQEEL8JxsBnNpEPa6JPOY4ndFLmDLyFDKXMprxq1UIbzFV6kFoYAk3uCCCa3UCDzdr1KXB2CiiF9HrilaA+xkm8krAvH8I5kZD+j23gByz5cAFvXg7A77KEURpjujURL65DW5M+ceIjo6OXaPW9VO03xhqGt/M47ayObpoEGJZn+X9C8s0SE5wOXHbn38YZlRI480OMvtDAxbEYUeQKMmzu6lO4Nw5hhOUjoPSLr/i3tmDx3nPcDwnSafx6jyA4y31eW6yazqTEOP5I5ArC5mUrF7mAAiFvbHIsMoF8PLj6MONlRIOZgbf9HzCpFdt8xBrX/TXp3LaSAj2XTWgSTFI2cgmU3qqPyibvIfUsB5cVHQCXi692JpC+B85axJ0FLyMl5w3vq0txlPkf6q+dadPYDaLHGZEmDjkWScA1GM5xPJHWFwqGE7ejgXKG0sMYsMKWYk+F2LEUmMHtEvSlpgJBntvcQ1ZjYQxeu4hg5txu1ykkif6fXgkXF6wn6qu+5caeJeNhWtAB4q7WVD47111woYMdkmX7AnDTXSAQ==', 148 data: 'PQ53T2Vo2D8PoLI1qNX//jLaVZFTDTYk6geT9+4RoThTxvlJ+beDPnQzgYhd9iASaF9GQEEL8JxsBnNpEPa6JPOY4ndFLmDLyFDKXMprxq1UIbzFV6kFoYAk3uCCCa3UCDzdr1KXB2CiiF9HrilaA+xkm8krAvH8I5kZD+j23gByz5cAFvXg7A77KEURpjujURL65DW5M+ceIjo6OXaPW9VO03xhqGt/M47ayObpoEGJZn+X9C8s0SE5wOXHbn38YZlRI480OMvtDAxbEYUeQKMmzu6lO4Nw5hhOUjoPSLr/i3tmDx3nPcDwnSafx6jyA4y31eW6yazqTEOP5I5ArC5mUrF7mAAiFvbHIsMoF8PLj6MONlRIOZgbf9HzCpFdt8xBrX/TXp3LaSAj2XTWgSTFI2cgmU3qqPyibvIfUsB5cVHQCXi692JpC+B85axJ0FLyMl5w3vq0txlPkf6q+dadPYDaLHGZEmDjkWScA1GM5xPJHWFwqGE7ejgXKG0sMYsMKWYk+F2LEUmMHtEvSlpgJBntvcQ1ZjYQxeu4hg5txu1ykkif6fXgkXF6wn6qu+5caeJeNhWtAB4q7WVD47111woYMdkmX7AnDTXSAQ==',
152 version: '0.3', 149 version: '0.3',
153 creationDate: 'Fri Oct 17 16:57:17 CEST 2008', 150 creationDate: 'Fri Oct 17 16:57:17 CEST 2008',
154 updateDate: 'Fri Oct 17 16:57:17 CEST 2008', 151 updateDate: 'Fri Oct 17 16:57:17 CEST 2008',
155 accessDate: 'Fri Oct 17 16:57:17 CEST 2008' 152 accessDate: 'Fri Oct 17 16:57:17 CEST 2008'
156 }, 153 },
157 'b713e0a1e2664ac7bfa7ba887329ea023204d10298973e322983b82b222debf6': { 154 'b713e0a1e2664ac7bfa7ba887329ea023204d10298973e322983b82b222debf6': {
158 header: '####', 155 header: '####',
159 data: 'H3gIieYrH7Oy8LEWCZpl9vGp9qYdHNCoBNGijYqlcfXt+1JYvPj1abPp12xLNrDUHfaOZklU2Ip4tOf0CDNhgAan7LYyPqFoy9ss2f9/5RLcbjwiIwSduySIL322HTAwqlzlBt/qaJdHHPUrczmu0fb7fT+0dO4gCL/e/IjcHLefUUgNPAbpHG0Nv0+4lNwKZkIQM3tLRtfJyFBIgWKcMcP1XMic33kr24rwybR8Pb0CHZrOOvvUiGqyoED3ZTZf1twUDVNXO7MWCAC5dBc6/Mk/vSmbbGhppXAH02N0g8G5qzZfp3UVikls55VNhRYLHByVsgpkbIrKXyZnBPTwzm7qefpYAXDOgO+164L66/Art2FYGqZQRZLuh5r8oF38', 156 data: 'H3gIieYrH7Oy8LEWCZpl9vGp9qYdHNCoBNGijYqlcfXt+1JYvPj1abPp12xLNrDUHfaOZklU2Ip4tOf0CDNhgAan7LYyPqFoy9ss2f9/5RLcbjwiIwSduySIL322HTAwqlzlBt/qaJdHHPUrczmu0fb7fT+0dO4gCL/e/IjcHLefUUgNPAbpHG0Nv0+4lNwKZkIQM3tLRtfJyFBIgWKcMcP1XMic33kr24rwybR8Pb0CHZrOOvvUiGqyoED3ZTZf1twUDVNXO7MWCAC5dBc6/Mk/vSmbbGhppXAH02N0g8G5qzZfp3UVikls55VNhRYLHByVsgpkbIrKXyZnBPTwzm7qefpYAXDOgO+164L66/Art2FYGqZQRZLuh5r8oF38',
160 version: '0.3', 157 version: '0.3',
161 creationDate: 'Fri Oct 17 16:58:00 CEST 2008', 158 creationDate: 'Fri Oct 17 16:58:00 CEST 2008',
162 updateDate: 'Fri Oct 17 16:58:00 CEST 2008', 159 updateDate: 'Fri Oct 17 16:58:00 CEST 2008',
163 accessDate: 'Fri Oct 17 16:58:00 CEST 2008' 160 accessDate: 'Fri Oct 17 16:58:00 CEST 2008'
164 }, 161 },
165 'c4cea1cd88a86b05f48a99896a37967c3456228283a0406331ca9f67c6f29f97': { 162 'c4cea1cd88a86b05f48a99896a37967c3456228283a0406331ca9f67c6f29f97': {
166 header: '####', 163 header: '####',
167 data: '1znWPwc9JwCe7iOFiUd2iGm4xJd+824B4VRqEtzCQkW46tg25RWfo7XagvK46USB7t6pC8WMLU0M/EC47KucsfpWUqHGbseoXT/8g8E8GoLnIsk9qFyJG7LGd1sUvqBgszLZwjWWG3t9zifmpW5nY9GialBYNmeSLS3bg5xDH+eCEilUUfDe7zGuVSuu/XkHacv/DYUst97e+6u44F7H8Kv8dTywJZpqbmveNPeWfCej2aBXdVV616J5lIRaj2uIYuQYG7blYJh9KZ7yLStdPndl6h65hIJpfWo0PM8nLJuo0lWNHz7misrutnmxJEjkwVIZ5YAmqp1Zz3VC8zw4IxkXrC/sPmp4PaNXgKz9ZJRaY2KV69WmHf7BUQ3QneGngbT0tN526SS5qDFwTGiuIlnYGWvTB2jVrbns68n/d8Fps8sSWfJBvvXJUEkaZB+1WqNilOPGXvyJ5k2O/iucFbRlxwlEHDny+AgsbtXZdp8cHQ4C/O4G0mnUMZuS38gn6e2kQ55mUhxKeORM+J6Rx1y4Iiu9KKNbxyS5eBpAlFB4xS/o35CS4g309vyOEhi37F24bpp4pM0xEPG4mcc/IyChHzaHUGEp1IX1ZO/r3ut9RIN2QWrGLUlZV/9rFKpLLAy6BkY/g8VYNrV8PztOL3rqy/qwqNZouONwPw8w8SA=', 164 data: '1znWPwc9JwCe7iOFiUd2iGm4xJd+824B4VRqEtzCQkW46tg25RWfo7XagvK46USB7t6pC8WMLU0M/EC47KucsfpWUqHGbseoXT/8g8E8GoLnIsk9qFyJG7LGd1sUvqBgszLZwjWWG3t9zifmpW5nY9GialBYNmeSLS3bg5xDH+eCEilUUfDe7zGuVSuu/XkHacv/DYUst97e+6u44F7H8Kv8dTywJZpqbmveNPeWfCej2aBXdVV616J5lIRaj2uIYuQYG7blYJh9KZ7yLStdPndl6h65hIJpfWo0PM8nLJuo0lWNHz7misrutnmxJEjkwVIZ5YAmqp1Zz3VC8zw4IxkXrC/sPmp4PaNXgKz9ZJRaY2KV69WmHf7BUQ3QneGngbT0tN526SS5qDFwTGiuIlnYGWvTB2jVrbns68n/d8Fps8sSWfJBvvXJUEkaZB+1WqNilOPGXvyJ5k2O/iucFbRlxwlEHDny+AgsbtXZdp8cHQ4C/O4G0mnUMZuS38gn6e2kQ55mUhxKeORM+J6Rx1y4Iiu9KKNbxyS5eBpAlFB4xS/o35CS4g309vyOEhi37F24bpp4pM0xEPG4mcc/IyChHzaHUGEp1IX1ZO/r3ut9RIN2QWrGLUlZV/9rFKpLLAy6BkY/g8VYNrV8PztOL3rqy/qwqNZouONwPw8w8SA=',
168 version: '0.3', 165 version: '0.3',
169 creationDate: 'Fri Oct 17 17:01:59 CEST 2008', 166 creationDate: 'Fri Oct 17 17:01:59 CEST 2008',
170 updateDate: 'Fri Oct 17 17:01:59 CEST 2008', 167 updateDate: 'Fri Oct 17 17:01:59 CEST 2008',
171 accessDate: 'Mon Oct 27 08:57:58 CET 2008' 168 accessDate: 'Mon Oct 27 08:57:58 CET 2008'
172 } 169 }
173 } 170 }
174 }, 171 },
175 '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551': { 172 '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551': {
176 data: '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', 173 data: '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',
177 version: '0.2', 174 version: '0.2',
178 creationDate: 'Wed Mar 14 14:53:11 CET 2007', 175 creationDate: 'Wed Mar 14 14:53:11 CET 2007',
179 updateDate: 'Tue Apr 17 19:17:52 CEST 2007', 176 updateDate: 'Tue Apr 17 19:17:52 CEST 2007',
180 accessDate: 'Mon Jan 19 16:09:25 CET 2009', 177 accessDate: 'Mon Jan 19 16:09:25 CET 2009',
181 currentVersion: '88943d709c3ea2442d4f58eaaec6409276037e5a37e0a6d167b9dad9e947e854', 178 currentVersion: '88943d709c3ea2442d4f58eaaec6409276037e5a37e0a6d167b9dad9e947e854',
182 versions: { 179 versions: {
183 '106a1116d22c2395906a346da4d830c7afbd2da9a46210d0b7a11de238016783': { 180 '106a1116d22c2395906a346da4d830c7afbd2da9a46210d0b7a11de238016783': {
184 header: '####', 181 header: '####',
185 data: 'jgDUvByveAFnchBQKhiHGYDNDtj/7Aja2RePMer0FCOkkEu5GRAiLkxA3/DD3eiU+g+mCxnjnOaEIYL1O5o0+JP08XapsblZHTRKfveeFfs6sWwuqEHGYULBaXx4XSfK2B12HgpBwa5aD49489AkuyXi7t/aAXcKKJcLB1sC61DI3NsmajUaXHBi31Sp7nKAUpMuiWyguW0JVfH6KUPqyldVDBTBqHAis37c1qoR6aFHFfGgAfb35+syfmPRgemujMRkj2XO6dbt9zAYlHVSYFp9393rwPZoyBfXMMdDtSTmq7H9qbmx31GecHZlFN3NymtPPDYUbQ9mpPVRbxE9NjtiPrI5eGFvb++OdOx75PKjYjCAPWWFZ+4aryNn+h+yqab7pAuoG03ACVVrAFIOn09g1ssol/vqvalulEf3hAIviedyiNAC9D0UDHtzUwyIiELvR9qouXLZ', 182 data: 'jgDUvByveAFnchBQKhiHGYDNDtj/7Aja2RePMer0FCOkkEu5GRAiLkxA3/DD3eiU+g+mCxnjnOaEIYL1O5o0+JP08XapsblZHTRKfveeFfs6sWwuqEHGYULBaXx4XSfK2B12HgpBwa5aD49489AkuyXi7t/aAXcKKJcLB1sC61DI3NsmajUaXHBi31Sp7nKAUpMuiWyguW0JVfH6KUPqyldVDBTBqHAis37c1qoR6aFHFfGgAfb35+syfmPRgemujMRkj2XO6dbt9zAYlHVSYFp9393rwPZoyBfXMMdDtSTmq7H9qbmx31GecHZlFN3NymtPPDYUbQ9mpPVRbxE9NjtiPrI5eGFvb++OdOx75PKjYjCAPWWFZ+4aryNn+h+yqab7pAuoG03ACVVrAFIOn09g1ssol/vqvalulEf3hAIviedyiNAC9D0UDHtzUwyIiELvR9qouXLZ',
186 version: '0.2', 183 version: '0.2',
187 creationDate: 'Tue Apr 17 19:13:41 CEST 2007', 184 creationDate: 'Tue Apr 17 19:13:41 CEST 2007',
188 updateDate: 'Tue Apr 17 19:13:41 CEST 2007', 185 updateDate: 'Tue Apr 17 19:13:41 CEST 2007',
189 accessDate: 'Tue Apr 17 19:13:41 CEST 2007' 186 accessDate: 'Tue Apr 17 19:13:41 CEST 2007'
190 }, 187 },
191 '111a8a4b6b912b808a93cf5e8785ca223112628d05f0bfc5dfe1eb40cb72ed8a': { 188 '111a8a4b6b912b808a93cf5e8785ca223112628d05f0bfc5dfe1eb40cb72ed8a': {
192 header: '####', 189 header: '####',
193 data: 't524etHmXljCnLC+IM+WPD8Q5VE7wDsSHVNZzFU4hQzk119t/N/vhtfHYz5HgNstU5T8c7h7RHKvFk5f+4ZwgNgDqSH7H2PrH+7/bV8+uuqbe+/3GYOvELjTF7v3xMyYs1B7ruHpT+291HVNZqxajqCl/+9nbG0e5feqNsTXWUTdLzF0szJuCTNr2I+fhxAO0LRVaf8h+MBPYyuBDnfFDuKm899IsgF9YoYRvjaYO69DkElvf4VP2jrXIJsRnGIUfUaIS/wQ54+X4JBZM/9M09MVOw1SVe+cwG+P3xyPUkqnSb77ECo86C0MktzeYFmPnPv2SM2KFA6slctXsyudoaNlReh1k+6no5J5BjaawTfqYjYrAtWSPsuhxYVsZym/X2CVbkz4rMSn+J5Uio9N5uZ6AqgCKdhAJlwzVb3fIIJwvFpVpy/0LMskb7aG2i4eAxwzx1H6rD3Y', 190 data: 't524etHmXljCnLC+IM+WPD8Q5VE7wDsSHVNZzFU4hQzk119t/N/vhtfHYz5HgNstU5T8c7h7RHKvFk5f+4ZwgNgDqSH7H2PrH+7/bV8+uuqbe+/3GYOvELjTF7v3xMyYs1B7ruHpT+291HVNZqxajqCl/+9nbG0e5feqNsTXWUTdLzF0szJuCTNr2I+fhxAO0LRVaf8h+MBPYyuBDnfFDuKm899IsgF9YoYRvjaYO69DkElvf4VP2jrXIJsRnGIUfUaIS/wQ54+X4JBZM/9M09MVOw1SVe+cwG+P3xyPUkqnSb77ECo86C0MktzeYFmPnPv2SM2KFA6slctXsyudoaNlReh1k+6no5J5BjaawTfqYjYrAtWSPsuhxYVsZym/X2CVbkz4rMSn+J5Uio9N5uZ6AqgCKdhAJlwzVb3fIIJwvFpVpy/0LMskb7aG2i4eAxwzx1H6rD3Y',
194 version: '0.2', 191 version: '0.2',
195 creationDate: 'Wed Mar 14 14:53:11 CET 2007', 192 creationDate: 'Wed Mar 14 14:53:11 CET 2007',
196 updateDate: 'Wed Mar 14 14:53:11 CET 2007', 193 updateDate: 'Wed Mar 14 14:53:11 CET 2007',
197 accessDate: 'Wed Mar 14 15:24:35 CET 2007' 194 accessDate: 'Wed Mar 14 15:24:35 CET 2007'
198 }, 195 },
199 '144d6eff3eb5f1cb70c8906741d88018cdeeae3a618ac4066598ad6b04242364': { 196 '144d6eff3eb5f1cb70c8906741d88018cdeeae3a618ac4066598ad6b04242364': {
200 header: '####', 197 header: '####',
201 data: 'NPgSZF0eSOzy0/Ns+15Nz4bjSwh4o7fWYgKgwXLRFrF8y3EdbiOH7AiEmmPrCpT1raeYLWCcDIrRTz+/9uvIrz6kK6BjU2emr8YdyLai+PTCRY0SafWS3QiYixX6DJiKIt0SC2F6dfmSHwNsbfTHilFhVXn6wXTJpWvC+sRzw+h42cYpQp0BoLSuFV7vPz/+wtuQdl28BiBgLzGsrtPud0tPcfldGox6Ia/1SrOPcqUr0tnFlNQiUvPU7N0JZgRNyr1PfpAEhmYRI7aEJidsZ36vGQpE0ZQMmQE/9tLS/InALRZT1YXfMsytf0o3y4QlgJrvRgBL7fGiQOZJpU7igLk15xAwU+OLIaYIbr2xlKDJvndHOcrFoYKry9/A/aZSnEYv79wsaf64bBgIVD2WJGLuSFFmzlFnbg/O4kGTin3A8XBpvFA9V6iCMvnEMkrqxD3Qgf7WhxFE1A==', 198 data: 'NPgSZF0eSOzy0/Ns+15Nz4bjSwh4o7fWYgKgwXLRFrF8y3EdbiOH7AiEmmPrCpT1raeYLWCcDIrRTz+/9uvIrz6kK6BjU2emr8YdyLai+PTCRY0SafWS3QiYixX6DJiKIt0SC2F6dfmSHwNsbfTHilFhVXn6wXTJpWvC+sRzw+h42cYpQp0BoLSuFV7vPz/+wtuQdl28BiBgLzGsrtPud0tPcfldGox6Ia/1SrOPcqUr0tnFlNQiUvPU7N0JZgRNyr1PfpAEhmYRI7aEJidsZ36vGQpE0ZQMmQE/9tLS/InALRZT1YXfMsytf0o3y4QlgJrvRgBL7fGiQOZJpU7igLk15xAwU+OLIaYIbr2xlKDJvndHOcrFoYKry9/A/aZSnEYv79wsaf64bBgIVD2WJGLuSFFmzlFnbg/O4kGTin3A8XBpvFA9V6iCMvnEMkrqxD3Qgf7WhxFE1A==',
202 version: '0.2', 199 version: '0.2',
203 creationDate: 'Wed Mar 14 15:33:00 CET 2007', 200 creationDate: 'Wed Mar 14 15:33:00 CET 2007',
204 updateDate: 'Wed Mar 14 15:33:00 CET 2007', 201 updateDate: 'Wed Mar 14 15:33:00 CET 2007',
205 accessDate: 'Tue Apr 17 19:12:56 CEST 2007' 202 accessDate: 'Tue Apr 17 19:12:56 CEST 2007'
206 }, 203 },
207 '1f1bdb7a21440ac20c6d913d676aa30dc360252d27059e77df51a1be36b2e263': { 204 '1f1bdb7a21440ac20c6d913d676aa30dc360252d27059e77df51a1be36b2e263': {
208 header: '####', 205 header: '####',
209 data: 'TaOHH6IoHPKLLoyLyvsBszgsPPcDs6CiLVXzXuXjFSTrhPxzUw9suSsisgDRRs0ncjZ6BCyqoCxMnw6QVvGN4viUwYVR8AWdCg0NMQZ+LkNfq/2WN0M3KyASI8sIdMCwTb57NzOn9soB1HmmmETZfjr7HpY2cc+lS5/4f5rxI8XTEK60lLed+aEuJamAjeZUdgIyu30mMKKjxPfY3Y9iWMwn1OD0zF0mAW+hyEoMhhK7EYlWKCy+4qN0QM+yNFXQyERb04o2n4XrM+qr9df1GtbQMH8igK5VzXIrKjdHjKoLo9G7D7mfx6mRLsmoAJuE0R8gyzotgdBpOgWasHJ82iWEa1dLRKBHJ1d0Lnumv22tvYfasx2DIR5Tmx3kIQ3hFieLSXq48cYMiaZH/IbLiapIOlMgtWDow8JuySBLei/8FAV8jCxSc1Ui/SjbuK/kCvywaSOhDVIxGw==', 206 data: 'TaOHH6IoHPKLLoyLyvsBszgsPPcDs6CiLVXzXuXjFSTrhPxzUw9suSsisgDRRs0ncjZ6BCyqoCxMnw6QVvGN4viUwYVR8AWdCg0NMQZ+LkNfq/2WN0M3KyASI8sIdMCwTb57NzOn9soB1HmmmETZfjr7HpY2cc+lS5/4f5rxI8XTEK60lLed+aEuJamAjeZUdgIyu30mMKKjxPfY3Y9iWMwn1OD0zF0mAW+hyEoMhhK7EYlWKCy+4qN0QM+yNFXQyERb04o2n4XrM+qr9df1GtbQMH8igK5VzXIrKjdHjKoLo9G7D7mfx6mRLsmoAJuE0R8gyzotgdBpOgWasHJ82iWEa1dLRKBHJ1d0Lnumv22tvYfasx2DIR5Tmx3kIQ3hFieLSXq48cYMiaZH/IbLiapIOlMgtWDow8JuySBLei/8FAV8jCxSc1Ui/SjbuK/kCvywaSOhDVIxGw==',
210 version: '0.2', 207 version: '0.2',
211 creationDate: 'Wed Mar 14 15:26:35 CET 2007', 208 creationDate: 'Wed Mar 14 15:26:35 CET 2007',
212 updateDate: 'Wed Mar 14 15:26:35 CET 2007', 209 updateDate: 'Wed Mar 14 15:26:35 CET 2007',
213 accessDate: 'Wed Mar 14 15:26:35 CET 2007' 210 accessDate: 'Wed Mar 14 15:26:35 CET 2007'
214 }, 211 },
215 '70720f026f37b571e9765d27c51d3d60c7be0293c3266f1f987c8de9c6b5c416': { 212 '70720f026f37b571e9765d27c51d3d60c7be0293c3266f1f987c8de9c6b5c416': {
216 header: '####', 213 header: '####',
217 data: 'NYaYljcgfzrlN1DVgrbyj4AeVhXGjXPho3IQwEKD3ZOx/yEZxldCNSyFsrk7PoRB8Q1T/6VV4CGa4HLRSB7QVCrtVqWyu4KbbmFoX8NIQ0H3xv+TSo3S/b3dldUeyW32ScaGbspaf8nFf0CffsgpGusd+kHdiE3gSLJvH9y5j47KgpyyX4TteVzqgez4dcXIs5tdzJq2eUlknwU4651QeKIuRSmRaDRhhOP4yRgUo/qXMlTJFmHviCh+IumvBdmDoPe3Vc1vZ1r8PxpDJLvDoB8GTDE42NhqHfVrew9ym1xlTD9wswwIEikfOyTq3JM857qPOHRqSqthEvr4WHbm1VW5PReIyse0lugGyOzqtCnADp9NvNI440VjaTd4NBQqF7XrRm56+1u1uTdfYGFV5BRiH1KmrM1sxXQ6PlOF9Lou45ALo20xxvJOLKG0RKLMr8gmVT2bNtOSJw==', 214 data: 'NYaYljcgfzrlN1DVgrbyj4AeVhXGjXPho3IQwEKD3ZOx/yEZxldCNSyFsrk7PoRB8Q1T/6VV4CGa4HLRSB7QVCrtVqWyu4KbbmFoX8NIQ0H3xv+TSo3S/b3dldUeyW32ScaGbspaf8nFf0CffsgpGusd+kHdiE3gSLJvH9y5j47KgpyyX4TteVzqgez4dcXIs5tdzJq2eUlknwU4651QeKIuRSmRaDRhhOP4yRgUo/qXMlTJFmHviCh+IumvBdmDoPe3Vc1vZ1r8PxpDJLvDoB8GTDE42NhqHfVrew9ym1xlTD9wswwIEikfOyTq3JM857qPOHRqSqthEvr4WHbm1VW5PReIyse0lugGyOzqtCnADp9NvNI440VjaTd4NBQqF7XrRm56+1u1uTdfYGFV5BRiH1KmrM1sxXQ6PlOF9Lou45ALo20xxvJOLKG0RKLMr8gmVT2bNtOSJw==',
218 version: '0.2', 215 version: '0.2',
219 creationDate: 'Wed Mar 14 15:30:09 CET 2007', 216 creationDate: 'Wed Mar 14 15:30:09 CET 2007',
220 updateDate: 'Wed Mar 14 15:30:09 CET 2007', 217 updateDate: 'Wed Mar 14 15:30:09 CET 2007',
221 accessDate: 'Wed Mar 14 15:30:09 CET 2007' 218 accessDate: 'Wed Mar 14 15:30:09 CET 2007'
222 }, 219 },
223 '88943d709c3ea2442d4f58eaaec6409276037e5a37e0a6d167b9dad9e947e854': { 220 '88943d709c3ea2442d4f58eaaec6409276037e5a37e0a6d167b9dad9e947e854': {
224 header: '####', 221 header: '####',
225 data: 'xI3WXddQLFtLVzxJaZWQaw8wAgSuXLjLnyoNXnFuLecTH0BzU36PatglVh2HK3LM8aDLzzbHILdlLNnJ9CY+YnhmGh8hswF9oKTgq0Wsesgdc20QhSMNFFjmMljY1LSXmcAYK04Q5mIzi6Pe/04DRdj+e4zbe5QI4vEBhp/ohEpxZnNqc4BoX6J0eVf6LA1pwrKWvxzMxorWsJrrr+mn3svdlF437n+MMr89k5sQJogufes2GZ9tTvVZ4247ITxXqxgAhwXtbuIs/A5UqqnNdsxlHfpLKG5KjxB6F0h7TtFA3gkZCve5UmAibBnoBCFaIVWQyVq+VO9iqDm3DeXsK2pepvgIvpSID8Poy+uwN7T95mivAsHG5p7MtgN9KwQzNW3Iu+BfO9FlPBMngSk8L29So2CIXe6lEsXSGEi5Yrgyo6hZi6IkGCXwIQ7TCEMnlQEGyKnnAVik', 222 data: 'xI3WXddQLFtLVzxJaZWQaw8wAgSuXLjLnyoNXnFuLecTH0BzU36PatglVh2HK3LM8aDLzzbHILdlLNnJ9CY+YnhmGh8hswF9oKTgq0Wsesgdc20QhSMNFFjmMljY1LSXmcAYK04Q5mIzi6Pe/04DRdj+e4zbe5QI4vEBhp/ohEpxZnNqc4BoX6J0eVf6LA1pwrKWvxzMxorWsJrrr+mn3svdlF437n+MMr89k5sQJogufes2GZ9tTvVZ4247ITxXqxgAhwXtbuIs/A5UqqnNdsxlHfpLKG5KjxB6F0h7TtFA3gkZCve5UmAibBnoBCFaIVWQyVq+VO9iqDm3DeXsK2pepvgIvpSID8Poy+uwN7T95mivAsHG5p7MtgN9KwQzNW3Iu+BfO9FlPBMngSk8L29So2CIXe6lEsXSGEi5Yrgyo6hZi6IkGCXwIQ7TCEMnlQEGyKnnAVik',
226 version: '0.2', 223 version: '0.2',
227 creationDate: 'Tue Apr 17 19:17:52 CEST 2007', 224 creationDate: 'Tue Apr 17 19:17:52 CEST 2007',
228 updateDate: 'Tue Apr 17 19:17:52 CEST 2007', 225 updateDate: 'Tue Apr 17 19:17:52 CEST 2007',
229 accessDate: 'Mon Jan 19 16:09:25 CET 2009' 226 accessDate: 'Mon Jan 19 16:09:25 CET 2009'
230 }, 227 },
231 '9588b523f39cdfc14efa1e15ea7716c2d8eac45d8efd7bfeb19d716f9df72d66': { 228 '9588b523f39cdfc14efa1e15ea7716c2d8eac45d8efd7bfeb19d716f9df72d66': {
232 header: '####', 229 header: '####',
233 data: 'q6DKkxhgDFs1XkqOYf6dvojPF+yhJbniTLFpSOS+I1sum3EZIJfYxJXyi2Jx3KOVNBMILw1+vrSLe/fh5SSWj8ZBoeppkPPLjyRNdiUyd4IfcRM5OSv2YcTxCubKCH2kIMFAzY/29A6ZGPG+AN8/kxkEHc1fxKaNcj2Cs8qejNR8yK1iKT1Ut9VfEee+Eqy2Ohgdq8wL/xAD5mUzdqHeQl8BY16pXGIYncLxMzR+EJ8E5jJTuGv3O41UbO31lvBSfCt2pfz2MrtsuqNoI8LBHJkcR6t17Bj+rHZUniHlyxSW/1rQJ1NnwpPgUJ1fhfQJZM8Faoif+0bvWFY4xWs/tCCD7oEvf0xM0I3FfcJLbYX8M+wyO08t9BmGdEjnr3VUcuS9qKaJRpdpMP7aQf+vJvioeQDXdOJ6Ceo3BDFc6JdNta1Qc+agGzN2KPbIPrLDL+08hWl61yu3GQ==', 230 data: 'q6DKkxhgDFs1XkqOYf6dvojPF+yhJbniTLFpSOS+I1sum3EZIJfYxJXyi2Jx3KOVNBMILw1+vrSLe/fh5SSWj8ZBoeppkPPLjyRNdiUyd4IfcRM5OSv2YcTxCubKCH2kIMFAzY/29A6ZGPG+AN8/kxkEHc1fxKaNcj2Cs8qejNR8yK1iKT1Ut9VfEee+Eqy2Ohgdq8wL/xAD5mUzdqHeQl8BY16pXGIYncLxMzR+EJ8E5jJTuGv3O41UbO31lvBSfCt2pfz2MrtsuqNoI8LBHJkcR6t17Bj+rHZUniHlyxSW/1rQJ1NnwpPgUJ1fhfQJZM8Faoif+0bvWFY4xWs/tCCD7oEvf0xM0I3FfcJLbYX8M+wyO08t9BmGdEjnr3VUcuS9qKaJRpdpMP7aQf+vJvioeQDXdOJ6Ceo3BDFc6JdNta1Qc+agGzN2KPbIPrLDL+08hWl61yu3GQ==',
234 version: '0.2', 231 version: '0.2',
235 creationDate: 'Wed Mar 14 15:27:35 CET 2007', 232 creationDate: 'Wed Mar 14 15:27:35 CET 2007',
236 updateDate: 'Wed Mar 14 15:27:35 CET 2007', 233 updateDate: 'Wed Mar 14 15:27:35 CET 2007',
237 accessDate: 'Wed Mar 14 15:27:35 CET 2007' 234 accessDate: 'Wed Mar 14 15:27:35 CET 2007'
238 }, 235 },
239 'e5b71df0d4d79a195c7ec3288dd7738069837a7c4da3bccc1ebc05d8e4f19d79': { 236 'e5b71df0d4d79a195c7ec3288dd7738069837a7c4da3bccc1ebc05d8e4f19d79': {
240 header: '####', 237 header: '####',
241 data: '1NvK9Y5r0Q880BfB1W5IqdOR77mmqQU0d1GL1XUeQT75R2EgYE9rK1X1jLygCXboPhxzegEe7TDhUsn5XcHN0LkXcLYz8gD/7+He2HiTFxoHd2oQbI3ceBxDJ7+5kWA6Aiqy42QSCuA+TWIQcDVthSyFU7nNdqNxeBYeXiI4jgwcH3xvm0+pBf1OYLtywjUK1JwntP6o68b1LMQJFinDG+sqRcm25ggaZyxDtoLh1IBdSpmXk0papRnyyTGNgsws78dLxnH0Iqxb7FhqYfgLDIvN3i7+IALI0lF0EuTS0hSPlr/1fTz1/6bVt++wI9GpUsrdafUJJMPerXoCK+gAP8EMneLq4f5487HIkwWh1qON6Hvpg+tB95NOSJpqE72VpVxN4+wTQWyDMhfjqXBuQ1wKvTsD/mUsdinU0Wb/YT/zIWBNZPdqur0rjOC+mrOtSdlYSCH89Jj2', 238 data: '1NvK9Y5r0Q880BfB1W5IqdOR77mmqQU0d1GL1XUeQT75R2EgYE9rK1X1jLygCXboPhxzegEe7TDhUsn5XcHN0LkXcLYz8gD/7+He2HiTFxoHd2oQbI3ceBxDJ7+5kWA6Aiqy42QSCuA+TWIQcDVthSyFU7nNdqNxeBYeXiI4jgwcH3xvm0+pBf1OYLtywjUK1JwntP6o68b1LMQJFinDG+sqRcm25ggaZyxDtoLh1IBdSpmXk0papRnyyTGNgsws78dLxnH0Iqxb7FhqYfgLDIvN3i7+IALI0lF0EuTS0hSPlr/1fTz1/6bVt++wI9GpUsrdafUJJMPerXoCK+gAP8EMneLq4f5487HIkwWh1qON6Hvpg+tB95NOSJpqE72VpVxN4+wTQWyDMhfjqXBuQ1wKvTsD/mUsdinU0Wb/YT/zIWBNZPdqur0rjOC+mrOtSdlYSCH89Jj2',
242 version: '0.2', 239 version: '0.2',
243 creationDate: 'Tue Apr 17 19:15:09 CEST 2007', 240 creationDate: 'Tue Apr 17 19:15:09 CEST 2007',
244 updateDate: 'Tue Apr 17 19:15:09 CEST 2007', 241 updateDate: 'Tue Apr 17 19:15:09 CEST 2007',
245 accessDate: 'Tue Apr 17 19:17:01 CEST 2007' 242 accessDate: 'Tue Apr 17 19:17:01 CEST 2007'
246 } 243 }
247 } 244 }
248 }, 245 },
249 '36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113': { 246 '36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113': {
250 data: '6fhueIibbxKRA7Mtb9TPcWiUKajnikM3D7PbOROBkE39Vw9E/nG8KrtJlwwPQeOGCFhssO/KX3ymYehCR8rfaEL1f9pfdh5x69mSxKRlOmtEknWqUgPzcb1yPenRbQagERadh0LF4zu91M4WjXK9qynEHoxI/pBhwQb1IsnhwtXl4ELtajudv+2Hv3p75v4XOXFsGQMsHPY+Zw7dkFFA8EXhvuxjiGvnxCUkFwNICFRdHTEovkW3VSerLdrYo5lDgjY6ebr/g7wDGuu4RLfUK4+HpzFwZ0+aOrjpFq2ePg2xObvkkMNNjZ2PcR6Cue0sf+aNqzIHIlFPpY2Hmrob8+bwxocKA6aagBu7z5GiUmZNXGE/Vtr/WWBV2+xIJyzXZPet0MLmSnGiALjPJveeKnnFdDtA929ydcAb8efc0/snfU/uDoXDiO5SWEQ8DDNjj1bSo7VPTtvZyFormE1KjqimqSwaUJzbIS4CxPnoDezaBtQmlG4z8mc8jXq1HfPu7s9PUzcbG30gbF0ch2pDj4h47AhE0ZoeiV+VYZTaYateSifQXKBQKjPcuh9PQyDI0HVua3itbbwxXpRubEM4fbvlcd+7gu+Zq03slYICD07fP0I6XGrRHVTfYpDbEb4GJBvRIeZLwRTQzOeFbPLpBU9Lv3zXxfHfcHy9oK+giIxefPdY1ZR2ZFPKOO0xYJsTr0vmTuXeXzy56bKl+yP2lFst5l9QG8j2JcQEotDV1KQS6mbcLjfIpEnltu5fc2t10Q25Noh+F3kF+LcMIYsDjwanojYlOC93mZl01hmSJdimRTk9otjlRTyC7NWwiyy7fe5IyVi7ACNPZyeUYJUPtKWcPbT73Vtf8W3/+HdhmyYNyMQ9PDCBb9WKMon+qW2+ZVH5yv/KqMHRY1fflAfxpHNhrCkwqcAAGw+G/cetbvQjpkfVT2/u/uLupMsITN2Tgvr/8D2IMm3cyDBUCshrp0AfzARRygHFK4x/0uLfCtQSNjw6zMK8mn80R5aS5bZi5gRS8JBMZ4Q0iG4kBlLpIYtsXSBwl8faljjdl/4XvNNWWrdGJn2k0eM4cESlOFFk4s3Yu0Zspo17nKAHINjHAiP3VlhuKSnk5C9hMU5i3vZO8anQmx9UEwUgQVm22azCjyNtUl6jVPYSNsal7A==', 247 data: '6fhueIibbxKRA7Mtb9TPcWiUKajnikM3D7PbOROBkE39Vw9E/nG8KrtJlwwPQeOGCFhssO/KX3ymYehCR8rfaEL1f9pfdh5x69mSxKRlOmtEknWqUgPzcb1yPenRbQagERadh0LF4zu91M4WjXK9qynEHoxI/pBhwQb1IsnhwtXl4ELtajudv+2Hv3p75v4XOXFsGQMsHPY+Zw7dkFFA8EXhvuxjiGvnxCUkFwNICFRdHTEovkW3VSerLdrYo5lDgjY6ebr/g7wDGuu4RLfUK4+HpzFwZ0+aOrjpFq2ePg2xObvkkMNNjZ2PcR6Cue0sf+aNqzIHIlFPpY2Hmrob8+bwxocKA6aagBu7z5GiUmZNXGE/Vtr/WWBV2+xIJyzXZPet0MLmSnGiALjPJveeKnnFdDtA929ydcAb8efc0/snfU/uDoXDiO5SWEQ8DDNjj1bSo7VPTtvZyFormE1KjqimqSwaUJzbIS4CxPnoDezaBtQmlG4z8mc8jXq1HfPu7s9PUzcbG30gbF0ch2pDj4h47AhE0ZoeiV+VYZTaYateSifQXKBQKjPcuh9PQyDI0HVua3itbbwxXpRubEM4fbvlcd+7gu+Zq03slYICD07fP0I6XGrRHVTfYpDbEb4GJBvRIeZLwRTQzOeFbPLpBU9Lv3zXxfHfcHy9oK+giIxefPdY1ZR2ZFPKOO0xYJsTr0vmTuXeXzy56bKl+yP2lFst5l9QG8j2JcQEotDV1KQS6mbcLjfIpEnltu5fc2t10Q25Noh+F3kF+LcMIYsDjwanojYlOC93mZl01hmSJdimRTk9otjlRTyC7NWwiyy7fe5IyVi7ACNPZyeUYJUPtKWcPbT73Vtf8W3/+HdhmyYNyMQ9PDCBb9WKMon+qW2+ZVH5yv/KqMHRY1fflAfxpHNhrCkwqcAAGw+G/cetbvQjpkfVT2/u/uLupMsITN2Tgvr/8D2IMm3cyDBUCshrp0AfzARRygHFK4x/0uLfCtQSNjw6zMK8mn80R5aS5bZi5gRS8JBMZ4Q0iG4kBlLpIYtsXSBwl8faljjdl/4XvNNWWrdGJn2k0eM4cESlOFFk4s3Yu0Zspo17nKAHINjHAiP3VlhuKSnk5C9hMU5i3vZO8anQmx9UEwUgQVm22azCjyNtUl6jVPYSNsal7A==',
251 version: '0.3', 248 version: '0.3',
252 creationDate: 'Wed Mar 14 18:39:35 CET 2007', 249 creationDate: 'Wed Mar 14 18:39:35 CET 2007',
253 updateDate: 'Mon Oct 27 09:16:14 CET 2008', 250 updateDate: 'Mon Oct 27 09:16:14 CET 2008',
254 accessDate: 'Mon Jan 19 16:09:35 CET 2009', 251 accessDate: 'Mon Jan 19 16:09:35 CET 2009',
255 currentVersion: 'a96a6d8b9ac73fcdf874d8a8534ffb2d43da8f5222e96a4a29bd2ae437619463', 252 currentVersion: 'a96a6d8b9ac73fcdf874d8a8534ffb2d43da8f5222e96a4a29bd2ae437619463',
256 versions: { 253 versions: {
257 '381201fd3b67549bd6630841e8902be1499f3ff0c3514dd464ad9679f22f3561': { 254 '381201fd3b67549bd6630841e8902be1499f3ff0c3514dd464ad9679f22f3561': {
258 header: '####', 255 header: '####',
259 data: 'DgjIW4YcJAYnckuEUzBFkfEC841LuanGopPgp+YkyMn3xuzdpGq/ObLFMVQaeAuyErh1B0REHPbq0E/SRUZbeXLXWN720GU4GXvY5bnen2h7pHvl/H4yz+kvyKh3EHJmmBjuz8s0kclFJQB48lter+G93TEmUaFke9c9m0IkKlgzwZ/PQKZyIyfZA09KFaozdSxdFRbswZj2Vq8Df2PQsKLapZWX1wYQ3lXOcyvNdTULy9MCXwPwX6te6hTLWxQOiSPsvB8LItlhQUsSbrJcJEvWPlBupPu5SeI25zDnqKDETPep63Ks2GWf45nXZzYYmQMzL0l2cenYFxlE18TcOd1Ms24TQ/iDKMhi60zZoo13qjVT5AKZ80KNu46t08qbACxjv/LeK2aM5TNycTFixGskPywpnb6MCo8ibRe5rs1WcTJRMD04sNoiuriivO2fiyo4rxjfdyfueMlOz+Zeztk=', 256 data: 'DgjIW4YcJAYnckuEUzBFkfEC841LuanGopPgp+YkyMn3xuzdpGq/ObLFMVQaeAuyErh1B0REHPbq0E/SRUZbeXLXWN720GU4GXvY5bnen2h7pHvl/H4yz+kvyKh3EHJmmBjuz8s0kclFJQB48lter+G93TEmUaFke9c9m0IkKlgzwZ/PQKZyIyfZA09KFaozdSxdFRbswZj2Vq8Df2PQsKLapZWX1wYQ3lXOcyvNdTULy9MCXwPwX6te6hTLWxQOiSPsvB8LItlhQUsSbrJcJEvWPlBupPu5SeI25zDnqKDETPep63Ks2GWf45nXZzYYmQMzL0l2cenYFxlE18TcOd1Ms24TQ/iDKMhi60zZoo13qjVT5AKZ80KNu46t08qbACxjv/LeK2aM5TNycTFixGskPywpnb6MCo8ibRe5rs1WcTJRMD04sNoiuriivO2fiyo4rxjfdyfueMlOz+Zeztk=',
260 version: '0.2', 257 version: '0.2',
261 creationDate: 'Wed Mar 14 18:39:55 CET 2007', 258 creationDate: 'Wed Mar 14 18:39:55 CET 2007',
262 updateDate: 'Wed Mar 14 18:39:55 CET 2007', 259 updateDate: 'Wed Mar 14 18:39:55 CET 2007',
263 accessDate: 'Mon Oct 27 09:07:56 CET 2008' 260 accessDate: 'Mon Oct 27 09:07:56 CET 2008'
264 }, 261 },
265 '99dc86ebeb20a3db0c5393d6d94bc1150187b04316a876970dbbcf517b55d6f2': { 262 '99dc86ebeb20a3db0c5393d6d94bc1150187b04316a876970dbbcf517b55d6f2': {
266 header: '####', 263 header: '####',
267 data: 'AJwqCWNKC9z8DC4TUI0hWnqHvQ40Y/x+jXylnVAkyO2QYQcqg51odLFSfgP0GiGEGPYwDc+kUxRrfO+ITgTNm+hHi2iIWkP/ljAC+AQ56MAEKsU/USTbvl6ShZ0XTAdRpwI/oqqOhYThVs6jTm/J8+lx4tWoMtNj835py88c/9eW26pLQubr7VysLSWuIMi+iDp7zXZZz/0gxGKDe5xNq4MGIYw8/OK1iJCOsjBdrRygLlS/Mz9sRlKkwdrDsohtRG0F/NdsIoaU4FttGs/rY91SCedvHy6ovh0zXhxOO44O6MiMbP085D1jCjWJn9S1RBxjxc368MGfMJeZja87nuvgSnLS2tGDL6zFtVJMNcH/7GqQPXZv/sNEykDNWpypchCnwYUJxvBVb45FcUzagPm+SSiekWK1hrEntZkZuEhQZp7Ud9RcENpa5h7wXUJSV1vPl8xBylx9HWmxez7D9OYRqbOlCRAEDqup4ahNhYB9', 264 data: 'AJwqCWNKC9z8DC4TUI0hWnqHvQ40Y/x+jXylnVAkyO2QYQcqg51odLFSfgP0GiGEGPYwDc+kUxRrfO+ITgTNm+hHi2iIWkP/ljAC+AQ56MAEKsU/USTbvl6ShZ0XTAdRpwI/oqqOhYThVs6jTm/J8+lx4tWoMtNj835py88c/9eW26pLQubr7VysLSWuIMi+iDp7zXZZz/0gxGKDe5xNq4MGIYw8/OK1iJCOsjBdrRygLlS/Mz9sRlKkwdrDsohtRG0F/NdsIoaU4FttGs/rY91SCedvHy6ovh0zXhxOO44O6MiMbP085D1jCjWJn9S1RBxjxc368MGfMJeZja87nuvgSnLS2tGDL6zFtVJMNcH/7GqQPXZv/sNEykDNWpypchCnwYUJxvBVb45FcUzagPm+SSiekWK1hrEntZkZuEhQZp7Ud9RcENpa5h7wXUJSV1vPl8xBylx9HWmxez7D9OYRqbOlCRAEDqup4ahNhYB9',
268 version: '0.3', 265 version: '0.3',
269 creationDate: 'Mon Oct 27 09:09:11 CET 2008', 266 creationDate: 'Mon Oct 27 09:09:11 CET 2008',
270 updateDate: 'Mon Oct 27 09:09:11 CET 2008', 267 updateDate: 'Mon Oct 27 09:09:11 CET 2008',
271 accessDate: 'Mon Oct 27 09:15:58 CET 2008' 268 accessDate: 'Mon Oct 27 09:15:58 CET 2008'
272 }, 269 },
273 '9fbfcd3e7fe30d549a813f0e6c1be58ed45c3ae7305d7367bffefa097b424ee6': { 270 '9fbfcd3e7fe30d549a813f0e6c1be58ed45c3ae7305d7367bffefa097b424ee6': {
274 header: '####', 271 header: '####',
275 data: 'nZ+Lc5LWWLxnPvUrRrHhxG35PHq7GMbVENHfV1oS0Qw7/63NecssNoEbiOwFVMjAshvfUK7IjnzyvfQhNtFRbj2yzHOTWCd0eJ0O0MmvGzjpUntSDu9/G8RFeEu9jDKugwi/NhOa5legjT9pcsEAqR4s4NN/Ac6juQb6D/Z6Wd6wO0JQhT5/QPk1KllDpDeo2i/GPUKvEi/dXpik0KQcVLVylU82rf6hwEgvRQi+j0O5hnFW1E4ttxClrnPBEBv60jkNwcIpD0r+rvomDe8+398xUuB4DVDJoM+WUYfu6Sm3qI0yBfET+tJvjn8WsHhKTgZpOc2BXC7EdF99nNEg6kV5pSxV6AUA1XUz5kW+YfcSzAXzUH74OqroC0SucHe4+BtRKnbJy4h5vRfjTD+FJaj1Va02cxSR55tQhxm/k67z0QeyB98dnU1l/pPHwBlIWa1eR74gswNSeQ2jrzu5JeQ=', 272 data: 'nZ+Lc5LWWLxnPvUrRrHhxG35PHq7GMbVENHfV1oS0Qw7/63NecssNoEbiOwFVMjAshvfUK7IjnzyvfQhNtFRbj2yzHOTWCd0eJ0O0MmvGzjpUntSDu9/G8RFeEu9jDKugwi/NhOa5legjT9pcsEAqR4s4NN/Ac6juQb6D/Z6Wd6wO0JQhT5/QPk1KllDpDeo2i/GPUKvEi/dXpik0KQcVLVylU82rf6hwEgvRQi+j0O5hnFW1E4ttxClrnPBEBv60jkNwcIpD0r+rvomDe8+398xUuB4DVDJoM+WUYfu6Sm3qI0yBfET+tJvjn8WsHhKTgZpOc2BXC7EdF99nNEg6kV5pSxV6AUA1XUz5kW+YfcSzAXzUH74OqroC0SucHe4+BtRKnbJy4h5vRfjTD+FJaj1Va02cxSR55tQhxm/k67z0QeyB98dnU1l/pPHwBlIWa1eR74gswNSeQ2jrzu5JeQ=',
276 version: '0.2', 273 version: '0.2',
277 creationDate: 'Wed Mar 14 18:39:35 CET 2007', 274 creationDate: 'Wed Mar 14 18:39:35 CET 2007',
278 updateDate: 'Wed Mar 14 18:39:35 CET 2007', 275 updateDate: 'Wed Mar 14 18:39:35 CET 2007',
279 accessDate: 'Wed Mar 14 18:39:35 CET 2007' 276 accessDate: 'Wed Mar 14 18:39:35 CET 2007'
280 }, 277 },
281 'a96a6d8b9ac73fcdf874d8a8534ffb2d43da8f5222e96a4a29bd2ae437619463': { 278 'a96a6d8b9ac73fcdf874d8a8534ffb2d43da8f5222e96a4a29bd2ae437619463': {
282 header: '####', 279 header: '####',
283 data: 'm3yhZu81UAjCY6U2Knrgg8mK+LX35Y/iZgIEm8MuRDAlg6UUz9Z1Anu63COFV08YyYQRuBzTgR9YQ8wrUD1S9FG2ZmtCDemqvd+5OUMgdn4sK7G3CuzAc5osOa5neU2m4y19WuobkGnhO78ko7pVVjO42q0DeMT92uFL6KE/2UCkWlq5SdFyS5qXEJEWs2IO5C8nVpdlO/eZ36Pl2+v+afl3QQMTthCVIUR4/zVP2ajbO48yjDXhYxzskFjtXMYLApEn0wO0dcifcsYhPkozz6Locrt/R6IZXnfZfuW5XXHbqhutoJFPK6L6t0Ib3B2r1TNkPaMsVs2g5V1g3ENRd0IlbG/uBk2o5tgeu6gOYlA1scEiL+/ad9ZxiqYB2ENCGZ8DXA4VNMnzxVPbO96OIUCb9suV0fldGOg=', 280 data: 'm3yhZu81UAjCY6U2Knrgg8mK+LX35Y/iZgIEm8MuRDAlg6UUz9Z1Anu63COFV08YyYQRuBzTgR9YQ8wrUD1S9FG2ZmtCDemqvd+5OUMgdn4sK7G3CuzAc5osOa5neU2m4y19WuobkGnhO78ko7pVVjO42q0DeMT92uFL6KE/2UCkWlq5SdFyS5qXEJEWs2IO5C8nVpdlO/eZ36Pl2+v+afl3QQMTthCVIUR4/zVP2ajbO48yjDXhYxzskFjtXMYLApEn0wO0dcifcsYhPkozz6Locrt/R6IZXnfZfuW5XXHbqhutoJFPK6L6t0Ib3B2r1TNkPaMsVs2g5V1g3ENRd0IlbG/uBk2o5tgeu6gOYlA1scEiL+/ad9ZxiqYB2ENCGZ8DXA4VNMnzxVPbO96OIUCb9suV0fldGOg=',
284 version: '0.3', 281 version: '0.3',
285 creationDate: 'Mon Oct 27 09:16:14 CET 2008', 282 creationDate: 'Mon Oct 27 09:16:14 CET 2008',
286 updateDate: 'Mon Oct 27 09:16:14 CET 2008', 283 updateDate: 'Mon Oct 27 09:16:14 CET 2008',
287 accessDate: 'Mon Jan 19 16:09:35 CET 2009' 284 accessDate: 'Mon Jan 19 16:09:35 CET 2009'
288 } 285 }
289 } 286 }
290 }, 287 },
291 '507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a': { 288 '507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a': {
292 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', 289 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',
293 version: '0.2', 290 version: '0.2',
294 creationDate: 'Wed Mar 14 16:01:24 CET 2007', 291 creationDate: 'Wed Mar 14 16:01:24 CET 2007',
295 updateDate: 'Wed Mar 14 16:01:24 CET 2007', 292 updateDate: 'Wed Mar 14 16:01:24 CET 2007',
296 accessDate: 'Mon Jan 19 16:10:11 CET 2009', 293 accessDate: 'Mon Jan 19 16:10:11 CET 2009',
297 currentVersion: '395eb58606138588dcd7e659065db48775610cc1e90cbd03368c063e02e55c8b', 294 currentVersion: '395eb58606138588dcd7e659065db48775610cc1e90cbd03368c063e02e55c8b',
298 versions: { 295 versions: {
299 '395eb58606138588dcd7e659065db48775610cc1e90cbd03368c063e02e55c8b': { 296 '395eb58606138588dcd7e659065db48775610cc1e90cbd03368c063e02e55c8b': {
300 header: '####', 297 header: '####',
301 data: 'sgq3FGcsnlbhTLetMa3TQQE6uFZv/JL6Awha1066IimKoAtQGbAr6E1+mxRmvJle91sL7oRfi6suvDanYHfAI+rrG6qCOtESn70ssS+aGFyO3XwFgypzG/Qa34bjxJ16Aqd93H8IdhzdtOxs2Qmou3CjyxbT7Cq+YW/fAo1WfctL4yE4GBNPWC5lfebxSmINlBY+zTjhv9Pf2aK6vL4p3obHl+zhz0YdKAMBwbDyCLa9tYvhGBnq/W6lFUsyZCPVJJP3bQCQww0TNCcLJLm+SYVSiC0NwCQJq+yNqDkWTvv41p5EDB06eOQ2VqC7l4i/JLE/ql9h9Z++gck74/Qs3ppdVdG7sTzWyPya4v3RW2OTc1awFRZipAX5Zd7I97dyw6Yym4y+/9UT8z8iMDYykQ4+QnOhksDIE9a8q6agDF/rbZ/BCRcMWbFylGTdudk26mu0GdPiuLDu', 298 data: 'sgq3FGcsnlbhTLetMa3TQQE6uFZv/JL6Awha1066IimKoAtQGbAr6E1+mxRmvJle91sL7oRfi6suvDanYHfAI+rrG6qCOtESn70ssS+aGFyO3XwFgypzG/Qa34bjxJ16Aqd93H8IdhzdtOxs2Qmou3CjyxbT7Cq+YW/fAo1WfctL4yE4GBNPWC5lfebxSmINlBY+zTjhv9Pf2aK6vL4p3obHl+zhz0YdKAMBwbDyCLa9tYvhGBnq/W6lFUsyZCPVJJP3bQCQww0TNCcLJLm+SYVSiC0NwCQJq+yNqDkWTvv41p5EDB06eOQ2VqC7l4i/JLE/ql9h9Z++gck74/Qs3ppdVdG7sTzWyPya4v3RW2OTc1awFRZipAX5Zd7I97dyw6Yym4y+/9UT8z8iMDYykQ4+QnOhksDIE9a8q6agDF/rbZ/BCRcMWbFylGTdudk26mu0GdPiuLDu',
302 version: '0.2', 299 version: '0.2',
303 creationDate: 'Wed Mar 14 16:01:24 CET 2007', 300 creationDate: 'Wed Mar 14 16:01:24 CET 2007',
304 updateDate: 'Wed Mar 14 16:01:24 CET 2007', 301 updateDate: 'Wed Mar 14 16:01:24 CET 2007',
305 accessDate: 'Mon Jan 19 16:10:11 CET 2009' 302 accessDate: 'Mon Jan 19 16:10:11 CET 2009'
306 } 303 }
307 } 304 }
308 }, 305 },
309 '5cdac63b317f3942da38f3a3de3b7f0e5d6678200951c6216230295550f63fb4': { 306 '5cdac63b317f3942da38f3a3de3b7f0e5d6678200951c6216230295550f63fb4': {
310 data: 'Xs+z3VzIqsWa7dGBqepwq75lTsx3yemNhTdRYYDDc3Kzpycyp961SgnKXHjE51266mfmj85ASFi/FKCOwk17lbD5UT3iawtc3TdgrQ18vBhBsmOA2F4JAa4yC58bTaXbyld3c4izDp7i9+iyRaFN52NWJznN82SXuRtPdWRtAxXB1V5Tyg==', 307 data: 'Xs+z3VzIqsWa7dGBqepwq75lTsx3yemNhTdRYYDDc3Kzpycyp961SgnKXHjE51266mfmj85ASFi/FKCOwk17lbD5UT3iawtc3TdgrQ18vBhBsmOA2F4JAa4yC58bTaXbyld3c4izDp7i9+iyRaFN52NWJznN82SXuRtPdWRtAxXB1V5Tyg==',
311 version: '0.3', 308 version: '0.3',
312 creationDate: 'Mon Jan 05 17:45:25 CET 2009', 309 creationDate: 'Mon Jan 05 17:45:25 CET 2009',
313 updateDate: 'Mon Jan 05 17:45:25 CET 2009', 310 updateDate: 'Mon Jan 05 17:45:25 CET 2009',
314 accessDate: 'Mon Jan 19 16:10:21 CET 2009', 311 accessDate: 'Mon Jan 19 16:10:21 CET 2009',
315 currentVersion: '00b3a4cd7400cfc1e7f7b369bdc3dcdaa50d6020233e131b30d755c89249ea9d', 312 currentVersion: '00b3a4cd7400cfc1e7f7b369bdc3dcdaa50d6020233e131b30d755c89249ea9d',
316 versions: { 313 versions: {
317 '00b3a4cd7400cfc1e7f7b369bdc3dcdaa50d6020233e131b30d755c89249ea9d': { 314 '00b3a4cd7400cfc1e7f7b369bdc3dcdaa50d6020233e131b30d755c89249ea9d': {
318 header: '####', 315 header: '####',
319 data: 'uGAV9pZTjrTwBy24TX/OUQwGmgzTnXv1JBIxdGkeoLCUhP9tAjbpUVylrUI5+VRrFYkXYyZ0o2HEgKrun2f3PODTxlmAbfkUldOV5tyV/EUxN0vYSBtgsMpqQm3bOKRIAo/uzrhSE3iwMjvKOTH2jUrkmX6hmqhXWZfa4X231GovrnOjek8c7t+LUBmmIjXEr2GSc/UbBoFnni+Q7ZArwtU68xoeCjLame1e8Y9wvCO8gIfAzXQAHsDgzn1MVeiWIqiCBTs8YKCO1yaxZpkzXV0yWzX+bHyXlKWwAk7Fu9w0CuaRULZmRCQhv+MMDw8DEXciTm0R5dRiVmSCFBy8cL9qlSeSX0GlnKl8E4/TSqvhMJblwJJsgmGSZ9cEt2u0E08tHxKuoeaaT1rpAOoiqx+z7BdhqjWOQZOGM4gR3EwqvOQoNYFUaXjAdmiUzW+e+TgE1IBQ8udRFl/D2zCcqFO90Hgc7hHsTDI3aGYvi6bHADu8hFpmZtJAjOMv1JgCX4Hm4n+SsbHd0DIfkEUMeGlVO47lcGWBZNRRm7xl8luZ4sZn', 316 data: 'uGAV9pZTjrTwBy24TX/OUQwGmgzTnXv1JBIxdGkeoLCUhP9tAjbpUVylrUI5+VRrFYkXYyZ0o2HEgKrun2f3PODTxlmAbfkUldOV5tyV/EUxN0vYSBtgsMpqQm3bOKRIAo/uzrhSE3iwMjvKOTH2jUrkmX6hmqhXWZfa4X231GovrnOjek8c7t+LUBmmIjXEr2GSc/UbBoFnni+Q7ZArwtU68xoeCjLame1e8Y9wvCO8gIfAzXQAHsDgzn1MVeiWIqiCBTs8YKCO1yaxZpkzXV0yWzX+bHyXlKWwAk7Fu9w0CuaRULZmRCQhv+MMDw8DEXciTm0R5dRiVmSCFBy8cL9qlSeSX0GlnKl8E4/TSqvhMJblwJJsgmGSZ9cEt2u0E08tHxKuoeaaT1rpAOoiqx+z7BdhqjWOQZOGM4gR3EwqvOQoNYFUaXjAdmiUzW+e+TgE1IBQ8udRFl/D2zCcqFO90Hgc7hHsTDI3aGYvi6bHADu8hFpmZtJAjOMv1JgCX4Hm4n+SsbHd0DIfkEUMeGlVO47lcGWBZNRRm7xl8luZ4sZn',
320 version: '0.3', 317 version: '0.3',
321 creationDate: 'Mon Jan 05 17:45:25 CET 2009', 318 creationDate: 'Mon Jan 05 17:45:25 CET 2009',
322 updateDate: 'Mon Jan 05 17:45:25 CET 2009', 319 updateDate: 'Mon Jan 05 17:45:25 CET 2009',
323 accessDate: 'Mon Jan 19 16:10:21 CET 2009' 320 accessDate: 'Mon Jan 19 16:10:21 CET 2009'
324 } 321 }
325 } 322 }
326 }, 323 },
327 '6026370f3db3860d2c46a08e389a7e906dc14f98c8444b21be9a7e9f405a2728': { 324 '6026370f3db3860d2c46a08e389a7e906dc14f98c8444b21be9a7e9f405a2728': {
328 data: '3oUg1TD+Lu4ou06j/MddOTXDqRM+qSKD+6Iuzia1Hop1w7v/BXidqeoKJZQI2VY9oO9B70Nr3B3wDROF+ycy6Rq+FM/xqUGHKXn1lAaSc6Wgj6TLQ6eRF6YZKSPqTj7TDWyw/2pEWk4HjcT8drTrCaC02tzAXMhYWlYPQPW4fUdq4hawoHIdopUN3vafQuFjY47OhqXKav3bNao=', 325 data: '3oUg1TD+Lu4ou06j/MddOTXDqRM+qSKD+6Iuzia1Hop1w7v/BXidqeoKJZQI2VY9oO9B70Nr3B3wDROF+ycy6Rq+FM/xqUGHKXn1lAaSc6Wgj6TLQ6eRF6YZKSPqTj7TDWyw/2pEWk4HjcT8drTrCaC02tzAXMhYWlYPQPW4fUdq4hawoHIdopUN3vafQuFjY47OhqXKav3bNao=',
329 version: '0.2', 326 version: '0.2',
330 creationDate: 'Tue Apr 17 16:36:08 CEST 2007', 327 creationDate: 'Tue Apr 17 16:36:08 CEST 2007',
331 updateDate: 'Tue Apr 17 16:36:08 CEST 2007', 328 updateDate: 'Tue Apr 17 16:36:08 CEST 2007',
332 accessDate: 'Mon Jan 19 16:09:33 CET 2009', 329 accessDate: 'Mon Jan 19 16:09:33 CET 2009',
333 currentVersion: 'bf8d46022179715d9d27e0a256b56b50828a771c3c6b46fe36fb2982dcb3b4cc', 330 currentVersion: 'bf8d46022179715d9d27e0a256b56b50828a771c3c6b46fe36fb2982dcb3b4cc',
334 versions: { 331 versions: {
335 'bf8d46022179715d9d27e0a256b56b50828a771c3c6b46fe36fb2982dcb3b4cc': { 332 'bf8d46022179715d9d27e0a256b56b50828a771c3c6b46fe36fb2982dcb3b4cc': {
336 header: '####', 333 header: '####',
337 data: 'fehYRMkg/wFj2t/aWu7szbXwrCyCDpjQN4UNck4/OiDlth70a2ve6ow5lAi2jgdlV9WiFrPejfa8dD0Z1g19jx+BBsuUYnBEKD0K+NapdJBBeI0We2nj9nYIij2dfZVx7cuvhy8sN6+DdylUQLsFHbga+Gi5hWcMuULT4GOAIy2WanSQL1RSR4ruA6zm/t+VVboEkkm7PPT+w3LuRl3wRaD4a8ZwYiSV/SzgWooFrh2S3YOUeshdaGCiYpTbXscsOxsCxc11i6wQGBqYSjksmtZDvEegdQdzCmxvq4jaVWJElYYS3av612nD5K/w7Zei6RccBiODBPATjrIczYg7HwmQxIM/6QI9/LQn0LP0yqRVUUtfzaODf0uWNpFzml9l/1lwXuBJyQFBp7H7Th46ekw9yEuPD00oZ+eXvKwbwfUU0JshT4hnEBtIjM8fH974PU0y95f0yLAJ1+M6DVXCxGsBix2aKJx9fuZP4KGpaXg6qCb/6327rph7MGomcrGPIiDjYwD/NTMdGluc55OZfGXtOZUaJCUM6nihqDwU7Ly1ZzYorgcvkX/t/0RNcOkFzGYNByp7mdcotyiHqCDKspqz9mEXAd7Noz3HO5GFpPqbRo7htDigGU1f7dvgbbfRoTz17Bt9Mw==', 334 data: 'fehYRMkg/wFj2t/aWu7szbXwrCyCDpjQN4UNck4/OiDlth70a2ve6ow5lAi2jgdlV9WiFrPejfa8dD0Z1g19jx+BBsuUYnBEKD0K+NapdJBBeI0We2nj9nYIij2dfZVx7cuvhy8sN6+DdylUQLsFHbga+Gi5hWcMuULT4GOAIy2WanSQL1RSR4ruA6zm/t+VVboEkkm7PPT+w3LuRl3wRaD4a8ZwYiSV/SzgWooFrh2S3YOUeshdaGCiYpTbXscsOxsCxc11i6wQGBqYSjksmtZDvEegdQdzCmxvq4jaVWJElYYS3av612nD5K/w7Zei6RccBiODBPATjrIczYg7HwmQxIM/6QI9/LQn0LP0yqRVUUtfzaODf0uWNpFzml9l/1lwXuBJyQFBp7H7Th46ekw9yEuPD00oZ+eXvKwbwfUU0JshT4hnEBtIjM8fH974PU0y95f0yLAJ1+M6DVXCxGsBix2aKJx9fuZP4KGpaXg6qCb/6327rph7MGomcrGPIiDjYwD/NTMdGluc55OZfGXtOZUaJCUM6nihqDwU7Ly1ZzYorgcvkX/t/0RNcOkFzGYNByp7mdcotyiHqCDKspqz9mEXAd7Noz3HO5GFpPqbRo7htDigGU1f7dvgbbfRoTz17Bt9Mw==',
338 version: '0.2', 335 version: '0.2',
339 creationDate: 'Tue Apr 17 16:36:08 CEST 2007', 336 creationDate: 'Tue Apr 17 16:36:08 CEST 2007',
340 updateDate: 'Tue Apr 17 16:36:08 CEST 2007', 337 updateDate: 'Tue Apr 17 16:36:08 CEST 2007',
341 accessDate: 'Mon Jan 19 16:09:33 CET 2009' 338 accessDate: 'Mon Jan 19 16:09:33 CET 2009'
342 } 339 }
343 } 340 }
344 }, 341 },
345 '6c25be8e145efb26a1abd59590522f73fb2e3dbc139af2217074d9e2ba92c16a': { 342 '6c25be8e145efb26a1abd59590522f73fb2e3dbc139af2217074d9e2ba92c16a': {
346 data: 'b2mcYUi59l434kGl7ij6dBu3063UL1dToMIu3Zsa9RV9RzeLKnezJhLKunqoAm7KwiJeqDo/REexHI1cshGYtHasVXXuyJfMx1grH7yhoWnkSRF4Sax6w5E5wnGkEpGJHOxXJ9rOjWHZ7yqCUUCB/dqLw4FwPOtRb/ynkBEYztEJA6EKGJuz0vrrTOsT8HMXtj/w6MEZ7qI3fPs=', 343 data: 'b2mcYUi59l434kGl7ij6dBu3063UL1dToMIu3Zsa9RV9RzeLKnezJhLKunqoAm7KwiJeqDo/REexHI1cshGYtHasVXXuyJfMx1grH7yhoWnkSRF4Sax6w5E5wnGkEpGJHOxXJ9rOjWHZ7yqCUUCB/dqLw4FwPOtRb/ynkBEYztEJA6EKGJuz0vrrTOsT8HMXtj/w6MEZ7qI3fPs=',
347 version: '0.2', 344 version: '0.2',
348 creationDate: 'Mon Apr 02 19:12:44 CEST 2007', 345 creationDate: 'Mon Apr 02 19:12:44 CEST 2007',
349 updateDate: 'Mon Apr 02 19:12:44 CEST 2007', 346 updateDate: 'Mon Apr 02 19:12:44 CEST 2007',
350 accessDate: 'Mon Jan 19 16:10:08 CET 2009', 347 accessDate: 'Mon Jan 19 16:10:08 CET 2009',
351 currentVersion: '2f60193c0fc0e3f2f178955e1c68759675acdf691bcb918cfad329a5a97cfaf3', 348 currentVersion: '2f60193c0fc0e3f2f178955e1c68759675acdf691bcb918cfad329a5a97cfaf3',
352 versions: { 349 versions: {
353 '2f60193c0fc0e3f2f178955e1c68759675acdf691bcb918cfad329a5a97cfaf3': { 350 '2f60193c0fc0e3f2f178955e1c68759675acdf691bcb918cfad329a5a97cfaf3': {
354 header: '####', 351 header: '####',
355 data: 'pZEWSdYIkrX8/r6OYmO0GEuKG9baUgn40Bmw7hXZBd/kfWuRjWsL4/pc5F5Ojrx+N0dxmQn5ZqKAzOOri29Rm4ruxnCbyK+oDsCDyMSnWy/VJcvystnDKzKmBRQVAOSEJtzEb3OtGzvqm0PQ1Dhx1YUAx7L6KlXysmG9h9+MjOcErRL9/1x1LZ33ytR+zK4LvTAb7gN5/9QgwysFyCkNP8bG4nyCzPMiUrBnP0odMTUvDkJDlY0Oia6VjGW6oNxnGIgA5fDraRrW4JH2oejQcrL7+X+jpCp05g==', 352 data: 'pZEWSdYIkrX8/r6OYmO0GEuKG9baUgn40Bmw7hXZBd/kfWuRjWsL4/pc5F5Ojrx+N0dxmQn5ZqKAzOOri29Rm4ruxnCbyK+oDsCDyMSnWy/VJcvystnDKzKmBRQVAOSEJtzEb3OtGzvqm0PQ1Dhx1YUAx7L6KlXysmG9h9+MjOcErRL9/1x1LZ33ytR+zK4LvTAb7gN5/9QgwysFyCkNP8bG4nyCzPMiUrBnP0odMTUvDkJDlY0Oia6VjGW6oNxnGIgA5fDraRrW4JH2oejQcrL7+X+jpCp05g==',
356 version: '0.2', 353 version: '0.2',
357 creationDate: 'Mon Apr 02 19:12:44 CEST 2007', 354 creationDate: 'Mon Apr 02 19:12:44 CEST 2007',
358 updateDate: 'Mon Apr 02 19:12:44 CEST 2007', 355 updateDate: 'Mon Apr 02 19:12:44 CEST 2007',
359 accessDate: 'Mon Jan 19 16:10:08 CET 2009' 356 accessDate: 'Mon Jan 19 16:10:08 CET 2009'
360 } 357 }
361 } 358 }
362 }, 359 },
363 '6d45c2fec275b7482d41c76b20507100cfb6ab49922b876f9dd3040d361f4a18': { 360 '6d45c2fec275b7482d41c76b20507100cfb6ab49922b876f9dd3040d361f4a18': {
364 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==', 361 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==',
365 version: '0.2', 362 version: '0.2',
366 creationDate: 'Wed Mar 14 19:09:05 CET 2007', 363 creationDate: 'Wed Mar 14 19:09:05 CET 2007',
367 updateDate: 'Wed Mar 14 19:09:05 CET 2007', 364 updateDate: 'Wed Mar 14 19:09:05 CET 2007',
368 accessDate: 'Mon Jan 19 16:10:15 CET 2009', 365 accessDate: 'Mon Jan 19 16:10:15 CET 2009',
369 currentVersion: 'e85f085a8ed42d2def7adc796b66a2e0a4c3c88d9f3e785eb12a6f5619d945c5', 366 currentVersion: 'e85f085a8ed42d2def7adc796b66a2e0a4c3c88d9f3e785eb12a6f5619d945c5',
370 versions: { 367 versions: {
371 'e85f085a8ed42d2def7adc796b66a2e0a4c3c88d9f3e785eb12a6f5619d945c5': { 368 'e85f085a8ed42d2def7adc796b66a2e0a4c3c88d9f3e785eb12a6f5619d945c5': {
372 header: '####', 369 header: '####',
373 data: 'BbXNAy0GcKKyDPiwhP1Jk9mIi3uXMHQdhuxpDvoR2C3YITOUBpurxGhhvmCg+a9pS+fKJdZPxL2mPbJj6GfWTEsm7K/ECEjrVkSTHi6PTUUgYVbCumq9EHjUspos+7VrifZry3c73+qAvIKamvUlNB86TchMpOXVJIyx8UgRX+bdhrxk9ZCEVOiLCG1zGPX8IzmcxPmBRZFlHYqE4ibhl/CLEzWXZBYCofTusClhOh7YM/jBgvDt64W7aIN2y2KiKwmFySkFZdnOvbAb34tXVimwqjqWPvPwd6MujQeX1bmaDD7Y0kXac8CJxqasIezLo2WqzLUbEXdIHGilkaPT2ZKpKhKkpHJHFrV2lVuQJVqwPUr0Gf9qMKgVnsyU8kUfq9ox+fhH70+v7BQSjT7bxxDLs0UesQeL7G4SqvNet5hPI4GQEpOY8p5MUFReIBTRm72NQEU=', 370 data: 'BbXNAy0GcKKyDPiwhP1Jk9mIi3uXMHQdhuxpDvoR2C3YITOUBpurxGhhvmCg+a9pS+fKJdZPxL2mPbJj6GfWTEsm7K/ECEjrVkSTHi6PTUUgYVbCumq9EHjUspos+7VrifZry3c73+qAvIKamvUlNB86TchMpOXVJIyx8UgRX+bdhrxk9ZCEVOiLCG1zGPX8IzmcxPmBRZFlHYqE4ibhl/CLEzWXZBYCofTusClhOh7YM/jBgvDt64W7aIN2y2KiKwmFySkFZdnOvbAb34tXVimwqjqWPvPwd6MujQeX1bmaDD7Y0kXac8CJxqasIezLo2WqzLUbEXdIHGilkaPT2ZKpKhKkpHJHFrV2lVuQJVqwPUr0Gf9qMKgVnsyU8kUfq9ox+fhH70+v7BQSjT7bxxDLs0UesQeL7G4SqvNet5hPI4GQEpOY8p5MUFReIBTRm72NQEU=',
374 version: '0.2', 371 version: '0.2',
375 creationDate: 'Wed Mar 14 19:09:05 CET 2007', 372 creationDate: 'Wed Mar 14 19:09:05 CET 2007',
376 updateDate: 'Wed Mar 14 19:09:05 CET 2007', 373 updateDate: 'Wed Mar 14 19:09:05 CET 2007',
377 accessDate: 'Mon Jan 19 16:10:15 CET 2009' 374 accessDate: 'Mon Jan 19 16:10:15 CET 2009'
378 } 375 }
379 } 376 }
380 }, 377 },
381 '7bb69b6366a8012f181c01e368ba18d4f7a82bcabb4959189736ad124c4bbfbb': { 378 '7bb69b6366a8012f181c01e368ba18d4f7a82bcabb4959189736ad124c4bbfbb': {
382 data: 'wYPZIt0UHiNVefNwtGc7z7Lu3YoQrXdfKmWqilZp8yeIrNfSLB9p60DLMrL3GDq/CsvDYkGAZgj1C/6NVnzVsXsJKq7NDZn1UPOGt+hCnw3lEVbD7zHkoMM4VgFDn1sZdjLe8wdpIFfdlQESTipT3GVXv3swG2qX2O2yuwtlopR8yZQTLg==', 379 data: 'wYPZIt0UHiNVefNwtGc7z7Lu3YoQrXdfKmWqilZp8yeIrNfSLB9p60DLMrL3GDq/CsvDYkGAZgj1C/6NVnzVsXsJKq7NDZn1UPOGt+hCnw3lEVbD7zHkoMM4VgFDn1sZdjLe8wdpIFfdlQESTipT3GVXv3swG2qX2O2yuwtlopR8yZQTLg==',
383 version: '0.3', 380 version: '0.3',
384 creationDate: 'Mon Jan 05 17:44:30 CET 2009', 381 creationDate: 'Mon Jan 05 17:44:30 CET 2009',
385 updateDate: 'Mon Jan 05 17:44:30 CET 2009', 382 updateDate: 'Mon Jan 05 17:44:30 CET 2009',
386 accessDate: 'Mon Jan 19 16:10:18 CET 2009', 383 accessDate: 'Mon Jan 19 16:10:18 CET 2009',
387 currentVersion: '23f5fb503e54c0cafe3d4944ddaf40bc74fab8b5d96e2bbddf693b1afb225e5b', 384 currentVersion: '23f5fb503e54c0cafe3d4944ddaf40bc74fab8b5d96e2bbddf693b1afb225e5b',
388 versions: { 385 versions: {
389 '23f5fb503e54c0cafe3d4944ddaf40bc74fab8b5d96e2bbddf693b1afb225e5b': { 386 '23f5fb503e54c0cafe3d4944ddaf40bc74fab8b5d96e2bbddf693b1afb225e5b': {
390 header: '####', 387 header: '####',
391 data: 'IpYj+7t3DhSVD8r9PkLbF5xpGrHhg8omY014P1vkT2KkGDEUj+ekQAbQ1g66Z7oNhRDpjS1/dcDjzH0IIQLjGuQ0oRfL0xZefVTx3N88ZLE39m3cJz10K2xyg3xp06jFBmdNJuCkgRhMzeUXeEJujw4lS2kv7cO04Uh2Maui6jDR7E498rgePY3L32vG1S66li/xU1vPjNn06aFTqSYxUL17/mlJNbgp3XWjGC+l0dXLLfXy1wOm+/I3zp2caTs+a2zDUZ15s+3XeaAWpBH7QCaQsvsQmoBqPbMvkjOQwW3taDvV7Hvkh+qTjCEcLjRFwhZkMNn3N2ewcLWQa2aVIjxt6Z0F4s/1URztWlKVzCfto8RmrLajYRn3ggG12kX2xDJFjNPNfs/7A3tMn+FqXQCCNG5GI06JZ32aQfpnjtmXScUuEs8UeFgsNeYclQhcm5R0sUwISK+D345B8859w+4+9OTY38NgYQQ9o/tmpCjWj1tLYLx/m/GcR2em7iyDpBdcnWUb+tK6Ah89qvXriHwPLSNzhOH2wxmi7nXTRQWMv7g2', 388 data: 'IpYj+7t3DhSVD8r9PkLbF5xpGrHhg8omY014P1vkT2KkGDEUj+ekQAbQ1g66Z7oNhRDpjS1/dcDjzH0IIQLjGuQ0oRfL0xZefVTx3N88ZLE39m3cJz10K2xyg3xp06jFBmdNJuCkgRhMzeUXeEJujw4lS2kv7cO04Uh2Maui6jDR7E498rgePY3L32vG1S66li/xU1vPjNn06aFTqSYxUL17/mlJNbgp3XWjGC+l0dXLLfXy1wOm+/I3zp2caTs+a2zDUZ15s+3XeaAWpBH7QCaQsvsQmoBqPbMvkjOQwW3taDvV7Hvkh+qTjCEcLjRFwhZkMNn3N2ewcLWQa2aVIjxt6Z0F4s/1URztWlKVzCfto8RmrLajYRn3ggG12kX2xDJFjNPNfs/7A3tMn+FqXQCCNG5GI06JZ32aQfpnjtmXScUuEs8UeFgsNeYclQhcm5R0sUwISK+D345B8859w+4+9OTY38NgYQQ9o/tmpCjWj1tLYLx/m/GcR2em7iyDpBdcnWUb+tK6Ah89qvXriHwPLSNzhOH2wxmi7nXTRQWMv7g2',
392 version: '0.3', 389 version: '0.3',
393 creationDate: 'Mon Jan 05 17:44:30 CET 2009', 390 creationDate: 'Mon Jan 05 17:44:30 CET 2009',
394 updateDate: 'Mon Jan 05 17:44:30 CET 2009', 391 updateDate: 'Mon Jan 05 17:44:30 CET 2009',
395 accessDate: 'Mon Jan 19 16:10:18 CET 2009' 392 accessDate: 'Mon Jan 19 16:10:18 CET 2009'
396 } 393 }
397 } 394 }
398 }, 395 },
399 '8b18e8593b5bc2f7ea39a5fab222047034ef2f380fee05be0fa6e1c0972fea39': { 396 '8b18e8593b5bc2f7ea39a5fab222047034ef2f380fee05be0fa6e1c0972fea39': {
400 data: 'pOMTY3PnUAbwMLDEYNJCMzp4iIA42YWr6gqoomg+P40e7LFUtbt/RQRelQwNIztyUSVLl0rilkZZkBUVvxrtTqvibKITCjJQGQIzvcb+Yl4mNosl2Rpp0xxMU03f1+G7eGbuCc5hJXYVAglhEYplaAPzHbRWXMY8iZXZPBuLVf5PN+rdpgAfkGeZ7Uf9RsQ9p/EglrWXYnTwXi3saUfzIjfvSHm5C+dXTY3FHpIc1YkjFrdVgMkhYQGV60JtZcwFtCEL2NpVljAbRgHoIXTOkzUvep4vxrtfBBWWMuAWEI06432gtnH6IQbrR6jOpwuMt7k/09qy/fARPHs3r4qTJ9r2uqWHJ7tjJw+IChQPC+3l5HcPpFURiw8LGAN1NyY1hUrF6N84RSn7AKS0bLa5qN++5lcjjxn/k8+JqmeUqN1/SYIbGwNnJeZ0vA8yvOxnD20iVADX5kOVqJDwXRPLaF6Oz9KkbOrmANCh+PmGw1i6PduB+FgAU4HViYCw5IGOUZ30Pm1NJofqfbhXvgzn7ey2+kUIAwDyOUpJ9fW+9jW/JU4rcawmzwBYN2V8apOoyc3wQJICm2984wIfVBpygCOZM0QDyVgNo57qKtYH3yMDQSkKvpEUmuhklMYhcV+4X5ggdqx7lYXO9IMDnFf2ZDiZyieTlOlRv/nNVecUB177Xpnq2e+X/ik2rCQWVrIymiV6ltr1DEv0krXKfvXGG/FMZHUmo3m+B5bG4xVhmt0GnHseqvY2Vrl9NksLgq3hTDOGSGIy5Nv8kfrd8B4/6Tavh0SumiyXnrTXyYXzCK9E7IqO/0KAln63VkcHsbOtS8mj1drN0YQ2KKaeIW+Yr3Gm0pbcODsgA6aFfz1itZVeovBqUklhXS+/Es8J8xOSvvSyD/TmlFjuErHa+wwNQvftosfwk9ZTt0eIJS5aLHdU2QsCjdfSy0DEPkk2siGhBX5ZhRzqyIAyXApSmy+e7PIqn/dDR51+D1ZHwoTQyTrd+F08jBWZgU/OvS8MRxNZSxQwsi7bcWZG+w0utrIDB8eSOMVBXI5XBeJb4h5Bzut18C1shGHeGkSJp04=', 397 data: 'pOMTY3PnUAbwMLDEYNJCMzp4iIA42YWr6gqoomg+P40e7LFUtbt/RQRelQwNIztyUSVLl0rilkZZkBUVvxrtTqvibKITCjJQGQIzvcb+Yl4mNosl2Rpp0xxMU03f1+G7eGbuCc5hJXYVAglhEYplaAPzHbRWXMY8iZXZPBuLVf5PN+rdpgAfkGeZ7Uf9RsQ9p/EglrWXYnTwXi3saUfzIjfvSHm5C+dXTY3FHpIc1YkjFrdVgMkhYQGV60JtZcwFtCEL2NpVljAbRgHoIXTOkzUvep4vxrtfBBWWMuAWEI06432gtnH6IQbrR6jOpwuMt7k/09qy/fARPHs3r4qTJ9r2uqWHJ7tjJw+IChQPC+3l5HcPpFURiw8LGAN1NyY1hUrF6N84RSn7AKS0bLa5qN++5lcjjxn/k8+JqmeUqN1/SYIbGwNnJeZ0vA8yvOxnD20iVADX5kOVqJDwXRPLaF6Oz9KkbOrmANCh+PmGw1i6PduB+FgAU4HViYCw5IGOUZ30Pm1NJofqfbhXvgzn7ey2+kUIAwDyOUpJ9fW+9jW/JU4rcawmzwBYN2V8apOoyc3wQJICm2984wIfVBpygCOZM0QDyVgNo57qKtYH3yMDQSkKvpEUmuhklMYhcV+4X5ggdqx7lYXO9IMDnFf2ZDiZyieTlOlRv/nNVecUB177Xpnq2e+X/ik2rCQWVrIymiV6ltr1DEv0krXKfvXGG/FMZHUmo3m+B5bG4xVhmt0GnHseqvY2Vrl9NksLgq3hTDOGSGIy5Nv8kfrd8B4/6Tavh0SumiyXnrTXyYXzCK9E7IqO/0KAln63VkcHsbOtS8mj1drN0YQ2KKaeIW+Yr3Gm0pbcODsgA6aFfz1itZVeovBqUklhXS+/Es8J8xOSvvSyD/TmlFjuErHa+wwNQvftosfwk9ZTt0eIJS5aLHdU2QsCjdfSy0DEPkk2siGhBX5ZhRzqyIAyXApSmy+e7PIqn/dDR51+D1ZHwoTQyTrd+F08jBWZgU/OvS8MRxNZSxQwsi7bcWZG+w0utrIDB8eSOMVBXI5XBeJb4h5Bzut18C1shGHeGkSJp04=',
401 version: '0.2', 398 version: '0.2',
402 creationDate: 'Tue May 01 01:10:17 CEST 2007', 399 creationDate: 'Tue May 01 01:10:17 CEST 2007',
403 updateDate: 'Tue May 01 01:13:27 CEST 2007', 400 updateDate: 'Tue May 01 01:13:27 CEST 2007',
404 accessDate: 'Mon Jan 19 16:10:02 CET 2009', 401 accessDate: 'Mon Jan 19 16:10:02 CET 2009',
405 currentVersion: 'd175358ea0b9d32c23e4bceff2020eae9a8459466abc18d4399d988e733fc0f8', 402 currentVersion: 'd175358ea0b9d32c23e4bceff2020eae9a8459466abc18d4399d988e733fc0f8',
406 versions: { 403 versions: {
407 '8a032b53f7356e2d8b28665211abbe2cf1c79fd8eee4752e83cebdced1c19911': { 404 '8a032b53f7356e2d8b28665211abbe2cf1c79fd8eee4752e83cebdced1c19911': {
408 header: '####', 405 header: '####',
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 1cb92c0..ed3a6a4 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,172 +1,169 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29MochiKit.Base.update(testData, { 26MochiKit.Base.update(testData, {
30 27
31 //------------------------------------------------------------------------- 28 //-------------------------------------------------------------------------
32 29
33 'OLD_joe_clipperz_offline_copy_data': { 30 'OLD_joe_clipperz_offline_copy_data': {
34 users:{ 31 users:{
35 'catchAllUser': { 32 'catchAllUser': {
36 __masterkey_test_value__: 'masterkey', 33 __masterkey_test_value__: 'masterkey',
37 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00', 34 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00',
38 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00' 35 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00'
39 }, 36 },
40 'f527cdd90d0d47f8524b4e165398ad1455eba515d04abd101d1e93b3c6ae0674': { 37 'f527cdd90d0d47f8524b4e165398ad1455eba515d04abd101d1e93b3c6ae0674': {
41 s: '097ca38b1792023d6c1ffca50606b6040c6b27a7667e355ba9e54e6d47d8bf23', 38 s: '097ca38b1792023d6c1ffca50606b6040c6b27a7667e355ba9e54e6d47d8bf23',
42 v: '34b9f3ab193bb12dc93c791637b8d80364564b9a39ed7130cd168d52876914e4', 39 v: '34b9f3ab193bb12dc93c791637b8d80364564b9a39ed7130cd168d52876914e4',
43 version: '0.2', 40 version: '0.2',
44 maxNumberOfRecords: '100', 41 maxNumberOfRecords: '100',
45 userDetails: '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', 42 userDetails: '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',
46 statistics: 'iFI3fKfuUd5Tqj/iRCJnIk7isZ2FOYPr/yNfICm2U35oUeTJ/RA+l+kbWiYrecpIEgk=', 43 statistics: 'iFI3fKfuUd5Tqj/iRCJnIk7isZ2FOYPr/yNfICm2U35oUeTJ/RA+l+kbWiYrecpIEgk=',
47 userDetailsVersion: '0.2', 44 userDetailsVersion: '0.2',
48 records: { 45 records: {
49 /* 01 */ '062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80': { 46 /* 01 */ '062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80': {
50 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', 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',
51 version: '0.2', 48 version: '0.2',
52 creationDate: 'Wed Mar 14 15:46:44 CET 2007', 49 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
53 updateDate: 'Wed Mar 14 15:46:44 CET 2007', 50 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
54 accessDate: 'Mon Jan 19 16:10:04 CET 2009', 51 accessDate: 'Mon Jan 19 16:10:04 CET 2009',
55 currentVersion: '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3', 52 currentVersion: '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3',
56 versions: { 53 versions: {
57 '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3': { 54 '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3': {
58 header: '####', 55 header: '####',
59 data: '.....', 56 data: '.....',
60 version: '0.2', 57 version: '0.2',
61 creationDate: 'Wed Mar 14 15:46:44 CET 2007', 58 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
62 updateDate: 'Wed Mar 14 15:46:44 CET 2007', 59 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
63 accessDate: 'Mon Jan 19 16:10:04 CET 2009' 60 accessDate: 'Mon Jan 19 16:10:04 CET 2009'
64 } 61 }
65 } 62 }
66 }, 63 },
67 /* 02 */ '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551': { 64 /* 02 */ '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551': {
68 data: '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', 65 data: '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',
69 version: '0.2', 66 version: '0.2',
70 creationDate: 'Wed Mar 14 15:46:44 CET 2007', 67 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
71 updateDate: 'Wed Mar 14 15:46:44 CET 2007', 68 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
72 accessDate: 'Mon Jan 19 16:10:04 CET 2009' 69 accessDate: 'Mon Jan 19 16:10:04 CET 2009'
73 }, 70 },
74 /* 03 */ '36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113': { 71 /* 03 */ '36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113': {
75 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', 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',
76 version: '0.2', 73 version: '0.2',
77 creationDate: 'Wed Mar 14 15:46:44 CET 2007', 74 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
78 updateDate: 'Wed Mar 14 15:46:44 CET 2007', 75 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
79 accessDate: 'Mon Jan 19 16:10:04 CET 2009' 76 accessDate: 'Mon Jan 19 16:10:04 CET 2009'
80 }, 77 },
81 /* 04 */ '507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a': { 78 /* 04 */ '507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a': {
82 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', 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',
83 version: '0.2', 80 version: '0.2',
84 creationDate: 'Wed Mar 14 15:46:44 CET 2007', 81 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
85 updateDate: 'Wed Mar 14 15:46:44 CET 2007', 82 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
86 accessDate: 'Mon Jan 19 16:10:04 CET 2009' 83 accessDate: 'Mon Jan 19 16:10:04 CET 2009'
87 }, 84 },
88 /* 05 */ '6026370f3db3860d2c46a08e389a7e906dc14f98c8444b21be9a7e9f405a2728': { 85 /* 05 */ '6026370f3db3860d2c46a08e389a7e906dc14f98c8444b21be9a7e9f405a2728': {
89 data: '3oUg1TD+Lu4ou06j/MddOTXDqRM+qSKD+6Iuzia1Hop1w7v/BXidqeoKJZQI2VY9oO9B70Nr3B3wDROF+ycy6Rq+FM/xqUGHKXn1lAaSc6Wgj6TLQ6eRF6YZKSPqTj7TDWyw/2pEWk4HjcT8drTrCaC02tzAXMhYWlYPQPW4fUdq4hawoHIdopUN3vafQuFjY47OhqXKav3bNao=', 86 data: '3oUg1TD+Lu4ou06j/MddOTXDqRM+qSKD+6Iuzia1Hop1w7v/BXidqeoKJZQI2VY9oO9B70Nr3B3wDROF+ycy6Rq+FM/xqUGHKXn1lAaSc6Wgj6TLQ6eRF6YZKSPqTj7TDWyw/2pEWk4HjcT8drTrCaC02tzAXMhYWlYPQPW4fUdq4hawoHIdopUN3vafQuFjY47OhqXKav3bNao=',
90 version: '0.2', 87 version: '0.2',
91 creationDate: 'Wed Mar 14 15:46:44 CET 2007', 88 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
92 updateDate: 'Wed Mar 14 15:46:44 CET 2007', 89 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
93 accessDate: 'Mon Jan 19 16:10:04 CET 2009' 90 accessDate: 'Mon Jan 19 16:10:04 CET 2009'
94 }, 91 },
95 /* 06 */ '6c25be8e145efb26a1abd59590522f73fb2e3dbc139af2217074d9e2ba92c16a': { 92 /* 06 */ '6c25be8e145efb26a1abd59590522f73fb2e3dbc139af2217074d9e2ba92c16a': {
96 data: 'b2mcYUi59l434kGl7ij6dBu3063UL1dToMIu3Zsa9RV9RzeLKnezJhLKunqoAm7KwiJeqDo/REexHI1cshGYtHasVXXuyJfMx1grH7yhoWnkSRF4Sax6w5E5wnGkEpGJHOxXJ9rOjWHZ7yqCUUCB/dqLw4FwPOtRb/ynkBEYztEJA6EKGJuz0vrrTOsT8HMXtj/w6MEZ7qI3fPs=', 93 data: 'b2mcYUi59l434kGl7ij6dBu3063UL1dToMIu3Zsa9RV9RzeLKnezJhLKunqoAm7KwiJeqDo/REexHI1cshGYtHasVXXuyJfMx1grH7yhoWnkSRF4Sax6w5E5wnGkEpGJHOxXJ9rOjWHZ7yqCUUCB/dqLw4FwPOtRb/ynkBEYztEJA6EKGJuz0vrrTOsT8HMXtj/w6MEZ7qI3fPs=',
97 version: '0.2', 94 version: '0.2',
98 creationDate: 'Wed Mar 14 15:46:44 CET 2007', 95 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
99 updateDate: 'Wed Mar 14 15:46:44 CET 2007', 96 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
100 accessDate: 'Mon Jan 19 16:10:04 CET 2009' 97 accessDate: 'Mon Jan 19 16:10:04 CET 2009'
101 }, 98 },
102 /* 07 */ '6d45c2fec275b7482d41c76b20507100cfb6ab49922b876f9dd3040d361f4a18': { 99 /* 07 */ '6d45c2fec275b7482d41c76b20507100cfb6ab49922b876f9dd3040d361f4a18': {
103 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==', 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==',
104 version: '0.2', 101 version: '0.2',
105 creationDate: 'Wed Mar 14 15:46:44 CET 2007', 102 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
106 updateDate: 'Wed Mar 14 15:46:44 CET 2007', 103 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
107 accessDate: 'Mon Jan 19 16:10:04 CET 2009' 104 accessDate: 'Mon Jan 19 16:10:04 CET 2009'
108 }, 105 },
109 /* 08 */ '9dcd2a8a0fcb7e57d234dc4fea347f020a6a01793e40cf56a0d22379e590e291': { 106 /* 08 */ '9dcd2a8a0fcb7e57d234dc4fea347f020a6a01793e40cf56a0d22379e590e291': {
110 data: 'xXZUJjgxn62OqnzAvScHJNo4WjYEFp1vQ4ueBe1sk8dH4pXZUKV6m9c1d2cLUgBj4rUNP5cC66GiFHV7G5BDZGLrfrxUlYU6BWvzAz4eG463pRDhHXQgPrhlIGDlK6ovaIsjwaifvHaEfLREoXvLFluqu406KG58guhtWdIFK0rLypyRo8uyltGbTz8wZdu8atY/JYQnb8NaAf4=', 107 data: 'xXZUJjgxn62OqnzAvScHJNo4WjYEFp1vQ4ueBe1sk8dH4pXZUKV6m9c1d2cLUgBj4rUNP5cC66GiFHV7G5BDZGLrfrxUlYU6BWvzAz4eG463pRDhHXQgPrhlIGDlK6ovaIsjwaifvHaEfLREoXvLFluqu406KG58guhtWdIFK0rLypyRo8uyltGbTz8wZdu8atY/JYQnb8NaAf4=',
111 version: '0.2', 108 version: '0.2',
112 creationDate: 'Wed Mar 14 15:46:44 CET 2007', 109 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
113 updateDate: 'Wed Mar 14 15:46:44 CET 2007', 110 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
114 accessDate: 'Mon Jan 19 16:10:04 CET 2009' 111 accessDate: 'Mon Jan 19 16:10:04 CET 2009'
115 }, 112 },
116 /* 09 */ 'ca01bcb7691f70818feed46c9a2a91883ac543997a395535aedbb49de166690c': { 113 /* 09 */ 'ca01bcb7691f70818feed46c9a2a91883ac543997a395535aedbb49de166690c': {
117 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', 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',
118 version: '0.2', 115 version: '0.2',
119 creationDate: 'Wed Mar 14 15:46:44 CET 2007', 116 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
120 updateDate: 'Wed Mar 14 15:46:44 CET 2007', 117 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
121 accessDate: 'Mon Jan 19 16:10:04 CET 2009' 118 accessDate: 'Mon Jan 19 16:10:04 CET 2009'
122 }, 119 },
123 /* 10 */ 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d': { 120 /* 10 */ 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d': {
124 data: '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', 121 data: '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',
125 version: '0.2', 122 version: '0.2',
126 creationDate: 'Wed Mar 14 15:46:44 CET 2007', 123 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
127 updateDate: 'Wed Mar 14 15:46:44 CET 2007', 124 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
128 accessDate: 'Mon Jan 19 16:10:04 CET 2009' 125 accessDate: 'Mon Jan 19 16:10:04 CET 2009'
129 }, 126 },
130 /* 11 */ 'd620764a656bfd4e1d3758500d5db72e460a0cf729d56ed1a7755b5725c50045': { 127 /* 11 */ 'd620764a656bfd4e1d3758500d5db72e460a0cf729d56ed1a7755b5725c50045': {
131 data: 'Ate/x8b4UWG3C+gZ7IzIfZrHSlh3eSANVYtd034pXi4V73+rc5OynELEiMxDgvcr+4r5YGNPKvTB83KzOBznmZsEJhNpCd2Ezyk1i3FEo+Wur/6EYBBvDfHSQNrRfYVcNlx6+i1d6a6lDYxOcxfEPuL2141KsCRxCId4FWvDU1Om48ekFNyeOl5ND+k4GLymYIjG7HC6VQZOwUQgzlTfZpjeJ1q3pdPWSEtX8a0b5pgmHVB9X56u+vjfYFcs2ieh3UcR4Vg8fIJQOth/pE2XoZfbALyT3pnEcW8vQrrmFcavt9bDGGzlEkGB9JEIyMzUqVndV9Sw5OsCMgOEpMKvELRnlyieUvcsYSL1s/m8GohguMrXDiRV/nCUhZbH/j/8jXEX4kfiaIT5uvPBymTyMTGGLoPBT7mOWLuV6NoU6ND0QwSEXNMpZDJDBhl37hR4kD3GgjCv9gjasADAmHPZF386LNxnOIMTfrOIwK3sXkfhEU9EKdC+QT+W85o6HQrWXsqNesxU2cs2uW7rmadUBoQdyYTtWH3cBWcwKH56vzlOG33JG1+DGH6MFEd4vn1I0aoluPuBom9ERgLXEoqw1tx4OAx8UCcev8dnZF1YcGhcUXyORjgjd6CTfMDz+f5YMkulGwPRcm1D7uof0a2ryV6+c5WuccUX+Pe/Vj3WOQXts7pdukLp+idnlpdSw4roJWU++1i7727MIWGUFcKMH6qyH2yZ1nxLNour/u6FYlxRvNkB+vCr+hko7iBlTw2GMVWUMgnFS0A+lQ1tGawAM9h8lpb75GCbiWNXdnbTx/GdQzKMJJXKGpOeuWOXlJSEJHjWzVwbP21ql1OaFLr9ihUJdLzSsjICW7pGH/iuhuIlx84N57ctV2BTAYJtPLG+f3rv709lOD/5pgdXTLijjX473Ymq0TgGBSI9am0Pwz7SB2k1LVkBVfAVxR6p8Vb0h3S1LUojoJS5dfGV7TtTu67CemoRNISdOVL9kxCoue1QMsd7GTnY3sy/P4eFHovCtU0suUYjHRojUz5B6xPlL92Jbdtq6fGv+V+p/HnKFXkf3BgPnSm2zexCAEgT8yuJ86UIIWIEhYN1UtzJVJ6BykCCGbZrCSEHyfCcRLreYYpNcMPWpLOLTMFpLiHtW6+x6/tVB07K2NDpYZUY4Ekym4bRrLUXtDjjcltL8qUPQf/uBU6tfpGrdZB5OAWnsxzR0x+4ycyz84Pq81NMUVKnvhUWrygtatZhFYhNWYCz4NRfqwnwSRQxTr/2NliO22BhGc6fjZWdXdqmyw1+UXVp692nsV2FCldz8+k6LMA0AKBuQXcK5v4mYQOWmSKlH/CpkPkOEIPrQVmgjMv1/qWaEIvRJUYpPsnFUD5a12NlBBxBvHpcXemHZZvdgnBnOyAjIbhxCAsQnw2Rc6SzF1z4yviZ8PSeh5+zavbI9rgO3UtsPBO+R+5kky3KxtnLSV9m6m6Lb1QmpwDKQ2ddTDXFLBasyE0WdrCDBTDpCLDRsLWdODzyeCH0yWx8tfKfKRI5dzBQz4xJ9swkC3LAr7XubkCw8RMzCUAC/WKMRIsoyXMP2Il38fSG1aO6kKyUvY6ai8a8IDx3Do5TQMgS53N4tQNls8ZcglYDydcXhxsH7ztEjis/2omJbwadtTRYv7fu5jbZAC21XcGhfbgPp8h3Zal0SwuN6s+Uyz8LSwnZgrN0N6d2cNE39628kZkAwI7piZG7VV0XocrGnIu+6oe0QmJsxiAMvaheh0K9Dkf98rS2OF3LDwosaSzxUBD06BD1C2BkleM9', 128 data: 'Ate/x8b4UWG3C+gZ7IzIfZrHSlh3eSANVYtd034pXi4V73+rc5OynELEiMxDgvcr+4r5YGNPKvTB83KzOBznmZsEJhNpCd2Ezyk1i3FEo+Wur/6EYBBvDfHSQNrRfYVcNlx6+i1d6a6lDYxOcxfEPuL2141KsCRxCId4FWvDU1Om48ekFNyeOl5ND+k4GLymYIjG7HC6VQZOwUQgzlTfZpjeJ1q3pdPWSEtX8a0b5pgmHVB9X56u+vjfYFcs2ieh3UcR4Vg8fIJQOth/pE2XoZfbALyT3pnEcW8vQrrmFcavt9bDGGzlEkGB9JEIyMzUqVndV9Sw5OsCMgOEpMKvELRnlyieUvcsYSL1s/m8GohguMrXDiRV/nCUhZbH/j/8jXEX4kfiaIT5uvPBymTyMTGGLoPBT7mOWLuV6NoU6ND0QwSEXNMpZDJDBhl37hR4kD3GgjCv9gjasADAmHPZF386LNxnOIMTfrOIwK3sXkfhEU9EKdC+QT+W85o6HQrWXsqNesxU2cs2uW7rmadUBoQdyYTtWH3cBWcwKH56vzlOG33JG1+DGH6MFEd4vn1I0aoluPuBom9ERgLXEoqw1tx4OAx8UCcev8dnZF1YcGhcUXyORjgjd6CTfMDz+f5YMkulGwPRcm1D7uof0a2ryV6+c5WuccUX+Pe/Vj3WOQXts7pdukLp+idnlpdSw4roJWU++1i7727MIWGUFcKMH6qyH2yZ1nxLNour/u6FYlxRvNkB+vCr+hko7iBlTw2GMVWUMgnFS0A+lQ1tGawAM9h8lpb75GCbiWNXdnbTx/GdQzKMJJXKGpOeuWOXlJSEJHjWzVwbP21ql1OaFLr9ihUJdLzSsjICW7pGH/iuhuIlx84N57ctV2BTAYJtPLG+f3rv709lOD/5pgdXTLijjX473Ymq0TgGBSI9am0Pwz7SB2k1LVkBVfAVxR6p8Vb0h3S1LUojoJS5dfGV7TtTu67CemoRNISdOVL9kxCoue1QMsd7GTnY3sy/P4eFHovCtU0suUYjHRojUz5B6xPlL92Jbdtq6fGv+V+p/HnKFXkf3BgPnSm2zexCAEgT8yuJ86UIIWIEhYN1UtzJVJ6BykCCGbZrCSEHyfCcRLreYYpNcMPWpLOLTMFpLiHtW6+x6/tVB07K2NDpYZUY4Ekym4bRrLUXtDjjcltL8qUPQf/uBU6tfpGrdZB5OAWnsxzR0x+4ycyz84Pq81NMUVKnvhUWrygtatZhFYhNWYCz4NRfqwnwSRQxTr/2NliO22BhGc6fjZWdXdqmyw1+UXVp692nsV2FCldz8+k6LMA0AKBuQXcK5v4mYQOWmSKlH/CpkPkOEIPrQVmgjMv1/qWaEIvRJUYpPsnFUD5a12NlBBxBvHpcXemHZZvdgnBnOyAjIbhxCAsQnw2Rc6SzF1z4yviZ8PSeh5+zavbI9rgO3UtsPBO+R+5kky3KxtnLSV9m6m6Lb1QmpwDKQ2ddTDXFLBasyE0WdrCDBTDpCLDRsLWdODzyeCH0yWx8tfKfKRI5dzBQz4xJ9swkC3LAr7XubkCw8RMzCUAC/WKMRIsoyXMP2Il38fSG1aO6kKyUvY6ai8a8IDx3Do5TQMgS53N4tQNls8ZcglYDydcXhxsH7ztEjis/2omJbwadtTRYv7fu5jbZAC21XcGhfbgPp8h3Zal0SwuN6s+Uyz8LSwnZgrN0N6d2cNE39628kZkAwI7piZG7VV0XocrGnIu+6oe0QmJsxiAMvaheh0K9Dkf98rS2OF3LDwosaSzxUBD06BD1C2BkleM9',
132 version: '0.2', 129 version: '0.2',
133 creationDate: 'Wed Mar 14 15:46:44 CET 2007', 130 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
134 updateDate: 'Wed Mar 14 15:46:44 CET 2007', 131 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
135 accessDate: 'Mon Jan 19 16:10:04 CET 2009' 132 accessDate: 'Mon Jan 19 16:10:04 CET 2009'
136 }, 133 },
137 /* 12 */ 'de13c0d036234c44214062bc0a89e5f127470c464333493a485729f43cdc26e4': { 134 /* 12 */ 'de13c0d036234c44214062bc0a89e5f127470c464333493a485729f43cdc26e4': {
138 data: 'ZYvHAVCnw96hB+0XxnBY6p+vwvup1BopHUeepu7yOOSdYNFFOFEvtCbxXXoyVaKZAeSd2Vd7YEwRP4TTJjjWNPapT0D65AFqM8x+0rEjhmVfQGZAS4L3QctzRAgBoR1qTr0iqI/46ETkNq6vHz9mPLHEL3MQ/zoh4Pp0T+uMsY5ptzuMPcG0YwajSm5J8XXV2V5ZBEANpgL91xjgh1I9LiKJa/Lv3R9HAZG1uuCvzqjA2LWYeH+6ZcSpadk/UPxDw9c78FUnSNbHAcjuYZ/yI3v5SaZTjEzsB1MtAh6AFiHtvKIMWpqoOs7XQPhz1xXPoGZ7VR64A+/bN2h+Uqn49bQrKjTRGegqkEWFcBwhFH/ZkYfSHCGmZQTVqOakqyofJ22tS0ief45gYaO54YvIliTNTY7SZMRCEhUzz6dz8ENqP7FxhUVcQRbBr0JTmaf6DAwu86iDgkvcp1cY2trnUmlvrgz2GW6TgXoFjFlchUkHIByFeIJ02olfJg4zP8PzgYp2zhwmXL8iXHXnwzuP9bQKq5j8o+UhR11zn4MFvWQyD1UEplK6vphMdS8iXDViLrOwuMz1XUf7RxNdW0gqXwx+qLU+CeypyWLMIlgTlOr1pBqD/S5Jx+Gbn5GHQViuFZHJUjJsU0xel001KjB2Wf1Y15OSdLZ5l0tn/4HYKmZLufTYpub0xrss5r3Z72RYz3wvAWFXzkxWa+oBiRQiF6+ix8DBPTc3tm+ORnQBYcV/VNVRziimV3MFSsD1nHgIF1zu+eXIKE7/b3lzY19KpvtiBio94dejWoA/WO7KXWv2sHH0JoZnRh6lzu0HRFgYqVm/052nCGVA6XSfrFtfIupxdBs22C9wrwC5/Rwanf1S8BQIXpm25P4dv9Y9cS6c2/DUHcle4tsUJlqC+LpRGKXRdolFkiL9r01V09Kev/K2oXaWGYmBLbRfIyvEHyHNeNXv5fnaZ3pTlIwXjJ9K9yKA/1AKAsAEuKlM3N5ep9pfyuyfOWj1I6RvBwVqKvcBZtYJ4u8n9jrxiyq3ZZ35eB62D+ceOAD2s5+LL2IylYjiJA1OO2qpu4x9rt1NHXM6LYJAruBnUrJ0Ylqz/ElcJn/lXAzY6RLqVcZ+tuV580AUkFiaXFEDcqdJbbzh0R15g9DtaeiQZd1PG0a8Xblj9aMQoRDRJeksw1GWO7TfrJX1Cu4k+sgARWRzZ0DvB0SJAxPcmhg2iBByn2ESlcxPvMOpzuJI11BUQsZZ7dcynubeMvdqBeKsC6HMcm+8DLEUPmzsC3HIfARlNbt1fOrGJNuKaLvF1AAdwllELoPf3lQ6EVZI120=', 135 data: 'ZYvHAVCnw96hB+0XxnBY6p+vwvup1BopHUeepu7yOOSdYNFFOFEvtCbxXXoyVaKZAeSd2Vd7YEwRP4TTJjjWNPapT0D65AFqM8x+0rEjhmVfQGZAS4L3QctzRAgBoR1qTr0iqI/46ETkNq6vHz9mPLHEL3MQ/zoh4Pp0T+uMsY5ptzuMPcG0YwajSm5J8XXV2V5ZBEANpgL91xjgh1I9LiKJa/Lv3R9HAZG1uuCvzqjA2LWYeH+6ZcSpadk/UPxDw9c78FUnSNbHAcjuYZ/yI3v5SaZTjEzsB1MtAh6AFiHtvKIMWpqoOs7XQPhz1xXPoGZ7VR64A+/bN2h+Uqn49bQrKjTRGegqkEWFcBwhFH/ZkYfSHCGmZQTVqOakqyofJ22tS0ief45gYaO54YvIliTNTY7SZMRCEhUzz6dz8ENqP7FxhUVcQRbBr0JTmaf6DAwu86iDgkvcp1cY2trnUmlvrgz2GW6TgXoFjFlchUkHIByFeIJ02olfJg4zP8PzgYp2zhwmXL8iXHXnwzuP9bQKq5j8o+UhR11zn4MFvWQyD1UEplK6vphMdS8iXDViLrOwuMz1XUf7RxNdW0gqXwx+qLU+CeypyWLMIlgTlOr1pBqD/S5Jx+Gbn5GHQViuFZHJUjJsU0xel001KjB2Wf1Y15OSdLZ5l0tn/4HYKmZLufTYpub0xrss5r3Z72RYz3wvAWFXzkxWa+oBiRQiF6+ix8DBPTc3tm+ORnQBYcV/VNVRziimV3MFSsD1nHgIF1zu+eXIKE7/b3lzY19KpvtiBio94dejWoA/WO7KXWv2sHH0JoZnRh6lzu0HRFgYqVm/052nCGVA6XSfrFtfIupxdBs22C9wrwC5/Rwanf1S8BQIXpm25P4dv9Y9cS6c2/DUHcle4tsUJlqC+LpRGKXRdolFkiL9r01V09Kev/K2oXaWGYmBLbRfIyvEHyHNeNXv5fnaZ3pTlIwXjJ9K9yKA/1AKAsAEuKlM3N5ep9pfyuyfOWj1I6RvBwVqKvcBZtYJ4u8n9jrxiyq3ZZ35eB62D+ceOAD2s5+LL2IylYjiJA1OO2qpu4x9rt1NHXM6LYJAruBnUrJ0Ylqz/ElcJn/lXAzY6RLqVcZ+tuV580AUkFiaXFEDcqdJbbzh0R15g9DtaeiQZd1PG0a8Xblj9aMQoRDRJeksw1GWO7TfrJX1Cu4k+sgARWRzZ0DvB0SJAxPcmhg2iBByn2ESlcxPvMOpzuJI11BUQsZZ7dcynubeMvdqBeKsC6HMcm+8DLEUPmzsC3HIfARlNbt1fOrGJNuKaLvF1AAdwllELoPf3lQ6EVZI120=',
139 version: '0.2', 136 version: '0.2',
140 creationDate: 'Wed Mar 14 15:46:44 CET 2007', 137 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
141 updateDate: 'Wed Mar 14 15:46:44 CET 2007', 138 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
142 accessDate: 'Mon Jan 19 16:10:04 CET 2009' 139 accessDate: 'Mon Jan 19 16:10:04 CET 2009'
143 }, 140 },
144 /* 13 */ 'eeda70e0392261967bda71c3764da78989c45bbd2bb7be6b941b90f81d9b81b5': { 141 /* 13 */ 'eeda70e0392261967bda71c3764da78989c45bbd2bb7be6b941b90f81d9b81b5': {
145 data: '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', 142 data: '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',
146 version: '0.2', 143 version: '0.2',
147 creationDate: 'Wed Mar 14 15:46:44 CET 2007', 144 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
148 updateDate: 'Wed Mar 14 15:46:44 CET 2007', 145 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
149 accessDate: 'Mon Jan 19 16:10:04 CET 2009' 146 accessDate: 'Mon Jan 19 16:10:04 CET 2009'
150 }, 147 },
151 /* 14 */ 'f215d89bf4583c12f5ed4f4330f488dad3fffa448f4dc784f15ef135dda2c732': { 148 /* 14 */ 'f215d89bf4583c12f5ed4f4330f488dad3fffa448f4dc784f15ef135dda2c732': {
152 data: '3sIazRfi2ps3Mh69YkIYFFyDRXU8cTRuBjCevCJHyJOfxLPOcJfUX+QuWv50QMRchAG1RYTwqTOFd4G4ixzmt9HjHlJSpFXva8TvNfUaoggUWWTzNraRxB0gJex3JGfQd4Nlve+wdISrn5vUJSWBYcFEFo9504TcDAkVjwFYrLhBDFv53d3B5WuanLzpRuB8lIj5r5ZBYszraRDeSjEKQ0OtTojxnkZOB7dDi2IYdorhxhOeBmi3ucAXeDLZbaZdPAXmo6CNEYxAr0z9/aCrvLxZEfNoBvBMOnHT20wljSGsjf6QG/KEm352ix/uGSrJNbRMMX9tVloeSmEkwxkAn4ZQwIVq/0IS970MkL+jOH/RFhO6UT6x5OPo+Yyf3EKmRWKKeZbv95C5WNRcfLjeNVo5Zihq4fAUEfwHtNTaEEpLoUdCbzgZqBKcbLk8jo44lznz41T4R9QM5ofRAexywqVlEzagztakcrgyAMGumqquuKscJmqxEyxZLwNWD706DCUkiG2a1m/umxNvVkCNE6VBxbZ1+SPrcsRVfdtAx3eee056xo+KYKLdf84j3DR27H/p3QYm25sdLhUU0QtUTDTP2aKUxEcsLy5MIZV7256AlRS23upmvtb+VfJCsT+FwedLNCzu4SEk8Iz5AHFJ2VZ0g/2A7DH7DiuaxSqEn6iSqVZRnTrhWsW/lTZ61Swji+wvzk+5RnY8wBFZeudUX6ERy9n0e4n8EkGXCObwSnyIe+Dxs32MQFXb7b6NUJEfbq4GxHUjJ6fzRuTqQysRKlQ+qj9Hl5+HvGhyliDpe+PQ3V6kFE52qVArAYzlR2sZJmxKPIgU6wPPuCMcg+97own4gSO6PWrnlSZs87ptZdZ1iiYPDajQjyLI9WV/IN3APbiRufdEjjmCkoxB1zwSHzyW50Wdl1pEW19/0j+KSFDeigXXVg0LAko4uuJIPTLR8L8gOrcNZvIqHB85XnsbO49+SUwcykXSlZSq3il7D/9FuGJK0ecKdEMf/UetsSaX7x3L92fzSIjqgFSHrCPrqLVWdI5Sema4vhx3aes+hF9oohC9jqb6vS/b/vXfVf2vs2hPelqk7UIRzPmaeapzF0RyjGoAljBIrPFmyAmXcpQ/NlJSI7UjMjoFWsOXshJiy+0/luVkzfoFSordVm2ZhR9zkVKKDHlrFXXkw1upVnf1xFV9Z4SEVAZKgWRr2vLbmD5tITmR7qxzNTXrikqujVvOeFCHkAW1c5IcOk/VjPO36CNL2EZbpRHc6z25gST8NYn+Ypee6FGliHGFbzJxTwHa67fRncf9H1Iunzl+x3J3/0973z5fILk4OtMq3MKUFjdj2r+hqwU893+Yaza7l06Jm+dODTXhPA0T+JL4gaWHE4Ci9SsX85uvpZR++Tfx3CB7uXvOKGATmVYkAMndNCOBCbHz1/zz/Fg4Awu4aAPap/DqWsoVXajuYBSBNpaxpFWeioX65PPEPgn+HHmtjn2c647vwdv3iBopTJJlipoW94vkTJe4tpO1e7DA5EPnzdxJoRyXGbipfCRlfblcurQP+hXZHobfqmzMuyEPp4t7b5oiYpwzNnM4/sh9NxTpj/a4urjnIwg8yzLNvdletAuME0oQu4DkcWpPKhyDpelAPtdhDka2YID/WhUfg+gHKpIjKU271eoUwhScCcW1cBY41htaSNftJq96r77piMYo6EAAuf4X++MIT5LiwsYs/qzjOrmQm5pdSeAmR9f1fkqsIAv/TDhgAgIC0zAmvUJfkxIEHOMn4y5i5qZqlDS/Nvd/ZWl0lMjPSJaxd1pm3echWZ8/+gPKMib5sSO2eYYOMq/DR6k2ILThbHJp1G6gqcyD/LymNO7BrCIDfGEgp+fCBFXYBjC6+Otkukcvxs1uJsirwWbYLaoC25iYChdhwmoOys8=', 149 data: '3sIazRfi2ps3Mh69YkIYFFyDRXU8cTRuBjCevCJHyJOfxLPOcJfUX+QuWv50QMRchAG1RYTwqTOFd4G4ixzmt9HjHlJSpFXva8TvNfUaoggUWWTzNraRxB0gJex3JGfQd4Nlve+wdISrn5vUJSWBYcFEFo9504TcDAkVjwFYrLhBDFv53d3B5WuanLzpRuB8lIj5r5ZBYszraRDeSjEKQ0OtTojxnkZOB7dDi2IYdorhxhOeBmi3ucAXeDLZbaZdPAXmo6CNEYxAr0z9/aCrvLxZEfNoBvBMOnHT20wljSGsjf6QG/KEm352ix/uGSrJNbRMMX9tVloeSmEkwxkAn4ZQwIVq/0IS970MkL+jOH/RFhO6UT6x5OPo+Yyf3EKmRWKKeZbv95C5WNRcfLjeNVo5Zihq4fAUEfwHtNTaEEpLoUdCbzgZqBKcbLk8jo44lznz41T4R9QM5ofRAexywqVlEzagztakcrgyAMGumqquuKscJmqxEyxZLwNWD706DCUkiG2a1m/umxNvVkCNE6VBxbZ1+SPrcsRVfdtAx3eee056xo+KYKLdf84j3DR27H/p3QYm25sdLhUU0QtUTDTP2aKUxEcsLy5MIZV7256AlRS23upmvtb+VfJCsT+FwedLNCzu4SEk8Iz5AHFJ2VZ0g/2A7DH7DiuaxSqEn6iSqVZRnTrhWsW/lTZ61Swji+wvzk+5RnY8wBFZeudUX6ERy9n0e4n8EkGXCObwSnyIe+Dxs32MQFXb7b6NUJEfbq4GxHUjJ6fzRuTqQysRKlQ+qj9Hl5+HvGhyliDpe+PQ3V6kFE52qVArAYzlR2sZJmxKPIgU6wPPuCMcg+97own4gSO6PWrnlSZs87ptZdZ1iiYPDajQjyLI9WV/IN3APbiRufdEjjmCkoxB1zwSHzyW50Wdl1pEW19/0j+KSFDeigXXVg0LAko4uuJIPTLR8L8gOrcNZvIqHB85XnsbO49+SUwcykXSlZSq3il7D/9FuGJK0ecKdEMf/UetsSaX7x3L92fzSIjqgFSHrCPrqLVWdI5Sema4vhx3aes+hF9oohC9jqb6vS/b/vXfVf2vs2hPelqk7UIRzPmaeapzF0RyjGoAljBIrPFmyAmXcpQ/NlJSI7UjMjoFWsOXshJiy+0/luVkzfoFSordVm2ZhR9zkVKKDHlrFXXkw1upVnf1xFV9Z4SEVAZKgWRr2vLbmD5tITmR7qxzNTXrikqujVvOeFCHkAW1c5IcOk/VjPO36CNL2EZbpRHc6z25gST8NYn+Ypee6FGliHGFbzJxTwHa67fRncf9H1Iunzl+x3J3/0973z5fILk4OtMq3MKUFjdj2r+hqwU893+Yaza7l06Jm+dODTXhPA0T+JL4gaWHE4Ci9SsX85uvpZR++Tfx3CB7uXvOKGATmVYkAMndNCOBCbHz1/zz/Fg4Awu4aAPap/DqWsoVXajuYBSBNpaxpFWeioX65PPEPgn+HHmtjn2c647vwdv3iBopTJJlipoW94vkTJe4tpO1e7DA5EPnzdxJoRyXGbipfCRlfblcurQP+hXZHobfqmzMuyEPp4t7b5oiYpwzNnM4/sh9NxTpj/a4urjnIwg8yzLNvdletAuME0oQu4DkcWpPKhyDpelAPtdhDka2YID/WhUfg+gHKpIjKU271eoUwhScCcW1cBY41htaSNftJq96r77piMYo6EAAuf4X++MIT5LiwsYs/qzjOrmQm5pdSeAmR9f1fkqsIAv/TDhgAgIC0zAmvUJfkxIEHOMn4y5i5qZqlDS/Nvd/ZWl0lMjPSJaxd1pm3echWZ8/+gPKMib5sSO2eYYOMq/DR6k2ILThbHJp1G6gqcyD/LymNO7BrCIDfGEgp+fCBFXYBjC6+Otkukcvxs1uJsirwWbYLaoC25iYChdhwmoOys8=',
153 version: '0.2', 150 version: '0.2',
154 creationDate: 'Wed Mar 14 15:46:44 CET 2007', 151 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
155 updateDate: 'Wed Mar 14 15:46:44 CET 2007', 152 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
156 accessDate: 'Mon Jan 19 16:10:04 CET 2009' 153 accessDate: 'Mon Jan 19 16:10:04 CET 2009'
157 }, 154 },
158 /* 15 */ 'fe21497ef7435d31f9746c132e4b5ecf5aac5f13b5961ddb55d2bdc3409f28f6': { 155 /* 15 */ 'fe21497ef7435d31f9746c132e4b5ecf5aac5f13b5961ddb55d2bdc3409f28f6': {
159 data: '4zgqvaaWm7nJO09LKN6o5hbWwGzOv7VVmXDu5T+JCHTSOXbteogax2Zrv0uKLkfooGFThJBk0rXfXxE64vMOq3AeHXGw7Chg7hz8Z2Lpjr4FfE6q7Em7UuAlAuL1PiyXXJJK5iSsRY9tkizuYl19aXW+CgpPznYD/PyXgeYxqt9WLqK8cl5iAU87R0cQDhwl16ivzVgiiFeaB6B5FQqWBAHCEgXhqTsaw2gv4snbmPOqcUZbHy/Vb9hv4lPBJwGFNxQzeZUad92VBC8YbIjmbohDsXjteqD2/k1qOgpUB/U5BpyVwsi+5ahgb8gbS+AqYoRDYzkaj83ksPI4JzWyZhpqjhDauaI6M7hGnJ4GB8UZc0M3WPgrlf1r+TXCgpcfembqL1MyteM+C+ItPRP/QdaIXxLOmvGFOBKQYEI7UceUWBCSEzORlS2S2lltlqt+K4B8QTULiKaXCfRmF/u60FpJufIkUX0pE/rQVChxswSWvh7uJFDBIDx8MplTX724A7DN5d4/Ad4Yi2cj3V8X/DEErnHTvirP3tZ2F2oAe7kIdu+JuCqKcMaGB4hVijzv+yim2TCPvrGTFaMmg9PvcWHpik9jEIabCkdqAR8EGIkD29+yvG4vD0DTRKv2vPIfr60ZQnsgs8nlPPoNa6lNHvI/EO0nBGBYBc1TW+syV5h/zOG3rHX0XCHhISZmDMjra7eUETWChncR88P7ciC4yJQtzXFGzeXp2ktzZ8m5g1EQfgtlUVZsHN8e4OQ9DjKt0unfq5RFBj2jlG8TBZn6ZpebxWR2qOxp81KQLHJND9zRTy3h65+k5wo3MnnxE3GbeXg2dFIORRvGUT6bWsqW1fqR/pg1GO8KNtrt3CryZofgE52kuk6hlcmSk9974JR5523+1/hbts8n5VrTi1C6GWhnxpiJb1XIvICdag5g7C2iYppzLKVzbJcFMegwDUrapbmGhkqnGwSY1EQSDyagPr2xlziWhdWdCOVAYcyw8dOpdD97QhVef0OWrJ8nbgFKD6wn21475OFxooheWiMCyZwXqESVG1cVCjeaCsymBtEVPpmQdSkOfMdXpKVF+3osb4K2XDpPeU1zPWVozeMp68YhLztQ/g==', 156 data: '4zgqvaaWm7nJO09LKN6o5hbWwGzOv7VVmXDu5T+JCHTSOXbteogax2Zrv0uKLkfooGFThJBk0rXfXxE64vMOq3AeHXGw7Chg7hz8Z2Lpjr4FfE6q7Em7UuAlAuL1PiyXXJJK5iSsRY9tkizuYl19aXW+CgpPznYD/PyXgeYxqt9WLqK8cl5iAU87R0cQDhwl16ivzVgiiFeaB6B5FQqWBAHCEgXhqTsaw2gv4snbmPOqcUZbHy/Vb9hv4lPBJwGFNxQzeZUad92VBC8YbIjmbohDsXjteqD2/k1qOgpUB/U5BpyVwsi+5ahgb8gbS+AqYoRDYzkaj83ksPI4JzWyZhpqjhDauaI6M7hGnJ4GB8UZc0M3WPgrlf1r+TXCgpcfembqL1MyteM+C+ItPRP/QdaIXxLOmvGFOBKQYEI7UceUWBCSEzORlS2S2lltlqt+K4B8QTULiKaXCfRmF/u60FpJufIkUX0pE/rQVChxswSWvh7uJFDBIDx8MplTX724A7DN5d4/Ad4Yi2cj3V8X/DEErnHTvirP3tZ2F2oAe7kIdu+JuCqKcMaGB4hVijzv+yim2TCPvrGTFaMmg9PvcWHpik9jEIabCkdqAR8EGIkD29+yvG4vD0DTRKv2vPIfr60ZQnsgs8nlPPoNa6lNHvI/EO0nBGBYBc1TW+syV5h/zOG3rHX0XCHhISZmDMjra7eUETWChncR88P7ciC4yJQtzXFGzeXp2ktzZ8m5g1EQfgtlUVZsHN8e4OQ9DjKt0unfq5RFBj2jlG8TBZn6ZpebxWR2qOxp81KQLHJND9zRTy3h65+k5wo3MnnxE3GbeXg2dFIORRvGUT6bWsqW1fqR/pg1GO8KNtrt3CryZofgE52kuk6hlcmSk9974JR5523+1/hbts8n5VrTi1C6GWhnxpiJb1XIvICdag5g7C2iYppzLKVzbJcFMegwDUrapbmGhkqnGwSY1EQSDyagPr2xlziWhdWdCOVAYcyw8dOpdD97QhVef0OWrJ8nbgFKD6wn21475OFxooheWiMCyZwXqESVG1cVCjeaCsymBtEVPpmQdSkOfMdXpKVF+3osb4K2XDpPeU1zPWVozeMp68YhLztQ/g==',
160 version: '0.2', 157 version: '0.2',
161 creationDate: 'Wed Mar 14 15:46:44 CET 2007', 158 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
162 updateDate: 'Wed Mar 14 15:46:44 CET 2007', 159 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
163 accessDate: 'Mon Jan 19 16:10:04 CET 2009' 160 accessDate: 'Mon Jan 19 16:10:04 CET 2009'
164 } 161 }
165 } 162 }
166 } 163 }
167 } 164 }
168 }, 165 },
169 166
170 //------------------------------------------------------------------------- 167 //-------------------------------------------------------------------------
171 'syntaxFix': "" 168 'syntaxFix': ""
172}); 169});
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.html b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.html
index f77bcb6..a651830 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.html
+++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.html
@@ -1,106 +1,103 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27--> 24-->
28 25
29<html> 26<html>
30<head> 27<head>
31 <title>Clipperz.PM.DataModel.User - test</title> 28 <title>Clipperz.PM.DataModel.User - test</title>
32 29
33 <script type="text/javascript" src="../../../../../js/MochiKit/MochiKit.js"></script> 30 <script type="text/javascript" src="../../../../../js/MochiKit/MochiKit.js"></script>
34 <script type="text/javascript" src="../../../../SimpleTest/SimpleTest.js"></script> 31 <script type="text/javascript" src="../../../../SimpleTest/SimpleTest.js"></script>
35 <link rel="stylesheet" type="text/css" href="../../../../SimpleTest/test.css"> 32 <link rel="stylesheet" type="text/css" href="../../../../SimpleTest/test.css">
36 33
37 <script type='text/javascript' src='../../../../../js/JSON/json2.js'></script> 34 <script type='text/javascript' src='../../../../../js/JSON/json2.js'></script>
38 35
39 <script type='text/javascript' src='../../../../../js/Clipperz/YUI/Utils.js'></script> 36 <script type='text/javascript' src='../../../../../js/Clipperz/YUI/Utils.js'></script>
40 <script type='text/javascript' src='../../../../../js/Clipperz/Base.js'></script> 37 <script type='text/javascript' src='../../../../../js/Clipperz/Base.js'></script>
41 <script type='text/javascript' src='../../../../../js/Clipperz/Date.js'></script> 38 <script type='text/javascript' src='../../../../../js/Clipperz/Date.js'></script>
42 <script type='text/javascript' src='../../../../../js/Clipperz/ByteArray.js'></script> 39 <script type='text/javascript' src='../../../../../js/Clipperz/ByteArray.js'></script>
43 <script type='text/javascript' src='../../../../../js/Clipperz/Logging.js'></script> 40 <script type='text/javascript' src='../../../../../js/Clipperz/Logging.js'></script>
44 <script type='text/javascript' src='../../../../../js/Clipperz/Async.js'></script> 41 <script type='text/javascript' src='../../../../../js/Clipperz/Async.js'></script>
45 <script type='text/javascript' src='../../../../../js/Clipperz/Signal.js'></script> 42 <script type='text/javascript' src='../../../../../js/Clipperz/Signal.js'></script>
46 <script type='text/javascript' src='../../../../../js/Clipperz/KeyValueObjectStore.js'></script> 43 <script type='text/javascript' src='../../../../../js/Clipperz/KeyValueObjectStore.js'></script>
47 44
48 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/Base.js'></script> 45 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/Base.js'></script>
49 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/BigInt.js'></script> 46 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/BigInt.js'></script>
50 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/AES.js'></script> 47 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/AES.js'></script>
51 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/SHA.js'></script> 48 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/SHA.js'></script>
52 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/PRNG.js'></script> 49 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/PRNG.js'></script>
53 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/SRP.js'></script> 50 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/SRP.js'></script>
54 51
55 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Toll.js'></script> 52 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Toll.js'></script>
56 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy.js'></script> 53 <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> 54 <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> 55 <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> 56 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script>
60 57
61 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Connection.js'></script> 58 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Connection.js'></script>
62 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Crypto.js'></script> 59 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Crypto.js'></script>
63 60
64 <script type='text/javascript' src='../../../../../js/Clipperz/PM/UI/Common/Controllers/DirectLoginRunner.js'></script> 61 <script type='text/javascript' src='../../../../../js/Clipperz/PM/UI/Common/Controllers/DirectLoginRunner.js'></script>
65 62
66 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Strings.js'></script> 63 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Strings.js'></script>
67 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script> 64 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script>
68 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Date.js'></script> 65 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Date.js'></script>
69 <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>
70 <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>
71 <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>
72 <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>
73 <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>
74 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLoginInput.js'></script> 71 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLoginInput.js'></script>
75 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLoginBinding.js'></script> 72 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLoginBinding.js'></script>
76 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLoginFormValue.js'></script> 73 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLoginFormValue.js'></script>
77 <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>
78 <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>
79 <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>
80 <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>
81 <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>
82 <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>
83 80
84 <script type="text/javascript" src="../../../../SimpleTest/SimpleTest.Async.js"></script> 81 <script type="text/javascript" src="../../../../SimpleTest/SimpleTest.Async.js"></script>
85<script> 82<script>
86 Clipperz_IEisBroken = false; 83 Clipperz_IEisBroken = false;
87</script> 84</script>
88 85
89<!--[if IE]><script> 86<!--[if IE]><script>
90Clipperz_IEisBroken = true; 87Clipperz_IEisBroken = true;
91Clipperz_normalizedNewLine = '\x0d\x0a'; 88Clipperz_normalizedNewLine = '\x0d\x0a';
92</script><![endif]--> 89</script><![endif]-->
93 90
94</head> 91</head>
95<body> 92<body>
96 93
97<pre id="test"> 94<pre id="test">
98<script> 95<script>
99 Clipperz.PM.Strings.Languages.setSelectedLanguage('en-us'); 96 Clipperz.PM.Strings.Languages.setSelectedLanguage('en-us');
100</script> 97</script>
101<script type="text/javascript" src="User.data.js"></script> 98<script type="text/javascript" src="User.data.js"></script>
102<script type="text/javascript" src="User.data.old.js"></script> 99<script type="text/javascript" src="User.data.old.js"></script>
103<script type="text/javascript" src="User.test.js"></script> 100<script type="text/javascript" src="User.test.js"></script>
104</pre> 101</pre>
105</body> 102</body>
106</html> 103</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 4e7a21f..c9ca3d6 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.test.js
+++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.test.js
@@ -1,408 +1,405 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); 26Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
30 27
31var tests = { 28var tests = {
32 29
33 //------------------------------------------------------------------------- 30 //-------------------------------------------------------------------------
34 31
35 'invertIndex_test': function (someTestArgs) { 32 'invertIndex_test': function (someTestArgs) {
36 var testIndex; 33 var testIndex;
37 var invertedIndex; 34 var invertedIndex;
38 35
39 testIndex = { 36 testIndex = {
40 'key1': 'value1', 37 'key1': 'value1',
41 'key2': 'value2', 38 'key2': 'value2',
42 'key3': 'value3', 39 'key3': 'value3',
43 'key4': 'value4', 40 'key4': 'value4',
44 'key5': 'value5' 41 'key5': 'value5'
45 }; 42 };
46 43
47 invertedIndex = Clipperz.PM.DataModel.User.Header.RecordIndex.invertIndex(testIndex); 44 invertedIndex = Clipperz.PM.DataModel.User.Header.RecordIndex.invertIndex(testIndex);
48 45
49 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"); 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");
50 SimpleTest.is(invertedIndex['value1'], 'key1', "the first element has been correctly inverted"); 47 SimpleTest.is(invertedIndex['value1'], 'key1', "the first element has been correctly inverted");
51 SimpleTest.is(invertedIndex['value2'], 'key2', "the second element has been correctly inverted"); 48 SimpleTest.is(invertedIndex['value2'], 'key2', "the second element has been correctly inverted");
52 SimpleTest.is(invertedIndex['value3'], 'key3', "the third element has been correctly inverted"); 49 SimpleTest.is(invertedIndex['value3'], 'key3', "the third element has been correctly inverted");
53 SimpleTest.is(invertedIndex['value4'], 'key4', "the forth element has been correctly inverted"); 50 SimpleTest.is(invertedIndex['value4'], 'key4', "the forth element has been correctly inverted");
54 SimpleTest.is(invertedIndex['value5'], 'key5', "the fifth element has been correctly inverted"); 51 SimpleTest.is(invertedIndex['value5'], 'key5', "the fifth element has been correctly inverted");
55 return MochiKit.Async.succeed('done'); 52 return MochiKit.Async.succeed('done');
56 }, 53 },
57 54
58 //------------------------------------------------------------------------- 55 //-------------------------------------------------------------------------
59 56
60 'joe_clipperz_offline_copy_test': function(someTestArgs) { 57 'joe_clipperz_offline_copy_test': function(someTestArgs) {
61 var deferredResult; 58 var deferredResult;
62 var proxy; 59 var proxy;
63 var user; 60 var user;
64 61
65 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true}); 62 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true});
66 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); 63 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
67 64
68 deferredResult = new Clipperz.Async.Deferred("joe_clipperz_offline_copy_test", someTestArgs); 65 deferredResult = new Clipperz.Async.Deferred("joe_clipperz_offline_copy_test", someTestArgs);
69 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); 66 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
70 deferredResult.addMethod(user, 'login'); 67 deferredResult.addMethod(user, 'login');
71 deferredResult.addMethod(user, 'getRecords'); 68 deferredResult.addMethod(user, 'getRecords');
72 deferredResult.addCallback(function (someRecords) { 69 deferredResult.addCallback(function (someRecords) {
73 is(someRecords.length, 20,"joe_clipperz_offline_copy_test - joe has 20 records"); 70 is(someRecords.length, 20,"joe_clipperz_offline_copy_test - joe has 20 records");
74 }); 71 });
75 72
76 deferredResult.addMethod(user, 'getRecords'); 73 deferredResult.addMethod(user, 'getRecords');
77 deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.methodcaller('label')); 74 deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.methodcaller('label'));
78 deferredResult.addCallback(Clipperz.Async.collectAll); 75 deferredResult.addCallback(Clipperz.Async.collectAll);
79 deferredResult.addCallback(MochiKit.Base.methodcaller('sort')); 76 deferredResult.addCallback(MochiKit.Base.methodcaller('sort'));
80 deferredResult.addCallback(function (someSortedLabels) { 77 deferredResult.addCallback(function (someSortedLabels) {
81 SimpleTest.is(someSortedLabels.length, 20, "We got all the labels"); 78 SimpleTest.is(someSortedLabels.length, 20, "We got all the labels");
82 SimpleTest.is(someSortedLabels[0], "Amazon.com", "The first label is correct"); 79 SimpleTest.is(someSortedLabels[0], "Amazon.com", "The first label is correct");
83 SimpleTest.is(someSortedLabels[1], "American Airlines", "The second label is correct"); 80 SimpleTest.is(someSortedLabels[1], "American Airlines", "The second label is correct");
84 SimpleTest.is(someSortedLabels[2], "Bloglines", "The third label is correct"); 81 SimpleTest.is(someSortedLabels[2], "Bloglines", "The third label is correct");
85 SimpleTest.is(someSortedLabels[3], "Digg", "The fourth label is correct"); 82 SimpleTest.is(someSortedLabels[3], "Digg", "The fourth label is correct");
86 SimpleTest.is(someSortedLabels[4], "Example Attack", "The fifth label is correct"); 83 SimpleTest.is(someSortedLabels[4], "Example Attack", "The fifth label is correct");
87 SimpleTest.is(someSortedLabels[5], "Expedia.com", "The sixth label is correct"); 84 SimpleTest.is(someSortedLabels[5], "Expedia.com", "The sixth label is correct");
88 SimpleTest.is(someSortedLabels[6], "Google Account", "The seventh label is correct"); 85 SimpleTest.is(someSortedLabels[6], "Google Account", "The seventh label is correct");
89 SimpleTest.is(someSortedLabels[7], "Home burglar alarm", "The eighth label is correct"); 86 SimpleTest.is(someSortedLabels[7], "Home burglar alarm", "The eighth label is correct");
90 SimpleTest.is(someSortedLabels[8], "Jaiku", "The ninth label is correct"); 87 SimpleTest.is(someSortedLabels[8], "Jaiku", "The ninth label is correct");
91 SimpleTest.is(someSortedLabels[9], "LinkedIn", "The 10th label is correct"); 88 SimpleTest.is(someSortedLabels[9], "LinkedIn", "The 10th label is correct");
92 SimpleTest.is(someSortedLabels[10], "Lufthansa", "The 11th label is correct"); 89 SimpleTest.is(someSortedLabels[10], "Lufthansa", "The 11th label is correct");
93 SimpleTest.is(someSortedLabels[11], "Microsoft Office CD Key","The 12th label is correct"); 90 SimpleTest.is(someSortedLabels[11], "Microsoft Office CD Key","The 12th label is correct");
94 SimpleTest.is(someSortedLabels[12], "MyBlogLog", "The 13th label is correct"); 91 SimpleTest.is(someSortedLabels[12], "MyBlogLog", "The 13th label is correct");
95 SimpleTest.is(someSortedLabels[13], "MySpace", "The 14th label is correct"); 92 SimpleTest.is(someSortedLabels[13], "MySpace", "The 14th label is correct");
96 SimpleTest.is(someSortedLabels[14], "SAP - Login", "The 15th label is correct"); 93 SimpleTest.is(someSortedLabels[14], "SAP - Login", "The 15th label is correct");
97 SimpleTest.is(someSortedLabels[15], "The New York Times", "The 16th label is correct"); 94 SimpleTest.is(someSortedLabels[15], "The New York Times", "The 16th label is correct");
98 SimpleTest.is(someSortedLabels[16], "Web password", "The 17th label is correct"); 95 SimpleTest.is(someSortedLabels[16], "Web password", "The 17th label is correct");
99 SimpleTest.is(someSortedLabels[17], "Web password", "The 18th label is correct"); 96 SimpleTest.is(someSortedLabels[17], "Web password", "The 18th label is correct");
100 SimpleTest.is(someSortedLabels[18], "Yahoo! Account", "The 19th label is correct"); 97 SimpleTest.is(someSortedLabels[18], "Yahoo! Account", "The 19th label is correct");
101 SimpleTest.is(someSortedLabels[19], "del.icio.us", "The 20th label is correct"); 98 SimpleTest.is(someSortedLabels[19], "del.icio.us", "The 20th label is correct");
102 }); 99 });
103 deferredResult.callback(); 100 deferredResult.callback();
104 101
105 return deferredResult; 102 return deferredResult;
106 }, 103 },
107 104
108 //------------------------------------------------------------------------- 105 //-------------------------------------------------------------------------
109 106
110 'joe_clipperz_offline_copy_getDirectLogins_test': function(someTestArgs) { 107 'joe_clipperz_offline_copy_getDirectLogins_test': function(someTestArgs) {
111 var deferredResult; 108 var deferredResult;
112 var proxy; 109 var proxy;
113 var user; 110 var user;
114 111
115 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true}); 112 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true});
116 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); 113 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
117 114
118 deferredResult = new Clipperz.Async.Deferred("joe_clipperz_offline_copy_getDirectLogins_test", someTestArgs); 115 deferredResult = new Clipperz.Async.Deferred("joe_clipperz_offline_copy_getDirectLogins_test", someTestArgs);
119 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); 116 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
120 deferredResult.addMethod(user, 'login'); 117 deferredResult.addMethod(user, 'login');
121 deferredResult.addMethod(user, 'getDirectLogins'); 118 deferredResult.addMethod(user, 'getDirectLogins');
122 deferredResult.addCallback(function (someDirectLogins) { 119 deferredResult.addCallback(function (someDirectLogins) {
123 SimpleTest.is(someDirectLogins.length, 22,"joe has 22 direct logins"); 120 SimpleTest.is(someDirectLogins.length, 22,"joe has 22 direct logins");
124 }); 121 });
125 122
126 deferredResult.addMethod(user, 'getDirectLogins'); 123 deferredResult.addMethod(user, 'getDirectLogins');
127 deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.methodcaller('label')); 124 deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.methodcaller('label'));
128 deferredResult.addCallback(Clipperz.Async.collectAll); 125 deferredResult.addCallback(Clipperz.Async.collectAll);
129 deferredResult.addCallback(MochiKit.Base.methodcaller('sort')); 126 deferredResult.addCallback(MochiKit.Base.methodcaller('sort'));
130 deferredResult.addCallback(function (someSortedLabels) { 127 deferredResult.addCallback(function (someSortedLabels) {
131 SimpleTest.is(someSortedLabels.length, 22, "We got all the labels"); 128 SimpleTest.is(someSortedLabels.length, 22, "We got all the labels");
132 SimpleTest.is(someSortedLabels[0], "Amazon.com", "The first label is correct"); 129 SimpleTest.is(someSortedLabels[0], "Amazon.com", "The first label is correct");
133 SimpleTest.is(someSortedLabels[1], "American Airlines","The second label is correct"); 130 SimpleTest.is(someSortedLabels[1], "American Airlines","The second label is correct");
134 SimpleTest.is(someSortedLabels[2], "Bloglines", "The third label is correct"); 131 SimpleTest.is(someSortedLabels[2], "Bloglines", "The third label is correct");
135 SimpleTest.is(someSortedLabels[3], "Digg", "The fourth label is correct"); 132 SimpleTest.is(someSortedLabels[3], "Digg", "The fourth label is correct");
136 SimpleTest.is(someSortedLabels[4], "Example Attack", "The 5th label is correct"); 133 SimpleTest.is(someSortedLabels[4], "Example Attack", "The 5th label is correct");
137 SimpleTest.is(someSortedLabels[5], "Expedia.com", "The 6th label is correct"); 134 SimpleTest.is(someSortedLabels[5], "Expedia.com", "The 6th label is correct");
138 SimpleTest.is(someSortedLabels[6], "Flickr", "The 7th label is correct"); 135 SimpleTest.is(someSortedLabels[6], "Flickr", "The 7th label is correct");
139 SimpleTest.is(someSortedLabels[7], "Google Account", "The 8th label is correct"); 136 SimpleTest.is(someSortedLabels[7], "Google Account", "The 8th label is correct");
140 SimpleTest.is(someSortedLabels[8], "Google Calendar", "The 9th label is correct"); 137 SimpleTest.is(someSortedLabels[8], "Google Calendar", "The 9th label is correct");
141 SimpleTest.is(someSortedLabels[9], "Google Docs", "The 10th label is correct"); 138 SimpleTest.is(someSortedLabels[9], "Google Docs", "The 10th label is correct");
142 SimpleTest.is(someSortedLabels[10], "Google Mail", "The 11th label is correct"); 139 SimpleTest.is(someSortedLabels[10], "Google Mail", "The 11th label is correct");
143 SimpleTest.is(someSortedLabels[11], "Jaiku", "The 12th label is correct"); 140 SimpleTest.is(someSortedLabels[11], "Jaiku", "The 12th label is correct");
144 SimpleTest.is(someSortedLabels[12], "LinkedIn", "The 13th label is correct"); 141 SimpleTest.is(someSortedLabels[12], "LinkedIn", "The 13th label is correct");
145 SimpleTest.is(someSortedLabels[13], "Lufthansa", "The 14th label is correct"); 142 SimpleTest.is(someSortedLabels[13], "Lufthansa", "The 14th label is correct");
146 SimpleTest.is(someSortedLabels[14], "My Yahoo!", "The 15th label is correct"); 143 SimpleTest.is(someSortedLabels[14], "My Yahoo!", "The 15th label is correct");
147 SimpleTest.is(someSortedLabels[15], "MyBlogLog", "The 16th label is correct"); 144 SimpleTest.is(someSortedLabels[15], "MyBlogLog", "The 16th label is correct");
148 SimpleTest.is(someSortedLabels[16], "MySpace", "The 17th label is correct"); 145 SimpleTest.is(someSortedLabels[16], "MySpace", "The 17th label is correct");
149 SimpleTest.is(someSortedLabels[17], "SAP - Login", "The 18th label is correct"); 146 SimpleTest.is(someSortedLabels[17], "SAP - Login", "The 18th label is correct");
150 SimpleTest.is(someSortedLabels[18], "SAP - Login", "The 19th label is correct"); 147 SimpleTest.is(someSortedLabels[18], "SAP - Login", "The 19th label is correct");
151 SimpleTest.is(someSortedLabels[19], "The New York Times","The 20th label is correct"); 148 SimpleTest.is(someSortedLabels[19], "The New York Times","The 20th label is correct");
152 SimpleTest.is(someSortedLabels[20], "Yahoo! Groups", "The 21st label is correct"); 149 SimpleTest.is(someSortedLabels[20], "Yahoo! Groups", "The 21st label is correct");
153 SimpleTest.is(someSortedLabels[21], "Yahoo! Mail", "The 22nd label is correct"); 150 SimpleTest.is(someSortedLabels[21], "Yahoo! Mail", "The 22nd label is correct");
154 }); 151 });
155 152
156 deferredResult.callback(); 153 deferredResult.callback();
157 154
158 return deferredResult; 155 return deferredResult;
159 }, 156 },
160 157
161 //------------------------------------------------------------------------- 158 //-------------------------------------------------------------------------
162 159
163 'getCredentials_test': function (someTestArgs) { 160 'getCredentials_test': function (someTestArgs) {
164 var deferredResult; 161 var deferredResult;
165 var user; 162 var user;
166 163
167 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); 164 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
168 165
169 deferredResult = new Clipperz.Async.Deferred("getCredentials_test", someTestArgs); 166 deferredResult = new Clipperz.Async.Deferred("getCredentials_test", someTestArgs);
170 deferredResult.addMethod(user, 'getCredentials'); 167 deferredResult.addMethod(user, 'getCredentials');
171 deferredResult.addCallback(function(aResult) { 168 deferredResult.addCallback(function(aResult) {
172 SimpleTest.is(aResult.username, 'joe', "the username of the credentaials is correct"); 169 SimpleTest.is(aResult.username, 'joe', "the username of the credentaials is correct");
173 SimpleTest.is(aResult.password, 'clipperz', "the password of the credentaials is correct"); 170 SimpleTest.is(aResult.password, 'clipperz', "the password of the credentaials is correct");
174 }) 171 })
175 deferredResult.callback(); 172 deferredResult.callback();
176 173
177 return deferredResult; 174 return deferredResult;
178 }, 175 },
179 176
180 //------------------------------------------------------------------------- 177 //-------------------------------------------------------------------------
181 178
182 'loginWithOfflineData_test': function (someTestArgs) { 179 'loginWithOfflineData_test': function (someTestArgs) {
183 var deferredResult; 180 var deferredResult;
184 var user; 181 var user;
185 var proxy; 182 var proxy;
186 183
187 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true}); 184 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true});
188 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); 185 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
189 186
190 deferredResult = new Clipperz.Async.Deferred("loginWithOfflineData_test", someTestArgs); 187 deferredResult = new Clipperz.Async.Deferred("loginWithOfflineData_test", someTestArgs);
191 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); 188 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
192 deferredResult.addMethod(user, 'login'); 189 deferredResult.addMethod(user, 'login');
193 deferredResult.addCallback(function(aResult) { 190 deferredResult.addCallback(function(aResult) {
194 SimpleTest.is(aResult.result, 'done', "successfully logged in"); 191 SimpleTest.is(aResult.result, 'done', "successfully logged in");
195 }) 192 })
196 deferredResult.callback(); 193 deferredResult.callback();
197 194
198 return deferredResult; 195 return deferredResult;
199 }, 196 },
200 197
201 //------------------------------------------------------------------------- 198 //-------------------------------------------------------------------------
202 199
203 'getRecords_fromOfflineData_OLD_test': function (someTestArgs) { 200 'getRecords_fromOfflineData_OLD_test': function (someTestArgs) {
204 var deferredResult; 201 var deferredResult;
205 var user; 202 var user;
206 var proxy; 203 var proxy;
207 204
208 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true}); 205 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true});
209 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); 206 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
210 207
211 deferredResult = new Clipperz.Async.Deferred("getRecords_fromOfflineData_OLD_test", someTestArgs); 208 deferredResult = new Clipperz.Async.Deferred("getRecords_fromOfflineData_OLD_test", someTestArgs);
212 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['OLD_joe_clipperz_offline_copy_data']); 209 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['OLD_joe_clipperz_offline_copy_data']);
213 deferredResult.addMethod(user, 'login'); 210 deferredResult.addMethod(user, 'login');
214 deferredResult.addCallback(function(aResult) { 211 deferredResult.addCallback(function(aResult) {
215 SimpleTest.is(aResult.result, 'done', "successfully logged in"); 212 SimpleTest.is(aResult.result, 'done', "successfully logged in");
216 }); 213 });
217 deferredResult.addMethod(user, 'getRecords'); 214 deferredResult.addMethod(user, 'getRecords');
218 deferredResult.addCallback(function(someRecords) { 215 deferredResult.addCallback(function(someRecords) {
219 SimpleTest.is(someRecords.length, 15, "the OLD test user has just 15 records"); 216 SimpleTest.is(someRecords.length, 15, "the OLD test user has just 15 records");
220 }); 217 });
221 deferredResult.addMethod(user, 'getRecords'); 218 deferredResult.addMethod(user, 'getRecords');
222 deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.methodcaller('label')); 219 deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.methodcaller('label'));
223 deferredResult.addCallback(Clipperz.Async.collectAll); 220 deferredResult.addCallback(Clipperz.Async.collectAll);
224 deferredResult.addCallback(MochiKit.Base.methodcaller('sort')); 221 deferredResult.addCallback(MochiKit.Base.methodcaller('sort'));
225 deferredResult.addCallback(function (someSortedLabels) { 222 deferredResult.addCallback(function (someSortedLabels) {
226 SimpleTest.is(someSortedLabels.length, 15, "We got all the labels"); 223 SimpleTest.is(someSortedLabels.length, 15, "We got all the labels");
227 SimpleTest.is(someSortedLabels[0], "Amazon.com", "The first label is correct"); 224 SimpleTest.is(someSortedLabels[0], "Amazon.com", "The first label is correct");
228 SimpleTest.is(someSortedLabels[1], "American Airlines","The second label is correct"); 225 SimpleTest.is(someSortedLabels[1], "American Airlines","The second label is correct");
229 SimpleTest.is(someSortedLabels[2], "Bloglines", "The third label is correct"); 226 SimpleTest.is(someSortedLabels[2], "Bloglines", "The third label is correct");
230 SimpleTest.is(someSortedLabels[3], "Digg", "The fourth label is correct"); 227 SimpleTest.is(someSortedLabels[3], "Digg", "The fourth label is correct");
231 SimpleTest.is(someSortedLabels[4], "Expedia.com", "The fifth label is correct"); 228 SimpleTest.is(someSortedLabels[4], "Expedia.com", "The fifth label is correct");
232 SimpleTest.is(someSortedLabels[5], "Google Account","The sixth label is correct"); 229 SimpleTest.is(someSortedLabels[5], "Google Account","The sixth label is correct");
233 SimpleTest.is(someSortedLabels[6], "Home burglar alarm","The seventh label is correct"); 230 SimpleTest.is(someSortedLabels[6], "Home burglar alarm","The seventh label is correct");
234 }); 231 });
235/* 232/*
236*/ 233*/
237 deferredResult.callback(); 234 deferredResult.callback();
238 235
239 return deferredResult; 236 return deferredResult;
240 }, 237 },
241 238
242 //------------------------------------------------------------------------- 239 //-------------------------------------------------------------------------
243 240
244 'getDirectLogins_fromOfflineData_OLD_test': function (someTestArgs) { 241 'getDirectLogins_fromOfflineData_OLD_test': function (someTestArgs) {
245 var deferredResult; 242 var deferredResult;
246 var user; 243 var user;
247 var proxy; 244 var proxy;
248 245
249 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true}); 246 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true});
250 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); 247 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
251 248
252 deferredResult = new Clipperz.Async.Deferred("getRecords_fromOfflineData_OLD_test", someTestArgs); 249 deferredResult = new Clipperz.Async.Deferred("getRecords_fromOfflineData_OLD_test", someTestArgs);
253 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['OLD_joe_clipperz_offline_copy_data']); 250 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['OLD_joe_clipperz_offline_copy_data']);
254 deferredResult.addMethod(user, 'login'); 251 deferredResult.addMethod(user, 'login');
255 deferredResult.addCallback(function(aResult) { 252 deferredResult.addCallback(function(aResult) {
256 SimpleTest.is(aResult.result, 'done', "successfully logged in"); 253 SimpleTest.is(aResult.result, 'done', "successfully logged in");
257 }); 254 });
258 deferredResult.addMethod(user, 'getDirectLogins'); 255 deferredResult.addMethod(user, 'getDirectLogins');
259 deferredResult.addCallback(function(someDirectLogins) { 256 deferredResult.addCallback(function(someDirectLogins) {
260 SimpleTest.is(someDirectLogins.length, 17, "the OLD test user has 17 direct logins"); 257 SimpleTest.is(someDirectLogins.length, 17, "the OLD test user has 17 direct logins");
261 }); 258 });
262 deferredResult.addMethod(user, 'getDirectLogins'); 259 deferredResult.addMethod(user, 'getDirectLogins');
263 deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.methodcaller('label')); 260 deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.methodcaller('label'));
264 deferredResult.addCallback(Clipperz.Async.collectAll); 261 deferredResult.addCallback(Clipperz.Async.collectAll);
265 deferredResult.addCallback(MochiKit.Base.methodcaller('sort')); 262 deferredResult.addCallback(MochiKit.Base.methodcaller('sort'));
266 deferredResult.addCallback(function (someSortedLabels) { 263 deferredResult.addCallback(function (someSortedLabels) {
267 SimpleTest.is(someSortedLabels.length, 17, "We got all the labels"); 264 SimpleTest.is(someSortedLabels.length, 17, "We got all the labels");
268 SimpleTest.is(someSortedLabels[0], "Amazon.com", "The first label is correct"); 265 SimpleTest.is(someSortedLabels[0], "Amazon.com", "The first label is correct");
269 SimpleTest.is(someSortedLabels[1], "American Airlines","The second label is correct"); 266 SimpleTest.is(someSortedLabels[1], "American Airlines","The second label is correct");
270 SimpleTest.is(someSortedLabels[2], "Bloglines", "The third label is correct"); 267 SimpleTest.is(someSortedLabels[2], "Bloglines", "The third label is correct");
271 SimpleTest.is(someSortedLabels[3], "Digg", "The fourth label is correct"); 268 SimpleTest.is(someSortedLabels[3], "Digg", "The fourth label is correct");
272 SimpleTest.is(someSortedLabels[4], "Expedia.com", "The fifth label is correct"); 269 SimpleTest.is(someSortedLabels[4], "Expedia.com", "The fifth label is correct");
273 SimpleTest.is(someSortedLabels[5], "Flickr", "The sixth label is correct"); 270 SimpleTest.is(someSortedLabels[5], "Flickr", "The sixth label is correct");
274 SimpleTest.is(someSortedLabels[6], "Google Calendar", "The seventh label is correct"); 271 SimpleTest.is(someSortedLabels[6], "Google Calendar", "The seventh label is correct");
275 SimpleTest.is(someSortedLabels[7], "Google Docs", "The 8th label is correct"); 272 SimpleTest.is(someSortedLabels[7], "Google Docs", "The 8th label is correct");
276 SimpleTest.is(someSortedLabels[8], "Google Mail", "The 9th label is correct"); 273 SimpleTest.is(someSortedLabels[8], "Google Mail", "The 9th label is correct");
277 SimpleTest.is(someSortedLabels[9], "LinkedIn", "The 10th label is correct"); 274 SimpleTest.is(someSortedLabels[9], "LinkedIn", "The 10th label is correct");
278 SimpleTest.is(someSortedLabels[10], "Lufthansa", "The 11th label is correct"); 275 SimpleTest.is(someSortedLabels[10], "Lufthansa", "The 11th label is correct");
279 SimpleTest.is(someSortedLabels[11], "My Yahoo!", "The 12th label is correct"); 276 SimpleTest.is(someSortedLabels[11], "My Yahoo!", "The 12th label is correct");
280 SimpleTest.is(someSortedLabels[12], "MyBlogLog", "The 13th label is correct"); 277 SimpleTest.is(someSortedLabels[12], "MyBlogLog", "The 13th label is correct");
281 SimpleTest.is(someSortedLabels[13], "MySpace", "The 14th label is correct"); 278 SimpleTest.is(someSortedLabels[13], "MySpace", "The 14th label is correct");
282 SimpleTest.is(someSortedLabels[14], "The New York Times","The 15th label is correct"); 279 SimpleTest.is(someSortedLabels[14], "The New York Times","The 15th label is correct");
283 SimpleTest.is(someSortedLabels[15], "Yahoo! Groups", "The 16th label is correct"); 280 SimpleTest.is(someSortedLabels[15], "Yahoo! Groups", "The 16th label is correct");
284 SimpleTest.is(someSortedLabels[16], "Yahoo! Mail", "The 17th label is correct"); 281 SimpleTest.is(someSortedLabels[16], "Yahoo! Mail", "The 17th label is correct");
285 }); 282 });
286 283
287 deferredResult.callback(); 284 deferredResult.callback();
288 285
289 return deferredResult; 286 return deferredResult;
290 }, 287 },
291 288
292 //------------------------------------------------------------------------- 289 //-------------------------------------------------------------------------
293 290
294 'sortRecords_test': function (someTestArgs) { 291 'sortRecords_test': function (someTestArgs) {
295 var deferredResult; 292 var deferredResult;
296 var proxy; 293 var proxy;
297 var user; 294 var user;
298 var caseInsensitiveCompare; 295 var caseInsensitiveCompare;
299 296
300 caseInsensitiveCompare = function (aValue, bValue) { 297 caseInsensitiveCompare = function (aValue, bValue) {
301 return MochiKit.Base.compare(aValue.toLowerCase(), bValue.toLowerCase()); 298 return MochiKit.Base.compare(aValue.toLowerCase(), bValue.toLowerCase());
302 }; 299 };
303 300
304 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true}); 301 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true});
305 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); 302 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
306 303
307 deferredResult = new Clipperz.Async.Deferred("sortRecords_test", someTestArgs); 304 deferredResult = new Clipperz.Async.Deferred("sortRecords_test", someTestArgs);
308 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); 305 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
309 deferredResult.addMethod(user, 'login'); 306 deferredResult.addMethod(user, 'login');
310 307
311 deferredResult.addMethod(user, 'getRecords'); 308 deferredResult.addMethod(user, 'getRecords');
312 deferredResult.addCallback(Clipperz.Async.deferredSort, function (aRecord, bRecord) { 309 deferredResult.addCallback(Clipperz.Async.deferredSort, function (aRecord, bRecord) {
313 return Clipperz.Async.deferredCompare(MochiKit.Base.compare, aRecord.label(), bRecord.label()); 310 return Clipperz.Async.deferredCompare(MochiKit.Base.compare, aRecord.label(), bRecord.label());
314 }); 311 });
315 deferredResult.addCallback(MochiKit.Base.itemgetter('0')); 312 deferredResult.addCallback(MochiKit.Base.itemgetter('0'));
316 deferredResult.addCallback(MochiKit.Base.methodcaller('label')); 313 deferredResult.addCallback(MochiKit.Base.methodcaller('label'));
317 deferredResult.addTest("Amazon.com", "Sorting the records themselves (by labels), the first one is 'Amazon.com'"); 314 deferredResult.addTest("Amazon.com", "Sorting the records themselves (by labels), the first one is 'Amazon.com'");
318 315
319 deferredResult.addMethod(user, 'getRecords'); 316 deferredResult.addMethod(user, 'getRecords');
320 deferredResult.addCallback(Clipperz.Async.deferredSort, function (aRecord, bRecord) { 317 deferredResult.addCallback(Clipperz.Async.deferredSort, function (aRecord, bRecord) {
321 return Clipperz.Async.deferredCompare(MochiKit.Base.compare, aRecord.label(), bRecord.label()); 318 return Clipperz.Async.deferredCompare(MochiKit.Base.compare, aRecord.label(), bRecord.label());
322 }); 319 });
323 deferredResult.addCallback(MochiKit.Base.itemgetter('5')); 320 deferredResult.addCallback(MochiKit.Base.itemgetter('5'));
324 deferredResult.addCallback(MochiKit.Base.methodcaller('label')); 321 deferredResult.addCallback(MochiKit.Base.methodcaller('label'));
325 deferredResult.addTest("Expedia.com", "Sorting the records themselves (by labels), the sixth element is 'Expedia.com'"); 322 deferredResult.addTest("Expedia.com", "Sorting the records themselves (by labels), the sixth element is 'Expedia.com'");
326 323
327 deferredResult.addMethod(user, 'getRecords'); 324 deferredResult.addMethod(user, 'getRecords');
328 deferredResult.addCallback(Clipperz.Async.deferredSort, function (aRecord, bRecord) { 325 deferredResult.addCallback(Clipperz.Async.deferredSort, function (aRecord, bRecord) {
329 return Clipperz.Async.deferredCompare(MochiKit.Base.compare, aRecord.label(), bRecord.label()); 326 return Clipperz.Async.deferredCompare(MochiKit.Base.compare, aRecord.label(), bRecord.label());
330 }); 327 });
331 deferredResult.addCallback(MochiKit.Base.itemgetter('19')); 328 deferredResult.addCallback(MochiKit.Base.itemgetter('19'));
332 deferredResult.addCallback(MochiKit.Base.methodcaller('label')); 329 deferredResult.addCallback(MochiKit.Base.methodcaller('label'));
333 deferredResult.addTest("del.icio.us", "Sorting the records themselves (by labels), the 20th element is 'del.icio.us'"); 330 deferredResult.addTest("del.icio.us", "Sorting the records themselves (by labels), the 20th element is 'del.icio.us'");
334 331
335 332
336 333
337 deferredResult.addMethod(user, 'getRecords'); 334 deferredResult.addMethod(user, 'getRecords');
338 deferredResult.addCallback(Clipperz.Async.deferredSort, function (aRecord, bRecord) { 335 deferredResult.addCallback(Clipperz.Async.deferredSort, function (aRecord, bRecord) {
339 return Clipperz.Async.deferredCompare(caseInsensitiveCompare, aRecord.label(), bRecord.label()); 336 return Clipperz.Async.deferredCompare(caseInsensitiveCompare, aRecord.label(), bRecord.label());
340 }); 337 });
341 deferredResult.addCallback(MochiKit.Base.itemgetter('3')); 338 deferredResult.addCallback(MochiKit.Base.itemgetter('3'));
342 deferredResult.addCallback(MochiKit.Base.methodcaller('label')); 339 deferredResult.addCallback(MochiKit.Base.methodcaller('label'));
343 deferredResult.addTest("del.icio.us", "Sorting with case insensitive mode (by labels), the fourth record is 'del.ico.us'"); 340 deferredResult.addTest("del.icio.us", "Sorting with case insensitive mode (by labels), the fourth record is 'del.ico.us'");
344 341
345 deferredResult.addMethod(user, 'getRecords'); 342 deferredResult.addMethod(user, 'getRecords');
346 deferredResult.addCallback(Clipperz.Async.deferredSort, function (aRecord, bRecord) { 343 deferredResult.addCallback(Clipperz.Async.deferredSort, function (aRecord, bRecord) {
347 return Clipperz.Async.deferredCompare(caseInsensitiveCompare, aRecord.label(), bRecord.label()); 344 return Clipperz.Async.deferredCompare(caseInsensitiveCompare, aRecord.label(), bRecord.label());
348 }); 345 });
349 deferredResult.addCallback(MochiKit.Base.itemgetter('19')); 346 deferredResult.addCallback(MochiKit.Base.itemgetter('19'));
350 deferredResult.addCallback(MochiKit.Base.methodcaller('label')); 347 deferredResult.addCallback(MochiKit.Base.methodcaller('label'));
351 deferredResult.addTest("Yahoo! Account", "Sorting with case insensitive mode (by labels), the 20th record is 'Yahoo! Account'"); 348 deferredResult.addTest("Yahoo! Account", "Sorting with case insensitive mode (by labels), the 20th record is 'Yahoo! Account'");
352 349
353 deferredResult.callback(); 350 deferredResult.callback();
354 351
355 return deferredResult; 352 return deferredResult;
356 }, 353 },
357 354
358 //------------------------------------------------------------------------- 355 //-------------------------------------------------------------------------
359 356
360 'accessToSingleRecord_test': function (someTestArgs) { 357 'accessToSingleRecord_test': function (someTestArgs) {
361 var deferredResult; 358 var deferredResult;
362 var proxy; 359 var proxy;
363 var user; 360 var user;
364 361
365 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true}); 362 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true});
366 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); 363 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
367 364
368 deferredResult = new Clipperz.Async.Deferred("sortRecords_test", someTestArgs); 365 deferredResult = new Clipperz.Async.Deferred("sortRecords_test", someTestArgs);
369 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); 366 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
370 deferredResult.addMethod(user, 'login'); 367 deferredResult.addMethod(user, 'login');
371 deferredResult.addMethod(user, 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551'); 368 deferredResult.addMethod(user, 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551');
372 deferredResult.addCallback(MochiKit.Base.methodcaller('label')); 369 deferredResult.addCallback(MochiKit.Base.methodcaller('label'));
373 deferredResult.addTest("Amazon.com", "Sorting the records themselves (by labels), the first one is 'Amazon.com'"); 370 deferredResult.addTest("Amazon.com", "Sorting the records themselves (by labels), the first one is 'Amazon.com'");
374 deferredResult.callback(); 371 deferredResult.callback();
375 372
376 return deferredResult; 373 return deferredResult;
377 }, 374 },
378 375
379 //------------------------------------------------------------------------- 376 //-------------------------------------------------------------------------
380 377
381 'accessToSingleRecordContent_test': function (someTestArgs) { 378 'accessToSingleRecordContent_test': function (someTestArgs) {
382 var deferredResult; 379 var deferredResult;
383 var proxy; 380 var proxy;
384 var user; 381 var user;
385 382
386 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true}); 383 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true});
387 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); 384 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
388 385
389 deferredResult = new Clipperz.Async.Deferred("sortRecords_test", someTestArgs); 386 deferredResult = new Clipperz.Async.Deferred("sortRecords_test", someTestArgs);
390 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); 387 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
391 deferredResult.addMethod(user, 'login'); 388 deferredResult.addMethod(user, 'login');
392 deferredResult.addMethod(user, 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551'); 389 deferredResult.addMethod(user, 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551');
393 deferredResult.addCallback(MochiKit.Base.methodcaller('fields')); 390 deferredResult.addCallback(MochiKit.Base.methodcaller('fields'));
394 deferredResult.addCallback(function (someRecordFields) { 391 deferredResult.addCallback(function (someRecordFields) {
395 SimpleTest.is(MochiKit.Base.keys(someRecordFields).length, 2, "The number of fields of the Amazon.com record matches"); 392 SimpleTest.is(MochiKit.Base.keys(someRecordFields).length, 2, "The number of fields of the Amazon.com record matches");
396 return someRecordFields; 393 return someRecordFields;
397 }); 394 });
398 deferredResult.addCallback(MochiKit.Base.itemgetter('5e822c34aaf1a9fbc0b52585c1915f3a3758abd51923a4d35ae85373bbb839c2')); 395 deferredResult.addCallback(MochiKit.Base.itemgetter('5e822c34aaf1a9fbc0b52585c1915f3a3758abd51923a4d35ae85373bbb839c2'));
399 deferredResult.collectResults({ 396 deferredResult.collectResults({
400 'label':MochiKit.Base.methodcaller('label'), 397 'label':MochiKit.Base.methodcaller('label'),
401 'value':MochiKit.Base.methodcaller('value') 398 'value':MochiKit.Base.methodcaller('value')
402 }) 399 })
403 deferredResult.addCallback(function (someValues) { 400 deferredResult.addCallback(function (someValues) {
404 SimpleTest.is(someValues['label'], 'email', "the first field label matches"); 401 SimpleTest.is(someValues['label'], 'email', "the first field label matches");
405 SimpleTest.is(someValues['value'], 'joe@clipperz.com',"the first field value matches"); 402 SimpleTest.is(someValues['value'], 'joe@clipperz.com',"the first field value matches");
406 }); 403 });
407 deferredResult.callback(); 404 deferredResult.callback();
408 405
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/index.html b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/index.html
index d762093..237c0ea 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/index.html
+++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/index.html
@@ -1,47 +1,44 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27--> 24-->
28 25
29<html> 26<html>
30<head> 27<head>
31 <title>Clipperz.PM.DataModel.* - tests</title> 28 <title>Clipperz.PM.DataModel.* - tests</title>
32 29
33 <script type="text/javascript" src="../../../../../js/MochiKit/MochiKit.js"></script> 30 <script type="text/javascript" src="../../../../../js/MochiKit/MochiKit.js"></script>
34 <script type="text/javascript" src="../../../../SimpleTest/TestRunner.js"></script> 31 <script type="text/javascript" src="../../../../SimpleTest/TestRunner.js"></script>
35</head> 32</head>
36<body> 33<body>
37<script> 34<script>
38TestRunner.runTests( 35TestRunner.runTests(
39 'EncryptedRemoteObject.html', 36 'EncryptedRemoteObject.html',
40 'Record.html', 37 'Record.html',
41 'DirectLogin.html', 38 'DirectLogin.html',
42 'User.html', 39 'User.html',
43 'OneTimePassword.html' 40 'OneTimePassword.html'
44); 41);
45</script> 42</script>
46</body> 43</body>
47</html> \ No newline at end of file 44</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 106774b..a606ca4 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/Date.html
+++ b/frontend/gamma/tests/tests/Clipperz/PM/Date.html
@@ -1,59 +1,56 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27--> 24-->
28 25
29<html> 26<html>
30<head> 27<head>
31 <title>Clipperz.PM.Date - test</title> 28 <title>Clipperz.PM.Date - test</title>
32 29
33 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 30 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
34 <!-- script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script --> 31 <!-- script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script -->
35 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> 32 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
36 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> 33 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
37 34
38 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script> 35 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script>
39 36
40 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> 37 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
41 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 38 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 39 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
43 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script> 40 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
44 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script> 41 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script>
45 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script> 42 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script>
46 43
47 <script type='text/javascript' src='../../../../js/Clipperz/Date.js'></script> 44 <script type='text/javascript' src='../../../../js/Clipperz/Date.js'></script>
48 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings.js'></script> 45 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings.js'></script>
49 <script type='text/javascript' src='../../../../js/Clipperz/PM/Date.js'></script> 46 <script type='text/javascript' src='../../../../js/Clipperz/PM/Date.js'></script>
50 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.Async.js"></script> 47 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.Async.js"></script>
51 48
52</head> 49</head>
53<body> 50<body>
54<pre id="test"> 51<pre id="test">
55 <script type="text/javascript" src="Date.test.js"></script> 52 <script type="text/javascript" src="Date.test.js"></script>
56</pre> 53</pre>
57 54
58</body> 55</body>
59</html> 56</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/Date.test.js b/frontend/gamma/tests/tests/Clipperz/PM/Date.test.js
index df271f1..e4b4db6 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/Date.test.js
+++ b/frontend/gamma/tests/tests/Clipperz/PM/Date.test.js
@@ -1,90 +1,87 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29var tests = { 26var tests = {
30 27
31 //------------------------------------------------------------------------- 28 //-------------------------------------------------------------------------
32 29
33 'offlineDataParsing_test': function () { 30 'offlineDataParsing_test': function () {
34 var value; 31 var value;
35 varparsedValue; 32 varparsedValue;
36 var expectedValue; 33 var expectedValue;
37 34
38 value = 'Tue Mar 27 06:41:37 PDT 2007'; 35 value = 'Tue Mar 27 06:41:37 PDT 2007';
39 parsedValue = Clipperz.PM.Date.parse(value); 36 parsedValue = Clipperz.PM.Date.parse(value);
40 expectedValue = new Date(); 37 expectedValue = new Date();
41 expectedValue.setUTCFullYear(2007, 03 - 1, 27); 38 expectedValue.setUTCFullYear(2007, 03 - 1, 27);
42 expectedValue.setUTCHours(13, 41, 37); 39 expectedValue.setUTCHours(13, 41, 37);
43 // 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]"); 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]");
44 SimpleTest.is(parsedValue.toString(), expectedValue.toString(), "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]");
45 42
46 value = 'Thu May 10 15:01:21 PDT 2007'; 43 value = 'Thu May 10 15:01:21 PDT 2007';
47 parsedValue = Clipperz.PM.Date.parse(value); 44 parsedValue = Clipperz.PM.Date.parse(value);
48 expectedValue = new Date(); 45 expectedValue = new Date();
49 expectedValue.setUTCFullYear(2007, 05 - 1, 10); 46 expectedValue.setUTCFullYear(2007, 05 - 1, 10);
50 expectedValue.setUTCHours(22, 01, 21); 47 expectedValue.setUTCHours(22, 01, 21);
51 // 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]"); 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]");
52 SimpleTest.is(parsedValue.toString(), expectedValue.toString(), "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]");
53 50
54 value = 'Thu May 10 15:01:21 PST 2007'; 51 value = 'Thu May 10 15:01:21 PST 2007';
55 parsedValue = Clipperz.PM.Date.parse(value); 52 parsedValue = Clipperz.PM.Date.parse(value);
56 expectedValue = new Date(); 53 expectedValue = new Date();
57 expectedValue.setUTCFullYear(2007, 05 - 1, 10); 54 expectedValue.setUTCFullYear(2007, 05 - 1, 10);
58 expectedValue.setUTCHours(23, 01, 21); 55 expectedValue.setUTCHours(23, 01, 21);
59 // 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]"); 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]");
60 SimpleTest.is(parsedValue.toString(), expectedValue.toString(), "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]");
61 }, 58 },
62 59
63 //------------------------------------------------------------------------- 60 //-------------------------------------------------------------------------
64 61
65 'onlineDataParsing_test': function () { 62 'onlineDataParsing_test': function () {
66 var value; 63 var value;
67 varparsedValue; 64 varparsedValue;
68 var expectedValue; 65 var expectedValue;
69 66
70 value = 'Tue, 27 March 2007 06:41:37 PDT'; 67 value = 'Tue, 27 March 2007 06:41:37 PDT';
71 parsedValue = Clipperz.PM.Date.parse(value); 68 parsedValue = Clipperz.PM.Date.parse(value);
72 expectedValue = new Date(); 69 expectedValue = new Date();
73 expectedValue.setUTCFullYear(2007, 03 - 1, 27); 70 expectedValue.setUTCFullYear(2007, 03 - 1, 27);
74 expectedValue.setUTCHours(13, 41, 37); 71 expectedValue.setUTCHours(13, 41, 37);
75 72
76 // 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"); 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");
77 SimpleTest.is(parsedValue.toString(), expectedValue.toString(), "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");
78 }, 75 },
79 76
80 //------------------------------------------------------------------------- 77 //-------------------------------------------------------------------------
81 'syntaxFix': MochiKit.Base.noop 78 'syntaxFix': MochiKit.Base.noop
82}; 79};
83 80
84//############################################################################# 81//#############################################################################
85 82
86Clipperz.PM.Strings.Languages.initSetup(); 83Clipperz.PM.Strings.Languages.initSetup();
87SimpleTest.runDeferredTests("Clipperz.PM.Date", tests, {trace:false}); 84SimpleTest.runDeferredTests("Clipperz.PM.Date", tests, {trace:false});
88 85
89 86
90 87
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/Proxy.html b/frontend/gamma/tests/tests/Clipperz/PM/Proxy.html
index 573dac8..8dc533f 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/Proxy.html
+++ b/frontend/gamma/tests/tests/Clipperz/PM/Proxy.html
@@ -1,65 +1,62 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27--> 24-->
28 25
29<html> 26<html>
30<head> 27<head>
31 <title>Clipperz.PM.Proxy - TEST</title> 28 <title>Clipperz.PM.Proxy - TEST</title>
32 29
33 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 30 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
34 <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script> 31 <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script>
35 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> 32 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
36 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> 33 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
37 34
38 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> 35 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
39 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 36 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
40 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 37 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
41 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script> 38 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script> 39 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script>
43 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script> 40 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script>
44 41
45 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> 42 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
46 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> 43 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
47 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script> 44 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
48 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> 45 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
49 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script> 46 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
50 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script> 47 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script>
51 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script> 48 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script>
52 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script> 49 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script>
53 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script> 50 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script>
54 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script> 51 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script>
55 52
56 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script> 53 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script>
57 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.Async.js"></script> 54 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.Async.js"></script>
58 55
59</head> 56</head>
60<body> 57<body>
61<pre id="test"> 58<pre id="test">
62 <script type="text/javascript" src="Proxy.test.js"></script> 59 <script type="text/javascript" src="Proxy.test.js"></script>
63</pre> 60</pre>
64</body> 61</body>
65</html> 62</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/Proxy.test.js b/frontend/gamma/tests/tests/Clipperz/PM/Proxy.test.js
index 8a16a5b..8225823 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/Proxy.test.js
+++ b/frontend/gamma/tests/tests/Clipperz/PM/Proxy.test.js
@@ -1,117 +1,114 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); 26Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
30 27
31var tests = { 28var tests = {
32 29
33 //------------------------------------------------------------------------- 30 //-------------------------------------------------------------------------
34 31
35 'simple_tests': function() { 32 'simple_tests': function() {
36 vardeferredResult; 33 vardeferredResult;
37 34
38 deferredResult = new Clipperz.Async.Deferred("simple_tests", {trace:false}); 35 deferredResult = new Clipperz.Async.Deferred("simple_tests", {trace:false});
39 deferredResult.addCallback(function() { 36 deferredResult.addCallback(function() {
40 var proxy; 37 var proxy;
41 38
42 proxy = new Clipperz.PM.Proxy(); 39 proxy = new Clipperz.PM.Proxy();
43 ok(proxy != null, "can create instances of the Proxy class"); 40 ok(proxy != null, "can create instances of the Proxy class");
44 is(proxy.shouldPayTolls(), false, "proxy is set to NOT pay tolls by default"); 41 is(proxy.shouldPayTolls(), false, "proxy is set to NOT pay tolls by default");
45 }); 42 });
46 43
47 deferredResult.callback(); 44 deferredResult.callback();
48 45
49 return deferredResult; 46 return deferredResult;
50 }, 47 },
51 48
52 //------------------------------------------------------------------------- 49 //-------------------------------------------------------------------------
53 50
54 'simpleTestsWithTolls_tests': function() { 51 'simpleTestsWithTolls_tests': function() {
55 vardeferredResult; 52 vardeferredResult;
56 53
57 deferredResult = new Clipperz.Async.Deferred("simple_tests", {trace:false}); 54 deferredResult = new Clipperz.Async.Deferred("simple_tests", {trace:false});
58 deferredResult.addCallback(function() { 55 deferredResult.addCallback(function() {
59 var proxy; 56 var proxy;
60 57
61 proxy = new Clipperz.PM.Proxy({shouldPayTolls:true}); 58 proxy = new Clipperz.PM.Proxy({shouldPayTolls:true});
62 is(proxy.shouldPayTolls(), true, "I can set Proxy to pays tolls"); 59 is(proxy.shouldPayTolls(), true, "I can set Proxy to pays tolls");
63 }); 60 });
64 61
65 deferredResult.callback(); 62 deferredResult.callback();
66 63
67 return deferredResult; 64 return deferredResult;
68 }, 65 },
69 66
70 //------------------------------------------------------------------------- 67 //-------------------------------------------------------------------------
71 'syntaxFix': MochiKit.Base.noop 68 'syntaxFix': MochiKit.Base.noop
72}; 69};
73 70
74//############################################################################# 71//#############################################################################
75 72
76runTests = function(aClassName) { 73runTests = function(aClassName) {
77 try { 74 try {
78 var deferredTests; 75 var deferredTests;
79 var aTestName; 76 var aTestName;
80 77
81 deferredTests = new Clipperz.Async.Deferred(aClassName + ".test", {trace:false}); 78 deferredTests = new Clipperz.Async.Deferred(aClassName + ".test", {trace:false});
82 79
83 aTestName = window.location.href.match(/#.*/); 80 aTestName = window.location.href.match(/#.*/);
84 if (aTestName && (aTestName != '#')) { 81 if (aTestName && (aTestName != '#')) {
85 aTestName = aTestName[0].slice(1); 82 aTestName = aTestName[0].slice(1);
86 if (aTestName in tests) { 83 if (aTestName in tests) {
87 //Clipperz.log("single test execution, via fragment identifier", aTestName); 84 //Clipperz.log("single test execution, via fragment identifier", aTestName);
88 deferredTests.addCallback(tests[aTestName]); 85 deferredTests.addCallback(tests[aTestName]);
89 deferredTests.addErrback(SimpleTest.ok, false, aTestName); 86 deferredTests.addErrback(SimpleTest.ok, false, aTestName);
90 } else { 87 } else {
91 deferredTests.addBoth(is, aTestName, null, "Wrong test name selected to run"); 88 deferredTests.addBoth(is, aTestName, null, "Wrong test name selected to run");
92 } 89 }
93 } else { 90 } else {
94 for (aTestName in tests) { 91 for (aTestName in tests) {
95 deferredTests.addCallback(tests[aTestName]); 92 deferredTests.addCallback(tests[aTestName]);
96 deferredTests.addErrback(SimpleTest.ok, false, aTestName); 93 deferredTests.addErrback(SimpleTest.ok, false, aTestName);
97 } 94 }
98 deferredTests.addBoth(is, true, true, "FINISH: completed the full stack of tests"); 95 deferredTests.addBoth(is, true, true, "FINISH: completed the full stack of tests");
99 } 96 }
100 deferredTests.addBoth(SimpleTest.finish); 97 deferredTests.addBoth(SimpleTest.finish);
101 deferredTests.callback(); 98 deferredTests.callback();
102 99
103 SimpleTest.waitForExplicitFinish(); 100 SimpleTest.waitForExplicitFinish();
104 } catch (err) { 101 } catch (err) {
105 var s = "test suite failure!\n"; 102 var s = "test suite failure!\n";
106 var o = {}; 103 var o = {};
107 var k = null; 104 var k = null;
108 for (k in err) { 105 for (k in err) {
109 // ensure unique keys?! 106 // ensure unique keys?!
110 if (!o[k]) { 107 if (!o[k]) {
111 s += k + ": " + err[k] + "\n"; 108 s += k + ": " + err[k] + "\n";
112 o[k] = err[k]; 109 o[k] = err[k];
113 } 110 }
114 } 111 }
115 ok ( false, s ); 112 ok ( false, s );
116 } 113 }
117}("Clipperz.PM.Proxy"); 114}("Clipperz.PM.Proxy");
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/Toll.html b/frontend/gamma/tests/tests/Clipperz/PM/Toll.html
index 7937380..9baf167 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/Toll.html
+++ b/frontend/gamma/tests/tests/Clipperz/PM/Toll.html
@@ -1,62 +1,59 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27--> 24-->
28 25
29<html> 26<html>
30<head> 27<head>
31 <title>Clipperz.PM.Toll - test</title> 28 <title>Clipperz.PM.Toll - test</title>
32 29
33 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 30 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
34 <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script> 31 <script type="text/javascript" src="../../../../js/JSLog/jslog.js"></script>
35 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> 32 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
36 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> 33 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
37 34
38 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> 35 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
39 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 36 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
40 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 37 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
41 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script> 38 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script> 39 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script>
43 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script> 40 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script>
44 41
45 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> 42 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
46 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> 43 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
47 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script> 44 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
48 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> 45 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
49 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script> 46 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
50 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script> 47 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script>
51 48
52 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script> 49 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script>
53 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.Async.js"></script> 50 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.Async.js"></script>
54 51
55</head> 52</head>
56<body> 53<body>
57<pre id="test"> 54<pre id="test">
58 <script type="text/javascript" src="Toll.test.js"></script> 55 <script type="text/javascript" src="Toll.test.js"></script>
59</pre> 56</pre>
60 57
61</body> 58</body>
62</html> 59</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/Toll.test.js b/frontend/gamma/tests/tests/Clipperz/PM/Toll.test.js
index b54996f..6de67c3 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/Toll.test.js
+++ b/frontend/gamma/tests/tests/Clipperz/PM/Toll.test.js
@@ -1,202 +1,199 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); 26Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
30 27
31var tests = { 28var tests = {
32 29
33 //------------------------------------------------------------------------- 30 //-------------------------------------------------------------------------
34/* 31/*
35 'simple_test': function() { 32 'simple_test': function() {
36 vardeferredResult; 33 vardeferredResult;
37 34
38 deferredResult = new Clipperz.Async.Deferred("simple_tests", {trace:false}); 35 deferredResult = new Clipperz.Async.Deferred("simple_tests", {trace:false});
39 deferredResult.addCallback(function() { 36 deferredResult.addCallback(function() {
40 vartollTargetValue; 37 vartollTargetValue;
41 vartoll; 38 vartoll;
42 var price; 39 var price;
43 40
44 tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32); 41 tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32);
45 tollTargetValue = Clipperz.Crypto.SHA.sha256(tollTargetValue); 42 tollTargetValue = Clipperz.Crypto.SHA.sha256(tollTargetValue);
46 43
47 price = 1; 44 price = 1;
48 tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32); 45 tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32);
49 toll = new Clipperz.PM.Toll({targetValue:tollTargetValue.toHexString(), cost:price}); 46 toll = new Clipperz.PM.Toll({targetValue:tollTargetValue.toHexString(), cost:price});
50 toll.pay(); 47 toll.pay();
51 48
52 price = 5; 49 price = 5;
53 tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32); 50 tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32);
54 toll = new Clipperz.PM.Toll({targetValue:tollTargetValue.toHexString(), cost:price}); 51 toll = new Clipperz.PM.Toll({targetValue:tollTargetValue.toHexString(), cost:price});
55 toll.pay(); 52 toll.pay();
56 53
57 price = 6; 54 price = 6;
58 tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32); 55 tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32);
59 toll = new Clipperz.PM.Toll({targetValue:tollTargetValue.toHexString(), cost:price}); 56 toll = new Clipperz.PM.Toll({targetValue:tollTargetValue.toHexString(), cost:price});
60 toll.pay(); 57 toll.pay();
61 58
62 price = 7; 59 price = 7;
63 tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32); 60 tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32);
64 toll = new Clipperz.PM.Toll({targetValue:tollTargetValue.toHexString(), cost:price}); 61 toll = new Clipperz.PM.Toll({targetValue:tollTargetValue.toHexString(), cost:price});
65 toll.pay(); 62 toll.pay();
66 63
67 price = 7; 64 price = 7;
68 tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32); 65 tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32);
69 toll = new Clipperz.PM.Toll({targetValue:tollTargetValue.toHexString(), cost:price}); 66 toll = new Clipperz.PM.Toll({targetValue:tollTargetValue.toHexString(), cost:price});
70 toll.pay(); 67 toll.pay();
71 }); 68 });
72 69
73 deferredResult.callback(); 70 deferredResult.callback();
74 71
75 return deferredResult; 72 return deferredResult;
76 }, 73 },
77*/ 74*/
78 //------------------------------------------------------------------------- 75 //-------------------------------------------------------------------------
79 76
80 'deferredPay_test': function() { 77 'deferredPay_test': function() {
81 vardeferredResult; 78 vardeferredResult;
82 vartollTargetValue; 79 vartollTargetValue;
83 var toll_1, toll_5, toll_6, toll_7, toll_10, toll_16; 80 var toll_1, toll_5, toll_6, toll_7, toll_10, toll_16;
84 81
85 // tollTargetValue = Clipperz.Crypto.SHA.sha256(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32)); 82 // tollTargetValue = Clipperz.Crypto.SHA.sha256(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32));
86 83
87 84
88 85
89 deferredResult = new Clipperz.Async.Deferred("deferredPay_tests", {trace:false}); 86 deferredResult = new Clipperz.Async.Deferred("deferredPay_tests", {trace:false});
90 87
91 tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2); 88 tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2);
92 toll_1 = new Clipperz.PM.Toll({targetValue:tollTargetValue, cost:1}); 89 toll_1 = new Clipperz.PM.Toll({targetValue:tollTargetValue, cost:1});
93 90
94 deferredResult.addMethod(toll_1, 'deferredPay'); 91 deferredResult.addMethod(toll_1, 'deferredPay');
95 deferredResult.addCallback(function (aResult) { 92 deferredResult.addCallback(function (aResult) {
96 SimpleTest.ok(Clipperz.PM.Toll.validate(aResult.targetValue, aResult.toll, 1), "Payed a toll of cost 1"); 93 SimpleTest.ok(Clipperz.PM.Toll.validate(aResult.targetValue, aResult.toll, 1), "Payed a toll of cost 1");
97 }); 94 });
98 deferredResult.addCallback(MochiKit.Async.wait, 1); 95 deferredResult.addCallback(MochiKit.Async.wait, 1);
99 96
100 tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2); 97 tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2);
101 toll_5 = new Clipperz.PM.Toll({targetValue:tollTargetValue, cost:5}); 98 toll_5 = new Clipperz.PM.Toll({targetValue:tollTargetValue, cost:5});
102 99
103 deferredResult.addMethod(toll_5, 'deferredPay'); 100 deferredResult.addMethod(toll_5, 'deferredPay');
104 deferredResult.addCallback(function (aResult) { 101 deferredResult.addCallback(function (aResult) {
105 SimpleTest.ok(Clipperz.PM.Toll.validate(aResult.targetValue, aResult.toll, 5), "Payed a toll of cost 5"); 102 SimpleTest.ok(Clipperz.PM.Toll.validate(aResult.targetValue, aResult.toll, 5), "Payed a toll of cost 5");
106 }); 103 });
107 deferredResult.addCallback(MochiKit.Async.wait, 1); 104 deferredResult.addCallback(MochiKit.Async.wait, 1);
108 105
109 106
110 tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2); 107 tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2);
111 toll_6 = new Clipperz.PM.Toll({targetValue:tollTargetValue, cost:6}); 108 toll_6 = new Clipperz.PM.Toll({targetValue:tollTargetValue, cost:6});
112 109
113 deferredResult.addMethod(toll_6, 'deferredPay'); 110 deferredResult.addMethod(toll_6, 'deferredPay');
114 deferredResult.addCallback(function (aResult) { 111 deferredResult.addCallback(function (aResult) {
115 SimpleTest.ok(Clipperz.PM.Toll.validate(aResult.targetValue, aResult.toll, 6), "Payed a toll of cost 6"); 112 SimpleTest.ok(Clipperz.PM.Toll.validate(aResult.targetValue, aResult.toll, 6), "Payed a toll of cost 6");
116 }); 113 });
117 deferredResult.addCallback(MochiKit.Async.wait, 1); 114 deferredResult.addCallback(MochiKit.Async.wait, 1);
118 115
119 116
120 tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2); 117 tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2);
121 toll_7 = new Clipperz.PM.Toll({targetValue:tollTargetValue, cost:7}); 118 toll_7 = new Clipperz.PM.Toll({targetValue:tollTargetValue, cost:7});
122 119
123 deferredResult.addMethod(toll_7, 'deferredPay'); 120 deferredResult.addMethod(toll_7, 'deferredPay');
124 deferredResult.addCallback(function (aResult) { 121 deferredResult.addCallback(function (aResult) {
125 SimpleTest.ok(Clipperz.PM.Toll.validate(aResult.targetValue, aResult.toll, 7), "Payed a toll of cost 7"); 122 SimpleTest.ok(Clipperz.PM.Toll.validate(aResult.targetValue, aResult.toll, 7), "Payed a toll of cost 7");
126 }); 123 });
127 deferredResult.addCallback(MochiKit.Async.wait, 1); 124 deferredResult.addCallback(MochiKit.Async.wait, 1);
128 125
129 126
130 tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2); 127 tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2);
131 toll_10 = new Clipperz.PM.Toll({targetValue:tollTargetValue, cost:10}); 128 toll_10 = new Clipperz.PM.Toll({targetValue:tollTargetValue, cost:10});
132 129
133 deferredResult.addMethod(toll_10, 'deferredPay'); 130 deferredResult.addMethod(toll_10, 'deferredPay');
134 deferredResult.addCallback(function (aResult) { 131 deferredResult.addCallback(function (aResult) {
135 SimpleTest.ok(Clipperz.PM.Toll.validate(aResult.targetValue, aResult.toll, 10), "Payed a toll of cost 10"); 132 SimpleTest.ok(Clipperz.PM.Toll.validate(aResult.targetValue, aResult.toll, 10), "Payed a toll of cost 10");
136 }); 133 });
137 deferredResult.addCallback(MochiKit.Async.wait, 1); 134 deferredResult.addCallback(MochiKit.Async.wait, 1);
138 135
139/* 136/*
140 tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2); 137 tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2);
141 toll_16 = new Clipperz.PM.Toll({targetValue:tollTargetValue, cost:16}); 138 toll_16 = new Clipperz.PM.Toll({targetValue:tollTargetValue, cost:16});
142 139
143 deferredResult.addMethod(toll_16, 'deferredPay'); 140 deferredResult.addMethod(toll_16, 'deferredPay');
144 deferredResult.addCallback(function (aResult) { 141 deferredResult.addCallback(function (aResult) {
145 SimpleTest.ok(Clipperz.PM.Toll.validate(aResult.targetValue, aResult.toll, 16), "Payed a toll of cost 16"); 142 SimpleTest.ok(Clipperz.PM.Toll.validate(aResult.targetValue, aResult.toll, 16), "Payed a toll of cost 16");
146 }); 143 });
147 deferredResult.addCallback(MochiKit.Async.wait, 1); 144 deferredResult.addCallback(MochiKit.Async.wait, 1);
148*/ 145*/
149 146
150 deferredResult.callback(); 147 deferredResult.callback();
151 148
152 return deferredResult; 149 return deferredResult;
153 }, 150 },
154 151
155 //------------------------------------------------------------------------- 152 //-------------------------------------------------------------------------
156 'syntaxFix': MochiKit.Base.noop 153 'syntaxFix': MochiKit.Base.noop
157}; 154};
158 155
159//############################################################################# 156//#############################################################################
160 157
161runTests = function() { 158runTests = function() {
162 try { 159 try {
163 var deferredTests; 160 var deferredTests;
164 var aTestName; 161 var aTestName;
165 162
166 deferredTests = new Clipperz.Async.Deferred("Clipperz.PM.Toll.test", {trace:false}); 163 deferredTests = new Clipperz.Async.Deferred("Clipperz.PM.Toll.test", {trace:false});
167 164
168 aTestName = window.location.href.match(/#.*/); 165 aTestName = window.location.href.match(/#.*/);
169 if (aTestName && (aTestName != '#')) { 166 if (aTestName && (aTestName != '#')) {
170 aTestName = aTestName[0].slice(1); 167 aTestName = aTestName[0].slice(1);
171 if (aTestName in tests) { 168 if (aTestName in tests) {
172 //Clipperz.log("single test execution, via fragment identifier", aTestName); 169 //Clipperz.log("single test execution, via fragment identifier", aTestName);
173 deferredTests.addCallback(tests[aTestName]); 170 deferredTests.addCallback(tests[aTestName]);
174 deferredTests.addErrback(SimpleTest.ok, false, aTestName); 171 deferredTests.addErrback(SimpleTest.ok, false, aTestName);
175 } else { 172 } else {
176 deferredTests.addBoth(is, aTestName, null, "Wrong test name selected to run"); 173 deferredTests.addBoth(is, aTestName, null, "Wrong test name selected to run");
177 } 174 }
178 } else { 175 } else {
179 for (aTestName in tests) { 176 for (aTestName in tests) {
180 deferredTests.addCallback(tests[aTestName]); 177 deferredTests.addCallback(tests[aTestName]);
181 deferredTests.addErrback(SimpleTest.ok, false, aTestName); 178 deferredTests.addErrback(SimpleTest.ok, false, aTestName);
182 } 179 }
183 deferredTests.addBoth(is, true, true, "FINISH: completed the full stack of tests"); 180 deferredTests.addBoth(is, true, true, "FINISH: completed the full stack of tests");
184 } 181 }
185 deferredTests.addBoth(SimpleTest.finish); 182 deferredTests.addBoth(SimpleTest.finish);
186 deferredTests.callback(); 183 deferredTests.callback();
187 184
188 SimpleTest.waitForExplicitFinish(); 185 SimpleTest.waitForExplicitFinish();
189 } catch (err) { 186 } catch (err) {
190 var s = "test suite failure!\n"; 187 var s = "test suite failure!\n";
191 var o = {}; 188 var o = {};
192 var k = null; 189 var k = null;
193 for (k in err) { 190 for (k in err) {
194 // ensure unique keys?! 191 // ensure unique keys?!
195 if (!o[k]) { 192 if (!o[k]) {
196 s += k + ": " + err[k] + "\n"; 193 s += k + ": " + err[k] + "\n";
197 o[k] = err[k]; 194 o[k] = err[k];
198 } 195 }
199 } 196 }
200 ok ( false, s ); 197 ok ( false, s );
201 } 198 }
202}(); 199}();
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 6fbdcd6..04f0e70 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,64 +1,61 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27--> 24-->
28 25
29<html> 26<html>
30<head> 27<head>
31 <title>Clipperz.PM.UI.Web.MainController - test</title> 28 <title>Clipperz.PM.UI.Web.MainController - test</title>
32 29
33 <script type="text/javascript" src="../../../../../../../js/MochiKit/MochiKit.js"></script> 30 <script type="text/javascript" src="../../../../../../../js/MochiKit/MochiKit.js"></script>
34 <script type="text/javascript" src="../../../../../../../js/JSLog/jslog.js"></script> 31 <script type="text/javascript" src="../../../../../../../js/JSLog/jslog.js"></script>
35 <script type="text/javascript" src="../../../../../../SimpleTest/SimpleTest.js"></script> 32 <script type="text/javascript" src="../../../../../../SimpleTest/SimpleTest.js"></script>
36 <link rel="stylesheet" type="text/css" href="../../../../../../SimpleTest/test.css"> 33 <link rel="stylesheet" type="text/css" href="../../../../../../SimpleTest/test.css">
37 34
38 <script type='text/javascript' src='../../../../../../../js/Clipperz/YUI/Utils.js'></script> 35 <script type='text/javascript' src='../../../../../../../js/Clipperz/YUI/Utils.js'></script>
39 <script type='text/javascript' src='../../../../../../../js/Clipperz/Base.js'></script> 36 <script type='text/javascript' src='../../../../../../../js/Clipperz/Base.js'></script>
40 <script type='text/javascript' src='../../../../../../../js/Clipperz/ByteArray.js'></script> 37 <script type='text/javascript' src='../../../../../../../js/Clipperz/ByteArray.js'></script>
41 <script type='text/javascript' src='../../../../../../../js/Clipperz/Logging.js'></script> 38 <script type='text/javascript' src='../../../../../../../js/Clipperz/Logging.js'></script>
42 <script type='text/javascript' src='../../../../../../../js/Clipperz/Async.js'></script> 39 <script type='text/javascript' src='../../../../../../../js/Clipperz/Async.js'></script>
43 <script type='text/javascript' src='../../../../../../../js/Clipperz/KeyValueObjectStore.js'></script> 40 <script type='text/javascript' src='../../../../../../../js/Clipperz/KeyValueObjectStore.js'></script>
44 41
45 <script type='text/javascript' src='../../../../../../../js/Clipperz/Crypto/Base.js'></script> 42 <script type='text/javascript' src='../../../../../../../js/Clipperz/Crypto/Base.js'></script>
46 <script type='text/javascript' src='../../../../../../../js/Clipperz/Crypto/BigInt.js'></script> 43 <script type='text/javascript' src='../../../../../../../js/Clipperz/Crypto/BigInt.js'></script>
47 <script type='text/javascript' src='../../../../../../../js/Clipperz/Crypto/AES.js'></script> 44 <script type='text/javascript' src='../../../../../../../js/Clipperz/Crypto/AES.js'></script>
48 <script type='text/javascript' src='../../../../../../../js/Clipperz/Crypto/SHA.js'></script> 45 <script type='text/javascript' src='../../../../../../../js/Clipperz/Crypto/SHA.js'></script>
49 <script type='text/javascript' src='../../../../../../../js/Clipperz/Crypto/PRNG.js'></script> 46 <script type='text/javascript' src='../../../../../../../js/Clipperz/Crypto/PRNG.js'></script>
50 <script type='text/javascript' src='../../../../../../../js/Clipperz/Crypto/SRP.js'></script> 47 <script type='text/javascript' src='../../../../../../../js/Clipperz/Crypto/SRP.js'></script>
51 48
52 <script type='text/javascript' src='../../../../../../../js/Clipperz/Signal.js'></script> 49 <script type='text/javascript' src='../../../../../../../js/Clipperz/Signal.js'></script>
53 50
54 <script type='text/javascript' src='../../../../../../../js/Clipperz/PM/UI/Web/Controllers/MainController.js'></script> 51 <script type='text/javascript' src='../../../../../../../js/Clipperz/PM/UI/Web/Controllers/MainController.js'></script>
55 <script type="text/javascript" src="../../../../../../SimpleTest/SimpleTest.Async.js"></script> 52 <script type="text/javascript" src="../../../../../../SimpleTest/SimpleTest.Async.js"></script>
56 53
57</head> 54</head>
58<body> 55<body>
59<pre id="test"> 56<pre id="test">
60 <script type="text/javascript" src="MainController.test.js"></script> 57 <script type="text/javascript" src="MainController.test.js"></script>
61</pre> 58</pre>
62 59
63</body> 60</body>
64</html> 61</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 3953558..919215e 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,90 +1,87 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29//Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); 26//Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
30 27
31var tests = { 28var tests = {
32 29
33 'isPassphraseDelegateLockSetAfterInit': function (someTestArgs) { 30 'isPassphraseDelegateLockSetAfterInit': function (someTestArgs) {
34 return Clipperz.Async.callbacks('isPassphraseDelegateLockSetAfterInit', [ 31 return Clipperz.Async.callbacks('isPassphraseDelegateLockSetAfterInit', [
35 function () { 32 function () {
36 var mainController; 33 var mainController;
37 34
38 mainController = new Clipperz.PM.UI.Web.Controllers.MainController(); 35 mainController = new Clipperz.PM.UI.Web.Controllers.MainController();
39 SimpleTest.is(true, mainController._passphraseDelegateLock.locked, 'passphraseDelegate lock is locked after MainController initialization') 36 SimpleTest.is(true, mainController._passphraseDelegateLock.locked, 'passphraseDelegate lock is locked after MainController initialization')
40 }]); 37 }]);
41 }, 38 },
42 39
43 //------------------------------------------------------------------------- 40 //-------------------------------------------------------------------------
44 41
45 'getPassphraseWithUnsetDelegate_test': function (someTestArgs) { 42 'getPassphraseWithUnsetDelegate_test': function (someTestArgs) {
46 var deferredResult; 43 var deferredResult;
47 var mainController; 44 var mainController;
48 var delegateFunction; 45 var delegateFunction;
49 46
50 mainController = new Clipperz.PM.UI.Web.Controllers.MainController(); 47 mainController = new Clipperz.PM.UI.Web.Controllers.MainController();
51 delegateFunction = function () { return "clipperz";}; 48 delegateFunction = function () { return "clipperz";};
52 49
53 MochiKit.Async.callLater(1, MochiKit.Base.method(mainController, 'setPassphraseDelegate', delegateFunction)); 50 MochiKit.Async.callLater(1, MochiKit.Base.method(mainController, 'setPassphraseDelegate', delegateFunction));
54 51
55 return Clipperz.Async.callbacks("MainController.getPassphraseWithUnsetDelegate",[ 52 return Clipperz.Async.callbacks("MainController.getPassphraseWithUnsetDelegate",[
56 MochiKit.Base.method(mainController, 'getPassphrase'), 53 MochiKit.Base.method(mainController, 'getPassphrase'),
57 function (aResult) { 54 function (aResult) {
58 SimpleTest.is(aResult, 'clipperz', "the password provided by the delegate is correct"); 55 SimpleTest.is(aResult, 'clipperz', "the password provided by the delegate is correct");
59 } 56 }
60 ], {trace:false}); 57 ], {trace:false});
61 }, 58 },
62 59
63 //------------------------------------------------------------------------- 60 //-------------------------------------------------------------------------
64 61
65 'getPassphraseWithSetDelegate_test': function (someTestArgs) { 62 'getPassphraseWithSetDelegate_test': function (someTestArgs) {
66 var deferredResult; 63 var deferredResult;
67 var mainController; 64 var mainController;
68 var delegateFunction; 65 var delegateFunction;
69 66
70 mainController = new Clipperz.PM.UI.Web.Controllers.MainController(); 67 mainController = new Clipperz.PM.UI.Web.Controllers.MainController();
71 delegateFunction = function () {return "clipperz";}; 68 delegateFunction = function () {return "clipperz";};
72 69
73 return Clipperz.Async.callbacks("MainController.getPassphraseWithSetDelegate_test",[ 70 return Clipperz.Async.callbacks("MainController.getPassphraseWithSetDelegate_test",[
74 MochiKit.Base.method(mainController, 'setPassphraseDelegate', delegateFunction), 71 MochiKit.Base.method(mainController, 'setPassphraseDelegate', delegateFunction),
75 MochiKit.Base.method(mainController, 'getPassphrase'), 72 MochiKit.Base.method(mainController, 'getPassphrase'),
76 function (aResult) { 73 function (aResult) {
77 SimpleTest.is(aResult, 'clipperz', "the password provided by the delegate is correct"); 74 SimpleTest.is(aResult, 'clipperz', "the password provided by the delegate is correct");
78 } 75 }
79 ], {trace:false}); 76 ], {trace:false});
80 }, 77 },
81 78
82 //------------------------------------------------------------------------- 79 //-------------------------------------------------------------------------
83 'syntaxFix': MochiKit.Base.noop 80 'syntaxFix': MochiKit.Base.noop
84}; 81};
85 82
86 83
87 84
88//############################################################################# 85//#############################################################################
89 86
90SimpleTest.runDeferredTests("Clipperz.PM.UI.Web.Controllers.MainController", tests, {trace:false}); 87SimpleTest.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 f3283b6..3f04d4f 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,46 +1,43 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27--> 24-->
28 25
29<html> 26<html>
30<head> 27<head>
31 <title>Clipperz.PM.UI.Web.Controllers.* - tests</title> 28 <title>Clipperz.PM.UI.Web.Controllers.* - tests</title>
32 29
33 <script type="text/javascript" src="../../../../../../../js/MochiKit/MochiKit.js"></script> 30 <script type="text/javascript" src="../../../../../../../js/MochiKit/MochiKit.js"></script>
34 <script type="text/javascript" src="../../../../../../SimpleTest/TestRunner.js"></script> 31 <script type="text/javascript" src="../../../../../../SimpleTest/TestRunner.js"></script>
35</head> 32</head>
36<body> 33<body>
37<script> 34<script>
38TestRunner.runTests( 35TestRunner.runTests(
39// 36//
40 //This is still a complete mess. 37 //This is still a complete mess.
41// 38//
42 'MainController.html' 39 'MainController.html'
43); 40);
44</script> 41</script>
45</body> 42</body>
46</html> \ No newline at end of file 43</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 9afa73d..250a70d 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/UI/Web/index.html
+++ b/frontend/gamma/tests/tests/Clipperz/PM/UI/Web/index.html
@@ -1,45 +1,42 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27--> 24-->
28 25
29<html> 26<html>
30<head> 27<head>
31 <title>Clipperz.PM.UI.Web* - tests</title> 28 <title>Clipperz.PM.UI.Web* - tests</title>
32 29
33 <script type="text/javascript" src="../../../../../../js/MochiKit/MochiKit.js"></script> 30 <script type="text/javascript" src="../../../../../../js/MochiKit/MochiKit.js"></script>
34 <script type="text/javascript" src="../../../../../SimpleTest/TestRunner.js"></script> 31 <script type="text/javascript" src="../../../../../SimpleTest/TestRunner.js"></script>
35</head> 32</head>
36<body> 33<body>
37<script> 34<script>
38TestRunner.runTests( 35TestRunner.runTests(
39// 36//
40 //This is still a complete mess. 37 //This is still a complete mess.
41// 38//
42); 39);
43</script> 40</script>
44</body> 41</body>
45</html> \ No newline at end of file 42</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 867362b..d46ced1 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/UI/index.html
+++ b/frontend/gamma/tests/tests/Clipperz/PM/UI/index.html
@@ -1,45 +1,42 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27--> 24-->
28 25
29<html> 26<html>
30<head> 27<head>
31 <title>Clipperz.PM.UI.* - tests</title> 28 <title>Clipperz.PM.UI.* - tests</title>
32 29
33 <script type="text/javascript" src="../../../../../js/MochiKit/MochiKit.js"></script> 30 <script type="text/javascript" src="../../../../../js/MochiKit/MochiKit.js"></script>
34 <script type="text/javascript" src="../../../../SimpleTest/TestRunner.js"></script> 31 <script type="text/javascript" src="../../../../SimpleTest/TestRunner.js"></script>
35</head> 32</head>
36<body> 33<body>
37<script> 34<script>
38TestRunner.runTests( 35TestRunner.runTests(
39// 36//
40 //This is still a complete mess. 37 //This is still a complete mess.
41// 38//
42); 39);
43</script> 40</script>
44</body> 41</body>
45</html> \ No newline at end of file 42</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 acc45f7..b9bede1 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/index.html
+++ b/frontend/gamma/tests/tests/Clipperz/PM/index.html
@@ -1,56 +1,53 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27--> 24-->
28 25
29<html> 26<html>
30<head> 27<head>
31 <title>Clipperz.PM.* - tests</title> 28 <title>Clipperz.PM.* - tests</title>
32 29
33 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 30 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
34 <script type="text/javascript" src="../../../SimpleTest/TestRunner.js"></script> 31 <script type="text/javascript" src="../../../SimpleTest/TestRunner.js"></script>
35</head> 32</head>
36<body> 33<body>
37<script> 34<script>
38TestRunner.runTests( 35TestRunner.runTests(
39// 36//
40 //This is still a complete mess. 37 //This is still a complete mess.
41// 38//
42 //'BookmarkletProcessor.html', 39 //'BookmarkletProcessor.html',
43 'Connection.html', 40 'Connection.html',
44 'Crypto.html', 41 'Crypto.html',
45 //'Crypto_other_implementation_comparison.html', 42 //'Crypto_other_implementation_comparison.html',
46 'Crypto_performanceEvaluation.html', 43 'Crypto_performanceEvaluation.html',
47 //'CryptoPerformance_ByteArrayArray.html', 44 //'CryptoPerformance_ByteArrayArray.html',
48 //'CryptoPerformance_ByteArrayHex.html', 45 //'CryptoPerformance_ByteArrayHex.html',
49 //'CryptoPerformance_ByteArrayString.html', 46 //'CryptoPerformance_ByteArrayString.html',
50 'Date.html', 47 'Date.html',
51 'Proxy.html', 48 'Proxy.html',
52 'Toll.html' 49 'Toll.html'
53); 50);
54</script> 51</script>
55</body> 52</body>
56</html> \ No newline at end of file 53</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 7fe9a84..87cde0f 100644
--- a/frontend/gamma/tests/tests/Clipperz/RoboFormExportProcessor.html
+++ b/frontend/gamma/tests/tests/Clipperz/RoboFormExportProcessor.html
@@ -1,210 +1,207 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27--> 24-->
28 25
29<html> 26<html>
30<head> 27<head>
31 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script> 28 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script>
32 <script type="text/javascript" src="../../../js/JSLog/jslog.js"></script> 29 <script type="text/javascript" src="../../../js/JSLog/jslog.js"></script>
33 <script type="text/javascript" src="../../SimpleTest/SimpleTest.js"></script> 30 <script type="text/javascript" src="../../SimpleTest/SimpleTest.js"></script>
34 <link rel="stylesheet" type="text/css" href="../../SimpleTest/test.css"> 31 <link rel="stylesheet" type="text/css" href="../../SimpleTest/test.css">
35 32
36 <script type='text/javascript' src='../../../js/Clipperz/YUI/Utils.js'></script> 33 <script type='text/javascript' src='../../../js/Clipperz/YUI/Utils.js'></script>
37 <script type='text/javascript' src='../../../js/Clipperz/Base.js'></script> 34 <script type='text/javascript' src='../../../js/Clipperz/Base.js'></script>
38 <script type='text/javascript' src='../../../js/Clipperz/Async.js'></script> 35 <script type='text/javascript' src='../../../js/Clipperz/Async.js'></script>
39 <script type='text/javascript' src='../../../js/Clipperz/KeePassExportProcessor.js'></script> 36 <script type='text/javascript' src='../../../js/Clipperz/KeePassExportProcessor.js'></script>
40 37
41 <script type="text/javascript" src="../../SimpleTest/SimpleTest.Async.js"></script> 38 <script type="text/javascript" src="../../SimpleTest/SimpleTest.Async.js"></script>
42</head> 39</head>
43<body> 40<body>
44<pre id="test"> 41<pre id="test">
45<script type="text/javascript"> 42<script type="text/javascript">
46try { 43try {
47 var deferredResult; 44 var deferredResult;
48 varkeePassProcessor; 45 varkeePassProcessor;
49 46
50 keePassProcessor = new Clipperz.KeePassExportProcessor(); 47 keePassProcessor = new Clipperz.KeePassExportProcessor();
51 48
52 deferredResult = new MochiKit.Async.Deferred(); 49 deferredResult = new MochiKit.Async.Deferred();
53 50
54 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(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" });
55 deferredResult.addCallback(MochiKit.Base.method(keePassProcessor, 'deferredParse')); 52 deferredResult.addCallback(MochiKit.Base.method(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\"}, {\"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.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"); });
57 deferredResult.addErrback(function(anError) { is("ERROR", anError) }); 54 deferredResult.addErrback(function(anError) { is("ERROR", anError) });
58 55
59 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(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" });
60 deferredResult.addCallback(MochiKit.Base.method(keePassProcessor, 'deferredParse')); 57 deferredResult.addCallback(MochiKit.Base.method(keePassProcessor, 'deferredParse'));
61 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.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"); });
62 deferredResult.addErrback(function(anError) { is("ERROR", anError) }); 59 deferredResult.addErrback(function(anError) { is("ERROR", anError) });
63 60
64 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(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" });
65 deferredResult.addCallback(MochiKit.Base.method(keePassProcessor, 'deferredParse')); 62 deferredResult.addCallback(MochiKit.Base.method(keePassProcessor, 'deferredParse'));
66 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.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"); });
67 deferredResult.addErrback(function(anError) { is("ERROR", anError) }); 64 deferredResult.addErrback(function(anError) { is("ERROR", anError) });
68 65
69 66
70 67
71 deferredResult.addBoth(SimpleTest.finish); 68 deferredResult.addBoth(SimpleTest.finish);
72 deferredResult.callback(); 69 deferredResult.callback();
73 70
74/* 71/*
75 var set; 72 var set;
76 varobject1; 73 varobject1;
77 varobject2; 74 varobject2;
78 var object3; 75 var object3;
79 76
80 set = new Clipperz.Set(); 77 set = new Clipperz.Set();
81 78
82 object1 = new Object(); 79 object1 = new Object();
83 object2 = new Object(); 80 object2 = new Object();
84 object3 = new Object(); 81 object3 = new Object();
85 82
86 object1.label = "object 1"; 83 object1.label = "object 1";
87 object2.label = "object 2"; 84 object2.label = "object 2";
88 object3.label = "object 3"; 85 object3.label = "object 3";
89 86
90 is(set.size(), 0, "A new set should be empty"); 87 is(set.size(), 0, "A new set should be empty");
91 88
92 set.add(object1); 89 set.add(object1);
93 is(set.size(), 1); 90 is(set.size(), 1);
94 is(set.contains(object1), true); 91 is(set.contains(object1), true);
95 is(set.contains(object2), false); 92 is(set.contains(object2), false);
96 93
97 set.add(object1); 94 set.add(object1);
98 is(set.size(), 1, "Adding the same object twice does not change the set content"); 95 is(set.size(), 1, "Adding the same object twice does not change the set content");
99 is(set.contains(object1), true); 96 is(set.contains(object1), true);
100 is(set.contains(object2), false); 97 is(set.contains(object2), false);
101 98
102 set.add(object2); 99 set.add(object2);
103 is(set.size(), 2); 100 is(set.size(), 2);
104 is(set.contains(object1), true); 101 is(set.contains(object1), true);
105 is(set.contains(object2), true); 102 is(set.contains(object2), true);
106 is(set.contains(object3), false); 103 is(set.contains(object3), false);
107 104
108 set.remove(object1); 105 set.remove(object1);
109 is(set.size(), 1, "Size check after removing an object"); 106 is(set.size(), 1, "Size check after removing an object");
110 is(set.contains(object1), false); 107 is(set.contains(object1), false);
111 is(set.contains(object2), true); 108 is(set.contains(object2), true);
112 is(set.contains(object3), false); 109 is(set.contains(object3), false);
113 110
114 set.remove(object1); 111 set.remove(object1);
115 is(set.size(), 1, "Removing twice the same object does not change the set content"); 112 is(set.size(), 1, "Removing twice the same object does not change the set content");
116 is(set.contains(object1), false); 113 is(set.contains(object1), false);
117 is(set.contains(object2), true); 114 is(set.contains(object2), true);
118 is(set.contains(object3), false); 115 is(set.contains(object3), false);
119 116
120 set.empty(); 117 set.empty();
121 is(set.size(), 0); 118 is(set.size(), 0);
122 119
123 { 120 {
124 varitems; 121 varitems;
125 varpopulatedSet; 122 varpopulatedSet;
126 123
127 items = ["item1", "item2", "item3"]; 124 items = ["item1", "item2", "item3"];
128 125
129 populatedSet = new Clipperz.Set({'items': items}); 126 populatedSet = new Clipperz.Set({'items': items});
130 is(populatedSet.size(), 3); 127 is(populatedSet.size(), 3);
131 is(populatedSet.contains("item1"), true); 128 is(populatedSet.contains("item1"), true);
132 is(populatedSet.contains("item4"), false); 129 is(populatedSet.contains("item4"), false);
133 130
134 items.splice(0, items.length); 131 items.splice(0, items.length);
135 is(populatedSet.size(), 3); 132 is(populatedSet.size(), 3);
136 } 133 }
137 134
138 { 135 {
139 varitems; 136 varitems;
140 vardeletedItems; 137 vardeletedItems;
141 138
142 items = ["item1", "item2", "item3"]; 139 items = ["item1", "item2", "item3"];
143 140
144 set = new Clipperz.Set({'items': items}); 141 set = new Clipperz.Set({'items': items});
145 deletedItems = ["item1"]; 142 deletedItems = ["item1"];
146 set.remove(deletedItems); 143 set.remove(deletedItems);
147 is(set.size(), 2, "here I am"); 144 is(set.size(), 2, "here I am");
148 is(set.contains("item1"), false); 145 is(set.contains("item1"), false);
149 is(set.contains("item2"), true); 146 is(set.contains("item2"), true);
150 147
151 set = new Clipperz.Set({'items': items}); 148 set = new Clipperz.Set({'items': items});
152 deletedItems = ["item1", "item2"]; 149 deletedItems = ["item1", "item2"];
153 set.remove(deletedItems); 150 set.remove(deletedItems);
154 is(set.size(), 1); 151 is(set.size(), 1);
155 is(set.contains("item1"), false); 152 is(set.contains("item1"), false);
156 is(set.contains("item2"), false); 153 is(set.contains("item2"), false);
157 154
158 set = new Clipperz.Set({'items': items}); 155 set = new Clipperz.Set({'items': items});
159 deletedItems = ["item1", "item4"]; 156 deletedItems = ["item1", "item4"];
160 set.remove(deletedItems); 157 set.remove(deletedItems);
161 is(set.size(), 2); 158 is(set.size(), 2);
162 is(set.contains("item1"), false); 159 is(set.contains("item1"), false);
163 is(set.contains("item2"), true); 160 is(set.contains("item2"), true);
164 } 161 }
165 162
166 { 163 {
167 var items; 164 var items;
168 var poppedItem; 165 var poppedItem;
169 166
170 items = ["item1", "item2", "item3"]; 167 items = ["item1", "item2", "item3"];
171 set = new Clipperz.Set({'items': items}); 168 set = new Clipperz.Set({'items': items});
172 169
173 poppedItem = set.popAnItem(); 170 poppedItem = set.popAnItem();
174 ok(poppedItem != null, "test popAnItem - 1"); 171 ok(poppedItem != null, "test popAnItem - 1");
175 is(set.size(), 2, "test popAnItem - 2"); 172 is(set.size(), 2, "test popAnItem - 2");
176 173
177 poppedItem = set.popAnItem(); 174 poppedItem = set.popAnItem();
178 ok(poppedItem != null, "test popAnItem - 3"); 175 ok(poppedItem != null, "test popAnItem - 3");
179 is(set.size(), 1, "test popAnItem - 4"); 176 is(set.size(), 1, "test popAnItem - 4");
180 177
181 poppedItem = set.popAnItem(); 178 poppedItem = set.popAnItem();
182 ok(poppedItem != null, "test popAnItem - 5"); 179 ok(poppedItem != null, "test popAnItem - 5");
183 is(set.size(), 0, "test popAnItem - 6"); 180 is(set.size(), 0, "test popAnItem - 6");
184 181
185 poppedItem = set.popAnItem(); 182 poppedItem = set.popAnItem();
186 ok(poppedItem == null, "test popAnItem - 7"); 183 ok(poppedItem == null, "test popAnItem - 7");
187 } 184 }
188*/ 185*/
189 186
190 SimpleTest.waitForExplicitFinish(); 187 SimpleTest.waitForExplicitFinish();
191 188
192} catch (err) { 189} catch (err) {
193 190
194 var s = "test suite failure!\n"; 191 var s = "test suite failure!\n";
195 var o = {}; 192 var o = {};
196 var k = null; 193 var k = null;
197 for (k in err) { 194 for (k in err) {
198 // ensure unique keys?! 195 // ensure unique keys?!
199 if (!o[k]) { 196 if (!o[k]) {
200 s += k + ": " + err[k] + "\n"; 197 s += k + ": " + err[k] + "\n";
201 o[k] = err[k]; 198 o[k] = err[k];
202 } 199 }
203 } 200 }
204 ok ( false, s ); 201 ok ( false, s );
205} 202}
206 203
207</script> 204</script>
208</pre> 205</pre>
209</body> 206</body>
210</html> 207</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/Set.html b/frontend/gamma/tests/tests/Clipperz/Set.html
index e5814bc..82bb249 100644
--- a/frontend/gamma/tests/tests/Clipperz/Set.html
+++ b/frontend/gamma/tests/tests/Clipperz/Set.html
@@ -1,54 +1,51 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27--> 24-->
28 25
29<html> 26<html>
30<head> 27<head>
31 <title>Clipperz.Set - test</title> 28 <title>Clipperz.Set - test</title>
32 29
33 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script> 30 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script>
34 <script type="text/javascript" src="../../SimpleTest/SimpleTest.js"></script> 31 <script type="text/javascript" src="../../SimpleTest/SimpleTest.js"></script>
35 <link rel="stylesheet" type="text/css" href="../../SimpleTest/test.css"> 32 <link rel="stylesheet" type="text/css" href="../../SimpleTest/test.css">
36 33
37 <script type='text/javascript' src='../../../js/JSON/json2.js'></script> 34 <script type='text/javascript' src='../../../js/JSON/json2.js'></script>
38 35
39 <script type='text/javascript' src='../../../js/Clipperz/YUI/Utils.js'></script> 36 <script type='text/javascript' src='../../../js/Clipperz/YUI/Utils.js'></script>
40 <script type='text/javascript' src='../../../js/Clipperz/Base.js'></script> 37 <script type='text/javascript' src='../../../js/Clipperz/Base.js'></script>
41 <script type='text/javascript' src='../../../js/Clipperz/Set.js'></script> 38 <script type='text/javascript' src='../../../js/Clipperz/Set.js'></script>
42 <script type='text/javascript' src='../../../js/Clipperz/Logging.js'></script> 39 <script type='text/javascript' src='../../../js/Clipperz/Logging.js'></script>
43 <script type='text/javascript' src='../../../js/Clipperz/Async.js'></script> 40 <script type='text/javascript' src='../../../js/Clipperz/Async.js'></script>
44 41
45 <script type="text/javascript" src="../../SimpleTest/SimpleTest.Async.js"></script> 42 <script type="text/javascript" src="../../SimpleTest/SimpleTest.Async.js"></script>
46</head> 43</head>
47<body> 44<body>
48 45
49<pre id="test"> 46<pre id="test">
50<script type="text/javascript" src="Set.test.js"></script> 47<script type="text/javascript" src="Set.test.js"></script>
51</pre> 48</pre>
52</body> 49</body>
53</html> 50</html>
54 51
diff --git a/frontend/gamma/tests/tests/Clipperz/Set.test.js b/frontend/gamma/tests/tests/Clipperz/Set.test.js
index 8122b07..f908816 100644
--- a/frontend/gamma/tests/tests/Clipperz/Set.test.js
+++ b/frontend/gamma/tests/tests/Clipperz/Set.test.js
@@ -1,165 +1,162 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29var tests = { 26var tests = {
30 27
31 //------------------------------------------------------------------------- 28 //-------------------------------------------------------------------------
32 29
33 'set_test': function (someTestArgs) { 30 'set_test': function (someTestArgs) {
34 var deferredResult; 31 var deferredResult;
35 32
36 deferredResult = new Clipperz.Async.Deferred("set_test", someTestArgs); 33 deferredResult = new Clipperz.Async.Deferred("set_test", someTestArgs);
37 deferredResult.addCallback(function () { 34 deferredResult.addCallback(function () {
38 var set; 35 var set;
39 varobject1; 36 varobject1;
40 varobject2; 37 varobject2;
41 var object3; 38 var object3;
42 39
43 set = new Clipperz.Set(); 40 set = new Clipperz.Set();
44 41
45 object1 = new Object(); 42 object1 = new Object();
46 object2 = new Object(); 43 object2 = new Object();
47 object3 = new Object(); 44 object3 = new Object();
48 45
49 object1.label = "object 1"; 46 object1.label = "object 1";
50 object2.label = "object 2"; 47 object2.label = "object 2";
51 object3.label = "object 3"; 48 object3.label = "object 3";
52 49
53 is(set.size(), 0, "A new set should be empty"); 50 is(set.size(), 0, "A new set should be empty");
54 51
55 set.add(object1); 52 set.add(object1);
56 is(set.size(), 1); 53 is(set.size(), 1);
57 is(set.contains(object1), true); 54 is(set.contains(object1), true);
58 is(set.contains(object2), false); 55 is(set.contains(object2), false);
59 56
60 set.add(object1); 57 set.add(object1);
61 is(set.size(), 1, "Adding the same object twice does not change the set content"); 58 is(set.size(), 1, "Adding the same object twice does not change the set content");
62 is(set.contains(object1), true); 59 is(set.contains(object1), true);
63 is(set.contains(object2), false); 60 is(set.contains(object2), false);
64 61
65 set.add(object2); 62 set.add(object2);
66 is(set.size(), 2); 63 is(set.size(), 2);
67 is(set.contains(object1), true); 64 is(set.contains(object1), true);
68 is(set.contains(object2), true); 65 is(set.contains(object2), true);
69 is(set.contains(object3), false); 66 is(set.contains(object3), false);
70 67
71 set.remove(object1); 68 set.remove(object1);
72 is(set.size(), 1, "Size check after removing an object"); 69 is(set.size(), 1, "Size check after removing an object");
73 is(set.contains(object1), false); 70 is(set.contains(object1), false);
74 is(set.contains(object2), true); 71 is(set.contains(object2), true);
75 is(set.contains(object3), false); 72 is(set.contains(object3), false);
76 73
77 set.remove(object1); 74 set.remove(object1);
78 is(set.size(), 1, "Removing twice the same object does not change the set content"); 75 is(set.size(), 1, "Removing twice the same object does not change the set content");
79 is(set.contains(object1), false); 76 is(set.contains(object1), false);
80 is(set.contains(object2), true); 77 is(set.contains(object2), true);
81 is(set.contains(object3), false); 78 is(set.contains(object3), false);
82 79
83 set.empty(); 80 set.empty();
84 is(set.size(), 0); 81 is(set.size(), 0);
85 82
86 { 83 {
87 varitems; 84 varitems;
88 varpopulatedSet; 85 varpopulatedSet;
89 86
90 items = ["item1", "item2", "item3"]; 87 items = ["item1", "item2", "item3"];
91 88
92 populatedSet = new Clipperz.Set({'items': items}); 89 populatedSet = new Clipperz.Set({'items': items});
93 is(populatedSet.size(), 3); 90 is(populatedSet.size(), 3);
94 is(populatedSet.contains("item1"), true); 91 is(populatedSet.contains("item1"), true);
95 is(populatedSet.contains("item4"), false); 92 is(populatedSet.contains("item4"), false);
96 93
97 items.splice(0, items.length); 94 items.splice(0, items.length);
98 is(populatedSet.size(), 3); 95 is(populatedSet.size(), 3);
99 } 96 }
100 97
101 { 98 {
102 varitems; 99 varitems;
103 vardeletedItems; 100 vardeletedItems;
104 101
105 items = ["item1", "item2", "item3"]; 102 items = ["item1", "item2", "item3"];
106 103
107 set = new Clipperz.Set({'items': items}); 104 set = new Clipperz.Set({'items': items});
108 deletedItems = ["item1"]; 105 deletedItems = ["item1"];
109 set.remove(deletedItems); 106 set.remove(deletedItems);
110 is(set.size(), 2, "here I am"); 107 is(set.size(), 2, "here I am");
111 is(set.contains("item1"), false); 108 is(set.contains("item1"), false);
112 is(set.contains("item2"), true); 109 is(set.contains("item2"), true);
113 110
114 set = new Clipperz.Set({'items': items}); 111 set = new Clipperz.Set({'items': items});
115 deletedItems = ["item1", "item2"]; 112 deletedItems = ["item1", "item2"];
116 set.remove(deletedItems); 113 set.remove(deletedItems);
117 is(set.size(), 1); 114 is(set.size(), 1);
118 is(set.contains("item1"), false); 115 is(set.contains("item1"), false);
119 is(set.contains("item2"), false); 116 is(set.contains("item2"), false);
120 117
121 set = new Clipperz.Set({'items': items}); 118 set = new Clipperz.Set({'items': items});
122 deletedItems = ["item1", "item4"]; 119 deletedItems = ["item1", "item4"];
123 set.remove(deletedItems); 120 set.remove(deletedItems);
124 is(set.size(), 2); 121 is(set.size(), 2);
125 is(set.contains("item1"), false); 122 is(set.contains("item1"), false);
126 is(set.contains("item2"), true); 123 is(set.contains("item2"), true);
127 } 124 }
128 125
129 { 126 {
130 var items; 127 var items;
131 var poppedItem; 128 var poppedItem;
132 129
133 items = ["item1", "item2", "item3"]; 130 items = ["item1", "item2", "item3"];
134 set = new Clipperz.Set({'items': items}); 131 set = new Clipperz.Set({'items': items});
135 132
136 poppedItem = set.popAnItem(); 133 poppedItem = set.popAnItem();
137 ok(poppedItem != null, "test popAnItem - 1"); 134 ok(poppedItem != null, "test popAnItem - 1");
138 is(set.size(), 2, "test popAnItem - 2"); 135 is(set.size(), 2, "test popAnItem - 2");
139 136
140 poppedItem = set.popAnItem(); 137 poppedItem = set.popAnItem();
141 ok(poppedItem != null, "test popAnItem - 3"); 138 ok(poppedItem != null, "test popAnItem - 3");
142 is(set.size(), 1, "test popAnItem - 4"); 139 is(set.size(), 1, "test popAnItem - 4");
143 140
144 poppedItem = set.popAnItem(); 141 poppedItem = set.popAnItem();
145 ok(poppedItem != null, "test popAnItem - 5"); 142 ok(poppedItem != null, "test popAnItem - 5");
146 is(set.size(), 0, "test popAnItem - 6"); 143 is(set.size(), 0, "test popAnItem - 6");
147 144
148 poppedItem = set.popAnItem(); 145 poppedItem = set.popAnItem();
149 ok(poppedItem == null, "test popAnItem - 7"); 146 ok(poppedItem == null, "test popAnItem - 7");
150 } 147 }
151 }); 148 });
152 deferredResult.callback(); 149 deferredResult.callback();
153 150
154 return deferredResult; 151 return deferredResult;
155 }, 152 },
156 153
157 //------------------------------------------------------------------------- 154 //-------------------------------------------------------------------------
158 'syntaxFix': MochiKit.Base.noop 155 'syntaxFix': MochiKit.Base.noop
159}; 156};
160 157
161 158
162 159
163//############################################################################# 160//#############################################################################
164 161
165SimpleTest.runDeferredTests("Clipperz.Set", tests, {trace:false}); 162SimpleTest.runDeferredTests("Clipperz.Set", tests, {trace:false});
diff --git a/frontend/gamma/tests/tests/Clipperz/index.html b/frontend/gamma/tests/tests/Clipperz/index.html
index b4c4992..d4556eb 100644
--- a/frontend/gamma/tests/tests/Clipperz/index.html
+++ b/frontend/gamma/tests/tests/Clipperz/index.html
@@ -1,49 +1,46 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27--> 24-->
28 25
29<html> 26<html>
30<head> 27<head>
31 <title>Clipperz.* - tests</title> 28 <title>Clipperz.* - tests</title>
32 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script> 29 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script>
33 <script type="text/javascript" src="../../SimpleTest/TestRunner.js"></script> 30 <script type="text/javascript" src="../../SimpleTest/TestRunner.js"></script>
34</head> 31</head>
35<body> 32<body>
36<script> 33<script>
37TestRunner.runTests( 34TestRunner.runTests(
38 'Async.html', 35 'Async.html',
39 'Base.html', 36 'Base.html',
40 'ByteArray.html', 37 'ByteArray.html',
41 'Date.html', 38 'Date.html',
42 'DOM.html', 39 'DOM.html',
43 'KeePassExportProcessor.html', 40 'KeePassExportProcessor.html',
44 'RoboFormExportProcessor.html', 41 'RoboFormExportProcessor.html',
45 'Set.html' 42 'Set.html'
46); 43);
47</script> 44</script>
48</body> 45</body>
49</html> \ No newline at end of file 46</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 6e3249c..3878809 100644
--- a/frontend/gamma/tests/tests/Clipperz/index_googleCode.html
+++ b/frontend/gamma/tests/tests/Clipperz/index_googleCode.html
@@ -1,50 +1,47 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27--> 24-->
28 25
29<html> 26<html>
30<head> 27<head>
31 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script> 28 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script>
32 <script type="text/javascript" src="../../SimpleTest/TestRunner.js"></script> 29 <script type="text/javascript" src="../../SimpleTest/TestRunner.js"></script>
33</head> 30</head>
34<body> 31<body>
35<script> 32<script>
36TestRunner.runTests( 33TestRunner.runTests(
37 'Base.html', 34 'Base.html',
38 'ByteArray.html', 35 'ByteArray.html',
39 'NotificationCenter.html', 36 'NotificationCenter.html',
40 'Set.html', 37 'Set.html',
41 'Crypto/AES.html', 38 'Crypto/AES.html',
42 'Crypto/BigInt.html', 39 'Crypto/BigInt.html',
43 'Crypto/PRNG.html', 40 'Crypto/PRNG.html',
44 'Crypto/SHA.html', 41 'Crypto/SHA.html',
45 'Crypto/ECC.html', 42 'Crypto/ECC.html',
46 'Crypto/SRP.html' 43 'Crypto/SRP.html'
47); 44);
48</script> 45</script>
49</body> 46</body>
50</html> \ No newline at end of file 47</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 46572ab..bac17d1 100644
--- a/frontend/gamma/tests/tests/Clipperz/index_testECC.html
+++ b/frontend/gamma/tests/tests/Clipperz/index_testECC.html
@@ -1,50 +1,47 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27--> 24-->
28 25
29<html> 26<html>
30<head> 27<head>
31 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script> 28 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script>
32 <script type="text/javascript" src="../../SimpleTest/TestRunner.js"></script> 29 <script type="text/javascript" src="../../SimpleTest/TestRunner.js"></script>
33</head> 30</head>
34<body> 31<body>
35<script> 32<script>
36TestRunner.runTests( 33TestRunner.runTests(
37 //'Base.html', 34 //'Base.html',
38 'ByteArray.html', 35 'ByteArray.html',
39 //'Crypto/AES.html', 36 //'Crypto/AES.html',
40 'Crypto/BigInt.html', 37 'Crypto/BigInt.html',
41 //'Crypto/PRNG.html', 38 //'Crypto/PRNG.html',
42 //'Crypto/SHA.html', 39 //'Crypto/SHA.html',
43 //'Crypto/SRP.html', 40 //'Crypto/SRP.html',
44 //'Crypto/ECC.html', 41 //'Crypto/ECC.html',
45 'Crypto/ECC.BinaryField.FiniteField.html', 42 'Crypto/ECC.BinaryField.FiniteField.html',
46 'Crypto/ECC.BinaryField.Value.html' 43 'Crypto/ECC.BinaryField.Value.html'
47); 44);
48</script> 45</script>
49</body> 46</body>
50</html> \ No newline at end of file 47</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 21b6af6..d2136af 100644
--- a/frontend/gamma/tests/tests/Components/CardDialogEditing/CardDialogEditing_test.js
+++ b/frontend/gamma/tests/tests/Components/CardDialogEditing/CardDialogEditing_test.js
@@ -1,238 +1,235 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.Tests.CardDialogEditing'); 26Clipperz.Base.module('Clipperz.Tests.CardDialogEditing');
30 27
31Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); 28Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
32Clipperz.PM.Strings.Languages.initSetup(); 29Clipperz.PM.Strings.Languages.initSetup();
33 30
34Clipperz.Tests.CardDialogEditing.Tester = function(args) { 31Clipperz.Tests.CardDialogEditing.Tester = function(args) {
35 args = args || {}; 32 args = args || {};
36 33
37 Clipperz.Tests.CardDialogEditing.Tester.superclass.constructor.call(this, args); 34 Clipperz.Tests.CardDialogEditing.Tester.superclass.constructor.call(this, args);
38 //#this._user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); 35 //#this._user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}});
39 this._user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); 36 this._user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
40 37
41 return this; 38 return this;
42}; 39};
43 40
44Clipperz.Base.extend(Clipperz.Tests.CardDialogEditing.Tester, Object, { 41Clipperz.Base.extend(Clipperz.Tests.CardDialogEditing.Tester, Object, {
45 42
46 'toString': function() { 43 'toString': function() {
47 return "Clipperz.Tests.CardDialogEditing.Tester"; 44 return "Clipperz.Tests.CardDialogEditing.Tester";
48 }, 45 },
49 46
50 //------------------------------------------------------------------------- 47 //-------------------------------------------------------------------------
51 48
52 'user': function () { 49 'user': function () {
53 return this._user; 50 return this._user;
54 }, 51 },
55 52
56 //------------------------------------------------------------------------- 53 //-------------------------------------------------------------------------
57 54
58 'run': function () { 55 'run': function () {
59 var deferredResult; 56 var deferredResult;
60 var proxy; 57 var proxy;
61 varcardDialogController; 58 varcardDialogController;
62 varcardDialogComponent; 59 varcardDialogComponent;
63 60
64 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); 61 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false});
65 62
66 deferredResult = new Clipperz.Async.Deferred("CardDialogEditing_test.init", {trace:false}); 63 deferredResult = new Clipperz.Async.Deferred("CardDialogEditing_test.init", {trace:false});
67 //# deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']); 64 //# deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']);
68 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data_newVersion']); 65 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data_newVersion']);
69 deferredResult.addMethod(this.user(), 'login'); 66 deferredResult.addMethod(this.user(), 'login');
70 //# deferredResult.addMethod(this.user(), 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); 67 //# deferredResult.addMethod(this.user(), 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13');
71 68
72 // deferredResult.addMethod(this.user(), 'getRecord', '062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80'); //Linkedin 69 // deferredResult.addMethod(this.user(), 'getRecord', '062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80'); //Linkedin
73 // deferredResult.addMethod(this.user(), 'getRecord', '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d'); //Example Attack 70 // deferredResult.addMethod(this.user(), 'getRecord', '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d'); //Example Attack
74 deferredResult.addMethod(this.user(), 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551'); //Amazon 71 deferredResult.addMethod(this.user(), 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551'); //Amazon
75 // deferredResult.addMethod(this.user(), 'getRecord', '507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a'); //MyBlogLog 72 // deferredResult.addMethod(this.user(), 'getRecord', '507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a'); //MyBlogLog
76 // deferredResult.addMethod(this.user(), 'getRecord', '6026370f3db3860d2c46a08e389a7e906dc14f98c8444b21be9a7e9f405a2728'); //Del.icio.us 73 // deferredResult.addMethod(this.user(), 'getRecord', '6026370f3db3860d2c46a08e389a7e906dc14f98c8444b21be9a7e9f405a2728'); //Del.icio.us
77 // deferredResult.addMethod(this.user(), 'getRecord', '6c25be8e145efb26a1abd59590522f73fb2e3dbc139af2217074d9e2ba92c16a'); //Microsoft Office Key 74 // deferredResult.addMethod(this.user(), 'getRecord', '6c25be8e145efb26a1abd59590522f73fb2e3dbc139af2217074d9e2ba92c16a'); //Microsoft Office Key
78 // deferredResult.addMethod(this.user(), 'getRecord', '6d45c2fec275b7482d41c76b20507100cfb6ab49922b876f9dd3040d361f4a18'); //The NewYork Times 75 // deferredResult.addMethod(this.user(), 'getRecord', '6d45c2fec275b7482d41c76b20507100cfb6ab49922b876f9dd3040d361f4a18'); //The NewYork Times
79 // deferredResult.addMethod(this.user(), 'getRecord', '7bb69b6366a8012f181c01e368ba18d4f7a82bcabb4959189736ad124c4bbfbb'); //Web Password 76 // deferredResult.addMethod(this.user(), 'getRecord', '7bb69b6366a8012f181c01e368ba18d4f7a82bcabb4959189736ad124c4bbfbb'); //Web Password
80 // deferredResult.addMethod(this.user(), 'getRecord', '8b18e8593b5bc2f7ea39a5fab222047034ef2f380fee05be0fa6e1c0972fea39'); //Jaiku 77 // deferredResult.addMethod(this.user(), 'getRecord', '8b18e8593b5bc2f7ea39a5fab222047034ef2f380fee05be0fa6e1c0972fea39'); //Jaiku
81 // deferredResult.addMethod(this.user(), 'getRecord', '9dcd2a8a0fcb7e57d234dc4fea347f020a6a01793e40cf56a0d22379e590e291'); //Home Burglar Alarm 78 // deferredResult.addMethod(this.user(), 'getRecord', '9dcd2a8a0fcb7e57d234dc4fea347f020a6a01793e40cf56a0d22379e590e291'); //Home Burglar Alarm
82 // deferredResult.addMethod(this.user(), 'getRecord', 'ca01bcb7691f70818feed46c9a2a91883ac543997a395535aedbb49de166690c'); //MySpace 79 // deferredResult.addMethod(this.user(), 'getRecord', 'ca01bcb7691f70818feed46c9a2a91883ac543997a395535aedbb49de166690c'); //MySpace
83 // deferredResult.addMethod(this.user(), 'getRecord', 'd620764a656bfd4e1d3758500d5db72e460a0cf729d56ed1a7755b5725c50045'); //American Airlines 80 // deferredResult.addMethod(this.user(), 'getRecord', 'd620764a656bfd4e1d3758500d5db72e460a0cf729d56ed1a7755b5725c50045'); //American Airlines
84 // deferredResult.addMethod(this.user(), 'getRecord', 'de13c0d036234c44214062bc0a89e5f127470c464333493a485729f43cdc26e4'); //Luftansa 81 // deferredResult.addMethod(this.user(), 'getRecord', 'de13c0d036234c44214062bc0a89e5f127470c464333493a485729f43cdc26e4'); //Luftansa
85 // deferredResult.addMethod(this.user(), 'getRecord', 'eeda70e0392261967bda71c3764da78989c45bbd2bb7be6b941b90f81d9b81b5'); //Google Account 82 // deferredResult.addMethod(this.user(), 'getRecord', 'eeda70e0392261967bda71c3764da78989c45bbd2bb7be6b941b90f81d9b81b5'); //Google Account
86 // deferredResult.addMethod(this.user(), 'getRecord', 'f215d89bf4583c12f5ed4f4330f488dad3fffa448f4dc784f15ef135dda2c732'); //Expedia 83 // deferredResult.addMethod(this.user(), 'getRecord', 'f215d89bf4583c12f5ed4f4330f488dad3fffa448f4dc784f15ef135dda2c732'); //Expedia
87 // deferredResult.addMethod(this.user(), 'getRecord', 'fe21497ef7435d31f9746c132e4b5ecf5aac5f13b5961ddb55d2bdc3409f28f6'); //Bloglines 84 // deferredResult.addMethod(this.user(), 'getRecord', 'fe21497ef7435d31f9746c132e4b5ecf5aac5f13b5961ddb55d2bdc3409f28f6'); //Bloglines
88 85
89 // deferredResult.addMethod(this.user(), 'getRecord', '5cdac63b317f3942da38f3a3de3b7f0e5d6678200951c6216230295550f63fb4'); //WEB PASSWORD (0) 86 // deferredResult.addMethod(this.user(), 'getRecord', '5cdac63b317f3942da38f3a3de3b7f0e5d6678200951c6216230295550f63fb4'); //WEB PASSWORD (0)
90 // deferredResult.addMethod(this.user(), 'getRecord', '36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113'); //DIGG (1) 87 // deferredResult.addMethod(this.user(), 'getRecord', '36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113'); //DIGG (1)
91 // deferredResult.addMethod(this.user(), 'getRecord', 'c0ce9130ca365bb02418d4305ea1d29e49c3f0e96d44b9d3cb6b4b6843d25065'); //SAP (2) 88 // deferredResult.addMethod(this.user(), 'getRecord', 'c0ce9130ca365bb02418d4305ea1d29e49c3f0e96d44b9d3cb6b4b6843d25065'); //SAP (2)
92 // deferredResult.addMethod(this.user(), 'getRecord', 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'); //YAHOO (4) 89 // deferredResult.addMethod(this.user(), 'getRecord', 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'); //YAHOO (4)
93 90
94 // deferredResult.addMethod(this.user(), 'createNewRecord'); 91 // deferredResult.addMethod(this.user(), 'createNewRecord');
95 92
96/* 93/*
97 deferredResult.addCallback(function (aRecord) { 94 deferredResult.addCallback(function (aRecord) {
98 return Clipperz.Async.callbacks("CardDialogEditing_test.init - setup new record", [ 95 return Clipperz.Async.callbacks("CardDialogEditing_test.init - setup new record", [
99 MochiKit.Base.method(aRecord, 'setLabel', "Clipperz staging site"), 96 MochiKit.Base.method(aRecord, 'setLabel', "Clipperz staging site"),
100 MochiKit.Base.method(aRecord, 'addField', {'label':"URL", 'value':"http://d6.clipperz.com", 'isHidden':false}), 97 MochiKit.Base.method(aRecord, 'addField', {'label':"URL", 'value':"http://d6.clipperz.com", 'isHidden':false}),
101 MochiKit.Base.method(aRecord, 'addField', {'label':"USERNAME", 'value':"staging", 'isHidden':false}), 98 MochiKit.Base.method(aRecord, 'addField', {'label':"USERNAME", 'value':"staging", 'isHidden':false}),
102 MochiKit.Base.method(aRecord, 'addField', {'label':"PASSWORD", 'value':"drupal", 'isHidden':true}), 99 MochiKit.Base.method(aRecord, 'addField', {'label':"PASSWORD", 'value':"drupal", 'isHidden':true}),
103 100
104 MochiKit.Base.method(aRecord, 'createNewDirectLogin'), 101 MochiKit.Base.method(aRecord, 'createNewDirectLogin'),
105 function (aDirectLogin) { 102 function (aDirectLogin) {
106 return Clipperz.Async.callbacks("CardDialogEditing_test.init - setup new record [directLogin]", [ 103 return Clipperz.Async.callbacks("CardDialogEditing_test.init - setup new record [directLogin]", [
107 MochiKit.Base.method(aDirectLogin, 'setLabel', 'Clipperz staging site'), 104 MochiKit.Base.method(aDirectLogin, 'setLabel', 'Clipperz staging site'),
108 MochiKit.Base.method(aDirectLogin, 'setFavicon', 'http://www.apple.com/favicon.ico'), 105 MochiKit.Base.method(aDirectLogin, 'setFavicon', 'http://www.apple.com/favicon.ico'),
109 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"}'), 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"}'),
110 107
111 MochiKit.Base.method(aDirectLogin, 'bindFormFieldWithLabelToRecordFieldWithLabel', 'url', 'URL'), 108 MochiKit.Base.method(aDirectLogin, 'bindFormFieldWithLabelToRecordFieldWithLabel', 'url', 'URL'),
112 MochiKit.Base.method(aDirectLogin, 'bindFormFieldWithLabelToRecordFieldWithLabel', 'username', 'USERNAME'), 109 MochiKit.Base.method(aDirectLogin, 'bindFormFieldWithLabelToRecordFieldWithLabel', 'username', 'USERNAME'),
113 MochiKit.Base.method(aDirectLogin, 'bindFormFieldWithLabelToRecordFieldWithLabel', 'password', 'PASSWORD') 110 MochiKit.Base.method(aDirectLogin, 'bindFormFieldWithLabelToRecordFieldWithLabel', 'password', 'PASSWORD')
114 ], {trace:false}); 111 ], {trace:false});
115 }, 112 },
116 MochiKit.Base.partial(MochiKit.Async.succeed, aRecord) 113 MochiKit.Base.partial(MochiKit.Async.succeed, aRecord)
117 ], {trace:false}); 114 ], {trace:false});
118 }); 115 });
119 116
120 // deferredResult.addMethod(this.user(), 'createNewRecord'); 117 // deferredResult.addMethod(this.user(), 'createNewRecord');
121 deferredResult.addCallback(function (aRecord) { 118 deferredResult.addCallback(function (aRecord) {
122 return Clipperz.Async.callbacks("CardDialogEditing_test.init - setup another record", [ 119 return Clipperz.Async.callbacks("CardDialogEditing_test.init - setup another record", [
123 MochiKit.Base.method(aRecord, 'setLabel', "Twitter site"), 120 MochiKit.Base.method(aRecord, 'setLabel', "Twitter site"),
124 MochiKit.Base.method(aRecord, 'addField', {'label':"twitter_url", 'value':"http://www.twitter.com", 'isHidden':false}), 121 MochiKit.Base.method(aRecord, 'addField', {'label':"twitter_url", 'value':"http://www.twitter.com", 'isHidden':false}),
125 MochiKit.Base.method(aRecord, 'addField', {'label':"twitter_username", 'value':"staging", 'isHidden':false}), 122 MochiKit.Base.method(aRecord, 'addField', {'label':"twitter_username", 'value':"staging", 'isHidden':false}),
126 MochiKit.Base.method(aRecord, 'addField', {'label':"twitter_password", 'value':"drupal", 'isHidden':true}), 123 MochiKit.Base.method(aRecord, 'addField', {'label':"twitter_password", 'value':"drupal", 'isHidden':true}),
127 124
128 MochiKit.Base.method(aRecord, 'createNewDirectLogin'), 125 MochiKit.Base.method(aRecord, 'createNewDirectLogin'),
129 function (aDirectLogin) { 126 function (aDirectLogin) {
130 return Clipperz.Async.callbacks("CardDialogEditing_test.init - setup another record [directLogin]", [ 127 return Clipperz.Async.callbacks("CardDialogEditing_test.init - setup another record [directLogin]", [
131 MochiKit.Base.method(aDirectLogin, 'setLabel', 'Twitter'), 128 MochiKit.Base.method(aDirectLogin, 'setLabel', 'Twitter'),
132 MochiKit.Base.method(aDirectLogin, 'setFavicon', 'http://www.twitter.com/favicon.ico'), 129 MochiKit.Base.method(aDirectLogin, 'setFavicon', 'http://www.twitter.com/favicon.ico'),
133 MochiKit.Base.method(aDirectLogin, 'setBookmarkletConfiguration', '{"page": {"title": "Twitter"},\n"form": {"attributes": {"action": "https://twitter.com/sessions",\n"method": "post"},\n"inputs": [{"type": "hidden",\n"name": "authenticity_token",\n"value": "b78a9460629980ed4c705fe94e6c4f37bfc32fed"},\n{"type": "text",\n"name": "session[username_or_email]",\n"value": ""},\n{"type": "password",\n"name": "session[password]",\n"value": ""},\n{"type": "checkbox",\n"name": "remember_me",\n"value": "1"},\n{"type": "hidden",\n"name": "q",\n"value": ""}]},\n"version": "0.2.3"}'), 130 MochiKit.Base.method(aDirectLogin, 'setBookmarkletConfiguration', '{"page": {"title": "Twitter"},\n"form": {"attributes": {"action": "https://twitter.com/sessions",\n"method": "post"},\n"inputs": [{"type": "hidden",\n"name": "authenticity_token",\n"value": "b78a9460629980ed4c705fe94e6c4f37bfc32fed"},\n{"type": "text",\n"name": "session[username_or_email]",\n"value": ""},\n{"type": "password",\n"name": "session[password]",\n"value": ""},\n{"type": "checkbox",\n"name": "remember_me",\n"value": "1"},\n{"type": "hidden",\n"name": "q",\n"value": ""}]},\n"version": "0.2.3"}'),
134 131
135 MochiKit.Base.method(aDirectLogin, 'bindFormFieldWithLabelToRecordFieldWithLabel', 'session[username_or_email]', 'twitter_username'), 132 MochiKit.Base.method(aDirectLogin, 'bindFormFieldWithLabelToRecordFieldWithLabel', 'session[username_or_email]', 'twitter_username'),
136 MochiKit.Base.method(aDirectLogin, 'bindFormFieldWithLabelToRecordFieldWithLabel', 'session[password]', 'twitter_password'), 133 MochiKit.Base.method(aDirectLogin, 'bindFormFieldWithLabelToRecordFieldWithLabel', 'session[password]', 'twitter_password'),
137 134
138 MochiKit.Base.method(aDirectLogin, 'formValues'), 135 MochiKit.Base.method(aDirectLogin, 'formValues'),
139 MochiKit.Base.itemgetter('remember_me'), 136 MochiKit.Base.itemgetter('remember_me'),
140 MochiKit.Base.methodcaller('setValue', 1) 137 MochiKit.Base.methodcaller('setValue', 1)
141 138
142 ], {trace:false}); 139 ], {trace:false});
143 }, 140 },
144 MochiKit.Base.partial(MochiKit.Async.succeed, aRecord) 141 MochiKit.Base.partial(MochiKit.Async.succeed, aRecord)
145 ], {trace:false}); 142 ], {trace:false});
146 }); 143 });
147 144
148 // deferredResult.addMethod(this.user(), 'createNewRecord'); 145 // deferredResult.addMethod(this.user(), 'createNewRecord');
149 deferredResult.addCallback(function (aRecord) { 146 deferredResult.addCallback(function (aRecord) {
150 return Clipperz.Async.callbacks("CardDialogEditing_test.init - setup third record", [ 147 return Clipperz.Async.callbacks("CardDialogEditing_test.init - setup third record", [
151 MochiKit.Base.method(aRecord, 'setLabel', "R@cine"), 148 MochiKit.Base.method(aRecord, 'setLabel', "R@cine"),
152 MochiKit.Base.method(aRecord, 'addField', {'label':"R@cine_username", 'value':"joe", 'isHidden':false}), 149 MochiKit.Base.method(aRecord, 'addField', {'label':"R@cine_username", 'value':"joe", 'isHidden':false}),
153 MochiKit.Base.method(aRecord, 'addField', {'label':"R@cine_password", 'value':"clipperz", 'isHidden':true}), 150 MochiKit.Base.method(aRecord, 'addField', {'label':"R@cine_password", 'value':"clipperz", 'isHidden':true}),
154 151
155 MochiKit.Base.method(aRecord, 'createNewDirectLogin'), 152 MochiKit.Base.method(aRecord, 'createNewDirectLogin'),
156 function (aDirectLogin) { 153 function (aDirectLogin) {
157 return Clipperz.Async.callbacks("CardDialogEditing_test.init - setup third record [directLogin]", [ 154 return Clipperz.Async.callbacks("CardDialogEditing_test.init - setup third record [directLogin]", [
158 MochiKit.Base.method(aDirectLogin, 'setLabel', 'R@cine'), 155 MochiKit.Base.method(aDirectLogin, 'setLabel', 'R@cine'),
159 MochiKit.Base.method(aDirectLogin, 'setFavicon', 'http://www.racine.ra.it/horde/imp/graphics/favicon.ico'), 156 MochiKit.Base.method(aDirectLogin, 'setFavicon', 'http://www.racine.ra.it/horde/imp/graphics/favicon.ico'),
160 MochiKit.Base.method(aDirectLogin, 'setBookmarkletConfiguration', '{"page": {"title": "IMP :: Welcome to Horde"},\n"form": {"attributes": {"action": "http://www.racine.ra.it/horde/imp/redirect.php",\n"method": "post"},\n"inputs": [{"type": "hidden",\n"name": "actionID",\n"value": "105"},\n{"type": "hidden",\n"name": "url",\n"value": ""},\n{"type": "hidden",\n"name": "mailbox",\n"value": "INBOX"},\n{"type": "text",\n"name": "imapuser",\n"value": ""},\n{"type": "password",\n"name": "pass",\n"value": ""},\n{"type": "hidden",\n"name": "server",\n"value": "localhost"},\n{"type": "hidden",\n"name": "port",\n"value": "143"},\n{"type": "hidden",\n"name": "namespace",\n"value": ""},\n{"type": "hidden",\n"name": "maildomain",\n"value": "racine.ra.it"},\n{"type": "hidden",\n"name": "protocol",\n"value": "imap/notls"},\n{"type": "hidden",\n"name": "realm",\n"value": "racine.ra.it"},\n{"type": "hidden",\n"name": "folders",\n"value": "mail/"},\n{"type": "select",\n"name": "new_lang",\n"options": [{"selected": false,\n"label": "Bulgarian",\n"value": "bg_BG"},\n{"selected": false,\n"label": "Chinese (Simplified)",\n"value": "zh_CN"},\n{"selected": false,\n"label": "Chinese (Traditional)",\n"value": "zh_TW"},\n{"selected": false,\n"label": "Czech",\n"value": "cs_CZ"},\n{"selected": false,\n"label": "Dansk",\n"value": "da_DK"},\n{"selected": false,\n"label": "Deutsch",\n"value": "de_DE"},\n{"selected": false,\n"label": "English (GB)",\n"value": "en_GB"},\n{"selected": true,\n"label": "English (US)",\n"value": "en_US"},\n{"selected": false,\n"label": "Español",\n"value": "es_ES"},\n{"selected": false,\n"label": "Eesti",\n"value": "et_EE"},\n{"selected": false,\n"label": "Français",\n"value": "fr_FR"},\n{"selected": false,\n"label": "Greek",\n"value": "el_GR"},\n{"selected": false,\n"label": "Italiano",\n"value": "it_IT"},\n{"selected": false,\n"label": "Japanese",\n"value": "ja_JP"},\n{"selected": false,\n"label": "Korean",\n"value": "ko_KR"},\n{"selected": false,\n"label": "Latviešu",\n"value": "lv_LV"},\n{"selected": false,\n"label": "Lietuviskas",\n"value": "lt_LT"},\n{"selected": false,\n"label": "Magyar",\n"value": "hu_HU"},\n{"selected": false,\n"label": "Nederlands",\n"value": "nl_NL"},\n{"selected": false,\n"label": "Norsk bokmål",\n"value": "nb_NO"},\n{"selected": false,\n"label": "Norsk nynorsk",\n"value": "nn_NO"},\n{"selected": false,\n"label": "Polski",\n"value": "pl_PL"},\n{"selected": false,\n"label": "Português",\n"value": "pt_PT"},\n{"selected": false,\n"label": "Português Brasileiro",\n"value": "pt_BR"},\n{"selected": false,\n"label": "Romana",\n"value": "ro_RO"},\n{"selected": false,\n"label": "Russian (Windows)",\n"value": "ru_RU"},\n{"selected": false,\n"label": "Russian (KOI8-R)",\n"value": "ru_RU.KOI8-R"},\n{"selected": false,\n"label": "Slovak",\n"value": "sk_SK"},\n{"selected": false,\n"label": "Slovenscina",\n"value": "sl_SI"},\n{"selected": false,\n"label": "Suomi",\n"value": "fi_FI"},\n{"selected": false,\n"label": "Svenska",\n"value": "sv_SE"},\n{"selected": false,\n"label": "Ukranian",\n"value": "uk_UA"}]},\n{"type": "submit",\n"name": "button",\n"value": "Log in"}]},\n"version": "0.2.3"}'), 157 MochiKit.Base.method(aDirectLogin, 'setBookmarkletConfiguration', '{"page": {"title": "IMP :: Welcome to Horde"},\n"form": {"attributes": {"action": "http://www.racine.ra.it/horde/imp/redirect.php",\n"method": "post"},\n"inputs": [{"type": "hidden",\n"name": "actionID",\n"value": "105"},\n{"type": "hidden",\n"name": "url",\n"value": ""},\n{"type": "hidden",\n"name": "mailbox",\n"value": "INBOX"},\n{"type": "text",\n"name": "imapuser",\n"value": ""},\n{"type": "password",\n"name": "pass",\n"value": ""},\n{"type": "hidden",\n"name": "server",\n"value": "localhost"},\n{"type": "hidden",\n"name": "port",\n"value": "143"},\n{"type": "hidden",\n"name": "namespace",\n"value": ""},\n{"type": "hidden",\n"name": "maildomain",\n"value": "racine.ra.it"},\n{"type": "hidden",\n"name": "protocol",\n"value": "imap/notls"},\n{"type": "hidden",\n"name": "realm",\n"value": "racine.ra.it"},\n{"type": "hidden",\n"name": "folders",\n"value": "mail/"},\n{"type": "select",\n"name": "new_lang",\n"options": [{"selected": false,\n"label": "Bulgarian",\n"value": "bg_BG"},\n{"selected": false,\n"label": "Chinese (Simplified)",\n"value": "zh_CN"},\n{"selected": false,\n"label": "Chinese (Traditional)",\n"value": "zh_TW"},\n{"selected": false,\n"label": "Czech",\n"value": "cs_CZ"},\n{"selected": false,\n"label": "Dansk",\n"value": "da_DK"},\n{"selected": false,\n"label": "Deutsch",\n"value": "de_DE"},\n{"selected": false,\n"label": "English (GB)",\n"value": "en_GB"},\n{"selected": true,\n"label": "English (US)",\n"value": "en_US"},\n{"selected": false,\n"label": "Español",\n"value": "es_ES"},\n{"selected": false,\n"label": "Eesti",\n"value": "et_EE"},\n{"selected": false,\n"label": "Français",\n"value": "fr_FR"},\n{"selected": false,\n"label": "Greek",\n"value": "el_GR"},\n{"selected": false,\n"label": "Italiano",\n"value": "it_IT"},\n{"selected": false,\n"label": "Japanese",\n"value": "ja_JP"},\n{"selected": false,\n"label": "Korean",\n"value": "ko_KR"},\n{"selected": false,\n"label": "Latviešu",\n"value": "lv_LV"},\n{"selected": false,\n"label": "Lietuviskas",\n"value": "lt_LT"},\n{"selected": false,\n"label": "Magyar",\n"value": "hu_HU"},\n{"selected": false,\n"label": "Nederlands",\n"value": "nl_NL"},\n{"selected": false,\n"label": "Norsk bokmål",\n"value": "nb_NO"},\n{"selected": false,\n"label": "Norsk nynorsk",\n"value": "nn_NO"},\n{"selected": false,\n"label": "Polski",\n"value": "pl_PL"},\n{"selected": false,\n"label": "Português",\n"value": "pt_PT"},\n{"selected": false,\n"label": "Português Brasileiro",\n"value": "pt_BR"},\n{"selected": false,\n"label": "Romana",\n"value": "ro_RO"},\n{"selected": false,\n"label": "Russian (Windows)",\n"value": "ru_RU"},\n{"selected": false,\n"label": "Russian (KOI8-R)",\n"value": "ru_RU.KOI8-R"},\n{"selected": false,\n"label": "Slovak",\n"value": "sk_SK"},\n{"selected": false,\n"label": "Slovenscina",\n"value": "sl_SI"},\n{"selected": false,\n"label": "Suomi",\n"value": "fi_FI"},\n{"selected": false,\n"label": "Svenska",\n"value": "sv_SE"},\n{"selected": false,\n"label": "Ukranian",\n"value": "uk_UA"}]},\n{"type": "submit",\n"name": "button",\n"value": "Log in"}]},\n"version": "0.2.3"}'),
161 158
162 MochiKit.Base.method(aDirectLogin, 'bindFormFieldWithLabelToRecordFieldWithLabel', 'imapuser', 'R@cine_username'), 159 MochiKit.Base.method(aDirectLogin, 'bindFormFieldWithLabelToRecordFieldWithLabel', 'imapuser', 'R@cine_username'),
163 MochiKit.Base.method(aDirectLogin, 'bindFormFieldWithLabelToRecordFieldWithLabel', 'pass', 'R@cine_password'), 160 MochiKit.Base.method(aDirectLogin, 'bindFormFieldWithLabelToRecordFieldWithLabel', 'pass', 'R@cine_password'),
164 161
165 MochiKit.Base.method(aDirectLogin, 'formValues'), 162 MochiKit.Base.method(aDirectLogin, 'formValues'),
166 MochiKit.Base.itemgetter('new_lang'), 163 MochiKit.Base.itemgetter('new_lang'),
167 MochiKit.Base.methodcaller('setValue', 'en_US') 164 MochiKit.Base.methodcaller('setValue', 'en_US')
168 165
169 ], {trace:false}); 166 ], {trace:false});
170 }, 167 },
171 MochiKit.Base.partial(MochiKit.Async.succeed, aRecord) 168 MochiKit.Base.partial(MochiKit.Async.succeed, aRecord)
172 ], {trace:false}); 169 ], {trace:false});
173 }); 170 });
174*/ 171*/
175 172
176 deferredResult.addCallback(function (aRecord) { 173 deferredResult.addCallback(function (aRecord) {
177 return Clipperz.Async.callbacks("CardDialogEditing_test.init - setup Kiva", [ 174 return Clipperz.Async.callbacks("CardDialogEditing_test.init - setup Kiva", [
178 MochiKit.Base.method(aRecord, 'setLabel', "KIVA"), 175 MochiKit.Base.method(aRecord, 'setLabel', "KIVA"),
179 MochiKit.Base.method(aRecord, 'addField', {'label':"kiva_email", 'value':"giulio.cesare@solaroli.it", 'isHidden':false}), 176 MochiKit.Base.method(aRecord, 'addField', {'label':"kiva_email", 'value':"giulio.cesare@solaroli.it", 'isHidden':false}),
180 MochiKit.Base.method(aRecord, 'addField', {'label':"kiva_password", 'value':"G0ELE0ngyTZf", 'isHidden':true}), 177 MochiKit.Base.method(aRecord, 'addField', {'label':"kiva_password", 'value':"G0ELE0ngyTZf", 'isHidden':true}),
181 178
182 MochiKit.Base.method(aRecord, 'createNewDirectLogin'), 179 MochiKit.Base.method(aRecord, 'createNewDirectLogin'),
183 function (aDirectLogin) { 180 function (aDirectLogin) {
184 return Clipperz.Async.callbacks("CardDialogEditing_test.init - setup Kiva [directLogin]", [ 181 return Clipperz.Async.callbacks("CardDialogEditing_test.init - setup Kiva [directLogin]", [
185 MochiKit.Base.method(aDirectLogin, 'setLabel', 'Kiva'), 182 MochiKit.Base.method(aDirectLogin, 'setLabel', 'Kiva'),
186 MochiKit.Base.method(aDirectLogin, 'setFavicon', 'http://www.kiva.org/favicon.ico'), 183 MochiKit.Base.method(aDirectLogin, 'setFavicon', 'http://www.kiva.org/favicon.ico'),
187 MochiKit.Base.method(aDirectLogin, 'setBookmarkletConfiguration', '{\n "page": {\n "title": "kiva.org"\n },\n "form": {\n "attributes": {\n "action": "https://www.kiva.org/app.php?page=login&action=doLogin",\n "method": "post"\n },\n "inputs": [\n {\n "type": "text",\n "name": "email",\n "value": ""\n },\n {\n "type": "password",\n "name": "password",\n "value": ""\n },\n {\n "type": "submit",\n "name": "submit",\n "value": "Login >>"\n },\n {\n "type": "hidden",\n "name": "currURL",\n "value": "https://www.kiva.org/app.php?page=login"\n }\n ]\n },\n "version": "0.2.3"\n}'), 184 MochiKit.Base.method(aDirectLogin, 'setBookmarkletConfiguration', '{\n "page": {\n "title": "kiva.org"\n },\n "form": {\n "attributes": {\n "action": "https://www.kiva.org/app.php?page=login&action=doLogin",\n "method": "post"\n },\n "inputs": [\n {\n "type": "text",\n "name": "email",\n "value": ""\n },\n {\n "type": "password",\n "name": "password",\n "value": ""\n },\n {\n "type": "submit",\n "name": "submit",\n "value": "Login >>"\n },\n {\n "type": "hidden",\n "name": "currURL",\n "value": "https://www.kiva.org/app.php?page=login"\n }\n ]\n },\n "version": "0.2.3"\n}'),
188 185
189 MochiKit.Base.method(aDirectLogin, 'bindFormFieldWithLabelToRecordFieldWithLabel', 'email', 'kiva_email'), 186 MochiKit.Base.method(aDirectLogin, 'bindFormFieldWithLabelToRecordFieldWithLabel', 'email', 'kiva_email'),
190 MochiKit.Base.method(aDirectLogin, 'bindFormFieldWithLabelToRecordFieldWithLabel', 'password', 'kiva_password') 187 MochiKit.Base.method(aDirectLogin, 'bindFormFieldWithLabelToRecordFieldWithLabel', 'password', 'kiva_password')
191 ], {trace:false}); 188 ], {trace:false});
192 }, 189 },
193 MochiKit.Base.partial(MochiKit.Async.succeed, aRecord) 190 MochiKit.Base.partial(MochiKit.Async.succeed, aRecord)
194 ], {trace:false}); 191 ], {trace:false});
195 }); 192 });
196 193
197 deferredResult.addCallback(MochiKit.Base.bind(function (aRecord) { 194 deferredResult.addCallback(MochiKit.Base.bind(function (aRecord) {
198 cardDialogController = new Clipperz.PM.UI.Web.Controllers.CardDialogController({record:aRecord, delegate:this}); 195 cardDialogController = new Clipperz.PM.UI.Web.Controllers.CardDialogController({record:aRecord, delegate:this});
199 cardDialogController.run(); 196 cardDialogController.run();
200 }, this)); 197 }, this));
201 deferredResult.callback(); 198 deferredResult.callback();
202 199
203 return deferredResult; 200 return deferredResult;
204 }, 201 },
205 202
206 //========================================================================= 203 //=========================================================================
207 204
208 'saveChanges': function () { 205 'saveChanges': function () {
209 return this.user().saveChanges(); 206 return this.user().saveChanges();
210 }, 207 },
211 208
212 //------------------------------------------------------------------------- 209 //-------------------------------------------------------------------------
213 210
214 'hasPendingChanges': function () { 211 'hasPendingChanges': function () {
215 return this.user().hasPendingChanges(); 212 return this.user().hasPendingChanges();
216 }, 213 },
217 214
218 //------------------------------------------------------------------------- 215 //-------------------------------------------------------------------------
219 216
220 'revertChanges': function () { 217 'revertChanges': function () {
221 return this.user().revertChanges(); 218 return this.user().revertChanges();
222 }, 219 },
223 220
224 //========================================================================= 221 //=========================================================================
225 __syntaxFix__: "syntax fix" 222 __syntaxFix__: "syntax fix"
226}); 223});
227 224
228 225
229 226
230 227
231init = function () { 228init = function () {
232 vartester; 229 vartester;
233 230
234 tester = new Clipperz.Tests.CardDialogEditing.Tester(); 231 tester = new Clipperz.Tests.CardDialogEditing.Tester();
235 tester.run(); 232 tester.run();
236}; 233};
237 234
238MochiKit.DOM.addLoadEvent(init); 235MochiKit.DOM.addLoadEvent(init);
diff --git a/frontend/gamma/tests/tests/Components/CardDialogEditing/User.data.js b/frontend/gamma/tests/tests/Components/CardDialogEditing/User.data.js
index 8065144..0e55ff5 100644
--- a/frontend/gamma/tests/tests/Components/CardDialogEditing/User.data.js
+++ b/frontend/gamma/tests/tests/Components/CardDialogEditing/User.data.js
@@ -1,408 +1,405 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29testData = { 26testData = {
30 27
31 //------------------------------------------------------------------------- 28 //-------------------------------------------------------------------------
32 29
33 'simpleLogin_001': { 30 'simpleLogin_001': {
34 'users': [ 31 'users': [
35 { 32 {
36 'username': "joe", 33 'username': "joe",
37 'passphrase': "eoj", 34 'passphrase': "eoj",
38 'version': "0.2", 35 'version': "0.2",
39 'connectionVersion':"0.2", 36 'connectionVersion':"0.2",
40 'records':{ 37 'records':{
41 'record 1': { 38 'record 1': {
42 'notes':"Some notes here", 39 'notes':"Some notes here",
43 'fields':[ 40 'fields':[
44 { 'name': "username", 'value': "joe", 'type': "text" }, 41 { 'name': "username", 'value': "joe", 'type': "text" },
45 { 'name': "password", 'value': "1234", 'type': "password"} 42 { 'name': "password", 'value': "1234", 'type': "password"}
46 ], 43 ],
47 'directLogins':{ 44 'directLogins':{
48 "record 1 direct login": { 45 "record 1 direct login": {
49 'configuration':"", 46 'configuration':"",
50 'bindings':[ 47 'bindings':[
51 ], 48 ],
52 'favicon':"http://www.example.com/favicon.ico" 49 'favicon':"http://www.example.com/favicon.ico"
53 } 50 }
54 } 51 }
55 } 52 }
56 }, 53 },
57 'otp':[ 54 'otp':[
58 "12345678 90abcdef 12345678 90abcdef", 55 "12345678 90abcdef 12345678 90abcdef",
59 "fedcba09 87654321 fedcba09 87654321" 56 "fedcba09 87654321 fedcba09 87654321"
60 ] 57 ]
61 } 58 }
62 ] 59 ]
63 }, 60 },
64 61
65 //------------------------------------------------------------------------- 62 //-------------------------------------------------------------------------
66 63
67 'joe_clipperz_offline_copy_data': { 64 'joe_clipperz_offline_copy_data': {
68 users:{ 65 users:{
69 'catchAllUser': { 66 'catchAllUser': {
70 __masterkey_test_value__: 'masterkey', 67 __masterkey_test_value__: 'masterkey',
71 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00', 68 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00',
72 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00' 69 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00'
73 }, 70 },
74 'f527cdd90d0d47f8524b4e165398ad1455eba515d04abd101d1e93b3c6ae0674': { 71 'f527cdd90d0d47f8524b4e165398ad1455eba515d04abd101d1e93b3c6ae0674': {
75 s: '186f0c40bf73f2af236eaa6c429df225efa933050c9aae65240e93b7b362e3ee', 72 s: '186f0c40bf73f2af236eaa6c429df225efa933050c9aae65240e93b7b362e3ee',
76 v: 'ac61a6e325ecf329926a86084f591d8852d0ad3e4a6080f2adc901b82395ecaf', 73 v: 'ac61a6e325ecf329926a86084f591d8852d0ad3e4a6080f2adc901b82395ecaf',
77 version: '0.2', 74 version: '0.2',
78 maxNumberOfRecords: '100', 75 maxNumberOfRecords: '100',
79 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"}', 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"}',
80 statistics: 'SfGy/4mpXQdDOv+Bcfie4Yt/', 77 statistics: 'SfGy/4mpXQdDOv+Bcfie4Yt/',
81 userDetailsVersion: '0.3', 78 userDetailsVersion: '0.3',
82 records: { 79 records: {
83 '062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80': { 80 '062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80': {
84 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', 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',
85 version: '0.2', 82 version: '0.2',
86 creationDate: 'Wed Mar 14 15:46:44 CET 2007', 83 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
87 updateDate: 'Wed Mar 14 15:46:44 CET 2007', 84 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
88 accessDate: 'Mon Jan 19 16:10:04 CET 2009', 85 accessDate: 'Mon Jan 19 16:10:04 CET 2009',
89 currentVersion: '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3', 86 currentVersion: '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3',
90 versions: { 87 versions: {
91 '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3': { 88 '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3': {
92 header: '####', 89 header: '####',
93 data: 'GCNNIhDQjMJQZGVSf+95fPtU6eOnFWVhuGm86r8WZGVR2Gf2EjbG1OJ0ZIGpZ/AXgirCMpo5AFxJe0Bay8IYg+xmBqMFhwFxzAgJBYCIts+raSaNRipuY8dTEqDxAqD1cChcG8EhSoiFgQ0fG0I7nNEUDJi0pIt4/ygBcwvAhuAenEp9ZW+oQA0+YysPQRqkz3IieFaOoSEbe5/SqpUilV4q1gTVyzNXvrxzxx+rlvEyGFgFN+vgtUZ1NrwlPk4gVksTpylvv6CFaMGEWKhgMG6efo0rJckKosaJTu1pldJdnmMK4EKNMLOd+jZ6pEhEhYyadrA4+zYU5TlmZA6ASzTaps8piSwZodoi9qY0ch2StK4mAbzeEGe2HdfHuAU9Tyq3Ppk3+VfNdKgpQfYrQOiSlXbKzK636tzXTN/gyrfOTHjBrRl117ywibgSX63ayAYNfcLpKotC', 90 data: 'GCNNIhDQjMJQZGVSf+95fPtU6eOnFWVhuGm86r8WZGVR2Gf2EjbG1OJ0ZIGpZ/AXgirCMpo5AFxJe0Bay8IYg+xmBqMFhwFxzAgJBYCIts+raSaNRipuY8dTEqDxAqD1cChcG8EhSoiFgQ0fG0I7nNEUDJi0pIt4/ygBcwvAhuAenEp9ZW+oQA0+YysPQRqkz3IieFaOoSEbe5/SqpUilV4q1gTVyzNXvrxzxx+rlvEyGFgFN+vgtUZ1NrwlPk4gVksTpylvv6CFaMGEWKhgMG6efo0rJckKosaJTu1pldJdnmMK4EKNMLOd+jZ6pEhEhYyadrA4+zYU5TlmZA6ASzTaps8piSwZodoi9qY0ch2StK4mAbzeEGe2HdfHuAU9Tyq3Ppk3+VfNdKgpQfYrQOiSlXbKzK636tzXTN/gyrfOTHjBrRl117ywibgSX63ayAYNfcLpKotC',
94 version: '0.2', 91 version: '0.2',
95 creationDate: 'Wed Mar 14 15:46:44 CET 2007', 92 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
96 updateDate: 'Wed Mar 14 15:46:44 CET 2007', 93 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
97 accessDate: 'Mon Jan 19 16:10:04 CET 2009' 94 accessDate: 'Mon Jan 19 16:10:04 CET 2009'
98 } 95 }
99 } 96 }
100 }, 97 },
101 '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d': { 98 '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d': {
102 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', 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',
103 version: '0.3', 100 version: '0.3',
104 creationDate: 'Fri Oct 17 16:49:20 CEST 2008', 101 creationDate: 'Fri Oct 17 16:49:20 CEST 2008',
105 updateDate: 'Mon Oct 27 08:58:49 CET 2008', 102 updateDate: 'Mon Oct 27 08:58:49 CET 2008',
106 accessDate: 'Mon Jan 19 16:09:39 CET 2009', 103 accessDate: 'Mon Jan 19 16:09:39 CET 2009',
107 currentVersion: '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac', 104 currentVersion: '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac',
108 versions: { 105 versions: {
109 '0ae362285f103722abbd046eee2b7d10aeae6a1d05cbaf2081392ce9df882bcf': { 106 '0ae362285f103722abbd046eee2b7d10aeae6a1d05cbaf2081392ce9df882bcf': {
110 header: '####', 107 header: '####',
111 data: 'sG6TUmPSEPFpiJ5YdtghWHmHbvUK63tZCZ+Q5iz2ALas//jN+lZCBhZcjEwPEJskBkK2R0MyAh14wWGh2bBHMjsokgTe+L+x+0c/Zi0epE/IC9gtOBhsTe/hZ2e2xOGF/SbzET3DAAYXvxduZ36f7SvvFnrkkKvpj8wGSdTFcBmzqMb9DL2bRyRCLGLMzE3F1a0q5CufCIRz2TgHm+Uw+kfvvwC7ig/F/5iLW90Ypz3vmEtMEFYFHZ9a8Oh0rsXGfevbMhFqALoywzihQEe/NiB8dwn7GEdYKSQ35rhvZh29ULWOZinqmg0ONe0HYaxx7DbKsVoue57S0CIUlgHLajzHfLfqQg2sFI0OT8TnHsGg0YZ6mM2EdKmEjJiER0cP', 108 data: 'sG6TUmPSEPFpiJ5YdtghWHmHbvUK63tZCZ+Q5iz2ALas//jN+lZCBhZcjEwPEJskBkK2R0MyAh14wWGh2bBHMjsokgTe+L+x+0c/Zi0epE/IC9gtOBhsTe/hZ2e2xOGF/SbzET3DAAYXvxduZ36f7SvvFnrkkKvpj8wGSdTFcBmzqMb9DL2bRyRCLGLMzE3F1a0q5CufCIRz2TgHm+Uw+kfvvwC7ig/F/5iLW90Ypz3vmEtMEFYFHZ9a8Oh0rsXGfevbMhFqALoywzihQEe/NiB8dwn7GEdYKSQ35rhvZh29ULWOZinqmg0ONe0HYaxx7DbKsVoue57S0CIUlgHLajzHfLfqQg2sFI0OT8TnHsGg0YZ6mM2EdKmEjJiER0cP',
112 version: '0.3', 109 version: '0.3',
113 creationDate: 'Fri Oct 17 17:00:31 CEST 2008', 110 creationDate: 'Fri Oct 17 17:00:31 CEST 2008',
114 updateDate: 'Fri Oct 17 17:00:31 CEST 2008', 111 updateDate: 'Fri Oct 17 17:00:31 CEST 2008',
115 accessDate: 'Fri Oct 17 17:00:31 CEST 2008' 112 accessDate: 'Fri Oct 17 17:00:31 CEST 2008'
116 }, 113 },
117 '10f45664bbd979a92f37886f1ecc6e52e49798b16dc997aecd37259ad9b2090e': { 114 '10f45664bbd979a92f37886f1ecc6e52e49798b16dc997aecd37259ad9b2090e': {
118 header: '####', 115 header: '####',
119 data: 'RdKVaV/WWWchrCse3KtcXd47Bfm6IAwjqVUpaxoed3HeunI42AAm7xYYSjeK8edHpbNRJbhobBAX5OZtWIp/HmgkobKM8CIiWxrWz89FqyrbnPD7+fXdtgF2yTax/0sC1l0ibncdOuJKX6U829oPlXCpXIOjlomc4wEEAD/5V6FbORvdZ9IE/ME3LsG2y02cT2tIpx6+R6wC/PKXhZA2UDsTE6R2Op2BtIzpVORZLXsdyAp/4wvWQxq90i9cEpbsVQsMB10JVyNHNsRTFhIlHi9MVCaMxQvcrwRElMj/Y9x3RbsFzSGKqFLqdg7Fn/U+KYkpYtsgHv9hraPIb9lV5FH16+iItU/HBM6FGezIj1ZkoQ+dgjPfSjTZzgzDYwyb', 116 data: 'RdKVaV/WWWchrCse3KtcXd47Bfm6IAwjqVUpaxoed3HeunI42AAm7xYYSjeK8edHpbNRJbhobBAX5OZtWIp/HmgkobKM8CIiWxrWz89FqyrbnPD7+fXdtgF2yTax/0sC1l0ibncdOuJKX6U829oPlXCpXIOjlomc4wEEAD/5V6FbORvdZ9IE/ME3LsG2y02cT2tIpx6+R6wC/PKXhZA2UDsTE6R2Op2BtIzpVORZLXsdyAp/4wvWQxq90i9cEpbsVQsMB10JVyNHNsRTFhIlHi9MVCaMxQvcrwRElMj/Y9x3RbsFzSGKqFLqdg7Fn/U+KYkpYtsgHv9hraPIb9lV5FH16+iItU/HBM6FGezIj1ZkoQ+dgjPfSjTZzgzDYwyb',
120 version: '0.3', 117 version: '0.3',
121 creationDate: 'Fri Oct 17 16:49:20 CEST 2008', 118 creationDate: 'Fri Oct 17 16:49:20 CEST 2008',
122 updateDate: 'Fri Oct 17 16:49:20 CEST 2008', 119 updateDate: 'Fri Oct 17 16:49:20 CEST 2008',
123 accessDate: 'Fri Oct 17 16:54:23 CEST 2008' 120 accessDate: 'Fri Oct 17 16:54:23 CEST 2008'
124 }, 121 },
125 '2fa7b67e569d5e268d2b70b3d4d3a960d7e437e1937bcb324b67d0b9441db8ba': { 122 '2fa7b67e569d5e268d2b70b3d4d3a960d7e437e1937bcb324b67d0b9441db8ba': {
126 header: '####', 123 header: '####',
127 data: 'dpnI2qKjk0+bfyKktw4ZCWf+rWZ12hO5bda39CwD29JH7KtdpLCLe2LoLd+KKF2wOdpDsoI2iTiwRgFpt77e7DoWJABxq/0aaRCVN9XpqZo08iHiYhJyNlIszO8CdEhX+M3AeZqzTnd6fs91VfIEWggvku2Z+jwr0CbclY6FnOcNnS+1fj+W79Z9XC383GOm2ujjfo3SX/fyNQSw8aX+7AgJIRGR9uHK7M1cVfsNNTbmDb/HDgLlYZ1Pqm/9poHpmS7G4HUoRM2/WjI0R6F48dy5s8vZRi11SCnlnj5oRykScJj6wh2DltbCyesiaTpAjP6MQjTXsZzKpaosaQcQClZw+w6hDD2cA54IaBIv2j5KAHyhxDh2ERdwbdnCsDKPz4+zP+fmKfW295d4OY0l1NCSdcY+75HWTmBWRAooZeDTo7AE8m5sRwxewE0Y8J2MLUYsrs7Rl4kbZCiRRHU7cs+us3fq2DVn2OLGEbkRrK3kA9swT9W8ABqINoA79+DmDaIr6TGxe5AlHkCAl5sYAN4g42UX1NKhl4fWI1Scj9O1Ixds/1UUvqzavld0mE2cR9yt6LntjE5sQSAaexvymAJbU5IIM5NTk7NlY7G3PEvAPjcUsL9SGw==', 124 data: 'dpnI2qKjk0+bfyKktw4ZCWf+rWZ12hO5bda39CwD29JH7KtdpLCLe2LoLd+KKF2wOdpDsoI2iTiwRgFpt77e7DoWJABxq/0aaRCVN9XpqZo08iHiYhJyNlIszO8CdEhX+M3AeZqzTnd6fs91VfIEWggvku2Z+jwr0CbclY6FnOcNnS+1fj+W79Z9XC383GOm2ujjfo3SX/fyNQSw8aX+7AgJIRGR9uHK7M1cVfsNNTbmDb/HDgLlYZ1Pqm/9poHpmS7G4HUoRM2/WjI0R6F48dy5s8vZRi11SCnlnj5oRykScJj6wh2DltbCyesiaTpAjP6MQjTXsZzKpaosaQcQClZw+w6hDD2cA54IaBIv2j5KAHyhxDh2ERdwbdnCsDKPz4+zP+fmKfW295d4OY0l1NCSdcY+75HWTmBWRAooZeDTo7AE8m5sRwxewE0Y8J2MLUYsrs7Rl4kbZCiRRHU7cs+us3fq2DVn2OLGEbkRrK3kA9swT9W8ABqINoA79+DmDaIr6TGxe5AlHkCAl5sYAN4g42UX1NKhl4fWI1Scj9O1Ixds/1UUvqzavld0mE2cR9yt6LntjE5sQSAaexvymAJbU5IIM5NTk7NlY7G3PEvAPjcUsL9SGw==',
128 version: '0.3', 125 version: '0.3',
129 creationDate: 'Fri Oct 17 17:00:13 CEST 2008', 126 creationDate: 'Fri Oct 17 17:00:13 CEST 2008',
130 updateDate: 'Fri Oct 17 17:00:13 CEST 2008', 127 updateDate: 'Fri Oct 17 17:00:13 CEST 2008',
131 accessDate: 'Fri Oct 17 17:00:13 CEST 2008' 128 accessDate: 'Fri Oct 17 17:00:13 CEST 2008'
132 }, 129 },
133 '5a17723c34226d8cd663f91b11bfa14979e694e461818113ec8abf7194b46b6b': { 130 '5a17723c34226d8cd663f91b11bfa14979e694e461818113ec8abf7194b46b6b': {
134 header: '####', 131 header: '####',
135 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==', 132 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==',
136 version: '0.3', 133 version: '0.3',
137 creationDate: 'Fri Oct 17 16:59:31 CEST 2008', 134 creationDate: 'Fri Oct 17 16:59:31 CEST 2008',
138 updateDate: 'Fri Oct 17 16:59:31 CEST 2008', 135 updateDate: 'Fri Oct 17 16:59:31 CEST 2008',
139 accessDate: 'Fri Oct 17 16:59:31 CEST 2008' 136 accessDate: 'Fri Oct 17 16:59:31 CEST 2008'
140 }, 137 },
141 '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac': { 138 '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac': {
142 header: '####', 139 header: '####',
143 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==', 140 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==',
144 version: '0.3', 141 version: '0.3',
145 creationDate: 'Mon Oct 27 08:58:49 CET 2008', 142 creationDate: 'Mon Oct 27 08:58:49 CET 2008',
146 updateDate: 'Mon Oct 27 08:58:49 CET 2008', 143 updateDate: 'Mon Oct 27 08:58:49 CET 2008',
147 accessDate: 'Mon Jan 19 16:09:39 CET 2009' 144 accessDate: 'Mon Jan 19 16:09:39 CET 2009'
148 }, 145 },
149 'b57a2d2ffafa8029123362071c09709bb9192f06a17140440f0e41d22143148f': { 146 'b57a2d2ffafa8029123362071c09709bb9192f06a17140440f0e41d22143148f': {
150 header: '####', 147 header: '####',
151 data: 'PQ53T2Vo2D8PoLI1qNX//jLaVZFTDTYk6geT9+4RoThTxvlJ+beDPnQzgYhd9iASaF9GQEEL8JxsBnNpEPa6JPOY4ndFLmDLyFDKXMprxq1UIbzFV6kFoYAk3uCCCa3UCDzdr1KXB2CiiF9HrilaA+xkm8krAvH8I5kZD+j23gByz5cAFvXg7A77KEURpjujURL65DW5M+ceIjo6OXaPW9VO03xhqGt/M47ayObpoEGJZn+X9C8s0SE5wOXHbn38YZlRI480OMvtDAxbEYUeQKMmzu6lO4Nw5hhOUjoPSLr/i3tmDx3nPcDwnSafx6jyA4y31eW6yazqTEOP5I5ArC5mUrF7mAAiFvbHIsMoF8PLj6MONlRIOZgbf9HzCpFdt8xBrX/TXp3LaSAj2XTWgSTFI2cgmU3qqPyibvIfUsB5cVHQCXi692JpC+B85axJ0FLyMl5w3vq0txlPkf6q+dadPYDaLHGZEmDjkWScA1GM5xPJHWFwqGE7ejgXKG0sMYsMKWYk+F2LEUmMHtEvSlpgJBntvcQ1ZjYQxeu4hg5txu1ykkif6fXgkXF6wn6qu+5caeJeNhWtAB4q7WVD47111woYMdkmX7AnDTXSAQ==', 148 data: 'PQ53T2Vo2D8PoLI1qNX//jLaVZFTDTYk6geT9+4RoThTxvlJ+beDPnQzgYhd9iASaF9GQEEL8JxsBnNpEPa6JPOY4ndFLmDLyFDKXMprxq1UIbzFV6kFoYAk3uCCCa3UCDzdr1KXB2CiiF9HrilaA+xkm8krAvH8I5kZD+j23gByz5cAFvXg7A77KEURpjujURL65DW5M+ceIjo6OXaPW9VO03xhqGt/M47ayObpoEGJZn+X9C8s0SE5wOXHbn38YZlRI480OMvtDAxbEYUeQKMmzu6lO4Nw5hhOUjoPSLr/i3tmDx3nPcDwnSafx6jyA4y31eW6yazqTEOP5I5ArC5mUrF7mAAiFvbHIsMoF8PLj6MONlRIOZgbf9HzCpFdt8xBrX/TXp3LaSAj2XTWgSTFI2cgmU3qqPyibvIfUsB5cVHQCXi692JpC+B85axJ0FLyMl5w3vq0txlPkf6q+dadPYDaLHGZEmDjkWScA1GM5xPJHWFwqGE7ejgXKG0sMYsMKWYk+F2LEUmMHtEvSlpgJBntvcQ1ZjYQxeu4hg5txu1ykkif6fXgkXF6wn6qu+5caeJeNhWtAB4q7WVD47111woYMdkmX7AnDTXSAQ==',
152 version: '0.3', 149 version: '0.3',
153 creationDate: 'Fri Oct 17 16:57:17 CEST 2008', 150 creationDate: 'Fri Oct 17 16:57:17 CEST 2008',
154 updateDate: 'Fri Oct 17 16:57:17 CEST 2008', 151 updateDate: 'Fri Oct 17 16:57:17 CEST 2008',
155 accessDate: 'Fri Oct 17 16:57:17 CEST 2008' 152 accessDate: 'Fri Oct 17 16:57:17 CEST 2008'
156 }, 153 },
157 'b713e0a1e2664ac7bfa7ba887329ea023204d10298973e322983b82b222debf6': { 154 'b713e0a1e2664ac7bfa7ba887329ea023204d10298973e322983b82b222debf6': {
158 header: '####', 155 header: '####',
159 data: 'H3gIieYrH7Oy8LEWCZpl9vGp9qYdHNCoBNGijYqlcfXt+1JYvPj1abPp12xLNrDUHfaOZklU2Ip4tOf0CDNhgAan7LYyPqFoy9ss2f9/5RLcbjwiIwSduySIL322HTAwqlzlBt/qaJdHHPUrczmu0fb7fT+0dO4gCL/e/IjcHLefUUgNPAbpHG0Nv0+4lNwKZkIQM3tLRtfJyFBIgWKcMcP1XMic33kr24rwybR8Pb0CHZrOOvvUiGqyoED3ZTZf1twUDVNXO7MWCAC5dBc6/Mk/vSmbbGhppXAH02N0g8G5qzZfp3UVikls55VNhRYLHByVsgpkbIrKXyZnBPTwzm7qefpYAXDOgO+164L66/Art2FYGqZQRZLuh5r8oF38', 156 data: 'H3gIieYrH7Oy8LEWCZpl9vGp9qYdHNCoBNGijYqlcfXt+1JYvPj1abPp12xLNrDUHfaOZklU2Ip4tOf0CDNhgAan7LYyPqFoy9ss2f9/5RLcbjwiIwSduySIL322HTAwqlzlBt/qaJdHHPUrczmu0fb7fT+0dO4gCL/e/IjcHLefUUgNPAbpHG0Nv0+4lNwKZkIQM3tLRtfJyFBIgWKcMcP1XMic33kr24rwybR8Pb0CHZrOOvvUiGqyoED3ZTZf1twUDVNXO7MWCAC5dBc6/Mk/vSmbbGhppXAH02N0g8G5qzZfp3UVikls55VNhRYLHByVsgpkbIrKXyZnBPTwzm7qefpYAXDOgO+164L66/Art2FYGqZQRZLuh5r8oF38',
160 version: '0.3', 157 version: '0.3',
161 creationDate: 'Fri Oct 17 16:58:00 CEST 2008', 158 creationDate: 'Fri Oct 17 16:58:00 CEST 2008',
162 updateDate: 'Fri Oct 17 16:58:00 CEST 2008', 159 updateDate: 'Fri Oct 17 16:58:00 CEST 2008',
163 accessDate: 'Fri Oct 17 16:58:00 CEST 2008' 160 accessDate: 'Fri Oct 17 16:58:00 CEST 2008'
164 }, 161 },
165 'c4cea1cd88a86b05f48a99896a37967c3456228283a0406331ca9f67c6f29f97': { 162 'c4cea1cd88a86b05f48a99896a37967c3456228283a0406331ca9f67c6f29f97': {
166 header: '####', 163 header: '####',
167 data: '1znWPwc9JwCe7iOFiUd2iGm4xJd+824B4VRqEtzCQkW46tg25RWfo7XagvK46USB7t6pC8WMLU0M/EC47KucsfpWUqHGbseoXT/8g8E8GoLnIsk9qFyJG7LGd1sUvqBgszLZwjWWG3t9zifmpW5nY9GialBYNmeSLS3bg5xDH+eCEilUUfDe7zGuVSuu/XkHacv/DYUst97e+6u44F7H8Kv8dTywJZpqbmveNPeWfCej2aBXdVV616J5lIRaj2uIYuQYG7blYJh9KZ7yLStdPndl6h65hIJpfWo0PM8nLJuo0lWNHz7misrutnmxJEjkwVIZ5YAmqp1Zz3VC8zw4IxkXrC/sPmp4PaNXgKz9ZJRaY2KV69WmHf7BUQ3QneGngbT0tN526SS5qDFwTGiuIlnYGWvTB2jVrbns68n/d8Fps8sSWfJBvvXJUEkaZB+1WqNilOPGXvyJ5k2O/iucFbRlxwlEHDny+AgsbtXZdp8cHQ4C/O4G0mnUMZuS38gn6e2kQ55mUhxKeORM+J6Rx1y4Iiu9KKNbxyS5eBpAlFB4xS/o35CS4g309vyOEhi37F24bpp4pM0xEPG4mcc/IyChHzaHUGEp1IX1ZO/r3ut9RIN2QWrGLUlZV/9rFKpLLAy6BkY/g8VYNrV8PztOL3rqy/qwqNZouONwPw8w8SA=', 164 data: '1znWPwc9JwCe7iOFiUd2iGm4xJd+824B4VRqEtzCQkW46tg25RWfo7XagvK46USB7t6pC8WMLU0M/EC47KucsfpWUqHGbseoXT/8g8E8GoLnIsk9qFyJG7LGd1sUvqBgszLZwjWWG3t9zifmpW5nY9GialBYNmeSLS3bg5xDH+eCEilUUfDe7zGuVSuu/XkHacv/DYUst97e+6u44F7H8Kv8dTywJZpqbmveNPeWfCej2aBXdVV616J5lIRaj2uIYuQYG7blYJh9KZ7yLStdPndl6h65hIJpfWo0PM8nLJuo0lWNHz7misrutnmxJEjkwVIZ5YAmqp1Zz3VC8zw4IxkXrC/sPmp4PaNXgKz9ZJRaY2KV69WmHf7BUQ3QneGngbT0tN526SS5qDFwTGiuIlnYGWvTB2jVrbns68n/d8Fps8sSWfJBvvXJUEkaZB+1WqNilOPGXvyJ5k2O/iucFbRlxwlEHDny+AgsbtXZdp8cHQ4C/O4G0mnUMZuS38gn6e2kQ55mUhxKeORM+J6Rx1y4Iiu9KKNbxyS5eBpAlFB4xS/o35CS4g309vyOEhi37F24bpp4pM0xEPG4mcc/IyChHzaHUGEp1IX1ZO/r3ut9RIN2QWrGLUlZV/9rFKpLLAy6BkY/g8VYNrV8PztOL3rqy/qwqNZouONwPw8w8SA=',
168 version: '0.3', 165 version: '0.3',
169 creationDate: 'Fri Oct 17 17:01:59 CEST 2008', 166 creationDate: 'Fri Oct 17 17:01:59 CEST 2008',
170 updateDate: 'Fri Oct 17 17:01:59 CEST 2008', 167 updateDate: 'Fri Oct 17 17:01:59 CEST 2008',
171 accessDate: 'Mon Oct 27 08:57:58 CET 2008' 168 accessDate: 'Mon Oct 27 08:57:58 CET 2008'
172 } 169 }
173 } 170 }
174 }, 171 },
175 '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551': { 172 '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551': {
176 data: '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', 173 data: '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',
177 version: '0.2', 174 version: '0.2',
178 creationDate: 'Wed Mar 14 14:53:11 CET 2007', 175 creationDate: 'Wed Mar 14 14:53:11 CET 2007',
179 updateDate: 'Tue Apr 17 19:17:52 CEST 2007', 176 updateDate: 'Tue Apr 17 19:17:52 CEST 2007',
180 accessDate: 'Mon Jan 19 16:09:25 CET 2009', 177 accessDate: 'Mon Jan 19 16:09:25 CET 2009',
181 currentVersion: '88943d709c3ea2442d4f58eaaec6409276037e5a37e0a6d167b9dad9e947e854', 178 currentVersion: '88943d709c3ea2442d4f58eaaec6409276037e5a37e0a6d167b9dad9e947e854',
182 versions: { 179 versions: {
183 '106a1116d22c2395906a346da4d830c7afbd2da9a46210d0b7a11de238016783': { 180 '106a1116d22c2395906a346da4d830c7afbd2da9a46210d0b7a11de238016783': {
184 header: '####', 181 header: '####',
185 data: 'jgDUvByveAFnchBQKhiHGYDNDtj/7Aja2RePMer0FCOkkEu5GRAiLkxA3/DD3eiU+g+mCxnjnOaEIYL1O5o0+JP08XapsblZHTRKfveeFfs6sWwuqEHGYULBaXx4XSfK2B12HgpBwa5aD49489AkuyXi7t/aAXcKKJcLB1sC61DI3NsmajUaXHBi31Sp7nKAUpMuiWyguW0JVfH6KUPqyldVDBTBqHAis37c1qoR6aFHFfGgAfb35+syfmPRgemujMRkj2XO6dbt9zAYlHVSYFp9393rwPZoyBfXMMdDtSTmq7H9qbmx31GecHZlFN3NymtPPDYUbQ9mpPVRbxE9NjtiPrI5eGFvb++OdOx75PKjYjCAPWWFZ+4aryNn+h+yqab7pAuoG03ACVVrAFIOn09g1ssol/vqvalulEf3hAIviedyiNAC9D0UDHtzUwyIiELvR9qouXLZ', 182 data: 'jgDUvByveAFnchBQKhiHGYDNDtj/7Aja2RePMer0FCOkkEu5GRAiLkxA3/DD3eiU+g+mCxnjnOaEIYL1O5o0+JP08XapsblZHTRKfveeFfs6sWwuqEHGYULBaXx4XSfK2B12HgpBwa5aD49489AkuyXi7t/aAXcKKJcLB1sC61DI3NsmajUaXHBi31Sp7nKAUpMuiWyguW0JVfH6KUPqyldVDBTBqHAis37c1qoR6aFHFfGgAfb35+syfmPRgemujMRkj2XO6dbt9zAYlHVSYFp9393rwPZoyBfXMMdDtSTmq7H9qbmx31GecHZlFN3NymtPPDYUbQ9mpPVRbxE9NjtiPrI5eGFvb++OdOx75PKjYjCAPWWFZ+4aryNn+h+yqab7pAuoG03ACVVrAFIOn09g1ssol/vqvalulEf3hAIviedyiNAC9D0UDHtzUwyIiELvR9qouXLZ',
186 version: '0.2', 183 version: '0.2',
187 creationDate: 'Tue Apr 17 19:13:41 CEST 2007', 184 creationDate: 'Tue Apr 17 19:13:41 CEST 2007',
188 updateDate: 'Tue Apr 17 19:13:41 CEST 2007', 185 updateDate: 'Tue Apr 17 19:13:41 CEST 2007',
189 accessDate: 'Tue Apr 17 19:13:41 CEST 2007' 186 accessDate: 'Tue Apr 17 19:13:41 CEST 2007'
190 }, 187 },
191 '111a8a4b6b912b808a93cf5e8785ca223112628d05f0bfc5dfe1eb40cb72ed8a': { 188 '111a8a4b6b912b808a93cf5e8785ca223112628d05f0bfc5dfe1eb40cb72ed8a': {
192 header: '####', 189 header: '####',
193 data: 't524etHmXljCnLC+IM+WPD8Q5VE7wDsSHVNZzFU4hQzk119t/N/vhtfHYz5HgNstU5T8c7h7RHKvFk5f+4ZwgNgDqSH7H2PrH+7/bV8+uuqbe+/3GYOvELjTF7v3xMyYs1B7ruHpT+291HVNZqxajqCl/+9nbG0e5feqNsTXWUTdLzF0szJuCTNr2I+fhxAO0LRVaf8h+MBPYyuBDnfFDuKm899IsgF9YoYRvjaYO69DkElvf4VP2jrXIJsRnGIUfUaIS/wQ54+X4JBZM/9M09MVOw1SVe+cwG+P3xyPUkqnSb77ECo86C0MktzeYFmPnPv2SM2KFA6slctXsyudoaNlReh1k+6no5J5BjaawTfqYjYrAtWSPsuhxYVsZym/X2CVbkz4rMSn+J5Uio9N5uZ6AqgCKdhAJlwzVb3fIIJwvFpVpy/0LMskb7aG2i4eAxwzx1H6rD3Y', 190 data: 't524etHmXljCnLC+IM+WPD8Q5VE7wDsSHVNZzFU4hQzk119t/N/vhtfHYz5HgNstU5T8c7h7RHKvFk5f+4ZwgNgDqSH7H2PrH+7/bV8+uuqbe+/3GYOvELjTF7v3xMyYs1B7ruHpT+291HVNZqxajqCl/+9nbG0e5feqNsTXWUTdLzF0szJuCTNr2I+fhxAO0LRVaf8h+MBPYyuBDnfFDuKm899IsgF9YoYRvjaYO69DkElvf4VP2jrXIJsRnGIUfUaIS/wQ54+X4JBZM/9M09MVOw1SVe+cwG+P3xyPUkqnSb77ECo86C0MktzeYFmPnPv2SM2KFA6slctXsyudoaNlReh1k+6no5J5BjaawTfqYjYrAtWSPsuhxYVsZym/X2CVbkz4rMSn+J5Uio9N5uZ6AqgCKdhAJlwzVb3fIIJwvFpVpy/0LMskb7aG2i4eAxwzx1H6rD3Y',
194 version: '0.2', 191 version: '0.2',
195 creationDate: 'Wed Mar 14 14:53:11 CET 2007', 192 creationDate: 'Wed Mar 14 14:53:11 CET 2007',
196 updateDate: 'Wed Mar 14 14:53:11 CET 2007', 193 updateDate: 'Wed Mar 14 14:53:11 CET 2007',
197 accessDate: 'Wed Mar 14 15:24:35 CET 2007' 194 accessDate: 'Wed Mar 14 15:24:35 CET 2007'
198 }, 195 },
199 '144d6eff3eb5f1cb70c8906741d88018cdeeae3a618ac4066598ad6b04242364': { 196 '144d6eff3eb5f1cb70c8906741d88018cdeeae3a618ac4066598ad6b04242364': {
200 header: '####', 197 header: '####',
201 data: 'NPgSZF0eSOzy0/Ns+15Nz4bjSwh4o7fWYgKgwXLRFrF8y3EdbiOH7AiEmmPrCpT1raeYLWCcDIrRTz+/9uvIrz6kK6BjU2emr8YdyLai+PTCRY0SafWS3QiYixX6DJiKIt0SC2F6dfmSHwNsbfTHilFhVXn6wXTJpWvC+sRzw+h42cYpQp0BoLSuFV7vPz/+wtuQdl28BiBgLzGsrtPud0tPcfldGox6Ia/1SrOPcqUr0tnFlNQiUvPU7N0JZgRNyr1PfpAEhmYRI7aEJidsZ36vGQpE0ZQMmQE/9tLS/InALRZT1YXfMsytf0o3y4QlgJrvRgBL7fGiQOZJpU7igLk15xAwU+OLIaYIbr2xlKDJvndHOcrFoYKry9/A/aZSnEYv79wsaf64bBgIVD2WJGLuSFFmzlFnbg/O4kGTin3A8XBpvFA9V6iCMvnEMkrqxD3Qgf7WhxFE1A==', 198 data: 'NPgSZF0eSOzy0/Ns+15Nz4bjSwh4o7fWYgKgwXLRFrF8y3EdbiOH7AiEmmPrCpT1raeYLWCcDIrRTz+/9uvIrz6kK6BjU2emr8YdyLai+PTCRY0SafWS3QiYixX6DJiKIt0SC2F6dfmSHwNsbfTHilFhVXn6wXTJpWvC+sRzw+h42cYpQp0BoLSuFV7vPz/+wtuQdl28BiBgLzGsrtPud0tPcfldGox6Ia/1SrOPcqUr0tnFlNQiUvPU7N0JZgRNyr1PfpAEhmYRI7aEJidsZ36vGQpE0ZQMmQE/9tLS/InALRZT1YXfMsytf0o3y4QlgJrvRgBL7fGiQOZJpU7igLk15xAwU+OLIaYIbr2xlKDJvndHOcrFoYKry9/A/aZSnEYv79wsaf64bBgIVD2WJGLuSFFmzlFnbg/O4kGTin3A8XBpvFA9V6iCMvnEMkrqxD3Qgf7WhxFE1A==',
202 version: '0.2', 199 version: '0.2',
203 creationDate: 'Wed Mar 14 15:33:00 CET 2007', 200 creationDate: 'Wed Mar 14 15:33:00 CET 2007',
204 updateDate: 'Wed Mar 14 15:33:00 CET 2007', 201 updateDate: 'Wed Mar 14 15:33:00 CET 2007',
205 accessDate: 'Tue Apr 17 19:12:56 CEST 2007' 202 accessDate: 'Tue Apr 17 19:12:56 CEST 2007'
206 }, 203 },
207 '1f1bdb7a21440ac20c6d913d676aa30dc360252d27059e77df51a1be36b2e263': { 204 '1f1bdb7a21440ac20c6d913d676aa30dc360252d27059e77df51a1be36b2e263': {
208 header: '####', 205 header: '####',
209 data: 'TaOHH6IoHPKLLoyLyvsBszgsPPcDs6CiLVXzXuXjFSTrhPxzUw9suSsisgDRRs0ncjZ6BCyqoCxMnw6QVvGN4viUwYVR8AWdCg0NMQZ+LkNfq/2WN0M3KyASI8sIdMCwTb57NzOn9soB1HmmmETZfjr7HpY2cc+lS5/4f5rxI8XTEK60lLed+aEuJamAjeZUdgIyu30mMKKjxPfY3Y9iWMwn1OD0zF0mAW+hyEoMhhK7EYlWKCy+4qN0QM+yNFXQyERb04o2n4XrM+qr9df1GtbQMH8igK5VzXIrKjdHjKoLo9G7D7mfx6mRLsmoAJuE0R8gyzotgdBpOgWasHJ82iWEa1dLRKBHJ1d0Lnumv22tvYfasx2DIR5Tmx3kIQ3hFieLSXq48cYMiaZH/IbLiapIOlMgtWDow8JuySBLei/8FAV8jCxSc1Ui/SjbuK/kCvywaSOhDVIxGw==', 206 data: 'TaOHH6IoHPKLLoyLyvsBszgsPPcDs6CiLVXzXuXjFSTrhPxzUw9suSsisgDRRs0ncjZ6BCyqoCxMnw6QVvGN4viUwYVR8AWdCg0NMQZ+LkNfq/2WN0M3KyASI8sIdMCwTb57NzOn9soB1HmmmETZfjr7HpY2cc+lS5/4f5rxI8XTEK60lLed+aEuJamAjeZUdgIyu30mMKKjxPfY3Y9iWMwn1OD0zF0mAW+hyEoMhhK7EYlWKCy+4qN0QM+yNFXQyERb04o2n4XrM+qr9df1GtbQMH8igK5VzXIrKjdHjKoLo9G7D7mfx6mRLsmoAJuE0R8gyzotgdBpOgWasHJ82iWEa1dLRKBHJ1d0Lnumv22tvYfasx2DIR5Tmx3kIQ3hFieLSXq48cYMiaZH/IbLiapIOlMgtWDow8JuySBLei/8FAV8jCxSc1Ui/SjbuK/kCvywaSOhDVIxGw==',
210 version: '0.2', 207 version: '0.2',
211 creationDate: 'Wed Mar 14 15:26:35 CET 2007', 208 creationDate: 'Wed Mar 14 15:26:35 CET 2007',
212 updateDate: 'Wed Mar 14 15:26:35 CET 2007', 209 updateDate: 'Wed Mar 14 15:26:35 CET 2007',
213 accessDate: 'Wed Mar 14 15:26:35 CET 2007' 210 accessDate: 'Wed Mar 14 15:26:35 CET 2007'
214 }, 211 },
215 '70720f026f37b571e9765d27c51d3d60c7be0293c3266f1f987c8de9c6b5c416': { 212 '70720f026f37b571e9765d27c51d3d60c7be0293c3266f1f987c8de9c6b5c416': {
216 header: '####', 213 header: '####',
217 data: 'NYaYljcgfzrlN1DVgrbyj4AeVhXGjXPho3IQwEKD3ZOx/yEZxldCNSyFsrk7PoRB8Q1T/6VV4CGa4HLRSB7QVCrtVqWyu4KbbmFoX8NIQ0H3xv+TSo3S/b3dldUeyW32ScaGbspaf8nFf0CffsgpGusd+kHdiE3gSLJvH9y5j47KgpyyX4TteVzqgez4dcXIs5tdzJq2eUlknwU4651QeKIuRSmRaDRhhOP4yRgUo/qXMlTJFmHviCh+IumvBdmDoPe3Vc1vZ1r8PxpDJLvDoB8GTDE42NhqHfVrew9ym1xlTD9wswwIEikfOyTq3JM857qPOHRqSqthEvr4WHbm1VW5PReIyse0lugGyOzqtCnADp9NvNI440VjaTd4NBQqF7XrRm56+1u1uTdfYGFV5BRiH1KmrM1sxXQ6PlOF9Lou45ALo20xxvJOLKG0RKLMr8gmVT2bNtOSJw==', 214 data: 'NYaYljcgfzrlN1DVgrbyj4AeVhXGjXPho3IQwEKD3ZOx/yEZxldCNSyFsrk7PoRB8Q1T/6VV4CGa4HLRSB7QVCrtVqWyu4KbbmFoX8NIQ0H3xv+TSo3S/b3dldUeyW32ScaGbspaf8nFf0CffsgpGusd+kHdiE3gSLJvH9y5j47KgpyyX4TteVzqgez4dcXIs5tdzJq2eUlknwU4651QeKIuRSmRaDRhhOP4yRgUo/qXMlTJFmHviCh+IumvBdmDoPe3Vc1vZ1r8PxpDJLvDoB8GTDE42NhqHfVrew9ym1xlTD9wswwIEikfOyTq3JM857qPOHRqSqthEvr4WHbm1VW5PReIyse0lugGyOzqtCnADp9NvNI440VjaTd4NBQqF7XrRm56+1u1uTdfYGFV5BRiH1KmrM1sxXQ6PlOF9Lou45ALo20xxvJOLKG0RKLMr8gmVT2bNtOSJw==',
218 version: '0.2', 215 version: '0.2',
219 creationDate: 'Wed Mar 14 15:30:09 CET 2007', 216 creationDate: 'Wed Mar 14 15:30:09 CET 2007',
220 updateDate: 'Wed Mar 14 15:30:09 CET 2007', 217 updateDate: 'Wed Mar 14 15:30:09 CET 2007',
221 accessDate: 'Wed Mar 14 15:30:09 CET 2007' 218 accessDate: 'Wed Mar 14 15:30:09 CET 2007'
222 }, 219 },
223 '88943d709c3ea2442d4f58eaaec6409276037e5a37e0a6d167b9dad9e947e854': { 220 '88943d709c3ea2442d4f58eaaec6409276037e5a37e0a6d167b9dad9e947e854': {
224 header: '####', 221 header: '####',
225 data: 'xI3WXddQLFtLVzxJaZWQaw8wAgSuXLjLnyoNXnFuLecTH0BzU36PatglVh2HK3LM8aDLzzbHILdlLNnJ9CY+YnhmGh8hswF9oKTgq0Wsesgdc20QhSMNFFjmMljY1LSXmcAYK04Q5mIzi6Pe/04DRdj+e4zbe5QI4vEBhp/ohEpxZnNqc4BoX6J0eVf6LA1pwrKWvxzMxorWsJrrr+mn3svdlF437n+MMr89k5sQJogufes2GZ9tTvVZ4247ITxXqxgAhwXtbuIs/A5UqqnNdsxlHfpLKG5KjxB6F0h7TtFA3gkZCve5UmAibBnoBCFaIVWQyVq+VO9iqDm3DeXsK2pepvgIvpSID8Poy+uwN7T95mivAsHG5p7MtgN9KwQzNW3Iu+BfO9FlPBMngSk8L29So2CIXe6lEsXSGEi5Yrgyo6hZi6IkGCXwIQ7TCEMnlQEGyKnnAVik', 222 data: 'xI3WXddQLFtLVzxJaZWQaw8wAgSuXLjLnyoNXnFuLecTH0BzU36PatglVh2HK3LM8aDLzzbHILdlLNnJ9CY+YnhmGh8hswF9oKTgq0Wsesgdc20QhSMNFFjmMljY1LSXmcAYK04Q5mIzi6Pe/04DRdj+e4zbe5QI4vEBhp/ohEpxZnNqc4BoX6J0eVf6LA1pwrKWvxzMxorWsJrrr+mn3svdlF437n+MMr89k5sQJogufes2GZ9tTvVZ4247ITxXqxgAhwXtbuIs/A5UqqnNdsxlHfpLKG5KjxB6F0h7TtFA3gkZCve5UmAibBnoBCFaIVWQyVq+VO9iqDm3DeXsK2pepvgIvpSID8Poy+uwN7T95mivAsHG5p7MtgN9KwQzNW3Iu+BfO9FlPBMngSk8L29So2CIXe6lEsXSGEi5Yrgyo6hZi6IkGCXwIQ7TCEMnlQEGyKnnAVik',
226 version: '0.2', 223 version: '0.2',
227 creationDate: 'Tue Apr 17 19:17:52 CEST 2007', 224 creationDate: 'Tue Apr 17 19:17:52 CEST 2007',
228 updateDate: 'Tue Apr 17 19:17:52 CEST 2007', 225 updateDate: 'Tue Apr 17 19:17:52 CEST 2007',
229 accessDate: 'Mon Jan 19 16:09:25 CET 2009' 226 accessDate: 'Mon Jan 19 16:09:25 CET 2009'
230 }, 227 },
231 '9588b523f39cdfc14efa1e15ea7716c2d8eac45d8efd7bfeb19d716f9df72d66': { 228 '9588b523f39cdfc14efa1e15ea7716c2d8eac45d8efd7bfeb19d716f9df72d66': {
232 header: '####', 229 header: '####',
233 data: 'q6DKkxhgDFs1XkqOYf6dvojPF+yhJbniTLFpSOS+I1sum3EZIJfYxJXyi2Jx3KOVNBMILw1+vrSLe/fh5SSWj8ZBoeppkPPLjyRNdiUyd4IfcRM5OSv2YcTxCubKCH2kIMFAzY/29A6ZGPG+AN8/kxkEHc1fxKaNcj2Cs8qejNR8yK1iKT1Ut9VfEee+Eqy2Ohgdq8wL/xAD5mUzdqHeQl8BY16pXGIYncLxMzR+EJ8E5jJTuGv3O41UbO31lvBSfCt2pfz2MrtsuqNoI8LBHJkcR6t17Bj+rHZUniHlyxSW/1rQJ1NnwpPgUJ1fhfQJZM8Faoif+0bvWFY4xWs/tCCD7oEvf0xM0I3FfcJLbYX8M+wyO08t9BmGdEjnr3VUcuS9qKaJRpdpMP7aQf+vJvioeQDXdOJ6Ceo3BDFc6JdNta1Qc+agGzN2KPbIPrLDL+08hWl61yu3GQ==', 230 data: 'q6DKkxhgDFs1XkqOYf6dvojPF+yhJbniTLFpSOS+I1sum3EZIJfYxJXyi2Jx3KOVNBMILw1+vrSLe/fh5SSWj8ZBoeppkPPLjyRNdiUyd4IfcRM5OSv2YcTxCubKCH2kIMFAzY/29A6ZGPG+AN8/kxkEHc1fxKaNcj2Cs8qejNR8yK1iKT1Ut9VfEee+Eqy2Ohgdq8wL/xAD5mUzdqHeQl8BY16pXGIYncLxMzR+EJ8E5jJTuGv3O41UbO31lvBSfCt2pfz2MrtsuqNoI8LBHJkcR6t17Bj+rHZUniHlyxSW/1rQJ1NnwpPgUJ1fhfQJZM8Faoif+0bvWFY4xWs/tCCD7oEvf0xM0I3FfcJLbYX8M+wyO08t9BmGdEjnr3VUcuS9qKaJRpdpMP7aQf+vJvioeQDXdOJ6Ceo3BDFc6JdNta1Qc+agGzN2KPbIPrLDL+08hWl61yu3GQ==',
234 version: '0.2', 231 version: '0.2',
235 creationDate: 'Wed Mar 14 15:27:35 CET 2007', 232 creationDate: 'Wed Mar 14 15:27:35 CET 2007',
236 updateDate: 'Wed Mar 14 15:27:35 CET 2007', 233 updateDate: 'Wed Mar 14 15:27:35 CET 2007',
237 accessDate: 'Wed Mar 14 15:27:35 CET 2007' 234 accessDate: 'Wed Mar 14 15:27:35 CET 2007'
238 }, 235 },
239 'e5b71df0d4d79a195c7ec3288dd7738069837a7c4da3bccc1ebc05d8e4f19d79': { 236 'e5b71df0d4d79a195c7ec3288dd7738069837a7c4da3bccc1ebc05d8e4f19d79': {
240 header: '####', 237 header: '####',
241 data: '1NvK9Y5r0Q880BfB1W5IqdOR77mmqQU0d1GL1XUeQT75R2EgYE9rK1X1jLygCXboPhxzegEe7TDhUsn5XcHN0LkXcLYz8gD/7+He2HiTFxoHd2oQbI3ceBxDJ7+5kWA6Aiqy42QSCuA+TWIQcDVthSyFU7nNdqNxeBYeXiI4jgwcH3xvm0+pBf1OYLtywjUK1JwntP6o68b1LMQJFinDG+sqRcm25ggaZyxDtoLh1IBdSpmXk0papRnyyTGNgsws78dLxnH0Iqxb7FhqYfgLDIvN3i7+IALI0lF0EuTS0hSPlr/1fTz1/6bVt++wI9GpUsrdafUJJMPerXoCK+gAP8EMneLq4f5487HIkwWh1qON6Hvpg+tB95NOSJpqE72VpVxN4+wTQWyDMhfjqXBuQ1wKvTsD/mUsdinU0Wb/YT/zIWBNZPdqur0rjOC+mrOtSdlYSCH89Jj2', 238 data: '1NvK9Y5r0Q880BfB1W5IqdOR77mmqQU0d1GL1XUeQT75R2EgYE9rK1X1jLygCXboPhxzegEe7TDhUsn5XcHN0LkXcLYz8gD/7+He2HiTFxoHd2oQbI3ceBxDJ7+5kWA6Aiqy42QSCuA+TWIQcDVthSyFU7nNdqNxeBYeXiI4jgwcH3xvm0+pBf1OYLtywjUK1JwntP6o68b1LMQJFinDG+sqRcm25ggaZyxDtoLh1IBdSpmXk0papRnyyTGNgsws78dLxnH0Iqxb7FhqYfgLDIvN3i7+IALI0lF0EuTS0hSPlr/1fTz1/6bVt++wI9GpUsrdafUJJMPerXoCK+gAP8EMneLq4f5487HIkwWh1qON6Hvpg+tB95NOSJpqE72VpVxN4+wTQWyDMhfjqXBuQ1wKvTsD/mUsdinU0Wb/YT/zIWBNZPdqur0rjOC+mrOtSdlYSCH89Jj2',
242 version: '0.2', 239 version: '0.2',
243 creationDate: 'Tue Apr 17 19:15:09 CEST 2007', 240 creationDate: 'Tue Apr 17 19:15:09 CEST 2007',
244 updateDate: 'Tue Apr 17 19:15:09 CEST 2007', 241 updateDate: 'Tue Apr 17 19:15:09 CEST 2007',
245 accessDate: 'Tue Apr 17 19:17:01 CEST 2007' 242 accessDate: 'Tue Apr 17 19:17:01 CEST 2007'
246 } 243 }
247 } 244 }
248 }, 245 },
249 '36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113': { 246 '36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113': {
250 data: '6fhueIibbxKRA7Mtb9TPcWiUKajnikM3D7PbOROBkE39Vw9E/nG8KrtJlwwPQeOGCFhssO/KX3ymYehCR8rfaEL1f9pfdh5x69mSxKRlOmtEknWqUgPzcb1yPenRbQagERadh0LF4zu91M4WjXK9qynEHoxI/pBhwQb1IsnhwtXl4ELtajudv+2Hv3p75v4XOXFsGQMsHPY+Zw7dkFFA8EXhvuxjiGvnxCUkFwNICFRdHTEovkW3VSerLdrYo5lDgjY6ebr/g7wDGuu4RLfUK4+HpzFwZ0+aOrjpFq2ePg2xObvkkMNNjZ2PcR6Cue0sf+aNqzIHIlFPpY2Hmrob8+bwxocKA6aagBu7z5GiUmZNXGE/Vtr/WWBV2+xIJyzXZPet0MLmSnGiALjPJveeKnnFdDtA929ydcAb8efc0/snfU/uDoXDiO5SWEQ8DDNjj1bSo7VPTtvZyFormE1KjqimqSwaUJzbIS4CxPnoDezaBtQmlG4z8mc8jXq1HfPu7s9PUzcbG30gbF0ch2pDj4h47AhE0ZoeiV+VYZTaYateSifQXKBQKjPcuh9PQyDI0HVua3itbbwxXpRubEM4fbvlcd+7gu+Zq03slYICD07fP0I6XGrRHVTfYpDbEb4GJBvRIeZLwRTQzOeFbPLpBU9Lv3zXxfHfcHy9oK+giIxefPdY1ZR2ZFPKOO0xYJsTr0vmTuXeXzy56bKl+yP2lFst5l9QG8j2JcQEotDV1KQS6mbcLjfIpEnltu5fc2t10Q25Noh+F3kF+LcMIYsDjwanojYlOC93mZl01hmSJdimRTk9otjlRTyC7NWwiyy7fe5IyVi7ACNPZyeUYJUPtKWcPbT73Vtf8W3/+HdhmyYNyMQ9PDCBb9WKMon+qW2+ZVH5yv/KqMHRY1fflAfxpHNhrCkwqcAAGw+G/cetbvQjpkfVT2/u/uLupMsITN2Tgvr/8D2IMm3cyDBUCshrp0AfzARRygHFK4x/0uLfCtQSNjw6zMK8mn80R5aS5bZi5gRS8JBMZ4Q0iG4kBlLpIYtsXSBwl8faljjdl/4XvNNWWrdGJn2k0eM4cESlOFFk4s3Yu0Zspo17nKAHINjHAiP3VlhuKSnk5C9hMU5i3vZO8anQmx9UEwUgQVm22azCjyNtUl6jVPYSNsal7A==', 247 data: '6fhueIibbxKRA7Mtb9TPcWiUKajnikM3D7PbOROBkE39Vw9E/nG8KrtJlwwPQeOGCFhssO/KX3ymYehCR8rfaEL1f9pfdh5x69mSxKRlOmtEknWqUgPzcb1yPenRbQagERadh0LF4zu91M4WjXK9qynEHoxI/pBhwQb1IsnhwtXl4ELtajudv+2Hv3p75v4XOXFsGQMsHPY+Zw7dkFFA8EXhvuxjiGvnxCUkFwNICFRdHTEovkW3VSerLdrYo5lDgjY6ebr/g7wDGuu4RLfUK4+HpzFwZ0+aOrjpFq2ePg2xObvkkMNNjZ2PcR6Cue0sf+aNqzIHIlFPpY2Hmrob8+bwxocKA6aagBu7z5GiUmZNXGE/Vtr/WWBV2+xIJyzXZPet0MLmSnGiALjPJveeKnnFdDtA929ydcAb8efc0/snfU/uDoXDiO5SWEQ8DDNjj1bSo7VPTtvZyFormE1KjqimqSwaUJzbIS4CxPnoDezaBtQmlG4z8mc8jXq1HfPu7s9PUzcbG30gbF0ch2pDj4h47AhE0ZoeiV+VYZTaYateSifQXKBQKjPcuh9PQyDI0HVua3itbbwxXpRubEM4fbvlcd+7gu+Zq03slYICD07fP0I6XGrRHVTfYpDbEb4GJBvRIeZLwRTQzOeFbPLpBU9Lv3zXxfHfcHy9oK+giIxefPdY1ZR2ZFPKOO0xYJsTr0vmTuXeXzy56bKl+yP2lFst5l9QG8j2JcQEotDV1KQS6mbcLjfIpEnltu5fc2t10Q25Noh+F3kF+LcMIYsDjwanojYlOC93mZl01hmSJdimRTk9otjlRTyC7NWwiyy7fe5IyVi7ACNPZyeUYJUPtKWcPbT73Vtf8W3/+HdhmyYNyMQ9PDCBb9WKMon+qW2+ZVH5yv/KqMHRY1fflAfxpHNhrCkwqcAAGw+G/cetbvQjpkfVT2/u/uLupMsITN2Tgvr/8D2IMm3cyDBUCshrp0AfzARRygHFK4x/0uLfCtQSNjw6zMK8mn80R5aS5bZi5gRS8JBMZ4Q0iG4kBlLpIYtsXSBwl8faljjdl/4XvNNWWrdGJn2k0eM4cESlOFFk4s3Yu0Zspo17nKAHINjHAiP3VlhuKSnk5C9hMU5i3vZO8anQmx9UEwUgQVm22azCjyNtUl6jVPYSNsal7A==',
251 version: '0.3', 248 version: '0.3',
252 creationDate: 'Wed Mar 14 18:39:35 CET 2007', 249 creationDate: 'Wed Mar 14 18:39:35 CET 2007',
253 updateDate: 'Mon Oct 27 09:16:14 CET 2008', 250 updateDate: 'Mon Oct 27 09:16:14 CET 2008',
254 accessDate: 'Mon Jan 19 16:09:35 CET 2009', 251 accessDate: 'Mon Jan 19 16:09:35 CET 2009',
255 currentVersion: 'a96a6d8b9ac73fcdf874d8a8534ffb2d43da8f5222e96a4a29bd2ae437619463', 252 currentVersion: 'a96a6d8b9ac73fcdf874d8a8534ffb2d43da8f5222e96a4a29bd2ae437619463',
256 versions: { 253 versions: {
257 '381201fd3b67549bd6630841e8902be1499f3ff0c3514dd464ad9679f22f3561': { 254 '381201fd3b67549bd6630841e8902be1499f3ff0c3514dd464ad9679f22f3561': {
258 header: '####', 255 header: '####',
259 data: 'DgjIW4YcJAYnckuEUzBFkfEC841LuanGopPgp+YkyMn3xuzdpGq/ObLFMVQaeAuyErh1B0REHPbq0E/SRUZbeXLXWN720GU4GXvY5bnen2h7pHvl/H4yz+kvyKh3EHJmmBjuz8s0kclFJQB48lter+G93TEmUaFke9c9m0IkKlgzwZ/PQKZyIyfZA09KFaozdSxdFRbswZj2Vq8Df2PQsKLapZWX1wYQ3lXOcyvNdTULy9MCXwPwX6te6hTLWxQOiSPsvB8LItlhQUsSbrJcJEvWPlBupPu5SeI25zDnqKDETPep63Ks2GWf45nXZzYYmQMzL0l2cenYFxlE18TcOd1Ms24TQ/iDKMhi60zZoo13qjVT5AKZ80KNu46t08qbACxjv/LeK2aM5TNycTFixGskPywpnb6MCo8ibRe5rs1WcTJRMD04sNoiuriivO2fiyo4rxjfdyfueMlOz+Zeztk=', 256 data: 'DgjIW4YcJAYnckuEUzBFkfEC841LuanGopPgp+YkyMn3xuzdpGq/ObLFMVQaeAuyErh1B0REHPbq0E/SRUZbeXLXWN720GU4GXvY5bnen2h7pHvl/H4yz+kvyKh3EHJmmBjuz8s0kclFJQB48lter+G93TEmUaFke9c9m0IkKlgzwZ/PQKZyIyfZA09KFaozdSxdFRbswZj2Vq8Df2PQsKLapZWX1wYQ3lXOcyvNdTULy9MCXwPwX6te6hTLWxQOiSPsvB8LItlhQUsSbrJcJEvWPlBupPu5SeI25zDnqKDETPep63Ks2GWf45nXZzYYmQMzL0l2cenYFxlE18TcOd1Ms24TQ/iDKMhi60zZoo13qjVT5AKZ80KNu46t08qbACxjv/LeK2aM5TNycTFixGskPywpnb6MCo8ibRe5rs1WcTJRMD04sNoiuriivO2fiyo4rxjfdyfueMlOz+Zeztk=',
260 version: '0.2', 257 version: '0.2',
261 creationDate: 'Wed Mar 14 18:39:55 CET 2007', 258 creationDate: 'Wed Mar 14 18:39:55 CET 2007',
262 updateDate: 'Wed Mar 14 18:39:55 CET 2007', 259 updateDate: 'Wed Mar 14 18:39:55 CET 2007',
263 accessDate: 'Mon Oct 27 09:07:56 CET 2008' 260 accessDate: 'Mon Oct 27 09:07:56 CET 2008'
264 }, 261 },
265 '99dc86ebeb20a3db0c5393d6d94bc1150187b04316a876970dbbcf517b55d6f2': { 262 '99dc86ebeb20a3db0c5393d6d94bc1150187b04316a876970dbbcf517b55d6f2': {
266 header: '####', 263 header: '####',
267 data: 'AJwqCWNKC9z8DC4TUI0hWnqHvQ40Y/x+jXylnVAkyO2QYQcqg51odLFSfgP0GiGEGPYwDc+kUxRrfO+ITgTNm+hHi2iIWkP/ljAC+AQ56MAEKsU/USTbvl6ShZ0XTAdRpwI/oqqOhYThVs6jTm/J8+lx4tWoMtNj835py88c/9eW26pLQubr7VysLSWuIMi+iDp7zXZZz/0gxGKDe5xNq4MGIYw8/OK1iJCOsjBdrRygLlS/Mz9sRlKkwdrDsohtRG0F/NdsIoaU4FttGs/rY91SCedvHy6ovh0zXhxOO44O6MiMbP085D1jCjWJn9S1RBxjxc368MGfMJeZja87nuvgSnLS2tGDL6zFtVJMNcH/7GqQPXZv/sNEykDNWpypchCnwYUJxvBVb45FcUzagPm+SSiekWK1hrEntZkZuEhQZp7Ud9RcENpa5h7wXUJSV1vPl8xBylx9HWmxez7D9OYRqbOlCRAEDqup4ahNhYB9', 264 data: 'AJwqCWNKC9z8DC4TUI0hWnqHvQ40Y/x+jXylnVAkyO2QYQcqg51odLFSfgP0GiGEGPYwDc+kUxRrfO+ITgTNm+hHi2iIWkP/ljAC+AQ56MAEKsU/USTbvl6ShZ0XTAdRpwI/oqqOhYThVs6jTm/J8+lx4tWoMtNj835py88c/9eW26pLQubr7VysLSWuIMi+iDp7zXZZz/0gxGKDe5xNq4MGIYw8/OK1iJCOsjBdrRygLlS/Mz9sRlKkwdrDsohtRG0F/NdsIoaU4FttGs/rY91SCedvHy6ovh0zXhxOO44O6MiMbP085D1jCjWJn9S1RBxjxc368MGfMJeZja87nuvgSnLS2tGDL6zFtVJMNcH/7GqQPXZv/sNEykDNWpypchCnwYUJxvBVb45FcUzagPm+SSiekWK1hrEntZkZuEhQZp7Ud9RcENpa5h7wXUJSV1vPl8xBylx9HWmxez7D9OYRqbOlCRAEDqup4ahNhYB9',
268 version: '0.3', 265 version: '0.3',
269 creationDate: 'Mon Oct 27 09:09:11 CET 2008', 266 creationDate: 'Mon Oct 27 09:09:11 CET 2008',
270 updateDate: 'Mon Oct 27 09:09:11 CET 2008', 267 updateDate: 'Mon Oct 27 09:09:11 CET 2008',
271 accessDate: 'Mon Oct 27 09:15:58 CET 2008' 268 accessDate: 'Mon Oct 27 09:15:58 CET 2008'
272 }, 269 },
273 '9fbfcd3e7fe30d549a813f0e6c1be58ed45c3ae7305d7367bffefa097b424ee6': { 270 '9fbfcd3e7fe30d549a813f0e6c1be58ed45c3ae7305d7367bffefa097b424ee6': {
274 header: '####', 271 header: '####',
275 data: 'nZ+Lc5LWWLxnPvUrRrHhxG35PHq7GMbVENHfV1oS0Qw7/63NecssNoEbiOwFVMjAshvfUK7IjnzyvfQhNtFRbj2yzHOTWCd0eJ0O0MmvGzjpUntSDu9/G8RFeEu9jDKugwi/NhOa5legjT9pcsEAqR4s4NN/Ac6juQb6D/Z6Wd6wO0JQhT5/QPk1KllDpDeo2i/GPUKvEi/dXpik0KQcVLVylU82rf6hwEgvRQi+j0O5hnFW1E4ttxClrnPBEBv60jkNwcIpD0r+rvomDe8+398xUuB4DVDJoM+WUYfu6Sm3qI0yBfET+tJvjn8WsHhKTgZpOc2BXC7EdF99nNEg6kV5pSxV6AUA1XUz5kW+YfcSzAXzUH74OqroC0SucHe4+BtRKnbJy4h5vRfjTD+FJaj1Va02cxSR55tQhxm/k67z0QeyB98dnU1l/pPHwBlIWa1eR74gswNSeQ2jrzu5JeQ=', 272 data: 'nZ+Lc5LWWLxnPvUrRrHhxG35PHq7GMbVENHfV1oS0Qw7/63NecssNoEbiOwFVMjAshvfUK7IjnzyvfQhNtFRbj2yzHOTWCd0eJ0O0MmvGzjpUntSDu9/G8RFeEu9jDKugwi/NhOa5legjT9pcsEAqR4s4NN/Ac6juQb6D/Z6Wd6wO0JQhT5/QPk1KllDpDeo2i/GPUKvEi/dXpik0KQcVLVylU82rf6hwEgvRQi+j0O5hnFW1E4ttxClrnPBEBv60jkNwcIpD0r+rvomDe8+398xUuB4DVDJoM+WUYfu6Sm3qI0yBfET+tJvjn8WsHhKTgZpOc2BXC7EdF99nNEg6kV5pSxV6AUA1XUz5kW+YfcSzAXzUH74OqroC0SucHe4+BtRKnbJy4h5vRfjTD+FJaj1Va02cxSR55tQhxm/k67z0QeyB98dnU1l/pPHwBlIWa1eR74gswNSeQ2jrzu5JeQ=',
276 version: '0.2', 273 version: '0.2',
277 creationDate: 'Wed Mar 14 18:39:35 CET 2007', 274 creationDate: 'Wed Mar 14 18:39:35 CET 2007',
278 updateDate: 'Wed Mar 14 18:39:35 CET 2007', 275 updateDate: 'Wed Mar 14 18:39:35 CET 2007',
279 accessDate: 'Wed Mar 14 18:39:35 CET 2007' 276 accessDate: 'Wed Mar 14 18:39:35 CET 2007'
280 }, 277 },
281 'a96a6d8b9ac73fcdf874d8a8534ffb2d43da8f5222e96a4a29bd2ae437619463': { 278 'a96a6d8b9ac73fcdf874d8a8534ffb2d43da8f5222e96a4a29bd2ae437619463': {
282 header: '####', 279 header: '####',
283 data: 'm3yhZu81UAjCY6U2Knrgg8mK+LX35Y/iZgIEm8MuRDAlg6UUz9Z1Anu63COFV08YyYQRuBzTgR9YQ8wrUD1S9FG2ZmtCDemqvd+5OUMgdn4sK7G3CuzAc5osOa5neU2m4y19WuobkGnhO78ko7pVVjO42q0DeMT92uFL6KE/2UCkWlq5SdFyS5qXEJEWs2IO5C8nVpdlO/eZ36Pl2+v+afl3QQMTthCVIUR4/zVP2ajbO48yjDXhYxzskFjtXMYLApEn0wO0dcifcsYhPkozz6Locrt/R6IZXnfZfuW5XXHbqhutoJFPK6L6t0Ib3B2r1TNkPaMsVs2g5V1g3ENRd0IlbG/uBk2o5tgeu6gOYlA1scEiL+/ad9ZxiqYB2ENCGZ8DXA4VNMnzxVPbO96OIUCb9suV0fldGOg=', 280 data: 'm3yhZu81UAjCY6U2Knrgg8mK+LX35Y/iZgIEm8MuRDAlg6UUz9Z1Anu63COFV08YyYQRuBzTgR9YQ8wrUD1S9FG2ZmtCDemqvd+5OUMgdn4sK7G3CuzAc5osOa5neU2m4y19WuobkGnhO78ko7pVVjO42q0DeMT92uFL6KE/2UCkWlq5SdFyS5qXEJEWs2IO5C8nVpdlO/eZ36Pl2+v+afl3QQMTthCVIUR4/zVP2ajbO48yjDXhYxzskFjtXMYLApEn0wO0dcifcsYhPkozz6Locrt/R6IZXnfZfuW5XXHbqhutoJFPK6L6t0Ib3B2r1TNkPaMsVs2g5V1g3ENRd0IlbG/uBk2o5tgeu6gOYlA1scEiL+/ad9ZxiqYB2ENCGZ8DXA4VNMnzxVPbO96OIUCb9suV0fldGOg=',
284 version: '0.3', 281 version: '0.3',
285 creationDate: 'Mon Oct 27 09:16:14 CET 2008', 282 creationDate: 'Mon Oct 27 09:16:14 CET 2008',
286 updateDate: 'Mon Oct 27 09:16:14 CET 2008', 283 updateDate: 'Mon Oct 27 09:16:14 CET 2008',
287 accessDate: 'Mon Jan 19 16:09:35 CET 2009' 284 accessDate: 'Mon Jan 19 16:09:35 CET 2009'
288 } 285 }
289 } 286 }
290 }, 287 },
291 '507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a': { 288 '507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a': {
292 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', 289 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',
293 version: '0.2', 290 version: '0.2',
294 creationDate: 'Wed Mar 14 16:01:24 CET 2007', 291 creationDate: 'Wed Mar 14 16:01:24 CET 2007',
295 updateDate: 'Wed Mar 14 16:01:24 CET 2007', 292 updateDate: 'Wed Mar 14 16:01:24 CET 2007',
296 accessDate: 'Mon Jan 19 16:10:11 CET 2009', 293 accessDate: 'Mon Jan 19 16:10:11 CET 2009',
297 currentVersion: '395eb58606138588dcd7e659065db48775610cc1e90cbd03368c063e02e55c8b', 294 currentVersion: '395eb58606138588dcd7e659065db48775610cc1e90cbd03368c063e02e55c8b',
298 versions: { 295 versions: {
299 '395eb58606138588dcd7e659065db48775610cc1e90cbd03368c063e02e55c8b': { 296 '395eb58606138588dcd7e659065db48775610cc1e90cbd03368c063e02e55c8b': {
300 header: '####', 297 header: '####',
301 data: 'sgq3FGcsnlbhTLetMa3TQQE6uFZv/JL6Awha1066IimKoAtQGbAr6E1+mxRmvJle91sL7oRfi6suvDanYHfAI+rrG6qCOtESn70ssS+aGFyO3XwFgypzG/Qa34bjxJ16Aqd93H8IdhzdtOxs2Qmou3CjyxbT7Cq+YW/fAo1WfctL4yE4GBNPWC5lfebxSmINlBY+zTjhv9Pf2aK6vL4p3obHl+zhz0YdKAMBwbDyCLa9tYvhGBnq/W6lFUsyZCPVJJP3bQCQww0TNCcLJLm+SYVSiC0NwCQJq+yNqDkWTvv41p5EDB06eOQ2VqC7l4i/JLE/ql9h9Z++gck74/Qs3ppdVdG7sTzWyPya4v3RW2OTc1awFRZipAX5Zd7I97dyw6Yym4y+/9UT8z8iMDYykQ4+QnOhksDIE9a8q6agDF/rbZ/BCRcMWbFylGTdudk26mu0GdPiuLDu', 298 data: 'sgq3FGcsnlbhTLetMa3TQQE6uFZv/JL6Awha1066IimKoAtQGbAr6E1+mxRmvJle91sL7oRfi6suvDanYHfAI+rrG6qCOtESn70ssS+aGFyO3XwFgypzG/Qa34bjxJ16Aqd93H8IdhzdtOxs2Qmou3CjyxbT7Cq+YW/fAo1WfctL4yE4GBNPWC5lfebxSmINlBY+zTjhv9Pf2aK6vL4p3obHl+zhz0YdKAMBwbDyCLa9tYvhGBnq/W6lFUsyZCPVJJP3bQCQww0TNCcLJLm+SYVSiC0NwCQJq+yNqDkWTvv41p5EDB06eOQ2VqC7l4i/JLE/ql9h9Z++gck74/Qs3ppdVdG7sTzWyPya4v3RW2OTc1awFRZipAX5Zd7I97dyw6Yym4y+/9UT8z8iMDYykQ4+QnOhksDIE9a8q6agDF/rbZ/BCRcMWbFylGTdudk26mu0GdPiuLDu',
302 version: '0.2', 299 version: '0.2',
303 creationDate: 'Wed Mar 14 16:01:24 CET 2007', 300 creationDate: 'Wed Mar 14 16:01:24 CET 2007',
304 updateDate: 'Wed Mar 14 16:01:24 CET 2007', 301 updateDate: 'Wed Mar 14 16:01:24 CET 2007',
305 accessDate: 'Mon Jan 19 16:10:11 CET 2009' 302 accessDate: 'Mon Jan 19 16:10:11 CET 2009'
306 } 303 }
307 } 304 }
308 }, 305 },
309 '5cdac63b317f3942da38f3a3de3b7f0e5d6678200951c6216230295550f63fb4': { 306 '5cdac63b317f3942da38f3a3de3b7f0e5d6678200951c6216230295550f63fb4': {
310 data: 'Xs+z3VzIqsWa7dGBqepwq75lTsx3yemNhTdRYYDDc3Kzpycyp961SgnKXHjE51266mfmj85ASFi/FKCOwk17lbD5UT3iawtc3TdgrQ18vBhBsmOA2F4JAa4yC58bTaXbyld3c4izDp7i9+iyRaFN52NWJznN82SXuRtPdWRtAxXB1V5Tyg==', 307 data: 'Xs+z3VzIqsWa7dGBqepwq75lTsx3yemNhTdRYYDDc3Kzpycyp961SgnKXHjE51266mfmj85ASFi/FKCOwk17lbD5UT3iawtc3TdgrQ18vBhBsmOA2F4JAa4yC58bTaXbyld3c4izDp7i9+iyRaFN52NWJznN82SXuRtPdWRtAxXB1V5Tyg==',
311 version: '0.3', 308 version: '0.3',
312 creationDate: 'Mon Jan 05 17:45:25 CET 2009', 309 creationDate: 'Mon Jan 05 17:45:25 CET 2009',
313 updateDate: 'Mon Jan 05 17:45:25 CET 2009', 310 updateDate: 'Mon Jan 05 17:45:25 CET 2009',
314 accessDate: 'Mon Jan 19 16:10:21 CET 2009', 311 accessDate: 'Mon Jan 19 16:10:21 CET 2009',
315 currentVersion: '00b3a4cd7400cfc1e7f7b369bdc3dcdaa50d6020233e131b30d755c89249ea9d', 312 currentVersion: '00b3a4cd7400cfc1e7f7b369bdc3dcdaa50d6020233e131b30d755c89249ea9d',
316 versions: { 313 versions: {
317 '00b3a4cd7400cfc1e7f7b369bdc3dcdaa50d6020233e131b30d755c89249ea9d': { 314 '00b3a4cd7400cfc1e7f7b369bdc3dcdaa50d6020233e131b30d755c89249ea9d': {
318 header: '####', 315 header: '####',
319 data: 'uGAV9pZTjrTwBy24TX/OUQwGmgzTnXv1JBIxdGkeoLCUhP9tAjbpUVylrUI5+VRrFYkXYyZ0o2HEgKrun2f3PODTxlmAbfkUldOV5tyV/EUxN0vYSBtgsMpqQm3bOKRIAo/uzrhSE3iwMjvKOTH2jUrkmX6hmqhXWZfa4X231GovrnOjek8c7t+LUBmmIjXEr2GSc/UbBoFnni+Q7ZArwtU68xoeCjLame1e8Y9wvCO8gIfAzXQAHsDgzn1MVeiWIqiCBTs8YKCO1yaxZpkzXV0yWzX+bHyXlKWwAk7Fu9w0CuaRULZmRCQhv+MMDw8DEXciTm0R5dRiVmSCFBy8cL9qlSeSX0GlnKl8E4/TSqvhMJblwJJsgmGSZ9cEt2u0E08tHxKuoeaaT1rpAOoiqx+z7BdhqjWOQZOGM4gR3EwqvOQoNYFUaXjAdmiUzW+e+TgE1IBQ8udRFl/D2zCcqFO90Hgc7hHsTDI3aGYvi6bHADu8hFpmZtJAjOMv1JgCX4Hm4n+SsbHd0DIfkEUMeGlVO47lcGWBZNRRm7xl8luZ4sZn', 316 data: 'uGAV9pZTjrTwBy24TX/OUQwGmgzTnXv1JBIxdGkeoLCUhP9tAjbpUVylrUI5+VRrFYkXYyZ0o2HEgKrun2f3PODTxlmAbfkUldOV5tyV/EUxN0vYSBtgsMpqQm3bOKRIAo/uzrhSE3iwMjvKOTH2jUrkmX6hmqhXWZfa4X231GovrnOjek8c7t+LUBmmIjXEr2GSc/UbBoFnni+Q7ZArwtU68xoeCjLame1e8Y9wvCO8gIfAzXQAHsDgzn1MVeiWIqiCBTs8YKCO1yaxZpkzXV0yWzX+bHyXlKWwAk7Fu9w0CuaRULZmRCQhv+MMDw8DEXciTm0R5dRiVmSCFBy8cL9qlSeSX0GlnKl8E4/TSqvhMJblwJJsgmGSZ9cEt2u0E08tHxKuoeaaT1rpAOoiqx+z7BdhqjWOQZOGM4gR3EwqvOQoNYFUaXjAdmiUzW+e+TgE1IBQ8udRFl/D2zCcqFO90Hgc7hHsTDI3aGYvi6bHADu8hFpmZtJAjOMv1JgCX4Hm4n+SsbHd0DIfkEUMeGlVO47lcGWBZNRRm7xl8luZ4sZn',
320 version: '0.3', 317 version: '0.3',
321 creationDate: 'Mon Jan 05 17:45:25 CET 2009', 318 creationDate: 'Mon Jan 05 17:45:25 CET 2009',
322 updateDate: 'Mon Jan 05 17:45:25 CET 2009', 319 updateDate: 'Mon Jan 05 17:45:25 CET 2009',
323 accessDate: 'Mon Jan 19 16:10:21 CET 2009' 320 accessDate: 'Mon Jan 19 16:10:21 CET 2009'
324 } 321 }
325 } 322 }
326 }, 323 },
327 '6026370f3db3860d2c46a08e389a7e906dc14f98c8444b21be9a7e9f405a2728': { 324 '6026370f3db3860d2c46a08e389a7e906dc14f98c8444b21be9a7e9f405a2728': {
328 data: '3oUg1TD+Lu4ou06j/MddOTXDqRM+qSKD+6Iuzia1Hop1w7v/BXidqeoKJZQI2VY9oO9B70Nr3B3wDROF+ycy6Rq+FM/xqUGHKXn1lAaSc6Wgj6TLQ6eRF6YZKSPqTj7TDWyw/2pEWk4HjcT8drTrCaC02tzAXMhYWlYPQPW4fUdq4hawoHIdopUN3vafQuFjY47OhqXKav3bNao=', 325 data: '3oUg1TD+Lu4ou06j/MddOTXDqRM+qSKD+6Iuzia1Hop1w7v/BXidqeoKJZQI2VY9oO9B70Nr3B3wDROF+ycy6Rq+FM/xqUGHKXn1lAaSc6Wgj6TLQ6eRF6YZKSPqTj7TDWyw/2pEWk4HjcT8drTrCaC02tzAXMhYWlYPQPW4fUdq4hawoHIdopUN3vafQuFjY47OhqXKav3bNao=',
329 version: '0.2', 326 version: '0.2',
330 creationDate: 'Tue Apr 17 16:36:08 CEST 2007', 327 creationDate: 'Tue Apr 17 16:36:08 CEST 2007',
331 updateDate: 'Tue Apr 17 16:36:08 CEST 2007', 328 updateDate: 'Tue Apr 17 16:36:08 CEST 2007',
332 accessDate: 'Mon Jan 19 16:09:33 CET 2009', 329 accessDate: 'Mon Jan 19 16:09:33 CET 2009',
333 currentVersion: 'bf8d46022179715d9d27e0a256b56b50828a771c3c6b46fe36fb2982dcb3b4cc', 330 currentVersion: 'bf8d46022179715d9d27e0a256b56b50828a771c3c6b46fe36fb2982dcb3b4cc',
334 versions: { 331 versions: {
335 'bf8d46022179715d9d27e0a256b56b50828a771c3c6b46fe36fb2982dcb3b4cc': { 332 'bf8d46022179715d9d27e0a256b56b50828a771c3c6b46fe36fb2982dcb3b4cc': {
336 header: '####', 333 header: '####',
337 data: 'fehYRMkg/wFj2t/aWu7szbXwrCyCDpjQN4UNck4/OiDlth70a2ve6ow5lAi2jgdlV9WiFrPejfa8dD0Z1g19jx+BBsuUYnBEKD0K+NapdJBBeI0We2nj9nYIij2dfZVx7cuvhy8sN6+DdylUQLsFHbga+Gi5hWcMuULT4GOAIy2WanSQL1RSR4ruA6zm/t+VVboEkkm7PPT+w3LuRl3wRaD4a8ZwYiSV/SzgWooFrh2S3YOUeshdaGCiYpTbXscsOxsCxc11i6wQGBqYSjksmtZDvEegdQdzCmxvq4jaVWJElYYS3av612nD5K/w7Zei6RccBiODBPATjrIczYg7HwmQxIM/6QI9/LQn0LP0yqRVUUtfzaODf0uWNpFzml9l/1lwXuBJyQFBp7H7Th46ekw9yEuPD00oZ+eXvKwbwfUU0JshT4hnEBtIjM8fH974PU0y95f0yLAJ1+M6DVXCxGsBix2aKJx9fuZP4KGpaXg6qCb/6327rph7MGomcrGPIiDjYwD/NTMdGluc55OZfGXtOZUaJCUM6nihqDwU7Ly1ZzYorgcvkX/t/0RNcOkFzGYNByp7mdcotyiHqCDKspqz9mEXAd7Noz3HO5GFpPqbRo7htDigGU1f7dvgbbfRoTz17Bt9Mw==', 334 data: 'fehYRMkg/wFj2t/aWu7szbXwrCyCDpjQN4UNck4/OiDlth70a2ve6ow5lAi2jgdlV9WiFrPejfa8dD0Z1g19jx+BBsuUYnBEKD0K+NapdJBBeI0We2nj9nYIij2dfZVx7cuvhy8sN6+DdylUQLsFHbga+Gi5hWcMuULT4GOAIy2WanSQL1RSR4ruA6zm/t+VVboEkkm7PPT+w3LuRl3wRaD4a8ZwYiSV/SzgWooFrh2S3YOUeshdaGCiYpTbXscsOxsCxc11i6wQGBqYSjksmtZDvEegdQdzCmxvq4jaVWJElYYS3av612nD5K/w7Zei6RccBiODBPATjrIczYg7HwmQxIM/6QI9/LQn0LP0yqRVUUtfzaODf0uWNpFzml9l/1lwXuBJyQFBp7H7Th46ekw9yEuPD00oZ+eXvKwbwfUU0JshT4hnEBtIjM8fH974PU0y95f0yLAJ1+M6DVXCxGsBix2aKJx9fuZP4KGpaXg6qCb/6327rph7MGomcrGPIiDjYwD/NTMdGluc55OZfGXtOZUaJCUM6nihqDwU7Ly1ZzYorgcvkX/t/0RNcOkFzGYNByp7mdcotyiHqCDKspqz9mEXAd7Noz3HO5GFpPqbRo7htDigGU1f7dvgbbfRoTz17Bt9Mw==',
338 version: '0.2', 335 version: '0.2',
339 creationDate: 'Tue Apr 17 16:36:08 CEST 2007', 336 creationDate: 'Tue Apr 17 16:36:08 CEST 2007',
340 updateDate: 'Tue Apr 17 16:36:08 CEST 2007', 337 updateDate: 'Tue Apr 17 16:36:08 CEST 2007',
341 accessDate: 'Mon Jan 19 16:09:33 CET 2009' 338 accessDate: 'Mon Jan 19 16:09:33 CET 2009'
342 } 339 }
343 } 340 }
344 }, 341 },
345 '6c25be8e145efb26a1abd59590522f73fb2e3dbc139af2217074d9e2ba92c16a': { 342 '6c25be8e145efb26a1abd59590522f73fb2e3dbc139af2217074d9e2ba92c16a': {
346 data: 'b2mcYUi59l434kGl7ij6dBu3063UL1dToMIu3Zsa9RV9RzeLKnezJhLKunqoAm7KwiJeqDo/REexHI1cshGYtHasVXXuyJfMx1grH7yhoWnkSRF4Sax6w5E5wnGkEpGJHOxXJ9rOjWHZ7yqCUUCB/dqLw4FwPOtRb/ynkBEYztEJA6EKGJuz0vrrTOsT8HMXtj/w6MEZ7qI3fPs=', 343 data: 'b2mcYUi59l434kGl7ij6dBu3063UL1dToMIu3Zsa9RV9RzeLKnezJhLKunqoAm7KwiJeqDo/REexHI1cshGYtHasVXXuyJfMx1grH7yhoWnkSRF4Sax6w5E5wnGkEpGJHOxXJ9rOjWHZ7yqCUUCB/dqLw4FwPOtRb/ynkBEYztEJA6EKGJuz0vrrTOsT8HMXtj/w6MEZ7qI3fPs=',
347 version: '0.2', 344 version: '0.2',
348 creationDate: 'Mon Apr 02 19:12:44 CEST 2007', 345 creationDate: 'Mon Apr 02 19:12:44 CEST 2007',
349 updateDate: 'Mon Apr 02 19:12:44 CEST 2007', 346 updateDate: 'Mon Apr 02 19:12:44 CEST 2007',
350 accessDate: 'Mon Jan 19 16:10:08 CET 2009', 347 accessDate: 'Mon Jan 19 16:10:08 CET 2009',
351 currentVersion: '2f60193c0fc0e3f2f178955e1c68759675acdf691bcb918cfad329a5a97cfaf3', 348 currentVersion: '2f60193c0fc0e3f2f178955e1c68759675acdf691bcb918cfad329a5a97cfaf3',
352 versions: { 349 versions: {
353 '2f60193c0fc0e3f2f178955e1c68759675acdf691bcb918cfad329a5a97cfaf3': { 350 '2f60193c0fc0e3f2f178955e1c68759675acdf691bcb918cfad329a5a97cfaf3': {
354 header: '####', 351 header: '####',
355 data: 'pZEWSdYIkrX8/r6OYmO0GEuKG9baUgn40Bmw7hXZBd/kfWuRjWsL4/pc5F5Ojrx+N0dxmQn5ZqKAzOOri29Rm4ruxnCbyK+oDsCDyMSnWy/VJcvystnDKzKmBRQVAOSEJtzEb3OtGzvqm0PQ1Dhx1YUAx7L6KlXysmG9h9+MjOcErRL9/1x1LZ33ytR+zK4LvTAb7gN5/9QgwysFyCkNP8bG4nyCzPMiUrBnP0odMTUvDkJDlY0Oia6VjGW6oNxnGIgA5fDraRrW4JH2oejQcrL7+X+jpCp05g==', 352 data: 'pZEWSdYIkrX8/r6OYmO0GEuKG9baUgn40Bmw7hXZBd/kfWuRjWsL4/pc5F5Ojrx+N0dxmQn5ZqKAzOOri29Rm4ruxnCbyK+oDsCDyMSnWy/VJcvystnDKzKmBRQVAOSEJtzEb3OtGzvqm0PQ1Dhx1YUAx7L6KlXysmG9h9+MjOcErRL9/1x1LZ33ytR+zK4LvTAb7gN5/9QgwysFyCkNP8bG4nyCzPMiUrBnP0odMTUvDkJDlY0Oia6VjGW6oNxnGIgA5fDraRrW4JH2oejQcrL7+X+jpCp05g==',
356 version: '0.2', 353 version: '0.2',
357 creationDate: 'Mon Apr 02 19:12:44 CEST 2007', 354 creationDate: 'Mon Apr 02 19:12:44 CEST 2007',
358 updateDate: 'Mon Apr 02 19:12:44 CEST 2007', 355 updateDate: 'Mon Apr 02 19:12:44 CEST 2007',
359 accessDate: 'Mon Jan 19 16:10:08 CET 2009' 356 accessDate: 'Mon Jan 19 16:10:08 CET 2009'
360 } 357 }
361 } 358 }
362 }, 359 },
363 '6d45c2fec275b7482d41c76b20507100cfb6ab49922b876f9dd3040d361f4a18': { 360 '6d45c2fec275b7482d41c76b20507100cfb6ab49922b876f9dd3040d361f4a18': {
364 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==', 361 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==',
365 version: '0.2', 362 version: '0.2',
366 creationDate: 'Wed Mar 14 19:09:05 CET 2007', 363 creationDate: 'Wed Mar 14 19:09:05 CET 2007',
367 updateDate: 'Wed Mar 14 19:09:05 CET 2007', 364 updateDate: 'Wed Mar 14 19:09:05 CET 2007',
368 accessDate: 'Mon Jan 19 16:10:15 CET 2009', 365 accessDate: 'Mon Jan 19 16:10:15 CET 2009',
369 currentVersion: 'e85f085a8ed42d2def7adc796b66a2e0a4c3c88d9f3e785eb12a6f5619d945c5', 366 currentVersion: 'e85f085a8ed42d2def7adc796b66a2e0a4c3c88d9f3e785eb12a6f5619d945c5',
370 versions: { 367 versions: {
371 'e85f085a8ed42d2def7adc796b66a2e0a4c3c88d9f3e785eb12a6f5619d945c5': { 368 'e85f085a8ed42d2def7adc796b66a2e0a4c3c88d9f3e785eb12a6f5619d945c5': {
372 header: '####', 369 header: '####',
373 data: 'BbXNAy0GcKKyDPiwhP1Jk9mIi3uXMHQdhuxpDvoR2C3YITOUBpurxGhhvmCg+a9pS+fKJdZPxL2mPbJj6GfWTEsm7K/ECEjrVkSTHi6PTUUgYVbCumq9EHjUspos+7VrifZry3c73+qAvIKamvUlNB86TchMpOXVJIyx8UgRX+bdhrxk9ZCEVOiLCG1zGPX8IzmcxPmBRZFlHYqE4ibhl/CLEzWXZBYCofTusClhOh7YM/jBgvDt64W7aIN2y2KiKwmFySkFZdnOvbAb34tXVimwqjqWPvPwd6MujQeX1bmaDD7Y0kXac8CJxqasIezLo2WqzLUbEXdIHGilkaPT2ZKpKhKkpHJHFrV2lVuQJVqwPUr0Gf9qMKgVnsyU8kUfq9ox+fhH70+v7BQSjT7bxxDLs0UesQeL7G4SqvNet5hPI4GQEpOY8p5MUFReIBTRm72NQEU=', 370 data: 'BbXNAy0GcKKyDPiwhP1Jk9mIi3uXMHQdhuxpDvoR2C3YITOUBpurxGhhvmCg+a9pS+fKJdZPxL2mPbJj6GfWTEsm7K/ECEjrVkSTHi6PTUUgYVbCumq9EHjUspos+7VrifZry3c73+qAvIKamvUlNB86TchMpOXVJIyx8UgRX+bdhrxk9ZCEVOiLCG1zGPX8IzmcxPmBRZFlHYqE4ibhl/CLEzWXZBYCofTusClhOh7YM/jBgvDt64W7aIN2y2KiKwmFySkFZdnOvbAb34tXVimwqjqWPvPwd6MujQeX1bmaDD7Y0kXac8CJxqasIezLo2WqzLUbEXdIHGilkaPT2ZKpKhKkpHJHFrV2lVuQJVqwPUr0Gf9qMKgVnsyU8kUfq9ox+fhH70+v7BQSjT7bxxDLs0UesQeL7G4SqvNet5hPI4GQEpOY8p5MUFReIBTRm72NQEU=',
374 version: '0.2', 371 version: '0.2',
375 creationDate: 'Wed Mar 14 19:09:05 CET 2007', 372 creationDate: 'Wed Mar 14 19:09:05 CET 2007',
376 updateDate: 'Wed Mar 14 19:09:05 CET 2007', 373 updateDate: 'Wed Mar 14 19:09:05 CET 2007',
377 accessDate: 'Mon Jan 19 16:10:15 CET 2009' 374 accessDate: 'Mon Jan 19 16:10:15 CET 2009'
378 } 375 }
379 } 376 }
380 }, 377 },
381 '7bb69b6366a8012f181c01e368ba18d4f7a82bcabb4959189736ad124c4bbfbb': { 378 '7bb69b6366a8012f181c01e368ba18d4f7a82bcabb4959189736ad124c4bbfbb': {
382 data: 'wYPZIt0UHiNVefNwtGc7z7Lu3YoQrXdfKmWqilZp8yeIrNfSLB9p60DLMrL3GDq/CsvDYkGAZgj1C/6NVnzVsXsJKq7NDZn1UPOGt+hCnw3lEVbD7zHkoMM4VgFDn1sZdjLe8wdpIFfdlQESTipT3GVXv3swG2qX2O2yuwtlopR8yZQTLg==', 379 data: 'wYPZIt0UHiNVefNwtGc7z7Lu3YoQrXdfKmWqilZp8yeIrNfSLB9p60DLMrL3GDq/CsvDYkGAZgj1C/6NVnzVsXsJKq7NDZn1UPOGt+hCnw3lEVbD7zHkoMM4VgFDn1sZdjLe8wdpIFfdlQESTipT3GVXv3swG2qX2O2yuwtlopR8yZQTLg==',
383 version: '0.3', 380 version: '0.3',
384 creationDate: 'Mon Jan 05 17:44:30 CET 2009', 381 creationDate: 'Mon Jan 05 17:44:30 CET 2009',
385 updateDate: 'Mon Jan 05 17:44:30 CET 2009', 382 updateDate: 'Mon Jan 05 17:44:30 CET 2009',
386 accessDate: 'Mon Jan 19 16:10:18 CET 2009', 383 accessDate: 'Mon Jan 19 16:10:18 CET 2009',
387 currentVersion: '23f5fb503e54c0cafe3d4944ddaf40bc74fab8b5d96e2bbddf693b1afb225e5b', 384 currentVersion: '23f5fb503e54c0cafe3d4944ddaf40bc74fab8b5d96e2bbddf693b1afb225e5b',
388 versions: { 385 versions: {
389 '23f5fb503e54c0cafe3d4944ddaf40bc74fab8b5d96e2bbddf693b1afb225e5b': { 386 '23f5fb503e54c0cafe3d4944ddaf40bc74fab8b5d96e2bbddf693b1afb225e5b': {
390 header: '####', 387 header: '####',
391 data: 'IpYj+7t3DhSVD8r9PkLbF5xpGrHhg8omY014P1vkT2KkGDEUj+ekQAbQ1g66Z7oNhRDpjS1/dcDjzH0IIQLjGuQ0oRfL0xZefVTx3N88ZLE39m3cJz10K2xyg3xp06jFBmdNJuCkgRhMzeUXeEJujw4lS2kv7cO04Uh2Maui6jDR7E498rgePY3L32vG1S66li/xU1vPjNn06aFTqSYxUL17/mlJNbgp3XWjGC+l0dXLLfXy1wOm+/I3zp2caTs+a2zDUZ15s+3XeaAWpBH7QCaQsvsQmoBqPbMvkjOQwW3taDvV7Hvkh+qTjCEcLjRFwhZkMNn3N2ewcLWQa2aVIjxt6Z0F4s/1URztWlKVzCfto8RmrLajYRn3ggG12kX2xDJFjNPNfs/7A3tMn+FqXQCCNG5GI06JZ32aQfpnjtmXScUuEs8UeFgsNeYclQhcm5R0sUwISK+D345B8859w+4+9OTY38NgYQQ9o/tmpCjWj1tLYLx/m/GcR2em7iyDpBdcnWUb+tK6Ah89qvXriHwPLSNzhOH2wxmi7nXTRQWMv7g2', 388 data: 'IpYj+7t3DhSVD8r9PkLbF5xpGrHhg8omY014P1vkT2KkGDEUj+ekQAbQ1g66Z7oNhRDpjS1/dcDjzH0IIQLjGuQ0oRfL0xZefVTx3N88ZLE39m3cJz10K2xyg3xp06jFBmdNJuCkgRhMzeUXeEJujw4lS2kv7cO04Uh2Maui6jDR7E498rgePY3L32vG1S66li/xU1vPjNn06aFTqSYxUL17/mlJNbgp3XWjGC+l0dXLLfXy1wOm+/I3zp2caTs+a2zDUZ15s+3XeaAWpBH7QCaQsvsQmoBqPbMvkjOQwW3taDvV7Hvkh+qTjCEcLjRFwhZkMNn3N2ewcLWQa2aVIjxt6Z0F4s/1URztWlKVzCfto8RmrLajYRn3ggG12kX2xDJFjNPNfs/7A3tMn+FqXQCCNG5GI06JZ32aQfpnjtmXScUuEs8UeFgsNeYclQhcm5R0sUwISK+D345B8859w+4+9OTY38NgYQQ9o/tmpCjWj1tLYLx/m/GcR2em7iyDpBdcnWUb+tK6Ah89qvXriHwPLSNzhOH2wxmi7nXTRQWMv7g2',
392 version: '0.3', 389 version: '0.3',
393 creationDate: 'Mon Jan 05 17:44:30 CET 2009', 390 creationDate: 'Mon Jan 05 17:44:30 CET 2009',
394 updateDate: 'Mon Jan 05 17:44:30 CET 2009', 391 updateDate: 'Mon Jan 05 17:44:30 CET 2009',
395 accessDate: 'Mon Jan 19 16:10:18 CET 2009' 392 accessDate: 'Mon Jan 19 16:10:18 CET 2009'
396 } 393 }
397 } 394 }
398 }, 395 },
399 '8b18e8593b5bc2f7ea39a5fab222047034ef2f380fee05be0fa6e1c0972fea39': { 396 '8b18e8593b5bc2f7ea39a5fab222047034ef2f380fee05be0fa6e1c0972fea39': {
400 data: 'pOMTY3PnUAbwMLDEYNJCMzp4iIA42YWr6gqoomg+P40e7LFUtbt/RQRelQwNIztyUSVLl0rilkZZkBUVvxrtTqvibKITCjJQGQIzvcb+Yl4mNosl2Rpp0xxMU03f1+G7eGbuCc5hJXYVAglhEYplaAPzHbRWXMY8iZXZPBuLVf5PN+rdpgAfkGeZ7Uf9RsQ9p/EglrWXYnTwXi3saUfzIjfvSHm5C+dXTY3FHpIc1YkjFrdVgMkhYQGV60JtZcwFtCEL2NpVljAbRgHoIXTOkzUvep4vxrtfBBWWMuAWEI06432gtnH6IQbrR6jOpwuMt7k/09qy/fARPHs3r4qTJ9r2uqWHJ7tjJw+IChQPC+3l5HcPpFURiw8LGAN1NyY1hUrF6N84RSn7AKS0bLa5qN++5lcjjxn/k8+JqmeUqN1/SYIbGwNnJeZ0vA8yvOxnD20iVADX5kOVqJDwXRPLaF6Oz9KkbOrmANCh+PmGw1i6PduB+FgAU4HViYCw5IGOUZ30Pm1NJofqfbhXvgzn7ey2+kUIAwDyOUpJ9fW+9jW/JU4rcawmzwBYN2V8apOoyc3wQJICm2984wIfVBpygCOZM0QDyVgNo57qKtYH3yMDQSkKvpEUmuhklMYhcV+4X5ggdqx7lYXO9IMDnFf2ZDiZyieTlOlRv/nNVecUB177Xpnq2e+X/ik2rCQWVrIymiV6ltr1DEv0krXKfvXGG/FMZHUmo3m+B5bG4xVhmt0GnHseqvY2Vrl9NksLgq3hTDOGSGIy5Nv8kfrd8B4/6Tavh0SumiyXnrTXyYXzCK9E7IqO/0KAln63VkcHsbOtS8mj1drN0YQ2KKaeIW+Yr3Gm0pbcODsgA6aFfz1itZVeovBqUklhXS+/Es8J8xOSvvSyD/TmlFjuErHa+wwNQvftosfwk9ZTt0eIJS5aLHdU2QsCjdfSy0DEPkk2siGhBX5ZhRzqyIAyXApSmy+e7PIqn/dDR51+D1ZHwoTQyTrd+F08jBWZgU/OvS8MRxNZSxQwsi7bcWZG+w0utrIDB8eSOMVBXI5XBeJb4h5Bzut18C1shGHeGkSJp04=', 397 data: 'pOMTY3PnUAbwMLDEYNJCMzp4iIA42YWr6gqoomg+P40e7LFUtbt/RQRelQwNIztyUSVLl0rilkZZkBUVvxrtTqvibKITCjJQGQIzvcb+Yl4mNosl2Rpp0xxMU03f1+G7eGbuCc5hJXYVAglhEYplaAPzHbRWXMY8iZXZPBuLVf5PN+rdpgAfkGeZ7Uf9RsQ9p/EglrWXYnTwXi3saUfzIjfvSHm5C+dXTY3FHpIc1YkjFrdVgMkhYQGV60JtZcwFtCEL2NpVljAbRgHoIXTOkzUvep4vxrtfBBWWMuAWEI06432gtnH6IQbrR6jOpwuMt7k/09qy/fARPHs3r4qTJ9r2uqWHJ7tjJw+IChQPC+3l5HcPpFURiw8LGAN1NyY1hUrF6N84RSn7AKS0bLa5qN++5lcjjxn/k8+JqmeUqN1/SYIbGwNnJeZ0vA8yvOxnD20iVADX5kOVqJDwXRPLaF6Oz9KkbOrmANCh+PmGw1i6PduB+FgAU4HViYCw5IGOUZ30Pm1NJofqfbhXvgzn7ey2+kUIAwDyOUpJ9fW+9jW/JU4rcawmzwBYN2V8apOoyc3wQJICm2984wIfVBpygCOZM0QDyVgNo57qKtYH3yMDQSkKvpEUmuhklMYhcV+4X5ggdqx7lYXO9IMDnFf2ZDiZyieTlOlRv/nNVecUB177Xpnq2e+X/ik2rCQWVrIymiV6ltr1DEv0krXKfvXGG/FMZHUmo3m+B5bG4xVhmt0GnHseqvY2Vrl9NksLgq3hTDOGSGIy5Nv8kfrd8B4/6Tavh0SumiyXnrTXyYXzCK9E7IqO/0KAln63VkcHsbOtS8mj1drN0YQ2KKaeIW+Yr3Gm0pbcODsgA6aFfz1itZVeovBqUklhXS+/Es8J8xOSvvSyD/TmlFjuErHa+wwNQvftosfwk9ZTt0eIJS5aLHdU2QsCjdfSy0DEPkk2siGhBX5ZhRzqyIAyXApSmy+e7PIqn/dDR51+D1ZHwoTQyTrd+F08jBWZgU/OvS8MRxNZSxQwsi7bcWZG+w0utrIDB8eSOMVBXI5XBeJb4h5Bzut18C1shGHeGkSJp04=',
401 version: '0.2', 398 version: '0.2',
402 creationDate: 'Tue May 01 01:10:17 CEST 2007', 399 creationDate: 'Tue May 01 01:10:17 CEST 2007',
403 updateDate: 'Tue May 01 01:13:27 CEST 2007', 400 updateDate: 'Tue May 01 01:13:27 CEST 2007',
404 accessDate: 'Mon Jan 19 16:10:02 CET 2009', 401 accessDate: 'Mon Jan 19 16:10:02 CET 2009',
405 currentVersion: 'd175358ea0b9d32c23e4bceff2020eae9a8459466abc18d4399d988e733fc0f8', 402 currentVersion: 'd175358ea0b9d32c23e4bceff2020eae9a8459466abc18d4399d988e733fc0f8',
406 versions: { 403 versions: {
407 '8a032b53f7356e2d8b28665211abbe2cf1c79fd8eee4752e83cebdced1c19911': { 404 '8a032b53f7356e2d8b28665211abbe2cf1c79fd8eee4752e83cebdced1c19911': {
408 header: '####', 405 header: '####',
diff --git a/frontend/gamma/tests/tests/Components/CardDialogEditing/dragAndDrop_test.js b/frontend/gamma/tests/tests/Components/CardDialogEditing/dragAndDrop_test.js
index e805e34..91909fa 100644
--- a/frontend/gamma/tests/tests/Components/CardDialogEditing/dragAndDrop_test.js
+++ b/frontend/gamma/tests/tests/Components/CardDialogEditing/dragAndDrop_test.js
@@ -1,128 +1,125 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.Tests.DragAndDrop'); 26Clipperz.Base.module('Clipperz.Tests.DragAndDrop');
30 27
31Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); 28Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
32Clipperz.PM.Strings.Languages.initSetup(); 29Clipperz.PM.Strings.Languages.initSetup();
33 30
34Clipperz.Tests.DragAndDrop.Tester = function(args) { 31Clipperz.Tests.DragAndDrop.Tester = function(args) {
35 args = args || {}; 32 args = args || {};
36 33
37 Clipperz.Tests.DragAndDrop.Tester.superclass.constructor.call(this, args); 34 Clipperz.Tests.DragAndDrop.Tester.superclass.constructor.call(this, args);
38 this._user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); 35 this._user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}});
39 36
40 return this; 37 return this;
41}; 38};
42 39
43Clipperz.Base.extend(Clipperz.Tests.DragAndDrop.Tester, Object, { 40Clipperz.Base.extend(Clipperz.Tests.DragAndDrop.Tester, Object, {
44 41
45 'toString': function() { 42 'toString': function() {
46 return "Clipperz.Tests.DragAndDrop.Tester"; 43 return "Clipperz.Tests.DragAndDrop.Tester";
47 }, 44 },
48 45
49 //------------------------------------------------------------------------- 46 //-------------------------------------------------------------------------
50 47
51 'user': function () { 48 'user': function () {
52 return this._user; 49 return this._user;
53 }, 50 },
54 51
55 //------------------------------------------------------------------------- 52 //-------------------------------------------------------------------------
56 53
57 'run': function () { 54 'run': function () {
58 var deferredResult; 55 var deferredResult;
59 var proxy; 56 var proxy;
60 varcardDialogController; 57 varcardDialogController;
61 varcardDialogComponent; 58 varcardDialogComponent;
62 59
63 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); 60 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false});
64 61
65 deferredResult = new Clipperz.Async.Deferred("DragAndDrop_test.init", {trace:false}); 62 deferredResult = new Clipperz.Async.Deferred("DragAndDrop_test.init", {trace:false});
66 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']); 63 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']);
67 deferredResult.addMethod(this.user(), 'login'); 64 deferredResult.addMethod(this.user(), 'login');
68 deferredResult.addMethod(this.user(), 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); 65 deferredResult.addMethod(this.user(), 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13');
69 deferredResult.addCallback(MochiKit.Base.bind(function (aRecord) { 66 deferredResult.addCallback(MochiKit.Base.bind(function (aRecord) {
70 cardDialogController = new Clipperz.PM.UI.Web.Controllers.CardDialogController({record:aRecord, delegate:this}); 67 cardDialogController = new Clipperz.PM.UI.Web.Controllers.CardDialogController({record:aRecord, delegate:this});
71 cardDialogController.run(); 68 cardDialogController.run();
72 69
73 cardDialogController.showPasswordTooltip('**********', MochiKit.DOM.getElement('Clipperz_PM_Components_actionLink_63')); 70 cardDialogController.showPasswordTooltip('**********', MochiKit.DOM.getElement('Clipperz_PM_Components_actionLink_63'));
74 }, this)); 71 }, this));
75 deferredResult.callback(); 72 deferredResult.callback();
76 73
77 return deferredResult; 74 return deferredResult;
78 }, 75 },
79 76
80 //========================================================================= 77 //=========================================================================
81 78
82 'saveChanges': function () { 79 'saveChanges': function () {
83 return this.user().saveChanges(); 80 return this.user().saveChanges();
84 }, 81 },
85 82
86 //------------------------------------------------------------------------- 83 //-------------------------------------------------------------------------
87 84
88 'hasPendingChanges': function () { 85 'hasPendingChanges': function () {
89 return this.user().hasPendingChanges(); 86 return this.user().hasPendingChanges();
90 }, 87 },
91 88
92 //------------------------------------------------------------------------- 89 //-------------------------------------------------------------------------
93 90
94 'revertChanges': function () { 91 'revertChanges': function () {
95 return this.user().revertChanges(); 92 return this.user().revertChanges();
96 }, 93 },
97 94
98 //========================================================================= 95 //=========================================================================
99 __syntaxFix__: "syntax fix" 96 __syntaxFix__: "syntax fix"
100}); 97});
101 98
102 99
103 100
104 101
105 102
106 103
107 104
108 105
109 106
110 107
111 108
112 109
113 110
114 111
115 112
116 113
117 114
118 115
119 116
120 117
121init = function () { 118init = function () {
122 vartester; 119 vartester;
123 120
124 tester = new Clipperz.Tests.DragAndDrop.Tester(); 121 tester = new Clipperz.Tests.DragAndDrop.Tester();
125 tester.run(); 122 tester.run();
126}; 123};
127 124
128MochiKit.DOM.addLoadEvent(init); 125MochiKit.DOM.addLoadEvent(init);
diff --git a/frontend/gamma/tests/tests/Components/CardDialogEditing/index.html b/frontend/gamma/tests/tests/Components/CardDialogEditing/index.html
index 7cc0961..e484719 100644
--- a/frontend/gamma/tests/tests/Components/CardDialogEditing/index.html
+++ b/frontend/gamma/tests/tests/Components/CardDialogEditing/index.html
@@ -1,133 +1,130 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27--> 24-->
28 25
29<html> 26<html>
30<head> 27<head>
31 <title>Card Dialog EDITING - test</title> 28 <title>Card Dialog EDITING - test</title>
32 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 29 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
33 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script> 30 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script>
34 31
35 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> 32 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
36 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script> 33 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
37 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 34 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
38 <script type='text/javascript' src='../../../../js/Clipperz/Date.js'></script> 35 <script type='text/javascript' src='../../../../js/Clipperz/Date.js'></script>
39 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script> 36 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script>
40 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 37 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
41 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script> 38 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script> 39 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script>
43 40
44 <script type='text/javascript' src='../../../../js/Clipperz/Signal.js'></script> 41 <script type='text/javascript' src='../../../../js/Clipperz/Signal.js'></script>
45 <script type='text/javascript' src='../../../../js/Clipperz/Style.js'></script> 42 <script type='text/javascript' src='../../../../js/Clipperz/Style.js'></script>
46 <script type='text/javascript' src='../../../../js/Clipperz/Visual.js'></script> 43 <script type='text/javascript' src='../../../../js/Clipperz/Visual.js'></script>
47 <script type='text/javascript' src='../../../../js/Clipperz/Set.js'></script> 44 <script type='text/javascript' src='../../../../js/Clipperz/Set.js'></script>
48 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script> 45 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script>
49 46
50 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> 47 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
51 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> 48 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
52 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script> 49 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
53 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> 50 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
54 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script> 51 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
55 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script> 52 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script>
56 53
57 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script> 54 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script>
58 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script> 55 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script>
59 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script> 56 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script>
60 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script> 57 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script>
61 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script> 58 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script>
62 59
63 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script> 60 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script>
64 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script> 61 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script>
65 62
66 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings.js'></script> 63 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings.js'></script>
67 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script> 64 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script>
68 <script type='text/javascript' src='../../../../js/Clipperz/PM/Date.js'></script> 65 <script type='text/javascript' src='../../../../js/Clipperz/PM/Date.js'></script>
69 <script type='text/javascript' src='../../../../js/Clipperz/PM/BookmarkletProcessor.js'></script> 66 <script type='text/javascript' src='../../../../js/Clipperz/PM/BookmarkletProcessor.js'></script>
70 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/EncryptedRemoteObject.js'></script> 67 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/EncryptedRemoteObject.js'></script>
71 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.js'></script> 68 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.js'></script>
72 <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.js'></script>
73 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.Field.js'></script> 70 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.Field.js'></script>
74 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLogin.js'></script> 71 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLogin.js'></script>
75 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLoginInput.js'></script> 72 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLoginInput.js'></script>
76 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLoginBinding.js'></script> 73 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLoginBinding.js'></script>
77 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLoginFormValue.js'></script> 74 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLoginFormValue.js'></script>
78 <!-- script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Field.js'></script --> 75 <!-- script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Field.js'></script -->
79 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.js'></script> 76 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.js'></script>
80 <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.Legacy.js'></script>
81 <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.RecordIndex.js'></script>
82 <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.Preferences.js'></script>
83 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.OneTimePasswords.js'></script> 80 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.OneTimePasswords.js'></script>
84 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/OneTimePassword.js'></script> 81 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/OneTimePassword.js'></script>
85 82
86 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/BaseComponent.js'></script> 83 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/BaseComponent.js'></script>
87 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ComponentSlot.js'></script> 84 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ComponentSlot.js'></script>
88 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/FaviconComponent.js'></script> 85 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/FaviconComponent.js'></script>
89 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/PasswordEntropyDisplay.js'></script> 86 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/PasswordEntropyDisplay.js'></script>
90 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ProgressBar.js'></script> 87 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ProgressBar.js'></script>
91 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/SimpleMessagePanel.js'></script> 88 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/SimpleMessagePanel.js'></script>
92 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TabPanelComponent.js'></script> 89 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TabPanelComponent.js'></script>
93 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/Tooltip.js'></script> 90 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/Tooltip.js'></script>
94 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TranslatorWidget.js'></script> 91 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TranslatorWidget.js'></script>
95 92
96 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/RulerComponent.js'></script> 93 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/RulerComponent.js'></script>
97 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogComponent.js'></script> 94 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogComponent.js'></script>
98 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogRecordFieldComponent.js'></script> 95 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogRecordFieldComponent.js'></script>
99 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogRecordDirectLoginComponent.js'></script> 96 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogRecordDirectLoginComponent.js'></script>
100 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DirectLoginEditingComponent.js'></script> 97 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DirectLoginEditingComponent.js'></script>
101 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DirectLoginEditingBindingComponent.js'></script> 98 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DirectLoginEditingBindingComponent.js'></script>
102 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DirectLoginEditingFormValueComponent.js'></script> 99 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DirectLoginEditingFormValueComponent.js'></script>
103 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/BookmarkletComponent.js'></script> 100 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/BookmarkletComponent.js'></script>
104 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/PasswordTooltip.js'></script> 101 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/PasswordTooltip.js'></script>
105 102
106 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/ProgressBarController.js'></script> 103 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/ProgressBarController.js'></script>
107 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/TabPanelController.js'></script> 104 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/TabPanelController.js'></script>
108 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/DirectLoginRunner.js'></script> 105 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/DirectLoginRunner.js'></script>
109 106
110 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/DirectLoginWizardController.js'></script> 107 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/DirectLoginWizardController.js'></script>
111 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/CardDialogController.js'></script> 108 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/CardDialogController.js'></script>
112 109
113 <script type='text/javascript' src='./User.data.js'></script> 110 <script type='text/javascript' src='./User.data.js'></script>
114 <script type='text/javascript' src='./CardDialogEditing_test.js'></script> 111 <script type='text/javascript' src='./CardDialogEditing_test.js'></script>
115<script> 112<script>
116 Clipperz_IEisBroken = false; 113 Clipperz_IEisBroken = false;
117</script> 114</script>
118 115
119<!--[if IE]><script> 116<!--[if IE]><script>
120Clipperz_IEisBroken = true; 117Clipperz_IEisBroken = true;
121</script><![endif]--> 118</script><![endif]-->
122 119
123 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/clipperz.css" /> 120 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/clipperz.css" />
124 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/compact.css" /> 121 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/compact.css" />
125 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/ytheme-clipperz.css" /> 122 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/ytheme-clipperz.css" />
126 123
127</head> 124</head>
128<body> 125<body>
129 126
130<div id="tableWrapper"></div> 127<div id="tableWrapper"></div>
131 128
132</body> 129</body>
133</html> 130</html>
diff --git a/frontend/gamma/tests/tests/Components/CardDialogNew/User.data.js b/frontend/gamma/tests/tests/Components/CardDialogNew/User.data.js
index dac8b45..49abe46 100644
--- a/frontend/gamma/tests/tests/Components/CardDialogNew/User.data.js
+++ b/frontend/gamma/tests/tests/Components/CardDialogNew/User.data.js
@@ -1,408 +1,405 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29testData = { 26testData = {
30 27
31 //------------------------------------------------------------------------- 28 //-------------------------------------------------------------------------
32 29
33 'simpleLogin_001': { 30 'simpleLogin_001': {
34 'users': [ 31 'users': [
35 { 32 {
36 'username': "joe", 33 'username': "joe",
37 'passphrase': "eoj", 34 'passphrase': "eoj",
38 'version': "0.2", 35 'version': "0.2",
39 'connectionVersion':"0.2", 36 'connectionVersion':"0.2",
40 'records':{ 37 'records':{
41 'record 1': { 38 'record 1': {
42 'notes':"Some notes here", 39 'notes':"Some notes here",
43 'fields':[ 40 'fields':[
44 { 'name': "username", 'value': "joe", 'type': "text" }, 41 { 'name': "username", 'value': "joe", 'type': "text" },
45 { 'name': "password", 'value': "1234", 'type': "password"} 42 { 'name': "password", 'value': "1234", 'type': "password"}
46 ], 43 ],
47 'directLogins':{ 44 'directLogins':{
48 "record 1 direct login": { 45 "record 1 direct login": {
49 'configuration':"", 46 'configuration':"",
50 'bindings':[ 47 'bindings':[
51 ], 48 ],
52 'favicon':"http://www.example.com/favicon.ico" 49 'favicon':"http://www.example.com/favicon.ico"
53 } 50 }
54 } 51 }
55 } 52 }
56 }, 53 },
57 'otp':[ 54 'otp':[
58 "12345678 90abcdef 12345678 90abcdef", 55 "12345678 90abcdef 12345678 90abcdef",
59 "fedcba09 87654321 fedcba09 87654321" 56 "fedcba09 87654321 fedcba09 87654321"
60 ] 57 ]
61 } 58 }
62 ] 59 ]
63 }, 60 },
64 61
65 //------------------------------------------------------------------------- 62 //-------------------------------------------------------------------------
66 63
67 'joe_clipperz_offline_copy_data': { 64 'joe_clipperz_offline_copy_data': {
68 users:{ 65 users:{
69 'catchAllUser': { 66 'catchAllUser': {
70 __masterkey_test_value__: 'masterkey', 67 __masterkey_test_value__: 'masterkey',
71 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00', 68 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00',
72 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00' 69 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00'
73 }, 70 },
74 'f527cdd90d0d47f8524b4e165398ad1455eba515d04abd101d1e93b3c6ae0674': { 71 'f527cdd90d0d47f8524b4e165398ad1455eba515d04abd101d1e93b3c6ae0674': {
75 s: '186f0c40bf73f2af236eaa6c429df225efa933050c9aae65240e93b7b362e3ee', 72 s: '186f0c40bf73f2af236eaa6c429df225efa933050c9aae65240e93b7b362e3ee',
76 v: 'ac61a6e325ecf329926a86084f591d8852d0ad3e4a6080f2adc901b82395ecaf', 73 v: 'ac61a6e325ecf329926a86084f591d8852d0ad3e4a6080f2adc901b82395ecaf',
77 version: '0.2', 74 version: '0.2',
78 maxNumberOfRecords: '100', 75 maxNumberOfRecords: '100',
79 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"}', 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"}',
80 statistics: 'SfGy/4mpXQdDOv+Bcfie4Yt/', 77 statistics: 'SfGy/4mpXQdDOv+Bcfie4Yt/',
81 userDetailsVersion: '0.3', 78 userDetailsVersion: '0.3',
82 records: { 79 records: {
83 '062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80': { 80 '062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80': {
84 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', 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',
85 version: '0.2', 82 version: '0.2',
86 creationDate: 'Wed Mar 14 15:46:44 CET 2007', 83 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
87 updateDate: 'Wed Mar 14 15:46:44 CET 2007', 84 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
88 accessDate: 'Mon Jan 19 16:10:04 CET 2009', 85 accessDate: 'Mon Jan 19 16:10:04 CET 2009',
89 currentVersion: '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3', 86 currentVersion: '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3',
90 versions: { 87 versions: {
91 '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3': { 88 '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3': {
92 header: '####', 89 header: '####',
93 data: 'GCNNIhDQjMJQZGVSf+95fPtU6eOnFWVhuGm86r8WZGVR2Gf2EjbG1OJ0ZIGpZ/AXgirCMpo5AFxJe0Bay8IYg+xmBqMFhwFxzAgJBYCIts+raSaNRipuY8dTEqDxAqD1cChcG8EhSoiFgQ0fG0I7nNEUDJi0pIt4/ygBcwvAhuAenEp9ZW+oQA0+YysPQRqkz3IieFaOoSEbe5/SqpUilV4q1gTVyzNXvrxzxx+rlvEyGFgFN+vgtUZ1NrwlPk4gVksTpylvv6CFaMGEWKhgMG6efo0rJckKosaJTu1pldJdnmMK4EKNMLOd+jZ6pEhEhYyadrA4+zYU5TlmZA6ASzTaps8piSwZodoi9qY0ch2StK4mAbzeEGe2HdfHuAU9Tyq3Ppk3+VfNdKgpQfYrQOiSlXbKzK636tzXTN/gyrfOTHjBrRl117ywibgSX63ayAYNfcLpKotC', 90 data: 'GCNNIhDQjMJQZGVSf+95fPtU6eOnFWVhuGm86r8WZGVR2Gf2EjbG1OJ0ZIGpZ/AXgirCMpo5AFxJe0Bay8IYg+xmBqMFhwFxzAgJBYCIts+raSaNRipuY8dTEqDxAqD1cChcG8EhSoiFgQ0fG0I7nNEUDJi0pIt4/ygBcwvAhuAenEp9ZW+oQA0+YysPQRqkz3IieFaOoSEbe5/SqpUilV4q1gTVyzNXvrxzxx+rlvEyGFgFN+vgtUZ1NrwlPk4gVksTpylvv6CFaMGEWKhgMG6efo0rJckKosaJTu1pldJdnmMK4EKNMLOd+jZ6pEhEhYyadrA4+zYU5TlmZA6ASzTaps8piSwZodoi9qY0ch2StK4mAbzeEGe2HdfHuAU9Tyq3Ppk3+VfNdKgpQfYrQOiSlXbKzK636tzXTN/gyrfOTHjBrRl117ywibgSX63ayAYNfcLpKotC',
94 version: '0.2', 91 version: '0.2',
95 creationDate: 'Wed Mar 14 15:46:44 CET 2007', 92 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
96 updateDate: 'Wed Mar 14 15:46:44 CET 2007', 93 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
97 accessDate: 'Mon Jan 19 16:10:04 CET 2009' 94 accessDate: 'Mon Jan 19 16:10:04 CET 2009'
98 } 95 }
99 } 96 }
100 }, 97 },
101 '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d': { 98 '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d': {
102 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', 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',
103 version: '0.3', 100 version: '0.3',
104 creationDate: 'Fri Oct 17 16:49:20 CEST 2008', 101 creationDate: 'Fri Oct 17 16:49:20 CEST 2008',
105 updateDate: 'Mon Oct 27 08:58:49 CET 2008', 102 updateDate: 'Mon Oct 27 08:58:49 CET 2008',
106 accessDate: 'Mon Jan 19 16:09:39 CET 2009', 103 accessDate: 'Mon Jan 19 16:09:39 CET 2009',
107 currentVersion: '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac', 104 currentVersion: '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac',
108 versions: { 105 versions: {
109 '0ae362285f103722abbd046eee2b7d10aeae6a1d05cbaf2081392ce9df882bcf': { 106 '0ae362285f103722abbd046eee2b7d10aeae6a1d05cbaf2081392ce9df882bcf': {
110 header: '####', 107 header: '####',
111 data: 'sG6TUmPSEPFpiJ5YdtghWHmHbvUK63tZCZ+Q5iz2ALas//jN+lZCBhZcjEwPEJskBkK2R0MyAh14wWGh2bBHMjsokgTe+L+x+0c/Zi0epE/IC9gtOBhsTe/hZ2e2xOGF/SbzET3DAAYXvxduZ36f7SvvFnrkkKvpj8wGSdTFcBmzqMb9DL2bRyRCLGLMzE3F1a0q5CufCIRz2TgHm+Uw+kfvvwC7ig/F/5iLW90Ypz3vmEtMEFYFHZ9a8Oh0rsXGfevbMhFqALoywzihQEe/NiB8dwn7GEdYKSQ35rhvZh29ULWOZinqmg0ONe0HYaxx7DbKsVoue57S0CIUlgHLajzHfLfqQg2sFI0OT8TnHsGg0YZ6mM2EdKmEjJiER0cP', 108 data: 'sG6TUmPSEPFpiJ5YdtghWHmHbvUK63tZCZ+Q5iz2ALas//jN+lZCBhZcjEwPEJskBkK2R0MyAh14wWGh2bBHMjsokgTe+L+x+0c/Zi0epE/IC9gtOBhsTe/hZ2e2xOGF/SbzET3DAAYXvxduZ36f7SvvFnrkkKvpj8wGSdTFcBmzqMb9DL2bRyRCLGLMzE3F1a0q5CufCIRz2TgHm+Uw+kfvvwC7ig/F/5iLW90Ypz3vmEtMEFYFHZ9a8Oh0rsXGfevbMhFqALoywzihQEe/NiB8dwn7GEdYKSQ35rhvZh29ULWOZinqmg0ONe0HYaxx7DbKsVoue57S0CIUlgHLajzHfLfqQg2sFI0OT8TnHsGg0YZ6mM2EdKmEjJiER0cP',
112 version: '0.3', 109 version: '0.3',
113 creationDate: 'Fri Oct 17 17:00:31 CEST 2008', 110 creationDate: 'Fri Oct 17 17:00:31 CEST 2008',
114 updateDate: 'Fri Oct 17 17:00:31 CEST 2008', 111 updateDate: 'Fri Oct 17 17:00:31 CEST 2008',
115 accessDate: 'Fri Oct 17 17:00:31 CEST 2008' 112 accessDate: 'Fri Oct 17 17:00:31 CEST 2008'
116 }, 113 },
117 '10f45664bbd979a92f37886f1ecc6e52e49798b16dc997aecd37259ad9b2090e': { 114 '10f45664bbd979a92f37886f1ecc6e52e49798b16dc997aecd37259ad9b2090e': {
118 header: '####', 115 header: '####',
119 data: 'RdKVaV/WWWchrCse3KtcXd47Bfm6IAwjqVUpaxoed3HeunI42AAm7xYYSjeK8edHpbNRJbhobBAX5OZtWIp/HmgkobKM8CIiWxrWz89FqyrbnPD7+fXdtgF2yTax/0sC1l0ibncdOuJKX6U829oPlXCpXIOjlomc4wEEAD/5V6FbORvdZ9IE/ME3LsG2y02cT2tIpx6+R6wC/PKXhZA2UDsTE6R2Op2BtIzpVORZLXsdyAp/4wvWQxq90i9cEpbsVQsMB10JVyNHNsRTFhIlHi9MVCaMxQvcrwRElMj/Y9x3RbsFzSGKqFLqdg7Fn/U+KYkpYtsgHv9hraPIb9lV5FH16+iItU/HBM6FGezIj1ZkoQ+dgjPfSjTZzgzDYwyb', 116 data: 'RdKVaV/WWWchrCse3KtcXd47Bfm6IAwjqVUpaxoed3HeunI42AAm7xYYSjeK8edHpbNRJbhobBAX5OZtWIp/HmgkobKM8CIiWxrWz89FqyrbnPD7+fXdtgF2yTax/0sC1l0ibncdOuJKX6U829oPlXCpXIOjlomc4wEEAD/5V6FbORvdZ9IE/ME3LsG2y02cT2tIpx6+R6wC/PKXhZA2UDsTE6R2Op2BtIzpVORZLXsdyAp/4wvWQxq90i9cEpbsVQsMB10JVyNHNsRTFhIlHi9MVCaMxQvcrwRElMj/Y9x3RbsFzSGKqFLqdg7Fn/U+KYkpYtsgHv9hraPIb9lV5FH16+iItU/HBM6FGezIj1ZkoQ+dgjPfSjTZzgzDYwyb',
120 version: '0.3', 117 version: '0.3',
121 creationDate: 'Fri Oct 17 16:49:20 CEST 2008', 118 creationDate: 'Fri Oct 17 16:49:20 CEST 2008',
122 updateDate: 'Fri Oct 17 16:49:20 CEST 2008', 119 updateDate: 'Fri Oct 17 16:49:20 CEST 2008',
123 accessDate: 'Fri Oct 17 16:54:23 CEST 2008' 120 accessDate: 'Fri Oct 17 16:54:23 CEST 2008'
124 }, 121 },
125 '2fa7b67e569d5e268d2b70b3d4d3a960d7e437e1937bcb324b67d0b9441db8ba': { 122 '2fa7b67e569d5e268d2b70b3d4d3a960d7e437e1937bcb324b67d0b9441db8ba': {
126 header: '####', 123 header: '####',
127 data: 'dpnI2qKjk0+bfyKktw4ZCWf+rWZ12hO5bda39CwD29JH7KtdpLCLe2LoLd+KKF2wOdpDsoI2iTiwRgFpt77e7DoWJABxq/0aaRCVN9XpqZo08iHiYhJyNlIszO8CdEhX+M3AeZqzTnd6fs91VfIEWggvku2Z+jwr0CbclY6FnOcNnS+1fj+W79Z9XC383GOm2ujjfo3SX/fyNQSw8aX+7AgJIRGR9uHK7M1cVfsNNTbmDb/HDgLlYZ1Pqm/9poHpmS7G4HUoRM2/WjI0R6F48dy5s8vZRi11SCnlnj5oRykScJj6wh2DltbCyesiaTpAjP6MQjTXsZzKpaosaQcQClZw+w6hDD2cA54IaBIv2j5KAHyhxDh2ERdwbdnCsDKPz4+zP+fmKfW295d4OY0l1NCSdcY+75HWTmBWRAooZeDTo7AE8m5sRwxewE0Y8J2MLUYsrs7Rl4kbZCiRRHU7cs+us3fq2DVn2OLGEbkRrK3kA9swT9W8ABqINoA79+DmDaIr6TGxe5AlHkCAl5sYAN4g42UX1NKhl4fWI1Scj9O1Ixds/1UUvqzavld0mE2cR9yt6LntjE5sQSAaexvymAJbU5IIM5NTk7NlY7G3PEvAPjcUsL9SGw==', 124 data: 'dpnI2qKjk0+bfyKktw4ZCWf+rWZ12hO5bda39CwD29JH7KtdpLCLe2LoLd+KKF2wOdpDsoI2iTiwRgFpt77e7DoWJABxq/0aaRCVN9XpqZo08iHiYhJyNlIszO8CdEhX+M3AeZqzTnd6fs91VfIEWggvku2Z+jwr0CbclY6FnOcNnS+1fj+W79Z9XC383GOm2ujjfo3SX/fyNQSw8aX+7AgJIRGR9uHK7M1cVfsNNTbmDb/HDgLlYZ1Pqm/9poHpmS7G4HUoRM2/WjI0R6F48dy5s8vZRi11SCnlnj5oRykScJj6wh2DltbCyesiaTpAjP6MQjTXsZzKpaosaQcQClZw+w6hDD2cA54IaBIv2j5KAHyhxDh2ERdwbdnCsDKPz4+zP+fmKfW295d4OY0l1NCSdcY+75HWTmBWRAooZeDTo7AE8m5sRwxewE0Y8J2MLUYsrs7Rl4kbZCiRRHU7cs+us3fq2DVn2OLGEbkRrK3kA9swT9W8ABqINoA79+DmDaIr6TGxe5AlHkCAl5sYAN4g42UX1NKhl4fWI1Scj9O1Ixds/1UUvqzavld0mE2cR9yt6LntjE5sQSAaexvymAJbU5IIM5NTk7NlY7G3PEvAPjcUsL9SGw==',
128 version: '0.3', 125 version: '0.3',
129 creationDate: 'Fri Oct 17 17:00:13 CEST 2008', 126 creationDate: 'Fri Oct 17 17:00:13 CEST 2008',
130 updateDate: 'Fri Oct 17 17:00:13 CEST 2008', 127 updateDate: 'Fri Oct 17 17:00:13 CEST 2008',
131 accessDate: 'Fri Oct 17 17:00:13 CEST 2008' 128 accessDate: 'Fri Oct 17 17:00:13 CEST 2008'
132 }, 129 },
133 '5a17723c34226d8cd663f91b11bfa14979e694e461818113ec8abf7194b46b6b': { 130 '5a17723c34226d8cd663f91b11bfa14979e694e461818113ec8abf7194b46b6b': {
134 header: '####', 131 header: '####',
135 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==', 132 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==',
136 version: '0.3', 133 version: '0.3',
137 creationDate: 'Fri Oct 17 16:59:31 CEST 2008', 134 creationDate: 'Fri Oct 17 16:59:31 CEST 2008',
138 updateDate: 'Fri Oct 17 16:59:31 CEST 2008', 135 updateDate: 'Fri Oct 17 16:59:31 CEST 2008',
139 accessDate: 'Fri Oct 17 16:59:31 CEST 2008' 136 accessDate: 'Fri Oct 17 16:59:31 CEST 2008'
140 }, 137 },
141 '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac': { 138 '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac': {
142 header: '####', 139 header: '####',
143 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==', 140 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==',
144 version: '0.3', 141 version: '0.3',
145 creationDate: 'Mon Oct 27 08:58:49 CET 2008', 142 creationDate: 'Mon Oct 27 08:58:49 CET 2008',
146 updateDate: 'Mon Oct 27 08:58:49 CET 2008', 143 updateDate: 'Mon Oct 27 08:58:49 CET 2008',
147 accessDate: 'Mon Jan 19 16:09:39 CET 2009' 144 accessDate: 'Mon Jan 19 16:09:39 CET 2009'
148 }, 145 },
149 'b57a2d2ffafa8029123362071c09709bb9192f06a17140440f0e41d22143148f': { 146 'b57a2d2ffafa8029123362071c09709bb9192f06a17140440f0e41d22143148f': {
150 header: '####', 147 header: '####',
151 data: 'PQ53T2Vo2D8PoLI1qNX//jLaVZFTDTYk6geT9+4RoThTxvlJ+beDPnQzgYhd9iASaF9GQEEL8JxsBnNpEPa6JPOY4ndFLmDLyFDKXMprxq1UIbzFV6kFoYAk3uCCCa3UCDzdr1KXB2CiiF9HrilaA+xkm8krAvH8I5kZD+j23gByz5cAFvXg7A77KEURpjujURL65DW5M+ceIjo6OXaPW9VO03xhqGt/M47ayObpoEGJZn+X9C8s0SE5wOXHbn38YZlRI480OMvtDAxbEYUeQKMmzu6lO4Nw5hhOUjoPSLr/i3tmDx3nPcDwnSafx6jyA4y31eW6yazqTEOP5I5ArC5mUrF7mAAiFvbHIsMoF8PLj6MONlRIOZgbf9HzCpFdt8xBrX/TXp3LaSAj2XTWgSTFI2cgmU3qqPyibvIfUsB5cVHQCXi692JpC+B85axJ0FLyMl5w3vq0txlPkf6q+dadPYDaLHGZEmDjkWScA1GM5xPJHWFwqGE7ejgXKG0sMYsMKWYk+F2LEUmMHtEvSlpgJBntvcQ1ZjYQxeu4hg5txu1ykkif6fXgkXF6wn6qu+5caeJeNhWtAB4q7WVD47111woYMdkmX7AnDTXSAQ==', 148 data: 'PQ53T2Vo2D8PoLI1qNX//jLaVZFTDTYk6geT9+4RoThTxvlJ+beDPnQzgYhd9iASaF9GQEEL8JxsBnNpEPa6JPOY4ndFLmDLyFDKXMprxq1UIbzFV6kFoYAk3uCCCa3UCDzdr1KXB2CiiF9HrilaA+xkm8krAvH8I5kZD+j23gByz5cAFvXg7A77KEURpjujURL65DW5M+ceIjo6OXaPW9VO03xhqGt/M47ayObpoEGJZn+X9C8s0SE5wOXHbn38YZlRI480OMvtDAxbEYUeQKMmzu6lO4Nw5hhOUjoPSLr/i3tmDx3nPcDwnSafx6jyA4y31eW6yazqTEOP5I5ArC5mUrF7mAAiFvbHIsMoF8PLj6MONlRIOZgbf9HzCpFdt8xBrX/TXp3LaSAj2XTWgSTFI2cgmU3qqPyibvIfUsB5cVHQCXi692JpC+B85axJ0FLyMl5w3vq0txlPkf6q+dadPYDaLHGZEmDjkWScA1GM5xPJHWFwqGE7ejgXKG0sMYsMKWYk+F2LEUmMHtEvSlpgJBntvcQ1ZjYQxeu4hg5txu1ykkif6fXgkXF6wn6qu+5caeJeNhWtAB4q7WVD47111woYMdkmX7AnDTXSAQ==',
152 version: '0.3', 149 version: '0.3',
153 creationDate: 'Fri Oct 17 16:57:17 CEST 2008', 150 creationDate: 'Fri Oct 17 16:57:17 CEST 2008',
154 updateDate: 'Fri Oct 17 16:57:17 CEST 2008', 151 updateDate: 'Fri Oct 17 16:57:17 CEST 2008',
155 accessDate: 'Fri Oct 17 16:57:17 CEST 2008' 152 accessDate: 'Fri Oct 17 16:57:17 CEST 2008'
156 }, 153 },
157 'b713e0a1e2664ac7bfa7ba887329ea023204d10298973e322983b82b222debf6': { 154 'b713e0a1e2664ac7bfa7ba887329ea023204d10298973e322983b82b222debf6': {
158 header: '####', 155 header: '####',
159 data: 'H3gIieYrH7Oy8LEWCZpl9vGp9qYdHNCoBNGijYqlcfXt+1JYvPj1abPp12xLNrDUHfaOZklU2Ip4tOf0CDNhgAan7LYyPqFoy9ss2f9/5RLcbjwiIwSduySIL322HTAwqlzlBt/qaJdHHPUrczmu0fb7fT+0dO4gCL/e/IjcHLefUUgNPAbpHG0Nv0+4lNwKZkIQM3tLRtfJyFBIgWKcMcP1XMic33kr24rwybR8Pb0CHZrOOvvUiGqyoED3ZTZf1twUDVNXO7MWCAC5dBc6/Mk/vSmbbGhppXAH02N0g8G5qzZfp3UVikls55VNhRYLHByVsgpkbIrKXyZnBPTwzm7qefpYAXDOgO+164L66/Art2FYGqZQRZLuh5r8oF38', 156 data: 'H3gIieYrH7Oy8LEWCZpl9vGp9qYdHNCoBNGijYqlcfXt+1JYvPj1abPp12xLNrDUHfaOZklU2Ip4tOf0CDNhgAan7LYyPqFoy9ss2f9/5RLcbjwiIwSduySIL322HTAwqlzlBt/qaJdHHPUrczmu0fb7fT+0dO4gCL/e/IjcHLefUUgNPAbpHG0Nv0+4lNwKZkIQM3tLRtfJyFBIgWKcMcP1XMic33kr24rwybR8Pb0CHZrOOvvUiGqyoED3ZTZf1twUDVNXO7MWCAC5dBc6/Mk/vSmbbGhppXAH02N0g8G5qzZfp3UVikls55VNhRYLHByVsgpkbIrKXyZnBPTwzm7qefpYAXDOgO+164L66/Art2FYGqZQRZLuh5r8oF38',
160 version: '0.3', 157 version: '0.3',
161 creationDate: 'Fri Oct 17 16:58:00 CEST 2008', 158 creationDate: 'Fri Oct 17 16:58:00 CEST 2008',
162 updateDate: 'Fri Oct 17 16:58:00 CEST 2008', 159 updateDate: 'Fri Oct 17 16:58:00 CEST 2008',
163 accessDate: 'Fri Oct 17 16:58:00 CEST 2008' 160 accessDate: 'Fri Oct 17 16:58:00 CEST 2008'
164 }, 161 },
165 'c4cea1cd88a86b05f48a99896a37967c3456228283a0406331ca9f67c6f29f97': { 162 'c4cea1cd88a86b05f48a99896a37967c3456228283a0406331ca9f67c6f29f97': {
166 header: '####', 163 header: '####',
167 data: '1znWPwc9JwCe7iOFiUd2iGm4xJd+824B4VRqEtzCQkW46tg25RWfo7XagvK46USB7t6pC8WMLU0M/EC47KucsfpWUqHGbseoXT/8g8E8GoLnIsk9qFyJG7LGd1sUvqBgszLZwjWWG3t9zifmpW5nY9GialBYNmeSLS3bg5xDH+eCEilUUfDe7zGuVSuu/XkHacv/DYUst97e+6u44F7H8Kv8dTywJZpqbmveNPeWfCej2aBXdVV616J5lIRaj2uIYuQYG7blYJh9KZ7yLStdPndl6h65hIJpfWo0PM8nLJuo0lWNHz7misrutnmxJEjkwVIZ5YAmqp1Zz3VC8zw4IxkXrC/sPmp4PaNXgKz9ZJRaY2KV69WmHf7BUQ3QneGngbT0tN526SS5qDFwTGiuIlnYGWvTB2jVrbns68n/d8Fps8sSWfJBvvXJUEkaZB+1WqNilOPGXvyJ5k2O/iucFbRlxwlEHDny+AgsbtXZdp8cHQ4C/O4G0mnUMZuS38gn6e2kQ55mUhxKeORM+J6Rx1y4Iiu9KKNbxyS5eBpAlFB4xS/o35CS4g309vyOEhi37F24bpp4pM0xEPG4mcc/IyChHzaHUGEp1IX1ZO/r3ut9RIN2QWrGLUlZV/9rFKpLLAy6BkY/g8VYNrV8PztOL3rqy/qwqNZouONwPw8w8SA=', 164 data: '1znWPwc9JwCe7iOFiUd2iGm4xJd+824B4VRqEtzCQkW46tg25RWfo7XagvK46USB7t6pC8WMLU0M/EC47KucsfpWUqHGbseoXT/8g8E8GoLnIsk9qFyJG7LGd1sUvqBgszLZwjWWG3t9zifmpW5nY9GialBYNmeSLS3bg5xDH+eCEilUUfDe7zGuVSuu/XkHacv/DYUst97e+6u44F7H8Kv8dTywJZpqbmveNPeWfCej2aBXdVV616J5lIRaj2uIYuQYG7blYJh9KZ7yLStdPndl6h65hIJpfWo0PM8nLJuo0lWNHz7misrutnmxJEjkwVIZ5YAmqp1Zz3VC8zw4IxkXrC/sPmp4PaNXgKz9ZJRaY2KV69WmHf7BUQ3QneGngbT0tN526SS5qDFwTGiuIlnYGWvTB2jVrbns68n/d8Fps8sSWfJBvvXJUEkaZB+1WqNilOPGXvyJ5k2O/iucFbRlxwlEHDny+AgsbtXZdp8cHQ4C/O4G0mnUMZuS38gn6e2kQ55mUhxKeORM+J6Rx1y4Iiu9KKNbxyS5eBpAlFB4xS/o35CS4g309vyOEhi37F24bpp4pM0xEPG4mcc/IyChHzaHUGEp1IX1ZO/r3ut9RIN2QWrGLUlZV/9rFKpLLAy6BkY/g8VYNrV8PztOL3rqy/qwqNZouONwPw8w8SA=',
168 version: '0.3', 165 version: '0.3',
169 creationDate: 'Fri Oct 17 17:01:59 CEST 2008', 166 creationDate: 'Fri Oct 17 17:01:59 CEST 2008',
170 updateDate: 'Fri Oct 17 17:01:59 CEST 2008', 167 updateDate: 'Fri Oct 17 17:01:59 CEST 2008',
171 accessDate: 'Mon Oct 27 08:57:58 CET 2008' 168 accessDate: 'Mon Oct 27 08:57:58 CET 2008'
172 } 169 }
173 } 170 }
174 }, 171 },
175 '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551': { 172 '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551': {
176 data: '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', 173 data: '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',
177 version: '0.2', 174 version: '0.2',
178 creationDate: 'Wed Mar 14 14:53:11 CET 2007', 175 creationDate: 'Wed Mar 14 14:53:11 CET 2007',
179 updateDate: 'Tue Apr 17 19:17:52 CEST 2007', 176 updateDate: 'Tue Apr 17 19:17:52 CEST 2007',
180 accessDate: 'Mon Jan 19 16:09:25 CET 2009', 177 accessDate: 'Mon Jan 19 16:09:25 CET 2009',
181 currentVersion: '88943d709c3ea2442d4f58eaaec6409276037e5a37e0a6d167b9dad9e947e854', 178 currentVersion: '88943d709c3ea2442d4f58eaaec6409276037e5a37e0a6d167b9dad9e947e854',
182 versions: { 179 versions: {
183 '106a1116d22c2395906a346da4d830c7afbd2da9a46210d0b7a11de238016783': { 180 '106a1116d22c2395906a346da4d830c7afbd2da9a46210d0b7a11de238016783': {
184 header: '####', 181 header: '####',
185 data: 'jgDUvByveAFnchBQKhiHGYDNDtj/7Aja2RePMer0FCOkkEu5GRAiLkxA3/DD3eiU+g+mCxnjnOaEIYL1O5o0+JP08XapsblZHTRKfveeFfs6sWwuqEHGYULBaXx4XSfK2B12HgpBwa5aD49489AkuyXi7t/aAXcKKJcLB1sC61DI3NsmajUaXHBi31Sp7nKAUpMuiWyguW0JVfH6KUPqyldVDBTBqHAis37c1qoR6aFHFfGgAfb35+syfmPRgemujMRkj2XO6dbt9zAYlHVSYFp9393rwPZoyBfXMMdDtSTmq7H9qbmx31GecHZlFN3NymtPPDYUbQ9mpPVRbxE9NjtiPrI5eGFvb++OdOx75PKjYjCAPWWFZ+4aryNn+h+yqab7pAuoG03ACVVrAFIOn09g1ssol/vqvalulEf3hAIviedyiNAC9D0UDHtzUwyIiELvR9qouXLZ', 182 data: 'jgDUvByveAFnchBQKhiHGYDNDtj/7Aja2RePMer0FCOkkEu5GRAiLkxA3/DD3eiU+g+mCxnjnOaEIYL1O5o0+JP08XapsblZHTRKfveeFfs6sWwuqEHGYULBaXx4XSfK2B12HgpBwa5aD49489AkuyXi7t/aAXcKKJcLB1sC61DI3NsmajUaXHBi31Sp7nKAUpMuiWyguW0JVfH6KUPqyldVDBTBqHAis37c1qoR6aFHFfGgAfb35+syfmPRgemujMRkj2XO6dbt9zAYlHVSYFp9393rwPZoyBfXMMdDtSTmq7H9qbmx31GecHZlFN3NymtPPDYUbQ9mpPVRbxE9NjtiPrI5eGFvb++OdOx75PKjYjCAPWWFZ+4aryNn+h+yqab7pAuoG03ACVVrAFIOn09g1ssol/vqvalulEf3hAIviedyiNAC9D0UDHtzUwyIiELvR9qouXLZ',
186 version: '0.2', 183 version: '0.2',
187 creationDate: 'Tue Apr 17 19:13:41 CEST 2007', 184 creationDate: 'Tue Apr 17 19:13:41 CEST 2007',
188 updateDate: 'Tue Apr 17 19:13:41 CEST 2007', 185 updateDate: 'Tue Apr 17 19:13:41 CEST 2007',
189 accessDate: 'Tue Apr 17 19:13:41 CEST 2007' 186 accessDate: 'Tue Apr 17 19:13:41 CEST 2007'
190 }, 187 },
191 '111a8a4b6b912b808a93cf5e8785ca223112628d05f0bfc5dfe1eb40cb72ed8a': { 188 '111a8a4b6b912b808a93cf5e8785ca223112628d05f0bfc5dfe1eb40cb72ed8a': {
192 header: '####', 189 header: '####',
193 data: 't524etHmXljCnLC+IM+WPD8Q5VE7wDsSHVNZzFU4hQzk119t/N/vhtfHYz5HgNstU5T8c7h7RHKvFk5f+4ZwgNgDqSH7H2PrH+7/bV8+uuqbe+/3GYOvELjTF7v3xMyYs1B7ruHpT+291HVNZqxajqCl/+9nbG0e5feqNsTXWUTdLzF0szJuCTNr2I+fhxAO0LRVaf8h+MBPYyuBDnfFDuKm899IsgF9YoYRvjaYO69DkElvf4VP2jrXIJsRnGIUfUaIS/wQ54+X4JBZM/9M09MVOw1SVe+cwG+P3xyPUkqnSb77ECo86C0MktzeYFmPnPv2SM2KFA6slctXsyudoaNlReh1k+6no5J5BjaawTfqYjYrAtWSPsuhxYVsZym/X2CVbkz4rMSn+J5Uio9N5uZ6AqgCKdhAJlwzVb3fIIJwvFpVpy/0LMskb7aG2i4eAxwzx1H6rD3Y', 190 data: 't524etHmXljCnLC+IM+WPD8Q5VE7wDsSHVNZzFU4hQzk119t/N/vhtfHYz5HgNstU5T8c7h7RHKvFk5f+4ZwgNgDqSH7H2PrH+7/bV8+uuqbe+/3GYOvELjTF7v3xMyYs1B7ruHpT+291HVNZqxajqCl/+9nbG0e5feqNsTXWUTdLzF0szJuCTNr2I+fhxAO0LRVaf8h+MBPYyuBDnfFDuKm899IsgF9YoYRvjaYO69DkElvf4VP2jrXIJsRnGIUfUaIS/wQ54+X4JBZM/9M09MVOw1SVe+cwG+P3xyPUkqnSb77ECo86C0MktzeYFmPnPv2SM2KFA6slctXsyudoaNlReh1k+6no5J5BjaawTfqYjYrAtWSPsuhxYVsZym/X2CVbkz4rMSn+J5Uio9N5uZ6AqgCKdhAJlwzVb3fIIJwvFpVpy/0LMskb7aG2i4eAxwzx1H6rD3Y',
194 version: '0.2', 191 version: '0.2',
195 creationDate: 'Wed Mar 14 14:53:11 CET 2007', 192 creationDate: 'Wed Mar 14 14:53:11 CET 2007',
196 updateDate: 'Wed Mar 14 14:53:11 CET 2007', 193 updateDate: 'Wed Mar 14 14:53:11 CET 2007',
197 accessDate: 'Wed Mar 14 15:24:35 CET 2007' 194 accessDate: 'Wed Mar 14 15:24:35 CET 2007'
198 }, 195 },
199 '144d6eff3eb5f1cb70c8906741d88018cdeeae3a618ac4066598ad6b04242364': { 196 '144d6eff3eb5f1cb70c8906741d88018cdeeae3a618ac4066598ad6b04242364': {
200 header: '####', 197 header: '####',
201 data: 'NPgSZF0eSOzy0/Ns+15Nz4bjSwh4o7fWYgKgwXLRFrF8y3EdbiOH7AiEmmPrCpT1raeYLWCcDIrRTz+/9uvIrz6kK6BjU2emr8YdyLai+PTCRY0SafWS3QiYixX6DJiKIt0SC2F6dfmSHwNsbfTHilFhVXn6wXTJpWvC+sRzw+h42cYpQp0BoLSuFV7vPz/+wtuQdl28BiBgLzGsrtPud0tPcfldGox6Ia/1SrOPcqUr0tnFlNQiUvPU7N0JZgRNyr1PfpAEhmYRI7aEJidsZ36vGQpE0ZQMmQE/9tLS/InALRZT1YXfMsytf0o3y4QlgJrvRgBL7fGiQOZJpU7igLk15xAwU+OLIaYIbr2xlKDJvndHOcrFoYKry9/A/aZSnEYv79wsaf64bBgIVD2WJGLuSFFmzlFnbg/O4kGTin3A8XBpvFA9V6iCMvnEMkrqxD3Qgf7WhxFE1A==', 198 data: 'NPgSZF0eSOzy0/Ns+15Nz4bjSwh4o7fWYgKgwXLRFrF8y3EdbiOH7AiEmmPrCpT1raeYLWCcDIrRTz+/9uvIrz6kK6BjU2emr8YdyLai+PTCRY0SafWS3QiYixX6DJiKIt0SC2F6dfmSHwNsbfTHilFhVXn6wXTJpWvC+sRzw+h42cYpQp0BoLSuFV7vPz/+wtuQdl28BiBgLzGsrtPud0tPcfldGox6Ia/1SrOPcqUr0tnFlNQiUvPU7N0JZgRNyr1PfpAEhmYRI7aEJidsZ36vGQpE0ZQMmQE/9tLS/InALRZT1YXfMsytf0o3y4QlgJrvRgBL7fGiQOZJpU7igLk15xAwU+OLIaYIbr2xlKDJvndHOcrFoYKry9/A/aZSnEYv79wsaf64bBgIVD2WJGLuSFFmzlFnbg/O4kGTin3A8XBpvFA9V6iCMvnEMkrqxD3Qgf7WhxFE1A==',
202 version: '0.2', 199 version: '0.2',
203 creationDate: 'Wed Mar 14 15:33:00 CET 2007', 200 creationDate: 'Wed Mar 14 15:33:00 CET 2007',
204 updateDate: 'Wed Mar 14 15:33:00 CET 2007', 201 updateDate: 'Wed Mar 14 15:33:00 CET 2007',
205 accessDate: 'Tue Apr 17 19:12:56 CEST 2007' 202 accessDate: 'Tue Apr 17 19:12:56 CEST 2007'
206 }, 203 },
207 '1f1bdb7a21440ac20c6d913d676aa30dc360252d27059e77df51a1be36b2e263': { 204 '1f1bdb7a21440ac20c6d913d676aa30dc360252d27059e77df51a1be36b2e263': {
208 header: '####', 205 header: '####',
209 data: 'TaOHH6IoHPKLLoyLyvsBszgsPPcDs6CiLVXzXuXjFSTrhPxzUw9suSsisgDRRs0ncjZ6BCyqoCxMnw6QVvGN4viUwYVR8AWdCg0NMQZ+LkNfq/2WN0M3KyASI8sIdMCwTb57NzOn9soB1HmmmETZfjr7HpY2cc+lS5/4f5rxI8XTEK60lLed+aEuJamAjeZUdgIyu30mMKKjxPfY3Y9iWMwn1OD0zF0mAW+hyEoMhhK7EYlWKCy+4qN0QM+yNFXQyERb04o2n4XrM+qr9df1GtbQMH8igK5VzXIrKjdHjKoLo9G7D7mfx6mRLsmoAJuE0R8gyzotgdBpOgWasHJ82iWEa1dLRKBHJ1d0Lnumv22tvYfasx2DIR5Tmx3kIQ3hFieLSXq48cYMiaZH/IbLiapIOlMgtWDow8JuySBLei/8FAV8jCxSc1Ui/SjbuK/kCvywaSOhDVIxGw==', 206 data: 'TaOHH6IoHPKLLoyLyvsBszgsPPcDs6CiLVXzXuXjFSTrhPxzUw9suSsisgDRRs0ncjZ6BCyqoCxMnw6QVvGN4viUwYVR8AWdCg0NMQZ+LkNfq/2WN0M3KyASI8sIdMCwTb57NzOn9soB1HmmmETZfjr7HpY2cc+lS5/4f5rxI8XTEK60lLed+aEuJamAjeZUdgIyu30mMKKjxPfY3Y9iWMwn1OD0zF0mAW+hyEoMhhK7EYlWKCy+4qN0QM+yNFXQyERb04o2n4XrM+qr9df1GtbQMH8igK5VzXIrKjdHjKoLo9G7D7mfx6mRLsmoAJuE0R8gyzotgdBpOgWasHJ82iWEa1dLRKBHJ1d0Lnumv22tvYfasx2DIR5Tmx3kIQ3hFieLSXq48cYMiaZH/IbLiapIOlMgtWDow8JuySBLei/8FAV8jCxSc1Ui/SjbuK/kCvywaSOhDVIxGw==',
210 version: '0.2', 207 version: '0.2',
211 creationDate: 'Wed Mar 14 15:26:35 CET 2007', 208 creationDate: 'Wed Mar 14 15:26:35 CET 2007',
212 updateDate: 'Wed Mar 14 15:26:35 CET 2007', 209 updateDate: 'Wed Mar 14 15:26:35 CET 2007',
213 accessDate: 'Wed Mar 14 15:26:35 CET 2007' 210 accessDate: 'Wed Mar 14 15:26:35 CET 2007'
214 }, 211 },
215 '70720f026f37b571e9765d27c51d3d60c7be0293c3266f1f987c8de9c6b5c416': { 212 '70720f026f37b571e9765d27c51d3d60c7be0293c3266f1f987c8de9c6b5c416': {
216 header: '####', 213 header: '####',
217 data: 'NYaYljcgfzrlN1DVgrbyj4AeVhXGjXPho3IQwEKD3ZOx/yEZxldCNSyFsrk7PoRB8Q1T/6VV4CGa4HLRSB7QVCrtVqWyu4KbbmFoX8NIQ0H3xv+TSo3S/b3dldUeyW32ScaGbspaf8nFf0CffsgpGusd+kHdiE3gSLJvH9y5j47KgpyyX4TteVzqgez4dcXIs5tdzJq2eUlknwU4651QeKIuRSmRaDRhhOP4yRgUo/qXMlTJFmHviCh+IumvBdmDoPe3Vc1vZ1r8PxpDJLvDoB8GTDE42NhqHfVrew9ym1xlTD9wswwIEikfOyTq3JM857qPOHRqSqthEvr4WHbm1VW5PReIyse0lugGyOzqtCnADp9NvNI440VjaTd4NBQqF7XrRm56+1u1uTdfYGFV5BRiH1KmrM1sxXQ6PlOF9Lou45ALo20xxvJOLKG0RKLMr8gmVT2bNtOSJw==', 214 data: 'NYaYljcgfzrlN1DVgrbyj4AeVhXGjXPho3IQwEKD3ZOx/yEZxldCNSyFsrk7PoRB8Q1T/6VV4CGa4HLRSB7QVCrtVqWyu4KbbmFoX8NIQ0H3xv+TSo3S/b3dldUeyW32ScaGbspaf8nFf0CffsgpGusd+kHdiE3gSLJvH9y5j47KgpyyX4TteVzqgez4dcXIs5tdzJq2eUlknwU4651QeKIuRSmRaDRhhOP4yRgUo/qXMlTJFmHviCh+IumvBdmDoPe3Vc1vZ1r8PxpDJLvDoB8GTDE42NhqHfVrew9ym1xlTD9wswwIEikfOyTq3JM857qPOHRqSqthEvr4WHbm1VW5PReIyse0lugGyOzqtCnADp9NvNI440VjaTd4NBQqF7XrRm56+1u1uTdfYGFV5BRiH1KmrM1sxXQ6PlOF9Lou45ALo20xxvJOLKG0RKLMr8gmVT2bNtOSJw==',
218 version: '0.2', 215 version: '0.2',
219 creationDate: 'Wed Mar 14 15:30:09 CET 2007', 216 creationDate: 'Wed Mar 14 15:30:09 CET 2007',
220 updateDate: 'Wed Mar 14 15:30:09 CET 2007', 217 updateDate: 'Wed Mar 14 15:30:09 CET 2007',
221 accessDate: 'Wed Mar 14 15:30:09 CET 2007' 218 accessDate: 'Wed Mar 14 15:30:09 CET 2007'
222 }, 219 },
223 '88943d709c3ea2442d4f58eaaec6409276037e5a37e0a6d167b9dad9e947e854': { 220 '88943d709c3ea2442d4f58eaaec6409276037e5a37e0a6d167b9dad9e947e854': {
224 header: '####', 221 header: '####',
225 data: 'xI3WXddQLFtLVzxJaZWQaw8wAgSuXLjLnyoNXnFuLecTH0BzU36PatglVh2HK3LM8aDLzzbHILdlLNnJ9CY+YnhmGh8hswF9oKTgq0Wsesgdc20QhSMNFFjmMljY1LSXmcAYK04Q5mIzi6Pe/04DRdj+e4zbe5QI4vEBhp/ohEpxZnNqc4BoX6J0eVf6LA1pwrKWvxzMxorWsJrrr+mn3svdlF437n+MMr89k5sQJogufes2GZ9tTvVZ4247ITxXqxgAhwXtbuIs/A5UqqnNdsxlHfpLKG5KjxB6F0h7TtFA3gkZCve5UmAibBnoBCFaIVWQyVq+VO9iqDm3DeXsK2pepvgIvpSID8Poy+uwN7T95mivAsHG5p7MtgN9KwQzNW3Iu+BfO9FlPBMngSk8L29So2CIXe6lEsXSGEi5Yrgyo6hZi6IkGCXwIQ7TCEMnlQEGyKnnAVik', 222 data: 'xI3WXddQLFtLVzxJaZWQaw8wAgSuXLjLnyoNXnFuLecTH0BzU36PatglVh2HK3LM8aDLzzbHILdlLNnJ9CY+YnhmGh8hswF9oKTgq0Wsesgdc20QhSMNFFjmMljY1LSXmcAYK04Q5mIzi6Pe/04DRdj+e4zbe5QI4vEBhp/ohEpxZnNqc4BoX6J0eVf6LA1pwrKWvxzMxorWsJrrr+mn3svdlF437n+MMr89k5sQJogufes2GZ9tTvVZ4247ITxXqxgAhwXtbuIs/A5UqqnNdsxlHfpLKG5KjxB6F0h7TtFA3gkZCve5UmAibBnoBCFaIVWQyVq+VO9iqDm3DeXsK2pepvgIvpSID8Poy+uwN7T95mivAsHG5p7MtgN9KwQzNW3Iu+BfO9FlPBMngSk8L29So2CIXe6lEsXSGEi5Yrgyo6hZi6IkGCXwIQ7TCEMnlQEGyKnnAVik',
226 version: '0.2', 223 version: '0.2',
227 creationDate: 'Tue Apr 17 19:17:52 CEST 2007', 224 creationDate: 'Tue Apr 17 19:17:52 CEST 2007',
228 updateDate: 'Tue Apr 17 19:17:52 CEST 2007', 225 updateDate: 'Tue Apr 17 19:17:52 CEST 2007',
229 accessDate: 'Mon Jan 19 16:09:25 CET 2009' 226 accessDate: 'Mon Jan 19 16:09:25 CET 2009'
230 }, 227 },
231 '9588b523f39cdfc14efa1e15ea7716c2d8eac45d8efd7bfeb19d716f9df72d66': { 228 '9588b523f39cdfc14efa1e15ea7716c2d8eac45d8efd7bfeb19d716f9df72d66': {
232 header: '####', 229 header: '####',
233 data: 'q6DKkxhgDFs1XkqOYf6dvojPF+yhJbniTLFpSOS+I1sum3EZIJfYxJXyi2Jx3KOVNBMILw1+vrSLe/fh5SSWj8ZBoeppkPPLjyRNdiUyd4IfcRM5OSv2YcTxCubKCH2kIMFAzY/29A6ZGPG+AN8/kxkEHc1fxKaNcj2Cs8qejNR8yK1iKT1Ut9VfEee+Eqy2Ohgdq8wL/xAD5mUzdqHeQl8BY16pXGIYncLxMzR+EJ8E5jJTuGv3O41UbO31lvBSfCt2pfz2MrtsuqNoI8LBHJkcR6t17Bj+rHZUniHlyxSW/1rQJ1NnwpPgUJ1fhfQJZM8Faoif+0bvWFY4xWs/tCCD7oEvf0xM0I3FfcJLbYX8M+wyO08t9BmGdEjnr3VUcuS9qKaJRpdpMP7aQf+vJvioeQDXdOJ6Ceo3BDFc6JdNta1Qc+agGzN2KPbIPrLDL+08hWl61yu3GQ==', 230 data: 'q6DKkxhgDFs1XkqOYf6dvojPF+yhJbniTLFpSOS+I1sum3EZIJfYxJXyi2Jx3KOVNBMILw1+vrSLe/fh5SSWj8ZBoeppkPPLjyRNdiUyd4IfcRM5OSv2YcTxCubKCH2kIMFAzY/29A6ZGPG+AN8/kxkEHc1fxKaNcj2Cs8qejNR8yK1iKT1Ut9VfEee+Eqy2Ohgdq8wL/xAD5mUzdqHeQl8BY16pXGIYncLxMzR+EJ8E5jJTuGv3O41UbO31lvBSfCt2pfz2MrtsuqNoI8LBHJkcR6t17Bj+rHZUniHlyxSW/1rQJ1NnwpPgUJ1fhfQJZM8Faoif+0bvWFY4xWs/tCCD7oEvf0xM0I3FfcJLbYX8M+wyO08t9BmGdEjnr3VUcuS9qKaJRpdpMP7aQf+vJvioeQDXdOJ6Ceo3BDFc6JdNta1Qc+agGzN2KPbIPrLDL+08hWl61yu3GQ==',
234 version: '0.2', 231 version: '0.2',
235 creationDate: 'Wed Mar 14 15:27:35 CET 2007', 232 creationDate: 'Wed Mar 14 15:27:35 CET 2007',
236 updateDate: 'Wed Mar 14 15:27:35 CET 2007', 233 updateDate: 'Wed Mar 14 15:27:35 CET 2007',
237 accessDate: 'Wed Mar 14 15:27:35 CET 2007' 234 accessDate: 'Wed Mar 14 15:27:35 CET 2007'
238 }, 235 },
239 'e5b71df0d4d79a195c7ec3288dd7738069837a7c4da3bccc1ebc05d8e4f19d79': { 236 'e5b71df0d4d79a195c7ec3288dd7738069837a7c4da3bccc1ebc05d8e4f19d79': {
240 header: '####', 237 header: '####',
241 data: '1NvK9Y5r0Q880BfB1W5IqdOR77mmqQU0d1GL1XUeQT75R2EgYE9rK1X1jLygCXboPhxzegEe7TDhUsn5XcHN0LkXcLYz8gD/7+He2HiTFxoHd2oQbI3ceBxDJ7+5kWA6Aiqy42QSCuA+TWIQcDVthSyFU7nNdqNxeBYeXiI4jgwcH3xvm0+pBf1OYLtywjUK1JwntP6o68b1LMQJFinDG+sqRcm25ggaZyxDtoLh1IBdSpmXk0papRnyyTGNgsws78dLxnH0Iqxb7FhqYfgLDIvN3i7+IALI0lF0EuTS0hSPlr/1fTz1/6bVt++wI9GpUsrdafUJJMPerXoCK+gAP8EMneLq4f5487HIkwWh1qON6Hvpg+tB95NOSJpqE72VpVxN4+wTQWyDMhfjqXBuQ1wKvTsD/mUsdinU0Wb/YT/zIWBNZPdqur0rjOC+mrOtSdlYSCH89Jj2', 238 data: '1NvK9Y5r0Q880BfB1W5IqdOR77mmqQU0d1GL1XUeQT75R2EgYE9rK1X1jLygCXboPhxzegEe7TDhUsn5XcHN0LkXcLYz8gD/7+He2HiTFxoHd2oQbI3ceBxDJ7+5kWA6Aiqy42QSCuA+TWIQcDVthSyFU7nNdqNxeBYeXiI4jgwcH3xvm0+pBf1OYLtywjUK1JwntP6o68b1LMQJFinDG+sqRcm25ggaZyxDtoLh1IBdSpmXk0papRnyyTGNgsws78dLxnH0Iqxb7FhqYfgLDIvN3i7+IALI0lF0EuTS0hSPlr/1fTz1/6bVt++wI9GpUsrdafUJJMPerXoCK+gAP8EMneLq4f5487HIkwWh1qON6Hvpg+tB95NOSJpqE72VpVxN4+wTQWyDMhfjqXBuQ1wKvTsD/mUsdinU0Wb/YT/zIWBNZPdqur0rjOC+mrOtSdlYSCH89Jj2',
242 version: '0.2', 239 version: '0.2',
243 creationDate: 'Tue Apr 17 19:15:09 CEST 2007', 240 creationDate: 'Tue Apr 17 19:15:09 CEST 2007',
244 updateDate: 'Tue Apr 17 19:15:09 CEST 2007', 241 updateDate: 'Tue Apr 17 19:15:09 CEST 2007',
245 accessDate: 'Tue Apr 17 19:17:01 CEST 2007' 242 accessDate: 'Tue Apr 17 19:17:01 CEST 2007'
246 } 243 }
247 } 244 }
248 }, 245 },
249 '36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113': { 246 '36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113': {
250 data: '6fhueIibbxKRA7Mtb9TPcWiUKajnikM3D7PbOROBkE39Vw9E/nG8KrtJlwwPQeOGCFhssO/KX3ymYehCR8rfaEL1f9pfdh5x69mSxKRlOmtEknWqUgPzcb1yPenRbQagERadh0LF4zu91M4WjXK9qynEHoxI/pBhwQb1IsnhwtXl4ELtajudv+2Hv3p75v4XOXFsGQMsHPY+Zw7dkFFA8EXhvuxjiGvnxCUkFwNICFRdHTEovkW3VSerLdrYo5lDgjY6ebr/g7wDGuu4RLfUK4+HpzFwZ0+aOrjpFq2ePg2xObvkkMNNjZ2PcR6Cue0sf+aNqzIHIlFPpY2Hmrob8+bwxocKA6aagBu7z5GiUmZNXGE/Vtr/WWBV2+xIJyzXZPet0MLmSnGiALjPJveeKnnFdDtA929ydcAb8efc0/snfU/uDoXDiO5SWEQ8DDNjj1bSo7VPTtvZyFormE1KjqimqSwaUJzbIS4CxPnoDezaBtQmlG4z8mc8jXq1HfPu7s9PUzcbG30gbF0ch2pDj4h47AhE0ZoeiV+VYZTaYateSifQXKBQKjPcuh9PQyDI0HVua3itbbwxXpRubEM4fbvlcd+7gu+Zq03slYICD07fP0I6XGrRHVTfYpDbEb4GJBvRIeZLwRTQzOeFbPLpBU9Lv3zXxfHfcHy9oK+giIxefPdY1ZR2ZFPKOO0xYJsTr0vmTuXeXzy56bKl+yP2lFst5l9QG8j2JcQEotDV1KQS6mbcLjfIpEnltu5fc2t10Q25Noh+F3kF+LcMIYsDjwanojYlOC93mZl01hmSJdimRTk9otjlRTyC7NWwiyy7fe5IyVi7ACNPZyeUYJUPtKWcPbT73Vtf8W3/+HdhmyYNyMQ9PDCBb9WKMon+qW2+ZVH5yv/KqMHRY1fflAfxpHNhrCkwqcAAGw+G/cetbvQjpkfVT2/u/uLupMsITN2Tgvr/8D2IMm3cyDBUCshrp0AfzARRygHFK4x/0uLfCtQSNjw6zMK8mn80R5aS5bZi5gRS8JBMZ4Q0iG4kBlLpIYtsXSBwl8faljjdl/4XvNNWWrdGJn2k0eM4cESlOFFk4s3Yu0Zspo17nKAHINjHAiP3VlhuKSnk5C9hMU5i3vZO8anQmx9UEwUgQVm22azCjyNtUl6jVPYSNsal7A==', 247 data: '6fhueIibbxKRA7Mtb9TPcWiUKajnikM3D7PbOROBkE39Vw9E/nG8KrtJlwwPQeOGCFhssO/KX3ymYehCR8rfaEL1f9pfdh5x69mSxKRlOmtEknWqUgPzcb1yPenRbQagERadh0LF4zu91M4WjXK9qynEHoxI/pBhwQb1IsnhwtXl4ELtajudv+2Hv3p75v4XOXFsGQMsHPY+Zw7dkFFA8EXhvuxjiGvnxCUkFwNICFRdHTEovkW3VSerLdrYo5lDgjY6ebr/g7wDGuu4RLfUK4+HpzFwZ0+aOrjpFq2ePg2xObvkkMNNjZ2PcR6Cue0sf+aNqzIHIlFPpY2Hmrob8+bwxocKA6aagBu7z5GiUmZNXGE/Vtr/WWBV2+xIJyzXZPet0MLmSnGiALjPJveeKnnFdDtA929ydcAb8efc0/snfU/uDoXDiO5SWEQ8DDNjj1bSo7VPTtvZyFormE1KjqimqSwaUJzbIS4CxPnoDezaBtQmlG4z8mc8jXq1HfPu7s9PUzcbG30gbF0ch2pDj4h47AhE0ZoeiV+VYZTaYateSifQXKBQKjPcuh9PQyDI0HVua3itbbwxXpRubEM4fbvlcd+7gu+Zq03slYICD07fP0I6XGrRHVTfYpDbEb4GJBvRIeZLwRTQzOeFbPLpBU9Lv3zXxfHfcHy9oK+giIxefPdY1ZR2ZFPKOO0xYJsTr0vmTuXeXzy56bKl+yP2lFst5l9QG8j2JcQEotDV1KQS6mbcLjfIpEnltu5fc2t10Q25Noh+F3kF+LcMIYsDjwanojYlOC93mZl01hmSJdimRTk9otjlRTyC7NWwiyy7fe5IyVi7ACNPZyeUYJUPtKWcPbT73Vtf8W3/+HdhmyYNyMQ9PDCBb9WKMon+qW2+ZVH5yv/KqMHRY1fflAfxpHNhrCkwqcAAGw+G/cetbvQjpkfVT2/u/uLupMsITN2Tgvr/8D2IMm3cyDBUCshrp0AfzARRygHFK4x/0uLfCtQSNjw6zMK8mn80R5aS5bZi5gRS8JBMZ4Q0iG4kBlLpIYtsXSBwl8faljjdl/4XvNNWWrdGJn2k0eM4cESlOFFk4s3Yu0Zspo17nKAHINjHAiP3VlhuKSnk5C9hMU5i3vZO8anQmx9UEwUgQVm22azCjyNtUl6jVPYSNsal7A==',
251 version: '0.3', 248 version: '0.3',
252 creationDate: 'Wed Mar 14 18:39:35 CET 2007', 249 creationDate: 'Wed Mar 14 18:39:35 CET 2007',
253 updateDate: 'Mon Oct 27 09:16:14 CET 2008', 250 updateDate: 'Mon Oct 27 09:16:14 CET 2008',
254 accessDate: 'Mon Jan 19 16:09:35 CET 2009', 251 accessDate: 'Mon Jan 19 16:09:35 CET 2009',
255 currentVersion: 'a96a6d8b9ac73fcdf874d8a8534ffb2d43da8f5222e96a4a29bd2ae437619463', 252 currentVersion: 'a96a6d8b9ac73fcdf874d8a8534ffb2d43da8f5222e96a4a29bd2ae437619463',
256 versions: { 253 versions: {
257 '381201fd3b67549bd6630841e8902be1499f3ff0c3514dd464ad9679f22f3561': { 254 '381201fd3b67549bd6630841e8902be1499f3ff0c3514dd464ad9679f22f3561': {
258 header: '####', 255 header: '####',
259 data: 'DgjIW4YcJAYnckuEUzBFkfEC841LuanGopPgp+YkyMn3xuzdpGq/ObLFMVQaeAuyErh1B0REHPbq0E/SRUZbeXLXWN720GU4GXvY5bnen2h7pHvl/H4yz+kvyKh3EHJmmBjuz8s0kclFJQB48lter+G93TEmUaFke9c9m0IkKlgzwZ/PQKZyIyfZA09KFaozdSxdFRbswZj2Vq8Df2PQsKLapZWX1wYQ3lXOcyvNdTULy9MCXwPwX6te6hTLWxQOiSPsvB8LItlhQUsSbrJcJEvWPlBupPu5SeI25zDnqKDETPep63Ks2GWf45nXZzYYmQMzL0l2cenYFxlE18TcOd1Ms24TQ/iDKMhi60zZoo13qjVT5AKZ80KNu46t08qbACxjv/LeK2aM5TNycTFixGskPywpnb6MCo8ibRe5rs1WcTJRMD04sNoiuriivO2fiyo4rxjfdyfueMlOz+Zeztk=', 256 data: 'DgjIW4YcJAYnckuEUzBFkfEC841LuanGopPgp+YkyMn3xuzdpGq/ObLFMVQaeAuyErh1B0REHPbq0E/SRUZbeXLXWN720GU4GXvY5bnen2h7pHvl/H4yz+kvyKh3EHJmmBjuz8s0kclFJQB48lter+G93TEmUaFke9c9m0IkKlgzwZ/PQKZyIyfZA09KFaozdSxdFRbswZj2Vq8Df2PQsKLapZWX1wYQ3lXOcyvNdTULy9MCXwPwX6te6hTLWxQOiSPsvB8LItlhQUsSbrJcJEvWPlBupPu5SeI25zDnqKDETPep63Ks2GWf45nXZzYYmQMzL0l2cenYFxlE18TcOd1Ms24TQ/iDKMhi60zZoo13qjVT5AKZ80KNu46t08qbACxjv/LeK2aM5TNycTFixGskPywpnb6MCo8ibRe5rs1WcTJRMD04sNoiuriivO2fiyo4rxjfdyfueMlOz+Zeztk=',
260 version: '0.2', 257 version: '0.2',
261 creationDate: 'Wed Mar 14 18:39:55 CET 2007', 258 creationDate: 'Wed Mar 14 18:39:55 CET 2007',
262 updateDate: 'Wed Mar 14 18:39:55 CET 2007', 259 updateDate: 'Wed Mar 14 18:39:55 CET 2007',
263 accessDate: 'Mon Oct 27 09:07:56 CET 2008' 260 accessDate: 'Mon Oct 27 09:07:56 CET 2008'
264 }, 261 },
265 '99dc86ebeb20a3db0c5393d6d94bc1150187b04316a876970dbbcf517b55d6f2': { 262 '99dc86ebeb20a3db0c5393d6d94bc1150187b04316a876970dbbcf517b55d6f2': {
266 header: '####', 263 header: '####',
267 data: 'AJwqCWNKC9z8DC4TUI0hWnqHvQ40Y/x+jXylnVAkyO2QYQcqg51odLFSfgP0GiGEGPYwDc+kUxRrfO+ITgTNm+hHi2iIWkP/ljAC+AQ56MAEKsU/USTbvl6ShZ0XTAdRpwI/oqqOhYThVs6jTm/J8+lx4tWoMtNj835py88c/9eW26pLQubr7VysLSWuIMi+iDp7zXZZz/0gxGKDe5xNq4MGIYw8/OK1iJCOsjBdrRygLlS/Mz9sRlKkwdrDsohtRG0F/NdsIoaU4FttGs/rY91SCedvHy6ovh0zXhxOO44O6MiMbP085D1jCjWJn9S1RBxjxc368MGfMJeZja87nuvgSnLS2tGDL6zFtVJMNcH/7GqQPXZv/sNEykDNWpypchCnwYUJxvBVb45FcUzagPm+SSiekWK1hrEntZkZuEhQZp7Ud9RcENpa5h7wXUJSV1vPl8xBylx9HWmxez7D9OYRqbOlCRAEDqup4ahNhYB9', 264 data: 'AJwqCWNKC9z8DC4TUI0hWnqHvQ40Y/x+jXylnVAkyO2QYQcqg51odLFSfgP0GiGEGPYwDc+kUxRrfO+ITgTNm+hHi2iIWkP/ljAC+AQ56MAEKsU/USTbvl6ShZ0XTAdRpwI/oqqOhYThVs6jTm/J8+lx4tWoMtNj835py88c/9eW26pLQubr7VysLSWuIMi+iDp7zXZZz/0gxGKDe5xNq4MGIYw8/OK1iJCOsjBdrRygLlS/Mz9sRlKkwdrDsohtRG0F/NdsIoaU4FttGs/rY91SCedvHy6ovh0zXhxOO44O6MiMbP085D1jCjWJn9S1RBxjxc368MGfMJeZja87nuvgSnLS2tGDL6zFtVJMNcH/7GqQPXZv/sNEykDNWpypchCnwYUJxvBVb45FcUzagPm+SSiekWK1hrEntZkZuEhQZp7Ud9RcENpa5h7wXUJSV1vPl8xBylx9HWmxez7D9OYRqbOlCRAEDqup4ahNhYB9',
268 version: '0.3', 265 version: '0.3',
269 creationDate: 'Mon Oct 27 09:09:11 CET 2008', 266 creationDate: 'Mon Oct 27 09:09:11 CET 2008',
270 updateDate: 'Mon Oct 27 09:09:11 CET 2008', 267 updateDate: 'Mon Oct 27 09:09:11 CET 2008',
271 accessDate: 'Mon Oct 27 09:15:58 CET 2008' 268 accessDate: 'Mon Oct 27 09:15:58 CET 2008'
272 }, 269 },
273 '9fbfcd3e7fe30d549a813f0e6c1be58ed45c3ae7305d7367bffefa097b424ee6': { 270 '9fbfcd3e7fe30d549a813f0e6c1be58ed45c3ae7305d7367bffefa097b424ee6': {
274 header: '####', 271 header: '####',
275 data: 'nZ+Lc5LWWLxnPvUrRrHhxG35PHq7GMbVENHfV1oS0Qw7/63NecssNoEbiOwFVMjAshvfUK7IjnzyvfQhNtFRbj2yzHOTWCd0eJ0O0MmvGzjpUntSDu9/G8RFeEu9jDKugwi/NhOa5legjT9pcsEAqR4s4NN/Ac6juQb6D/Z6Wd6wO0JQhT5/QPk1KllDpDeo2i/GPUKvEi/dXpik0KQcVLVylU82rf6hwEgvRQi+j0O5hnFW1E4ttxClrnPBEBv60jkNwcIpD0r+rvomDe8+398xUuB4DVDJoM+WUYfu6Sm3qI0yBfET+tJvjn8WsHhKTgZpOc2BXC7EdF99nNEg6kV5pSxV6AUA1XUz5kW+YfcSzAXzUH74OqroC0SucHe4+BtRKnbJy4h5vRfjTD+FJaj1Va02cxSR55tQhxm/k67z0QeyB98dnU1l/pPHwBlIWa1eR74gswNSeQ2jrzu5JeQ=', 272 data: 'nZ+Lc5LWWLxnPvUrRrHhxG35PHq7GMbVENHfV1oS0Qw7/63NecssNoEbiOwFVMjAshvfUK7IjnzyvfQhNtFRbj2yzHOTWCd0eJ0O0MmvGzjpUntSDu9/G8RFeEu9jDKugwi/NhOa5legjT9pcsEAqR4s4NN/Ac6juQb6D/Z6Wd6wO0JQhT5/QPk1KllDpDeo2i/GPUKvEi/dXpik0KQcVLVylU82rf6hwEgvRQi+j0O5hnFW1E4ttxClrnPBEBv60jkNwcIpD0r+rvomDe8+398xUuB4DVDJoM+WUYfu6Sm3qI0yBfET+tJvjn8WsHhKTgZpOc2BXC7EdF99nNEg6kV5pSxV6AUA1XUz5kW+YfcSzAXzUH74OqroC0SucHe4+BtRKnbJy4h5vRfjTD+FJaj1Va02cxSR55tQhxm/k67z0QeyB98dnU1l/pPHwBlIWa1eR74gswNSeQ2jrzu5JeQ=',
276 version: '0.2', 273 version: '0.2',
277 creationDate: 'Wed Mar 14 18:39:35 CET 2007', 274 creationDate: 'Wed Mar 14 18:39:35 CET 2007',
278 updateDate: 'Wed Mar 14 18:39:35 CET 2007', 275 updateDate: 'Wed Mar 14 18:39:35 CET 2007',
279 accessDate: 'Wed Mar 14 18:39:35 CET 2007' 276 accessDate: 'Wed Mar 14 18:39:35 CET 2007'
280 }, 277 },
281 'a96a6d8b9ac73fcdf874d8a8534ffb2d43da8f5222e96a4a29bd2ae437619463': { 278 'a96a6d8b9ac73fcdf874d8a8534ffb2d43da8f5222e96a4a29bd2ae437619463': {
282 header: '####', 279 header: '####',
283 data: 'm3yhZu81UAjCY6U2Knrgg8mK+LX35Y/iZgIEm8MuRDAlg6UUz9Z1Anu63COFV08YyYQRuBzTgR9YQ8wrUD1S9FG2ZmtCDemqvd+5OUMgdn4sK7G3CuzAc5osOa5neU2m4y19WuobkGnhO78ko7pVVjO42q0DeMT92uFL6KE/2UCkWlq5SdFyS5qXEJEWs2IO5C8nVpdlO/eZ36Pl2+v+afl3QQMTthCVIUR4/zVP2ajbO48yjDXhYxzskFjtXMYLApEn0wO0dcifcsYhPkozz6Locrt/R6IZXnfZfuW5XXHbqhutoJFPK6L6t0Ib3B2r1TNkPaMsVs2g5V1g3ENRd0IlbG/uBk2o5tgeu6gOYlA1scEiL+/ad9ZxiqYB2ENCGZ8DXA4VNMnzxVPbO96OIUCb9suV0fldGOg=', 280 data: 'm3yhZu81UAjCY6U2Knrgg8mK+LX35Y/iZgIEm8MuRDAlg6UUz9Z1Anu63COFV08YyYQRuBzTgR9YQ8wrUD1S9FG2ZmtCDemqvd+5OUMgdn4sK7G3CuzAc5osOa5neU2m4y19WuobkGnhO78ko7pVVjO42q0DeMT92uFL6KE/2UCkWlq5SdFyS5qXEJEWs2IO5C8nVpdlO/eZ36Pl2+v+afl3QQMTthCVIUR4/zVP2ajbO48yjDXhYxzskFjtXMYLApEn0wO0dcifcsYhPkozz6Locrt/R6IZXnfZfuW5XXHbqhutoJFPK6L6t0Ib3B2r1TNkPaMsVs2g5V1g3ENRd0IlbG/uBk2o5tgeu6gOYlA1scEiL+/ad9ZxiqYB2ENCGZ8DXA4VNMnzxVPbO96OIUCb9suV0fldGOg=',
284 version: '0.3', 281 version: '0.3',
285 creationDate: 'Mon Oct 27 09:16:14 CET 2008', 282 creationDate: 'Mon Oct 27 09:16:14 CET 2008',
286 updateDate: 'Mon Oct 27 09:16:14 CET 2008', 283 updateDate: 'Mon Oct 27 09:16:14 CET 2008',
287 accessDate: 'Mon Jan 19 16:09:35 CET 2009' 284 accessDate: 'Mon Jan 19 16:09:35 CET 2009'
288 } 285 }
289 } 286 }
290 }, 287 },
291 '507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a': { 288 '507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a': {
292 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', 289 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',
293 version: '0.2', 290 version: '0.2',
294 creationDate: 'Wed Mar 14 16:01:24 CET 2007', 291 creationDate: 'Wed Mar 14 16:01:24 CET 2007',
295 updateDate: 'Wed Mar 14 16:01:24 CET 2007', 292 updateDate: 'Wed Mar 14 16:01:24 CET 2007',
296 accessDate: 'Mon Jan 19 16:10:11 CET 2009', 293 accessDate: 'Mon Jan 19 16:10:11 CET 2009',
297 currentVersion: '395eb58606138588dcd7e659065db48775610cc1e90cbd03368c063e02e55c8b', 294 currentVersion: '395eb58606138588dcd7e659065db48775610cc1e90cbd03368c063e02e55c8b',
298 versions: { 295 versions: {
299 '395eb58606138588dcd7e659065db48775610cc1e90cbd03368c063e02e55c8b': { 296 '395eb58606138588dcd7e659065db48775610cc1e90cbd03368c063e02e55c8b': {
300 header: '####', 297 header: '####',
301 data: 'sgq3FGcsnlbhTLetMa3TQQE6uFZv/JL6Awha1066IimKoAtQGbAr6E1+mxRmvJle91sL7oRfi6suvDanYHfAI+rrG6qCOtESn70ssS+aGFyO3XwFgypzG/Qa34bjxJ16Aqd93H8IdhzdtOxs2Qmou3CjyxbT7Cq+YW/fAo1WfctL4yE4GBNPWC5lfebxSmINlBY+zTjhv9Pf2aK6vL4p3obHl+zhz0YdKAMBwbDyCLa9tYvhGBnq/W6lFUsyZCPVJJP3bQCQww0TNCcLJLm+SYVSiC0NwCQJq+yNqDkWTvv41p5EDB06eOQ2VqC7l4i/JLE/ql9h9Z++gck74/Qs3ppdVdG7sTzWyPya4v3RW2OTc1awFRZipAX5Zd7I97dyw6Yym4y+/9UT8z8iMDYykQ4+QnOhksDIE9a8q6agDF/rbZ/BCRcMWbFylGTdudk26mu0GdPiuLDu', 298 data: 'sgq3FGcsnlbhTLetMa3TQQE6uFZv/JL6Awha1066IimKoAtQGbAr6E1+mxRmvJle91sL7oRfi6suvDanYHfAI+rrG6qCOtESn70ssS+aGFyO3XwFgypzG/Qa34bjxJ16Aqd93H8IdhzdtOxs2Qmou3CjyxbT7Cq+YW/fAo1WfctL4yE4GBNPWC5lfebxSmINlBY+zTjhv9Pf2aK6vL4p3obHl+zhz0YdKAMBwbDyCLa9tYvhGBnq/W6lFUsyZCPVJJP3bQCQww0TNCcLJLm+SYVSiC0NwCQJq+yNqDkWTvv41p5EDB06eOQ2VqC7l4i/JLE/ql9h9Z++gck74/Qs3ppdVdG7sTzWyPya4v3RW2OTc1awFRZipAX5Zd7I97dyw6Yym4y+/9UT8z8iMDYykQ4+QnOhksDIE9a8q6agDF/rbZ/BCRcMWbFylGTdudk26mu0GdPiuLDu',
302 version: '0.2', 299 version: '0.2',
303 creationDate: 'Wed Mar 14 16:01:24 CET 2007', 300 creationDate: 'Wed Mar 14 16:01:24 CET 2007',
304 updateDate: 'Wed Mar 14 16:01:24 CET 2007', 301 updateDate: 'Wed Mar 14 16:01:24 CET 2007',
305 accessDate: 'Mon Jan 19 16:10:11 CET 2009' 302 accessDate: 'Mon Jan 19 16:10:11 CET 2009'
306 } 303 }
307 } 304 }
308 }, 305 },
309 '5cdac63b317f3942da38f3a3de3b7f0e5d6678200951c6216230295550f63fb4': { 306 '5cdac63b317f3942da38f3a3de3b7f0e5d6678200951c6216230295550f63fb4': {
310 data: 'Xs+z3VzIqsWa7dGBqepwq75lTsx3yemNhTdRYYDDc3Kzpycyp961SgnKXHjE51266mfmj85ASFi/FKCOwk17lbD5UT3iawtc3TdgrQ18vBhBsmOA2F4JAa4yC58bTaXbyld3c4izDp7i9+iyRaFN52NWJznN82SXuRtPdWRtAxXB1V5Tyg==', 307 data: 'Xs+z3VzIqsWa7dGBqepwq75lTsx3yemNhTdRYYDDc3Kzpycyp961SgnKXHjE51266mfmj85ASFi/FKCOwk17lbD5UT3iawtc3TdgrQ18vBhBsmOA2F4JAa4yC58bTaXbyld3c4izDp7i9+iyRaFN52NWJznN82SXuRtPdWRtAxXB1V5Tyg==',
311 version: '0.3', 308 version: '0.3',
312 creationDate: 'Mon Jan 05 17:45:25 CET 2009', 309 creationDate: 'Mon Jan 05 17:45:25 CET 2009',
313 updateDate: 'Mon Jan 05 17:45:25 CET 2009', 310 updateDate: 'Mon Jan 05 17:45:25 CET 2009',
314 accessDate: 'Mon Jan 19 16:10:21 CET 2009', 311 accessDate: 'Mon Jan 19 16:10:21 CET 2009',
315 currentVersion: '00b3a4cd7400cfc1e7f7b369bdc3dcdaa50d6020233e131b30d755c89249ea9d', 312 currentVersion: '00b3a4cd7400cfc1e7f7b369bdc3dcdaa50d6020233e131b30d755c89249ea9d',
316 versions: { 313 versions: {
317 '00b3a4cd7400cfc1e7f7b369bdc3dcdaa50d6020233e131b30d755c89249ea9d': { 314 '00b3a4cd7400cfc1e7f7b369bdc3dcdaa50d6020233e131b30d755c89249ea9d': {
318 header: '####', 315 header: '####',
319 data: 'uGAV9pZTjrTwBy24TX/OUQwGmgzTnXv1JBIxdGkeoLCUhP9tAjbpUVylrUI5+VRrFYkXYyZ0o2HEgKrun2f3PODTxlmAbfkUldOV5tyV/EUxN0vYSBtgsMpqQm3bOKRIAo/uzrhSE3iwMjvKOTH2jUrkmX6hmqhXWZfa4X231GovrnOjek8c7t+LUBmmIjXEr2GSc/UbBoFnni+Q7ZArwtU68xoeCjLame1e8Y9wvCO8gIfAzXQAHsDgzn1MVeiWIqiCBTs8YKCO1yaxZpkzXV0yWzX+bHyXlKWwAk7Fu9w0CuaRULZmRCQhv+MMDw8DEXciTm0R5dRiVmSCFBy8cL9qlSeSX0GlnKl8E4/TSqvhMJblwJJsgmGSZ9cEt2u0E08tHxKuoeaaT1rpAOoiqx+z7BdhqjWOQZOGM4gR3EwqvOQoNYFUaXjAdmiUzW+e+TgE1IBQ8udRFl/D2zCcqFO90Hgc7hHsTDI3aGYvi6bHADu8hFpmZtJAjOMv1JgCX4Hm4n+SsbHd0DIfkEUMeGlVO47lcGWBZNRRm7xl8luZ4sZn', 316 data: 'uGAV9pZTjrTwBy24TX/OUQwGmgzTnXv1JBIxdGkeoLCUhP9tAjbpUVylrUI5+VRrFYkXYyZ0o2HEgKrun2f3PODTxlmAbfkUldOV5tyV/EUxN0vYSBtgsMpqQm3bOKRIAo/uzrhSE3iwMjvKOTH2jUrkmX6hmqhXWZfa4X231GovrnOjek8c7t+LUBmmIjXEr2GSc/UbBoFnni+Q7ZArwtU68xoeCjLame1e8Y9wvCO8gIfAzXQAHsDgzn1MVeiWIqiCBTs8YKCO1yaxZpkzXV0yWzX+bHyXlKWwAk7Fu9w0CuaRULZmRCQhv+MMDw8DEXciTm0R5dRiVmSCFBy8cL9qlSeSX0GlnKl8E4/TSqvhMJblwJJsgmGSZ9cEt2u0E08tHxKuoeaaT1rpAOoiqx+z7BdhqjWOQZOGM4gR3EwqvOQoNYFUaXjAdmiUzW+e+TgE1IBQ8udRFl/D2zCcqFO90Hgc7hHsTDI3aGYvi6bHADu8hFpmZtJAjOMv1JgCX4Hm4n+SsbHd0DIfkEUMeGlVO47lcGWBZNRRm7xl8luZ4sZn',
320 version: '0.3', 317 version: '0.3',
321 creationDate: 'Mon Jan 05 17:45:25 CET 2009', 318 creationDate: 'Mon Jan 05 17:45:25 CET 2009',
322 updateDate: 'Mon Jan 05 17:45:25 CET 2009', 319 updateDate: 'Mon Jan 05 17:45:25 CET 2009',
323 accessDate: 'Mon Jan 19 16:10:21 CET 2009' 320 accessDate: 'Mon Jan 19 16:10:21 CET 2009'
324 } 321 }
325 } 322 }
326 }, 323 },
327 '6026370f3db3860d2c46a08e389a7e906dc14f98c8444b21be9a7e9f405a2728': { 324 '6026370f3db3860d2c46a08e389a7e906dc14f98c8444b21be9a7e9f405a2728': {
328 data: '3oUg1TD+Lu4ou06j/MddOTXDqRM+qSKD+6Iuzia1Hop1w7v/BXidqeoKJZQI2VY9oO9B70Nr3B3wDROF+ycy6Rq+FM/xqUGHKXn1lAaSc6Wgj6TLQ6eRF6YZKSPqTj7TDWyw/2pEWk4HjcT8drTrCaC02tzAXMhYWlYPQPW4fUdq4hawoHIdopUN3vafQuFjY47OhqXKav3bNao=', 325 data: '3oUg1TD+Lu4ou06j/MddOTXDqRM+qSKD+6Iuzia1Hop1w7v/BXidqeoKJZQI2VY9oO9B70Nr3B3wDROF+ycy6Rq+FM/xqUGHKXn1lAaSc6Wgj6TLQ6eRF6YZKSPqTj7TDWyw/2pEWk4HjcT8drTrCaC02tzAXMhYWlYPQPW4fUdq4hawoHIdopUN3vafQuFjY47OhqXKav3bNao=',
329 version: '0.2', 326 version: '0.2',
330 creationDate: 'Tue Apr 17 16:36:08 CEST 2007', 327 creationDate: 'Tue Apr 17 16:36:08 CEST 2007',
331 updateDate: 'Tue Apr 17 16:36:08 CEST 2007', 328 updateDate: 'Tue Apr 17 16:36:08 CEST 2007',
332 accessDate: 'Mon Jan 19 16:09:33 CET 2009', 329 accessDate: 'Mon Jan 19 16:09:33 CET 2009',
333 currentVersion: 'bf8d46022179715d9d27e0a256b56b50828a771c3c6b46fe36fb2982dcb3b4cc', 330 currentVersion: 'bf8d46022179715d9d27e0a256b56b50828a771c3c6b46fe36fb2982dcb3b4cc',
334 versions: { 331 versions: {
335 'bf8d46022179715d9d27e0a256b56b50828a771c3c6b46fe36fb2982dcb3b4cc': { 332 'bf8d46022179715d9d27e0a256b56b50828a771c3c6b46fe36fb2982dcb3b4cc': {
336 header: '####', 333 header: '####',
337 data: 'fehYRMkg/wFj2t/aWu7szbXwrCyCDpjQN4UNck4/OiDlth70a2ve6ow5lAi2jgdlV9WiFrPejfa8dD0Z1g19jx+BBsuUYnBEKD0K+NapdJBBeI0We2nj9nYIij2dfZVx7cuvhy8sN6+DdylUQLsFHbga+Gi5hWcMuULT4GOAIy2WanSQL1RSR4ruA6zm/t+VVboEkkm7PPT+w3LuRl3wRaD4a8ZwYiSV/SzgWooFrh2S3YOUeshdaGCiYpTbXscsOxsCxc11i6wQGBqYSjksmtZDvEegdQdzCmxvq4jaVWJElYYS3av612nD5K/w7Zei6RccBiODBPATjrIczYg7HwmQxIM/6QI9/LQn0LP0yqRVUUtfzaODf0uWNpFzml9l/1lwXuBJyQFBp7H7Th46ekw9yEuPD00oZ+eXvKwbwfUU0JshT4hnEBtIjM8fH974PU0y95f0yLAJ1+M6DVXCxGsBix2aKJx9fuZP4KGpaXg6qCb/6327rph7MGomcrGPIiDjYwD/NTMdGluc55OZfGXtOZUaJCUM6nihqDwU7Ly1ZzYorgcvkX/t/0RNcOkFzGYNByp7mdcotyiHqCDKspqz9mEXAd7Noz3HO5GFpPqbRo7htDigGU1f7dvgbbfRoTz17Bt9Mw==', 334 data: 'fehYRMkg/wFj2t/aWu7szbXwrCyCDpjQN4UNck4/OiDlth70a2ve6ow5lAi2jgdlV9WiFrPejfa8dD0Z1g19jx+BBsuUYnBEKD0K+NapdJBBeI0We2nj9nYIij2dfZVx7cuvhy8sN6+DdylUQLsFHbga+Gi5hWcMuULT4GOAIy2WanSQL1RSR4ruA6zm/t+VVboEkkm7PPT+w3LuRl3wRaD4a8ZwYiSV/SzgWooFrh2S3YOUeshdaGCiYpTbXscsOxsCxc11i6wQGBqYSjksmtZDvEegdQdzCmxvq4jaVWJElYYS3av612nD5K/w7Zei6RccBiODBPATjrIczYg7HwmQxIM/6QI9/LQn0LP0yqRVUUtfzaODf0uWNpFzml9l/1lwXuBJyQFBp7H7Th46ekw9yEuPD00oZ+eXvKwbwfUU0JshT4hnEBtIjM8fH974PU0y95f0yLAJ1+M6DVXCxGsBix2aKJx9fuZP4KGpaXg6qCb/6327rph7MGomcrGPIiDjYwD/NTMdGluc55OZfGXtOZUaJCUM6nihqDwU7Ly1ZzYorgcvkX/t/0RNcOkFzGYNByp7mdcotyiHqCDKspqz9mEXAd7Noz3HO5GFpPqbRo7htDigGU1f7dvgbbfRoTz17Bt9Mw==',
338 version: '0.2', 335 version: '0.2',
339 creationDate: 'Tue Apr 17 16:36:08 CEST 2007', 336 creationDate: 'Tue Apr 17 16:36:08 CEST 2007',
340 updateDate: 'Tue Apr 17 16:36:08 CEST 2007', 337 updateDate: 'Tue Apr 17 16:36:08 CEST 2007',
341 accessDate: 'Mon Jan 19 16:09:33 CET 2009' 338 accessDate: 'Mon Jan 19 16:09:33 CET 2009'
342 } 339 }
343 } 340 }
344 }, 341 },
345 '6c25be8e145efb26a1abd59590522f73fb2e3dbc139af2217074d9e2ba92c16a': { 342 '6c25be8e145efb26a1abd59590522f73fb2e3dbc139af2217074d9e2ba92c16a': {
346 data: 'b2mcYUi59l434kGl7ij6dBu3063UL1dToMIu3Zsa9RV9RzeLKnezJhLKunqoAm7KwiJeqDo/REexHI1cshGYtHasVXXuyJfMx1grH7yhoWnkSRF4Sax6w5E5wnGkEpGJHOxXJ9rOjWHZ7yqCUUCB/dqLw4FwPOtRb/ynkBEYztEJA6EKGJuz0vrrTOsT8HMXtj/w6MEZ7qI3fPs=', 343 data: 'b2mcYUi59l434kGl7ij6dBu3063UL1dToMIu3Zsa9RV9RzeLKnezJhLKunqoAm7KwiJeqDo/REexHI1cshGYtHasVXXuyJfMx1grH7yhoWnkSRF4Sax6w5E5wnGkEpGJHOxXJ9rOjWHZ7yqCUUCB/dqLw4FwPOtRb/ynkBEYztEJA6EKGJuz0vrrTOsT8HMXtj/w6MEZ7qI3fPs=',
347 version: '0.2', 344 version: '0.2',
348 creationDate: 'Mon Apr 02 19:12:44 CEST 2007', 345 creationDate: 'Mon Apr 02 19:12:44 CEST 2007',
349 updateDate: 'Mon Apr 02 19:12:44 CEST 2007', 346 updateDate: 'Mon Apr 02 19:12:44 CEST 2007',
350 accessDate: 'Mon Jan 19 16:10:08 CET 2009', 347 accessDate: 'Mon Jan 19 16:10:08 CET 2009',
351 currentVersion: '2f60193c0fc0e3f2f178955e1c68759675acdf691bcb918cfad329a5a97cfaf3', 348 currentVersion: '2f60193c0fc0e3f2f178955e1c68759675acdf691bcb918cfad329a5a97cfaf3',
352 versions: { 349 versions: {
353 '2f60193c0fc0e3f2f178955e1c68759675acdf691bcb918cfad329a5a97cfaf3': { 350 '2f60193c0fc0e3f2f178955e1c68759675acdf691bcb918cfad329a5a97cfaf3': {
354 header: '####', 351 header: '####',
355 data: 'pZEWSdYIkrX8/r6OYmO0GEuKG9baUgn40Bmw7hXZBd/kfWuRjWsL4/pc5F5Ojrx+N0dxmQn5ZqKAzOOri29Rm4ruxnCbyK+oDsCDyMSnWy/VJcvystnDKzKmBRQVAOSEJtzEb3OtGzvqm0PQ1Dhx1YUAx7L6KlXysmG9h9+MjOcErRL9/1x1LZ33ytR+zK4LvTAb7gN5/9QgwysFyCkNP8bG4nyCzPMiUrBnP0odMTUvDkJDlY0Oia6VjGW6oNxnGIgA5fDraRrW4JH2oejQcrL7+X+jpCp05g==', 352 data: 'pZEWSdYIkrX8/r6OYmO0GEuKG9baUgn40Bmw7hXZBd/kfWuRjWsL4/pc5F5Ojrx+N0dxmQn5ZqKAzOOri29Rm4ruxnCbyK+oDsCDyMSnWy/VJcvystnDKzKmBRQVAOSEJtzEb3OtGzvqm0PQ1Dhx1YUAx7L6KlXysmG9h9+MjOcErRL9/1x1LZ33ytR+zK4LvTAb7gN5/9QgwysFyCkNP8bG4nyCzPMiUrBnP0odMTUvDkJDlY0Oia6VjGW6oNxnGIgA5fDraRrW4JH2oejQcrL7+X+jpCp05g==',
356 version: '0.2', 353 version: '0.2',
357 creationDate: 'Mon Apr 02 19:12:44 CEST 2007', 354 creationDate: 'Mon Apr 02 19:12:44 CEST 2007',
358 updateDate: 'Mon Apr 02 19:12:44 CEST 2007', 355 updateDate: 'Mon Apr 02 19:12:44 CEST 2007',
359 accessDate: 'Mon Jan 19 16:10:08 CET 2009' 356 accessDate: 'Mon Jan 19 16:10:08 CET 2009'
360 } 357 }
361 } 358 }
362 }, 359 },
363 '6d45c2fec275b7482d41c76b20507100cfb6ab49922b876f9dd3040d361f4a18': { 360 '6d45c2fec275b7482d41c76b20507100cfb6ab49922b876f9dd3040d361f4a18': {
364 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==', 361 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==',
365 version: '0.2', 362 version: '0.2',
366 creationDate: 'Wed Mar 14 19:09:05 CET 2007', 363 creationDate: 'Wed Mar 14 19:09:05 CET 2007',
367 updateDate: 'Wed Mar 14 19:09:05 CET 2007', 364 updateDate: 'Wed Mar 14 19:09:05 CET 2007',
368 accessDate: 'Mon Jan 19 16:10:15 CET 2009', 365 accessDate: 'Mon Jan 19 16:10:15 CET 2009',
369 currentVersion: 'e85f085a8ed42d2def7adc796b66a2e0a4c3c88d9f3e785eb12a6f5619d945c5', 366 currentVersion: 'e85f085a8ed42d2def7adc796b66a2e0a4c3c88d9f3e785eb12a6f5619d945c5',
370 versions: { 367 versions: {
371 'e85f085a8ed42d2def7adc796b66a2e0a4c3c88d9f3e785eb12a6f5619d945c5': { 368 'e85f085a8ed42d2def7adc796b66a2e0a4c3c88d9f3e785eb12a6f5619d945c5': {
372 header: '####', 369 header: '####',
373 data: 'BbXNAy0GcKKyDPiwhP1Jk9mIi3uXMHQdhuxpDvoR2C3YITOUBpurxGhhvmCg+a9pS+fKJdZPxL2mPbJj6GfWTEsm7K/ECEjrVkSTHi6PTUUgYVbCumq9EHjUspos+7VrifZry3c73+qAvIKamvUlNB86TchMpOXVJIyx8UgRX+bdhrxk9ZCEVOiLCG1zGPX8IzmcxPmBRZFlHYqE4ibhl/CLEzWXZBYCofTusClhOh7YM/jBgvDt64W7aIN2y2KiKwmFySkFZdnOvbAb34tXVimwqjqWPvPwd6MujQeX1bmaDD7Y0kXac8CJxqasIezLo2WqzLUbEXdIHGilkaPT2ZKpKhKkpHJHFrV2lVuQJVqwPUr0Gf9qMKgVnsyU8kUfq9ox+fhH70+v7BQSjT7bxxDLs0UesQeL7G4SqvNet5hPI4GQEpOY8p5MUFReIBTRm72NQEU=', 370 data: 'BbXNAy0GcKKyDPiwhP1Jk9mIi3uXMHQdhuxpDvoR2C3YITOUBpurxGhhvmCg+a9pS+fKJdZPxL2mPbJj6GfWTEsm7K/ECEjrVkSTHi6PTUUgYVbCumq9EHjUspos+7VrifZry3c73+qAvIKamvUlNB86TchMpOXVJIyx8UgRX+bdhrxk9ZCEVOiLCG1zGPX8IzmcxPmBRZFlHYqE4ibhl/CLEzWXZBYCofTusClhOh7YM/jBgvDt64W7aIN2y2KiKwmFySkFZdnOvbAb34tXVimwqjqWPvPwd6MujQeX1bmaDD7Y0kXac8CJxqasIezLo2WqzLUbEXdIHGilkaPT2ZKpKhKkpHJHFrV2lVuQJVqwPUr0Gf9qMKgVnsyU8kUfq9ox+fhH70+v7BQSjT7bxxDLs0UesQeL7G4SqvNet5hPI4GQEpOY8p5MUFReIBTRm72NQEU=',
374 version: '0.2', 371 version: '0.2',
375 creationDate: 'Wed Mar 14 19:09:05 CET 2007', 372 creationDate: 'Wed Mar 14 19:09:05 CET 2007',
376 updateDate: 'Wed Mar 14 19:09:05 CET 2007', 373 updateDate: 'Wed Mar 14 19:09:05 CET 2007',
377 accessDate: 'Mon Jan 19 16:10:15 CET 2009' 374 accessDate: 'Mon Jan 19 16:10:15 CET 2009'
378 } 375 }
379 } 376 }
380 }, 377 },
381 '7bb69b6366a8012f181c01e368ba18d4f7a82bcabb4959189736ad124c4bbfbb': { 378 '7bb69b6366a8012f181c01e368ba18d4f7a82bcabb4959189736ad124c4bbfbb': {
382 data: 'wYPZIt0UHiNVefNwtGc7z7Lu3YoQrXdfKmWqilZp8yeIrNfSLB9p60DLMrL3GDq/CsvDYkGAZgj1C/6NVnzVsXsJKq7NDZn1UPOGt+hCnw3lEVbD7zHkoMM4VgFDn1sZdjLe8wdpIFfdlQESTipT3GVXv3swG2qX2O2yuwtlopR8yZQTLg==', 379 data: 'wYPZIt0UHiNVefNwtGc7z7Lu3YoQrXdfKmWqilZp8yeIrNfSLB9p60DLMrL3GDq/CsvDYkGAZgj1C/6NVnzVsXsJKq7NDZn1UPOGt+hCnw3lEVbD7zHkoMM4VgFDn1sZdjLe8wdpIFfdlQESTipT3GVXv3swG2qX2O2yuwtlopR8yZQTLg==',
383 version: '0.3', 380 version: '0.3',
384 creationDate: 'Mon Jan 05 17:44:30 CET 2009', 381 creationDate: 'Mon Jan 05 17:44:30 CET 2009',
385 updateDate: 'Mon Jan 05 17:44:30 CET 2009', 382 updateDate: 'Mon Jan 05 17:44:30 CET 2009',
386 accessDate: 'Mon Jan 19 16:10:18 CET 2009', 383 accessDate: 'Mon Jan 19 16:10:18 CET 2009',
387 currentVersion: '23f5fb503e54c0cafe3d4944ddaf40bc74fab8b5d96e2bbddf693b1afb225e5b', 384 currentVersion: '23f5fb503e54c0cafe3d4944ddaf40bc74fab8b5d96e2bbddf693b1afb225e5b',
388 versions: { 385 versions: {
389 '23f5fb503e54c0cafe3d4944ddaf40bc74fab8b5d96e2bbddf693b1afb225e5b': { 386 '23f5fb503e54c0cafe3d4944ddaf40bc74fab8b5d96e2bbddf693b1afb225e5b': {
390 header: '####', 387 header: '####',
391 data: 'IpYj+7t3DhSVD8r9PkLbF5xpGrHhg8omY014P1vkT2KkGDEUj+ekQAbQ1g66Z7oNhRDpjS1/dcDjzH0IIQLjGuQ0oRfL0xZefVTx3N88ZLE39m3cJz10K2xyg3xp06jFBmdNJuCkgRhMzeUXeEJujw4lS2kv7cO04Uh2Maui6jDR7E498rgePY3L32vG1S66li/xU1vPjNn06aFTqSYxUL17/mlJNbgp3XWjGC+l0dXLLfXy1wOm+/I3zp2caTs+a2zDUZ15s+3XeaAWpBH7QCaQsvsQmoBqPbMvkjOQwW3taDvV7Hvkh+qTjCEcLjRFwhZkMNn3N2ewcLWQa2aVIjxt6Z0F4s/1URztWlKVzCfto8RmrLajYRn3ggG12kX2xDJFjNPNfs/7A3tMn+FqXQCCNG5GI06JZ32aQfpnjtmXScUuEs8UeFgsNeYclQhcm5R0sUwISK+D345B8859w+4+9OTY38NgYQQ9o/tmpCjWj1tLYLx/m/GcR2em7iyDpBdcnWUb+tK6Ah89qvXriHwPLSNzhOH2wxmi7nXTRQWMv7g2', 388 data: 'IpYj+7t3DhSVD8r9PkLbF5xpGrHhg8omY014P1vkT2KkGDEUj+ekQAbQ1g66Z7oNhRDpjS1/dcDjzH0IIQLjGuQ0oRfL0xZefVTx3N88ZLE39m3cJz10K2xyg3xp06jFBmdNJuCkgRhMzeUXeEJujw4lS2kv7cO04Uh2Maui6jDR7E498rgePY3L32vG1S66li/xU1vPjNn06aFTqSYxUL17/mlJNbgp3XWjGC+l0dXLLfXy1wOm+/I3zp2caTs+a2zDUZ15s+3XeaAWpBH7QCaQsvsQmoBqPbMvkjOQwW3taDvV7Hvkh+qTjCEcLjRFwhZkMNn3N2ewcLWQa2aVIjxt6Z0F4s/1URztWlKVzCfto8RmrLajYRn3ggG12kX2xDJFjNPNfs/7A3tMn+FqXQCCNG5GI06JZ32aQfpnjtmXScUuEs8UeFgsNeYclQhcm5R0sUwISK+D345B8859w+4+9OTY38NgYQQ9o/tmpCjWj1tLYLx/m/GcR2em7iyDpBdcnWUb+tK6Ah89qvXriHwPLSNzhOH2wxmi7nXTRQWMv7g2',
392 version: '0.3', 389 version: '0.3',
393 creationDate: 'Mon Jan 05 17:44:30 CET 2009', 390 creationDate: 'Mon Jan 05 17:44:30 CET 2009',
394 updateDate: 'Mon Jan 05 17:44:30 CET 2009', 391 updateDate: 'Mon Jan 05 17:44:30 CET 2009',
395 accessDate: 'Mon Jan 19 16:10:18 CET 2009' 392 accessDate: 'Mon Jan 19 16:10:18 CET 2009'
396 } 393 }
397 } 394 }
398 }, 395 },
399 '8b18e8593b5bc2f7ea39a5fab222047034ef2f380fee05be0fa6e1c0972fea39': { 396 '8b18e8593b5bc2f7ea39a5fab222047034ef2f380fee05be0fa6e1c0972fea39': {
400 data: 'pOMTY3PnUAbwMLDEYNJCMzp4iIA42YWr6gqoomg+P40e7LFUtbt/RQRelQwNIztyUSVLl0rilkZZkBUVvxrtTqvibKITCjJQGQIzvcb+Yl4mNosl2Rpp0xxMU03f1+G7eGbuCc5hJXYVAglhEYplaAPzHbRWXMY8iZXZPBuLVf5PN+rdpgAfkGeZ7Uf9RsQ9p/EglrWXYnTwXi3saUfzIjfvSHm5C+dXTY3FHpIc1YkjFrdVgMkhYQGV60JtZcwFtCEL2NpVljAbRgHoIXTOkzUvep4vxrtfBBWWMuAWEI06432gtnH6IQbrR6jOpwuMt7k/09qy/fARPHs3r4qTJ9r2uqWHJ7tjJw+IChQPC+3l5HcPpFURiw8LGAN1NyY1hUrF6N84RSn7AKS0bLa5qN++5lcjjxn/k8+JqmeUqN1/SYIbGwNnJeZ0vA8yvOxnD20iVADX5kOVqJDwXRPLaF6Oz9KkbOrmANCh+PmGw1i6PduB+FgAU4HViYCw5IGOUZ30Pm1NJofqfbhXvgzn7ey2+kUIAwDyOUpJ9fW+9jW/JU4rcawmzwBYN2V8apOoyc3wQJICm2984wIfVBpygCOZM0QDyVgNo57qKtYH3yMDQSkKvpEUmuhklMYhcV+4X5ggdqx7lYXO9IMDnFf2ZDiZyieTlOlRv/nNVecUB177Xpnq2e+X/ik2rCQWVrIymiV6ltr1DEv0krXKfvXGG/FMZHUmo3m+B5bG4xVhmt0GnHseqvY2Vrl9NksLgq3hTDOGSGIy5Nv8kfrd8B4/6Tavh0SumiyXnrTXyYXzCK9E7IqO/0KAln63VkcHsbOtS8mj1drN0YQ2KKaeIW+Yr3Gm0pbcODsgA6aFfz1itZVeovBqUklhXS+/Es8J8xOSvvSyD/TmlFjuErHa+wwNQvftosfwk9ZTt0eIJS5aLHdU2QsCjdfSy0DEPkk2siGhBX5ZhRzqyIAyXApSmy+e7PIqn/dDR51+D1ZHwoTQyTrd+F08jBWZgU/OvS8MRxNZSxQwsi7bcWZG+w0utrIDB8eSOMVBXI5XBeJb4h5Bzut18C1shGHeGkSJp04=', 397 data: 'pOMTY3PnUAbwMLDEYNJCMzp4iIA42YWr6gqoomg+P40e7LFUtbt/RQRelQwNIztyUSVLl0rilkZZkBUVvxrtTqvibKITCjJQGQIzvcb+Yl4mNosl2Rpp0xxMU03f1+G7eGbuCc5hJXYVAglhEYplaAPzHbRWXMY8iZXZPBuLVf5PN+rdpgAfkGeZ7Uf9RsQ9p/EglrWXYnTwXi3saUfzIjfvSHm5C+dXTY3FHpIc1YkjFrdVgMkhYQGV60JtZcwFtCEL2NpVljAbRgHoIXTOkzUvep4vxrtfBBWWMuAWEI06432gtnH6IQbrR6jOpwuMt7k/09qy/fARPHs3r4qTJ9r2uqWHJ7tjJw+IChQPC+3l5HcPpFURiw8LGAN1NyY1hUrF6N84RSn7AKS0bLa5qN++5lcjjxn/k8+JqmeUqN1/SYIbGwNnJeZ0vA8yvOxnD20iVADX5kOVqJDwXRPLaF6Oz9KkbOrmANCh+PmGw1i6PduB+FgAU4HViYCw5IGOUZ30Pm1NJofqfbhXvgzn7ey2+kUIAwDyOUpJ9fW+9jW/JU4rcawmzwBYN2V8apOoyc3wQJICm2984wIfVBpygCOZM0QDyVgNo57qKtYH3yMDQSkKvpEUmuhklMYhcV+4X5ggdqx7lYXO9IMDnFf2ZDiZyieTlOlRv/nNVecUB177Xpnq2e+X/ik2rCQWVrIymiV6ltr1DEv0krXKfvXGG/FMZHUmo3m+B5bG4xVhmt0GnHseqvY2Vrl9NksLgq3hTDOGSGIy5Nv8kfrd8B4/6Tavh0SumiyXnrTXyYXzCK9E7IqO/0KAln63VkcHsbOtS8mj1drN0YQ2KKaeIW+Yr3Gm0pbcODsgA6aFfz1itZVeovBqUklhXS+/Es8J8xOSvvSyD/TmlFjuErHa+wwNQvftosfwk9ZTt0eIJS5aLHdU2QsCjdfSy0DEPkk2siGhBX5ZhRzqyIAyXApSmy+e7PIqn/dDR51+D1ZHwoTQyTrd+F08jBWZgU/OvS8MRxNZSxQwsi7bcWZG+w0utrIDB8eSOMVBXI5XBeJb4h5Bzut18C1shGHeGkSJp04=',
401 version: '0.2', 398 version: '0.2',
402 creationDate: 'Tue May 01 01:10:17 CEST 2007', 399 creationDate: 'Tue May 01 01:10:17 CEST 2007',
403 updateDate: 'Tue May 01 01:13:27 CEST 2007', 400 updateDate: 'Tue May 01 01:13:27 CEST 2007',
404 accessDate: 'Mon Jan 19 16:10:02 CET 2009', 401 accessDate: 'Mon Jan 19 16:10:02 CET 2009',
405 currentVersion: 'd175358ea0b9d32c23e4bceff2020eae9a8459466abc18d4399d988e733fc0f8', 402 currentVersion: 'd175358ea0b9d32c23e4bceff2020eae9a8459466abc18d4399d988e733fc0f8',
406 versions: { 403 versions: {
407 '8a032b53f7356e2d8b28665211abbe2cf1c79fd8eee4752e83cebdced1c19911': { 404 '8a032b53f7356e2d8b28665211abbe2cf1c79fd8eee4752e83cebdced1c19911': {
408 header: '####', 405 header: '####',
diff --git a/frontend/gamma/tests/tests/Components/CardDialogNew/cardDialogNew_test.js b/frontend/gamma/tests/tests/Components/CardDialogNew/cardDialogNew_test.js
index e2b21bc..60a2757 100644
--- a/frontend/gamma/tests/tests/Components/CardDialogNew/cardDialogNew_test.js
+++ b/frontend/gamma/tests/tests/Components/CardDialogNew/cardDialogNew_test.js
@@ -1,127 +1,124 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.Tests.CardDialogNew'); 26Clipperz.Base.module('Clipperz.Tests.CardDialogNew');
30 27
31Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); 28Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
32Clipperz.PM.Strings.Languages.initSetup(); 29Clipperz.PM.Strings.Languages.initSetup();
33 30
34Clipperz.Tests.CardDialogNew.Tester = function(args) { 31Clipperz.Tests.CardDialogNew.Tester = function(args) {
35 args = args || {}; 32 args = args || {};
36 33
37 Clipperz.Tests.CardDialogNew.Tester.superclass.constructor.call(this, args); 34 Clipperz.Tests.CardDialogNew.Tester.superclass.constructor.call(this, args);
38 this._user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); 35 this._user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}});
39 36
40 return this; 37 return this;
41}; 38};
42 39
43Clipperz.Base.extend(Clipperz.Tests.CardDialogNew.Tester, Object, { 40Clipperz.Base.extend(Clipperz.Tests.CardDialogNew.Tester, Object, {
44 41
45 'toString': function() { 42 'toString': function() {
46 return "Clipperz.Tests.CardDialogNew.Tester"; 43 return "Clipperz.Tests.CardDialogNew.Tester";
47 }, 44 },
48 45
49 //------------------------------------------------------------------------- 46 //-------------------------------------------------------------------------
50 47
51 'user': function () { 48 'user': function () {
52 return this._user; 49 return this._user;
53 }, 50 },
54 51
55 //------------------------------------------------------------------------- 52 //-------------------------------------------------------------------------
56 53
57 'run': function () { 54 'run': function () {
58 var deferredResult; 55 var deferredResult;
59 var proxy; 56 var proxy;
60 varcardDialogController; 57 varcardDialogController;
61 varcardDialogComponent; 58 varcardDialogComponent;
62 59
63 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); 60 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false});
64 61
65 deferredResult = new Clipperz.Async.Deferred("cardDialogNew_test.init", {trace:false}); 62 deferredResult = new Clipperz.Async.Deferred("cardDialogNew_test.init", {trace:false});
66 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']); 63 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']);
67 deferredResult.addMethod(this.user(), 'login'); 64 deferredResult.addMethod(this.user(), 'login');
68 // deferredResult.addMethod(this.user(), 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); 65 // deferredResult.addMethod(this.user(), 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13');
69 deferredResult.addMethod(this.user(), 'createNewRecord'); 66 deferredResult.addMethod(this.user(), 'createNewRecord');
70 deferredResult.addCallback(MochiKit.Base.bind(function (aRecord) { 67 deferredResult.addCallback(MochiKit.Base.bind(function (aRecord) {
71 cardDialogController = new Clipperz.PM.UI.Web.Controllers.CardDialogController({record:aRecord, delegate:this}); 68 cardDialogController = new Clipperz.PM.UI.Web.Controllers.CardDialogController({record:aRecord, delegate:this});
72 cardDialogController.run(); 69 cardDialogController.run();
73 }, this)); 70 }, this));
74 deferredResult.callback(); 71 deferredResult.callback();
75 72
76 return deferredResult; 73 return deferredResult;
77 }, 74 },
78 75
79 //========================================================================= 76 //=========================================================================
80 77
81 'saveChanges': function () { 78 'saveChanges': function () {
82 return this.user().saveChanges(); 79 return this.user().saveChanges();
83 }, 80 },
84 81
85 //------------------------------------------------------------------------- 82 //-------------------------------------------------------------------------
86 83
87 'hasPendingChanges': function () { 84 'hasPendingChanges': function () {
88 return this.user().hasPendingChanges(); 85 return this.user().hasPendingChanges();
89 }, 86 },
90 87
91 //------------------------------------------------------------------------- 88 //-------------------------------------------------------------------------
92 89
93 'revertChanges': function () { 90 'revertChanges': function () {
94 return this.user().revertChanges(); 91 return this.user().revertChanges();
95 }, 92 },
96 93
97 //========================================================================= 94 //=========================================================================
98 __syntaxFix__: "syntax fix" 95 __syntaxFix__: "syntax fix"
99}); 96});
100 97
101 98
102 99
103 100
104 101
105 102
106 103
107 104
108 105
109 106
110 107
111 108
112 109
113 110
114 111
115 112
116 113
117 114
118 115
119 116
120init = function () { 117init = function () {
121 vartester; 118 vartester;
122 119
123 tester = new Clipperz.Tests.CardDialogNew.Tester(); 120 tester = new Clipperz.Tests.CardDialogNew.Tester();
124 tester.run(); 121 tester.run();
125}; 122};
126 123
127MochiKit.DOM.addLoadEvent(init); 124MochiKit.DOM.addLoadEvent(init);
diff --git a/frontend/gamma/tests/tests/Components/CardDialogNew/index.html b/frontend/gamma/tests/tests/Components/CardDialogNew/index.html
index 1e0061a..2d502b4 100644
--- a/frontend/gamma/tests/tests/Components/CardDialogNew/index.html
+++ b/frontend/gamma/tests/tests/Components/CardDialogNew/index.html
@@ -1,117 +1,114 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27--> 24-->
28 25
29<html> 26<html>
30<head> 27<head>
31 <title>Card Dialog NEW - test</title> 28 <title>Card Dialog NEW - test</title>
32 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 29 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
33 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script> 30 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script>
34 31
35 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> 32 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
36 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script> 33 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
37 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 34 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
38 <script type='text/javascript' src='../../../../js/Clipperz/Date.js'></script> 35 <script type='text/javascript' src='../../../../js/Clipperz/Date.js'></script>
39 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script> 36 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script>
40 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 37 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
41 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script> 38 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script> 39 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script>
43 40
44 <script type='text/javascript' src='../../../../js/Clipperz/Signal.js'></script> 41 <script type='text/javascript' src='../../../../js/Clipperz/Signal.js'></script>
45 <script type='text/javascript' src='../../../../js/Clipperz/Style.js'></script> 42 <script type='text/javascript' src='../../../../js/Clipperz/Style.js'></script>
46 <script type='text/javascript' src='../../../../js/Clipperz/Visual.js'></script> 43 <script type='text/javascript' src='../../../../js/Clipperz/Visual.js'></script>
47 <script type='text/javascript' src='../../../../js/Clipperz/Set.js'></script> 44 <script type='text/javascript' src='../../../../js/Clipperz/Set.js'></script>
48 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script> 45 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script>
49 46
50 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> 47 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
51 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> 48 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
52 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script> 49 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
53 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> 50 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
54 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script> 51 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
55 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script> 52 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script>
56 53
57 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script> 54 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script>
58 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script> 55 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script>
59 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script> 56 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script>
60 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script> 57 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script>
61 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script> 58 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script>
62 59
63 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script> 60 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script>
64 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script> 61 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script>
65 62
66 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings.js'></script> 63 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings.js'></script>
67 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script> 64 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script>
68 <script type='text/javascript' src='../../../../js/Clipperz/PM/Date.js'></script> 65 <script type='text/javascript' src='../../../../js/Clipperz/PM/Date.js'></script>
69 <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>
70 <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>
71 <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>
72 <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>
73 <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>
74 <!-- 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 -->
75 <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>
76 <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>
77 <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>
78 75
79 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/BaseComponent.js'></script> 76 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/BaseComponent.js'></script>
80 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/Button.js'></script> 77 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/Button.js'></script>
81 <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/ComponentSlot.js'></script>
82 <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/PasswordEntropyDisplay.js'></script>
83 <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/ProgressBar.js'></script>
84 <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/SimpleMessagePanel.js'></script>
85 <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/TabPanelComponent.js'></script>
86 <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/Tooltip.js'></script>
87 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TranslatorWidget.js'></script> 84 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TranslatorWidget.js'></script>
88 85
89 <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/CardDialogComponent.js'></script>
90 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogRecordFieldComponent.js'></script> 87 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogRecordFieldComponent.js'></script>
91 88
92 <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/ProgressBarController.js'></script>
93 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/TabPanelController.js'></script> 90 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/TabPanelController.js'></script>
94 91
95 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/CardDialogController.js'></script> 92 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/CardDialogController.js'></script>
96 93
97 <script type='text/javascript' src='./User.data.js'></script> 94 <script type='text/javascript' src='./User.data.js'></script>
98 <script type='text/javascript' src='./cardDialogNew_test.js'></script> 95 <script type='text/javascript' src='./cardDialogNew_test.js'></script>
99<script> 96<script>
100 Clipperz_IEisBroken = false; 97 Clipperz_IEisBroken = false;
101</script> 98</script>
102 99
103<!--[if IE]><script> 100<!--[if IE]><script>
104Clipperz_IEisBroken = true; 101Clipperz_IEisBroken = true;
105</script><![endif]--> 102</script><![endif]-->
106 103
107 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/clipperz.css" /> 104 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/clipperz.css" />
108 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/compact.css" /> 105 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/compact.css" />
109 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/ytheme-clipperz.css" /> 106 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/ytheme-clipperz.css" />
110 107
111</head> 108</head>
112<body> 109<body>
113 110
114<div id="tableWrapper"></div> 111<div id="tableWrapper"></div>
115 112
116</body> 113</body>
117</html> 114</html>
diff --git a/frontend/gamma/tests/tests/Components/FullApp/User.data.js b/frontend/gamma/tests/tests/Components/FullApp/User.data.js
index b76ccad..7194f6a 100644
--- a/frontend/gamma/tests/tests/Components/FullApp/User.data.js
+++ b/frontend/gamma/tests/tests/Components/FullApp/User.data.js
@@ -1,408 +1,405 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29testData = { 26testData = {
30 27
31 //------------------------------------------------------------------------- 28 //-------------------------------------------------------------------------
32 29
33 'testData': { 30 'testData': {
34 users:{ 31 users:{
35 'catchAllUser': { 32 'catchAllUser': {
36 __masterkey_test_value__: 'masterkey', 33 __masterkey_test_value__: 'masterkey',
37 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00', 34 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00',
38 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00' 35 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00'
39 }, 36 },
40 37
41 /* tt/tt - empty, just created, account*/ 38 /* tt/tt - empty, just created, account*/
42 'afaadd70f647886043b9196c861dc04f5605baeab3812ea23707fcba08c4a54f': { 39 'afaadd70f647886043b9196c861dc04f5605baeab3812ea23707fcba08c4a54f': {
43 s: 'df781ec363a380a0bb171d7d4c226248259272a964f04fa2340c77ff84bbc594', 40 s: 'df781ec363a380a0bb171d7d4c226248259272a964f04fa2340c77ff84bbc594',
44 v: 'eca214d990ec971a61cd9c5082e62c2d241f8e1ec805a2c26b1d31612747bfb0', 41 v: 'eca214d990ec971a61cd9c5082e62c2d241f8e1ec805a2c26b1d31612747bfb0',
45 version: '0.2', 42 version: '0.2',
46 maxNumberOfRecords: '100', 43 maxNumberOfRecords: '100',
47 userDetails: '{"records":{"index":{},"data":"q/wNeY/xf7Sujn5CIxEYPRSF"},"directLogins":{"index":{},"data":"qcVwiiyOYeDHFZq5T06iF1Wp"},"preferences":{"data":"7ONKfKQk9GYGnlRxFgTgAd4J"},"oneTimePasswords":{"data":"GD66ZNSIqkRl1UxhwyrsSm5r"},"version":"0.1"}', 44 userDetails: '{"records":{"index":{},"data":"q/wNeY/xf7Sujn5CIxEYPRSF"},"directLogins":{"index":{},"data":"qcVwiiyOYeDHFZq5T06iF1Wp"},"preferences":{"data":"7ONKfKQk9GYGnlRxFgTgAd4J"},"oneTimePasswords":{"data":"GD66ZNSIqkRl1UxhwyrsSm5r"},"version":"0.1"}',
48 statistics: 'tfQF+BrjAQUWyiXWOMkWApmq', 45 statistics: 'tfQF+BrjAQUWyiXWOMkWApmq',
49 userDetailsVersion: '0.3', 46 userDetailsVersion: '0.3',
50 records: { 47 records: {
51 48
52 } 49 }
53 }, 50 },
54 51
55 /* tt/tt - account with "wrong" direct login*/ 52 /* tt/tt - account with "wrong" direct login*/
56 /* 'afaadd70f647886043b9196c861dc04f5605baeab3812ea23707fcba08c4a54f': { 53 /* 'afaadd70f647886043b9196c861dc04f5605baeab3812ea23707fcba08c4a54f': {
57 s: 'df781ec363a380a0bb171d7d4c226248259272a964f04fa2340c77ff84bbc594', 54 s: 'df781ec363a380a0bb171d7d4c226248259272a964f04fa2340c77ff84bbc594',
58 v: 'eca214d990ec971a61cd9c5082e62c2d241f8e1ec805a2c26b1d31612747bfb0', 55 v: 'eca214d990ec971a61cd9c5082e62c2d241f8e1ec805a2c26b1d31612747bfb0',
59 version: '0.2', 56 version: '0.2',
60 maxNumberOfRecords: '100', 57 maxNumberOfRecords: '100',
61 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"}', 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"}',
62 statistics: 'XhiWkdDyHzuviv5bdxOY/2Q5', 59 statistics: 'XhiWkdDyHzuviv5bdxOY/2Q5',
63 userDetailsVersion: '0.3', 60 userDetailsVersion: '0.3',
64 records: { 61 records: {
65 '8bcad18cc9613d794ca052c02e91198f7d5b6e1b7d595f21b21ea53a72e56aab': { 62 '8bcad18cc9613d794ca052c02e91198f7d5b6e1b7d595f21b21ea53a72e56aab': {
66 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', 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',
67 version: '0.3', 64 version: '0.3',
68 creationDate: 'Wed Jan 20 16:53:47 CET 2010', 65 creationDate: 'Wed Jan 20 16:53:47 CET 2010',
69 updateDate: 'Wed Jan 20 16:53:47 CET 2010', 66 updateDate: 'Wed Jan 20 16:53:47 CET 2010',
70 accessDate: 'Wed Jan 20 16:53:47 CET 2010', 67 accessDate: 'Wed Jan 20 16:53:47 CET 2010',
71 currentVersion: '79047c5ca148b2915014c44d75874cfedf3caee20cd9f97a87ba2a291ccec741', 68 currentVersion: '79047c5ca148b2915014c44d75874cfedf3caee20cd9f97a87ba2a291ccec741',
72 versions: { 69 versions: {
73 '79047c5ca148b2915014c44d75874cfedf3caee20cd9f97a87ba2a291ccec741': { 70 '79047c5ca148b2915014c44d75874cfedf3caee20cd9f97a87ba2a291ccec741': {
74 header: '####', 71 header: '####',
75 data: 'mqqGPhRw/397NUZH6B8XJW1y5rMDZD6u7WUuEU77zcNXYEHFNQq319u0G/qD5E63kbI/kHsNXZFFKmNGw5IxDiteWSfYG4RiiapsUxe3ZgsFDDBHFrD5NSrMdIzLFSoNel+1mZUps9AcmkelhkXSCqRiGPyiPIKq7wKXF+Ql6j1AsnCMOCJLlJdTZPqIUUaTYD4z/tvTOS1xRdUiaRjw7cCh2yMms1c5V//3J0xbO10kEC8xvA8nhJnQqsMh2P4h6QFzAZtXYKMehJXwQ5ap7W327EMnCdXw2N0pv9Lr5S9khN/9oTMy2tMIGtN+UZ684zTiAP+479xES6OvmVL04nGyCarIqMNu7oclR75Qv2U14CNRA3gIaMPv', 72 data: 'mqqGPhRw/397NUZH6B8XJW1y5rMDZD6u7WUuEU77zcNXYEHFNQq319u0G/qD5E63kbI/kHsNXZFFKmNGw5IxDiteWSfYG4RiiapsUxe3ZgsFDDBHFrD5NSrMdIzLFSoNel+1mZUps9AcmkelhkXSCqRiGPyiPIKq7wKXF+Ql6j1AsnCMOCJLlJdTZPqIUUaTYD4z/tvTOS1xRdUiaRjw7cCh2yMms1c5V//3J0xbO10kEC8xvA8nhJnQqsMh2P4h6QFzAZtXYKMehJXwQ5ap7W327EMnCdXw2N0pv9Lr5S9khN/9oTMy2tMIGtN+UZ684zTiAP+479xES6OvmVL04nGyCarIqMNu7oclR75Qv2U14CNRA3gIaMPv',
76 version: '0.3', 73 version: '0.3',
77 creationDate: 'Wed Jan 20 16:53:47 CET 2010', 74 creationDate: 'Wed Jan 20 16:53:47 CET 2010',
78 updateDate: 'Wed Jan 20 16:53:47 CET 2010', 75 updateDate: 'Wed Jan 20 16:53:47 CET 2010',
79 accessDate: 'Wed Jan 20 16:53:47 CET 2010' 76 accessDate: 'Wed Jan 20 16:53:47 CET 2010'
80 } 77 }
81 } 78 }
82 } 79 }
83 } 80 }
84 }, 81 },
85*/ 82*/
86 /* tt/tt with "fixed" direct login*/ 83 /* tt/tt with "fixed" direct login*/
87 /* 'afaadd70f647886043b9196c861dc04f5605baeab3812ea23707fcba08c4a54f': { 84 /* 'afaadd70f647886043b9196c861dc04f5605baeab3812ea23707fcba08c4a54f': {
88 s: 'df781ec363a380a0bb171d7d4c226248259272a964f04fa2340c77ff84bbc594', 85 s: 'df781ec363a380a0bb171d7d4c226248259272a964f04fa2340c77ff84bbc594',
89 v: 'eca214d990ec971a61cd9c5082e62c2d241f8e1ec805a2c26b1d31612747bfb0', 86 v: 'eca214d990ec971a61cd9c5082e62c2d241f8e1ec805a2c26b1d31612747bfb0',
90 version: '0.2', 87 version: '0.2',
91 maxNumberOfRecords: '100', 88 maxNumberOfRecords: '100',
92 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"}', 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"}',
93 statistics: 'GHHkZjW0QLdUq6CPnVuDLh86', 90 statistics: 'GHHkZjW0QLdUq6CPnVuDLh86',
94 userDetailsVersion: '0.3', 91 userDetailsVersion: '0.3',
95 records: { 92 records: {
96 '8bcad18cc9613d794ca052c02e91198f7d5b6e1b7d595f21b21ea53a72e56aab': { 93 '8bcad18cc9613d794ca052c02e91198f7d5b6e1b7d595f21b21ea53a72e56aab': {
97 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', 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',
98 version: '0.3', 95 version: '0.3',
99 creationDate: 'Wed Jan 20 16:53:47 CET 2010', 96 creationDate: 'Wed Jan 20 16:53:47 CET 2010',
100 updateDate: 'Wed Jan 20 16:54:56 CET 2010', 97 updateDate: 'Wed Jan 20 16:54:56 CET 2010',
101 accessDate: 'Wed Jan 20 16:54:56 CET 2010', 98 accessDate: 'Wed Jan 20 16:54:56 CET 2010',
102 currentVersion: 'c0a8f723bf44e0aae1d69f6f85f8e1b747dfbe5ca0d78c5ebda16b32cf17e16d', 99 currentVersion: 'c0a8f723bf44e0aae1d69f6f85f8e1b747dfbe5ca0d78c5ebda16b32cf17e16d',
103 versions: { 100 versions: {
104 '79047c5ca148b2915014c44d75874cfedf3caee20cd9f97a87ba2a291ccec741': { 101 '79047c5ca148b2915014c44d75874cfedf3caee20cd9f97a87ba2a291ccec741': {
105 header: '####', 102 header: '####',
106 data: 'mqqGPhRw/397NUZH6B8XJW1y5rMDZD6u7WUuEU77zcNXYEHFNQq319u0G/qD5E63kbI/kHsNXZFFKmNGw5IxDiteWSfYG4RiiapsUxe3ZgsFDDBHFrD5NSrMdIzLFSoNel+1mZUps9AcmkelhkXSCqRiGPyiPIKq7wKXF+Ql6j1AsnCMOCJLlJdTZPqIUUaTYD4z/tvTOS1xRdUiaRjw7cCh2yMms1c5V//3J0xbO10kEC8xvA8nhJnQqsMh2P4h6QFzAZtXYKMehJXwQ5ap7W327EMnCdXw2N0pv9Lr5S9khN/9oTMy2tMIGtN+UZ684zTiAP+479xES6OvmVL04nGyCarIqMNu7oclR75Qv2U14CNRA3gIaMPv', 103 data: 'mqqGPhRw/397NUZH6B8XJW1y5rMDZD6u7WUuEU77zcNXYEHFNQq319u0G/qD5E63kbI/kHsNXZFFKmNGw5IxDiteWSfYG4RiiapsUxe3ZgsFDDBHFrD5NSrMdIzLFSoNel+1mZUps9AcmkelhkXSCqRiGPyiPIKq7wKXF+Ql6j1AsnCMOCJLlJdTZPqIUUaTYD4z/tvTOS1xRdUiaRjw7cCh2yMms1c5V//3J0xbO10kEC8xvA8nhJnQqsMh2P4h6QFzAZtXYKMehJXwQ5ap7W327EMnCdXw2N0pv9Lr5S9khN/9oTMy2tMIGtN+UZ684zTiAP+479xES6OvmVL04nGyCarIqMNu7oclR75Qv2U14CNRA3gIaMPv',
107 version: '0.3', 104 version: '0.3',
108 creationDate: 'Wed Jan 20 16:53:47 CET 2010', 105 creationDate: 'Wed Jan 20 16:53:47 CET 2010',
109 updateDate: 'Wed Jan 20 16:53:47 CET 2010', 106 updateDate: 'Wed Jan 20 16:53:47 CET 2010',
110 accessDate: 'Wed Jan 20 16:54:26 CET 2010' 107 accessDate: 'Wed Jan 20 16:54:26 CET 2010'
111 }, 108 },
112 'c0a8f723bf44e0aae1d69f6f85f8e1b747dfbe5ca0d78c5ebda16b32cf17e16d': { 109 'c0a8f723bf44e0aae1d69f6f85f8e1b747dfbe5ca0d78c5ebda16b32cf17e16d': {
113 header: '####', 110 header: '####',
114 data: 'ky36e85TGmGQ+O9FXAhHRXEz5eBQogwuyAEgjpsHaSUM22TowYEw/NkWMg4oT4M2DGIYoTyXatvea859F3kMWM5hUe16PaG9J8HzQcEnaTRmi5oe0cMJAlg6pl7ypLt9kUiqDoMIM4lM/eKO8E/bRZWnU1EsxjehYjQQUoeoSyyTAOhHlLfXS99TzCXFrJjO5rAgaJ7iAjNOcQ8Bm6ECau5ao9AVd5hqgMDEmLJhRwygcGHSTek3i3I4o0jIImcqpfNko/4SbEC4p7+V5Rggr1IG5DkeYfKuyqxgulJbtdkcWxAqPReKXUOkmSGlRTje8rjTTLx1Jv7QCc0hLDYc5pLd8j/G7mOwLG1nLTMeNekljKNCTLAhQ+ccDDq35Jv1cNhmA/icmRlMkztbsR7tzqFs+drQ', 111 data: 'ky36e85TGmGQ+O9FXAhHRXEz5eBQogwuyAEgjpsHaSUM22TowYEw/NkWMg4oT4M2DGIYoTyXatvea859F3kMWM5hUe16PaG9J8HzQcEnaTRmi5oe0cMJAlg6pl7ypLt9kUiqDoMIM4lM/eKO8E/bRZWnU1EsxjehYjQQUoeoSyyTAOhHlLfXS99TzCXFrJjO5rAgaJ7iAjNOcQ8Bm6ECau5ao9AVd5hqgMDEmLJhRwygcGHSTek3i3I4o0jIImcqpfNko/4SbEC4p7+V5Rggr1IG5DkeYfKuyqxgulJbtdkcWxAqPReKXUOkmSGlRTje8rjTTLx1Jv7QCc0hLDYc5pLd8j/G7mOwLG1nLTMeNekljKNCTLAhQ+ccDDq35Jv1cNhmA/icmRlMkztbsR7tzqFs+drQ',
115 version: '0.3', 112 version: '0.3',
116 previousVersion: '79047c5ca148b2915014c44d75874cfedf3caee20cd9f97a87ba2a291ccec741', 113 previousVersion: '79047c5ca148b2915014c44d75874cfedf3caee20cd9f97a87ba2a291ccec741',
117 previousVersionKey: 'aLMGf0ucGPaKLVv+AunJaZWDg+gGncnBu2Bf7QseH3ma/jcMOZCNHNd44mNPKfZPyoXYZi6/ToxkJh6Nu8PmOL/SsHTlf8FBZxrNm1i7ZS2b3A==', 114 previousVersionKey: 'aLMGf0ucGPaKLVv+AunJaZWDg+gGncnBu2Bf7QseH3ma/jcMOZCNHNd44mNPKfZPyoXYZi6/ToxkJh6Nu8PmOL/SsHTlf8FBZxrNm1i7ZS2b3A==',
118 creationDate: 'Wed Jan 20 16:54:56 CET 2010', 115 creationDate: 'Wed Jan 20 16:54:56 CET 2010',
119 updateDate: 'Wed Jan 20 16:54:56 CET 2010', 116 updateDate: 'Wed Jan 20 16:54:56 CET 2010',
120 accessDate: 'Wed Jan 20 16:54:56 CET 2010' 117 accessDate: 'Wed Jan 20 16:54:56 CET 2010'
121 } 118 }
122 } 119 }
123 } 120 }
124 } 121 }
125 }, 122 },
126*/ 123*/
127 124
128 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 125 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
129 126
130 /* joe/clipperz*/ 127 /* joe/clipperz*/
131 'f527cdd90d0d47f8524b4e165398ad1455eba515d04abd101d1e93b3c6ae0674': { 128 'f527cdd90d0d47f8524b4e165398ad1455eba515d04abd101d1e93b3c6ae0674': {
132 s: '186f0c40bf73f2af236eaa6c429df225efa933050c9aae65240e93b7b362e3ee', 129 s: '186f0c40bf73f2af236eaa6c429df225efa933050c9aae65240e93b7b362e3ee',
133 v: 'ac61a6e325ecf329926a86084f591d8852d0ad3e4a6080f2adc901b82395ecaf', 130 v: 'ac61a6e325ecf329926a86084f591d8852d0ad3e4a6080f2adc901b82395ecaf',
134 version: '0.2', 131 version: '0.2',
135 maxNumberOfRecords: '100', 132 maxNumberOfRecords: '100',
136 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","c0ce9130ca365bb02418d4305ea1d29e49c3f0e96d44b9d3cb6b4b6843d25065":"17","6dadcd7ab23ece757d6990ce237bdebb68b2df0281c78cc1483d913318112162":"18"},"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","6e218e5d129105c20ac499307b260eb76bb2e753f6c319e17efdb848675c5fa2":"20","75f306bd520b483e86a1b436d94159020197df0155ab9058fb86586925223dc7":"21"},"data":"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"},"preferences":{"data":"fwQt+Wxhev563xviKvItHr3k5MC7ciMmEayJZ7HfwTcWPqaF5Syf1czPlMQiDQzEgWWs4BmQqB0QCDDMi3VyGCrSzAtIMR4afVdRyQ=="},"oneTimePasswords":{"data":"8WhmNFYrgxqzrJwMx+goddfLb2wlXnREHH77BKpL8h4ZalAwNOAt0yoBMECtlnNcve8ufjGAXL80dgUgtqsTn8fpx7+WDL5fNynv5ve9mJq/qgqctQO+pvnLuvs4867NXYInHr84f+t8f0lyfYRQdpDJfem9ECrn5MrpQ1rvwB2PVKcU0f+VPGhu673QeDbqzF+95JfxF9Tnv1PAePL1EGahUYuxTED4y4fcVmsHKl9yZXcsuheM7ecik93cqOVSlnuN+s5c2KWqjgDdLzUjG2dDHcuY97v7JT7Pns4ad5C9i2dYLtNrSHG7QLw6RBS/EnBwGzK+sWFQFCU8u0qSeFb0eGRjvVb9SfIXSeTqAJK3JC+OLAVGiey34jFckykeQjy5nPjhSpqWWhZdpezvZHno3YCXSGkLqbazL6xtesNaZZAbHBKdrwIOuTdhMwArfX/na/gavciFM0zwGb13w6JX3Ar3iTqhnBR20zmv5vcZwIOjf36LSfSNnjT4sWE1Az+FQPmMPQi4ODHfLSJbwYQhwqM5Wq2yXHpKDf/e2RpBZ5JsUkDEyoGmglcLF+pXwk4Mn9LuNOztxXCRWaZ3M/5uVk4xXOqJax1IlnA4nlu+3N0orF5ipRwd7BfmQekiYyp69m9SJA=="},"version":"0.1"}', 133 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","c0ce9130ca365bb02418d4305ea1d29e49c3f0e96d44b9d3cb6b4b6843d25065":"17","6dadcd7ab23ece757d6990ce237bdebb68b2df0281c78cc1483d913318112162":"18"},"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","6e218e5d129105c20ac499307b260eb76bb2e753f6c319e17efdb848675c5fa2":"20","75f306bd520b483e86a1b436d94159020197df0155ab9058fb86586925223dc7":"21"},"data":"IQ7JDd3Yo3FJ+XLNiJRoIHxxFoR7yG6GBQUO+nDkTxEBQz9m7JAuHaP3S7Jz4NjZIzMKdw15CsV7bowAvZZ0ronJVhulfxFACG+IjseS9sWdX95nX3eWUywbC8JrNvX3ggo9xgDa38czKNb1bpgk29bJbnWmd0xEo/kSRPab2Ng9RYQqLmdhaAO13tgZOph8KkuuGS8Cdr4k0PyDpboaPlEMhdb0RXF4J0E1N2HRclOnuyd0D9NiHiTIM72Ne9SAsKtnNI0z1uZxxXyWMVT8JGJC8plm6F9DHas4KM5OaKfQ4zv5VqYwtqa2/msHs4sFE8Yqf2/qsDtk3e8RSzm368ee2RMQBimrd97AiOw7rc8G2hu84wBH8g59Dro9Ycm+S6uBjmR8LYlpdKJNDLchtBJmxbqKp14GhCfWLrrbzsxaIOVomzdmkq2tFE1nmU2aDQhHRh8c5PgrgTZ3VnDQUJ+JkLpzDhOmSw+Tmo7GcHkdYIhcjIW4pdvKf6hIl+V8Qj0lY01pV8CxnFXeqjBkk3IHIiNBTpNB5xwNUWDTX/aZLKngSkuxXaNKTpsXfS+gZPQmBOV9hgckkkUUY9Yhn1Md2kUyem/sCjWIz1IOBrE1ViXrmNNpKG0ryhgucdz7d2CQzHmmEdUEggx44SCr18MMByIkgidlN2eU28/lAZLQODB710rta65RWarXqhdWmbQ3/bWjmG79u3LP35vWicXw3lC6BRI2stJYyBG7pBW+m6wnbwWZv4XkQ6FiHIhBgb/nroiA7uNyhTTqsyDZa1w/nfftL4wive3jn3lL9Js724PR9tJ8aIDr/aHdULluAmzFGOXbiJKnwVnRexoq8wBEIHjaPAyuXpITpfbIW9wmxkrTIzPn79ptPV50DWmY5ulLjolTJPKveENk5kP25oX6SrcO6YlwrbBP2p1sYG5D1HzDIuBsb1UDV1eqSvsyrz8ENFogD5HCjkYYH65FYOeHzZtgod4EJz0kDZISuVYoU5dg0uY98LTvVR3DbD6gEdwnB62DNXNj2gzlbrALN867n70fYdaRcCItCq5gEH4Qq/eDsCn95IhUBIXZwnQJmEHN1ZpcuZmpwYpni0ZERzqeW8bPRabBRCdBtAhenlgi8gXhQzooIjPKCTepQ5lFzms/qt1G4I+szZ43B3tGgUDa+3HOD77mdGLETGMJ0Gh3MrD7lCNTcivwwytZX1B3JSjxxaN3Yjr73FjVUC1MO0kRETQgHLGomDD4wlSjqQ0VoMQ1OLb+5VNxxU2piPqz3GzYAPdOTHNYynDe9ec1sGTFRUdTNkUjhjPuHfC7eUiWadNm3IPWm3XY0Cyx/DvChiAhe3w60oRgxd2mJEH5wJSwr9J9hthLFTPydTu5TCW0oj0xXXDsns16DpI+eBMWdmqH0di+6jd67W6bpEtJw+4ntN/PmdWbSYKregQvgGbehZPxls2zX3kf7kdfnWBQ7qanq5+w7JmjVJuey6jc34X5E7v2WZJwn0l8VGGOjHmTkWUqzKPCi6OakxwRteqYhM9r7mbfq8oxsQTCNaPEE8B5pYsnWvJUQrNtXY/ERzpvvipTJlYTWGywVCha3ir4hh2jfuF6kkFYz/mjKA7lOR3jHFmdy1coCpNtb/YsMu6WaKLWA1Ifb1clsBYDL0pKqWOxvxZJmNamHMxdythwv/0FEavpEKTiuyp7OfmR85gjdl5+DOqV8kqvGRHy2j7ipurOxD6Qvc4DfCWZ2l0eDXSFvzA0opj/+bAIwx1QELSWjNkq3rxA2/8Lam9RUL3l9qk9MPc3DoWSsBZhx38NgHiy+f1zdwNdsq8QotkgO3ToclcPX/h3Rr54q9QAuLY9+KGbt7JxSU4tCvh5V83AQUtvAbHhANYVxjF968XUcxzprHR/49Vd2+OGGjIM3ttK9y2n9fmA/qDXL4UDM8W2VA2Xw8YnfsK4VuN8Yw0uRbriSI6sPk2bbVh6k+0imZEcB8L/7E0AVHC/iuknTTEpVM9x7xR+ykQveQxaMSt0HFI4bUqJAkYkpkfG2I1+LcVAj0sBiaXpL1H3Tvat+/WyLQn7yPTcfBm+JarrgsyKjTa/jKzIy5rz7a2P3VIXESE+gMoT3BBQ1+xFCjtwjChLBaFw+1iVVTSSVo6UyLq+3jgGsys8vriNq4eEpCHW6H37+DyxYZAVTfaiOOIU4YE6z5gcbXDKAxtgBSOf6wNc2yfzwSp9qeECpB/y3R8EO2CsGCJ0x8SawqD1dS3IFTmGdGv9DePCTkLUOoLullMYXxdIBY09QrhrzAjkgPy9IRZH614P61wcECrH5wxAGgVMwz2iApwkQ+BrBuOQVezbRGTciRSVZQtwvPM8vh1S/TlFsSjuNUR+AKFYXgpCuXnyOMDXswDErxLjZe/KFs3ttxZYy6lBwklxZ4t6x9WklDaRGW5uMmdP/+qxczbQ+7ilx1R5qcSSfGY8uaeTNEmnLCveD03QlGhigs4bs38saDjij20oIR3kK2YLFHwskthYsNX3CHy+KHaTysEW25g8v3glyOcZsSENb7pUGZl8B8gFychM7rNrIA=="},"preferences":{"data":"fwQt+Wxhev563xviKvItHr3k5MC7ciMmEayJZ7HfwTcWPqaF5Syf1czPlMQiDQzEgWWs4BmQqB0QCDDMi3VyGCrSzAtIMR4afVdRyQ=="},"oneTimePasswords":{"data":"8WhmNFYrgxqzrJwMx+goddfLb2wlXnREHH77BKpL8h4ZalAwNOAt0yoBMECtlnNcve8ufjGAXL80dgUgtqsTn8fpx7+WDL5fNynv5ve9mJq/qgqctQO+pvnLuvs4867NXYInHr84f+t8f0lyfYRQdpDJfem9ECrn5MrpQ1rvwB2PVKcU0f+VPGhu673QeDbqzF+95JfxF9Tnv1PAePL1EGahUYuxTED4y4fcVmsHKl9yZXcsuheM7ecik93cqOVSlnuN+s5c2KWqjgDdLzUjG2dDHcuY97v7JT7Pns4ad5C9i2dYLtNrSHG7QLw6RBS/EnBwGzK+sWFQFCU8u0qSeFb0eGRjvVb9SfIXSeTqAJK3JC+OLAVGiey34jFckykeQjy5nPjhSpqWWhZdpezvZHno3YCXSGkLqbazL6xtesNaZZAbHBKdrwIOuTdhMwArfX/na/gavciFM0zwGb13w6JX3Ar3iTqhnBR20zmv5vcZwIOjf36LSfSNnjT4sWE1Az+FQPmMPQi4ODHfLSJbwYQhwqM5Wq2yXHpKDf/e2RpBZ5JsUkDEyoGmglcLF+pXwk4Mn9LuNOztxXCRWaZ3M/5uVk4xXOqJax1IlnA4nlu+3N0orF5ipRwd7BfmQekiYyp69m9SJA=="},"version":"0.1"}',
137 statistics: 's6W+Nlk1/14i/BN4u7qN8oTc', 134 statistics: 's6W+Nlk1/14i/BN4u7qN8oTc',
138 userDetailsVersion: '0.3', 135 userDetailsVersion: '0.3',
139 records: { 136 records: {
140 '062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80': { 137 '062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80': {
141 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', 138 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',
142 version: '0.2', 139 version: '0.2',
143 creationDate: 'Wed Mar 14 07:46:44 PDT 2007', 140 creationDate: 'Wed Mar 14 07:46:44 PDT 2007',
144 updateDate: 'Wed Mar 14 07:46:44 PDT 2007', 141 updateDate: 'Wed Mar 14 07:46:44 PDT 2007',
145 accessDate: 'Fri Jan 08 12:38:42 PST 2010', 142 accessDate: 'Fri Jan 08 12:38:42 PST 2010',
146 currentVersion: '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3', 143 currentVersion: '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3',
147 versions: { 144 versions: {
148 '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3': { 145 '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3': {
149 header: '####', 146 header: '####',
150 data: 'GCNNIhDQjMJQZGVSf+95fPtU6eOnFWVhuGm86r8WZGVR2Gf2EjbG1OJ0ZIGpZ/AXgirCMpo5AFxJe0Bay8IYg+xmBqMFhwFxzAgJBYCIts+raSaNRipuY8dTEqDxAqD1cChcG8EhSoiFgQ0fG0I7nNEUDJi0pIt4/ygBcwvAhuAenEp9ZW+oQA0+YysPQRqkz3IieFaOoSEbe5/SqpUilV4q1gTVyzNXvrxzxx+rlvEyGFgFN+vgtUZ1NrwlPk4gVksTpylvv6CFaMGEWKhgMG6efo0rJckKosaJTu1pldJdnmMK4EKNMLOd+jZ6pEhEhYyadrA4+zYU5TlmZA6ASzTaps8piSwZodoi9qY0ch2StK4mAbzeEGe2HdfHuAU9Tyq3Ppk3+VfNdKgpQfYrQOiSlXbKzK636tzXTN/gyrfOTHjBrRl117ywibgSX63ayAYNfcLpKotC', 147 data: 'GCNNIhDQjMJQZGVSf+95fPtU6eOnFWVhuGm86r8WZGVR2Gf2EjbG1OJ0ZIGpZ/AXgirCMpo5AFxJe0Bay8IYg+xmBqMFhwFxzAgJBYCIts+raSaNRipuY8dTEqDxAqD1cChcG8EhSoiFgQ0fG0I7nNEUDJi0pIt4/ygBcwvAhuAenEp9ZW+oQA0+YysPQRqkz3IieFaOoSEbe5/SqpUilV4q1gTVyzNXvrxzxx+rlvEyGFgFN+vgtUZ1NrwlPk4gVksTpylvv6CFaMGEWKhgMG6efo0rJckKosaJTu1pldJdnmMK4EKNMLOd+jZ6pEhEhYyadrA4+zYU5TlmZA6ASzTaps8piSwZodoi9qY0ch2StK4mAbzeEGe2HdfHuAU9Tyq3Ppk3+VfNdKgpQfYrQOiSlXbKzK636tzXTN/gyrfOTHjBrRl117ywibgSX63ayAYNfcLpKotC',
151 version: '0.2', 148 version: '0.2',
152 creationDate: 'Wed Mar 14 07:46:44 PDT 2007', 149 creationDate: 'Wed Mar 14 07:46:44 PDT 2007',
153 updateDate: 'Wed Mar 14 07:46:44 PDT 2007', 150 updateDate: 'Wed Mar 14 07:46:44 PDT 2007',
154 accessDate: 'Fri Jan 08 12:38:42 PST 2010' 151 accessDate: 'Fri Jan 08 12:38:42 PST 2010'
155 } 152 }
156 } 153 }
157 }, 154 },
158 '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d': { 155 '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d': {
159 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', 156 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',
160 version: '0.3', 157 version: '0.3',
161 creationDate: 'Fri Oct 17 07:49:20 PDT 2008', 158 creationDate: 'Fri Oct 17 07:49:20 PDT 2008',
162 updateDate: 'Mon Oct 27 00:58:49 PDT 2008', 159 updateDate: 'Mon Oct 27 00:58:49 PDT 2008',
163 accessDate: 'Tue Jan 05 01:16:38 PST 2010', 160 accessDate: 'Tue Jan 05 01:16:38 PST 2010',
164 currentVersion: '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac', 161 currentVersion: '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac',
165 versions: { 162 versions: {
166 '0ae362285f103722abbd046eee2b7d10aeae6a1d05cbaf2081392ce9df882bcf': { 163 '0ae362285f103722abbd046eee2b7d10aeae6a1d05cbaf2081392ce9df882bcf': {
167 header: '####', 164 header: '####',
168 data: 'sG6TUmPSEPFpiJ5YdtghWHmHbvUK63tZCZ+Q5iz2ALas//jN+lZCBhZcjEwPEJskBkK2R0MyAh14wWGh2bBHMjsokgTe+L+x+0c/Zi0epE/IC9gtOBhsTe/hZ2e2xOGF/SbzET3DAAYXvxduZ36f7SvvFnrkkKvpj8wGSdTFcBmzqMb9DL2bRyRCLGLMzE3F1a0q5CufCIRz2TgHm+Uw+kfvvwC7ig/F/5iLW90Ypz3vmEtMEFYFHZ9a8Oh0rsXGfevbMhFqALoywzihQEe/NiB8dwn7GEdYKSQ35rhvZh29ULWOZinqmg0ONe0HYaxx7DbKsVoue57S0CIUlgHLajzHfLfqQg2sFI0OT8TnHsGg0YZ6mM2EdKmEjJiER0cP', 165 data: 'sG6TUmPSEPFpiJ5YdtghWHmHbvUK63tZCZ+Q5iz2ALas//jN+lZCBhZcjEwPEJskBkK2R0MyAh14wWGh2bBHMjsokgTe+L+x+0c/Zi0epE/IC9gtOBhsTe/hZ2e2xOGF/SbzET3DAAYXvxduZ36f7SvvFnrkkKvpj8wGSdTFcBmzqMb9DL2bRyRCLGLMzE3F1a0q5CufCIRz2TgHm+Uw+kfvvwC7ig/F/5iLW90Ypz3vmEtMEFYFHZ9a8Oh0rsXGfevbMhFqALoywzihQEe/NiB8dwn7GEdYKSQ35rhvZh29ULWOZinqmg0ONe0HYaxx7DbKsVoue57S0CIUlgHLajzHfLfqQg2sFI0OT8TnHsGg0YZ6mM2EdKmEjJiER0cP',
169 version: '0.3', 166 version: '0.3',
170 creationDate: 'Fri Oct 17 08:00:31 PDT 2008', 167 creationDate: 'Fri Oct 17 08:00:31 PDT 2008',
171 updateDate: 'Fri Oct 17 08:00:31 PDT 2008', 168 updateDate: 'Fri Oct 17 08:00:31 PDT 2008',
172 accessDate: 'Fri Oct 17 08:00:31 PDT 2008' 169 accessDate: 'Fri Oct 17 08:00:31 PDT 2008'
173 }, 170 },
174 '10f45664bbd979a92f37886f1ecc6e52e49798b16dc997aecd37259ad9b2090e': { 171 '10f45664bbd979a92f37886f1ecc6e52e49798b16dc997aecd37259ad9b2090e': {
175 header: '####', 172 header: '####',
176 data: 'RdKVaV/WWWchrCse3KtcXd47Bfm6IAwjqVUpaxoed3HeunI42AAm7xYYSjeK8edHpbNRJbhobBAX5OZtWIp/HmgkobKM8CIiWxrWz89FqyrbnPD7+fXdtgF2yTax/0sC1l0ibncdOuJKX6U829oPlXCpXIOjlomc4wEEAD/5V6FbORvdZ9IE/ME3LsG2y02cT2tIpx6+R6wC/PKXhZA2UDsTE6R2Op2BtIzpVORZLXsdyAp/4wvWQxq90i9cEpbsVQsMB10JVyNHNsRTFhIlHi9MVCaMxQvcrwRElMj/Y9x3RbsFzSGKqFLqdg7Fn/U+KYkpYtsgHv9hraPIb9lV5FH16+iItU/HBM6FGezIj1ZkoQ+dgjPfSjTZzgzDYwyb', 173 data: 'RdKVaV/WWWchrCse3KtcXd47Bfm6IAwjqVUpaxoed3HeunI42AAm7xYYSjeK8edHpbNRJbhobBAX5OZtWIp/HmgkobKM8CIiWxrWz89FqyrbnPD7+fXdtgF2yTax/0sC1l0ibncdOuJKX6U829oPlXCpXIOjlomc4wEEAD/5V6FbORvdZ9IE/ME3LsG2y02cT2tIpx6+R6wC/PKXhZA2UDsTE6R2Op2BtIzpVORZLXsdyAp/4wvWQxq90i9cEpbsVQsMB10JVyNHNsRTFhIlHi9MVCaMxQvcrwRElMj/Y9x3RbsFzSGKqFLqdg7Fn/U+KYkpYtsgHv9hraPIb9lV5FH16+iItU/HBM6FGezIj1ZkoQ+dgjPfSjTZzgzDYwyb',
177 version: '0.3', 174 version: '0.3',
178 creationDate: 'Fri Oct 17 07:49:20 PDT 2008', 175 creationDate: 'Fri Oct 17 07:49:20 PDT 2008',
179 updateDate: 'Fri Oct 17 07:49:20 PDT 2008', 176 updateDate: 'Fri Oct 17 07:49:20 PDT 2008',
180 accessDate: 'Fri Oct 17 07:54:23 PDT 2008' 177 accessDate: 'Fri Oct 17 07:54:23 PDT 2008'
181 }, 178 },
182 '2fa7b67e569d5e268d2b70b3d4d3a960d7e437e1937bcb324b67d0b9441db8ba': { 179 '2fa7b67e569d5e268d2b70b3d4d3a960d7e437e1937bcb324b67d0b9441db8ba': {
183 header: '####', 180 header: '####',
184 data: 'dpnI2qKjk0+bfyKktw4ZCWf+rWZ12hO5bda39CwD29JH7KtdpLCLe2LoLd+KKF2wOdpDsoI2iTiwRgFpt77e7DoWJABxq/0aaRCVN9XpqZo08iHiYhJyNlIszO8CdEhX+M3AeZqzTnd6fs91VfIEWggvku2Z+jwr0CbclY6FnOcNnS+1fj+W79Z9XC383GOm2ujjfo3SX/fyNQSw8aX+7AgJIRGR9uHK7M1cVfsNNTbmDb/HDgLlYZ1Pqm/9poHpmS7G4HUoRM2/WjI0R6F48dy5s8vZRi11SCnlnj5oRykScJj6wh2DltbCyesiaTpAjP6MQjTXsZzKpaosaQcQClZw+w6hDD2cA54IaBIv2j5KAHyhxDh2ERdwbdnCsDKPz4+zP+fmKfW295d4OY0l1NCSdcY+75HWTmBWRAooZeDTo7AE8m5sRwxewE0Y8J2MLUYsrs7Rl4kbZCiRRHU7cs+us3fq2DVn2OLGEbkRrK3kA9swT9W8ABqINoA79+DmDaIr6TGxe5AlHkCAl5sYAN4g42UX1NKhl4fWI1Scj9O1Ixds/1UUvqzavld0mE2cR9yt6LntjE5sQSAaexvymAJbU5IIM5NTk7NlY7G3PEvAPjcUsL9SGw==', 181 data: 'dpnI2qKjk0+bfyKktw4ZCWf+rWZ12hO5bda39CwD29JH7KtdpLCLe2LoLd+KKF2wOdpDsoI2iTiwRgFpt77e7DoWJABxq/0aaRCVN9XpqZo08iHiYhJyNlIszO8CdEhX+M3AeZqzTnd6fs91VfIEWggvku2Z+jwr0CbclY6FnOcNnS+1fj+W79Z9XC383GOm2ujjfo3SX/fyNQSw8aX+7AgJIRGR9uHK7M1cVfsNNTbmDb/HDgLlYZ1Pqm/9poHpmS7G4HUoRM2/WjI0R6F48dy5s8vZRi11SCnlnj5oRykScJj6wh2DltbCyesiaTpAjP6MQjTXsZzKpaosaQcQClZw+w6hDD2cA54IaBIv2j5KAHyhxDh2ERdwbdnCsDKPz4+zP+fmKfW295d4OY0l1NCSdcY+75HWTmBWRAooZeDTo7AE8m5sRwxewE0Y8J2MLUYsrs7Rl4kbZCiRRHU7cs+us3fq2DVn2OLGEbkRrK3kA9swT9W8ABqINoA79+DmDaIr6TGxe5AlHkCAl5sYAN4g42UX1NKhl4fWI1Scj9O1Ixds/1UUvqzavld0mE2cR9yt6LntjE5sQSAaexvymAJbU5IIM5NTk7NlY7G3PEvAPjcUsL9SGw==',
185 version: '0.3', 182 version: '0.3',
186 creationDate: 'Fri Oct 17 08:00:13 PDT 2008', 183 creationDate: 'Fri Oct 17 08:00:13 PDT 2008',
187 updateDate: 'Fri Oct 17 08:00:13 PDT 2008', 184 updateDate: 'Fri Oct 17 08:00:13 PDT 2008',
188 accessDate: 'Fri Oct 17 08:00:13 PDT 2008' 185 accessDate: 'Fri Oct 17 08:00:13 PDT 2008'
189 }, 186 },
190 '5a17723c34226d8cd663f91b11bfa14979e694e461818113ec8abf7194b46b6b': { 187 '5a17723c34226d8cd663f91b11bfa14979e694e461818113ec8abf7194b46b6b': {
191 header: '####', 188 header: '####',
192 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==', 189 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==',
193 version: '0.3', 190 version: '0.3',
194 creationDate: 'Fri Oct 17 07:59:31 PDT 2008', 191 creationDate: 'Fri Oct 17 07:59:31 PDT 2008',
195 updateDate: 'Fri Oct 17 07:59:31 PDT 2008', 192 updateDate: 'Fri Oct 17 07:59:31 PDT 2008',
196 accessDate: 'Fri Oct 17 07:59:31 PDT 2008' 193 accessDate: 'Fri Oct 17 07:59:31 PDT 2008'
197 }, 194 },
198 '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac': { 195 '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac': {
199 header: '####', 196 header: '####',
200 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==', 197 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==',
201 version: '0.3', 198 version: '0.3',
202 creationDate: 'Mon Oct 27 00:58:49 PDT 2008', 199 creationDate: 'Mon Oct 27 00:58:49 PDT 2008',
203 updateDate: 'Mon Oct 27 00:58:49 PDT 2008', 200 updateDate: 'Mon Oct 27 00:58:49 PDT 2008',
204 accessDate: 'Tue Jan 05 01:16:38 PST 2010' 201 accessDate: 'Tue Jan 05 01:16:38 PST 2010'
205 }, 202 },
206 'b57a2d2ffafa8029123362071c09709bb9192f06a17140440f0e41d22143148f': { 203 'b57a2d2ffafa8029123362071c09709bb9192f06a17140440f0e41d22143148f': {
207 header: '####', 204 header: '####',
208 data: 'PQ53T2Vo2D8PoLI1qNX//jLaVZFTDTYk6geT9+4RoThTxvlJ+beDPnQzgYhd9iASaF9GQEEL8JxsBnNpEPa6JPOY4ndFLmDLyFDKXMprxq1UIbzFV6kFoYAk3uCCCa3UCDzdr1KXB2CiiF9HrilaA+xkm8krAvH8I5kZD+j23gByz5cAFvXg7A77KEURpjujURL65DW5M+ceIjo6OXaPW9VO03xhqGt/M47ayObpoEGJZn+X9C8s0SE5wOXHbn38YZlRI480OMvtDAxbEYUeQKMmzu6lO4Nw5hhOUjoPSLr/i3tmDx3nPcDwnSafx6jyA4y31eW6yazqTEOP5I5ArC5mUrF7mAAiFvbHIsMoF8PLj6MONlRIOZgbf9HzCpFdt8xBrX/TXp3LaSAj2XTWgSTFI2cgmU3qqPyibvIfUsB5cVHQCXi692JpC+B85axJ0FLyMl5w3vq0txlPkf6q+dadPYDaLHGZEmDjkWScA1GM5xPJHWFwqGE7ejgXKG0sMYsMKWYk+F2LEUmMHtEvSlpgJBntvcQ1ZjYQxeu4hg5txu1ykkif6fXgkXF6wn6qu+5caeJeNhWtAB4q7WVD47111woYMdkmX7AnDTXSAQ==', 205 data: 'PQ53T2Vo2D8PoLI1qNX//jLaVZFTDTYk6geT9+4RoThTxvlJ+beDPnQzgYhd9iASaF9GQEEL8JxsBnNpEPa6JPOY4ndFLmDLyFDKXMprxq1UIbzFV6kFoYAk3uCCCa3UCDzdr1KXB2CiiF9HrilaA+xkm8krAvH8I5kZD+j23gByz5cAFvXg7A77KEURpjujURL65DW5M+ceIjo6OXaPW9VO03xhqGt/M47ayObpoEGJZn+X9C8s0SE5wOXHbn38YZlRI480OMvtDAxbEYUeQKMmzu6lO4Nw5hhOUjoPSLr/i3tmDx3nPcDwnSafx6jyA4y31eW6yazqTEOP5I5ArC5mUrF7mAAiFvbHIsMoF8PLj6MONlRIOZgbf9HzCpFdt8xBrX/TXp3LaSAj2XTWgSTFI2cgmU3qqPyibvIfUsB5cVHQCXi692JpC+B85axJ0FLyMl5w3vq0txlPkf6q+dadPYDaLHGZEmDjkWScA1GM5xPJHWFwqGE7ejgXKG0sMYsMKWYk+F2LEUmMHtEvSlpgJBntvcQ1ZjYQxeu4hg5txu1ykkif6fXgkXF6wn6qu+5caeJeNhWtAB4q7WVD47111woYMdkmX7AnDTXSAQ==',
209 version: '0.3', 206 version: '0.3',
210 creationDate: 'Fri Oct 17 07:57:17 PDT 2008', 207 creationDate: 'Fri Oct 17 07:57:17 PDT 2008',
211 updateDate: 'Fri Oct 17 07:57:17 PDT 2008', 208 updateDate: 'Fri Oct 17 07:57:17 PDT 2008',
212 accessDate: 'Fri Oct 17 07:57:17 PDT 2008' 209 accessDate: 'Fri Oct 17 07:57:17 PDT 2008'
213 }, 210 },
214 'b713e0a1e2664ac7bfa7ba887329ea023204d10298973e322983b82b222debf6': { 211 'b713e0a1e2664ac7bfa7ba887329ea023204d10298973e322983b82b222debf6': {
215 header: '####', 212 header: '####',
216 data: 'H3gIieYrH7Oy8LEWCZpl9vGp9qYdHNCoBNGijYqlcfXt+1JYvPj1abPp12xLNrDUHfaOZklU2Ip4tOf0CDNhgAan7LYyPqFoy9ss2f9/5RLcbjwiIwSduySIL322HTAwqlzlBt/qaJdHHPUrczmu0fb7fT+0dO4gCL/e/IjcHLefUUgNPAbpHG0Nv0+4lNwKZkIQM3tLRtfJyFBIgWKcMcP1XMic33kr24rwybR8Pb0CHZrOOvvUiGqyoED3ZTZf1twUDVNXO7MWCAC5dBc6/Mk/vSmbbGhppXAH02N0g8G5qzZfp3UVikls55VNhRYLHByVsgpkbIrKXyZnBPTwzm7qefpYAXDOgO+164L66/Art2FYGqZQRZLuh5r8oF38', 213 data: 'H3gIieYrH7Oy8LEWCZpl9vGp9qYdHNCoBNGijYqlcfXt+1JYvPj1abPp12xLNrDUHfaOZklU2Ip4tOf0CDNhgAan7LYyPqFoy9ss2f9/5RLcbjwiIwSduySIL322HTAwqlzlBt/qaJdHHPUrczmu0fb7fT+0dO4gCL/e/IjcHLefUUgNPAbpHG0Nv0+4lNwKZkIQM3tLRtfJyFBIgWKcMcP1XMic33kr24rwybR8Pb0CHZrOOvvUiGqyoED3ZTZf1twUDVNXO7MWCAC5dBc6/Mk/vSmbbGhppXAH02N0g8G5qzZfp3UVikls55VNhRYLHByVsgpkbIrKXyZnBPTwzm7qefpYAXDOgO+164L66/Art2FYGqZQRZLuh5r8oF38',
217 version: '0.3', 214 version: '0.3',
218 creationDate: 'Fri Oct 17 07:58:00 PDT 2008', 215 creationDate: 'Fri Oct 17 07:58:00 PDT 2008',
219 updateDate: 'Fri Oct 17 07:58:00 PDT 2008', 216 updateDate: 'Fri Oct 17 07:58:00 PDT 2008',
220 accessDate: 'Fri Oct 17 07:58:00 PDT 2008' 217 accessDate: 'Fri Oct 17 07:58:00 PDT 2008'
221 }, 218 },
222 'c4cea1cd88a86b05f48a99896a37967c3456228283a0406331ca9f67c6f29f97': { 219 'c4cea1cd88a86b05f48a99896a37967c3456228283a0406331ca9f67c6f29f97': {
223 header: '####', 220 header: '####',
224 data: '1znWPwc9JwCe7iOFiUd2iGm4xJd+824B4VRqEtzCQkW46tg25RWfo7XagvK46USB7t6pC8WMLU0M/EC47KucsfpWUqHGbseoXT/8g8E8GoLnIsk9qFyJG7LGd1sUvqBgszLZwjWWG3t9zifmpW5nY9GialBYNmeSLS3bg5xDH+eCEilUUfDe7zGuVSuu/XkHacv/DYUst97e+6u44F7H8Kv8dTywJZpqbmveNPeWfCej2aBXdVV616J5lIRaj2uIYuQYG7blYJh9KZ7yLStdPndl6h65hIJpfWo0PM8nLJuo0lWNHz7misrutnmxJEjkwVIZ5YAmqp1Zz3VC8zw4IxkXrC/sPmp4PaNXgKz9ZJRaY2KV69WmHf7BUQ3QneGngbT0tN526SS5qDFwTGiuIlnYGWvTB2jVrbns68n/d8Fps8sSWfJBvvXJUEkaZB+1WqNilOPGXvyJ5k2O/iucFbRlxwlEHDny+AgsbtXZdp8cHQ4C/O4G0mnUMZuS38gn6e2kQ55mUhxKeORM+J6Rx1y4Iiu9KKNbxyS5eBpAlFB4xS/o35CS4g309vyOEhi37F24bpp4pM0xEPG4mcc/IyChHzaHUGEp1IX1ZO/r3ut9RIN2QWrGLUlZV/9rFKpLLAy6BkY/g8VYNrV8PztOL3rqy/qwqNZouONwPw8w8SA=', 221 data: '1znWPwc9JwCe7iOFiUd2iGm4xJd+824B4VRqEtzCQkW46tg25RWfo7XagvK46USB7t6pC8WMLU0M/EC47KucsfpWUqHGbseoXT/8g8E8GoLnIsk9qFyJG7LGd1sUvqBgszLZwjWWG3t9zifmpW5nY9GialBYNmeSLS3bg5xDH+eCEilUUfDe7zGuVSuu/XkHacv/DYUst97e+6u44F7H8Kv8dTywJZpqbmveNPeWfCej2aBXdVV616J5lIRaj2uIYuQYG7blYJh9KZ7yLStdPndl6h65hIJpfWo0PM8nLJuo0lWNHz7misrutnmxJEjkwVIZ5YAmqp1Zz3VC8zw4IxkXrC/sPmp4PaNXgKz9ZJRaY2KV69WmHf7BUQ3QneGngbT0tN526SS5qDFwTGiuIlnYGWvTB2jVrbns68n/d8Fps8sSWfJBvvXJUEkaZB+1WqNilOPGXvyJ5k2O/iucFbRlxwlEHDny+AgsbtXZdp8cHQ4C/O4G0mnUMZuS38gn6e2kQ55mUhxKeORM+J6Rx1y4Iiu9KKNbxyS5eBpAlFB4xS/o35CS4g309vyOEhi37F24bpp4pM0xEPG4mcc/IyChHzaHUGEp1IX1ZO/r3ut9RIN2QWrGLUlZV/9rFKpLLAy6BkY/g8VYNrV8PztOL3rqy/qwqNZouONwPw8w8SA=',
225 version: '0.3', 222 version: '0.3',
226 creationDate: 'Fri Oct 17 08:01:59 PDT 2008', 223 creationDate: 'Fri Oct 17 08:01:59 PDT 2008',
227 updateDate: 'Fri Oct 17 08:01:59 PDT 2008', 224 updateDate: 'Fri Oct 17 08:01:59 PDT 2008',
228 accessDate: 'Mon Oct 27 00:57:58 PDT 2008' 225 accessDate: 'Mon Oct 27 00:57:58 PDT 2008'
229 } 226 }
230 } 227 }
231 }, 228 },
232 '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551': { 229 '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551': {
233 data: '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', 230 data: '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',
234 version: '0.3', 231 version: '0.3',
235 creationDate: 'Wed Mar 14 06:53:11 PDT 2007', 232 creationDate: 'Wed Mar 14 06:53:11 PDT 2007',
236 updateDate: 'Fri Oct 30 10:52:54 PDT 2009', 233 updateDate: 'Fri Oct 30 10:52:54 PDT 2009',
237 accessDate: 'Sat Jan 23 02:24:21 PST 2010', 234 accessDate: 'Sat Jan 23 02:24:21 PST 2010',
238 currentVersion: '933abcdd036332b566a70beba4ae486123475dad2903b00a939c067c34a074f5', 235 currentVersion: '933abcdd036332b566a70beba4ae486123475dad2903b00a939c067c34a074f5',
239 versions: { 236 versions: {
240 '106a1116d22c2395906a346da4d830c7afbd2da9a46210d0b7a11de238016783': { 237 '106a1116d22c2395906a346da4d830c7afbd2da9a46210d0b7a11de238016783': {
241 header: '####', 238 header: '####',
242 data: 'jgDUvByveAFnchBQKhiHGYDNDtj/7Aja2RePMer0FCOkkEu5GRAiLkxA3/DD3eiU+g+mCxnjnOaEIYL1O5o0+JP08XapsblZHTRKfveeFfs6sWwuqEHGYULBaXx4XSfK2B12HgpBwa5aD49489AkuyXi7t/aAXcKKJcLB1sC61DI3NsmajUaXHBi31Sp7nKAUpMuiWyguW0JVfH6KUPqyldVDBTBqHAis37c1qoR6aFHFfGgAfb35+syfmPRgemujMRkj2XO6dbt9zAYlHVSYFp9393rwPZoyBfXMMdDtSTmq7H9qbmx31GecHZlFN3NymtPPDYUbQ9mpPVRbxE9NjtiPrI5eGFvb++OdOx75PKjYjCAPWWFZ+4aryNn+h+yqab7pAuoG03ACVVrAFIOn09g1ssol/vqvalulEf3hAIviedyiNAC9D0UDHtzUwyIiELvR9qouXLZ', 239 data: 'jgDUvByveAFnchBQKhiHGYDNDtj/7Aja2RePMer0FCOkkEu5GRAiLkxA3/DD3eiU+g+mCxnjnOaEIYL1O5o0+JP08XapsblZHTRKfveeFfs6sWwuqEHGYULBaXx4XSfK2B12HgpBwa5aD49489AkuyXi7t/aAXcKKJcLB1sC61DI3NsmajUaXHBi31Sp7nKAUpMuiWyguW0JVfH6KUPqyldVDBTBqHAis37c1qoR6aFHFfGgAfb35+syfmPRgemujMRkj2XO6dbt9zAYlHVSYFp9393rwPZoyBfXMMdDtSTmq7H9qbmx31GecHZlFN3NymtPPDYUbQ9mpPVRbxE9NjtiPrI5eGFvb++OdOx75PKjYjCAPWWFZ+4aryNn+h+yqab7pAuoG03ACVVrAFIOn09g1ssol/vqvalulEf3hAIviedyiNAC9D0UDHtzUwyIiELvR9qouXLZ',
243 version: '0.2', 240 version: '0.2',
244 creationDate: 'Tue Apr 17 10:13:41 PDT 2007', 241 creationDate: 'Tue Apr 17 10:13:41 PDT 2007',
245 updateDate: 'Tue Apr 17 10:13:41 PDT 2007', 242 updateDate: 'Tue Apr 17 10:13:41 PDT 2007',
246 accessDate: 'Tue Apr 17 10:13:41 PDT 2007' 243 accessDate: 'Tue Apr 17 10:13:41 PDT 2007'
247 }, 244 },
248 '111a8a4b6b912b808a93cf5e8785ca223112628d05f0bfc5dfe1eb40cb72ed8a': { 245 '111a8a4b6b912b808a93cf5e8785ca223112628d05f0bfc5dfe1eb40cb72ed8a': {
249 header: '####', 246 header: '####',
250 data: 't524etHmXljCnLC+IM+WPD8Q5VE7wDsSHVNZzFU4hQzk119t/N/vhtfHYz5HgNstU5T8c7h7RHKvFk5f+4ZwgNgDqSH7H2PrH+7/bV8+uuqbe+/3GYOvELjTF7v3xMyYs1B7ruHpT+291HVNZqxajqCl/+9nbG0e5feqNsTXWUTdLzF0szJuCTNr2I+fhxAO0LRVaf8h+MBPYyuBDnfFDuKm899IsgF9YoYRvjaYO69DkElvf4VP2jrXIJsRnGIUfUaIS/wQ54+X4JBZM/9M09MVOw1SVe+cwG+P3xyPUkqnSb77ECo86C0MktzeYFmPnPv2SM2KFA6slctXsyudoaNlReh1k+6no5J5BjaawTfqYjYrAtWSPsuhxYVsZym/X2CVbkz4rMSn+J5Uio9N5uZ6AqgCKdhAJlwzVb3fIIJwvFpVpy/0LMskb7aG2i4eAxwzx1H6rD3Y', 247 data: 't524etHmXljCnLC+IM+WPD8Q5VE7wDsSHVNZzFU4hQzk119t/N/vhtfHYz5HgNstU5T8c7h7RHKvFk5f+4ZwgNgDqSH7H2PrH+7/bV8+uuqbe+/3GYOvELjTF7v3xMyYs1B7ruHpT+291HVNZqxajqCl/+9nbG0e5feqNsTXWUTdLzF0szJuCTNr2I+fhxAO0LRVaf8h+MBPYyuBDnfFDuKm899IsgF9YoYRvjaYO69DkElvf4VP2jrXIJsRnGIUfUaIS/wQ54+X4JBZM/9M09MVOw1SVe+cwG+P3xyPUkqnSb77ECo86C0MktzeYFmPnPv2SM2KFA6slctXsyudoaNlReh1k+6no5J5BjaawTfqYjYrAtWSPsuhxYVsZym/X2CVbkz4rMSn+J5Uio9N5uZ6AqgCKdhAJlwzVb3fIIJwvFpVpy/0LMskb7aG2i4eAxwzx1H6rD3Y',
251 version: '0.2', 248 version: '0.2',
252 creationDate: 'Wed Mar 14 06:53:11 PDT 2007', 249 creationDate: 'Wed Mar 14 06:53:11 PDT 2007',
253 updateDate: 'Wed Mar 14 06:53:11 PDT 2007', 250 updateDate: 'Wed Mar 14 06:53:11 PDT 2007',
254 accessDate: 'Wed Mar 14 07:24:35 PDT 2007' 251 accessDate: 'Wed Mar 14 07:24:35 PDT 2007'
255 }, 252 },
256 '144d6eff3eb5f1cb70c8906741d88018cdeeae3a618ac4066598ad6b04242364': { 253 '144d6eff3eb5f1cb70c8906741d88018cdeeae3a618ac4066598ad6b04242364': {
257 header: '####', 254 header: '####',
258 data: 'NPgSZF0eSOzy0/Ns+15Nz4bjSwh4o7fWYgKgwXLRFrF8y3EdbiOH7AiEmmPrCpT1raeYLWCcDIrRTz+/9uvIrz6kK6BjU2emr8YdyLai+PTCRY0SafWS3QiYixX6DJiKIt0SC2F6dfmSHwNsbfTHilFhVXn6wXTJpWvC+sRzw+h42cYpQp0BoLSuFV7vPz/+wtuQdl28BiBgLzGsrtPud0tPcfldGox6Ia/1SrOPcqUr0tnFlNQiUvPU7N0JZgRNyr1PfpAEhmYRI7aEJidsZ36vGQpE0ZQMmQE/9tLS/InALRZT1YXfMsytf0o3y4QlgJrvRgBL7fGiQOZJpU7igLk15xAwU+OLIaYIbr2xlKDJvndHOcrFoYKry9/A/aZSnEYv79wsaf64bBgIVD2WJGLuSFFmzlFnbg/O4kGTin3A8XBpvFA9V6iCMvnEMkrqxD3Qgf7WhxFE1A==', 255 data: 'NPgSZF0eSOzy0/Ns+15Nz4bjSwh4o7fWYgKgwXLRFrF8y3EdbiOH7AiEmmPrCpT1raeYLWCcDIrRTz+/9uvIrz6kK6BjU2emr8YdyLai+PTCRY0SafWS3QiYixX6DJiKIt0SC2F6dfmSHwNsbfTHilFhVXn6wXTJpWvC+sRzw+h42cYpQp0BoLSuFV7vPz/+wtuQdl28BiBgLzGsrtPud0tPcfldGox6Ia/1SrOPcqUr0tnFlNQiUvPU7N0JZgRNyr1PfpAEhmYRI7aEJidsZ36vGQpE0ZQMmQE/9tLS/InALRZT1YXfMsytf0o3y4QlgJrvRgBL7fGiQOZJpU7igLk15xAwU+OLIaYIbr2xlKDJvndHOcrFoYKry9/A/aZSnEYv79wsaf64bBgIVD2WJGLuSFFmzlFnbg/O4kGTin3A8XBpvFA9V6iCMvnEMkrqxD3Qgf7WhxFE1A==',
259 version: '0.2', 256 version: '0.2',
260 creationDate: 'Wed Mar 14 07:33:00 PDT 2007', 257 creationDate: 'Wed Mar 14 07:33:00 PDT 2007',
261 updateDate: 'Wed Mar 14 07:33:00 PDT 2007', 258 updateDate: 'Wed Mar 14 07:33:00 PDT 2007',
262 accessDate: 'Tue Apr 17 10:12:56 PDT 2007' 259 accessDate: 'Tue Apr 17 10:12:56 PDT 2007'
263 }, 260 },
264 '191d456526b14fc5b4ff11b3f856c9568562bbc68435700a2fef0d176482edda': { 261 '191d456526b14fc5b4ff11b3f856c9568562bbc68435700a2fef0d176482edda': {
265 header: '####', 262 header: '####',
266 data: '9rcbGeLFjW1cwULSScOa5zfb9BZqoSi8IvarxwjLVz+4VqApsBZnwJsxJHq/L9zV3SRYlAQRRLNy3lhpO/fJAOg4RNp68KdtA+IZfCsn1MzwfOoBrnTTELPKxDim4US9xQNdJp5ffWoLB8demEL2YkSNTrPVr5crvVPyepuRCzdqUoe6Dba05tR6Ju7/+d9K/cfJg+KI/ziSUSVlOTsIahGkipvMwYzhCOqjljJvdeF6XLLCh7F70lFvpW5vtv5jNmpkgvAhfxgovIZ3tav0WDc+DEdFNHNsCtFhwRYsb1dH5Ry01M8g4vS7PDkuCNYOvjL9bS2Wmy/lVulM9dYdB/d/gKWTjbqgre/IR1TPPdtfiVBo2J9PUvM8P/c2LmQrf63OwjWT74N0D7q/NuVn1KXzREQiyMi6ezzujzJolpNVUNkJFlnSHl+EqnfFiiR5ALZ7Nts4uWLe4Vpn0XmyvHoAVDBK3fw7e3n0tIG4x6k95guIWRKdDpYLOTHOe9jKJbc6KxdGmt21/5pX4KdeWavwirKRcXW6ReJIOVF+KREEZZOGWu7UKWgqgdaMuvxO472zzXzxTBvnpOmnxl/oIkhs23OPxHEwHXX8gXnyA60hd2tthCfmzfI48wWkO40cUTFnqO8htWRXwbUa9gYTjYWDTmoIyK9AgO+PfBLNqx3JzJYAymDcw39ItO2lIcEBkZ4=', 263 data: '9rcbGeLFjW1cwULSScOa5zfb9BZqoSi8IvarxwjLVz+4VqApsBZnwJsxJHq/L9zV3SRYlAQRRLNy3lhpO/fJAOg4RNp68KdtA+IZfCsn1MzwfOoBrnTTELPKxDim4US9xQNdJp5ffWoLB8demEL2YkSNTrPVr5crvVPyepuRCzdqUoe6Dba05tR6Ju7/+d9K/cfJg+KI/ziSUSVlOTsIahGkipvMwYzhCOqjljJvdeF6XLLCh7F70lFvpW5vtv5jNmpkgvAhfxgovIZ3tav0WDc+DEdFNHNsCtFhwRYsb1dH5Ry01M8g4vS7PDkuCNYOvjL9bS2Wmy/lVulM9dYdB/d/gKWTjbqgre/IR1TPPdtfiVBo2J9PUvM8P/c2LmQrf63OwjWT74N0D7q/NuVn1KXzREQiyMi6ezzujzJolpNVUNkJFlnSHl+EqnfFiiR5ALZ7Nts4uWLe4Vpn0XmyvHoAVDBK3fw7e3n0tIG4x6k95guIWRKdDpYLOTHOe9jKJbc6KxdGmt21/5pX4KdeWavwirKRcXW6ReJIOVF+KREEZZOGWu7UKWgqgdaMuvxO472zzXzxTBvnpOmnxl/oIkhs23OPxHEwHXX8gXnyA60hd2tthCfmzfI48wWkO40cUTFnqO8htWRXwbUa9gYTjYWDTmoIyK9AgO+PfBLNqx3JzJYAymDcw39ItO2lIcEBkZ4=',
267 version: '0.3', 264 version: '0.3',
268 previousVersion: '6ca08e08104f73943447eba327c8d0bdab3ab9a01fabec1bd4734b52034a9544', 265 previousVersion: '6ca08e08104f73943447eba327c8d0bdab3ab9a01fabec1bd4734b52034a9544',
269 previousVersionKey: 'RDzOj7LWZcdVg5KmmIT5VXM0cUFeC9tC3n0IXDfNpj12cq0w3k1rpBYbt4eSEkOcdM7Va07FPNdZY4Pd65xBo2MGc56Ka1pX3wW4jTxz350qtw==', 266 previousVersionKey: 'RDzOj7LWZcdVg5KmmIT5VXM0cUFeC9tC3n0IXDfNpj12cq0w3k1rpBYbt4eSEkOcdM7Va07FPNdZY4Pd65xBo2MGc56Ka1pX3wW4jTxz350qtw==',
270 creationDate: 'Fri Sep 11 05:54:50 PDT 2009', 267 creationDate: 'Fri Sep 11 05:54:50 PDT 2009',
271 updateDate: 'Fri Sep 11 05:54:50 PDT 2009', 268 updateDate: 'Fri Sep 11 05:54:50 PDT 2009',
272 accessDate: 'Fri Sep 11 05:54:50 PDT 2009' 269 accessDate: 'Fri Sep 11 05:54:50 PDT 2009'
273 }, 270 },
274 '1ae171ac58981896484c222ab42373b0b6bc3d054dd56faebdc9018f3abbf549': { 271 '1ae171ac58981896484c222ab42373b0b6bc3d054dd56faebdc9018f3abbf549': {
275 header: '####', 272 header: '####',
276 data: '0ck0NbHAOYieUs5c1U6xSMf3pj743aIv1nnBnB7f4vsvKpMiYleQwr4SwY1W6vhg+3sLnO9C0CCD8Brt4V1wScz/STp4oB3hoy31W4dsAFsUyAWFJ8MrYDsZW3jotIPVbMKxu+4Yp051iDPcFKimDhfAu1zVyiVE9llNj3tP6d9gukUNfGZ5CvFmEXcheHB8t81Z2tgeO70EELFUn7uqKJwh5xCqTeogPtsifmCjgx8Yo6hi19vl2TDAaX0HquFO3WcIAL185tzYZ5rU23BYwxD7hVfan7lngSVq614MsEB3EX9WiHRoissSSajNkKTlTW8zsNj3VlUXKMQiJ2aA9Pi+/Yt9sNAbmyTl6T5TNN4QSquLPLyxO4p+OIjra1WPdmVsCti7fOyGirogfJF0XhZg4imvGXK0c6lPZIlg/OEnoDSTiHXlOYpSgaEw1Js5HZ+390XY0KYPtpsZlY+oeVS4p29HN7x3CEairuIldEsZrk4whiVcwzlnmw3n8wiewumus4eRh9w0CIwJELKeMiz5cX4bX8+AKS+u8O1W0GwKlEGTj/joA/M=', 273 data: '0ck0NbHAOYieUs5c1U6xSMf3pj743aIv1nnBnB7f4vsvKpMiYleQwr4SwY1W6vhg+3sLnO9C0CCD8Brt4V1wScz/STp4oB3hoy31W4dsAFsUyAWFJ8MrYDsZW3jotIPVbMKxu+4Yp051iDPcFKimDhfAu1zVyiVE9llNj3tP6d9gukUNfGZ5CvFmEXcheHB8t81Z2tgeO70EELFUn7uqKJwh5xCqTeogPtsifmCjgx8Yo6hi19vl2TDAaX0HquFO3WcIAL185tzYZ5rU23BYwxD7hVfan7lngSVq614MsEB3EX9WiHRoissSSajNkKTlTW8zsNj3VlUXKMQiJ2aA9Pi+/Yt9sNAbmyTl6T5TNN4QSquLPLyxO4p+OIjra1WPdmVsCti7fOyGirogfJF0XhZg4imvGXK0c6lPZIlg/OEnoDSTiHXlOYpSgaEw1Js5HZ+390XY0KYPtpsZlY+oeVS4p29HN7x3CEairuIldEsZrk4whiVcwzlnmw3n8wiewumus4eRh9w0CIwJELKeMiz5cX4bX8+AKS+u8O1W0GwKlEGTj/joA/M=',
277 version: '0.3', 274 version: '0.3',
278 previousVersion: 'dac2ca240227fdf7a08fedbc998c49ee7b6fd622bb8404e804c5dc7f439bf8fd', 275 previousVersion: 'dac2ca240227fdf7a08fedbc998c49ee7b6fd622bb8404e804c5dc7f439bf8fd',
279 previousVersionKey: 'moIwxP20kmN6f/+pgb8pJNqsLUz8Qo2BvcAFnXBmiX2E4oL1pakM9iq0e3IAiNLApmID2TwyAxhsmKj422R9uWXsUFd84LRRt6lMKa3/u1dC1w==', 276 previousVersionKey: 'moIwxP20kmN6f/+pgb8pJNqsLUz8Qo2BvcAFnXBmiX2E4oL1pakM9iq0e3IAiNLApmID2TwyAxhsmKj422R9uWXsUFd84LRRt6lMKa3/u1dC1w==',
280 creationDate: 'Sun Oct 04 14:05:10 PDT 2009', 277 creationDate: 'Sun Oct 04 14:05:10 PDT 2009',
281 updateDate: 'Sun Oct 04 14:05:10 PDT 2009', 278 updateDate: 'Sun Oct 04 14:05:10 PDT 2009',
282 accessDate: 'Fri Oct 30 10:52:36 PDT 2009' 279 accessDate: 'Fri Oct 30 10:52:36 PDT 2009'
283 }, 280 },
284 '1f1bdb7a21440ac20c6d913d676aa30dc360252d27059e77df51a1be36b2e263': { 281 '1f1bdb7a21440ac20c6d913d676aa30dc360252d27059e77df51a1be36b2e263': {
285 header: '####', 282 header: '####',
286 data: 'TaOHH6IoHPKLLoyLyvsBszgsPPcDs6CiLVXzXuXjFSTrhPxzUw9suSsisgDRRs0ncjZ6BCyqoCxMnw6QVvGN4viUwYVR8AWdCg0NMQZ+LkNfq/2WN0M3KyASI8sIdMCwTb57NzOn9soB1HmmmETZfjr7HpY2cc+lS5/4f5rxI8XTEK60lLed+aEuJamAjeZUdgIyu30mMKKjxPfY3Y9iWMwn1OD0zF0mAW+hyEoMhhK7EYlWKCy+4qN0QM+yNFXQyERb04o2n4XrM+qr9df1GtbQMH8igK5VzXIrKjdHjKoLo9G7D7mfx6mRLsmoAJuE0R8gyzotgdBpOgWasHJ82iWEa1dLRKBHJ1d0Lnumv22tvYfasx2DIR5Tmx3kIQ3hFieLSXq48cYMiaZH/IbLiapIOlMgtWDow8JuySBLei/8FAV8jCxSc1Ui/SjbuK/kCvywaSOhDVIxGw==', 283 data: 'TaOHH6IoHPKLLoyLyvsBszgsPPcDs6CiLVXzXuXjFSTrhPxzUw9suSsisgDRRs0ncjZ6BCyqoCxMnw6QVvGN4viUwYVR8AWdCg0NMQZ+LkNfq/2WN0M3KyASI8sIdMCwTb57NzOn9soB1HmmmETZfjr7HpY2cc+lS5/4f5rxI8XTEK60lLed+aEuJamAjeZUdgIyu30mMKKjxPfY3Y9iWMwn1OD0zF0mAW+hyEoMhhK7EYlWKCy+4qN0QM+yNFXQyERb04o2n4XrM+qr9df1GtbQMH8igK5VzXIrKjdHjKoLo9G7D7mfx6mRLsmoAJuE0R8gyzotgdBpOgWasHJ82iWEa1dLRKBHJ1d0Lnumv22tvYfasx2DIR5Tmx3kIQ3hFieLSXq48cYMiaZH/IbLiapIOlMgtWDow8JuySBLei/8FAV8jCxSc1Ui/SjbuK/kCvywaSOhDVIxGw==',
287 version: '0.2', 284 version: '0.2',
288 creationDate: 'Wed Mar 14 07:26:35 PDT 2007', 285 creationDate: 'Wed Mar 14 07:26:35 PDT 2007',
289 updateDate: 'Wed Mar 14 07:26:35 PDT 2007', 286 updateDate: 'Wed Mar 14 07:26:35 PDT 2007',
290 accessDate: 'Wed Mar 14 07:26:35 PDT 2007' 287 accessDate: 'Wed Mar 14 07:26:35 PDT 2007'
291 }, 288 },
292 '30cd48ae2101c0005fdbb57917031ef36c2e5681890f212a95a2863463369043': { 289 '30cd48ae2101c0005fdbb57917031ef36c2e5681890f212a95a2863463369043': {
293 header: '####', 290 header: '####',
294 data: 'jt/CbXS+TEjH/jPrstH7cQZGK3yse470grrhdAOdWoGVtFMmL7fMJZQOKm5IQSrMHFEsH3PoSs99Rr4ui/u71vUb6s/TIsjyv7yihnCYVsOEJOPcnL2wynciILV8p48Lky1wGztW+oSynYOG0CGYDofFhF/MNCBsG1EcTqW7Cf+8rUiS4nA4ZRZVv3HsZp6rCabJsAoK1pmf5tXGJHPjS6xdy1A9ea4bV5Gad0pu8IXvjbZTrDymHem0t8C+oZ7uJ/mG9cFVcNykXoO/TDP0goD6KvTqtdY3VWNNTAERycAW6jFtdMv2W/AFNmnYatZ+EbSbj6/RyGaNnRv/ceBitMh73HRr1EVtZw0wPthMBXwnlPbpkfUwWPBHYpwImligm62/6YBhxDgnMZta7TSi8apT', 291 data: 'jt/CbXS+TEjH/jPrstH7cQZGK3yse470grrhdAOdWoGVtFMmL7fMJZQOKm5IQSrMHFEsH3PoSs99Rr4ui/u71vUb6s/TIsjyv7yihnCYVsOEJOPcnL2wynciILV8p48Lky1wGztW+oSynYOG0CGYDofFhF/MNCBsG1EcTqW7Cf+8rUiS4nA4ZRZVv3HsZp6rCabJsAoK1pmf5tXGJHPjS6xdy1A9ea4bV5Gad0pu8IXvjbZTrDymHem0t8C+oZ7uJ/mG9cFVcNykXoO/TDP0goD6KvTqtdY3VWNNTAERycAW6jFtdMv2W/AFNmnYatZ+EbSbj6/RyGaNnRv/ceBitMh73HRr1EVtZw0wPthMBXwnlPbpkfUwWPBHYpwImligm62/6YBhxDgnMZta7TSi8apT',
295 version: '0.3', 292 version: '0.3',
296 previousVersion: 'cd3479e91eedabe34a1b76f0f26c69d7612672281bcf5d682a787a48caa66521', 293 previousVersion: 'cd3479e91eedabe34a1b76f0f26c69d7612672281bcf5d682a787a48caa66521',
297 previousVersionKey: '8BbhE8C41VX8B8m3TbfLz4bgSfE01IAUl8Zlu2YFdEhpw1erqInN1eRE6WLyBB5MxckmJpbn6VSizqbFbi/3Id5p/fibHKmbmNp6xu7iIo5zzA==', 294 previousVersionKey: '8BbhE8C41VX8B8m3TbfLz4bgSfE01IAUl8Zlu2YFdEhpw1erqInN1eRE6WLyBB5MxckmJpbn6VSizqbFbi/3Id5p/fibHKmbmNp6xu7iIo5zzA==',
298 creationDate: 'Fri May 22 03:30:43 PDT 2009', 295 creationDate: 'Fri May 22 03:30:43 PDT 2009',
299 updateDate: 'Fri May 22 03:30:43 PDT 2009', 296 updateDate: 'Fri May 22 03:30:43 PDT 2009',
300 accessDate: 'Fri May 22 03:31:39 PDT 2009' 297 accessDate: 'Fri May 22 03:31:39 PDT 2009'
301 }, 298 },
302 '6ca08e08104f73943447eba327c8d0bdab3ab9a01fabec1bd4734b52034a9544': { 299 '6ca08e08104f73943447eba327c8d0bdab3ab9a01fabec1bd4734b52034a9544': {
303 header: '####', 300 header: '####',
304 data: 'XKsPGp4MeuvDrgikcjbMnmw/Gz74sTfyP3lLylbrtEZJ3aGSjRvE7s9o3Ya9GKRhYxNQ0dXT0vM6xIE6r/dMt8PwU+/5dNtRhCGPAHvKmEEGb6EBwR7gUDxQLyFTAYX8ut+CpyNJLQa2pHoEl5aNUTjk6blYrKp0GHKt2Q3PZrjIn78rcOLcKY5bx4OK0h9rN0G8mOFQ0g29knKyaykv8dja/Uy5XBeshKnVT7YRHk1nRuwz69ZcX+1Z2qzfw5sxJx+fDK+otWVpjzDP02qqn7ju/r3GgSnW8p/ghBeurUCLdQiS+fFAevhOwCkZGjPMntG3Q4qVt42VxIiiuvfShdaSsNMOW9Uziew3XwOYL9mNIOSdPSjtry4sKrAh3XNmfuJjWTy+69Iyi85CtQ6xMFilANgSBfTqThUePCrEkv9ZBbvpRovuuljlxqZ3gUmtvwy9a3ACAr8SMGWX0ydQjKyvZhoGRCBM+ZC7zCe/JmIpdklvNd/+HqUgS2iAnf3CeH4gUPQVizFR04Ysgj00xO6v4bdY2bYVKIxunygBGNzySi8DeSREu/rUKWgx0KY7S+Gg/jqFMYpE9oy8CxUCmSLeNrnxUgprPqKrr72yue0kBGVoYyJwhXo4MG+LPV0rtVp8b2GeHE9fYmyEZO2Ke93SrHjezS6CnWQsvjYsFYCLdLtEGwo3mpS46DF69LlO53k=', 301 data: 'XKsPGp4MeuvDrgikcjbMnmw/Gz74sTfyP3lLylbrtEZJ3aGSjRvE7s9o3Ya9GKRhYxNQ0dXT0vM6xIE6r/dMt8PwU+/5dNtRhCGPAHvKmEEGb6EBwR7gUDxQLyFTAYX8ut+CpyNJLQa2pHoEl5aNUTjk6blYrKp0GHKt2Q3PZrjIn78rcOLcKY5bx4OK0h9rN0G8mOFQ0g29knKyaykv8dja/Uy5XBeshKnVT7YRHk1nRuwz69ZcX+1Z2qzfw5sxJx+fDK+otWVpjzDP02qqn7ju/r3GgSnW8p/ghBeurUCLdQiS+fFAevhOwCkZGjPMntG3Q4qVt42VxIiiuvfShdaSsNMOW9Uziew3XwOYL9mNIOSdPSjtry4sKrAh3XNmfuJjWTy+69Iyi85CtQ6xMFilANgSBfTqThUePCrEkv9ZBbvpRovuuljlxqZ3gUmtvwy9a3ACAr8SMGWX0ydQjKyvZhoGRCBM+ZC7zCe/JmIpdklvNd/+HqUgS2iAnf3CeH4gUPQVizFR04Ysgj00xO6v4bdY2bYVKIxunygBGNzySi8DeSREu/rUKWgx0KY7S+Gg/jqFMYpE9oy8CxUCmSLeNrnxUgprPqKrr72yue0kBGVoYyJwhXo4MG+LPV0rtVp8b2GeHE9fYmyEZO2Ke93SrHjezS6CnWQsvjYsFYCLdLtEGwo3mpS46DF69LlO53k=',
305 version: '0.3', 302 version: '0.3',
306 previousVersion: '7c80cac9c8b9b5f0f533dd3852d89d6be07963eebfbd2081f2ad6d2f2a06b447', 303 previousVersion: '7c80cac9c8b9b5f0f533dd3852d89d6be07963eebfbd2081f2ad6d2f2a06b447',
307 previousVersionKey: 'eEvij0YZ1r+5cNNpleVHE+kjCZlSggZuE+3Kum9b/11JGHTgQ3bY/o5amM+4+FPaiCU0Zd6MWFAI4dPscyvAS9in6WdTOm7z3fQ3uqYAtHghPw==', 304 previousVersionKey: 'eEvij0YZ1r+5cNNpleVHE+kjCZlSggZuE+3Kum9b/11JGHTgQ3bY/o5amM+4+FPaiCU0Zd6MWFAI4dPscyvAS9in6WdTOm7z3fQ3uqYAtHghPw==',
308 creationDate: 'Fri Sep 11 05:54:01 PDT 2009', 305 creationDate: 'Fri Sep 11 05:54:01 PDT 2009',
309 updateDate: 'Fri Sep 11 05:54:01 PDT 2009', 306 updateDate: 'Fri Sep 11 05:54:01 PDT 2009',
310 accessDate: 'Fri Sep 11 05:54:01 PDT 2009' 307 accessDate: 'Fri Sep 11 05:54:01 PDT 2009'
311 }, 308 },
312 '70720f026f37b571e9765d27c51d3d60c7be0293c3266f1f987c8de9c6b5c416': { 309 '70720f026f37b571e9765d27c51d3d60c7be0293c3266f1f987c8de9c6b5c416': {
313 header: '####', 310 header: '####',
314 data: 'NYaYljcgfzrlN1DVgrbyj4AeVhXGjXPho3IQwEKD3ZOx/yEZxldCNSyFsrk7PoRB8Q1T/6VV4CGa4HLRSB7QVCrtVqWyu4KbbmFoX8NIQ0H3xv+TSo3S/b3dldUeyW32ScaGbspaf8nFf0CffsgpGusd+kHdiE3gSLJvH9y5j47KgpyyX4TteVzqgez4dcXIs5tdzJq2eUlknwU4651QeKIuRSmRaDRhhOP4yRgUo/qXMlTJFmHviCh+IumvBdmDoPe3Vc1vZ1r8PxpDJLvDoB8GTDE42NhqHfVrew9ym1xlTD9wswwIEikfOyTq3JM857qPOHRqSqthEvr4WHbm1VW5PReIyse0lugGyOzqtCnADp9NvNI440VjaTd4NBQqF7XrRm56+1u1uTdfYGFV5BRiH1KmrM1sxXQ6PlOF9Lou45ALo20xxvJOLKG0RKLMr8gmVT2bNtOSJw==', 311 data: 'NYaYljcgfzrlN1DVgrbyj4AeVhXGjXPho3IQwEKD3ZOx/yEZxldCNSyFsrk7PoRB8Q1T/6VV4CGa4HLRSB7QVCrtVqWyu4KbbmFoX8NIQ0H3xv+TSo3S/b3dldUeyW32ScaGbspaf8nFf0CffsgpGusd+kHdiE3gSLJvH9y5j47KgpyyX4TteVzqgez4dcXIs5tdzJq2eUlknwU4651QeKIuRSmRaDRhhOP4yRgUo/qXMlTJFmHviCh+IumvBdmDoPe3Vc1vZ1r8PxpDJLvDoB8GTDE42NhqHfVrew9ym1xlTD9wswwIEikfOyTq3JM857qPOHRqSqthEvr4WHbm1VW5PReIyse0lugGyOzqtCnADp9NvNI440VjaTd4NBQqF7XrRm56+1u1uTdfYGFV5BRiH1KmrM1sxXQ6PlOF9Lou45ALo20xxvJOLKG0RKLMr8gmVT2bNtOSJw==',
315 version: '0.2', 312 version: '0.2',
316 creationDate: 'Wed Mar 14 07:30:09 PDT 2007', 313 creationDate: 'Wed Mar 14 07:30:09 PDT 2007',
317 updateDate: 'Wed Mar 14 07:30:09 PDT 2007', 314 updateDate: 'Wed Mar 14 07:30:09 PDT 2007',
318 accessDate: 'Wed Mar 14 07:30:09 PDT 2007' 315 accessDate: 'Wed Mar 14 07:30:09 PDT 2007'
319 }, 316 },
320 '739b67f6c1d52093f5c2153b406df90cd8ebf303ddd0d13d825fc946306114d7': { 317 '739b67f6c1d52093f5c2153b406df90cd8ebf303ddd0d13d825fc946306114d7': {
321 header: '####', 318 header: '####',
322 data: 't4ohy1/z6oUzyQLtqQoumRzcLCnaYjL/+WQGwE6yIXaGEhCWywe0aIVusPKLcsfYTCXVU1/dXtuucaZoMw7PMSOUx9awTp14NmShaT/9VKChZf1TLi0CO2jOUGsvO4DHlNAQhJhas431l83F+h5+hrkqX8j5kIhzpwlroGEjkml0fswmmwDyHbSTgVEyErZc+b3V+9oUCwzYvd9ITHh8uWLa6j+GuwZTZAk2FY7Vzoh9K46WO3/qCz1pJ8JVkcffun9alK8qzK0Wp05mMLIrt+WHFFTKrG9zpBkcswkbwhJ5ZnakfYLJ8GPH7fKnAid1FGW0Owms058smDBmFO20HyH+ho7SL80Q689W+Jx0+nkUKvxWtq9BWLW6Z3ClDZOVITeg35gQVr6aRzZ+VZwbAy++', 319 data: 't4ohy1/z6oUzyQLtqQoumRzcLCnaYjL/+WQGwE6yIXaGEhCWywe0aIVusPKLcsfYTCXVU1/dXtuucaZoMw7PMSOUx9awTp14NmShaT/9VKChZf1TLi0CO2jOUGsvO4DHlNAQhJhas431l83F+h5+hrkqX8j5kIhzpwlroGEjkml0fswmmwDyHbSTgVEyErZc+b3V+9oUCwzYvd9ITHh8uWLa6j+GuwZTZAk2FY7Vzoh9K46WO3/qCz1pJ8JVkcffun9alK8qzK0Wp05mMLIrt+WHFFTKrG9zpBkcswkbwhJ5ZnakfYLJ8GPH7fKnAid1FGW0Owms058smDBmFO20HyH+ho7SL80Q689W+Jx0+nkUKvxWtq9BWLW6Z3ClDZOVITeg35gQVr6aRzZ+VZwbAy++',
323 version: '0.3', 320 version: '0.3',
324 previousVersion: '30cd48ae2101c0005fdbb57917031ef36c2e5681890f212a95a2863463369043', 321 previousVersion: '30cd48ae2101c0005fdbb57917031ef36c2e5681890f212a95a2863463369043',
325 previousVersionKey: 'i4e0h4QhuN0B39drNLsOWruy+R64siKHWxc9YXgpoCPitWL/ika1MVCRX7CJC7lH5WD9yzx6l9isAy/Hb3nUIEp97VcFKG4S0gOaZkdWNZ/U5Q==', 322 previousVersionKey: 'i4e0h4QhuN0B39drNLsOWruy+R64siKHWxc9YXgpoCPitWL/ika1MVCRX7CJC7lH5WD9yzx6l9isAy/Hb3nUIEp97VcFKG4S0gOaZkdWNZ/U5Q==',
326 creationDate: 'Fri May 22 03:31:46 PDT 2009', 323 creationDate: 'Fri May 22 03:31:46 PDT 2009',
327 updateDate: 'Fri May 22 03:31:46 PDT 2009', 324 updateDate: 'Fri May 22 03:31:46 PDT 2009',
328 accessDate: 'Mon Jun 15 15:20:17 PDT 2009' 325 accessDate: 'Mon Jun 15 15:20:17 PDT 2009'
329 }, 326 },
330 '7c80cac9c8b9b5f0f533dd3852d89d6be07963eebfbd2081f2ad6d2f2a06b447': { 327 '7c80cac9c8b9b5f0f533dd3852d89d6be07963eebfbd2081f2ad6d2f2a06b447': {
331 header: '####', 328 header: '####',
332 data: 'LDAixBQ/CEqQX35jio3aAXG+Py4wNylXI1mQJ5IDxnpqmkFZfOXCaScpwIkQwQzEOjh9p3cOShzrBm6r234HKxgg0ufFnkTWbQSjCgekfVEqiBFi2rWSj5v6a5LMANLwtCz0b2IPr6Z8LSPddgao7P0nwBdCiKJAnY/uGdvSn67WSFhAUGAIs5ZKIZQf8Zi+cA3hd+Xlv1W/2+OXLaIPTkD1bCuQo5qEiAoOl5mXngWOmQ2kTGpC7Hfkknm/uzDeiZTe8VpGjqKTwB/tl64LU5OD26DMpihnVeQNqMpYndEJO7Yu9Zodv8WMyYmVlrw1UzTB4BLTL337vVm5uBiUjAfJIwJx3b3fXxdEiWFuK8uwOXAO2X9OOKfLPuowOj21B/+zRLum3Dti23IfHab5KwSq72sB/vjpl/KVbcGsWZET4VTCZvO04T6Emjb2UBLFLIgInZ9tqN4RXSKz0Uj4n+pitmFSDleuPtL8EzEESX6FtmT/IVdr5AGNjv93wIk5CgeoK2YiNlpTb+CHbcA5HPn+TH9T4999mWrJh5hxZ1vGYxlAd1AveMCgA3y/Wl+kZKMnUatXPM0deUS1GnzpoRXtI0dUi6J5sOHxeahZL0TQbCbHcKkoaSJklMl5YEVaLXyakO4ATKyNcsPfDQrPvWfra1I59RI3seStv2Q0bs14Zco+0opvKN71R/HxjF/etUU=', 329 data: 'LDAixBQ/CEqQX35jio3aAXG+Py4wNylXI1mQJ5IDxnpqmkFZfOXCaScpwIkQwQzEOjh9p3cOShzrBm6r234HKxgg0ufFnkTWbQSjCgekfVEqiBFi2rWSj5v6a5LMANLwtCz0b2IPr6Z8LSPddgao7P0nwBdCiKJAnY/uGdvSn67WSFhAUGAIs5ZKIZQf8Zi+cA3hd+Xlv1W/2+OXLaIPTkD1bCuQo5qEiAoOl5mXngWOmQ2kTGpC7Hfkknm/uzDeiZTe8VpGjqKTwB/tl64LU5OD26DMpihnVeQNqMpYndEJO7Yu9Zodv8WMyYmVlrw1UzTB4BLTL337vVm5uBiUjAfJIwJx3b3fXxdEiWFuK8uwOXAO2X9OOKfLPuowOj21B/+zRLum3Dti23IfHab5KwSq72sB/vjpl/KVbcGsWZET4VTCZvO04T6Emjb2UBLFLIgInZ9tqN4RXSKz0Uj4n+pitmFSDleuPtL8EzEESX6FtmT/IVdr5AGNjv93wIk5CgeoK2YiNlpTb+CHbcA5HPn+TH9T4999mWrJh5hxZ1vGYxlAd1AveMCgA3y/Wl+kZKMnUatXPM0deUS1GnzpoRXtI0dUi6J5sOHxeahZL0TQbCbHcKkoaSJklMl5YEVaLXyakO4ATKyNcsPfDQrPvWfra1I59RI3seStv2Q0bs14Zco+0opvKN71R/HxjF/etUU=',
333 version: '0.3', 330 version: '0.3',
334 previousVersion: 'f8ffcda2eddd2f6d19c4be17f6f509f1f66fc5d4bff362f402c6addaeb9cf32b', 331 previousVersion: 'f8ffcda2eddd2f6d19c4be17f6f509f1f66fc5d4bff362f402c6addaeb9cf32b',
335 previousVersionKey: '3JAEXzigeX/PwpA42+K/CPSpP40EO/j++M6pB0NF71EfKCApWSWy89flo0KbrckF+mUAjyY2hLYBc/F+Q2vgGNhAZqq0vo3wcUpFjFktqgRZ4A==', 332 previousVersionKey: '3JAEXzigeX/PwpA42+K/CPSpP40EO/j++M6pB0NF71EfKCApWSWy89flo0KbrckF+mUAjyY2hLYBc/F+Q2vgGNhAZqq0vo3wcUpFjFktqgRZ4A==',
336 creationDate: 'Mon Jun 15 15:21:15 PDT 2009', 333 creationDate: 'Mon Jun 15 15:21:15 PDT 2009',
337 updateDate: 'Mon Jun 15 15:21:15 PDT 2009', 334 updateDate: 'Mon Jun 15 15:21:15 PDT 2009',
338 accessDate: 'Fri Sep 11 05:53:23 PDT 2009' 335 accessDate: 'Fri Sep 11 05:53:23 PDT 2009'
339 }, 336 },
340 '88943d709c3ea2442d4f58eaaec6409276037e5a37e0a6d167b9dad9e947e854': { 337 '88943d709c3ea2442d4f58eaaec6409276037e5a37e0a6d167b9dad9e947e854': {
341 header: '####', 338 header: '####',
342 data: 'xI3WXddQLFtLVzxJaZWQaw8wAgSuXLjLnyoNXnFuLecTH0BzU36PatglVh2HK3LM8aDLzzbHILdlLNnJ9CY+YnhmGh8hswF9oKTgq0Wsesgdc20QhSMNFFjmMljY1LSXmcAYK04Q5mIzi6Pe/04DRdj+e4zbe5QI4vEBhp/ohEpxZnNqc4BoX6J0eVf6LA1pwrKWvxzMxorWsJrrr+mn3svdlF437n+MMr89k5sQJogufes2GZ9tTvVZ4247ITxXqxgAhwXtbuIs/A5UqqnNdsxlHfpLKG5KjxB6F0h7TtFA3gkZCve5UmAibBnoBCFaIVWQyVq+VO9iqDm3DeXsK2pepvgIvpSID8Poy+uwN7T95mivAsHG5p7MtgN9KwQzNW3Iu+BfO9FlPBMngSk8L29So2CIXe6lEsXSGEi5Yrgyo6hZi6IkGCXwIQ7TCEMnlQEGyKnnAVik', 339 data: 'xI3WXddQLFtLVzxJaZWQaw8wAgSuXLjLnyoNXnFuLecTH0BzU36PatglVh2HK3LM8aDLzzbHILdlLNnJ9CY+YnhmGh8hswF9oKTgq0Wsesgdc20QhSMNFFjmMljY1LSXmcAYK04Q5mIzi6Pe/04DRdj+e4zbe5QI4vEBhp/ohEpxZnNqc4BoX6J0eVf6LA1pwrKWvxzMxorWsJrrr+mn3svdlF437n+MMr89k5sQJogufes2GZ9tTvVZ4247ITxXqxgAhwXtbuIs/A5UqqnNdsxlHfpLKG5KjxB6F0h7TtFA3gkZCve5UmAibBnoBCFaIVWQyVq+VO9iqDm3DeXsK2pepvgIvpSID8Poy+uwN7T95mivAsHG5p7MtgN9KwQzNW3Iu+BfO9FlPBMngSk8L29So2CIXe6lEsXSGEi5Yrgyo6hZi6IkGCXwIQ7TCEMnlQEGyKnnAVik',
343 version: '0.2', 340 version: '0.2',
344 creationDate: 'Tue Apr 17 10:17:52 PDT 2007', 341 creationDate: 'Tue Apr 17 10:17:52 PDT 2007',
345 updateDate: 'Tue Apr 17 10:17:52 PDT 2007', 342 updateDate: 'Tue Apr 17 10:17:52 PDT 2007',
346 accessDate: 'Fri May 22 03:27:59 PDT 2009' 343 accessDate: 'Fri May 22 03:27:59 PDT 2009'
347 }, 344 },
348 '933abcdd036332b566a70beba4ae486123475dad2903b00a939c067c34a074f5': { 345 '933abcdd036332b566a70beba4ae486123475dad2903b00a939c067c34a074f5': {
349 header: '####', 346 header: '####',
350 data: '8mmpKGrkSqiLyreEtGdKN9EXeb47uEN+XkSXEhdIxkMkmvR0A/AGtKjG1o6bbSXfPzAtfrMfJJxwyhWcRVqcikzc0KwINua4X+1Grf7QG2IOYYFqujmLyCwClGSRaannCAbio7+YI2PlDrlMrwB38RvMde6zrMfZzl2O75nkVX3DH+5IHJpwwYeukTSAu5EQR17oed+xoSHkKCQG3ToTsbnGPwZSGM0D+aiTXVW+PJD8D8LvDEU8i3EHQ9E02+d3dKPV/3FGRDgvwLIIjHU0qX5khYJ9PjqSgAxOhRKFwnG1kJn6NG1rvsXYgefJORElib/xijoCM9EJkUZ9e340WwhfZa1GbV7gLEbVn2aeaLcaTjhtPz9pL9WQOklChvdi/0XaHRrgflHogqC0qUQ63lA2CFOXwR9EXspZIi+zLzgAaEMGN0NlnbGHjAiVz6SVU/RUkh3DkKmMuGNS1n93spVbMMLZgcT5zxBFzT6jARvC8qKaxe9UlbMIH8ZCXMrq26V/sEZrxmPT3FZB+dmmqA9lLEBFEcw927uu1U3kZwXhQArQCN3MbEQ=', 347 data: '8mmpKGrkSqiLyreEtGdKN9EXeb47uEN+XkSXEhdIxkMkmvR0A/AGtKjG1o6bbSXfPzAtfrMfJJxwyhWcRVqcikzc0KwINua4X+1Grf7QG2IOYYFqujmLyCwClGSRaannCAbio7+YI2PlDrlMrwB38RvMde6zrMfZzl2O75nkVX3DH+5IHJpwwYeukTSAu5EQR17oed+xoSHkKCQG3ToTsbnGPwZSGM0D+aiTXVW+PJD8D8LvDEU8i3EHQ9E02+d3dKPV/3FGRDgvwLIIjHU0qX5khYJ9PjqSgAxOhRKFwnG1kJn6NG1rvsXYgefJORElib/xijoCM9EJkUZ9e340WwhfZa1GbV7gLEbVn2aeaLcaTjhtPz9pL9WQOklChvdi/0XaHRrgflHogqC0qUQ63lA2CFOXwR9EXspZIi+zLzgAaEMGN0NlnbGHjAiVz6SVU/RUkh3DkKmMuGNS1n93spVbMMLZgcT5zxBFzT6jARvC8qKaxe9UlbMIH8ZCXMrq26V/sEZrxmPT3FZB+dmmqA9lLEBFEcw927uu1U3kZwXhQArQCN3MbEQ=',
351 version: '0.3', 348 version: '0.3',
352 previousVersion: '1ae171ac58981896484c222ab42373b0b6bc3d054dd56faebdc9018f3abbf549', 349 previousVersion: '1ae171ac58981896484c222ab42373b0b6bc3d054dd56faebdc9018f3abbf549',
353 previousVersionKey: 'gxQ13UMdZF0F7chGySUkuhxxSJ7CU2wubdG0tijs2G9uxYEY6ADjVX6zi3nrft7ggnLM8LyuFtZqj1wMX3pMUsbxZq0v2vfpVaYZ9cN1pahwMQ==', 350 previousVersionKey: 'gxQ13UMdZF0F7chGySUkuhxxSJ7CU2wubdG0tijs2G9uxYEY6ADjVX6zi3nrft7ggnLM8LyuFtZqj1wMX3pMUsbxZq0v2vfpVaYZ9cN1pahwMQ==',
354 creationDate: 'Fri Oct 30 10:52:54 PDT 2009', 351 creationDate: 'Fri Oct 30 10:52:54 PDT 2009',
355 updateDate: 'Fri Oct 30 10:52:54 PDT 2009', 352 updateDate: 'Fri Oct 30 10:52:54 PDT 2009',
356 accessDate: 'Sat Jan 23 02:24:21 PST 2010' 353 accessDate: 'Sat Jan 23 02:24:21 PST 2010'
357 }, 354 },
358 '9588b523f39cdfc14efa1e15ea7716c2d8eac45d8efd7bfeb19d716f9df72d66': { 355 '9588b523f39cdfc14efa1e15ea7716c2d8eac45d8efd7bfeb19d716f9df72d66': {
359 header: '####', 356 header: '####',
360 data: 'q6DKkxhgDFs1XkqOYf6dvojPF+yhJbniTLFpSOS+I1sum3EZIJfYxJXyi2Jx3KOVNBMILw1+vrSLe/fh5SSWj8ZBoeppkPPLjyRNdiUyd4IfcRM5OSv2YcTxCubKCH2kIMFAzY/29A6ZGPG+AN8/kxkEHc1fxKaNcj2Cs8qejNR8yK1iKT1Ut9VfEee+Eqy2Ohgdq8wL/xAD5mUzdqHeQl8BY16pXGIYncLxMzR+EJ8E5jJTuGv3O41UbO31lvBSfCt2pfz2MrtsuqNoI8LBHJkcR6t17Bj+rHZUniHlyxSW/1rQJ1NnwpPgUJ1fhfQJZM8Faoif+0bvWFY4xWs/tCCD7oEvf0xM0I3FfcJLbYX8M+wyO08t9BmGdEjnr3VUcuS9qKaJRpdpMP7aQf+vJvioeQDXdOJ6Ceo3BDFc6JdNta1Qc+agGzN2KPbIPrLDL+08hWl61yu3GQ==', 357 data: 'q6DKkxhgDFs1XkqOYf6dvojPF+yhJbniTLFpSOS+I1sum3EZIJfYxJXyi2Jx3KOVNBMILw1+vrSLe/fh5SSWj8ZBoeppkPPLjyRNdiUyd4IfcRM5OSv2YcTxCubKCH2kIMFAzY/29A6ZGPG+AN8/kxkEHc1fxKaNcj2Cs8qejNR8yK1iKT1Ut9VfEee+Eqy2Ohgdq8wL/xAD5mUzdqHeQl8BY16pXGIYncLxMzR+EJ8E5jJTuGv3O41UbO31lvBSfCt2pfz2MrtsuqNoI8LBHJkcR6t17Bj+rHZUniHlyxSW/1rQJ1NnwpPgUJ1fhfQJZM8Faoif+0bvWFY4xWs/tCCD7oEvf0xM0I3FfcJLbYX8M+wyO08t9BmGdEjnr3VUcuS9qKaJRpdpMP7aQf+vJvioeQDXdOJ6Ceo3BDFc6JdNta1Qc+agGzN2KPbIPrLDL+08hWl61yu3GQ==',
361 version: '0.2', 358 version: '0.2',
362 creationDate: 'Wed Mar 14 07:27:35 PDT 2007', 359 creationDate: 'Wed Mar 14 07:27:35 PDT 2007',
363 updateDate: 'Wed Mar 14 07:27:35 PDT 2007', 360 updateDate: 'Wed Mar 14 07:27:35 PDT 2007',
364 accessDate: 'Wed Mar 14 07:27:35 PDT 2007' 361 accessDate: 'Wed Mar 14 07:27:35 PDT 2007'
365 }, 362 },
366 'c7add675f676c4615a2849d5017ac8db9066265253ffe7e03b34ab8260b10888': { 363 'c7add675f676c4615a2849d5017ac8db9066265253ffe7e03b34ab8260b10888': {
367 header: '####', 364 header: '####',
368 data: 'ZRJXJ72ZBH01gAML0R7n42fI0WjdbVXzyZH7H5MP2RgtGuVvfdadVK9+U8mzdf1Et9DoKrHhZUp9baeREPO/Fk0r2IO8NmKv/8+rMkK6x4qeWnI8ZAJfQemGtqke/VcTn4KGAyTeV8arzXn/whsLpp/xN087NdDw9dP8PLb43Yk8TNC1m2d85FUagSh4NOI3rmcbHAiCOQpqHBPBoJY1Vf4Pxu949TEUm6kT6Rl0n/sb3PSLu4LSa6+WiGZJ4mgE+3XZyfozrJsvGoTYSkim3MTwhrCLEVaDMTq4Ei6FyG+TeV95Q9Ei8HHwBqdp0fxUxavNe67Oo4m+ECiRvZ24b5+Nz6POBjXfn+61yCyIhz3SV3IaYIF3rgXRZA1q2sax8kRGtoG7ONxczUqGyQ5S6Lht', 365 data: 'ZRJXJ72ZBH01gAML0R7n42fI0WjdbVXzyZH7H5MP2RgtGuVvfdadVK9+U8mzdf1Et9DoKrHhZUp9baeREPO/Fk0r2IO8NmKv/8+rMkK6x4qeWnI8ZAJfQemGtqke/VcTn4KGAyTeV8arzXn/whsLpp/xN087NdDw9dP8PLb43Yk8TNC1m2d85FUagSh4NOI3rmcbHAiCOQpqHBPBoJY1Vf4Pxu949TEUm6kT6Rl0n/sb3PSLu4LSa6+WiGZJ4mgE+3XZyfozrJsvGoTYSkim3MTwhrCLEVaDMTq4Ei6FyG+TeV95Q9Ei8HHwBqdp0fxUxavNe67Oo4m+ECiRvZ24b5+Nz6POBjXfn+61yCyIhz3SV3IaYIF3rgXRZA1q2sax8kRGtoG7ONxczUqGyQ5S6Lht',
369 version: '0.3', 366 version: '0.3',
370 previousVersion: '88943d709c3ea2442d4f58eaaec6409276037e5a37e0a6d167b9dad9e947e854', 367 previousVersion: '88943d709c3ea2442d4f58eaaec6409276037e5a37e0a6d167b9dad9e947e854',
371 previousVersionKey: 'ZbGA3id5JTGeRjVUR/LkntSGjPDEbZbNrQxc4SiQDdlDO3dJNVpfRp69PSk6vqEiZ4r/6OKvE+fl2TtPadJQ82fP7WsULtrSkYryQL+CQvz0VA==', 368 previousVersionKey: 'ZbGA3id5JTGeRjVUR/LkntSGjPDEbZbNrQxc4SiQDdlDO3dJNVpfRp69PSk6vqEiZ4r/6OKvE+fl2TtPadJQ82fP7WsULtrSkYryQL+CQvz0VA==',
372 creationDate: 'Fri May 22 03:28:11 PDT 2009', 369 creationDate: 'Fri May 22 03:28:11 PDT 2009',
373 updateDate: 'Fri May 22 03:28:11 PDT 2009', 370 updateDate: 'Fri May 22 03:28:11 PDT 2009',
374 accessDate: 'Fri May 22 03:29:03 PDT 2009' 371 accessDate: 'Fri May 22 03:29:03 PDT 2009'
375 }, 372 },
376 'cd3479e91eedabe34a1b76f0f26c69d7612672281bcf5d682a787a48caa66521': { 373 'cd3479e91eedabe34a1b76f0f26c69d7612672281bcf5d682a787a48caa66521': {
377 header: '####', 374 header: '####',
378 data: '6TAJAQ4qE5l2SybVzeEqQxYZgVow0MKzl8xwfoE0HeuSr8uJlszGas5NaJL1SFI5sDDwIJzbtIBE/yjaNwWw18+JzswIWmkLW+kTIAtJKjNtWnaGlDJMTA4OIo5gj2Vqq4o1VngzMTk/DV6f5ob3/HxN+YpE4r1u2SUVeADbjcyjRmYE9ygvuvQ5AuU3u2hzmstI582kBlksLPGhX6nJfAPCrSkdphNj28T393p5w82/FFCFNHKjgKN/xI3Rotq7rObFaNid1tmHvozKLYeLQQfjglJ2rRDQDTOJONRVJEObDFV5bmaY4z3XljO2nbQ4iMK5CrTFAYTYNph3/WOQWjZHWmAXaHMYvBSlICvF99C530sOGQYIaBWKFuOv/pNuCZh/tBNVcI4pU1dz438/7LQf', 375 data: '6TAJAQ4qE5l2SybVzeEqQxYZgVow0MKzl8xwfoE0HeuSr8uJlszGas5NaJL1SFI5sDDwIJzbtIBE/yjaNwWw18+JzswIWmkLW+kTIAtJKjNtWnaGlDJMTA4OIo5gj2Vqq4o1VngzMTk/DV6f5ob3/HxN+YpE4r1u2SUVeADbjcyjRmYE9ygvuvQ5AuU3u2hzmstI582kBlksLPGhX6nJfAPCrSkdphNj28T393p5w82/FFCFNHKjgKN/xI3Rotq7rObFaNid1tmHvozKLYeLQQfjglJ2rRDQDTOJONRVJEObDFV5bmaY4z3XljO2nbQ4iMK5CrTFAYTYNph3/WOQWjZHWmAXaHMYvBSlICvF99C530sOGQYIaBWKFuOv/pNuCZh/tBNVcI4pU1dz438/7LQf',
379 version: '0.3', 376 version: '0.3',
380 previousVersion: 'ffb687c41ee598b30cf28525024fc18ba96b3d7998fbb298d702311f76ca2127', 377 previousVersion: 'ffb687c41ee598b30cf28525024fc18ba96b3d7998fbb298d702311f76ca2127',
381 previousVersionKey: 'U2Z+xaFl6o4XH/8DktJimjP3+1PaYRf1mZPW0sulAOykDH0LY2U+kbBj+mfNV8rVAJlA7O8LYl8AlUNZUTS+036MiIinpD0Tmhkc91rFkMYgbw==', 378 previousVersionKey: 'U2Z+xaFl6o4XH/8DktJimjP3+1PaYRf1mZPW0sulAOykDH0LY2U+kbBj+mfNV8rVAJlA7O8LYl8AlUNZUTS+036MiIinpD0Tmhkc91rFkMYgbw==',
382 creationDate: 'Fri May 22 03:30:03 PDT 2009', 379 creationDate: 'Fri May 22 03:30:03 PDT 2009',
383 updateDate: 'Fri May 22 03:30:03 PDT 2009', 380 updateDate: 'Fri May 22 03:30:03 PDT 2009',
384 accessDate: 'Fri May 22 03:30:36 PDT 2009' 381 accessDate: 'Fri May 22 03:30:36 PDT 2009'
385 }, 382 },
386 'dac2ca240227fdf7a08fedbc998c49ee7b6fd622bb8404e804c5dc7f439bf8fd': { 383 'dac2ca240227fdf7a08fedbc998c49ee7b6fd622bb8404e804c5dc7f439bf8fd': {
387 header: '####', 384 header: '####',
388 data: 'zqOJI8Qken5hwXQ4MFRzfnB5tnROjMhg9mw+aYwwvI8VV8aADoyPuaRi6bdxy4LP45PqVR9G2iXFT+h/WaBql+rz1AA5AVz54cpd2gdDh8Eec/PJXyL3SfXW1PQoO3bwhW6rkR5cNQf8xKxlmGWLvE88AXT65tV/RdYJE574aVEZexzo/40X60weCl1ZITl8IH97eug5URe1lSBFsy5sjo+SE09FqtnmnGy4O2LL+0XSR7xJqiJihv80msEgk3lTbwUEiGWm3OiDnvLk0GjaMy3+EGV2/rHZuICMJkD4ge6cIBc/h00ZCFnXN4bX+OC/KpEFgtnPgQ+duVpsVNdYmNwxSavyFs/UnFFDTDIPZxEKhRHFTW9zaqu2jVTZd4+/ro6TSYSlEN6F/jtiL06nM/F14Bp/dYuqBZfc+N3vx+72jj6IOKTHtqvlj6jdSZseN8olODT2IGI/fsjR79biVCIOODAaF6DCd32ClvoenCVPTIhMc2AfuKTbleiquk95nN4lgpZbMzrrvWHPJD0oKXHo8X1GJd19QCj+IhzCTx1Ap1JPOTMIG+reaxxwicGjH5Iios5DmA4gjsRWj9BVr+QmMJmY4KTpyRG1lVYovm78VWf0nzyGLNx5sgWrRyYLOI75m0zUdNGDUpKGSyqrIuEwOrI36uRr71MvJ0ui1HXBkDbPIvrQ01UyocO1paeHyTk=', 385 data: 'zqOJI8Qken5hwXQ4MFRzfnB5tnROjMhg9mw+aYwwvI8VV8aADoyPuaRi6bdxy4LP45PqVR9G2iXFT+h/WaBql+rz1AA5AVz54cpd2gdDh8Eec/PJXyL3SfXW1PQoO3bwhW6rkR5cNQf8xKxlmGWLvE88AXT65tV/RdYJE574aVEZexzo/40X60weCl1ZITl8IH97eug5URe1lSBFsy5sjo+SE09FqtnmnGy4O2LL+0XSR7xJqiJihv80msEgk3lTbwUEiGWm3OiDnvLk0GjaMy3+EGV2/rHZuICMJkD4ge6cIBc/h00ZCFnXN4bX+OC/KpEFgtnPgQ+duVpsVNdYmNwxSavyFs/UnFFDTDIPZxEKhRHFTW9zaqu2jVTZd4+/ro6TSYSlEN6F/jtiL06nM/F14Bp/dYuqBZfc+N3vx+72jj6IOKTHtqvlj6jdSZseN8olODT2IGI/fsjR79biVCIOODAaF6DCd32ClvoenCVPTIhMc2AfuKTbleiquk95nN4lgpZbMzrrvWHPJD0oKXHo8X1GJd19QCj+IhzCTx1Ap1JPOTMIG+reaxxwicGjH5Iios5DmA4gjsRWj9BVr+QmMJmY4KTpyRG1lVYovm78VWf0nzyGLNx5sgWrRyYLOI75m0zUdNGDUpKGSyqrIuEwOrI36uRr71MvJ0ui1HXBkDbPIvrQ01UyocO1paeHyTk=',
389 version: '0.3', 386 version: '0.3',
390 previousVersion: '191d456526b14fc5b4ff11b3f856c9568562bbc68435700a2fef0d176482edda', 387 previousVersion: '191d456526b14fc5b4ff11b3f856c9568562bbc68435700a2fef0d176482edda',
391 previousVersionKey: 'zOAbF4q8A+LjWfMMXHRHH2DmzdToA6a2U12y0G6cyAm5tvz1BrrAcgk/5dx0yvFF+ZSxuOOfnvCPVBN2kT75otq44tVEg+FSJ4khcC6HThCluA==', 388 previousVersionKey: 'zOAbF4q8A+LjWfMMXHRHH2DmzdToA6a2U12y0G6cyAm5tvz1BrrAcgk/5dx0yvFF+ZSxuOOfnvCPVBN2kT75otq44tVEg+FSJ4khcC6HThCluA==',
392 creationDate: 'Fri Sep 11 05:56:02 PDT 2009', 389 creationDate: 'Fri Sep 11 05:56:02 PDT 2009',
393 updateDate: 'Fri Sep 11 05:56:02 PDT 2009', 390 updateDate: 'Fri Sep 11 05:56:02 PDT 2009',
394 accessDate: 'Sun Oct 04 14:04:58 PDT 2009' 391 accessDate: 'Sun Oct 04 14:04:58 PDT 2009'
395 }, 392 },
396 'e5b71df0d4d79a195c7ec3288dd7738069837a7c4da3bccc1ebc05d8e4f19d79': { 393 'e5b71df0d4d79a195c7ec3288dd7738069837a7c4da3bccc1ebc05d8e4f19d79': {
397 header: '####', 394 header: '####',
398 data: '1NvK9Y5r0Q880BfB1W5IqdOR77mmqQU0d1GL1XUeQT75R2EgYE9rK1X1jLygCXboPhxzegEe7TDhUsn5XcHN0LkXcLYz8gD/7+He2HiTFxoHd2oQbI3ceBxDJ7+5kWA6Aiqy42QSCuA+TWIQcDVthSyFU7nNdqNxeBYeXiI4jgwcH3xvm0+pBf1OYLtywjUK1JwntP6o68b1LMQJFinDG+sqRcm25ggaZyxDtoLh1IBdSpmXk0papRnyyTGNgsws78dLxnH0Iqxb7FhqYfgLDIvN3i7+IALI0lF0EuTS0hSPlr/1fTz1/6bVt++wI9GpUsrdafUJJMPerXoCK+gAP8EMneLq4f5487HIkwWh1qON6Hvpg+tB95NOSJpqE72VpVxN4+wTQWyDMhfjqXBuQ1wKvTsD/mUsdinU0Wb/YT/zIWBNZPdqur0rjOC+mrOtSdlYSCH89Jj2', 395 data: '1NvK9Y5r0Q880BfB1W5IqdOR77mmqQU0d1GL1XUeQT75R2EgYE9rK1X1jLygCXboPhxzegEe7TDhUsn5XcHN0LkXcLYz8gD/7+He2HiTFxoHd2oQbI3ceBxDJ7+5kWA6Aiqy42QSCuA+TWIQcDVthSyFU7nNdqNxeBYeXiI4jgwcH3xvm0+pBf1OYLtywjUK1JwntP6o68b1LMQJFinDG+sqRcm25ggaZyxDtoLh1IBdSpmXk0papRnyyTGNgsws78dLxnH0Iqxb7FhqYfgLDIvN3i7+IALI0lF0EuTS0hSPlr/1fTz1/6bVt++wI9GpUsrdafUJJMPerXoCK+gAP8EMneLq4f5487HIkwWh1qON6Hvpg+tB95NOSJpqE72VpVxN4+wTQWyDMhfjqXBuQ1wKvTsD/mUsdinU0Wb/YT/zIWBNZPdqur0rjOC+mrOtSdlYSCH89Jj2',
399 version: '0.2', 396 version: '0.2',
400 creationDate: 'Tue Apr 17 10:15:09 PDT 2007', 397 creationDate: 'Tue Apr 17 10:15:09 PDT 2007',
401 updateDate: 'Tue Apr 17 10:15:09 PDT 2007', 398 updateDate: 'Tue Apr 17 10:15:09 PDT 2007',
402 accessDate: 'Tue Apr 17 10:17:01 PDT 2007' 399 accessDate: 'Tue Apr 17 10:17:01 PDT 2007'
403 }, 400 },
404 'f8ffcda2eddd2f6d19c4be17f6f509f1f66fc5d4bff362f402c6addaeb9cf32b': { 401 'f8ffcda2eddd2f6d19c4be17f6f509f1f66fc5d4bff362f402c6addaeb9cf32b': {
405 header: '####', 402 header: '####',
406 data: 'Al9KSfdnvVJW+GPqYbIGXNDb4KefUjtkNTJbk0zlBsyeZc+eoDDLJKy3ukugFfDFDmX+g0U3lp1UIsRQB7JHEZ+NWKPJu/hyvbTmwuVFZUnGEZMhMOIqc6nECN+VFCllxV7QBKpdcRJ3E3fiYP4fV0v8wquOD1dfsMs26f3y2fOQLNS0+UpDe0GoRw2R3+lbot3qlftdO6vb5+LYjZEjdSI/G2fPQ3VsS8N0KLLNVHQxix4xn4Qn78i/ImlxbtyoKNLP4ZIaXZ9ELuGvV+yKaQVOVTwxpJOWKMu1Do55cMwdFjxU7Gid03xEYEaZpClcsrbwdGgkJo2+WnpC/L9G4I9X5L+sVISbO49PaZ9DMdQJAlY5QCIjokPchYUp9Vr9u4KcgbAw9FrLQAMSRLnWhf0bLr0mv2ioTOlQKPFBkTIuMnsyglD856ZYQOIHl48+K5HvUZYZqI5UJjPXdrmzycD/Yxt878pSnkkfeyX0Cr/7Rwfq/zOPN5XJcwsO6j9ubuXjnIos0E/SG1BOKrLY+sE7SXzWOqhpzkApb6ILaGhtHNOHmYAckpPAqCe85g/XPZsmWjsABB64Gwg9oviC2ew/IDXigNXGtY8tbQmAny58QPfRihT5HxCRMFP2pA1Xh2WU1vEXtP8=', 403 data: 'Al9KSfdnvVJW+GPqYbIGXNDb4KefUjtkNTJbk0zlBsyeZc+eoDDLJKy3ukugFfDFDmX+g0U3lp1UIsRQB7JHEZ+NWKPJu/hyvbTmwuVFZUnGEZMhMOIqc6nECN+VFCllxV7QBKpdcRJ3E3fiYP4fV0v8wquOD1dfsMs26f3y2fOQLNS0+UpDe0GoRw2R3+lbot3qlftdO6vb5+LYjZEjdSI/G2fPQ3VsS8N0KLLNVHQxix4xn4Qn78i/ImlxbtyoKNLP4ZIaXZ9ELuGvV+yKaQVOVTwxpJOWKMu1Do55cMwdFjxU7Gid03xEYEaZpClcsrbwdGgkJo2+WnpC/L9G4I9X5L+sVISbO49PaZ9DMdQJAlY5QCIjokPchYUp9Vr9u4KcgbAw9FrLQAMSRLnWhf0bLr0mv2ioTOlQKPFBkTIuMnsyglD856ZYQOIHl48+K5HvUZYZqI5UJjPXdrmzycD/Yxt878pSnkkfeyX0Cr/7Rwfq/zOPN5XJcwsO6j9ubuXjnIos0E/SG1BOKrLY+sE7SXzWOqhpzkApb6ILaGhtHNOHmYAckpPAqCe85g/XPZsmWjsABB64Gwg9oviC2ew/IDXigNXGtY8tbQmAny58QPfRihT5HxCRMFP2pA1Xh2WU1vEXtP8=',
407 version: '0.3', 404 version: '0.3',
408 previousVersion: '739b67f6c1d52093f5c2153b406df90cd8ebf303ddd0d13d825fc946306114d7', 405 previousVersion: '739b67f6c1d52093f5c2153b406df90cd8ebf303ddd0d13d825fc946306114d7',
diff --git a/frontend/gamma/tests/tests/Components/FullApp/index.html b/frontend/gamma/tests/tests/Components/FullApp/index.html
index d42d112..bc00fa7 100644
--- a/frontend/gamma/tests/tests/Components/FullApp/index.html
+++ b/frontend/gamma/tests/tests/Components/FullApp/index.html
@@ -1,243 +1,240 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27--> 24-->
28 25
29<html> 26<html>
30<head> 27<head>
31 <title>Clipperz - online password manager - debug</title> 28 <title>Clipperz - online password manager - debug</title>
32 <meta http-equiv="content-type" content="text/html; charset=utf-8" /> 29 <meta http-equiv="content-type" content="text/html; charset=utf-8" />
33 30
34 31
35 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/clipperz.css" /> 32 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/clipperz.css" />
36 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/compact.css" /> 33 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/compact.css" />
37 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/ytheme-clipperz.css" /> 34 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/ytheme-clipperz.css" />
38 35
39 <link rel="shortcut icon" href="./clipperz.ico" /> 36 <link rel="shortcut icon" href="./clipperz.ico" />
40 37
41 <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." /> 38 <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." />
42 <meta name="keywords" content="password manager,gestor de contraseñas,gerenciador de senhas,Kennwortmanager,passwords,security,privacy,cryptography" /> 39 <meta name="keywords" content="password manager,gestor de contraseñas,gerenciador de senhas,Kennwortmanager,passwords,security,privacy,cryptography" />
43 40
44<script> 41<script>
45 Clipperz_IEisBroken = false; 42 Clipperz_IEisBroken = false;
46 Clipperz_normalizedNewLine = '\n'; 43 Clipperz_normalizedNewLine = '\n';
47 Clipperz_dumpUrl = "/dump/"; 44 Clipperz_dumpUrl = "/dump/";
48</script> 45</script>
49 46
50<!--[if IE]><script> 47<!--[if IE]><script>
51Clipperz_IEisBroken = true; 48Clipperz_IEisBroken = true;
52Clipperz_normalizedNewLine = '\x0d\x0a'; 49Clipperz_normalizedNewLine = '\x0d\x0a';
53</script><![endif]--> 50</script><![endif]-->
54 51
55 52
56 <script type='text/javascript' src='../../../../js/bookmarklet.js'></script> 53 <script type='text/javascript' src='../../../../js/bookmarklet.js'></script>
57 <script type='text/javascript' src='../../../../js/bookmarklet_ie.js'></script> 54 <script type='text/javascript' src='../../../../js/bookmarklet_ie.js'></script>
58 55
59 <script type='text/javascript' src='../../../../js/MochiKit/Base.js'></script> 56 <script type='text/javascript' src='../../../../js/MochiKit/Base.js'></script>
60 <script type='text/javascript' src='../../../../js/MochiKit/Iter.js'></script> 57 <script type='text/javascript' src='../../../../js/MochiKit/Iter.js'></script>
61 <script type='text/javascript' src='../../../../js/MochiKit/Logging.js'></script> 58 <script type='text/javascript' src='../../../../js/MochiKit/Logging.js'></script>
62 <script type='text/javascript' src='../../../../js/MochiKit/Format.js'></script> 59 <script type='text/javascript' src='../../../../js/MochiKit/Format.js'></script>
63 <script type='text/javascript' src='../../../../js/MochiKit/Async.js'></script> 60 <script type='text/javascript' src='../../../../js/MochiKit/Async.js'></script>
64 <script type='text/javascript' src='../../../../js/MochiKit/DOM.js'></script> 61 <script type='text/javascript' src='../../../../js/MochiKit/DOM.js'></script>
65 <script type='text/javascript' src='../../../../js/MochiKit/Style.js'></script> 62 <script type='text/javascript' src='../../../../js/MochiKit/Style.js'></script>
66 <script type='text/javascript' src='../../../../js/MochiKit/LoggingPane.js'></script> 63 <script type='text/javascript' src='../../../../js/MochiKit/LoggingPane.js'></script>
67 <script type='text/javascript' src='../../../../js/MochiKit/Color.js'></script> 64 <script type='text/javascript' src='../../../../js/MochiKit/Color.js'></script>
68 <script type='text/javascript' src='../../../../js/MochiKit/Signal.js'></script> 65 <script type='text/javascript' src='../../../../js/MochiKit/Signal.js'></script>
69 <script type='text/javascript' src='../../../../js/MochiKit/Position.js'></script> 66 <script type='text/javascript' src='../../../../js/MochiKit/Position.js'></script>
70 <script type='text/javascript' src='../../../../js/MochiKit/Selector.js'></script> 67 <script type='text/javascript' src='../../../../js/MochiKit/Selector.js'></script>
71 <script type='text/javascript' src='../../../../js/MochiKit/Visual.js'></script> 68 <script type='text/javascript' src='../../../../js/MochiKit/Visual.js'></script>
72 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script> 69 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script>
73 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> 70 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
74 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script> 71 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
75 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 72 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
76 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 73 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
77 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script> 74 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script>
78 <script type='text/javascript' src='../../../../js/Clipperz/CSVProcessor.js'></script> 75 <script type='text/javascript' src='../../../../js/Clipperz/CSVProcessor.js'></script>
79 <script type='text/javascript' src='../../../../js/Clipperz/KeePassExportProcessor.js'></script> 76 <script type='text/javascript' src='../../../../js/Clipperz/KeePassExportProcessor.js'></script>
80 <script type='text/javascript' src='../../../../js/Clipperz/Date.js'></script> 77 <script type='text/javascript' src='../../../../js/Clipperz/Date.js'></script>
81 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script> 78 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script>
82 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script> 79 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
83 <script type='text/javascript' src='../../../../js/Clipperz/Signal.js'></script> 80 <script type='text/javascript' src='../../../../js/Clipperz/Signal.js'></script>
84 <script type='text/javascript' src='../../../../js/Clipperz/Style.js'></script> 81 <script type='text/javascript' src='../../../../js/Clipperz/Style.js'></script>
85 <script type='text/javascript' src='../../../../js/Clipperz/Visual.js'></script> 82 <script type='text/javascript' src='../../../../js/Clipperz/Visual.js'></script>
86 <script type='text/javascript' src='../../../../js/Clipperz/Set.js'></script> 83 <script type='text/javascript' src='../../../../js/Clipperz/Set.js'></script>
87 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script> 84 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script>
88 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> 85 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
89 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script> 86 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
90 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script> 87 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
91 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> 88 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
92 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> 89 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
93 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script> 90 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script>
94 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/RSA.js'></script> 91 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/RSA.js'></script>
95 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_defaults.js'></script> 92 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_defaults.js'></script>
96 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script> 93 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script>
97 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings.js'></script> 94 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings.js'></script>
98 <script type='text/javascript' src='../../../../js/Clipperz/PM/Date.js'></script> 95 <script type='text/javascript' src='../../../../js/Clipperz/PM/Date.js'></script>
99 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script> 96 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script>
100 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script> 97 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script>
101 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.JSON.js'></script> 98 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.JSON.js'></script>
102 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script> 99 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script>
103 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script> 100 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script>
104 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script> 101 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script>
105 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script> 102 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script>
106 <script type='text/javascript' src='../../../../js/Clipperz/PM/BookmarkletProcessor.js'></script> 103 <script type='text/javascript' src='../../../../js/Clipperz/PM/BookmarkletProcessor.js'></script>
107 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/EncryptedRemoteObject.js'></script> 104 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/EncryptedRemoteObject.js'></script>
108 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.js'></script> 105 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.js'></script>
109 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.Legacy.js'></script> 106 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.Legacy.js'></script>
110 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.RecordIndex.js'></script> 107 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.RecordIndex.js'></script>
111 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.Preferences.js'></script> 108 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.Preferences.js'></script>
112 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.OneTimePasswords.js'></script> 109 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.OneTimePasswords.js'></script>
113 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.js'></script> 110 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.js'></script>
114 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.js'></script> 111 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.js'></script>
115 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.Field.js'></script> 112 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.Field.js'></script>
116 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLogin.js'></script> 113 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLogin.js'></script>
117 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLoginInput.js'></script> 114 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLoginInput.js'></script>
118 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLoginBinding.js'></script> 115 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLoginBinding.js'></script>
119 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLoginFormValue.js'></script> 116 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLoginFormValue.js'></script>
120 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/OneTimePassword.js'></script> 117 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/OneTimePassword.js'></script>
121 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/BaseComponent.js'></script> 118 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/BaseComponent.js'></script>
122 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/Button.js'></script> 119 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/Button.js'></script>
123 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ComponentSlot.js'></script> 120 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ComponentSlot.js'></script>
124 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/FaviconComponent.js'></script> 121 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/FaviconComponent.js'></script>
125 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/PasswordEntropyDisplay.js'></script> 122 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/PasswordEntropyDisplay.js'></script>
126 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ProgressBar.js'></script> 123 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ProgressBar.js'></script>
127 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/SimpleMessagePanel.js'></script> 124 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/SimpleMessagePanel.js'></script>
128 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/MessagePanelWithProgressBar.js'></script> 125 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/MessagePanelWithProgressBar.js'></script>
129 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TabPanelComponent.js'></script> 126 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TabPanelComponent.js'></script>
130 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/Tooltip.js'></script> 127 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/Tooltip.js'></script>
131 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TranslatorWidget.js'></script> 128 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TranslatorWidget.js'></script>
132 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/DirectLoginRunner.js'></script> 129 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/DirectLoginRunner.js'></script>
133 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/ProgressBarController.js'></script> 130 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/ProgressBarController.js'></script>
134 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/TabPanelController.js'></script> 131 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/TabPanelController.js'></script>
135 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/WizardController.js'></script> 132 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/WizardController.js'></script>
136 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/Page.js'></script> 133 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/Page.js'></script>
137 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/PageHeader.js'></script> 134 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/PageHeader.js'></script>
138 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/PageFooter.js'></script> 135 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/PageFooter.js'></script>
139 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/LoginPage.js'></script> 136 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/LoginPage.js'></script>
140 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/LoginForm.js'></script> 137 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/LoginForm.js'></script>
141 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/LoginProgress.js'></script> 138 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/LoginProgress.js'></script>
142 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/AppPage.js'></script> 139 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/AppPage.js'></script>
143 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/UserInfoBox.js'></script> 140 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/UserInfoBox.js'></script>
144 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/TabSidePanel.js'></script> 141 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/TabSidePanel.js'></script>
145 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/GridComponent.js'></script> 142 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/GridComponent.js'></script>
146 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/ColumnManager.js'></script> 143 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/ColumnManager.js'></script>
147 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/TextColumnManager.js'></script> 144 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/TextColumnManager.js'></script>
148 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/FaviconColumnManager.js'></script> 145 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/FaviconColumnManager.js'></script>
149 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/ImageColumnManager.js'></script> 146 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/ImageColumnManager.js'></script>
150 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DateColumnManager.js'></script> 147 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DateColumnManager.js'></script>
151 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/LinkColumnManager.js'></script> 148 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/LinkColumnManager.js'></script>
152 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DirectLoginColumnManager.js'></script> 149 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DirectLoginColumnManager.js'></script>
153 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DirectLoginsColumnManager.js'></script> 150 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DirectLoginsColumnManager.js'></script>
154 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DeleteObjectColumnManager.js'></script> 151 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DeleteObjectColumnManager.js'></script>
155 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CreateNewCardSplashComponent.js'></script> 152 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CreateNewCardSplashComponent.js'></script>
156 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/AccountPanel.js'></script> 153 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/AccountPanel.js'></script>
157 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DataPanel.js'></script> 154 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DataPanel.js'></script>
158 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/ToolsPanel.js'></script> 155 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/ToolsPanel.js'></script>
159 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/RulerComponent.js'></script> 156 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/RulerComponent.js'></script>
160 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogComponent.js'></script> 157 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogComponent.js'></script>
161 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogRecordFieldComponent.js'></script> 158 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogRecordFieldComponent.js'></script>
162 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogRecordDirectLoginComponent.js'></script> 159 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogRecordDirectLoginComponent.js'></script>
163 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DirectLoginEditingComponent.js'></script> 160 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DirectLoginEditingComponent.js'></script>
164 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DirectLoginEditingBindingComponent.js'></script> 161 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DirectLoginEditingBindingComponent.js'></script>
165 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DirectLoginEditingFormValueComponent.js'></script> 162 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DirectLoginEditingFormValueComponent.js'></script>
166 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/BookmarkletComponent.js'></script> 163 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/BookmarkletComponent.js'></script>
167 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/UnlockPasswordComponent.js'></script> 164 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/UnlockPasswordComponent.js'></script>
168 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/NewUserCreationComponent.js'></script> 165 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/NewUserCreationComponent.js'></script>
169 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/PasswordTooltip.js'></script> 166 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/PasswordTooltip.js'></script>
170 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/MainController.js'></script> 167 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/MainController.js'></script>
171 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/LoginController.js'></script> 168 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/LoginController.js'></script>
172 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/AppController.js'></script> 169 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/AppController.js'></script>
173 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/FilterController.js'></script> 170 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/FilterController.js'></script>
174 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/GridController.js'></script> 171 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/GridController.js'></script>
175 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/CardsController.js'></script> 172 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/CardsController.js'></script>
176 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/DirectLoginsController.js'></script> 173 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/DirectLoginsController.js'></script>
177 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/CardDialogController.js'></script> 174 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/CardDialogController.js'></script>
178 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/DirectLoginWizardController.js'></script> 175 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/DirectLoginWizardController.js'></script>
179 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/NewUserWizardController.js'></script> 176 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/NewUserWizardController.js'></script>
180 177
181 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/Marks/exclamationMark.js'></script> 178 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/Marks/exclamationMark.js'></script>
182 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/Marks/questionMark.js'></script> 179 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/Marks/questionMark.js'></script>
183 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/Marks/info.js'></script> 180 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/Marks/info.js'></script>
184 181
185 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/Features/store.js'></script> 182 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/Features/store.js'></script>
186 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/Features/protect.js'></script> 183 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/Features/protect.js'></script>
187 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/Features/directLogin.js'></script> 184 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/Features/directLogin.js'></script>
188 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/Features/share.js'></script> 185 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/Features/share.js'></script>
189 186
190 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/Star/normal.js'></script> 187 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/Star/normal.js'></script>
191 188
192 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/CoverActions/look.js'></script> 189 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/CoverActions/look.js'></script>
193 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/CoverActions/download.js'></script> 190 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/CoverActions/download.js'></script>
194 191
195 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/Tips/open.js'></script> 192 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/Tips/open.js'></script>
196 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/Tips/close.js'></script> 193 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/Tips/close.js'></script>
197 194
198 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/RegisterButton/normal.js'></script> 195 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/RegisterButton/normal.js'></script>
199 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/Logo/normal.js'></script> 196 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/Logo/normal.js'></script>
200 197
201 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/GraphicFunctions.js'></script> 198 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Canvas/GraphicFunctions.js'></script>
202 <!-- script type='text/javascript' src='../../../../js/main.js'></script --> 199 <!-- script type='text/javascript' src='../../../../js/main.js'></script -->
203 200
204 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script> 201 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script>
205 <script type='text/javascript' src='./User.data.js'></script> 202 <script type='text/javascript' src='./User.data.js'></script>
206 <script type='text/javascript' src='./main_test.js'></script> 203 <script type='text/javascript' src='./main_test.js'></script>
207 204
208 205
209</head> 206</head>
210<body> 207<body>
211<div id="mainDiv"> 208<div id="mainDiv">
212 <div id="loading"> 209 <div id="loading">
213 <a href="http://www.clipperz.com" target="_blank"><div id="logo"></div></a> 210 <a href="http://www.clipperz.com" target="_blank"><div id="logo"></div></a>
214 <h5 class="clipperzPayoff">keep it to yourself!</h5> 211 <h5 class="clipperzPayoff">keep it to yourself!</h5>
215 <h2>loading ...</h2> 212 <h2>loading ...</h2>
216 </div> 213 </div>
217 214
218 215
219 216
220</div> 217</div>
221<div id="applicationVersionType" class="LIVE"></div> 218<div id="applicationVersionType" class="LIVE"></div>
222 219
223<!-- --> 220<!-- -->
224<div id="javaScriptAlert"> 221<div id="javaScriptAlert">
225 <div class="mask"></div> 222 <div class="mask"></div>
226 <div class="message"> 223 <div class="message">
227 <div class="header"></div> 224 <div class="header"></div>
228 <div class="body"> 225 <div class="body">
229 <div class="alertLogo"></div> 226 <div class="alertLogo"></div>
230 <div class="alert"> 227 <div class="alert">
231 <h1>Attention!</h1> 228 <h1>Attention!</h1>
232 <p>If you can read this message, the chances are that your browser does not properly support JavaScript? or you have disabled this functionality yourself.</p> 229 <p>If you can read this message, the chances are that your browser does not properly support JavaScript? or you have disabled this functionality yourself.</p>
233 <h3>Javascript is required to access Clipperz.</h3> 230 <h3>Javascript is required to access Clipperz.</h3>
234 <h5>Please enable scripting or upgrade your browser.</h5> 231 <h5>Please enable scripting or upgrade your browser.</h5>
235 </div> 232 </div>
236 </div> 233 </div>
237 <div class="footer"></div> 234 <div class="footer"></div>
238 </div> 235 </div>
239</div> 236</div>
240<!-- --> 237<!-- -->
241 238
242</body> 239</body>
243</html> 240</html>
diff --git a/frontend/gamma/tests/tests/Components/FullApp/main_test.js b/frontend/gamma/tests/tests/Components/FullApp/main_test.js
index fa21581..b13972a 100644
--- a/frontend/gamma/tests/tests/Components/FullApp/main_test.js
+++ b/frontend/gamma/tests/tests/Components/FullApp/main_test.js
@@ -1,114 +1,111 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29function _pm_logEvent(anEvent) { 26function _pm_logEvent(anEvent) {
30 //console.log("####", anEvent); 27 //console.log("####", anEvent);
31 28
32 anEvent.preventDefault(); 29 anEvent.preventDefault();
33} 30}
34 31
35function handleGenericDeferredError(anError) { 32function handleGenericDeferredError(anError) {
36 var result; 33 var result;
37 34
38 if (anError instanceof MochiKit.Async.CancelledError) { 35 if (anError instanceof MochiKit.Async.CancelledError) {
39 result = anError; 36 result = anError;
40 } else { 37 } else {
41MochiKit.Logging.logError("## MainController - GENERIC ERROR" + "\n" + "==>> " + anError + " <<==\n" + anError.stack); 38MochiKit.Logging.logError("## MainController - GENERIC ERROR" + "\n" + "==>> " + anError + " <<==\n" + anError.stack);
42//console.log(anError); 39//console.log(anError);
43 result = new MochiKit.Async.CancelledError(anError); 40 result = new MochiKit.Async.CancelledError(anError);
44 } 41 }
45 42
46 return result; 43 return result;
47} 44}
48 45
49 46
50Clipperz.PM.RunTime = {}; 47Clipperz.PM.RunTime = {};
51 48
52 49
53function run() { 50function run() {
54 var shouldShowRegistrationForm; 51 var shouldShowRegistrationForm;
55 var useCompactDesign; 52 var useCompactDesign;
56 var controllerParameters; 53 var controllerParameters;
57 //var iPhoneDesign; 54 //var iPhoneDesign;
58 55
59 //MochiKit.Signal.connect(document.body, 'onkeydown', _pm_logEvent); 56 //MochiKit.Signal.connect(document.body, 'onkeydown', _pm_logEvent);
60 //MochiKit.Signal.connect(document.body, 'onkeypress', _pm_logEvent); 57 //MochiKit.Signal.connect(document.body, 'onkeypress', _pm_logEvent);
61 //MochiKit.Signal.connect(document.body, 'onclick', _pm_logEvent); 58 //MochiKit.Signal.connect(document.body, 'onclick', _pm_logEvent);
62 59
63 controllerParameters = {}; 60 controllerParameters = {};
64 61
65 MochiKit.DOM.removeElement('javaScriptAlert'); 62 MochiKit.DOM.removeElement('javaScriptAlert');
66 Clipperz.PM.Strings.Languages.initSetup(); 63 Clipperz.PM.Strings.Languages.initSetup();
67 64
68 if (window.location.search.indexOf('registration') != -1) { 65 if (window.location.search.indexOf('registration') != -1) {
69 shouldShowRegistrationForm = true; 66 shouldShowRegistrationForm = true;
70 } else { 67 } else {
71 shouldShowRegistrationForm = false; 68 shouldShowRegistrationForm = false;
72 } 69 }
73 70
74 if (window.location.search.indexOf('autocomplete') != -1) { 71 if (window.location.search.indexOf('autocomplete') != -1) {
75 controllerParameters['autocomplete'] = 'on' 72 controllerParameters['autocomplete'] = 'on'
76 } 73 }
77 74
78 //if ((window.location.search.indexOf('iPhone') != -1) || (navigator.userAgent.match('iPhone'))) { 75 //if ((window.location.search.indexOf('iPhone') != -1) || (navigator.userAgent.match('iPhone'))) {
79 // iPhoneDesign = true; 76 // iPhoneDesign = true;
80 //} else { 77 //} else {
81 // iPhoneDesign = false; 78 // iPhoneDesign = false;
82 //} 79 //}
83 80
84 if (window.location.search.indexOf('compact') != -1) { 81 if (window.location.search.indexOf('compact') != -1) {
85 useCompactDesign = true; 82 useCompactDesign = true;
86 } else { 83 } else {
87 useCompactDesign = false; 84 useCompactDesign = false;
88 } 85 }
89 86
90 if (useCompactDesign == true) { 87 if (useCompactDesign == true) {
91 Clipperz.PM.RunTime.mainController = new Clipperz.PM.UI.Compact.Controllers.MainController(controllerParameters); 88 Clipperz.PM.RunTime.mainController = new Clipperz.PM.UI.Compact.Controllers.MainController(controllerParameters);
92 //} else if (iPhoneDesign == true) { 89 //} else if (iPhoneDesign == true) {
93 // Clipperz.PM.RunTime.mainController = new Clipperz.PM.UI.iPhone.Controllers.MainController(); 90 // Clipperz.PM.RunTime.mainController = new Clipperz.PM.UI.iPhone.Controllers.MainController();
94 } else { 91 } else {
95 Clipperz.PM.RunTime.mainController = new Clipperz.PM.UI.Web.Controllers.MainController(controllerParameters); 92 Clipperz.PM.RunTime.mainController = new Clipperz.PM.UI.Web.Controllers.MainController(controllerParameters);
96 } 93 }
97 94
98 Clipperz.PM.RunTime.mainController.run(shouldShowRegistrationForm); 95 Clipperz.PM.RunTime.mainController.run(shouldShowRegistrationForm);
99 96
100//Clipperz.log("HASH: " + window.location.hash); 97//Clipperz.log("HASH: " + window.location.hash);
101 //if (window.location.hash != "") { 98 //if (window.location.hash != "") {
102 // window.location.hash = "" 99 // window.location.hash = ""
103 //} 100 //}
104//Clipperz.log("HASH cleaned"); 101//Clipperz.log("HASH cleaned");
105 //#credentials=base64encoded({username:'joe', passphrase:'clipperz'}) 102 //#credentials=base64encoded({username:'joe', passphrase:'clipperz'})
106 //MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'doLogin', {username:'joe', passphrase:'clipperz'}); 103 //MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'doLogin', {username:'joe', passphrase:'clipperz'});
107} 104}
108 105
109Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); 106Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
110 107
111var proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); 108var proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false});
112proxy.dataStore().setupWithEncryptedData(testData['testData']); 109proxy.dataStore().setupWithEncryptedData(testData['testData']);
113 110
114MochiKit.DOM.addLoadEvent(run); 111MochiKit.DOM.addLoadEvent(run);
diff --git a/frontend/gamma/tests/tests/Components/GridLayout/GridLayout_test.js b/frontend/gamma/tests/tests/Components/GridLayout/GridLayout_test.js
index 1c06468..15244b6 100644
--- a/frontend/gamma/tests/tests/Components/GridLayout/GridLayout_test.js
+++ b/frontend/gamma/tests/tests/Components/GridLayout/GridLayout_test.js
@@ -1,119 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.Tests.GridLayout'); 26Clipperz.Base.module('Clipperz.Tests.GridLayout');
30 27
31Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); 28Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
32Clipperz.PM.Strings.Languages.initSetup(); 29Clipperz.PM.Strings.Languages.initSetup();
33 30
34Clipperz.Tests.GridLayout.Tester = function(args) { 31Clipperz.Tests.GridLayout.Tester = function(args) {
35 args = args || {}; 32 args = args || {};
36 33
37 Clipperz.Tests.GridLayout.Tester.superclass.constructor.call(this, args); 34 Clipperz.Tests.GridLayout.Tester.superclass.constructor.call(this, args);
38 //#this._user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); 35 //#this._user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}});
39 this._user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); 36 this._user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
40 37
41 return this; 38 return this;
42}; 39};
43 40
44Clipperz.Base.extend(Clipperz.Tests.GridLayout.Tester, Object, { 41Clipperz.Base.extend(Clipperz.Tests.GridLayout.Tester, Object, {
45 42
46 'toString': function() { 43 'toString': function() {
47 return "Clipperz.Tests.GridLayout.Tester"; 44 return "Clipperz.Tests.GridLayout.Tester";
48 }, 45 },
49 46
50 //------------------------------------------------------------------------- 47 //-------------------------------------------------------------------------
51 48
52 'user': function () { 49 'user': function () {
53 return this._user; 50 return this._user;
54 }, 51 },
55 52
56 //------------------------------------------------------------------------- 53 //-------------------------------------------------------------------------
57 54
58 'run': function () { 55 'run': function () {
59 var deferredResult; 56 var deferredResult;
60 var proxy; 57 var proxy;
61 varcardDialogController; 58 varcardDialogController;
62 varcardDialogComponent; 59 varcardDialogComponent;
63 varcomponent; 60 varcomponent;
64 varfilterController; 61 varfilterController;
65 var cardsController; 62 var cardsController;
66 63
67 filterController = new Clipperz.PM.UI.Web.Controllers.FilterController(); 64 filterController = new Clipperz.PM.UI.Web.Controllers.FilterController();
68 cardsController = new Clipperz.PM.UI.Web.Controllers.CardsController({'filterController':filterController}); 65 cardsController = new Clipperz.PM.UI.Web.Controllers.CardsController({'filterController':filterController});
69 66
70 component = new Clipperz.Tests.GridLayout.TestPageComponent({element:MochiKit.DOM.getElement('component')}); 67 component = new Clipperz.Tests.GridLayout.TestPageComponent({element:MochiKit.DOM.getElement('component')});
71 68
72 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); 69 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false});
73 70
74 deferredResult = new Clipperz.Async.Deferred("GridLayout_test.init", {trace:false}); 71 deferredResult = new Clipperz.Async.Deferred("GridLayout_test.init", {trace:false});
75 //# deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']); 72 //# deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']);
76 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); 73 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
77 deferredResult.addMethod(this.user(), 'login'); 74 deferredResult.addMethod(this.user(), 'login');
78 75
79 deferredResult.addMethod(cardsController,'run', {slot:component.slotNamed('cardList'), user:this.user()}); 76 deferredResult.addMethod(cardsController,'run', {slot:component.slotNamed('cardList'), user:this.user()});
80 // deferredResult.addMethod(xxxxController,'run', {slot:component.slotNamed('cardGrid'), user:this.user()}); 77 // deferredResult.addMethod(xxxxController,'run', {slot:component.slotNamed('cardGrid'), user:this.user()});
81 78
82 deferredResult.callback(); 79 deferredResult.callback();
83 80
84 return deferredResult; 81 return deferredResult;
85 }, 82 },
86 83
87 //========================================================================= 84 //=========================================================================
88 85
89 'saveChanges': function () { 86 'saveChanges': function () {
90 return this.user().saveChanges(); 87 return this.user().saveChanges();
91 }, 88 },
92 89
93 //------------------------------------------------------------------------- 90 //-------------------------------------------------------------------------
94 91
95 'hasPendingChanges': function () { 92 'hasPendingChanges': function () {
96 return this.user().hasPendingChanges(); 93 return this.user().hasPendingChanges();
97 }, 94 },
98 95
99 //------------------------------------------------------------------------- 96 //-------------------------------------------------------------------------
100 97
101 'revertChanges': function () { 98 'revertChanges': function () {
102 return this.user().revertChanges(); 99 return this.user().revertChanges();
103 }, 100 },
104 101
105 //========================================================================= 102 //=========================================================================
106 __syntaxFix__: "syntax fix" 103 __syntaxFix__: "syntax fix"
107}); 104});
108 105
109 106
110 107
111 108
112init = function () { 109init = function () {
113 vartester; 110 vartester;
114 111
115 tester = new Clipperz.Tests.GridLayout.Tester(); 112 tester = new Clipperz.Tests.GridLayout.Tester();
116 tester.run(); 113 tester.run();
117}; 114};
118 115
119MochiKit.DOM.addLoadEvent(init); 116MochiKit.DOM.addLoadEvent(init);
diff --git a/frontend/gamma/tests/tests/Components/GridLayout/TestPageComponent.js b/frontend/gamma/tests/tests/Components/GridLayout/TestPageComponent.js
index a98f041..a066001 100644
--- a/frontend/gamma/tests/tests/Components/GridLayout/TestPageComponent.js
+++ b/frontend/gamma/tests/tests/Components/GridLayout/TestPageComponent.js
@@ -1,102 +1,99 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.Tests.GridLayout'); 26Clipperz.Base.module('Clipperz.Tests.GridLayout');
30 27
31Clipperz.Tests.GridLayout.TestPageComponent = function(args) { 28Clipperz.Tests.GridLayout.TestPageComponent = function(args) {
32 args = args || {}; 29 args = args || {};
33 Clipperz.Tests.GridLayout.TestPageComponent.superclass.constructor.call(this, args); 30 Clipperz.Tests.GridLayout.TestPageComponent.superclass.constructor.call(this, args);
34 31
35 this._element = args.element || null; 32 this._element = args.element || null;
36 33
37 this._slots = { 34 this._slots = {
38 'cardList' : this.getId('cardList'), 35 'cardList' : this.getId('cardList'),
39 'cardGrid' : this.getId('cardGrid') 36 'cardGrid' : this.getId('cardGrid')
40 }; 37 };
41 38
42 this.render(); 39 this.render();
43 40
44 41
45 return this; 42 return this;
46} 43}
47 44
48//============================================================================= 45//=============================================================================
49 46
50Clipperz.Base.extend(Clipperz.Tests.GridLayout.TestPageComponent, Clipperz.PM.UI.Common.Components.BaseComponent, { 47Clipperz.Base.extend(Clipperz.Tests.GridLayout.TestPageComponent, Clipperz.PM.UI.Common.Components.BaseComponent, {
51 48
52 //------------------------------------------------------------------------- 49 //-------------------------------------------------------------------------
53 50
54 'toString': function () { 51 'toString': function () {
55 return "Clipperz.Tests.GridLayout.TestPageComponent component"; 52 return "Clipperz.Tests.GridLayout.TestPageComponent component";
56 }, 53 },
57 54
58 //------------------------------------------------------------------------- 55 //-------------------------------------------------------------------------
59 56
60 'renderSelf': function(/*aContainer, aPosition*/) { 57 'renderSelf': function(/*aContainer, aPosition*/) {
61 this.append(this.element(), [ 58 this.append(this.element(), [
62 {tag:'ul', cls:'testTabs', style:'', children:[ 59 {tag:'ul', cls:'testTabs', style:'', children:[
63 {tag:'li', id:this.getId('list'), children:[{tag:'span', html:'list'}]}, 60 {tag:'li', id:this.getId('list'), children:[{tag:'span', html:'list'}]},
64 {tag:'li', id:this.getId('grid'), children:[{tag:'span', html:'grid'}]} 61 {tag:'li', id:this.getId('grid'), children:[{tag:'span', html:'grid'}]}
65 ]}, 62 ]},
66 {tag:'ul', cls:'testPanels', children:[ 63 {tag:'ul', cls:'testPanels', children:[
67 {tag:'li', id:this.getId('listPanel'), children:[ 64 {tag:'li', id:this.getId('listPanel'), children:[
68 {tag:'div', /*id:this.getId('mainPanels'),*/ cls:'mainPanels', children:[ 65 {tag:'div', /*id:this.getId('mainPanels'),*/ cls:'mainPanels', children:[
69 {tag:'div', id:this.getId('cardList'), cls:'gridComponent cardGrid'} 66 {tag:'div', id:this.getId('cardList'), cls:'gridComponent cardGrid'}
70 ]} 67 ]}
71 ]}, 68 ]},
72 {tag:'li', id:this.getId('gridPanel'), children:[ 69 {tag:'li', id:this.getId('gridPanel'), children:[
73 {tag:'div', /*id:this.getId('mainPanels'),*/ cls:'mainPanels', children:[ 70 {tag:'div', /*id:this.getId('mainPanels'),*/ cls:'mainPanels', children:[
74 // {tag:'div', id:this.getId('cardGrid'), cls:'gridComponent cardGrid'} 71 // {tag:'div', id:this.getId('cardGrid'), cls:'gridComponent cardGrid'}
75 {tag:'h1', html:"Ciao"} 72 {tag:'h1', html:"Ciao"}
76 ]} 73 ]}
77 ]} 74 ]}
78 ]} 75 ]}
79 ]); 76 ]);
80 77
81 // this.append(this.element(), {tag:'div', id:this.getId('mainPanels'), cls:'mainPanels'}); 78 // this.append(this.element(), {tag:'div', id:this.getId('mainPanels'), cls:'mainPanels'});
82 // this.append(this.getId('mainPanels'), {tag:'div', id:this.getId('cardGrid'), cls:'gridComponent cardGrid'}); 79 // this.append(this.getId('mainPanels'), {tag:'div', id:this.getId('cardGrid'), cls:'gridComponent cardGrid'});
83 80
84 new Clipperz.PM.UI.Common.Controllers.TabPanelController({ 81 new Clipperz.PM.UI.Common.Controllers.TabPanelController({
85 component:this, 82 component:this,
86 configuration: { 83 configuration: {
87 'LIST': { 84 'LIST': {
88 tab:'list', 85 tab:'list',
89 panel:'listPanel' 86 panel:'listPanel'
90 }, 87 },
91 'GRID': { 88 'GRID': {
92 tab:'grid', 89 tab:'grid',
93 panel:'gridPanel' 90 panel:'gridPanel'
94 } 91 }
95 } 92 }
96 }); 93 });
97 }, 94 },
98 95
99 //------------------------------------------------------------------------- 96 //-------------------------------------------------------------------------
100 97
101 __syntaxFix__: "syntax fix" 98 __syntaxFix__: "syntax fix"
102}); 99});
diff --git a/frontend/gamma/tests/tests/Components/GridLayout/User.data.js b/frontend/gamma/tests/tests/Components/GridLayout/User.data.js
index 6fec8c9..142e511 100644
--- a/frontend/gamma/tests/tests/Components/GridLayout/User.data.js
+++ b/frontend/gamma/tests/tests/Components/GridLayout/User.data.js
@@ -1,408 +1,405 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29testData = { 26testData = {
30 27
31 //------------------------------------------------------------------------- 28 //-------------------------------------------------------------------------
32 29
33 'simpleLogin_001': { 30 'simpleLogin_001': {
34 'users': [ 31 'users': [
35 { 32 {
36 'username': "joe", 33 'username': "joe",
37 'passphrase': "eoj", 34 'passphrase': "eoj",
38 'version': "0.2", 35 'version': "0.2",
39 'connectionVersion':"0.2", 36 'connectionVersion':"0.2",
40 'records':{ 37 'records':{
41 'record 1': { 38 'record 1': {
42 'notes':"Some notes here", 39 'notes':"Some notes here",
43 'fields':[ 40 'fields':[
44 { 'name': "username", 'value': "joe", 'type': "text" }, 41 { 'name': "username", 'value': "joe", 'type': "text" },
45 { 'name': "password", 'value': "1234", 'type': "password"} 42 { 'name': "password", 'value': "1234", 'type': "password"}
46 ], 43 ],
47 'directLogins':{ 44 'directLogins':{
48 "record 1 direct login": { 45 "record 1 direct login": {
49 'configuration':"", 46 'configuration':"",
50 'bindings':[ 47 'bindings':[
51 ], 48 ],
52 'favicon':"http://www.example.com/favicon.ico" 49 'favicon':"http://www.example.com/favicon.ico"
53 } 50 }
54 } 51 }
55 } 52 }
56 }, 53 },
57 'otp':[ 54 'otp':[
58 "12345678 90abcdef 12345678 90abcdef", 55 "12345678 90abcdef 12345678 90abcdef",
59 "fedcba09 87654321 fedcba09 87654321" 56 "fedcba09 87654321 fedcba09 87654321"
60 ] 57 ]
61 } 58 }
62 ] 59 ]
63 }, 60 },
64 61
65 //------------------------------------------------------------------------- 62 //-------------------------------------------------------------------------
66 63
67 'joe_clipperz_offline_copy_data': { 64 'joe_clipperz_offline_copy_data': {
68 users:{ 65 users:{
69 'catchAllUser': { 66 'catchAllUser': {
70 __masterkey_test_value__: 'masterkey', 67 __masterkey_test_value__: 'masterkey',
71 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00', 68 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00',
72 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00' 69 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00'
73 }, 70 },
74 'f527cdd90d0d47f8524b4e165398ad1455eba515d04abd101d1e93b3c6ae0674': { 71 'f527cdd90d0d47f8524b4e165398ad1455eba515d04abd101d1e93b3c6ae0674': {
75 s: '186f0c40bf73f2af236eaa6c429df225efa933050c9aae65240e93b7b362e3ee', 72 s: '186f0c40bf73f2af236eaa6c429df225efa933050c9aae65240e93b7b362e3ee',
76 v: 'ac61a6e325ecf329926a86084f591d8852d0ad3e4a6080f2adc901b82395ecaf', 73 v: 'ac61a6e325ecf329926a86084f591d8852d0ad3e4a6080f2adc901b82395ecaf',
77 version: '0.2', 74 version: '0.2',
78 maxNumberOfRecords: '100', 75 maxNumberOfRecords: '100',
79 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"}', 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"}',
80 statistics: 'SfGy/4mpXQdDOv+Bcfie4Yt/', 77 statistics: 'SfGy/4mpXQdDOv+Bcfie4Yt/',
81 userDetailsVersion: '0.3', 78 userDetailsVersion: '0.3',
82 records: { 79 records: {
83 '062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80': { 80 '062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80': {
84 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', 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',
85 version: '0.2', 82 version: '0.2',
86 creationDate: 'Wed Mar 14 15:46:44 PDT 2007', 83 creationDate: 'Wed Mar 14 15:46:44 PDT 2007',
87 updateDate: 'Wed Mar 14 15:46:44 PDT 2007', 84 updateDate: 'Wed Mar 14 15:46:44 PDT 2007',
88 accessDate: 'Mon Jan 19 16:10:04 PDT 2009', 85 accessDate: 'Mon Jan 19 16:10:04 PDT 2009',
89 currentVersion: '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3', 86 currentVersion: '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3',
90 versions: { 87 versions: {
91 '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3': { 88 '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3': {
92 header: '####', 89 header: '####',
93 data: 'GCNNIhDQjMJQZGVSf+95fPtU6eOnFWVhuGm86r8WZGVR2Gf2EjbG1OJ0ZIGpZ/AXgirCMpo5AFxJe0Bay8IYg+xmBqMFhwFxzAgJBYCIts+raSaNRipuY8dTEqDxAqD1cChcG8EhSoiFgQ0fG0I7nNEUDJi0pIt4/ygBcwvAhuAenEp9ZW+oQA0+YysPQRqkz3IieFaOoSEbe5/SqpUilV4q1gTVyzNXvrxzxx+rlvEyGFgFN+vgtUZ1NrwlPk4gVksTpylvv6CFaMGEWKhgMG6efo0rJckKosaJTu1pldJdnmMK4EKNMLOd+jZ6pEhEhYyadrA4+zYU5TlmZA6ASzTaps8piSwZodoi9qY0ch2StK4mAbzeEGe2HdfHuAU9Tyq3Ppk3+VfNdKgpQfYrQOiSlXbKzK636tzXTN/gyrfOTHjBrRl117ywibgSX63ayAYNfcLpKotC', 90 data: 'GCNNIhDQjMJQZGVSf+95fPtU6eOnFWVhuGm86r8WZGVR2Gf2EjbG1OJ0ZIGpZ/AXgirCMpo5AFxJe0Bay8IYg+xmBqMFhwFxzAgJBYCIts+raSaNRipuY8dTEqDxAqD1cChcG8EhSoiFgQ0fG0I7nNEUDJi0pIt4/ygBcwvAhuAenEp9ZW+oQA0+YysPQRqkz3IieFaOoSEbe5/SqpUilV4q1gTVyzNXvrxzxx+rlvEyGFgFN+vgtUZ1NrwlPk4gVksTpylvv6CFaMGEWKhgMG6efo0rJckKosaJTu1pldJdnmMK4EKNMLOd+jZ6pEhEhYyadrA4+zYU5TlmZA6ASzTaps8piSwZodoi9qY0ch2StK4mAbzeEGe2HdfHuAU9Tyq3Ppk3+VfNdKgpQfYrQOiSlXbKzK636tzXTN/gyrfOTHjBrRl117ywibgSX63ayAYNfcLpKotC',
94 version: '0.2', 91 version: '0.2',
95 creationDate: 'Wed Mar 14 15:46:44 PDT 2007', 92 creationDate: 'Wed Mar 14 15:46:44 PDT 2007',
96 updateDate: 'Wed Mar 14 15:46:44 PDT 2007', 93 updateDate: 'Wed Mar 14 15:46:44 PDT 2007',
97 accessDate: 'Mon Jan 19 16:10:04 PDT 2009' 94 accessDate: 'Mon Jan 19 16:10:04 PDT 2009'
98 } 95 }
99 } 96 }
100 }, 97 },
101 '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d': { 98 '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d': {
102 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', 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',
103 version: '0.3', 100 version: '0.3',
104 creationDate: 'Fri Oct 17 16:49:20 PDT 2008', 101 creationDate: 'Fri Oct 17 16:49:20 PDT 2008',
105 updateDate: 'Mon Oct 27 08:58:49 PDT 2008', 102 updateDate: 'Mon Oct 27 08:58:49 PDT 2008',
106 accessDate: 'Mon Jan 19 16:09:39 PDT 2009', 103 accessDate: 'Mon Jan 19 16:09:39 PDT 2009',
107 currentVersion: '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac', 104 currentVersion: '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac',
108 versions: { 105 versions: {
109 '0ae362285f103722abbd046eee2b7d10aeae6a1d05cbaf2081392ce9df882bcf': { 106 '0ae362285f103722abbd046eee2b7d10aeae6a1d05cbaf2081392ce9df882bcf': {
110 header: '####', 107 header: '####',
111 data: 'sG6TUmPSEPFpiJ5YdtghWHmHbvUK63tZCZ+Q5iz2ALas//jN+lZCBhZcjEwPEJskBkK2R0MyAh14wWGh2bBHMjsokgTe+L+x+0c/Zi0epE/IC9gtOBhsTe/hZ2e2xOGF/SbzET3DAAYXvxduZ36f7SvvFnrkkKvpj8wGSdTFcBmzqMb9DL2bRyRCLGLMzE3F1a0q5CufCIRz2TgHm+Uw+kfvvwC7ig/F/5iLW90Ypz3vmEtMEFYFHZ9a8Oh0rsXGfevbMhFqALoywzihQEe/NiB8dwn7GEdYKSQ35rhvZh29ULWOZinqmg0ONe0HYaxx7DbKsVoue57S0CIUlgHLajzHfLfqQg2sFI0OT8TnHsGg0YZ6mM2EdKmEjJiER0cP', 108 data: 'sG6TUmPSEPFpiJ5YdtghWHmHbvUK63tZCZ+Q5iz2ALas//jN+lZCBhZcjEwPEJskBkK2R0MyAh14wWGh2bBHMjsokgTe+L+x+0c/Zi0epE/IC9gtOBhsTe/hZ2e2xOGF/SbzET3DAAYXvxduZ36f7SvvFnrkkKvpj8wGSdTFcBmzqMb9DL2bRyRCLGLMzE3F1a0q5CufCIRz2TgHm+Uw+kfvvwC7ig/F/5iLW90Ypz3vmEtMEFYFHZ9a8Oh0rsXGfevbMhFqALoywzihQEe/NiB8dwn7GEdYKSQ35rhvZh29ULWOZinqmg0ONe0HYaxx7DbKsVoue57S0CIUlgHLajzHfLfqQg2sFI0OT8TnHsGg0YZ6mM2EdKmEjJiER0cP',
112 version: '0.3', 109 version: '0.3',
113 creationDate: 'Fri Oct 17 17:00:31 PDT 2008', 110 creationDate: 'Fri Oct 17 17:00:31 PDT 2008',
114 updateDate: 'Fri Oct 17 17:00:31 PDT 2008', 111 updateDate: 'Fri Oct 17 17:00:31 PDT 2008',
115 accessDate: 'Fri Oct 17 17:00:31 PDT 2008' 112 accessDate: 'Fri Oct 17 17:00:31 PDT 2008'
116 }, 113 },
117 '10f45664bbd979a92f37886f1ecc6e52e49798b16dc997aecd37259ad9b2090e': { 114 '10f45664bbd979a92f37886f1ecc6e52e49798b16dc997aecd37259ad9b2090e': {
118 header: '####', 115 header: '####',
119 data: 'RdKVaV/WWWchrCse3KtcXd47Bfm6IAwjqVUpaxoed3HeunI42AAm7xYYSjeK8edHpbNRJbhobBAX5OZtWIp/HmgkobKM8CIiWxrWz89FqyrbnPD7+fXdtgF2yTax/0sC1l0ibncdOuJKX6U829oPlXCpXIOjlomc4wEEAD/5V6FbORvdZ9IE/ME3LsG2y02cT2tIpx6+R6wC/PKXhZA2UDsTE6R2Op2BtIzpVORZLXsdyAp/4wvWQxq90i9cEpbsVQsMB10JVyNHNsRTFhIlHi9MVCaMxQvcrwRElMj/Y9x3RbsFzSGKqFLqdg7Fn/U+KYkpYtsgHv9hraPIb9lV5FH16+iItU/HBM6FGezIj1ZkoQ+dgjPfSjTZzgzDYwyb', 116 data: 'RdKVaV/WWWchrCse3KtcXd47Bfm6IAwjqVUpaxoed3HeunI42AAm7xYYSjeK8edHpbNRJbhobBAX5OZtWIp/HmgkobKM8CIiWxrWz89FqyrbnPD7+fXdtgF2yTax/0sC1l0ibncdOuJKX6U829oPlXCpXIOjlomc4wEEAD/5V6FbORvdZ9IE/ME3LsG2y02cT2tIpx6+R6wC/PKXhZA2UDsTE6R2Op2BtIzpVORZLXsdyAp/4wvWQxq90i9cEpbsVQsMB10JVyNHNsRTFhIlHi9MVCaMxQvcrwRElMj/Y9x3RbsFzSGKqFLqdg7Fn/U+KYkpYtsgHv9hraPIb9lV5FH16+iItU/HBM6FGezIj1ZkoQ+dgjPfSjTZzgzDYwyb',
120 version: '0.3', 117 version: '0.3',
121 creationDate: 'Fri Oct 17 16:49:20 PDT 2008', 118 creationDate: 'Fri Oct 17 16:49:20 PDT 2008',
122 updateDate: 'Fri Oct 17 16:49:20 PDT 2008', 119 updateDate: 'Fri Oct 17 16:49:20 PDT 2008',
123 accessDate: 'Fri Oct 17 16:54:23 PDT 2008' 120 accessDate: 'Fri Oct 17 16:54:23 PDT 2008'
124 }, 121 },
125 '2fa7b67e569d5e268d2b70b3d4d3a960d7e437e1937bcb324b67d0b9441db8ba': { 122 '2fa7b67e569d5e268d2b70b3d4d3a960d7e437e1937bcb324b67d0b9441db8ba': {
126 header: '####', 123 header: '####',
127 data: 'dpnI2qKjk0+bfyKktw4ZCWf+rWZ12hO5bda39CwD29JH7KtdpLCLe2LoLd+KKF2wOdpDsoI2iTiwRgFpt77e7DoWJABxq/0aaRCVN9XpqZo08iHiYhJyNlIszO8CdEhX+M3AeZqzTnd6fs91VfIEWggvku2Z+jwr0CbclY6FnOcNnS+1fj+W79Z9XC383GOm2ujjfo3SX/fyNQSw8aX+7AgJIRGR9uHK7M1cVfsNNTbmDb/HDgLlYZ1Pqm/9poHpmS7G4HUoRM2/WjI0R6F48dy5s8vZRi11SCnlnj5oRykScJj6wh2DltbCyesiaTpAjP6MQjTXsZzKpaosaQcQClZw+w6hDD2cA54IaBIv2j5KAHyhxDh2ERdwbdnCsDKPz4+zP+fmKfW295d4OY0l1NCSdcY+75HWTmBWRAooZeDTo7AE8m5sRwxewE0Y8J2MLUYsrs7Rl4kbZCiRRHU7cs+us3fq2DVn2OLGEbkRrK3kA9swT9W8ABqINoA79+DmDaIr6TGxe5AlHkCAl5sYAN4g42UX1NKhl4fWI1Scj9O1Ixds/1UUvqzavld0mE2cR9yt6LntjE5sQSAaexvymAJbU5IIM5NTk7NlY7G3PEvAPjcUsL9SGw==', 124 data: 'dpnI2qKjk0+bfyKktw4ZCWf+rWZ12hO5bda39CwD29JH7KtdpLCLe2LoLd+KKF2wOdpDsoI2iTiwRgFpt77e7DoWJABxq/0aaRCVN9XpqZo08iHiYhJyNlIszO8CdEhX+M3AeZqzTnd6fs91VfIEWggvku2Z+jwr0CbclY6FnOcNnS+1fj+W79Z9XC383GOm2ujjfo3SX/fyNQSw8aX+7AgJIRGR9uHK7M1cVfsNNTbmDb/HDgLlYZ1Pqm/9poHpmS7G4HUoRM2/WjI0R6F48dy5s8vZRi11SCnlnj5oRykScJj6wh2DltbCyesiaTpAjP6MQjTXsZzKpaosaQcQClZw+w6hDD2cA54IaBIv2j5KAHyhxDh2ERdwbdnCsDKPz4+zP+fmKfW295d4OY0l1NCSdcY+75HWTmBWRAooZeDTo7AE8m5sRwxewE0Y8J2MLUYsrs7Rl4kbZCiRRHU7cs+us3fq2DVn2OLGEbkRrK3kA9swT9W8ABqINoA79+DmDaIr6TGxe5AlHkCAl5sYAN4g42UX1NKhl4fWI1Scj9O1Ixds/1UUvqzavld0mE2cR9yt6LntjE5sQSAaexvymAJbU5IIM5NTk7NlY7G3PEvAPjcUsL9SGw==',
128 version: '0.3', 125 version: '0.3',
129 creationDate: 'Fri Oct 17 17:00:13 PDT 2008', 126 creationDate: 'Fri Oct 17 17:00:13 PDT 2008',
130 updateDate: 'Fri Oct 17 17:00:13 PDT 2008', 127 updateDate: 'Fri Oct 17 17:00:13 PDT 2008',
131 accessDate: 'Fri Oct 17 17:00:13 PDT 2008' 128 accessDate: 'Fri Oct 17 17:00:13 PDT 2008'
132 }, 129 },
133 '5a17723c34226d8cd663f91b11bfa14979e694e461818113ec8abf7194b46b6b': { 130 '5a17723c34226d8cd663f91b11bfa14979e694e461818113ec8abf7194b46b6b': {
134 header: '####', 131 header: '####',
135 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==', 132 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==',
136 version: '0.3', 133 version: '0.3',
137 creationDate: 'Fri Oct 17 16:59:31 PDT 2008', 134 creationDate: 'Fri Oct 17 16:59:31 PDT 2008',
138 updateDate: 'Fri Oct 17 16:59:31 PDT 2008', 135 updateDate: 'Fri Oct 17 16:59:31 PDT 2008',
139 accessDate: 'Fri Oct 17 16:59:31 PDT 2008' 136 accessDate: 'Fri Oct 17 16:59:31 PDT 2008'
140 }, 137 },
141 '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac': { 138 '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac': {
142 header: '####', 139 header: '####',
143 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==', 140 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==',
144 version: '0.3', 141 version: '0.3',
145 creationDate: 'Mon Oct 27 08:58:49 PDT 2008', 142 creationDate: 'Mon Oct 27 08:58:49 PDT 2008',
146 updateDate: 'Mon Oct 27 08:58:49 PDT 2008', 143 updateDate: 'Mon Oct 27 08:58:49 PDT 2008',
147 accessDate: 'Mon Jan 19 16:09:39 PDT 2009' 144 accessDate: 'Mon Jan 19 16:09:39 PDT 2009'
148 }, 145 },
149 'b57a2d2ffafa8029123362071c09709bb9192f06a17140440f0e41d22143148f': { 146 'b57a2d2ffafa8029123362071c09709bb9192f06a17140440f0e41d22143148f': {
150 header: '####', 147 header: '####',
151 data: 'PQ53T2Vo2D8PoLI1qNX//jLaVZFTDTYk6geT9+4RoThTxvlJ+beDPnQzgYhd9iASaF9GQEEL8JxsBnNpEPa6JPOY4ndFLmDLyFDKXMprxq1UIbzFV6kFoYAk3uCCCa3UCDzdr1KXB2CiiF9HrilaA+xkm8krAvH8I5kZD+j23gByz5cAFvXg7A77KEURpjujURL65DW5M+ceIjo6OXaPW9VO03xhqGt/M47ayObpoEGJZn+X9C8s0SE5wOXHbn38YZlRI480OMvtDAxbEYUeQKMmzu6lO4Nw5hhOUjoPSLr/i3tmDx3nPcDwnSafx6jyA4y31eW6yazqTEOP5I5ArC5mUrF7mAAiFvbHIsMoF8PLj6MONlRIOZgbf9HzCpFdt8xBrX/TXp3LaSAj2XTWgSTFI2cgmU3qqPyibvIfUsB5cVHQCXi692JpC+B85axJ0FLyMl5w3vq0txlPkf6q+dadPYDaLHGZEmDjkWScA1GM5xPJHWFwqGE7ejgXKG0sMYsMKWYk+F2LEUmMHtEvSlpgJBntvcQ1ZjYQxeu4hg5txu1ykkif6fXgkXF6wn6qu+5caeJeNhWtAB4q7WVD47111woYMdkmX7AnDTXSAQ==', 148 data: 'PQ53T2Vo2D8PoLI1qNX//jLaVZFTDTYk6geT9+4RoThTxvlJ+beDPnQzgYhd9iASaF9GQEEL8JxsBnNpEPa6JPOY4ndFLmDLyFDKXMprxq1UIbzFV6kFoYAk3uCCCa3UCDzdr1KXB2CiiF9HrilaA+xkm8krAvH8I5kZD+j23gByz5cAFvXg7A77KEURpjujURL65DW5M+ceIjo6OXaPW9VO03xhqGt/M47ayObpoEGJZn+X9C8s0SE5wOXHbn38YZlRI480OMvtDAxbEYUeQKMmzu6lO4Nw5hhOUjoPSLr/i3tmDx3nPcDwnSafx6jyA4y31eW6yazqTEOP5I5ArC5mUrF7mAAiFvbHIsMoF8PLj6MONlRIOZgbf9HzCpFdt8xBrX/TXp3LaSAj2XTWgSTFI2cgmU3qqPyibvIfUsB5cVHQCXi692JpC+B85axJ0FLyMl5w3vq0txlPkf6q+dadPYDaLHGZEmDjkWScA1GM5xPJHWFwqGE7ejgXKG0sMYsMKWYk+F2LEUmMHtEvSlpgJBntvcQ1ZjYQxeu4hg5txu1ykkif6fXgkXF6wn6qu+5caeJeNhWtAB4q7WVD47111woYMdkmX7AnDTXSAQ==',
152 version: '0.3', 149 version: '0.3',
153 creationDate: 'Fri Oct 17 16:57:17 PDT 2008', 150 creationDate: 'Fri Oct 17 16:57:17 PDT 2008',
154 updateDate: 'Fri Oct 17 16:57:17 PDT 2008', 151 updateDate: 'Fri Oct 17 16:57:17 PDT 2008',
155 accessDate: 'Fri Oct 17 16:57:17 PDT 2008' 152 accessDate: 'Fri Oct 17 16:57:17 PDT 2008'
156 }, 153 },
157 'b713e0a1e2664ac7bfa7ba887329ea023204d10298973e322983b82b222debf6': { 154 'b713e0a1e2664ac7bfa7ba887329ea023204d10298973e322983b82b222debf6': {
158 header: '####', 155 header: '####',
159 data: 'H3gIieYrH7Oy8LEWCZpl9vGp9qYdHNCoBNGijYqlcfXt+1JYvPj1abPp12xLNrDUHfaOZklU2Ip4tOf0CDNhgAan7LYyPqFoy9ss2f9/5RLcbjwiIwSduySIL322HTAwqlzlBt/qaJdHHPUrczmu0fb7fT+0dO4gCL/e/IjcHLefUUgNPAbpHG0Nv0+4lNwKZkIQM3tLRtfJyFBIgWKcMcP1XMic33kr24rwybR8Pb0CHZrOOvvUiGqyoED3ZTZf1twUDVNXO7MWCAC5dBc6/Mk/vSmbbGhppXAH02N0g8G5qzZfp3UVikls55VNhRYLHByVsgpkbIrKXyZnBPTwzm7qefpYAXDOgO+164L66/Art2FYGqZQRZLuh5r8oF38', 156 data: 'H3gIieYrH7Oy8LEWCZpl9vGp9qYdHNCoBNGijYqlcfXt+1JYvPj1abPp12xLNrDUHfaOZklU2Ip4tOf0CDNhgAan7LYyPqFoy9ss2f9/5RLcbjwiIwSduySIL322HTAwqlzlBt/qaJdHHPUrczmu0fb7fT+0dO4gCL/e/IjcHLefUUgNPAbpHG0Nv0+4lNwKZkIQM3tLRtfJyFBIgWKcMcP1XMic33kr24rwybR8Pb0CHZrOOvvUiGqyoED3ZTZf1twUDVNXO7MWCAC5dBc6/Mk/vSmbbGhppXAH02N0g8G5qzZfp3UVikls55VNhRYLHByVsgpkbIrKXyZnBPTwzm7qefpYAXDOgO+164L66/Art2FYGqZQRZLuh5r8oF38',
160 version: '0.3', 157 version: '0.3',
161 creationDate: 'Fri Oct 17 16:58:00 PDT 2008', 158 creationDate: 'Fri Oct 17 16:58:00 PDT 2008',
162 updateDate: 'Fri Oct 17 16:58:00 PDT 2008', 159 updateDate: 'Fri Oct 17 16:58:00 PDT 2008',
163 accessDate: 'Fri Oct 17 16:58:00 PDT 2008' 160 accessDate: 'Fri Oct 17 16:58:00 PDT 2008'
164 }, 161 },
165 'c4cea1cd88a86b05f48a99896a37967c3456228283a0406331ca9f67c6f29f97': { 162 'c4cea1cd88a86b05f48a99896a37967c3456228283a0406331ca9f67c6f29f97': {
166 header: '####', 163 header: '####',
167 data: '1znWPwc9JwCe7iOFiUd2iGm4xJd+824B4VRqEtzCQkW46tg25RWfo7XagvK46USB7t6pC8WMLU0M/EC47KucsfpWUqHGbseoXT/8g8E8GoLnIsk9qFyJG7LGd1sUvqBgszLZwjWWG3t9zifmpW5nY9GialBYNmeSLS3bg5xDH+eCEilUUfDe7zGuVSuu/XkHacv/DYUst97e+6u44F7H8Kv8dTywJZpqbmveNPeWfCej2aBXdVV616J5lIRaj2uIYuQYG7blYJh9KZ7yLStdPndl6h65hIJpfWo0PM8nLJuo0lWNHz7misrutnmxJEjkwVIZ5YAmqp1Zz3VC8zw4IxkXrC/sPmp4PaNXgKz9ZJRaY2KV69WmHf7BUQ3QneGngbT0tN526SS5qDFwTGiuIlnYGWvTB2jVrbns68n/d8Fps8sSWfJBvvXJUEkaZB+1WqNilOPGXvyJ5k2O/iucFbRlxwlEHDny+AgsbtXZdp8cHQ4C/O4G0mnUMZuS38gn6e2kQ55mUhxKeORM+J6Rx1y4Iiu9KKNbxyS5eBpAlFB4xS/o35CS4g309vyOEhi37F24bpp4pM0xEPG4mcc/IyChHzaHUGEp1IX1ZO/r3ut9RIN2QWrGLUlZV/9rFKpLLAy6BkY/g8VYNrV8PztOL3rqy/qwqNZouONwPw8w8SA=', 164 data: '1znWPwc9JwCe7iOFiUd2iGm4xJd+824B4VRqEtzCQkW46tg25RWfo7XagvK46USB7t6pC8WMLU0M/EC47KucsfpWUqHGbseoXT/8g8E8GoLnIsk9qFyJG7LGd1sUvqBgszLZwjWWG3t9zifmpW5nY9GialBYNmeSLS3bg5xDH+eCEilUUfDe7zGuVSuu/XkHacv/DYUst97e+6u44F7H8Kv8dTywJZpqbmveNPeWfCej2aBXdVV616J5lIRaj2uIYuQYG7blYJh9KZ7yLStdPndl6h65hIJpfWo0PM8nLJuo0lWNHz7misrutnmxJEjkwVIZ5YAmqp1Zz3VC8zw4IxkXrC/sPmp4PaNXgKz9ZJRaY2KV69WmHf7BUQ3QneGngbT0tN526SS5qDFwTGiuIlnYGWvTB2jVrbns68n/d8Fps8sSWfJBvvXJUEkaZB+1WqNilOPGXvyJ5k2O/iucFbRlxwlEHDny+AgsbtXZdp8cHQ4C/O4G0mnUMZuS38gn6e2kQ55mUhxKeORM+J6Rx1y4Iiu9KKNbxyS5eBpAlFB4xS/o35CS4g309vyOEhi37F24bpp4pM0xEPG4mcc/IyChHzaHUGEp1IX1ZO/r3ut9RIN2QWrGLUlZV/9rFKpLLAy6BkY/g8VYNrV8PztOL3rqy/qwqNZouONwPw8w8SA=',
168 version: '0.3', 165 version: '0.3',
169 creationDate: 'Fri Oct 17 17:01:59 PDT 2008', 166 creationDate: 'Fri Oct 17 17:01:59 PDT 2008',
170 updateDate: 'Fri Oct 17 17:01:59 PDT 2008', 167 updateDate: 'Fri Oct 17 17:01:59 PDT 2008',
171 accessDate: 'Mon Oct 27 08:57:58 PDT 2008' 168 accessDate: 'Mon Oct 27 08:57:58 PDT 2008'
172 } 169 }
173 } 170 }
174 }, 171 },
175 '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551': { 172 '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551': {
176 data: '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', 173 data: '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',
177 version: '0.2', 174 version: '0.2',
178 creationDate: 'Wed Mar 14 14:53:11 PDT 2007', 175 creationDate: 'Wed Mar 14 14:53:11 PDT 2007',
179 updateDate: 'Tue Apr 17 19:17:52 PDT 2007', 176 updateDate: 'Tue Apr 17 19:17:52 PDT 2007',
180 accessDate: 'Mon Jan 19 16:09:25 PDT 2009', 177 accessDate: 'Mon Jan 19 16:09:25 PDT 2009',
181 currentVersion: '88943d709c3ea2442d4f58eaaec6409276037e5a37e0a6d167b9dad9e947e854', 178 currentVersion: '88943d709c3ea2442d4f58eaaec6409276037e5a37e0a6d167b9dad9e947e854',
182 versions: { 179 versions: {
183 '106a1116d22c2395906a346da4d830c7afbd2da9a46210d0b7a11de238016783': { 180 '106a1116d22c2395906a346da4d830c7afbd2da9a46210d0b7a11de238016783': {
184 header: '####', 181 header: '####',
185 data: 'jgDUvByveAFnchBQKhiHGYDNDtj/7Aja2RePMer0FCOkkEu5GRAiLkxA3/DD3eiU+g+mCxnjnOaEIYL1O5o0+JP08XapsblZHTRKfveeFfs6sWwuqEHGYULBaXx4XSfK2B12HgpBwa5aD49489AkuyXi7t/aAXcKKJcLB1sC61DI3NsmajUaXHBi31Sp7nKAUpMuiWyguW0JVfH6KUPqyldVDBTBqHAis37c1qoR6aFHFfGgAfb35+syfmPRgemujMRkj2XO6dbt9zAYlHVSYFp9393rwPZoyBfXMMdDtSTmq7H9qbmx31GecHZlFN3NymtPPDYUbQ9mpPVRbxE9NjtiPrI5eGFvb++OdOx75PKjYjCAPWWFZ+4aryNn+h+yqab7pAuoG03ACVVrAFIOn09g1ssol/vqvalulEf3hAIviedyiNAC9D0UDHtzUwyIiELvR9qouXLZ', 182 data: 'jgDUvByveAFnchBQKhiHGYDNDtj/7Aja2RePMer0FCOkkEu5GRAiLkxA3/DD3eiU+g+mCxnjnOaEIYL1O5o0+JP08XapsblZHTRKfveeFfs6sWwuqEHGYULBaXx4XSfK2B12HgpBwa5aD49489AkuyXi7t/aAXcKKJcLB1sC61DI3NsmajUaXHBi31Sp7nKAUpMuiWyguW0JVfH6KUPqyldVDBTBqHAis37c1qoR6aFHFfGgAfb35+syfmPRgemujMRkj2XO6dbt9zAYlHVSYFp9393rwPZoyBfXMMdDtSTmq7H9qbmx31GecHZlFN3NymtPPDYUbQ9mpPVRbxE9NjtiPrI5eGFvb++OdOx75PKjYjCAPWWFZ+4aryNn+h+yqab7pAuoG03ACVVrAFIOn09g1ssol/vqvalulEf3hAIviedyiNAC9D0UDHtzUwyIiELvR9qouXLZ',
186 version: '0.2', 183 version: '0.2',
187 creationDate: 'Tue Apr 17 19:13:41 PDT 2007', 184 creationDate: 'Tue Apr 17 19:13:41 PDT 2007',
188 updateDate: 'Tue Apr 17 19:13:41 PDT 2007', 185 updateDate: 'Tue Apr 17 19:13:41 PDT 2007',
189 accessDate: 'Tue Apr 17 19:13:41 PDT 2007' 186 accessDate: 'Tue Apr 17 19:13:41 PDT 2007'
190 }, 187 },
191 '111a8a4b6b912b808a93cf5e8785ca223112628d05f0bfc5dfe1eb40cb72ed8a': { 188 '111a8a4b6b912b808a93cf5e8785ca223112628d05f0bfc5dfe1eb40cb72ed8a': {
192 header: '####', 189 header: '####',
193 data: 't524etHmXljCnLC+IM+WPD8Q5VE7wDsSHVNZzFU4hQzk119t/N/vhtfHYz5HgNstU5T8c7h7RHKvFk5f+4ZwgNgDqSH7H2PrH+7/bV8+uuqbe+/3GYOvELjTF7v3xMyYs1B7ruHpT+291HVNZqxajqCl/+9nbG0e5feqNsTXWUTdLzF0szJuCTNr2I+fhxAO0LRVaf8h+MBPYyuBDnfFDuKm899IsgF9YoYRvjaYO69DkElvf4VP2jrXIJsRnGIUfUaIS/wQ54+X4JBZM/9M09MVOw1SVe+cwG+P3xyPUkqnSb77ECo86C0MktzeYFmPnPv2SM2KFA6slctXsyudoaNlReh1k+6no5J5BjaawTfqYjYrAtWSPsuhxYVsZym/X2CVbkz4rMSn+J5Uio9N5uZ6AqgCKdhAJlwzVb3fIIJwvFpVpy/0LMskb7aG2i4eAxwzx1H6rD3Y', 190 data: 't524etHmXljCnLC+IM+WPD8Q5VE7wDsSHVNZzFU4hQzk119t/N/vhtfHYz5HgNstU5T8c7h7RHKvFk5f+4ZwgNgDqSH7H2PrH+7/bV8+uuqbe+/3GYOvELjTF7v3xMyYs1B7ruHpT+291HVNZqxajqCl/+9nbG0e5feqNsTXWUTdLzF0szJuCTNr2I+fhxAO0LRVaf8h+MBPYyuBDnfFDuKm899IsgF9YoYRvjaYO69DkElvf4VP2jrXIJsRnGIUfUaIS/wQ54+X4JBZM/9M09MVOw1SVe+cwG+P3xyPUkqnSb77ECo86C0MktzeYFmPnPv2SM2KFA6slctXsyudoaNlReh1k+6no5J5BjaawTfqYjYrAtWSPsuhxYVsZym/X2CVbkz4rMSn+J5Uio9N5uZ6AqgCKdhAJlwzVb3fIIJwvFpVpy/0LMskb7aG2i4eAxwzx1H6rD3Y',
194 version: '0.2', 191 version: '0.2',
195 creationDate: 'Wed Mar 14 14:53:11 PDT 2007', 192 creationDate: 'Wed Mar 14 14:53:11 PDT 2007',
196 updateDate: 'Wed Mar 14 14:53:11 PDT 2007', 193 updateDate: 'Wed Mar 14 14:53:11 PDT 2007',
197 accessDate: 'Wed Mar 14 15:24:35 PDT 2007' 194 accessDate: 'Wed Mar 14 15:24:35 PDT 2007'
198 }, 195 },
199 '144d6eff3eb5f1cb70c8906741d88018cdeeae3a618ac4066598ad6b04242364': { 196 '144d6eff3eb5f1cb70c8906741d88018cdeeae3a618ac4066598ad6b04242364': {
200 header: '####', 197 header: '####',
201 data: 'NPgSZF0eSOzy0/Ns+15Nz4bjSwh4o7fWYgKgwXLRFrF8y3EdbiOH7AiEmmPrCpT1raeYLWCcDIrRTz+/9uvIrz6kK6BjU2emr8YdyLai+PTCRY0SafWS3QiYixX6DJiKIt0SC2F6dfmSHwNsbfTHilFhVXn6wXTJpWvC+sRzw+h42cYpQp0BoLSuFV7vPz/+wtuQdl28BiBgLzGsrtPud0tPcfldGox6Ia/1SrOPcqUr0tnFlNQiUvPU7N0JZgRNyr1PfpAEhmYRI7aEJidsZ36vGQpE0ZQMmQE/9tLS/InALRZT1YXfMsytf0o3y4QlgJrvRgBL7fGiQOZJpU7igLk15xAwU+OLIaYIbr2xlKDJvndHOcrFoYKry9/A/aZSnEYv79wsaf64bBgIVD2WJGLuSFFmzlFnbg/O4kGTin3A8XBpvFA9V6iCMvnEMkrqxD3Qgf7WhxFE1A==', 198 data: 'NPgSZF0eSOzy0/Ns+15Nz4bjSwh4o7fWYgKgwXLRFrF8y3EdbiOH7AiEmmPrCpT1raeYLWCcDIrRTz+/9uvIrz6kK6BjU2emr8YdyLai+PTCRY0SafWS3QiYixX6DJiKIt0SC2F6dfmSHwNsbfTHilFhVXn6wXTJpWvC+sRzw+h42cYpQp0BoLSuFV7vPz/+wtuQdl28BiBgLzGsrtPud0tPcfldGox6Ia/1SrOPcqUr0tnFlNQiUvPU7N0JZgRNyr1PfpAEhmYRI7aEJidsZ36vGQpE0ZQMmQE/9tLS/InALRZT1YXfMsytf0o3y4QlgJrvRgBL7fGiQOZJpU7igLk15xAwU+OLIaYIbr2xlKDJvndHOcrFoYKry9/A/aZSnEYv79wsaf64bBgIVD2WJGLuSFFmzlFnbg/O4kGTin3A8XBpvFA9V6iCMvnEMkrqxD3Qgf7WhxFE1A==',
202 version: '0.2', 199 version: '0.2',
203 creationDate: 'Wed Mar 14 15:33:00 PDT 2007', 200 creationDate: 'Wed Mar 14 15:33:00 PDT 2007',
204 updateDate: 'Wed Mar 14 15:33:00 PDT 2007', 201 updateDate: 'Wed Mar 14 15:33:00 PDT 2007',
205 accessDate: 'Tue Apr 17 19:12:56 PDT 2007' 202 accessDate: 'Tue Apr 17 19:12:56 PDT 2007'
206 }, 203 },
207 '1f1bdb7a21440ac20c6d913d676aa30dc360252d27059e77df51a1be36b2e263': { 204 '1f1bdb7a21440ac20c6d913d676aa30dc360252d27059e77df51a1be36b2e263': {
208 header: '####', 205 header: '####',
209 data: 'TaOHH6IoHPKLLoyLyvsBszgsPPcDs6CiLVXzXuXjFSTrhPxzUw9suSsisgDRRs0ncjZ6BCyqoCxMnw6QVvGN4viUwYVR8AWdCg0NMQZ+LkNfq/2WN0M3KyASI8sIdMCwTb57NzOn9soB1HmmmETZfjr7HpY2cc+lS5/4f5rxI8XTEK60lLed+aEuJamAjeZUdgIyu30mMKKjxPfY3Y9iWMwn1OD0zF0mAW+hyEoMhhK7EYlWKCy+4qN0QM+yNFXQyERb04o2n4XrM+qr9df1GtbQMH8igK5VzXIrKjdHjKoLo9G7D7mfx6mRLsmoAJuE0R8gyzotgdBpOgWasHJ82iWEa1dLRKBHJ1d0Lnumv22tvYfasx2DIR5Tmx3kIQ3hFieLSXq48cYMiaZH/IbLiapIOlMgtWDow8JuySBLei/8FAV8jCxSc1Ui/SjbuK/kCvywaSOhDVIxGw==', 206 data: 'TaOHH6IoHPKLLoyLyvsBszgsPPcDs6CiLVXzXuXjFSTrhPxzUw9suSsisgDRRs0ncjZ6BCyqoCxMnw6QVvGN4viUwYVR8AWdCg0NMQZ+LkNfq/2WN0M3KyASI8sIdMCwTb57NzOn9soB1HmmmETZfjr7HpY2cc+lS5/4f5rxI8XTEK60lLed+aEuJamAjeZUdgIyu30mMKKjxPfY3Y9iWMwn1OD0zF0mAW+hyEoMhhK7EYlWKCy+4qN0QM+yNFXQyERb04o2n4XrM+qr9df1GtbQMH8igK5VzXIrKjdHjKoLo9G7D7mfx6mRLsmoAJuE0R8gyzotgdBpOgWasHJ82iWEa1dLRKBHJ1d0Lnumv22tvYfasx2DIR5Tmx3kIQ3hFieLSXq48cYMiaZH/IbLiapIOlMgtWDow8JuySBLei/8FAV8jCxSc1Ui/SjbuK/kCvywaSOhDVIxGw==',
210 version: '0.2', 207 version: '0.2',
211 creationDate: 'Wed Mar 14 15:26:35 PDT 2007', 208 creationDate: 'Wed Mar 14 15:26:35 PDT 2007',
212 updateDate: 'Wed Mar 14 15:26:35 PDT 2007', 209 updateDate: 'Wed Mar 14 15:26:35 PDT 2007',
213 accessDate: 'Wed Mar 14 15:26:35 PDT 2007' 210 accessDate: 'Wed Mar 14 15:26:35 PDT 2007'
214 }, 211 },
215 '70720f026f37b571e9765d27c51d3d60c7be0293c3266f1f987c8de9c6b5c416': { 212 '70720f026f37b571e9765d27c51d3d60c7be0293c3266f1f987c8de9c6b5c416': {
216 header: '####', 213 header: '####',
217 data: 'NYaYljcgfzrlN1DVgrbyj4AeVhXGjXPho3IQwEKD3ZOx/yEZxldCNSyFsrk7PoRB8Q1T/6VV4CGa4HLRSB7QVCrtVqWyu4KbbmFoX8NIQ0H3xv+TSo3S/b3dldUeyW32ScaGbspaf8nFf0CffsgpGusd+kHdiE3gSLJvH9y5j47KgpyyX4TteVzqgez4dcXIs5tdzJq2eUlknwU4651QeKIuRSmRaDRhhOP4yRgUo/qXMlTJFmHviCh+IumvBdmDoPe3Vc1vZ1r8PxpDJLvDoB8GTDE42NhqHfVrew9ym1xlTD9wswwIEikfOyTq3JM857qPOHRqSqthEvr4WHbm1VW5PReIyse0lugGyOzqtCnADp9NvNI440VjaTd4NBQqF7XrRm56+1u1uTdfYGFV5BRiH1KmrM1sxXQ6PlOF9Lou45ALo20xxvJOLKG0RKLMr8gmVT2bNtOSJw==', 214 data: 'NYaYljcgfzrlN1DVgrbyj4AeVhXGjXPho3IQwEKD3ZOx/yEZxldCNSyFsrk7PoRB8Q1T/6VV4CGa4HLRSB7QVCrtVqWyu4KbbmFoX8NIQ0H3xv+TSo3S/b3dldUeyW32ScaGbspaf8nFf0CffsgpGusd+kHdiE3gSLJvH9y5j47KgpyyX4TteVzqgez4dcXIs5tdzJq2eUlknwU4651QeKIuRSmRaDRhhOP4yRgUo/qXMlTJFmHviCh+IumvBdmDoPe3Vc1vZ1r8PxpDJLvDoB8GTDE42NhqHfVrew9ym1xlTD9wswwIEikfOyTq3JM857qPOHRqSqthEvr4WHbm1VW5PReIyse0lugGyOzqtCnADp9NvNI440VjaTd4NBQqF7XrRm56+1u1uTdfYGFV5BRiH1KmrM1sxXQ6PlOF9Lou45ALo20xxvJOLKG0RKLMr8gmVT2bNtOSJw==',
218 version: '0.2', 215 version: '0.2',
219 creationDate: 'Wed Mar 14 15:30:09 PDT 2007', 216 creationDate: 'Wed Mar 14 15:30:09 PDT 2007',
220 updateDate: 'Wed Mar 14 15:30:09 PDT 2007', 217 updateDate: 'Wed Mar 14 15:30:09 PDT 2007',
221 accessDate: 'Wed Mar 14 15:30:09 PDT 2007' 218 accessDate: 'Wed Mar 14 15:30:09 PDT 2007'
222 }, 219 },
223 '88943d709c3ea2442d4f58eaaec6409276037e5a37e0a6d167b9dad9e947e854': { 220 '88943d709c3ea2442d4f58eaaec6409276037e5a37e0a6d167b9dad9e947e854': {
224 header: '####', 221 header: '####',
225 data: 'xI3WXddQLFtLVzxJaZWQaw8wAgSuXLjLnyoNXnFuLecTH0BzU36PatglVh2HK3LM8aDLzzbHILdlLNnJ9CY+YnhmGh8hswF9oKTgq0Wsesgdc20QhSMNFFjmMljY1LSXmcAYK04Q5mIzi6Pe/04DRdj+e4zbe5QI4vEBhp/ohEpxZnNqc4BoX6J0eVf6LA1pwrKWvxzMxorWsJrrr+mn3svdlF437n+MMr89k5sQJogufes2GZ9tTvVZ4247ITxXqxgAhwXtbuIs/A5UqqnNdsxlHfpLKG5KjxB6F0h7TtFA3gkZCve5UmAibBnoBCFaIVWQyVq+VO9iqDm3DeXsK2pepvgIvpSID8Poy+uwN7T95mivAsHG5p7MtgN9KwQzNW3Iu+BfO9FlPBMngSk8L29So2CIXe6lEsXSGEi5Yrgyo6hZi6IkGCXwIQ7TCEMnlQEGyKnnAVik', 222 data: 'xI3WXddQLFtLVzxJaZWQaw8wAgSuXLjLnyoNXnFuLecTH0BzU36PatglVh2HK3LM8aDLzzbHILdlLNnJ9CY+YnhmGh8hswF9oKTgq0Wsesgdc20QhSMNFFjmMljY1LSXmcAYK04Q5mIzi6Pe/04DRdj+e4zbe5QI4vEBhp/ohEpxZnNqc4BoX6J0eVf6LA1pwrKWvxzMxorWsJrrr+mn3svdlF437n+MMr89k5sQJogufes2GZ9tTvVZ4247ITxXqxgAhwXtbuIs/A5UqqnNdsxlHfpLKG5KjxB6F0h7TtFA3gkZCve5UmAibBnoBCFaIVWQyVq+VO9iqDm3DeXsK2pepvgIvpSID8Poy+uwN7T95mivAsHG5p7MtgN9KwQzNW3Iu+BfO9FlPBMngSk8L29So2CIXe6lEsXSGEi5Yrgyo6hZi6IkGCXwIQ7TCEMnlQEGyKnnAVik',
226 version: '0.2', 223 version: '0.2',
227 creationDate: 'Tue Apr 17 19:17:52 PDT 2007', 224 creationDate: 'Tue Apr 17 19:17:52 PDT 2007',
228 updateDate: 'Tue Apr 17 19:17:52 PDT 2007', 225 updateDate: 'Tue Apr 17 19:17:52 PDT 2007',
229 accessDate: 'Mon Jan 19 16:09:25 PDT 2009' 226 accessDate: 'Mon Jan 19 16:09:25 PDT 2009'
230 }, 227 },
231 '9588b523f39cdfc14efa1e15ea7716c2d8eac45d8efd7bfeb19d716f9df72d66': { 228 '9588b523f39cdfc14efa1e15ea7716c2d8eac45d8efd7bfeb19d716f9df72d66': {
232 header: '####', 229 header: '####',
233 data: 'q6DKkxhgDFs1XkqOYf6dvojPF+yhJbniTLFpSOS+I1sum3EZIJfYxJXyi2Jx3KOVNBMILw1+vrSLe/fh5SSWj8ZBoeppkPPLjyRNdiUyd4IfcRM5OSv2YcTxCubKCH2kIMFAzY/29A6ZGPG+AN8/kxkEHc1fxKaNcj2Cs8qejNR8yK1iKT1Ut9VfEee+Eqy2Ohgdq8wL/xAD5mUzdqHeQl8BY16pXGIYncLxMzR+EJ8E5jJTuGv3O41UbO31lvBSfCt2pfz2MrtsuqNoI8LBHJkcR6t17Bj+rHZUniHlyxSW/1rQJ1NnwpPgUJ1fhfQJZM8Faoif+0bvWFY4xWs/tCCD7oEvf0xM0I3FfcJLbYX8M+wyO08t9BmGdEjnr3VUcuS9qKaJRpdpMP7aQf+vJvioeQDXdOJ6Ceo3BDFc6JdNta1Qc+agGzN2KPbIPrLDL+08hWl61yu3GQ==', 230 data: 'q6DKkxhgDFs1XkqOYf6dvojPF+yhJbniTLFpSOS+I1sum3EZIJfYxJXyi2Jx3KOVNBMILw1+vrSLe/fh5SSWj8ZBoeppkPPLjyRNdiUyd4IfcRM5OSv2YcTxCubKCH2kIMFAzY/29A6ZGPG+AN8/kxkEHc1fxKaNcj2Cs8qejNR8yK1iKT1Ut9VfEee+Eqy2Ohgdq8wL/xAD5mUzdqHeQl8BY16pXGIYncLxMzR+EJ8E5jJTuGv3O41UbO31lvBSfCt2pfz2MrtsuqNoI8LBHJkcR6t17Bj+rHZUniHlyxSW/1rQJ1NnwpPgUJ1fhfQJZM8Faoif+0bvWFY4xWs/tCCD7oEvf0xM0I3FfcJLbYX8M+wyO08t9BmGdEjnr3VUcuS9qKaJRpdpMP7aQf+vJvioeQDXdOJ6Ceo3BDFc6JdNta1Qc+agGzN2KPbIPrLDL+08hWl61yu3GQ==',
234 version: '0.2', 231 version: '0.2',
235 creationDate: 'Wed Mar 14 15:27:35 PDT 2007', 232 creationDate: 'Wed Mar 14 15:27:35 PDT 2007',
236 updateDate: 'Wed Mar 14 15:27:35 PDT 2007', 233 updateDate: 'Wed Mar 14 15:27:35 PDT 2007',
237 accessDate: 'Wed Mar 14 15:27:35 PDT 2007' 234 accessDate: 'Wed Mar 14 15:27:35 PDT 2007'
238 }, 235 },
239 'e5b71df0d4d79a195c7ec3288dd7738069837a7c4da3bccc1ebc05d8e4f19d79': { 236 'e5b71df0d4d79a195c7ec3288dd7738069837a7c4da3bccc1ebc05d8e4f19d79': {
240 header: '####', 237 header: '####',
241 data: '1NvK9Y5r0Q880BfB1W5IqdOR77mmqQU0d1GL1XUeQT75R2EgYE9rK1X1jLygCXboPhxzegEe7TDhUsn5XcHN0LkXcLYz8gD/7+He2HiTFxoHd2oQbI3ceBxDJ7+5kWA6Aiqy42QSCuA+TWIQcDVthSyFU7nNdqNxeBYeXiI4jgwcH3xvm0+pBf1OYLtywjUK1JwntP6o68b1LMQJFinDG+sqRcm25ggaZyxDtoLh1IBdSpmXk0papRnyyTGNgsws78dLxnH0Iqxb7FhqYfgLDIvN3i7+IALI0lF0EuTS0hSPlr/1fTz1/6bVt++wI9GpUsrdafUJJMPerXoCK+gAP8EMneLq4f5487HIkwWh1qON6Hvpg+tB95NOSJpqE72VpVxN4+wTQWyDMhfjqXBuQ1wKvTsD/mUsdinU0Wb/YT/zIWBNZPdqur0rjOC+mrOtSdlYSCH89Jj2', 238 data: '1NvK9Y5r0Q880BfB1W5IqdOR77mmqQU0d1GL1XUeQT75R2EgYE9rK1X1jLygCXboPhxzegEe7TDhUsn5XcHN0LkXcLYz8gD/7+He2HiTFxoHd2oQbI3ceBxDJ7+5kWA6Aiqy42QSCuA+TWIQcDVthSyFU7nNdqNxeBYeXiI4jgwcH3xvm0+pBf1OYLtywjUK1JwntP6o68b1LMQJFinDG+sqRcm25ggaZyxDtoLh1IBdSpmXk0papRnyyTGNgsws78dLxnH0Iqxb7FhqYfgLDIvN3i7+IALI0lF0EuTS0hSPlr/1fTz1/6bVt++wI9GpUsrdafUJJMPerXoCK+gAP8EMneLq4f5487HIkwWh1qON6Hvpg+tB95NOSJpqE72VpVxN4+wTQWyDMhfjqXBuQ1wKvTsD/mUsdinU0Wb/YT/zIWBNZPdqur0rjOC+mrOtSdlYSCH89Jj2',
242 version: '0.2', 239 version: '0.2',
243 creationDate: 'Tue Apr 17 19:15:09 PDT 2007', 240 creationDate: 'Tue Apr 17 19:15:09 PDT 2007',
244 updateDate: 'Tue Apr 17 19:15:09 PDT 2007', 241 updateDate: 'Tue Apr 17 19:15:09 PDT 2007',
245 accessDate: 'Tue Apr 17 19:17:01 PDT 2007' 242 accessDate: 'Tue Apr 17 19:17:01 PDT 2007'
246 } 243 }
247 } 244 }
248 }, 245 },
249 '36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113': { 246 '36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113': {
250 data: '6fhueIibbxKRA7Mtb9TPcWiUKajnikM3D7PbOROBkE39Vw9E/nG8KrtJlwwPQeOGCFhssO/KX3ymYehCR8rfaEL1f9pfdh5x69mSxKRlOmtEknWqUgPzcb1yPenRbQagERadh0LF4zu91M4WjXK9qynEHoxI/pBhwQb1IsnhwtXl4ELtajudv+2Hv3p75v4XOXFsGQMsHPY+Zw7dkFFA8EXhvuxjiGvnxCUkFwNICFRdHTEovkW3VSerLdrYo5lDgjY6ebr/g7wDGuu4RLfUK4+HpzFwZ0+aOrjpFq2ePg2xObvkkMNNjZ2PcR6Cue0sf+aNqzIHIlFPpY2Hmrob8+bwxocKA6aagBu7z5GiUmZNXGE/Vtr/WWBV2+xIJyzXZPet0MLmSnGiALjPJveeKnnFdDtA929ydcAb8efc0/snfU/uDoXDiO5SWEQ8DDNjj1bSo7VPTtvZyFormE1KjqimqSwaUJzbIS4CxPnoDezaBtQmlG4z8mc8jXq1HfPu7s9PUzcbG30gbF0ch2pDj4h47AhE0ZoeiV+VYZTaYateSifQXKBQKjPcuh9PQyDI0HVua3itbbwxXpRubEM4fbvlcd+7gu+Zq03slYICD07fP0I6XGrRHVTfYpDbEb4GJBvRIeZLwRTQzOeFbPLpBU9Lv3zXxfHfcHy9oK+giIxefPdY1ZR2ZFPKOO0xYJsTr0vmTuXeXzy56bKl+yP2lFst5l9QG8j2JcQEotDV1KQS6mbcLjfIpEnltu5fc2t10Q25Noh+F3kF+LcMIYsDjwanojYlOC93mZl01hmSJdimRTk9otjlRTyC7NWwiyy7fe5IyVi7ACNPZyeUYJUPtKWcPbT73Vtf8W3/+HdhmyYNyMQ9PDCBb9WKMon+qW2+ZVH5yv/KqMHRY1fflAfxpHNhrCkwqcAAGw+G/cetbvQjpkfVT2/u/uLupMsITN2Tgvr/8D2IMm3cyDBUCshrp0AfzARRygHFK4x/0uLfCtQSNjw6zMK8mn80R5aS5bZi5gRS8JBMZ4Q0iG4kBlLpIYtsXSBwl8faljjdl/4XvNNWWrdGJn2k0eM4cESlOFFk4s3Yu0Zspo17nKAHINjHAiP3VlhuKSnk5C9hMU5i3vZO8anQmx9UEwUgQVm22azCjyNtUl6jVPYSNsal7A==', 247 data: '6fhueIibbxKRA7Mtb9TPcWiUKajnikM3D7PbOROBkE39Vw9E/nG8KrtJlwwPQeOGCFhssO/KX3ymYehCR8rfaEL1f9pfdh5x69mSxKRlOmtEknWqUgPzcb1yPenRbQagERadh0LF4zu91M4WjXK9qynEHoxI/pBhwQb1IsnhwtXl4ELtajudv+2Hv3p75v4XOXFsGQMsHPY+Zw7dkFFA8EXhvuxjiGvnxCUkFwNICFRdHTEovkW3VSerLdrYo5lDgjY6ebr/g7wDGuu4RLfUK4+HpzFwZ0+aOrjpFq2ePg2xObvkkMNNjZ2PcR6Cue0sf+aNqzIHIlFPpY2Hmrob8+bwxocKA6aagBu7z5GiUmZNXGE/Vtr/WWBV2+xIJyzXZPet0MLmSnGiALjPJveeKnnFdDtA929ydcAb8efc0/snfU/uDoXDiO5SWEQ8DDNjj1bSo7VPTtvZyFormE1KjqimqSwaUJzbIS4CxPnoDezaBtQmlG4z8mc8jXq1HfPu7s9PUzcbG30gbF0ch2pDj4h47AhE0ZoeiV+VYZTaYateSifQXKBQKjPcuh9PQyDI0HVua3itbbwxXpRubEM4fbvlcd+7gu+Zq03slYICD07fP0I6XGrRHVTfYpDbEb4GJBvRIeZLwRTQzOeFbPLpBU9Lv3zXxfHfcHy9oK+giIxefPdY1ZR2ZFPKOO0xYJsTr0vmTuXeXzy56bKl+yP2lFst5l9QG8j2JcQEotDV1KQS6mbcLjfIpEnltu5fc2t10Q25Noh+F3kF+LcMIYsDjwanojYlOC93mZl01hmSJdimRTk9otjlRTyC7NWwiyy7fe5IyVi7ACNPZyeUYJUPtKWcPbT73Vtf8W3/+HdhmyYNyMQ9PDCBb9WKMon+qW2+ZVH5yv/KqMHRY1fflAfxpHNhrCkwqcAAGw+G/cetbvQjpkfVT2/u/uLupMsITN2Tgvr/8D2IMm3cyDBUCshrp0AfzARRygHFK4x/0uLfCtQSNjw6zMK8mn80R5aS5bZi5gRS8JBMZ4Q0iG4kBlLpIYtsXSBwl8faljjdl/4XvNNWWrdGJn2k0eM4cESlOFFk4s3Yu0Zspo17nKAHINjHAiP3VlhuKSnk5C9hMU5i3vZO8anQmx9UEwUgQVm22azCjyNtUl6jVPYSNsal7A==',
251 version: '0.3', 248 version: '0.3',
252 creationDate: 'Wed Mar 14 18:39:35 PDT 2007', 249 creationDate: 'Wed Mar 14 18:39:35 PDT 2007',
253 updateDate: 'Mon Oct 27 09:16:14 PDT 2008', 250 updateDate: 'Mon Oct 27 09:16:14 PDT 2008',
254 accessDate: 'Mon Jan 19 16:09:35 PDT 2009', 251 accessDate: 'Mon Jan 19 16:09:35 PDT 2009',
255 currentVersion: 'a96a6d8b9ac73fcdf874d8a8534ffb2d43da8f5222e96a4a29bd2ae437619463', 252 currentVersion: 'a96a6d8b9ac73fcdf874d8a8534ffb2d43da8f5222e96a4a29bd2ae437619463',
256 versions: { 253 versions: {
257 '381201fd3b67549bd6630841e8902be1499f3ff0c3514dd464ad9679f22f3561': { 254 '381201fd3b67549bd6630841e8902be1499f3ff0c3514dd464ad9679f22f3561': {
258 header: '####', 255 header: '####',
259 data: 'DgjIW4YcJAYnckuEUzBFkfEC841LuanGopPgp+YkyMn3xuzdpGq/ObLFMVQaeAuyErh1B0REHPbq0E/SRUZbeXLXWN720GU4GXvY5bnen2h7pHvl/H4yz+kvyKh3EHJmmBjuz8s0kclFJQB48lter+G93TEmUaFke9c9m0IkKlgzwZ/PQKZyIyfZA09KFaozdSxdFRbswZj2Vq8Df2PQsKLapZWX1wYQ3lXOcyvNdTULy9MCXwPwX6te6hTLWxQOiSPsvB8LItlhQUsSbrJcJEvWPlBupPu5SeI25zDnqKDETPep63Ks2GWf45nXZzYYmQMzL0l2cenYFxlE18TcOd1Ms24TQ/iDKMhi60zZoo13qjVT5AKZ80KNu46t08qbACxjv/LeK2aM5TNycTFixGskPywpnb6MCo8ibRe5rs1WcTJRMD04sNoiuriivO2fiyo4rxjfdyfueMlOz+Zeztk=', 256 data: 'DgjIW4YcJAYnckuEUzBFkfEC841LuanGopPgp+YkyMn3xuzdpGq/ObLFMVQaeAuyErh1B0REHPbq0E/SRUZbeXLXWN720GU4GXvY5bnen2h7pHvl/H4yz+kvyKh3EHJmmBjuz8s0kclFJQB48lter+G93TEmUaFke9c9m0IkKlgzwZ/PQKZyIyfZA09KFaozdSxdFRbswZj2Vq8Df2PQsKLapZWX1wYQ3lXOcyvNdTULy9MCXwPwX6te6hTLWxQOiSPsvB8LItlhQUsSbrJcJEvWPlBupPu5SeI25zDnqKDETPep63Ks2GWf45nXZzYYmQMzL0l2cenYFxlE18TcOd1Ms24TQ/iDKMhi60zZoo13qjVT5AKZ80KNu46t08qbACxjv/LeK2aM5TNycTFixGskPywpnb6MCo8ibRe5rs1WcTJRMD04sNoiuriivO2fiyo4rxjfdyfueMlOz+Zeztk=',
260 version: '0.2', 257 version: '0.2',
261 creationDate: 'Wed Mar 14 18:39:55 PDT 2007', 258 creationDate: 'Wed Mar 14 18:39:55 PDT 2007',
262 updateDate: 'Wed Mar 14 18:39:55 PDT 2007', 259 updateDate: 'Wed Mar 14 18:39:55 PDT 2007',
263 accessDate: 'Mon Oct 27 09:07:56 PDT 2008' 260 accessDate: 'Mon Oct 27 09:07:56 PDT 2008'
264 }, 261 },
265 '99dc86ebeb20a3db0c5393d6d94bc1150187b04316a876970dbbcf517b55d6f2': { 262 '99dc86ebeb20a3db0c5393d6d94bc1150187b04316a876970dbbcf517b55d6f2': {
266 header: '####', 263 header: '####',
267 data: 'AJwqCWNKC9z8DC4TUI0hWnqHvQ40Y/x+jXylnVAkyO2QYQcqg51odLFSfgP0GiGEGPYwDc+kUxRrfO+ITgTNm+hHi2iIWkP/ljAC+AQ56MAEKsU/USTbvl6ShZ0XTAdRpwI/oqqOhYThVs6jTm/J8+lx4tWoMtNj835py88c/9eW26pLQubr7VysLSWuIMi+iDp7zXZZz/0gxGKDe5xNq4MGIYw8/OK1iJCOsjBdrRygLlS/Mz9sRlKkwdrDsohtRG0F/NdsIoaU4FttGs/rY91SCedvHy6ovh0zXhxOO44O6MiMbP085D1jCjWJn9S1RBxjxc368MGfMJeZja87nuvgSnLS2tGDL6zFtVJMNcH/7GqQPXZv/sNEykDNWpypchCnwYUJxvBVb45FcUzagPm+SSiekWK1hrEntZkZuEhQZp7Ud9RcENpa5h7wXUJSV1vPl8xBylx9HWmxez7D9OYRqbOlCRAEDqup4ahNhYB9', 264 data: 'AJwqCWNKC9z8DC4TUI0hWnqHvQ40Y/x+jXylnVAkyO2QYQcqg51odLFSfgP0GiGEGPYwDc+kUxRrfO+ITgTNm+hHi2iIWkP/ljAC+AQ56MAEKsU/USTbvl6ShZ0XTAdRpwI/oqqOhYThVs6jTm/J8+lx4tWoMtNj835py88c/9eW26pLQubr7VysLSWuIMi+iDp7zXZZz/0gxGKDe5xNq4MGIYw8/OK1iJCOsjBdrRygLlS/Mz9sRlKkwdrDsohtRG0F/NdsIoaU4FttGs/rY91SCedvHy6ovh0zXhxOO44O6MiMbP085D1jCjWJn9S1RBxjxc368MGfMJeZja87nuvgSnLS2tGDL6zFtVJMNcH/7GqQPXZv/sNEykDNWpypchCnwYUJxvBVb45FcUzagPm+SSiekWK1hrEntZkZuEhQZp7Ud9RcENpa5h7wXUJSV1vPl8xBylx9HWmxez7D9OYRqbOlCRAEDqup4ahNhYB9',
268 version: '0.3', 265 version: '0.3',
269 creationDate: 'Mon Oct 27 09:09:11 PDT 2008', 266 creationDate: 'Mon Oct 27 09:09:11 PDT 2008',
270 updateDate: 'Mon Oct 27 09:09:11 PDT 2008', 267 updateDate: 'Mon Oct 27 09:09:11 PDT 2008',
271 accessDate: 'Mon Oct 27 09:15:58 PDT 2008' 268 accessDate: 'Mon Oct 27 09:15:58 PDT 2008'
272 }, 269 },
273 '9fbfcd3e7fe30d549a813f0e6c1be58ed45c3ae7305d7367bffefa097b424ee6': { 270 '9fbfcd3e7fe30d549a813f0e6c1be58ed45c3ae7305d7367bffefa097b424ee6': {
274 header: '####', 271 header: '####',
275 data: 'nZ+Lc5LWWLxnPvUrRrHhxG35PHq7GMbVENHfV1oS0Qw7/63NecssNoEbiOwFVMjAshvfUK7IjnzyvfQhNtFRbj2yzHOTWCd0eJ0O0MmvGzjpUntSDu9/G8RFeEu9jDKugwi/NhOa5legjT9pcsEAqR4s4NN/Ac6juQb6D/Z6Wd6wO0JQhT5/QPk1KllDpDeo2i/GPUKvEi/dXpik0KQcVLVylU82rf6hwEgvRQi+j0O5hnFW1E4ttxClrnPBEBv60jkNwcIpD0r+rvomDe8+398xUuB4DVDJoM+WUYfu6Sm3qI0yBfET+tJvjn8WsHhKTgZpOc2BXC7EdF99nNEg6kV5pSxV6AUA1XUz5kW+YfcSzAXzUH74OqroC0SucHe4+BtRKnbJy4h5vRfjTD+FJaj1Va02cxSR55tQhxm/k67z0QeyB98dnU1l/pPHwBlIWa1eR74gswNSeQ2jrzu5JeQ=', 272 data: 'nZ+Lc5LWWLxnPvUrRrHhxG35PHq7GMbVENHfV1oS0Qw7/63NecssNoEbiOwFVMjAshvfUK7IjnzyvfQhNtFRbj2yzHOTWCd0eJ0O0MmvGzjpUntSDu9/G8RFeEu9jDKugwi/NhOa5legjT9pcsEAqR4s4NN/Ac6juQb6D/Z6Wd6wO0JQhT5/QPk1KllDpDeo2i/GPUKvEi/dXpik0KQcVLVylU82rf6hwEgvRQi+j0O5hnFW1E4ttxClrnPBEBv60jkNwcIpD0r+rvomDe8+398xUuB4DVDJoM+WUYfu6Sm3qI0yBfET+tJvjn8WsHhKTgZpOc2BXC7EdF99nNEg6kV5pSxV6AUA1XUz5kW+YfcSzAXzUH74OqroC0SucHe4+BtRKnbJy4h5vRfjTD+FJaj1Va02cxSR55tQhxm/k67z0QeyB98dnU1l/pPHwBlIWa1eR74gswNSeQ2jrzu5JeQ=',
276 version: '0.2', 273 version: '0.2',
277 creationDate: 'Wed Mar 14 18:39:35 PDT 2007', 274 creationDate: 'Wed Mar 14 18:39:35 PDT 2007',
278 updateDate: 'Wed Mar 14 18:39:35 PDT 2007', 275 updateDate: 'Wed Mar 14 18:39:35 PDT 2007',
279 accessDate: 'Wed Mar 14 18:39:35 PDT 2007' 276 accessDate: 'Wed Mar 14 18:39:35 PDT 2007'
280 }, 277 },
281 'a96a6d8b9ac73fcdf874d8a8534ffb2d43da8f5222e96a4a29bd2ae437619463': { 278 'a96a6d8b9ac73fcdf874d8a8534ffb2d43da8f5222e96a4a29bd2ae437619463': {
282 header: '####', 279 header: '####',
283 data: 'm3yhZu81UAjCY6U2Knrgg8mK+LX35Y/iZgIEm8MuRDAlg6UUz9Z1Anu63COFV08YyYQRuBzTgR9YQ8wrUD1S9FG2ZmtCDemqvd+5OUMgdn4sK7G3CuzAc5osOa5neU2m4y19WuobkGnhO78ko7pVVjO42q0DeMT92uFL6KE/2UCkWlq5SdFyS5qXEJEWs2IO5C8nVpdlO/eZ36Pl2+v+afl3QQMTthCVIUR4/zVP2ajbO48yjDXhYxzskFjtXMYLApEn0wO0dcifcsYhPkozz6Locrt/R6IZXnfZfuW5XXHbqhutoJFPK6L6t0Ib3B2r1TNkPaMsVs2g5V1g3ENRd0IlbG/uBk2o5tgeu6gOYlA1scEiL+/ad9ZxiqYB2ENCGZ8DXA4VNMnzxVPbO96OIUCb9suV0fldGOg=', 280 data: 'm3yhZu81UAjCY6U2Knrgg8mK+LX35Y/iZgIEm8MuRDAlg6UUz9Z1Anu63COFV08YyYQRuBzTgR9YQ8wrUD1S9FG2ZmtCDemqvd+5OUMgdn4sK7G3CuzAc5osOa5neU2m4y19WuobkGnhO78ko7pVVjO42q0DeMT92uFL6KE/2UCkWlq5SdFyS5qXEJEWs2IO5C8nVpdlO/eZ36Pl2+v+afl3QQMTthCVIUR4/zVP2ajbO48yjDXhYxzskFjtXMYLApEn0wO0dcifcsYhPkozz6Locrt/R6IZXnfZfuW5XXHbqhutoJFPK6L6t0Ib3B2r1TNkPaMsVs2g5V1g3ENRd0IlbG/uBk2o5tgeu6gOYlA1scEiL+/ad9ZxiqYB2ENCGZ8DXA4VNMnzxVPbO96OIUCb9suV0fldGOg=',
284 version: '0.3', 281 version: '0.3',
285 creationDate: 'Mon Oct 27 09:16:14 PDT 2008', 282 creationDate: 'Mon Oct 27 09:16:14 PDT 2008',
286 updateDate: 'Mon Oct 27 09:16:14 PDT 2008', 283 updateDate: 'Mon Oct 27 09:16:14 PDT 2008',
287 accessDate: 'Mon Jan 19 16:09:35 PDT 2009' 284 accessDate: 'Mon Jan 19 16:09:35 PDT 2009'
288 } 285 }
289 } 286 }
290 }, 287 },
291 '507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a': { 288 '507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a': {
292 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', 289 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',
293 version: '0.2', 290 version: '0.2',
294 creationDate: 'Wed Mar 14 16:01:24 PDT 2007', 291 creationDate: 'Wed Mar 14 16:01:24 PDT 2007',
295 updateDate: 'Wed Mar 14 16:01:24 PDT 2007', 292 updateDate: 'Wed Mar 14 16:01:24 PDT 2007',
296 accessDate: 'Mon Jan 19 16:10:11 PDT 2009', 293 accessDate: 'Mon Jan 19 16:10:11 PDT 2009',
297 currentVersion: '395eb58606138588dcd7e659065db48775610cc1e90cbd03368c063e02e55c8b', 294 currentVersion: '395eb58606138588dcd7e659065db48775610cc1e90cbd03368c063e02e55c8b',
298 versions: { 295 versions: {
299 '395eb58606138588dcd7e659065db48775610cc1e90cbd03368c063e02e55c8b': { 296 '395eb58606138588dcd7e659065db48775610cc1e90cbd03368c063e02e55c8b': {
300 header: '####', 297 header: '####',
301 data: 'sgq3FGcsnlbhTLetMa3TQQE6uFZv/JL6Awha1066IimKoAtQGbAr6E1+mxRmvJle91sL7oRfi6suvDanYHfAI+rrG6qCOtESn70ssS+aGFyO3XwFgypzG/Qa34bjxJ16Aqd93H8IdhzdtOxs2Qmou3CjyxbT7Cq+YW/fAo1WfctL4yE4GBNPWC5lfebxSmINlBY+zTjhv9Pf2aK6vL4p3obHl+zhz0YdKAMBwbDyCLa9tYvhGBnq/W6lFUsyZCPVJJP3bQCQww0TNCcLJLm+SYVSiC0NwCQJq+yNqDkWTvv41p5EDB06eOQ2VqC7l4i/JLE/ql9h9Z++gck74/Qs3ppdVdG7sTzWyPya4v3RW2OTc1awFRZipAX5Zd7I97dyw6Yym4y+/9UT8z8iMDYykQ4+QnOhksDIE9a8q6agDF/rbZ/BCRcMWbFylGTdudk26mu0GdPiuLDu', 298 data: 'sgq3FGcsnlbhTLetMa3TQQE6uFZv/JL6Awha1066IimKoAtQGbAr6E1+mxRmvJle91sL7oRfi6suvDanYHfAI+rrG6qCOtESn70ssS+aGFyO3XwFgypzG/Qa34bjxJ16Aqd93H8IdhzdtOxs2Qmou3CjyxbT7Cq+YW/fAo1WfctL4yE4GBNPWC5lfebxSmINlBY+zTjhv9Pf2aK6vL4p3obHl+zhz0YdKAMBwbDyCLa9tYvhGBnq/W6lFUsyZCPVJJP3bQCQww0TNCcLJLm+SYVSiC0NwCQJq+yNqDkWTvv41p5EDB06eOQ2VqC7l4i/JLE/ql9h9Z++gck74/Qs3ppdVdG7sTzWyPya4v3RW2OTc1awFRZipAX5Zd7I97dyw6Yym4y+/9UT8z8iMDYykQ4+QnOhksDIE9a8q6agDF/rbZ/BCRcMWbFylGTdudk26mu0GdPiuLDu',
302 version: '0.2', 299 version: '0.2',
303 creationDate: 'Wed Mar 14 16:01:24 PDT 2007', 300 creationDate: 'Wed Mar 14 16:01:24 PDT 2007',
304 updateDate: 'Wed Mar 14 16:01:24 PDT 2007', 301 updateDate: 'Wed Mar 14 16:01:24 PDT 2007',
305 accessDate: 'Mon Jan 19 16:10:11 PDT 2009' 302 accessDate: 'Mon Jan 19 16:10:11 PDT 2009'
306 } 303 }
307 } 304 }
308 }, 305 },
309 '5cdac63b317f3942da38f3a3de3b7f0e5d6678200951c6216230295550f63fb4': { 306 '5cdac63b317f3942da38f3a3de3b7f0e5d6678200951c6216230295550f63fb4': {
310 data: 'Xs+z3VzIqsWa7dGBqepwq75lTsx3yemNhTdRYYDDc3Kzpycyp961SgnKXHjE51266mfmj85ASFi/FKCOwk17lbD5UT3iawtc3TdgrQ18vBhBsmOA2F4JAa4yC58bTaXbyld3c4izDp7i9+iyRaFN52NWJznN82SXuRtPdWRtAxXB1V5Tyg==', 307 data: 'Xs+z3VzIqsWa7dGBqepwq75lTsx3yemNhTdRYYDDc3Kzpycyp961SgnKXHjE51266mfmj85ASFi/FKCOwk17lbD5UT3iawtc3TdgrQ18vBhBsmOA2F4JAa4yC58bTaXbyld3c4izDp7i9+iyRaFN52NWJznN82SXuRtPdWRtAxXB1V5Tyg==',
311 version: '0.3', 308 version: '0.3',
312 creationDate: 'Mon Jan 05 17:45:25 PDT 2009', 309 creationDate: 'Mon Jan 05 17:45:25 PDT 2009',
313 updateDate: 'Mon Jan 05 17:45:25 PDT 2009', 310 updateDate: 'Mon Jan 05 17:45:25 PDT 2009',
314 accessDate: 'Mon Jan 19 16:10:21 PDT 2009', 311 accessDate: 'Mon Jan 19 16:10:21 PDT 2009',
315 currentVersion: '00b3a4cd7400cfc1e7f7b369bdc3dcdaa50d6020233e131b30d755c89249ea9d', 312 currentVersion: '00b3a4cd7400cfc1e7f7b369bdc3dcdaa50d6020233e131b30d755c89249ea9d',
316 versions: { 313 versions: {
317 '00b3a4cd7400cfc1e7f7b369bdc3dcdaa50d6020233e131b30d755c89249ea9d': { 314 '00b3a4cd7400cfc1e7f7b369bdc3dcdaa50d6020233e131b30d755c89249ea9d': {
318 header: '####', 315 header: '####',
319 data: 'uGAV9pZTjrTwBy24TX/OUQwGmgzTnXv1JBIxdGkeoLCUhP9tAjbpUVylrUI5+VRrFYkXYyZ0o2HEgKrun2f3PODTxlmAbfkUldOV5tyV/EUxN0vYSBtgsMpqQm3bOKRIAo/uzrhSE3iwMjvKOTH2jUrkmX6hmqhXWZfa4X231GovrnOjek8c7t+LUBmmIjXEr2GSc/UbBoFnni+Q7ZArwtU68xoeCjLame1e8Y9wvCO8gIfAzXQAHsDgzn1MVeiWIqiCBTs8YKCO1yaxZpkzXV0yWzX+bHyXlKWwAk7Fu9w0CuaRULZmRCQhv+MMDw8DEXciTm0R5dRiVmSCFBy8cL9qlSeSX0GlnKl8E4/TSqvhMJblwJJsgmGSZ9cEt2u0E08tHxKuoeaaT1rpAOoiqx+z7BdhqjWOQZOGM4gR3EwqvOQoNYFUaXjAdmiUzW+e+TgE1IBQ8udRFl/D2zCcqFO90Hgc7hHsTDI3aGYvi6bHADu8hFpmZtJAjOMv1JgCX4Hm4n+SsbHd0DIfkEUMeGlVO47lcGWBZNRRm7xl8luZ4sZn', 316 data: 'uGAV9pZTjrTwBy24TX/OUQwGmgzTnXv1JBIxdGkeoLCUhP9tAjbpUVylrUI5+VRrFYkXYyZ0o2HEgKrun2f3PODTxlmAbfkUldOV5tyV/EUxN0vYSBtgsMpqQm3bOKRIAo/uzrhSE3iwMjvKOTH2jUrkmX6hmqhXWZfa4X231GovrnOjek8c7t+LUBmmIjXEr2GSc/UbBoFnni+Q7ZArwtU68xoeCjLame1e8Y9wvCO8gIfAzXQAHsDgzn1MVeiWIqiCBTs8YKCO1yaxZpkzXV0yWzX+bHyXlKWwAk7Fu9w0CuaRULZmRCQhv+MMDw8DEXciTm0R5dRiVmSCFBy8cL9qlSeSX0GlnKl8E4/TSqvhMJblwJJsgmGSZ9cEt2u0E08tHxKuoeaaT1rpAOoiqx+z7BdhqjWOQZOGM4gR3EwqvOQoNYFUaXjAdmiUzW+e+TgE1IBQ8udRFl/D2zCcqFO90Hgc7hHsTDI3aGYvi6bHADu8hFpmZtJAjOMv1JgCX4Hm4n+SsbHd0DIfkEUMeGlVO47lcGWBZNRRm7xl8luZ4sZn',
320 version: '0.3', 317 version: '0.3',
321 creationDate: 'Mon Jan 05 17:45:25 PDT 2009', 318 creationDate: 'Mon Jan 05 17:45:25 PDT 2009',
322 updateDate: 'Mon Jan 05 17:45:25 PDT 2009', 319 updateDate: 'Mon Jan 05 17:45:25 PDT 2009',
323 accessDate: 'Mon Jan 19 16:10:21 PDT 2009' 320 accessDate: 'Mon Jan 19 16:10:21 PDT 2009'
324 } 321 }
325 } 322 }
326 }, 323 },
327 '6026370f3db3860d2c46a08e389a7e906dc14f98c8444b21be9a7e9f405a2728': { 324 '6026370f3db3860d2c46a08e389a7e906dc14f98c8444b21be9a7e9f405a2728': {
328 data: '3oUg1TD+Lu4ou06j/MddOTXDqRM+qSKD+6Iuzia1Hop1w7v/BXidqeoKJZQI2VY9oO9B70Nr3B3wDROF+ycy6Rq+FM/xqUGHKXn1lAaSc6Wgj6TLQ6eRF6YZKSPqTj7TDWyw/2pEWk4HjcT8drTrCaC02tzAXMhYWlYPQPW4fUdq4hawoHIdopUN3vafQuFjY47OhqXKav3bNao=', 325 data: '3oUg1TD+Lu4ou06j/MddOTXDqRM+qSKD+6Iuzia1Hop1w7v/BXidqeoKJZQI2VY9oO9B70Nr3B3wDROF+ycy6Rq+FM/xqUGHKXn1lAaSc6Wgj6TLQ6eRF6YZKSPqTj7TDWyw/2pEWk4HjcT8drTrCaC02tzAXMhYWlYPQPW4fUdq4hawoHIdopUN3vafQuFjY47OhqXKav3bNao=',
329 version: '0.2', 326 version: '0.2',
330 creationDate: 'Tue Apr 17 16:36:08 PDT 2007', 327 creationDate: 'Tue Apr 17 16:36:08 PDT 2007',
331 updateDate: 'Tue Apr 17 16:36:08 PDT 2007', 328 updateDate: 'Tue Apr 17 16:36:08 PDT 2007',
332 accessDate: 'Mon Jan 19 16:09:33 PDT 2009', 329 accessDate: 'Mon Jan 19 16:09:33 PDT 2009',
333 currentVersion: 'bf8d46022179715d9d27e0a256b56b50828a771c3c6b46fe36fb2982dcb3b4cc', 330 currentVersion: 'bf8d46022179715d9d27e0a256b56b50828a771c3c6b46fe36fb2982dcb3b4cc',
334 versions: { 331 versions: {
335 'bf8d46022179715d9d27e0a256b56b50828a771c3c6b46fe36fb2982dcb3b4cc': { 332 'bf8d46022179715d9d27e0a256b56b50828a771c3c6b46fe36fb2982dcb3b4cc': {
336 header: '####', 333 header: '####',
337 data: 'fehYRMkg/wFj2t/aWu7szbXwrCyCDpjQN4UNck4/OiDlth70a2ve6ow5lAi2jgdlV9WiFrPejfa8dD0Z1g19jx+BBsuUYnBEKD0K+NapdJBBeI0We2nj9nYIij2dfZVx7cuvhy8sN6+DdylUQLsFHbga+Gi5hWcMuULT4GOAIy2WanSQL1RSR4ruA6zm/t+VVboEkkm7PPT+w3LuRl3wRaD4a8ZwYiSV/SzgWooFrh2S3YOUeshdaGCiYpTbXscsOxsCxc11i6wQGBqYSjksmtZDvEegdQdzCmxvq4jaVWJElYYS3av612nD5K/w7Zei6RccBiODBPATjrIczYg7HwmQxIM/6QI9/LQn0LP0yqRVUUtfzaODf0uWNpFzml9l/1lwXuBJyQFBp7H7Th46ekw9yEuPD00oZ+eXvKwbwfUU0JshT4hnEBtIjM8fH974PU0y95f0yLAJ1+M6DVXCxGsBix2aKJx9fuZP4KGpaXg6qCb/6327rph7MGomcrGPIiDjYwD/NTMdGluc55OZfGXtOZUaJCUM6nihqDwU7Ly1ZzYorgcvkX/t/0RNcOkFzGYNByp7mdcotyiHqCDKspqz9mEXAd7Noz3HO5GFpPqbRo7htDigGU1f7dvgbbfRoTz17Bt9Mw==', 334 data: 'fehYRMkg/wFj2t/aWu7szbXwrCyCDpjQN4UNck4/OiDlth70a2ve6ow5lAi2jgdlV9WiFrPejfa8dD0Z1g19jx+BBsuUYnBEKD0K+NapdJBBeI0We2nj9nYIij2dfZVx7cuvhy8sN6+DdylUQLsFHbga+Gi5hWcMuULT4GOAIy2WanSQL1RSR4ruA6zm/t+VVboEkkm7PPT+w3LuRl3wRaD4a8ZwYiSV/SzgWooFrh2S3YOUeshdaGCiYpTbXscsOxsCxc11i6wQGBqYSjksmtZDvEegdQdzCmxvq4jaVWJElYYS3av612nD5K/w7Zei6RccBiODBPATjrIczYg7HwmQxIM/6QI9/LQn0LP0yqRVUUtfzaODf0uWNpFzml9l/1lwXuBJyQFBp7H7Th46ekw9yEuPD00oZ+eXvKwbwfUU0JshT4hnEBtIjM8fH974PU0y95f0yLAJ1+M6DVXCxGsBix2aKJx9fuZP4KGpaXg6qCb/6327rph7MGomcrGPIiDjYwD/NTMdGluc55OZfGXtOZUaJCUM6nihqDwU7Ly1ZzYorgcvkX/t/0RNcOkFzGYNByp7mdcotyiHqCDKspqz9mEXAd7Noz3HO5GFpPqbRo7htDigGU1f7dvgbbfRoTz17Bt9Mw==',
338 version: '0.2', 335 version: '0.2',
339 creationDate: 'Tue Apr 17 16:36:08 PDT 2007', 336 creationDate: 'Tue Apr 17 16:36:08 PDT 2007',
340 updateDate: 'Tue Apr 17 16:36:08 PDT 2007', 337 updateDate: 'Tue Apr 17 16:36:08 PDT 2007',
341 accessDate: 'Mon Jan 19 16:09:33 PDT 2009' 338 accessDate: 'Mon Jan 19 16:09:33 PDT 2009'
342 } 339 }
343 } 340 }
344 }, 341 },
345 '6c25be8e145efb26a1abd59590522f73fb2e3dbc139af2217074d9e2ba92c16a': { 342 '6c25be8e145efb26a1abd59590522f73fb2e3dbc139af2217074d9e2ba92c16a': {
346 data: 'b2mcYUi59l434kGl7ij6dBu3063UL1dToMIu3Zsa9RV9RzeLKnezJhLKunqoAm7KwiJeqDo/REexHI1cshGYtHasVXXuyJfMx1grH7yhoWnkSRF4Sax6w5E5wnGkEpGJHOxXJ9rOjWHZ7yqCUUCB/dqLw4FwPOtRb/ynkBEYztEJA6EKGJuz0vrrTOsT8HMXtj/w6MEZ7qI3fPs=', 343 data: 'b2mcYUi59l434kGl7ij6dBu3063UL1dToMIu3Zsa9RV9RzeLKnezJhLKunqoAm7KwiJeqDo/REexHI1cshGYtHasVXXuyJfMx1grH7yhoWnkSRF4Sax6w5E5wnGkEpGJHOxXJ9rOjWHZ7yqCUUCB/dqLw4FwPOtRb/ynkBEYztEJA6EKGJuz0vrrTOsT8HMXtj/w6MEZ7qI3fPs=',
347 version: '0.2', 344 version: '0.2',
348 creationDate: 'Mon Apr 02 19:12:44 PDT 2007', 345 creationDate: 'Mon Apr 02 19:12:44 PDT 2007',
349 updateDate: 'Mon Apr 02 19:12:44 PDT 2007', 346 updateDate: 'Mon Apr 02 19:12:44 PDT 2007',
350 accessDate: 'Mon Jan 19 16:10:08 PDT 2009', 347 accessDate: 'Mon Jan 19 16:10:08 PDT 2009',
351 currentVersion: '2f60193c0fc0e3f2f178955e1c68759675acdf691bcb918cfad329a5a97cfaf3', 348 currentVersion: '2f60193c0fc0e3f2f178955e1c68759675acdf691bcb918cfad329a5a97cfaf3',
352 versions: { 349 versions: {
353 '2f60193c0fc0e3f2f178955e1c68759675acdf691bcb918cfad329a5a97cfaf3': { 350 '2f60193c0fc0e3f2f178955e1c68759675acdf691bcb918cfad329a5a97cfaf3': {
354 header: '####', 351 header: '####',
355 data: 'pZEWSdYIkrX8/r6OYmO0GEuKG9baUgn40Bmw7hXZBd/kfWuRjWsL4/pc5F5Ojrx+N0dxmQn5ZqKAzOOri29Rm4ruxnCbyK+oDsCDyMSnWy/VJcvystnDKzKmBRQVAOSEJtzEb3OtGzvqm0PQ1Dhx1YUAx7L6KlXysmG9h9+MjOcErRL9/1x1LZ33ytR+zK4LvTAb7gN5/9QgwysFyCkNP8bG4nyCzPMiUrBnP0odMTUvDkJDlY0Oia6VjGW6oNxnGIgA5fDraRrW4JH2oejQcrL7+X+jpCp05g==', 352 data: 'pZEWSdYIkrX8/r6OYmO0GEuKG9baUgn40Bmw7hXZBd/kfWuRjWsL4/pc5F5Ojrx+N0dxmQn5ZqKAzOOri29Rm4ruxnCbyK+oDsCDyMSnWy/VJcvystnDKzKmBRQVAOSEJtzEb3OtGzvqm0PQ1Dhx1YUAx7L6KlXysmG9h9+MjOcErRL9/1x1LZ33ytR+zK4LvTAb7gN5/9QgwysFyCkNP8bG4nyCzPMiUrBnP0odMTUvDkJDlY0Oia6VjGW6oNxnGIgA5fDraRrW4JH2oejQcrL7+X+jpCp05g==',
356 version: '0.2', 353 version: '0.2',
357 creationDate: 'Mon Apr 02 19:12:44 PDT 2007', 354 creationDate: 'Mon Apr 02 19:12:44 PDT 2007',
358 updateDate: 'Mon Apr 02 19:12:44 PDT 2007', 355 updateDate: 'Mon Apr 02 19:12:44 PDT 2007',
359 accessDate: 'Mon Jan 19 16:10:08 PDT 2009' 356 accessDate: 'Mon Jan 19 16:10:08 PDT 2009'
360 } 357 }
361 } 358 }
362 }, 359 },
363 '6d45c2fec275b7482d41c76b20507100cfb6ab49922b876f9dd3040d361f4a18': { 360 '6d45c2fec275b7482d41c76b20507100cfb6ab49922b876f9dd3040d361f4a18': {
364 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==', 361 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==',
365 version: '0.2', 362 version: '0.2',
366 creationDate: 'Wed Mar 14 19:09:05 PDT 2007', 363 creationDate: 'Wed Mar 14 19:09:05 PDT 2007',
367 updateDate: 'Wed Mar 14 19:09:05 PDT 2007', 364 updateDate: 'Wed Mar 14 19:09:05 PDT 2007',
368 accessDate: 'Mon Jan 19 16:10:15 PDT 2009', 365 accessDate: 'Mon Jan 19 16:10:15 PDT 2009',
369 currentVersion: 'e85f085a8ed42d2def7adc796b66a2e0a4c3c88d9f3e785eb12a6f5619d945c5', 366 currentVersion: 'e85f085a8ed42d2def7adc796b66a2e0a4c3c88d9f3e785eb12a6f5619d945c5',
370 versions: { 367 versions: {
371 'e85f085a8ed42d2def7adc796b66a2e0a4c3c88d9f3e785eb12a6f5619d945c5': { 368 'e85f085a8ed42d2def7adc796b66a2e0a4c3c88d9f3e785eb12a6f5619d945c5': {
372 header: '####', 369 header: '####',
373 data: 'BbXNAy0GcKKyDPiwhP1Jk9mIi3uXMHQdhuxpDvoR2C3YITOUBpurxGhhvmCg+a9pS+fKJdZPxL2mPbJj6GfWTEsm7K/ECEjrVkSTHi6PTUUgYVbCumq9EHjUspos+7VrifZry3c73+qAvIKamvUlNB86TchMpOXVJIyx8UgRX+bdhrxk9ZCEVOiLCG1zGPX8IzmcxPmBRZFlHYqE4ibhl/CLEzWXZBYCofTusClhOh7YM/jBgvDt64W7aIN2y2KiKwmFySkFZdnOvbAb34tXVimwqjqWPvPwd6MujQeX1bmaDD7Y0kXac8CJxqasIezLo2WqzLUbEXdIHGilkaPT2ZKpKhKkpHJHFrV2lVuQJVqwPUr0Gf9qMKgVnsyU8kUfq9ox+fhH70+v7BQSjT7bxxDLs0UesQeL7G4SqvNet5hPI4GQEpOY8p5MUFReIBTRm72NQEU=', 370 data: 'BbXNAy0GcKKyDPiwhP1Jk9mIi3uXMHQdhuxpDvoR2C3YITOUBpurxGhhvmCg+a9pS+fKJdZPxL2mPbJj6GfWTEsm7K/ECEjrVkSTHi6PTUUgYVbCumq9EHjUspos+7VrifZry3c73+qAvIKamvUlNB86TchMpOXVJIyx8UgRX+bdhrxk9ZCEVOiLCG1zGPX8IzmcxPmBRZFlHYqE4ibhl/CLEzWXZBYCofTusClhOh7YM/jBgvDt64W7aIN2y2KiKwmFySkFZdnOvbAb34tXVimwqjqWPvPwd6MujQeX1bmaDD7Y0kXac8CJxqasIezLo2WqzLUbEXdIHGilkaPT2ZKpKhKkpHJHFrV2lVuQJVqwPUr0Gf9qMKgVnsyU8kUfq9ox+fhH70+v7BQSjT7bxxDLs0UesQeL7G4SqvNet5hPI4GQEpOY8p5MUFReIBTRm72NQEU=',
374 version: '0.2', 371 version: '0.2',
375 creationDate: 'Wed Mar 14 19:09:05 PDT 2007', 372 creationDate: 'Wed Mar 14 19:09:05 PDT 2007',
376 updateDate: 'Wed Mar 14 19:09:05 PDT 2007', 373 updateDate: 'Wed Mar 14 19:09:05 PDT 2007',
377 accessDate: 'Mon Jan 19 16:10:15 PDT 2009' 374 accessDate: 'Mon Jan 19 16:10:15 PDT 2009'
378 } 375 }
379 } 376 }
380 }, 377 },
381 '7bb69b6366a8012f181c01e368ba18d4f7a82bcabb4959189736ad124c4bbfbb': { 378 '7bb69b6366a8012f181c01e368ba18d4f7a82bcabb4959189736ad124c4bbfbb': {
382 data: 'wYPZIt0UHiNVefNwtGc7z7Lu3YoQrXdfKmWqilZp8yeIrNfSLB9p60DLMrL3GDq/CsvDYkGAZgj1C/6NVnzVsXsJKq7NDZn1UPOGt+hCnw3lEVbD7zHkoMM4VgFDn1sZdjLe8wdpIFfdlQESTipT3GVXv3swG2qX2O2yuwtlopR8yZQTLg==', 379 data: 'wYPZIt0UHiNVefNwtGc7z7Lu3YoQrXdfKmWqilZp8yeIrNfSLB9p60DLMrL3GDq/CsvDYkGAZgj1C/6NVnzVsXsJKq7NDZn1UPOGt+hCnw3lEVbD7zHkoMM4VgFDn1sZdjLe8wdpIFfdlQESTipT3GVXv3swG2qX2O2yuwtlopR8yZQTLg==',
383 version: '0.3', 380 version: '0.3',
384 creationDate: 'Mon Jan 05 17:44:30 PDT 2009', 381 creationDate: 'Mon Jan 05 17:44:30 PDT 2009',
385 updateDate: 'Mon Jan 05 17:44:30 PDT 2009', 382 updateDate: 'Mon Jan 05 17:44:30 PDT 2009',
386 accessDate: 'Mon Jan 19 16:10:18 PDT 2009', 383 accessDate: 'Mon Jan 19 16:10:18 PDT 2009',
387 currentVersion: '23f5fb503e54c0cafe3d4944ddaf40bc74fab8b5d96e2bbddf693b1afb225e5b', 384 currentVersion: '23f5fb503e54c0cafe3d4944ddaf40bc74fab8b5d96e2bbddf693b1afb225e5b',
388 versions: { 385 versions: {
389 '23f5fb503e54c0cafe3d4944ddaf40bc74fab8b5d96e2bbddf693b1afb225e5b': { 386 '23f5fb503e54c0cafe3d4944ddaf40bc74fab8b5d96e2bbddf693b1afb225e5b': {
390 header: '####', 387 header: '####',
391 data: 'IpYj+7t3DhSVD8r9PkLbF5xpGrHhg8omY014P1vkT2KkGDEUj+ekQAbQ1g66Z7oNhRDpjS1/dcDjzH0IIQLjGuQ0oRfL0xZefVTx3N88ZLE39m3cJz10K2xyg3xp06jFBmdNJuCkgRhMzeUXeEJujw4lS2kv7cO04Uh2Maui6jDR7E498rgePY3L32vG1S66li/xU1vPjNn06aFTqSYxUL17/mlJNbgp3XWjGC+l0dXLLfXy1wOm+/I3zp2caTs+a2zDUZ15s+3XeaAWpBH7QCaQsvsQmoBqPbMvkjOQwW3taDvV7Hvkh+qTjCEcLjRFwhZkMNn3N2ewcLWQa2aVIjxt6Z0F4s/1URztWlKVzCfto8RmrLajYRn3ggG12kX2xDJFjNPNfs/7A3tMn+FqXQCCNG5GI06JZ32aQfpnjtmXScUuEs8UeFgsNeYclQhcm5R0sUwISK+D345B8859w+4+9OTY38NgYQQ9o/tmpCjWj1tLYLx/m/GcR2em7iyDpBdcnWUb+tK6Ah89qvXriHwPLSNzhOH2wxmi7nXTRQWMv7g2', 388 data: 'IpYj+7t3DhSVD8r9PkLbF5xpGrHhg8omY014P1vkT2KkGDEUj+ekQAbQ1g66Z7oNhRDpjS1/dcDjzH0IIQLjGuQ0oRfL0xZefVTx3N88ZLE39m3cJz10K2xyg3xp06jFBmdNJuCkgRhMzeUXeEJujw4lS2kv7cO04Uh2Maui6jDR7E498rgePY3L32vG1S66li/xU1vPjNn06aFTqSYxUL17/mlJNbgp3XWjGC+l0dXLLfXy1wOm+/I3zp2caTs+a2zDUZ15s+3XeaAWpBH7QCaQsvsQmoBqPbMvkjOQwW3taDvV7Hvkh+qTjCEcLjRFwhZkMNn3N2ewcLWQa2aVIjxt6Z0F4s/1URztWlKVzCfto8RmrLajYRn3ggG12kX2xDJFjNPNfs/7A3tMn+FqXQCCNG5GI06JZ32aQfpnjtmXScUuEs8UeFgsNeYclQhcm5R0sUwISK+D345B8859w+4+9OTY38NgYQQ9o/tmpCjWj1tLYLx/m/GcR2em7iyDpBdcnWUb+tK6Ah89qvXriHwPLSNzhOH2wxmi7nXTRQWMv7g2',
392 version: '0.3', 389 version: '0.3',
393 creationDate: 'Mon Jan 05 17:44:30 PDT 2009', 390 creationDate: 'Mon Jan 05 17:44:30 PDT 2009',
394 updateDate: 'Mon Jan 05 17:44:30 PDT 2009', 391 updateDate: 'Mon Jan 05 17:44:30 PDT 2009',
395 accessDate: 'Mon Jan 19 16:10:18 PDT 2009' 392 accessDate: 'Mon Jan 19 16:10:18 PDT 2009'
396 } 393 }
397 } 394 }
398 }, 395 },
399 '8b18e8593b5bc2f7ea39a5fab222047034ef2f380fee05be0fa6e1c0972fea39': { 396 '8b18e8593b5bc2f7ea39a5fab222047034ef2f380fee05be0fa6e1c0972fea39': {
400 data: 'pOMTY3PnUAbwMLDEYNJCMzp4iIA42YWr6gqoomg+P40e7LFUtbt/RQRelQwNIztyUSVLl0rilkZZkBUVvxrtTqvibKITCjJQGQIzvcb+Yl4mNosl2Rpp0xxMU03f1+G7eGbuCc5hJXYVAglhEYplaAPzHbRWXMY8iZXZPBuLVf5PN+rdpgAfkGeZ7Uf9RsQ9p/EglrWXYnTwXi3saUfzIjfvSHm5C+dXTY3FHpIc1YkjFrdVgMkhYQGV60JtZcwFtCEL2NpVljAbRgHoIXTOkzUvep4vxrtfBBWWMuAWEI06432gtnH6IQbrR6jOpwuMt7k/09qy/fARPHs3r4qTJ9r2uqWHJ7tjJw+IChQPC+3l5HcPpFURiw8LGAN1NyY1hUrF6N84RSn7AKS0bLa5qN++5lcjjxn/k8+JqmeUqN1/SYIbGwNnJeZ0vA8yvOxnD20iVADX5kOVqJDwXRPLaF6Oz9KkbOrmANCh+PmGw1i6PduB+FgAU4HViYCw5IGOUZ30Pm1NJofqfbhXvgzn7ey2+kUIAwDyOUpJ9fW+9jW/JU4rcawmzwBYN2V8apOoyc3wQJICm2984wIfVBpygCOZM0QDyVgNo57qKtYH3yMDQSkKvpEUmuhklMYhcV+4X5ggdqx7lYXO9IMDnFf2ZDiZyieTlOlRv/nNVecUB177Xpnq2e+X/ik2rCQWVrIymiV6ltr1DEv0krXKfvXGG/FMZHUmo3m+B5bG4xVhmt0GnHseqvY2Vrl9NksLgq3hTDOGSGIy5Nv8kfrd8B4/6Tavh0SumiyXnrTXyYXzCK9E7IqO/0KAln63VkcHsbOtS8mj1drN0YQ2KKaeIW+Yr3Gm0pbcODsgA6aFfz1itZVeovBqUklhXS+/Es8J8xOSvvSyD/TmlFjuErHa+wwNQvftosfwk9ZTt0eIJS5aLHdU2QsCjdfSy0DEPkk2siGhBX5ZhRzqyIAyXApSmy+e7PIqn/dDR51+D1ZHwoTQyTrd+F08jBWZgU/OvS8MRxNZSxQwsi7bcWZG+w0utrIDB8eSOMVBXI5XBeJb4h5Bzut18C1shGHeGkSJp04=', 397 data: 'pOMTY3PnUAbwMLDEYNJCMzp4iIA42YWr6gqoomg+P40e7LFUtbt/RQRelQwNIztyUSVLl0rilkZZkBUVvxrtTqvibKITCjJQGQIzvcb+Yl4mNosl2Rpp0xxMU03f1+G7eGbuCc5hJXYVAglhEYplaAPzHbRWXMY8iZXZPBuLVf5PN+rdpgAfkGeZ7Uf9RsQ9p/EglrWXYnTwXi3saUfzIjfvSHm5C+dXTY3FHpIc1YkjFrdVgMkhYQGV60JtZcwFtCEL2NpVljAbRgHoIXTOkzUvep4vxrtfBBWWMuAWEI06432gtnH6IQbrR6jOpwuMt7k/09qy/fARPHs3r4qTJ9r2uqWHJ7tjJw+IChQPC+3l5HcPpFURiw8LGAN1NyY1hUrF6N84RSn7AKS0bLa5qN++5lcjjxn/k8+JqmeUqN1/SYIbGwNnJeZ0vA8yvOxnD20iVADX5kOVqJDwXRPLaF6Oz9KkbOrmANCh+PmGw1i6PduB+FgAU4HViYCw5IGOUZ30Pm1NJofqfbhXvgzn7ey2+kUIAwDyOUpJ9fW+9jW/JU4rcawmzwBYN2V8apOoyc3wQJICm2984wIfVBpygCOZM0QDyVgNo57qKtYH3yMDQSkKvpEUmuhklMYhcV+4X5ggdqx7lYXO9IMDnFf2ZDiZyieTlOlRv/nNVecUB177Xpnq2e+X/ik2rCQWVrIymiV6ltr1DEv0krXKfvXGG/FMZHUmo3m+B5bG4xVhmt0GnHseqvY2Vrl9NksLgq3hTDOGSGIy5Nv8kfrd8B4/6Tavh0SumiyXnrTXyYXzCK9E7IqO/0KAln63VkcHsbOtS8mj1drN0YQ2KKaeIW+Yr3Gm0pbcODsgA6aFfz1itZVeovBqUklhXS+/Es8J8xOSvvSyD/TmlFjuErHa+wwNQvftosfwk9ZTt0eIJS5aLHdU2QsCjdfSy0DEPkk2siGhBX5ZhRzqyIAyXApSmy+e7PIqn/dDR51+D1ZHwoTQyTrd+F08jBWZgU/OvS8MRxNZSxQwsi7bcWZG+w0utrIDB8eSOMVBXI5XBeJb4h5Bzut18C1shGHeGkSJp04=',
401 version: '0.2', 398 version: '0.2',
402 creationDate: 'Tue May 01 01:10:17 PDT 2007', 399 creationDate: 'Tue May 01 01:10:17 PDT 2007',
403 updateDate: 'Tue May 01 01:13:27 PDT 2007', 400 updateDate: 'Tue May 01 01:13:27 PDT 2007',
404 accessDate: 'Mon Jan 19 16:10:02 PDT 2009', 401 accessDate: 'Mon Jan 19 16:10:02 PDT 2009',
405 currentVersion: 'd175358ea0b9d32c23e4bceff2020eae9a8459466abc18d4399d988e733fc0f8', 402 currentVersion: 'd175358ea0b9d32c23e4bceff2020eae9a8459466abc18d4399d988e733fc0f8',
406 versions: { 403 versions: {
407 '8a032b53f7356e2d8b28665211abbe2cf1c79fd8eee4752e83cebdced1c19911': { 404 '8a032b53f7356e2d8b28665211abbe2cf1c79fd8eee4752e83cebdced1c19911': {
408 header: '####', 405 header: '####',
diff --git a/frontend/gamma/tests/tests/Components/GridLayout/index.html b/frontend/gamma/tests/tests/Components/GridLayout/index.html
index 0208a82..f1ed116 100644
--- a/frontend/gamma/tests/tests/Components/GridLayout/index.html
+++ b/frontend/gamma/tests/tests/Components/GridLayout/index.html
@@ -1,135 +1,132 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27--> 24-->
28 25
29<html> 26<html>
30<head> 27<head>
31 <title>Card Dialog EDITING - test</title> 28 <title>Card Dialog EDITING - test</title>
32 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 29 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
33 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script> 30 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script>
34 31
35 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> 32 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
36 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script> 33 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
37 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 34 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
38 <script type='text/javascript' src='../../../../js/Clipperz/Date.js'></script> 35 <script type='text/javascript' src='../../../../js/Clipperz/Date.js'></script>
39 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script> 36 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script>
40 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 37 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
41 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script> 38 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script> 39 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script>
43 40
44 <script type='text/javascript' src='../../../../js/Clipperz/Signal.js'></script> 41 <script type='text/javascript' src='../../../../js/Clipperz/Signal.js'></script>
45 <script type='text/javascript' src='../../../../js/Clipperz/Style.js'></script> 42 <script type='text/javascript' src='../../../../js/Clipperz/Style.js'></script>
46 <script type='text/javascript' src='../../../../js/Clipperz/Visual.js'></script> 43 <script type='text/javascript' src='../../../../js/Clipperz/Visual.js'></script>
47 <script type='text/javascript' src='../../../../js/Clipperz/Set.js'></script> 44 <script type='text/javascript' src='../../../../js/Clipperz/Set.js'></script>
48 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script> 45 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script>
49 46
50 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> 47 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
51 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> 48 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
52 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script> 49 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
53 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> 50 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
54 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script> 51 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
55 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script> 52 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script>
56 53
57 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script> 54 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script>
58 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script> 55 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script>
59 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script> 56 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script>
60 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script> 57 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script>
61 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script> 58 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script>
62 59
63 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script> 60 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script>
64 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script> 61 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script>
65 62
66 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings.js'></script> 63 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings.js'></script>
67 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_defaults.js'></script> 64 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_defaults.js'></script>
68 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script> 65 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script>
69 66
70 <script type='text/javascript' src='../../../../js/Clipperz/PM/Date.js'></script> 67 <script type='text/javascript' src='../../../../js/Clipperz/PM/Date.js'></script>
71 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/EncryptedRemoteObject.js'></script> 68 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/EncryptedRemoteObject.js'></script>
72 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.js'></script> 69 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.js'></script>
73 <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.js'></script>
74 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.Field.js'></script> 71 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.Field.js'></script>
75 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLogin.js'></script> 72 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLogin.js'></script>
76 <!-- 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 -->
77 <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>
78 <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>
79 <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>
80 <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>
81 <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>
82 79
83 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/BaseComponent.js'></script> 80 <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> 81 <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/PasswordEntropyDisplay.js'></script> 82 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/PasswordEntropyDisplay.js'></script>
86 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ProgressBar.js'></script> 83 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ProgressBar.js'></script>
87 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/SimpleMessagePanel.js'></script> 84 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/SimpleMessagePanel.js'></script>
88 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TabPanelComponent.js'></script> 85 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TabPanelComponent.js'></script>
89 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/Tooltip.js'></script> 86 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/Tooltip.js'></script>
90 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TranslatorWidget.js'></script> 87 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TranslatorWidget.js'></script>
91 88
92 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogComponent.js'></script> 89 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogComponent.js'></script>
93 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogRecordFieldComponent.js'></script> 90 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogRecordFieldComponent.js'></script>
94 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogRecordDirectLoginComponent.js'></script> 91 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogRecordDirectLoginComponent.js'></script>
95 92
96 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/ProgressBarController.js'></script> 93 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/ProgressBarController.js'></script>
97 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/TabPanelController.js'></script> 94 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/TabPanelController.js'></script>
98 95
99 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/ColumnManager.js'></script> 96 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/ColumnManager.js'></script>
100 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/FaviconColumnManager.js'></script> 97 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/FaviconColumnManager.js'></script>
101 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/LinkColumnManager.js'></script> 98 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/LinkColumnManager.js'></script>
102 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DirectLoginsColumnManager.js'></script> 99 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DirectLoginsColumnManager.js'></script>
103 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DateColumnManager.js'></script> 100 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DateColumnManager.js'></script>
104 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DeleteObjectColumnManager.js'></script> 101 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DeleteObjectColumnManager.js'></script>
105 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/GridComponent.js'></script> 102 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/GridComponent.js'></script>
106 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/BookmarkletComponent.js'></script> 103 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/BookmarkletComponent.js'></script>
107 104
108 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/FilterController.js'></script> 105 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/FilterController.js'></script>
109 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/GridController.js'></script> 106 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/GridController.js'></script>
110 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/CardsController.js'></script> 107 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/CardsController.js'></script>
111 108
112 <script type='text/javascript' src='./User.data.js'></script> 109 <script type='text/javascript' src='./User.data.js'></script>
113 <script type='text/javascript' src='./TestPageComponent.js'></script> 110 <script type='text/javascript' src='./TestPageComponent.js'></script>
114 <script type='text/javascript' src='./GridLayout_test.js'></script> 111 <script type='text/javascript' src='./GridLayout_test.js'></script>
115<script> 112<script>
116 Clipperz_IEisBroken = false; 113 Clipperz_IEisBroken = false;
117</script> 114</script>
118 115
119<!--[if IE]><script> 116<!--[if IE]><script>
120Clipperz_IEisBroken = true; 117Clipperz_IEisBroken = true;
121</script><![endif]--> 118</script><![endif]-->
122 119
123 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/clipperz.css" /> 120 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/clipperz.css" />
124 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/compact.css" /> 121 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/compact.css" />
125 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/ytheme-clipperz.css" /> 122 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/ytheme-clipperz.css" />
126 123
127 <link rel="stylesheet" type="text/css" href="./test.css" /> 124 <link rel="stylesheet" type="text/css" href="./test.css" />
128 125
129</head> 126</head>
130<body> 127<body>
131 128
132<div id="component"></div> 129<div id="component"></div>
133 130
134</body> 131</body>
135</html> 132</html>
diff --git a/frontend/gamma/tests/tests/Components/GridLayout/test.css b/frontend/gamma/tests/tests/Components/GridLayout/test.css
index 21abd07..e5983f4 100644
--- a/frontend/gamma/tests/tests/Components/GridLayout/test.css
+++ b/frontend/gamma/tests/tests/Components/GridLayout/test.css
@@ -1,43 +1,40 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29ul.testTabs { 26ul.testTabs {
30 list-style-type: none; 27 list-style-type: none;
31 padding: 0px; 28 padding: 0px;
32 padding-bottom: 30px; 29 padding-bottom: 30px;
33} 30}
34 31
35ul.testTabs li { 32ul.testTabs li {
36 display: inline-table; 33 display: inline-table;
37 padding: 0px 10px; 34 padding: 0px 10px;
38} 35}
39 36
40ul.testPanels { 37ul.testPanels {
41 list-style-type: none; 38 list-style-type: none;
42 padding: 0px; 39 padding: 0px;
43} \ No newline at end of file 40} \ 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 d72aae0..295c2c6 100644
--- a/frontend/gamma/tests/tests/Components/ProgressBar/index.html
+++ b/frontend/gamma/tests/tests/Components/ProgressBar/index.html
@@ -1,120 +1,117 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27--> 24-->
28 25
29<html> 26<html>
30<head> 27<head>
31 <title>ProgressBar - test</title> 28 <title>ProgressBar - test</title>
32 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 29 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
33 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script> 30 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script>
34 31
35 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> 32 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
36 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script> 33 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
37 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 34 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
38 <script type='text/javascript' src='../../../../js/Clipperz/Date.js'></script> 35 <script type='text/javascript' src='../../../../js/Clipperz/Date.js'></script>
39 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script> 36 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script>
40 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 37 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
41 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script> 38 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script> 39 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script>
43 40
44 <script type='text/javascript' src='../../../../js/Clipperz/Signal.js'></script> 41 <script type='text/javascript' src='../../../../js/Clipperz/Signal.js'></script>
45 <script type='text/javascript' src='../../../../js/Clipperz/Style.js'></script> 42 <script type='text/javascript' src='../../../../js/Clipperz/Style.js'></script>
46 <script type='text/javascript' src='../../../../js/Clipperz/Visual.js'></script> 43 <script type='text/javascript' src='../../../../js/Clipperz/Visual.js'></script>
47 <script type='text/javascript' src='../../../../js/Clipperz/Set.js'></script> 44 <script type='text/javascript' src='../../../../js/Clipperz/Set.js'></script>
48 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script> 45 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script>
49 46
50 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> 47 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
51 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> 48 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
52 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script> 49 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
53 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> 50 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
54 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script> 51 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
55 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script> 52 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script>
56 53
57 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script> 54 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script>
58 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script> 55 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script>
59 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script> 56 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script>
60 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script> 57 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script>
61 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script> 58 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script>
62 59
63 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script> 60 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script>
64 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script> 61 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script>
65 62
66 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings.js'></script> 63 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings.js'></script>
67 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script> 64 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script>
68 <script type='text/javascript' src='../../../../js/Clipperz/PM/Date.js'></script> 65 <script type='text/javascript' src='../../../../js/Clipperz/PM/Date.js'></script>
69 <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>
70 <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>
71 <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>
72 <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>
73 <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>
74 <!-- 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 -->
75 <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>
76 <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>
77 <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>
78 75
79 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/BaseComponent.js'></script> 76 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/BaseComponent.js'></script>
80 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ComponentSlot.js'></script> 77 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ComponentSlot.js'></script>
81 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/PasswordEntropyDisplay.js'></script> 78 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/PasswordEntropyDisplay.js'></script>
82 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ProgressBar.js'></script> 79 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ProgressBar.js'></script>
83 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/SimpleMessagePanel.js'></script> 80 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/SimpleMessagePanel.js'></script>
84 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TabPanelComponent.js'></script> 81 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TabPanelComponent.js'></script>
85 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/Tooltip.js'></script> 82 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/Tooltip.js'></script>
86 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TranslatorWidget.js'></script> 83 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TranslatorWidget.js'></script>
87 84
88 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/ProgressBarController.js'></script> 85 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/ProgressBarController.js'></script>
89 86
90 <script type='text/javascript' src='./progressBar_test.js'></script> 87 <script type='text/javascript' src='./progressBar_test.js'></script>
91<script> 88<script>
92 Clipperz_IEisBroken = false; 89 Clipperz_IEisBroken = false;
93</script> 90</script>
94 91
95<!--[if IE]><script> 92<!--[if IE]><script>
96Clipperz_IEisBroken = true; 93Clipperz_IEisBroken = true;
97</script><![endif]--> 94</script><![endif]-->
98 95
99 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/clipperz.css" /> 96 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/clipperz.css" />
100 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/compact.css" /> 97 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/compact.css" />
101 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/ytheme-clipperz.css" /> 98 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/ytheme-clipperz.css" />
102 99
103</head> 100</head>
104<body> 101<body>
105 102
106<table border="0" cellpadding="50"><tr><td> 103<table border="0" cellpadding="50"><tr><td>
107 <div id="progressBar_5"></div><hr> 104 <div id="progressBar_5"></div><hr>
108 <div id="progressBar_10"></div><hr> 105 <div id="progressBar_10"></div><hr>
109 <div id="progressBar_15"></div><hr> 106 <div id="progressBar_15"></div><hr>
110 <div id="progressBar_20"></div><hr> 107 <div id="progressBar_20"></div><hr>
111 <div id="progressBar_50"></div><hr> 108 <div id="progressBar_50"></div><hr>
112</td><td> 109</td><td>
113 <div id="progressBar_80"></div><hr> 110 <div id="progressBar_80"></div><hr>
114 <div id="progressBar_85"></div><hr> 111 <div id="progressBar_85"></div><hr>
115 <div id="progressBar_90"></div><hr> 112 <div id="progressBar_90"></div><hr>
116 <div id="progressBar_95"></div><hr> 113 <div id="progressBar_95"></div><hr>
117 <div id="progressBar_100"></div><hr> 114 <div id="progressBar_100"></div><hr>
118</td></tr>></table> 115</td></tr>></table>
119</body> 116</body>
120</html> 117</html>
diff --git a/frontend/gamma/tests/tests/Components/ProgressBar/progressBar_test.js b/frontend/gamma/tests/tests/Components/ProgressBar/progressBar_test.js
index 822081a..8e2ce51 100644
--- a/frontend/gamma/tests/tests/Components/ProgressBar/progressBar_test.js
+++ b/frontend/gamma/tests/tests/Components/ProgressBar/progressBar_test.js
@@ -1,125 +1,122 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.Tests.ProgressBar'); 26Clipperz.Base.module('Clipperz.Tests.ProgressBar');
30 27
31Clipperz.PM.Strings.Languages.initSetup(); 28Clipperz.PM.Strings.Languages.initSetup();
32 29
33Clipperz.Tests.ProgressBar.Tester = function(args) { 30Clipperz.Tests.ProgressBar.Tester = function(args) {
34 args = args || {}; 31 args = args || {};
35 32
36 Clipperz.Tests.ProgressBar.Tester.superclass.constructor.call(this, args); 33 Clipperz.Tests.ProgressBar.Tester.superclass.constructor.call(this, args);
37 34
38 return this; 35 return this;
39}; 36};
40 37
41Clipperz.Base.extend(Clipperz.Tests.ProgressBar.Tester, Object, { 38Clipperz.Base.extend(Clipperz.Tests.ProgressBar.Tester, Object, {
42 39
43 'toString': function() { 40 'toString': function() {
44 return "Clipperz.Tests.ProgressBar.Tester"; 41 return "Clipperz.Tests.ProgressBar.Tester";
45 }, 42 },
46 43
47 //------------------------------------------------------------------------- 44 //-------------------------------------------------------------------------
48 45
49 'run': function () { 46 'run': function () {
50 var progressBar; 47 var progressBar;
51/* 48/*
52<div id="progressBar_5"></div><hr> 49<div id="progressBar_5"></div><hr>
53<div id="progressBar_10"></div><hr> 50<div id="progressBar_10"></div><hr>
54<div id="progressBar_15"></div><hr> 51<div id="progressBar_15"></div><hr>
55<div id="progressBar_20"></div><hr> 52<div id="progressBar_20"></div><hr>
56<div id="progressBar_50"></div><hr> 53<div id="progressBar_50"></div><hr>
57<div id="progressBar_80"></div><hr> 54<div id="progressBar_80"></div><hr>
58<div id="progressBar_85"></div><hr> 55<div id="progressBar_85"></div><hr>
59<div id="progressBar_90"></div><hr> 56<div id="progressBar_90"></div><hr>
60<div id="progressBar_95"></div><hr> 57<div id="progressBar_95"></div><hr>
61<div id="progressBar_100"></div><hr> 58<div id="progressBar_100"></div><hr>
62*/ 59*/
63 60
64 progressBar = new Clipperz.PM.UI.Common.Components.ProgressBar({'element':MochiKit.DOM.getElement('progressBar_5')}); 61 progressBar = new Clipperz.PM.UI.Common.Components.ProgressBar({'element':MochiKit.DOM.getElement('progressBar_5')});
65 progressBar.updateProgressHandler('5'); 62 progressBar.updateProgressHandler('5');
66 63
67 progressBar = new Clipperz.PM.UI.Common.Components.ProgressBar({'element':MochiKit.DOM.getElement('progressBar_10')}); 64 progressBar = new Clipperz.PM.UI.Common.Components.ProgressBar({'element':MochiKit.DOM.getElement('progressBar_10')});
68 progressBar.updateProgressHandler('10'); 65 progressBar.updateProgressHandler('10');
69 66
70 progressBar = new Clipperz.PM.UI.Common.Components.ProgressBar({'element':MochiKit.DOM.getElement('progressBar_15')}); 67 progressBar = new Clipperz.PM.UI.Common.Components.ProgressBar({'element':MochiKit.DOM.getElement('progressBar_15')});
71 progressBar.updateProgressHandler('15'); 68 progressBar.updateProgressHandler('15');
72 69
73 progressBar = new Clipperz.PM.UI.Common.Components.ProgressBar({'element':MochiKit.DOM.getElement('progressBar_20')}); 70 progressBar = new Clipperz.PM.UI.Common.Components.ProgressBar({'element':MochiKit.DOM.getElement('progressBar_20')});
74 progressBar.updateProgressHandler('20'); 71 progressBar.updateProgressHandler('20');
75 72
76 progressBar = new Clipperz.PM.UI.Common.Components.ProgressBar({'element':MochiKit.DOM.getElement('progressBar_50')}); 73 progressBar = new Clipperz.PM.UI.Common.Components.ProgressBar({'element':MochiKit.DOM.getElement('progressBar_50')});
77 progressBar.updateProgressHandler('50'); 74 progressBar.updateProgressHandler('50');
78 75
79 progressBar = new Clipperz.PM.UI.Common.Components.ProgressBar({'element':MochiKit.DOM.getElement('progressBar_80')}); 76 progressBar = new Clipperz.PM.UI.Common.Components.ProgressBar({'element':MochiKit.DOM.getElement('progressBar_80')});
80 progressBar.updateProgressHandler('80'); 77 progressBar.updateProgressHandler('80');
81 78
82 progressBar = new Clipperz.PM.UI.Common.Components.ProgressBar({'element':MochiKit.DOM.getElement('progressBar_85')}); 79 progressBar = new Clipperz.PM.UI.Common.Components.ProgressBar({'element':MochiKit.DOM.getElement('progressBar_85')});
83 progressBar.updateProgressHandler('85'); 80 progressBar.updateProgressHandler('85');
84 81
85 progressBar = new Clipperz.PM.UI.Common.Components.ProgressBar({'element':MochiKit.DOM.getElement('progressBar_90')}); 82 progressBar = new Clipperz.PM.UI.Common.Components.ProgressBar({'element':MochiKit.DOM.getElement('progressBar_90')});
86 progressBar.updateProgressHandler('90'); 83 progressBar.updateProgressHandler('90');
87 84
88 progressBar = new Clipperz.PM.UI.Common.Components.ProgressBar({'element':MochiKit.DOM.getElement('progressBar_95')}); 85 progressBar = new Clipperz.PM.UI.Common.Components.ProgressBar({'element':MochiKit.DOM.getElement('progressBar_95')});
89 progressBar.updateProgressHandler('95'); 86 progressBar.updateProgressHandler('95');
90 87
91 progressBar = new Clipperz.PM.UI.Common.Components.ProgressBar({'element':MochiKit.DOM.getElement('progressBar_100')}); 88 progressBar = new Clipperz.PM.UI.Common.Components.ProgressBar({'element':MochiKit.DOM.getElement('progressBar_100')});
92 progressBar.updateProgressHandler('100'); 89 progressBar.updateProgressHandler('100');
93 }, 90 },
94 91
95 //========================================================================= 92 //=========================================================================
96 __syntaxFix__: "syntax fix" 93 __syntaxFix__: "syntax fix"
97}); 94});
98 95
99 96
100 97
101 98
102 99
103 100
104 101
105 102
106 103
107 104
108 105
109 106
110 107
111 108
112 109
113 110
114 111
115 112
116 113
117 114
118init = function () { 115init = function () {
119 vartester; 116 vartester;
120 117
121 tester = new Clipperz.Tests.ProgressBar.Tester(); 118 tester = new Clipperz.Tests.ProgressBar.Tester();
122 tester.run(); 119 tester.run();
123}; 120};
124 121
125MochiKit.DOM.addLoadEvent(init); 122MochiKit.DOM.addLoadEvent(init);
diff --git a/frontend/gamma/tests/tests/Components/SimpleMessagePanel/index.html b/frontend/gamma/tests/tests/Components/SimpleMessagePanel/index.html
index ac1585f..f09d9f6 100644
--- a/frontend/gamma/tests/tests/Components/SimpleMessagePanel/index.html
+++ b/frontend/gamma/tests/tests/Components/SimpleMessagePanel/index.html
@@ -1,115 +1,112 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27--> 24-->
28 25
29<html> 26<html>
30<head> 27<head>
31 <title>Simple Message Panel - test</title> 28 <title>Simple Message Panel - test</title>
32 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 29 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
33 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script> 30 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script>
34 31
35 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> 32 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
36 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script> 33 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
37 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 34 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
38 <script type='text/javascript' src='../../../../js/Clipperz/Date.js'></script> 35 <script type='text/javascript' src='../../../../js/Clipperz/Date.js'></script>
39 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script> 36 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script>
40 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 37 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
41 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script> 38 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script> 39 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script>
43 40
44 <script type='text/javascript' src='../../../../js/Clipperz/Signal.js'></script> 41 <script type='text/javascript' src='../../../../js/Clipperz/Signal.js'></script>
45 <script type='text/javascript' src='../../../../js/Clipperz/Style.js'></script> 42 <script type='text/javascript' src='../../../../js/Clipperz/Style.js'></script>
46 <script type='text/javascript' src='../../../../js/Clipperz/Visual.js'></script> 43 <script type='text/javascript' src='../../../../js/Clipperz/Visual.js'></script>
47 <script type='text/javascript' src='../../../../js/Clipperz/Set.js'></script> 44 <script type='text/javascript' src='../../../../js/Clipperz/Set.js'></script>
48 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script> 45 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script>
49 46
50 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> 47 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
51 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> 48 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
52 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script> 49 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
53 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> 50 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
54 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script> 51 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
55 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script> 52 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script>
56 53
57 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script> 54 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script>
58 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script> 55 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script>
59 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script> 56 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script>
60 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script> 57 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script>
61 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script> 58 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script>
62 59
63 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script> 60 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script>
64 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script> 61 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script>
65 62
66 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings.js'></script> 63 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings.js'></script>
67 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script> 64 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script>
68 <script type='text/javascript' src='../../../../js/Clipperz/PM/Date.js'></script> 65 <script type='text/javascript' src='../../../../js/Clipperz/PM/Date.js'></script>
69 <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>
70 <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>
71 <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>
72 <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>
73 <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>
74 <!-- 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 -->
75 <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>
76 <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>
77 <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>
78 75
79 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/BaseComponent.js'></script> 76 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/BaseComponent.js'></script>
80 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/Button.js'></script> 77 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/Button.js'></script>
81 <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/ComponentSlot.js'></script>
82 <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/PasswordEntropyDisplay.js'></script>
83 <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/ProgressBar.js'></script>
84 <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/SimpleMessagePanel.js'></script>
85 <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/TabPanelComponent.js'></script>
86 <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/Tooltip.js'></script>
87 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TranslatorWidget.js'></script> 84 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TranslatorWidget.js'></script>
88 85
89 <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/CardDialogComponent.js'></script>
90 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogRecordFieldComponent.js'></script> 87 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogRecordFieldComponent.js'></script>
91 88
92 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/TabPanelController.js'></script> 89 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/TabPanelController.js'></script>
93 90
94 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/CardDialogController.js'></script> 91 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/CardDialogController.js'></script>
95 92
96 <script type='text/javascript' src='./simpleMessagePanel_test.js'></script> 93 <script type='text/javascript' src='./simpleMessagePanel_test.js'></script>
97<script> 94<script>
98 Clipperz_IEisBroken = false; 95 Clipperz_IEisBroken = false;
99</script> 96</script>
100 97
101<!--[if IE]><script> 98<!--[if IE]><script>
102Clipperz_IEisBroken = true; 99Clipperz_IEisBroken = true;
103</script><![endif]--> 100</script><![endif]-->
104 101
105 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/clipperz.css" /> 102 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/clipperz.css" />
106 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/compact.css" /> 103 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/compact.css" />
107 <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" />
108 105
109</head> 106</head>
110<body> 107<body>
111 108
112<div id="tableWrapper"></div> 109<div id="tableWrapper"></div>
113 110
114</body> 111</body>
115</html> 112</html>
diff --git a/frontend/gamma/tests/tests/Components/SimpleMessagePanel/simpleMessagePanel_test.js b/frontend/gamma/tests/tests/Components/SimpleMessagePanel/simpleMessagePanel_test.js
index 85128d6..8513909 100644
--- a/frontend/gamma/tests/tests/Components/SimpleMessagePanel/simpleMessagePanel_test.js
+++ b/frontend/gamma/tests/tests/Components/SimpleMessagePanel/simpleMessagePanel_test.js
@@ -1,95 +1,92 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.Tests.SimpleMessagePanel'); 26Clipperz.Base.module('Clipperz.Tests.SimpleMessagePanel');
30 27
31Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); 28Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
32Clipperz.PM.Strings.Languages.initSetup(); 29Clipperz.PM.Strings.Languages.initSetup();
33 30
34Clipperz.Tests.SimpleMessagePanel.Tester = function(args) { 31Clipperz.Tests.SimpleMessagePanel.Tester = function(args) {
35 args = args || {}; 32 args = args || {};
36 33
37 Clipperz.Tests.SimpleMessagePanel.Tester.superclass.constructor.call(this, args); 34 Clipperz.Tests.SimpleMessagePanel.Tester.superclass.constructor.call(this, args);
38 //this._user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); 35 //this._user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}});
39 36
40 return this; 37 return this;
41}; 38};
42 39
43Clipperz.Base.extend(Clipperz.Tests.SimpleMessagePanel.Tester, Object, { 40Clipperz.Base.extend(Clipperz.Tests.SimpleMessagePanel.Tester, Object, {
44 41
45 'toString': function() { 42 'toString': function() {
46 return "Clipperz.Tests.SimpleMessagePanel.Tester"; 43 return "Clipperz.Tests.SimpleMessagePanel.Tester";
47 }, 44 },
48 45
49 //------------------------------------------------------------------------- 46 //-------------------------------------------------------------------------
50/* 47/*
51 'user': function () { 48 'user': function () {
52 return this._user; 49 return this._user;
53 }, 50 },
54*/ 51*/
55 //------------------------------------------------------------------------- 52 //-------------------------------------------------------------------------
56 53
57 'run': function () { 54 'run': function () {
58 var deferredResult; 55 var deferredResult;
59 var confirmationDialog; 56 var confirmationDialog;
60 57
61 confirmationDialog = new Clipperz.PM.UI.Common.Components.SimpleMessagePanel({ 58 confirmationDialog = new Clipperz.PM.UI.Common.Components.SimpleMessagePanel({
62 title:"Alert", 59 title:"Alert",
63 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", 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",
64 type:'ALERT', 61 type:'ALERT',
65 buttons: [ 62 buttons: [
66 {text:"Cancel",result:'CANCEL', isDefault:true}, 63 {text:"Cancel",result:'CANCEL', isDefault:true},
67 {text:"Ok", result:'OK'} 64 {text:"Ok", result:'OK'}
68 ] 65 ]
69 }); 66 });
70 67
71 deferredResult = new Clipperz.Async.Deferred("CardDialogComponent.askConfirmationForLoosingPendingChanges", {trace:false}); 68 deferredResult = new Clipperz.Async.Deferred("CardDialogComponent.askConfirmationForLoosingPendingChanges", {trace:false});
72 deferredResult.addMethod(confirmationDialog, 'deferredShow', { 69 deferredResult.addMethod(confirmationDialog, 'deferredShow', {
73 'openFromElement': null, 70 'openFromElement': null,
74 'onOkCloseToElement': null, //this.getElement('cancelButton'), 71 'onOkCloseToElement': null, //this.getElement('cancelButton'),
75 'onCancelCloseToElement':null 72 'onCancelCloseToElement':null
76 }); 73 });
77 deferredResult.callback(); 74 deferredResult.callback();
78 75
79 return deferredResult; 76 return deferredResult;
80 }, 77 },
81 78
82 //========================================================================= 79 //=========================================================================
83 __syntaxFix__: "syntax fix" 80 __syntaxFix__: "syntax fix"
84}); 81});
85 82
86 83
87 84
88init = function () { 85init = function () {
89 vartester; 86 vartester;
90 87
91 tester = new Clipperz.Tests.SimpleMessagePanel.Tester(); 88 tester = new Clipperz.Tests.SimpleMessagePanel.Tester();
92 tester.run(); 89 tester.run();
93}; 90};
94 91
95MochiKit.DOM.addLoadEvent(init); 92MochiKit.DOM.addLoadEvent(init);
diff --git a/frontend/gamma/tests/tests/Components/Tooltips/index.html b/frontend/gamma/tests/tests/Components/Tooltips/index.html
index 471eca9..02c6c34 100644
--- a/frontend/gamma/tests/tests/Components/Tooltips/index.html
+++ b/frontend/gamma/tests/tests/Components/Tooltips/index.html
@@ -1,143 +1,140 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27--> 24-->
28 25
29<html> 26<html>
30<head> 27<head>
31 <title>TOOLTIPS - test</title> 28 <title>TOOLTIPS - test</title>
32 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 29 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
33 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script> 30 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script>
34 31
35 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> 32 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
36 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script> 33 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
37 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 34 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
38 <script type='text/javascript' src='../../../../js/Clipperz/Date.js'></script> 35 <script type='text/javascript' src='../../../../js/Clipperz/Date.js'></script>
39 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script> 36 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script>
40 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 37 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
41 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script> 38 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script> 39 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script>
43 40
44 <script type='text/javascript' src='../../../../js/Clipperz/Signal.js'></script> 41 <script type='text/javascript' src='../../../../js/Clipperz/Signal.js'></script>
45 <script type='text/javascript' src='../../../../js/Clipperz/Style.js'></script> 42 <script type='text/javascript' src='../../../../js/Clipperz/Style.js'></script>
46 <script type='text/javascript' src='../../../../js/Clipperz/Visual.js'></script> 43 <script type='text/javascript' src='../../../../js/Clipperz/Visual.js'></script>
47 <script type='text/javascript' src='../../../../js/Clipperz/Set.js'></script> 44 <script type='text/javascript' src='../../../../js/Clipperz/Set.js'></script>
48 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script> 45 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script>
49 46
50 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> 47 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
51 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> 48 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
52 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script> 49 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
53 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> 50 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
54 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script> 51 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
55 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script> 52 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script>
56 53
57 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script> 54 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script>
58 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script> 55 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script>
59 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script> 56 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script>
60 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script> 57 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script>
61 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script> 58 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script>
62 59
63 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script> 60 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script>
64 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script> 61 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script>
65 62
66 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings.js'></script> 63 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings.js'></script>
67 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script> 64 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script>
68 <script type='text/javascript' src='../../../../js/Clipperz/PM/Date.js'></script> 65 <script type='text/javascript' src='../../../../js/Clipperz/PM/Date.js'></script>
69 <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>
70 <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>
71 <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>
72 <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>
73 <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>
74 <!-- 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 -->
75 <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>
76 <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>
77 <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>
78 75
79 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/BaseComponent.js'></script> 76 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/BaseComponent.js'></script>
80 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ComponentSlot.js'></script> 77 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ComponentSlot.js'></script>
81 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/PasswordEntropyDisplay.js'></script> 78 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/PasswordEntropyDisplay.js'></script>
82 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ProgressBar.js'></script> 79 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ProgressBar.js'></script>
83 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/SimpleMessagePanel.js'></script> 80 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/SimpleMessagePanel.js'></script>
84 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TabPanelComponent.js'></script> 81 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TabPanelComponent.js'></script>
85 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/Tooltip.js'></script> 82 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/Tooltip.js'></script>
86 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TranslatorWidget.js'></script> 83 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TranslatorWidget.js'></script>
87 84
88 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogComponent.js'></script> 85 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogComponent.js'></script>
89 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogRecordFieldComponent.js'></script> 86 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogRecordFieldComponent.js'></script>
90 87
91 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/ProgressBarController.js'></script> 88 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/ProgressBarController.js'></script>
92 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/TabPanelController.js'></script> 89 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/TabPanelController.js'></script>
93 90
94 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/CardDialogController.js'></script> 91 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/CardDialogController.js'></script>
95 92
96 <script type='text/javascript' src='./tooltips_test.js'></script> 93 <script type='text/javascript' src='./tooltips_test.js'></script>
97<script> 94<script>
98 Clipperz_IEisBroken = false; 95 Clipperz_IEisBroken = false;
99</script> 96</script>
100 97
101<!--[if IE]><script> 98<!--[if IE]><script>
102Clipperz_IEisBroken = true; 99Clipperz_IEisBroken = true;
103</script><![endif]--> 100</script><![endif]-->
104 101
105 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/clipperz.css" /> 102 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/clipperz.css" />
106 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/compact.css" /> 103 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/compact.css" />
107 <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" />
108 105
109<style> 106<style>
110 107
111div.leftColumn { 108div.leftColumn {
112 float:left; 109 float:left;
113} 110}
114 111
115div.rightColumn { 112div.rightColumn {
116 float:left; 113 float:left;
117} 114}
118 115
119div.boxWrapper { 116div.boxWrapper {
120 padding: 70px 200px; 117 padding: 70px 200px;
121} 118}
122 119
123div.box { 120div.box {
124 width: 100px; 121 width: 100px;
125 height: 30px; 122 height: 30px;
126 border: 1px solid red; 123 border: 1px solid red;
127} 124}
128</style> 125</style>
129 126
130</head> 127</head>
131<body> 128<body>
132 129
133<div class="leftColumn"> 130<div class="leftColumn">
134 <div class="boxWrapper"><div id="ABOVE" class="box">above</div></div> 131 <div class="boxWrapper"><div id="ABOVE" class="box">above</div></div>
135 <div class="boxWrapper"><div id="BELOW" class="box">below</div></div> 132 <div class="boxWrapper"><div id="BELOW" class="box">below</div></div>
136</div> 133</div>
137<div class="rightColumn"> 134<div class="rightColumn">
138 <div class="boxWrapper"><div id="LEFT" class="box">left</div></div> 135 <div class="boxWrapper"><div id="LEFT" class="box">left</div></div>
139 <div class="boxWrapper"><div id="RIGHT" class="box">right</div></div> 136 <div class="boxWrapper"><div id="RIGHT" class="box">right</div></div>
140</div> 137</div>
141 138
142</body> 139</body>
143</html> 140</html>
diff --git a/frontend/gamma/tests/tests/Components/Tooltips/tooltips_test.js b/frontend/gamma/tests/tests/Components/Tooltips/tooltips_test.js
index 37c0e71..9ed1c05 100644
--- a/frontend/gamma/tests/tests/Components/Tooltips/tooltips_test.js
+++ b/frontend/gamma/tests/tests/Components/Tooltips/tooltips_test.js
@@ -1,117 +1,114 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.Tests.Tooltips'); 26Clipperz.Base.module('Clipperz.Tests.Tooltips');
30 27
31Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); 28Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
32Clipperz.PM.Strings.Languages.initSetup(); 29Clipperz.PM.Strings.Languages.initSetup();
33 30
34Clipperz.Tests.Tooltips.Tester = function(args) { 31Clipperz.Tests.Tooltips.Tester = function(args) {
35 args = args || {}; 32 args = args || {};
36 33
37 Clipperz.Tests.Tooltips.Tester.superclass.constructor.call(this, args); 34 Clipperz.Tests.Tooltips.Tester.superclass.constructor.call(this, args);
38 35
39 return this; 36 return this;
40}; 37};
41 38
42Clipperz.Base.extend(Clipperz.Tests.Tooltips.Tester, Object, { 39Clipperz.Base.extend(Clipperz.Tests.Tooltips.Tester, Object, {
43 40
44 'toString': function() { 41 'toString': function() {
45 return "Clipperz.Tests.Tooltips.Tester"; 42 return "Clipperz.Tests.Tooltips.Tester";
46 }, 43 },
47 44
48 //------------------------------------------------------------------------- 45 //-------------------------------------------------------------------------
49 46
50 'run': function () { 47 'run': function () {
51 vartooltip; 48 vartooltip;
52 49
53//Clipperz.log("================== ABOVE =================="); 50//Clipperz.log("================== ABOVE ==================");
54 tooltip = new Clipperz.PM.UI.Common.Components.Tooltip({ 51 tooltip = new Clipperz.PM.UI.Common.Components.Tooltip({
55 'element':MochiKit.DOM.getElement('ABOVE'), 52 'element':MochiKit.DOM.getElement('ABOVE'),
56 'text': "Tooltip displayed above the element", 53 'text': "Tooltip displayed above the element",
57 'position':'ABOVE' 54 'position':'ABOVE'
58 }); 55 });
59 tooltip.show(); 56 tooltip.show();
60 57
61//Clipperz.log("================== BELOW =================="); 58//Clipperz.log("================== BELOW ==================");
62 tooltip = new Clipperz.PM.UI.Common.Components.Tooltip({ 59 tooltip = new Clipperz.PM.UI.Common.Components.Tooltip({
63 'element':MochiKit.DOM.getElement('BELOW'), 60 'element':MochiKit.DOM.getElement('BELOW'),
64 'text': "Tooltip displayed below the element", 61 'text': "Tooltip displayed below the element",
65 'position':'BELOW' 62 'position':'BELOW'
66 }); 63 });
67 tooltip.show(); 64 tooltip.show();
68 65
69//Clipperz.log("================== LEFT =================="); 66//Clipperz.log("================== LEFT ==================");
70 tooltip = new Clipperz.PM.UI.Common.Components.Tooltip({ 67 tooltip = new Clipperz.PM.UI.Common.Components.Tooltip({
71 'element':MochiKit.DOM.getElement('LEFT'), 68 'element':MochiKit.DOM.getElement('LEFT'),
72 'text': "Tooltip displayed to the left of the element", 69 'text': "Tooltip displayed to the left of the element",
73 'position':'LEFT' 70 'position':'LEFT'
74 }); 71 });
75 tooltip.show(); 72 tooltip.show();
76 73
77//Clipperz.log("================== RIGHT =================="); 74//Clipperz.log("================== RIGHT ==================");
78 tooltip = new Clipperz.PM.UI.Common.Components.Tooltip({ 75 tooltip = new Clipperz.PM.UI.Common.Components.Tooltip({
79 'element':MochiKit.DOM.getElement('RIGHT'), 76 'element':MochiKit.DOM.getElement('RIGHT'),
80 'text': "Tooltip displayed to the right the element", 77 'text': "Tooltip displayed to the right the element",
81 'position':'RIGHT' 78 'position':'RIGHT'
82 }); 79 });
83 tooltip.show(); 80 tooltip.show();
84 81
85 }, 82 },
86 83
87 //========================================================================= 84 //=========================================================================
88 __syntaxFix__: "syntax fix" 85 __syntaxFix__: "syntax fix"
89}); 86});
90 87
91 88
92 89
93 90
94 91
95 92
96 93
97 94
98 95
99 96
100 97
101 98
102 99
103 100
104 101
105 102
106 103
107 104
108 105
109 106
110init = function () { 107init = function () {
111 vartester; 108 vartester;
112 109
113 tester = new Clipperz.Tests.Tooltips.Tester(); 110 tester = new Clipperz.Tests.Tooltips.Tester();
114 tester.run(); 111 tester.run();
115}; 112};
116 113
117MochiKit.DOM.addLoadEvent(init); 114MochiKit.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 dac8b45..49abe46 100644
--- a/frontend/gamma/tests/tests/Components/UnlockPassword/User.data.js
+++ b/frontend/gamma/tests/tests/Components/UnlockPassword/User.data.js
@@ -1,408 +1,405 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29testData = { 26testData = {
30 27
31 //------------------------------------------------------------------------- 28 //-------------------------------------------------------------------------
32 29
33 'simpleLogin_001': { 30 'simpleLogin_001': {
34 'users': [ 31 'users': [
35 { 32 {
36 'username': "joe", 33 'username': "joe",
37 'passphrase': "eoj", 34 'passphrase': "eoj",
38 'version': "0.2", 35 'version': "0.2",
39 'connectionVersion':"0.2", 36 'connectionVersion':"0.2",
40 'records':{ 37 'records':{
41 'record 1': { 38 'record 1': {
42 'notes':"Some notes here", 39 'notes':"Some notes here",
43 'fields':[ 40 'fields':[
44 { 'name': "username", 'value': "joe", 'type': "text" }, 41 { 'name': "username", 'value': "joe", 'type': "text" },
45 { 'name': "password", 'value': "1234", 'type': "password"} 42 { 'name': "password", 'value': "1234", 'type': "password"}
46 ], 43 ],
47 'directLogins':{ 44 'directLogins':{
48 "record 1 direct login": { 45 "record 1 direct login": {
49 'configuration':"", 46 'configuration':"",
50 'bindings':[ 47 'bindings':[
51 ], 48 ],
52 'favicon':"http://www.example.com/favicon.ico" 49 'favicon':"http://www.example.com/favicon.ico"
53 } 50 }
54 } 51 }
55 } 52 }
56 }, 53 },
57 'otp':[ 54 'otp':[
58 "12345678 90abcdef 12345678 90abcdef", 55 "12345678 90abcdef 12345678 90abcdef",
59 "fedcba09 87654321 fedcba09 87654321" 56 "fedcba09 87654321 fedcba09 87654321"
60 ] 57 ]
61 } 58 }
62 ] 59 ]
63 }, 60 },
64 61
65 //------------------------------------------------------------------------- 62 //-------------------------------------------------------------------------
66 63
67 'joe_clipperz_offline_copy_data': { 64 'joe_clipperz_offline_copy_data': {
68 users:{ 65 users:{
69 'catchAllUser': { 66 'catchAllUser': {
70 __masterkey_test_value__: 'masterkey', 67 __masterkey_test_value__: 'masterkey',
71 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00', 68 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00',
72 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00' 69 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00'
73 }, 70 },
74 'f527cdd90d0d47f8524b4e165398ad1455eba515d04abd101d1e93b3c6ae0674': { 71 'f527cdd90d0d47f8524b4e165398ad1455eba515d04abd101d1e93b3c6ae0674': {
75 s: '186f0c40bf73f2af236eaa6c429df225efa933050c9aae65240e93b7b362e3ee', 72 s: '186f0c40bf73f2af236eaa6c429df225efa933050c9aae65240e93b7b362e3ee',
76 v: 'ac61a6e325ecf329926a86084f591d8852d0ad3e4a6080f2adc901b82395ecaf', 73 v: 'ac61a6e325ecf329926a86084f591d8852d0ad3e4a6080f2adc901b82395ecaf',
77 version: '0.2', 74 version: '0.2',
78 maxNumberOfRecords: '100', 75 maxNumberOfRecords: '100',
79 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"}', 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"}',
80 statistics: 'SfGy/4mpXQdDOv+Bcfie4Yt/', 77 statistics: 'SfGy/4mpXQdDOv+Bcfie4Yt/',
81 userDetailsVersion: '0.3', 78 userDetailsVersion: '0.3',
82 records: { 79 records: {
83 '062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80': { 80 '062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80': {
84 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', 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',
85 version: '0.2', 82 version: '0.2',
86 creationDate: 'Wed Mar 14 15:46:44 CET 2007', 83 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
87 updateDate: 'Wed Mar 14 15:46:44 CET 2007', 84 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
88 accessDate: 'Mon Jan 19 16:10:04 CET 2009', 85 accessDate: 'Mon Jan 19 16:10:04 CET 2009',
89 currentVersion: '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3', 86 currentVersion: '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3',
90 versions: { 87 versions: {
91 '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3': { 88 '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3': {
92 header: '####', 89 header: '####',
93 data: 'GCNNIhDQjMJQZGVSf+95fPtU6eOnFWVhuGm86r8WZGVR2Gf2EjbG1OJ0ZIGpZ/AXgirCMpo5AFxJe0Bay8IYg+xmBqMFhwFxzAgJBYCIts+raSaNRipuY8dTEqDxAqD1cChcG8EhSoiFgQ0fG0I7nNEUDJi0pIt4/ygBcwvAhuAenEp9ZW+oQA0+YysPQRqkz3IieFaOoSEbe5/SqpUilV4q1gTVyzNXvrxzxx+rlvEyGFgFN+vgtUZ1NrwlPk4gVksTpylvv6CFaMGEWKhgMG6efo0rJckKosaJTu1pldJdnmMK4EKNMLOd+jZ6pEhEhYyadrA4+zYU5TlmZA6ASzTaps8piSwZodoi9qY0ch2StK4mAbzeEGe2HdfHuAU9Tyq3Ppk3+VfNdKgpQfYrQOiSlXbKzK636tzXTN/gyrfOTHjBrRl117ywibgSX63ayAYNfcLpKotC', 90 data: 'GCNNIhDQjMJQZGVSf+95fPtU6eOnFWVhuGm86r8WZGVR2Gf2EjbG1OJ0ZIGpZ/AXgirCMpo5AFxJe0Bay8IYg+xmBqMFhwFxzAgJBYCIts+raSaNRipuY8dTEqDxAqD1cChcG8EhSoiFgQ0fG0I7nNEUDJi0pIt4/ygBcwvAhuAenEp9ZW+oQA0+YysPQRqkz3IieFaOoSEbe5/SqpUilV4q1gTVyzNXvrxzxx+rlvEyGFgFN+vgtUZ1NrwlPk4gVksTpylvv6CFaMGEWKhgMG6efo0rJckKosaJTu1pldJdnmMK4EKNMLOd+jZ6pEhEhYyadrA4+zYU5TlmZA6ASzTaps8piSwZodoi9qY0ch2StK4mAbzeEGe2HdfHuAU9Tyq3Ppk3+VfNdKgpQfYrQOiSlXbKzK636tzXTN/gyrfOTHjBrRl117ywibgSX63ayAYNfcLpKotC',
94 version: '0.2', 91 version: '0.2',
95 creationDate: 'Wed Mar 14 15:46:44 CET 2007', 92 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
96 updateDate: 'Wed Mar 14 15:46:44 CET 2007', 93 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
97 accessDate: 'Mon Jan 19 16:10:04 CET 2009' 94 accessDate: 'Mon Jan 19 16:10:04 CET 2009'
98 } 95 }
99 } 96 }
100 }, 97 },
101 '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d': { 98 '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d': {
102 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', 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',
103 version: '0.3', 100 version: '0.3',
104 creationDate: 'Fri Oct 17 16:49:20 CEST 2008', 101 creationDate: 'Fri Oct 17 16:49:20 CEST 2008',
105 updateDate: 'Mon Oct 27 08:58:49 CET 2008', 102 updateDate: 'Mon Oct 27 08:58:49 CET 2008',
106 accessDate: 'Mon Jan 19 16:09:39 CET 2009', 103 accessDate: 'Mon Jan 19 16:09:39 CET 2009',
107 currentVersion: '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac', 104 currentVersion: '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac',
108 versions: { 105 versions: {
109 '0ae362285f103722abbd046eee2b7d10aeae6a1d05cbaf2081392ce9df882bcf': { 106 '0ae362285f103722abbd046eee2b7d10aeae6a1d05cbaf2081392ce9df882bcf': {
110 header: '####', 107 header: '####',
111 data: 'sG6TUmPSEPFpiJ5YdtghWHmHbvUK63tZCZ+Q5iz2ALas//jN+lZCBhZcjEwPEJskBkK2R0MyAh14wWGh2bBHMjsokgTe+L+x+0c/Zi0epE/IC9gtOBhsTe/hZ2e2xOGF/SbzET3DAAYXvxduZ36f7SvvFnrkkKvpj8wGSdTFcBmzqMb9DL2bRyRCLGLMzE3F1a0q5CufCIRz2TgHm+Uw+kfvvwC7ig/F/5iLW90Ypz3vmEtMEFYFHZ9a8Oh0rsXGfevbMhFqALoywzihQEe/NiB8dwn7GEdYKSQ35rhvZh29ULWOZinqmg0ONe0HYaxx7DbKsVoue57S0CIUlgHLajzHfLfqQg2sFI0OT8TnHsGg0YZ6mM2EdKmEjJiER0cP', 108 data: 'sG6TUmPSEPFpiJ5YdtghWHmHbvUK63tZCZ+Q5iz2ALas//jN+lZCBhZcjEwPEJskBkK2R0MyAh14wWGh2bBHMjsokgTe+L+x+0c/Zi0epE/IC9gtOBhsTe/hZ2e2xOGF/SbzET3DAAYXvxduZ36f7SvvFnrkkKvpj8wGSdTFcBmzqMb9DL2bRyRCLGLMzE3F1a0q5CufCIRz2TgHm+Uw+kfvvwC7ig/F/5iLW90Ypz3vmEtMEFYFHZ9a8Oh0rsXGfevbMhFqALoywzihQEe/NiB8dwn7GEdYKSQ35rhvZh29ULWOZinqmg0ONe0HYaxx7DbKsVoue57S0CIUlgHLajzHfLfqQg2sFI0OT8TnHsGg0YZ6mM2EdKmEjJiER0cP',
112 version: '0.3', 109 version: '0.3',
113 creationDate: 'Fri Oct 17 17:00:31 CEST 2008', 110 creationDate: 'Fri Oct 17 17:00:31 CEST 2008',
114 updateDate: 'Fri Oct 17 17:00:31 CEST 2008', 111 updateDate: 'Fri Oct 17 17:00:31 CEST 2008',
115 accessDate: 'Fri Oct 17 17:00:31 CEST 2008' 112 accessDate: 'Fri Oct 17 17:00:31 CEST 2008'
116 }, 113 },
117 '10f45664bbd979a92f37886f1ecc6e52e49798b16dc997aecd37259ad9b2090e': { 114 '10f45664bbd979a92f37886f1ecc6e52e49798b16dc997aecd37259ad9b2090e': {
118 header: '####', 115 header: '####',
119 data: 'RdKVaV/WWWchrCse3KtcXd47Bfm6IAwjqVUpaxoed3HeunI42AAm7xYYSjeK8edHpbNRJbhobBAX5OZtWIp/HmgkobKM8CIiWxrWz89FqyrbnPD7+fXdtgF2yTax/0sC1l0ibncdOuJKX6U829oPlXCpXIOjlomc4wEEAD/5V6FbORvdZ9IE/ME3LsG2y02cT2tIpx6+R6wC/PKXhZA2UDsTE6R2Op2BtIzpVORZLXsdyAp/4wvWQxq90i9cEpbsVQsMB10JVyNHNsRTFhIlHi9MVCaMxQvcrwRElMj/Y9x3RbsFzSGKqFLqdg7Fn/U+KYkpYtsgHv9hraPIb9lV5FH16+iItU/HBM6FGezIj1ZkoQ+dgjPfSjTZzgzDYwyb', 116 data: 'RdKVaV/WWWchrCse3KtcXd47Bfm6IAwjqVUpaxoed3HeunI42AAm7xYYSjeK8edHpbNRJbhobBAX5OZtWIp/HmgkobKM8CIiWxrWz89FqyrbnPD7+fXdtgF2yTax/0sC1l0ibncdOuJKX6U829oPlXCpXIOjlomc4wEEAD/5V6FbORvdZ9IE/ME3LsG2y02cT2tIpx6+R6wC/PKXhZA2UDsTE6R2Op2BtIzpVORZLXsdyAp/4wvWQxq90i9cEpbsVQsMB10JVyNHNsRTFhIlHi9MVCaMxQvcrwRElMj/Y9x3RbsFzSGKqFLqdg7Fn/U+KYkpYtsgHv9hraPIb9lV5FH16+iItU/HBM6FGezIj1ZkoQ+dgjPfSjTZzgzDYwyb',
120 version: '0.3', 117 version: '0.3',
121 creationDate: 'Fri Oct 17 16:49:20 CEST 2008', 118 creationDate: 'Fri Oct 17 16:49:20 CEST 2008',
122 updateDate: 'Fri Oct 17 16:49:20 CEST 2008', 119 updateDate: 'Fri Oct 17 16:49:20 CEST 2008',
123 accessDate: 'Fri Oct 17 16:54:23 CEST 2008' 120 accessDate: 'Fri Oct 17 16:54:23 CEST 2008'
124 }, 121 },
125 '2fa7b67e569d5e268d2b70b3d4d3a960d7e437e1937bcb324b67d0b9441db8ba': { 122 '2fa7b67e569d5e268d2b70b3d4d3a960d7e437e1937bcb324b67d0b9441db8ba': {
126 header: '####', 123 header: '####',
127 data: 'dpnI2qKjk0+bfyKktw4ZCWf+rWZ12hO5bda39CwD29JH7KtdpLCLe2LoLd+KKF2wOdpDsoI2iTiwRgFpt77e7DoWJABxq/0aaRCVN9XpqZo08iHiYhJyNlIszO8CdEhX+M3AeZqzTnd6fs91VfIEWggvku2Z+jwr0CbclY6FnOcNnS+1fj+W79Z9XC383GOm2ujjfo3SX/fyNQSw8aX+7AgJIRGR9uHK7M1cVfsNNTbmDb/HDgLlYZ1Pqm/9poHpmS7G4HUoRM2/WjI0R6F48dy5s8vZRi11SCnlnj5oRykScJj6wh2DltbCyesiaTpAjP6MQjTXsZzKpaosaQcQClZw+w6hDD2cA54IaBIv2j5KAHyhxDh2ERdwbdnCsDKPz4+zP+fmKfW295d4OY0l1NCSdcY+75HWTmBWRAooZeDTo7AE8m5sRwxewE0Y8J2MLUYsrs7Rl4kbZCiRRHU7cs+us3fq2DVn2OLGEbkRrK3kA9swT9W8ABqINoA79+DmDaIr6TGxe5AlHkCAl5sYAN4g42UX1NKhl4fWI1Scj9O1Ixds/1UUvqzavld0mE2cR9yt6LntjE5sQSAaexvymAJbU5IIM5NTk7NlY7G3PEvAPjcUsL9SGw==', 124 data: 'dpnI2qKjk0+bfyKktw4ZCWf+rWZ12hO5bda39CwD29JH7KtdpLCLe2LoLd+KKF2wOdpDsoI2iTiwRgFpt77e7DoWJABxq/0aaRCVN9XpqZo08iHiYhJyNlIszO8CdEhX+M3AeZqzTnd6fs91VfIEWggvku2Z+jwr0CbclY6FnOcNnS+1fj+W79Z9XC383GOm2ujjfo3SX/fyNQSw8aX+7AgJIRGR9uHK7M1cVfsNNTbmDb/HDgLlYZ1Pqm/9poHpmS7G4HUoRM2/WjI0R6F48dy5s8vZRi11SCnlnj5oRykScJj6wh2DltbCyesiaTpAjP6MQjTXsZzKpaosaQcQClZw+w6hDD2cA54IaBIv2j5KAHyhxDh2ERdwbdnCsDKPz4+zP+fmKfW295d4OY0l1NCSdcY+75HWTmBWRAooZeDTo7AE8m5sRwxewE0Y8J2MLUYsrs7Rl4kbZCiRRHU7cs+us3fq2DVn2OLGEbkRrK3kA9swT9W8ABqINoA79+DmDaIr6TGxe5AlHkCAl5sYAN4g42UX1NKhl4fWI1Scj9O1Ixds/1UUvqzavld0mE2cR9yt6LntjE5sQSAaexvymAJbU5IIM5NTk7NlY7G3PEvAPjcUsL9SGw==',
128 version: '0.3', 125 version: '0.3',
129 creationDate: 'Fri Oct 17 17:00:13 CEST 2008', 126 creationDate: 'Fri Oct 17 17:00:13 CEST 2008',
130 updateDate: 'Fri Oct 17 17:00:13 CEST 2008', 127 updateDate: 'Fri Oct 17 17:00:13 CEST 2008',
131 accessDate: 'Fri Oct 17 17:00:13 CEST 2008' 128 accessDate: 'Fri Oct 17 17:00:13 CEST 2008'
132 }, 129 },
133 '5a17723c34226d8cd663f91b11bfa14979e694e461818113ec8abf7194b46b6b': { 130 '5a17723c34226d8cd663f91b11bfa14979e694e461818113ec8abf7194b46b6b': {
134 header: '####', 131 header: '####',
135 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==', 132 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==',
136 version: '0.3', 133 version: '0.3',
137 creationDate: 'Fri Oct 17 16:59:31 CEST 2008', 134 creationDate: 'Fri Oct 17 16:59:31 CEST 2008',
138 updateDate: 'Fri Oct 17 16:59:31 CEST 2008', 135 updateDate: 'Fri Oct 17 16:59:31 CEST 2008',
139 accessDate: 'Fri Oct 17 16:59:31 CEST 2008' 136 accessDate: 'Fri Oct 17 16:59:31 CEST 2008'
140 }, 137 },
141 '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac': { 138 '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac': {
142 header: '####', 139 header: '####',
143 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==', 140 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==',
144 version: '0.3', 141 version: '0.3',
145 creationDate: 'Mon Oct 27 08:58:49 CET 2008', 142 creationDate: 'Mon Oct 27 08:58:49 CET 2008',
146 updateDate: 'Mon Oct 27 08:58:49 CET 2008', 143 updateDate: 'Mon Oct 27 08:58:49 CET 2008',
147 accessDate: 'Mon Jan 19 16:09:39 CET 2009' 144 accessDate: 'Mon Jan 19 16:09:39 CET 2009'
148 }, 145 },
149 'b57a2d2ffafa8029123362071c09709bb9192f06a17140440f0e41d22143148f': { 146 'b57a2d2ffafa8029123362071c09709bb9192f06a17140440f0e41d22143148f': {
150 header: '####', 147 header: '####',
151 data: 'PQ53T2Vo2D8PoLI1qNX//jLaVZFTDTYk6geT9+4RoThTxvlJ+beDPnQzgYhd9iASaF9GQEEL8JxsBnNpEPa6JPOY4ndFLmDLyFDKXMprxq1UIbzFV6kFoYAk3uCCCa3UCDzdr1KXB2CiiF9HrilaA+xkm8krAvH8I5kZD+j23gByz5cAFvXg7A77KEURpjujURL65DW5M+ceIjo6OXaPW9VO03xhqGt/M47ayObpoEGJZn+X9C8s0SE5wOXHbn38YZlRI480OMvtDAxbEYUeQKMmzu6lO4Nw5hhOUjoPSLr/i3tmDx3nPcDwnSafx6jyA4y31eW6yazqTEOP5I5ArC5mUrF7mAAiFvbHIsMoF8PLj6MONlRIOZgbf9HzCpFdt8xBrX/TXp3LaSAj2XTWgSTFI2cgmU3qqPyibvIfUsB5cVHQCXi692JpC+B85axJ0FLyMl5w3vq0txlPkf6q+dadPYDaLHGZEmDjkWScA1GM5xPJHWFwqGE7ejgXKG0sMYsMKWYk+F2LEUmMHtEvSlpgJBntvcQ1ZjYQxeu4hg5txu1ykkif6fXgkXF6wn6qu+5caeJeNhWtAB4q7WVD47111woYMdkmX7AnDTXSAQ==', 148 data: 'PQ53T2Vo2D8PoLI1qNX//jLaVZFTDTYk6geT9+4RoThTxvlJ+beDPnQzgYhd9iASaF9GQEEL8JxsBnNpEPa6JPOY4ndFLmDLyFDKXMprxq1UIbzFV6kFoYAk3uCCCa3UCDzdr1KXB2CiiF9HrilaA+xkm8krAvH8I5kZD+j23gByz5cAFvXg7A77KEURpjujURL65DW5M+ceIjo6OXaPW9VO03xhqGt/M47ayObpoEGJZn+X9C8s0SE5wOXHbn38YZlRI480OMvtDAxbEYUeQKMmzu6lO4Nw5hhOUjoPSLr/i3tmDx3nPcDwnSafx6jyA4y31eW6yazqTEOP5I5ArC5mUrF7mAAiFvbHIsMoF8PLj6MONlRIOZgbf9HzCpFdt8xBrX/TXp3LaSAj2XTWgSTFI2cgmU3qqPyibvIfUsB5cVHQCXi692JpC+B85axJ0FLyMl5w3vq0txlPkf6q+dadPYDaLHGZEmDjkWScA1GM5xPJHWFwqGE7ejgXKG0sMYsMKWYk+F2LEUmMHtEvSlpgJBntvcQ1ZjYQxeu4hg5txu1ykkif6fXgkXF6wn6qu+5caeJeNhWtAB4q7WVD47111woYMdkmX7AnDTXSAQ==',
152 version: '0.3', 149 version: '0.3',
153 creationDate: 'Fri Oct 17 16:57:17 CEST 2008', 150 creationDate: 'Fri Oct 17 16:57:17 CEST 2008',
154 updateDate: 'Fri Oct 17 16:57:17 CEST 2008', 151 updateDate: 'Fri Oct 17 16:57:17 CEST 2008',
155 accessDate: 'Fri Oct 17 16:57:17 CEST 2008' 152 accessDate: 'Fri Oct 17 16:57:17 CEST 2008'
156 }, 153 },
157 'b713e0a1e2664ac7bfa7ba887329ea023204d10298973e322983b82b222debf6': { 154 'b713e0a1e2664ac7bfa7ba887329ea023204d10298973e322983b82b222debf6': {
158 header: '####', 155 header: '####',
159 data: 'H3gIieYrH7Oy8LEWCZpl9vGp9qYdHNCoBNGijYqlcfXt+1JYvPj1abPp12xLNrDUHfaOZklU2Ip4tOf0CDNhgAan7LYyPqFoy9ss2f9/5RLcbjwiIwSduySIL322HTAwqlzlBt/qaJdHHPUrczmu0fb7fT+0dO4gCL/e/IjcHLefUUgNPAbpHG0Nv0+4lNwKZkIQM3tLRtfJyFBIgWKcMcP1XMic33kr24rwybR8Pb0CHZrOOvvUiGqyoED3ZTZf1twUDVNXO7MWCAC5dBc6/Mk/vSmbbGhppXAH02N0g8G5qzZfp3UVikls55VNhRYLHByVsgpkbIrKXyZnBPTwzm7qefpYAXDOgO+164L66/Art2FYGqZQRZLuh5r8oF38', 156 data: 'H3gIieYrH7Oy8LEWCZpl9vGp9qYdHNCoBNGijYqlcfXt+1JYvPj1abPp12xLNrDUHfaOZklU2Ip4tOf0CDNhgAan7LYyPqFoy9ss2f9/5RLcbjwiIwSduySIL322HTAwqlzlBt/qaJdHHPUrczmu0fb7fT+0dO4gCL/e/IjcHLefUUgNPAbpHG0Nv0+4lNwKZkIQM3tLRtfJyFBIgWKcMcP1XMic33kr24rwybR8Pb0CHZrOOvvUiGqyoED3ZTZf1twUDVNXO7MWCAC5dBc6/Mk/vSmbbGhppXAH02N0g8G5qzZfp3UVikls55VNhRYLHByVsgpkbIrKXyZnBPTwzm7qefpYAXDOgO+164L66/Art2FYGqZQRZLuh5r8oF38',
160 version: '0.3', 157 version: '0.3',
161 creationDate: 'Fri Oct 17 16:58:00 CEST 2008', 158 creationDate: 'Fri Oct 17 16:58:00 CEST 2008',
162 updateDate: 'Fri Oct 17 16:58:00 CEST 2008', 159 updateDate: 'Fri Oct 17 16:58:00 CEST 2008',
163 accessDate: 'Fri Oct 17 16:58:00 CEST 2008' 160 accessDate: 'Fri Oct 17 16:58:00 CEST 2008'
164 }, 161 },
165 'c4cea1cd88a86b05f48a99896a37967c3456228283a0406331ca9f67c6f29f97': { 162 'c4cea1cd88a86b05f48a99896a37967c3456228283a0406331ca9f67c6f29f97': {
166 header: '####', 163 header: '####',
167 data: '1znWPwc9JwCe7iOFiUd2iGm4xJd+824B4VRqEtzCQkW46tg25RWfo7XagvK46USB7t6pC8WMLU0M/EC47KucsfpWUqHGbseoXT/8g8E8GoLnIsk9qFyJG7LGd1sUvqBgszLZwjWWG3t9zifmpW5nY9GialBYNmeSLS3bg5xDH+eCEilUUfDe7zGuVSuu/XkHacv/DYUst97e+6u44F7H8Kv8dTywJZpqbmveNPeWfCej2aBXdVV616J5lIRaj2uIYuQYG7blYJh9KZ7yLStdPndl6h65hIJpfWo0PM8nLJuo0lWNHz7misrutnmxJEjkwVIZ5YAmqp1Zz3VC8zw4IxkXrC/sPmp4PaNXgKz9ZJRaY2KV69WmHf7BUQ3QneGngbT0tN526SS5qDFwTGiuIlnYGWvTB2jVrbns68n/d8Fps8sSWfJBvvXJUEkaZB+1WqNilOPGXvyJ5k2O/iucFbRlxwlEHDny+AgsbtXZdp8cHQ4C/O4G0mnUMZuS38gn6e2kQ55mUhxKeORM+J6Rx1y4Iiu9KKNbxyS5eBpAlFB4xS/o35CS4g309vyOEhi37F24bpp4pM0xEPG4mcc/IyChHzaHUGEp1IX1ZO/r3ut9RIN2QWrGLUlZV/9rFKpLLAy6BkY/g8VYNrV8PztOL3rqy/qwqNZouONwPw8w8SA=', 164 data: '1znWPwc9JwCe7iOFiUd2iGm4xJd+824B4VRqEtzCQkW46tg25RWfo7XagvK46USB7t6pC8WMLU0M/EC47KucsfpWUqHGbseoXT/8g8E8GoLnIsk9qFyJG7LGd1sUvqBgszLZwjWWG3t9zifmpW5nY9GialBYNmeSLS3bg5xDH+eCEilUUfDe7zGuVSuu/XkHacv/DYUst97e+6u44F7H8Kv8dTywJZpqbmveNPeWfCej2aBXdVV616J5lIRaj2uIYuQYG7blYJh9KZ7yLStdPndl6h65hIJpfWo0PM8nLJuo0lWNHz7misrutnmxJEjkwVIZ5YAmqp1Zz3VC8zw4IxkXrC/sPmp4PaNXgKz9ZJRaY2KV69WmHf7BUQ3QneGngbT0tN526SS5qDFwTGiuIlnYGWvTB2jVrbns68n/d8Fps8sSWfJBvvXJUEkaZB+1WqNilOPGXvyJ5k2O/iucFbRlxwlEHDny+AgsbtXZdp8cHQ4C/O4G0mnUMZuS38gn6e2kQ55mUhxKeORM+J6Rx1y4Iiu9KKNbxyS5eBpAlFB4xS/o35CS4g309vyOEhi37F24bpp4pM0xEPG4mcc/IyChHzaHUGEp1IX1ZO/r3ut9RIN2QWrGLUlZV/9rFKpLLAy6BkY/g8VYNrV8PztOL3rqy/qwqNZouONwPw8w8SA=',
168 version: '0.3', 165 version: '0.3',
169 creationDate: 'Fri Oct 17 17:01:59 CEST 2008', 166 creationDate: 'Fri Oct 17 17:01:59 CEST 2008',
170 updateDate: 'Fri Oct 17 17:01:59 CEST 2008', 167 updateDate: 'Fri Oct 17 17:01:59 CEST 2008',
171 accessDate: 'Mon Oct 27 08:57:58 CET 2008' 168 accessDate: 'Mon Oct 27 08:57:58 CET 2008'
172 } 169 }
173 } 170 }
174 }, 171 },
175 '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551': { 172 '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551': {
176 data: '0/BjzyY6jeh71hwgASQphLMgnLz6WJJPg7sDskLKo5gCumpebgHBPqN0OPyHqTq4Lyt7Um++ckx2VA4yoX4cojXC7FBnscHtN18RlVNRvkfhhFPWBZhFwuVZxlFNb/IueDSjKR3dJahbTqao2AU3HXp0xOdsO5Mb2CfMz1/C4rtDuv5ee7GJNEv2hb2tBTzxbB8PZ/TKYZhlfgV3rJ2Hc509OeX/PuD8oYB7sUnB9UhDZP7pVY0Vz3LP/dFUf1cPGFh7bnxxYNphpJ2SxhIUdgxpmP6UCFxdLbCBXv13+7OlhCaO2eGfsO4Qch996otkSrVxfTvOTLuwiwSqU7hLlvOSzm9in69Rf35ZC7bKcZIdZkTNPeV0a+dR6j3LY7dBvIzd08OtBSqOdQqo/6isG8vaQPLVcWkFFZ//iHGgjTIduSoyzMb/y9cr8J1Qj1uTayUVAHQywCYdKgT4UccLoyt96vKHRcPCw6iepEfSrc3aZOtTg/aS3j2CGTih0i0gfrA4EbeQtIfobthsbTF6Oq5xjrIAMv2LRiJ+8JPj6xw8ODvM8SUN/3UxlYKsqDpWOW4tOztQAMSijoGtBswIl+mLr2p50Cul4n8ENfrilyAX4AcxUFSbH6tVd19ErQLsj+T2H5qhIF0Ifo5NxL9bj+Gx/5ul6dGH6Et9dvaHv+CZ3FKc7wrvItd6GXexc0SC16VfEOUps8yBahEHvNYAo/r5UG+wDCMhstHzEjiSV7TJ5ozjf+C2N+5A81TpJS+zfXhuiyupburyjYX8KQfXSvc28FG9CsgD9u9NcUuqC8L0K6MTB7k8RPSrG9xcBowqFDaH3/afLBsKWHEx87TiaZ7GbxKKmiINJk833pNZMYt36dr0fT0AH6WkvD4iSIWcFjvAHrW0CUBjOkhooAxjLDwNS4xBcgL0uGf61ygYBUH9zV+JqC3pullYzc7gL6Z1uKTdB9+Rzq/1NfZGUjVrsIepYO6k3Jf2j77qRNofSVtLr7VudUv297mIypV4jFNG/RoPFtQ2WSbHZIYIVepPCqWkQQ3VaaBZd8NToEYPjeSP7FQCrIjDtH5JVc649wgkEHdLS/q/lsToyCQh/47fiaEU/OJUX6UrzLG50J8+b+ijzIE3A3hZJf6nBnUbcUsEN1WzNHama57tMsWCUoxfcsZjEeSk8CzUjEFvxToKpESwRX7jDS7uWyRjuIHE56nuy7Rhzy7kP3hjE7eZQGMA7h3yxItDxa0hjvUO46IjZpmfyLIftSd323J9K7y9x3q0OGs6cNMNll+M8eSwHgooJbAGYjftIYVQ7t3l19LKEpnemXuObFFJQMvu6KQFRkHS3A2OROzC7hy3w5nSZP9Nqvygvc8Nj5x2IlHlK+pZeQi9E9WU6mGKIPzAOjSZg1FRLULUmahWgXGvJVIoVbHL1WX0/+g1BVsVcEZEAviRczTaFYVrH3zUIb0hql9p5EmHXwINnWMpbL1oh2LEsOUIpRCzjeBX1om6QCwyrXKzE5WkKcsQ7WbVvJf2q8Vdj3r3I8D9Kr+a7QqnAKm1GdwS+e5PcapxDzyhIAw0AsrOyWpIHFKvoJGl9/CWiD6Q+WxLDjG/KC3ms5P6hxY2Oxyakmmp0JGMtSIpOIV4cUyxfnFQ0LVX+vcrM9DpwZNHYLfyEVgg68xpLkUhUSHqYQhHgMe9oyFrzjmnU+EAzBY2vn7ZRrzxEowFipZpmlxFb81V9KRLT2l+3sUZ2yym7Y81HNdY4u1NKw2a3kwNryk0lID5FlbqvswxDJ60aWKFl2jrRW+EUoAX0mmGLk4lw1TYMKimngJap2ukwFky5/yn5KwCq4GjTkxzD35A52hFbDq5juINpyuFKb5X6sTkzxmIQ6d+1ePO6+kkN5RrZwjM2022BDoKJ95OyaR6kqUsIikDrgxHQUD6LR/2RMZapGa0B9klNlPm2phmQtAy3HLWfByXxRTHv7CP0keJl0f43LCHx/XPglb+QCs7mkgBIlp55xWugdKiBgMxzBkpjYWIXaaRkJcFrd8VmAwrXuRBvxVFzXh9/jHxuUMYv4WPaNX0SIhiNzaJsQCj5GRc4ftGD6Ot5rOaYjOxVM4yiFRzJMCgjCJPkL8EkU4l3M0GP3udgCfVqoHVFAAKmgdHB4o+hR4F8JA8U9+OCAMdZ+U0TL0oCcZPvQqVKi0b+5dePa8xTLYzOAuO7KF2TvKIujYqkumvg3zauUxxq7Ncklv+ddruQd3KAJ+H7rB9+g/6mTUpdyhNs91BD+QO0q3AYqmtTjSb6eJ2cmz7h6hA4xdg1Pel/sn+B3dePy7BVXLe/G2p5W34L0ZItuAJlIUo8JqE7IJ+BDJ2HPHMT4t/QIde6A76LDvKzalpZ5k5DXwnwGIj4DUdMXgYB8GdtTAhusOraNCNXTCyqU+EchYrO6o9UOURzd8wWj49jce/XROvWtKBuVbAXDNZzcIR8ALmpNTJKv0fz2Y/9/yxxvKN1dpBkLj+MpAw2++NEyylGhMC5C5f5m8pBApYziN84s4O3JQ3khW/1UttQl4=', 173 data: '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',
177 version: '0.2', 174 version: '0.2',
178 creationDate: 'Wed Mar 14 14:53:11 CET 2007', 175 creationDate: 'Wed Mar 14 14:53:11 CET 2007',
179 updateDate: 'Tue Apr 17 19:17:52 CEST 2007', 176 updateDate: 'Tue Apr 17 19:17:52 CEST 2007',
180 accessDate: 'Mon Jan 19 16:09:25 CET 2009', 177 accessDate: 'Mon Jan 19 16:09:25 CET 2009',
181 currentVersion: '88943d709c3ea2442d4f58eaaec6409276037e5a37e0a6d167b9dad9e947e854', 178 currentVersion: '88943d709c3ea2442d4f58eaaec6409276037e5a37e0a6d167b9dad9e947e854',
182 versions: { 179 versions: {
183 '106a1116d22c2395906a346da4d830c7afbd2da9a46210d0b7a11de238016783': { 180 '106a1116d22c2395906a346da4d830c7afbd2da9a46210d0b7a11de238016783': {
184 header: '####', 181 header: '####',
185 data: 'jgDUvByveAFnchBQKhiHGYDNDtj/7Aja2RePMer0FCOkkEu5GRAiLkxA3/DD3eiU+g+mCxnjnOaEIYL1O5o0+JP08XapsblZHTRKfveeFfs6sWwuqEHGYULBaXx4XSfK2B12HgpBwa5aD49489AkuyXi7t/aAXcKKJcLB1sC61DI3NsmajUaXHBi31Sp7nKAUpMuiWyguW0JVfH6KUPqyldVDBTBqHAis37c1qoR6aFHFfGgAfb35+syfmPRgemujMRkj2XO6dbt9zAYlHVSYFp9393rwPZoyBfXMMdDtSTmq7H9qbmx31GecHZlFN3NymtPPDYUbQ9mpPVRbxE9NjtiPrI5eGFvb++OdOx75PKjYjCAPWWFZ+4aryNn+h+yqab7pAuoG03ACVVrAFIOn09g1ssol/vqvalulEf3hAIviedyiNAC9D0UDHtzUwyIiELvR9qouXLZ', 182 data: 'jgDUvByveAFnchBQKhiHGYDNDtj/7Aja2RePMer0FCOkkEu5GRAiLkxA3/DD3eiU+g+mCxnjnOaEIYL1O5o0+JP08XapsblZHTRKfveeFfs6sWwuqEHGYULBaXx4XSfK2B12HgpBwa5aD49489AkuyXi7t/aAXcKKJcLB1sC61DI3NsmajUaXHBi31Sp7nKAUpMuiWyguW0JVfH6KUPqyldVDBTBqHAis37c1qoR6aFHFfGgAfb35+syfmPRgemujMRkj2XO6dbt9zAYlHVSYFp9393rwPZoyBfXMMdDtSTmq7H9qbmx31GecHZlFN3NymtPPDYUbQ9mpPVRbxE9NjtiPrI5eGFvb++OdOx75PKjYjCAPWWFZ+4aryNn+h+yqab7pAuoG03ACVVrAFIOn09g1ssol/vqvalulEf3hAIviedyiNAC9D0UDHtzUwyIiELvR9qouXLZ',
186 version: '0.2', 183 version: '0.2',
187 creationDate: 'Tue Apr 17 19:13:41 CEST 2007', 184 creationDate: 'Tue Apr 17 19:13:41 CEST 2007',
188 updateDate: 'Tue Apr 17 19:13:41 CEST 2007', 185 updateDate: 'Tue Apr 17 19:13:41 CEST 2007',
189 accessDate: 'Tue Apr 17 19:13:41 CEST 2007' 186 accessDate: 'Tue Apr 17 19:13:41 CEST 2007'
190 }, 187 },
191 '111a8a4b6b912b808a93cf5e8785ca223112628d05f0bfc5dfe1eb40cb72ed8a': { 188 '111a8a4b6b912b808a93cf5e8785ca223112628d05f0bfc5dfe1eb40cb72ed8a': {
192 header: '####', 189 header: '####',
193 data: 't524etHmXljCnLC+IM+WPD8Q5VE7wDsSHVNZzFU4hQzk119t/N/vhtfHYz5HgNstU5T8c7h7RHKvFk5f+4ZwgNgDqSH7H2PrH+7/bV8+uuqbe+/3GYOvELjTF7v3xMyYs1B7ruHpT+291HVNZqxajqCl/+9nbG0e5feqNsTXWUTdLzF0szJuCTNr2I+fhxAO0LRVaf8h+MBPYyuBDnfFDuKm899IsgF9YoYRvjaYO69DkElvf4VP2jrXIJsRnGIUfUaIS/wQ54+X4JBZM/9M09MVOw1SVe+cwG+P3xyPUkqnSb77ECo86C0MktzeYFmPnPv2SM2KFA6slctXsyudoaNlReh1k+6no5J5BjaawTfqYjYrAtWSPsuhxYVsZym/X2CVbkz4rMSn+J5Uio9N5uZ6AqgCKdhAJlwzVb3fIIJwvFpVpy/0LMskb7aG2i4eAxwzx1H6rD3Y', 190 data: 't524etHmXljCnLC+IM+WPD8Q5VE7wDsSHVNZzFU4hQzk119t/N/vhtfHYz5HgNstU5T8c7h7RHKvFk5f+4ZwgNgDqSH7H2PrH+7/bV8+uuqbe+/3GYOvELjTF7v3xMyYs1B7ruHpT+291HVNZqxajqCl/+9nbG0e5feqNsTXWUTdLzF0szJuCTNr2I+fhxAO0LRVaf8h+MBPYyuBDnfFDuKm899IsgF9YoYRvjaYO69DkElvf4VP2jrXIJsRnGIUfUaIS/wQ54+X4JBZM/9M09MVOw1SVe+cwG+P3xyPUkqnSb77ECo86C0MktzeYFmPnPv2SM2KFA6slctXsyudoaNlReh1k+6no5J5BjaawTfqYjYrAtWSPsuhxYVsZym/X2CVbkz4rMSn+J5Uio9N5uZ6AqgCKdhAJlwzVb3fIIJwvFpVpy/0LMskb7aG2i4eAxwzx1H6rD3Y',
194 version: '0.2', 191 version: '0.2',
195 creationDate: 'Wed Mar 14 14:53:11 CET 2007', 192 creationDate: 'Wed Mar 14 14:53:11 CET 2007',
196 updateDate: 'Wed Mar 14 14:53:11 CET 2007', 193 updateDate: 'Wed Mar 14 14:53:11 CET 2007',
197 accessDate: 'Wed Mar 14 15:24:35 CET 2007' 194 accessDate: 'Wed Mar 14 15:24:35 CET 2007'
198 }, 195 },
199 '144d6eff3eb5f1cb70c8906741d88018cdeeae3a618ac4066598ad6b04242364': { 196 '144d6eff3eb5f1cb70c8906741d88018cdeeae3a618ac4066598ad6b04242364': {
200 header: '####', 197 header: '####',
201 data: 'NPgSZF0eSOzy0/Ns+15Nz4bjSwh4o7fWYgKgwXLRFrF8y3EdbiOH7AiEmmPrCpT1raeYLWCcDIrRTz+/9uvIrz6kK6BjU2emr8YdyLai+PTCRY0SafWS3QiYixX6DJiKIt0SC2F6dfmSHwNsbfTHilFhVXn6wXTJpWvC+sRzw+h42cYpQp0BoLSuFV7vPz/+wtuQdl28BiBgLzGsrtPud0tPcfldGox6Ia/1SrOPcqUr0tnFlNQiUvPU7N0JZgRNyr1PfpAEhmYRI7aEJidsZ36vGQpE0ZQMmQE/9tLS/InALRZT1YXfMsytf0o3y4QlgJrvRgBL7fGiQOZJpU7igLk15xAwU+OLIaYIbr2xlKDJvndHOcrFoYKry9/A/aZSnEYv79wsaf64bBgIVD2WJGLuSFFmzlFnbg/O4kGTin3A8XBpvFA9V6iCMvnEMkrqxD3Qgf7WhxFE1A==', 198 data: 'NPgSZF0eSOzy0/Ns+15Nz4bjSwh4o7fWYgKgwXLRFrF8y3EdbiOH7AiEmmPrCpT1raeYLWCcDIrRTz+/9uvIrz6kK6BjU2emr8YdyLai+PTCRY0SafWS3QiYixX6DJiKIt0SC2F6dfmSHwNsbfTHilFhVXn6wXTJpWvC+sRzw+h42cYpQp0BoLSuFV7vPz/+wtuQdl28BiBgLzGsrtPud0tPcfldGox6Ia/1SrOPcqUr0tnFlNQiUvPU7N0JZgRNyr1PfpAEhmYRI7aEJidsZ36vGQpE0ZQMmQE/9tLS/InALRZT1YXfMsytf0o3y4QlgJrvRgBL7fGiQOZJpU7igLk15xAwU+OLIaYIbr2xlKDJvndHOcrFoYKry9/A/aZSnEYv79wsaf64bBgIVD2WJGLuSFFmzlFnbg/O4kGTin3A8XBpvFA9V6iCMvnEMkrqxD3Qgf7WhxFE1A==',
202 version: '0.2', 199 version: '0.2',
203 creationDate: 'Wed Mar 14 15:33:00 CET 2007', 200 creationDate: 'Wed Mar 14 15:33:00 CET 2007',
204 updateDate: 'Wed Mar 14 15:33:00 CET 2007', 201 updateDate: 'Wed Mar 14 15:33:00 CET 2007',
205 accessDate: 'Tue Apr 17 19:12:56 CEST 2007' 202 accessDate: 'Tue Apr 17 19:12:56 CEST 2007'
206 }, 203 },
207 '1f1bdb7a21440ac20c6d913d676aa30dc360252d27059e77df51a1be36b2e263': { 204 '1f1bdb7a21440ac20c6d913d676aa30dc360252d27059e77df51a1be36b2e263': {
208 header: '####', 205 header: '####',
209 data: 'TaOHH6IoHPKLLoyLyvsBszgsPPcDs6CiLVXzXuXjFSTrhPxzUw9suSsisgDRRs0ncjZ6BCyqoCxMnw6QVvGN4viUwYVR8AWdCg0NMQZ+LkNfq/2WN0M3KyASI8sIdMCwTb57NzOn9soB1HmmmETZfjr7HpY2cc+lS5/4f5rxI8XTEK60lLed+aEuJamAjeZUdgIyu30mMKKjxPfY3Y9iWMwn1OD0zF0mAW+hyEoMhhK7EYlWKCy+4qN0QM+yNFXQyERb04o2n4XrM+qr9df1GtbQMH8igK5VzXIrKjdHjKoLo9G7D7mfx6mRLsmoAJuE0R8gyzotgdBpOgWasHJ82iWEa1dLRKBHJ1d0Lnumv22tvYfasx2DIR5Tmx3kIQ3hFieLSXq48cYMiaZH/IbLiapIOlMgtWDow8JuySBLei/8FAV8jCxSc1Ui/SjbuK/kCvywaSOhDVIxGw==', 206 data: 'TaOHH6IoHPKLLoyLyvsBszgsPPcDs6CiLVXzXuXjFSTrhPxzUw9suSsisgDRRs0ncjZ6BCyqoCxMnw6QVvGN4viUwYVR8AWdCg0NMQZ+LkNfq/2WN0M3KyASI8sIdMCwTb57NzOn9soB1HmmmETZfjr7HpY2cc+lS5/4f5rxI8XTEK60lLed+aEuJamAjeZUdgIyu30mMKKjxPfY3Y9iWMwn1OD0zF0mAW+hyEoMhhK7EYlWKCy+4qN0QM+yNFXQyERb04o2n4XrM+qr9df1GtbQMH8igK5VzXIrKjdHjKoLo9G7D7mfx6mRLsmoAJuE0R8gyzotgdBpOgWasHJ82iWEa1dLRKBHJ1d0Lnumv22tvYfasx2DIR5Tmx3kIQ3hFieLSXq48cYMiaZH/IbLiapIOlMgtWDow8JuySBLei/8FAV8jCxSc1Ui/SjbuK/kCvywaSOhDVIxGw==',
210 version: '0.2', 207 version: '0.2',
211 creationDate: 'Wed Mar 14 15:26:35 CET 2007', 208 creationDate: 'Wed Mar 14 15:26:35 CET 2007',
212 updateDate: 'Wed Mar 14 15:26:35 CET 2007', 209 updateDate: 'Wed Mar 14 15:26:35 CET 2007',
213 accessDate: 'Wed Mar 14 15:26:35 CET 2007' 210 accessDate: 'Wed Mar 14 15:26:35 CET 2007'
214 }, 211 },
215 '70720f026f37b571e9765d27c51d3d60c7be0293c3266f1f987c8de9c6b5c416': { 212 '70720f026f37b571e9765d27c51d3d60c7be0293c3266f1f987c8de9c6b5c416': {
216 header: '####', 213 header: '####',
217 data: 'NYaYljcgfzrlN1DVgrbyj4AeVhXGjXPho3IQwEKD3ZOx/yEZxldCNSyFsrk7PoRB8Q1T/6VV4CGa4HLRSB7QVCrtVqWyu4KbbmFoX8NIQ0H3xv+TSo3S/b3dldUeyW32ScaGbspaf8nFf0CffsgpGusd+kHdiE3gSLJvH9y5j47KgpyyX4TteVzqgez4dcXIs5tdzJq2eUlknwU4651QeKIuRSmRaDRhhOP4yRgUo/qXMlTJFmHviCh+IumvBdmDoPe3Vc1vZ1r8PxpDJLvDoB8GTDE42NhqHfVrew9ym1xlTD9wswwIEikfOyTq3JM857qPOHRqSqthEvr4WHbm1VW5PReIyse0lugGyOzqtCnADp9NvNI440VjaTd4NBQqF7XrRm56+1u1uTdfYGFV5BRiH1KmrM1sxXQ6PlOF9Lou45ALo20xxvJOLKG0RKLMr8gmVT2bNtOSJw==', 214 data: 'NYaYljcgfzrlN1DVgrbyj4AeVhXGjXPho3IQwEKD3ZOx/yEZxldCNSyFsrk7PoRB8Q1T/6VV4CGa4HLRSB7QVCrtVqWyu4KbbmFoX8NIQ0H3xv+TSo3S/b3dldUeyW32ScaGbspaf8nFf0CffsgpGusd+kHdiE3gSLJvH9y5j47KgpyyX4TteVzqgez4dcXIs5tdzJq2eUlknwU4651QeKIuRSmRaDRhhOP4yRgUo/qXMlTJFmHviCh+IumvBdmDoPe3Vc1vZ1r8PxpDJLvDoB8GTDE42NhqHfVrew9ym1xlTD9wswwIEikfOyTq3JM857qPOHRqSqthEvr4WHbm1VW5PReIyse0lugGyOzqtCnADp9NvNI440VjaTd4NBQqF7XrRm56+1u1uTdfYGFV5BRiH1KmrM1sxXQ6PlOF9Lou45ALo20xxvJOLKG0RKLMr8gmVT2bNtOSJw==',
218 version: '0.2', 215 version: '0.2',
219 creationDate: 'Wed Mar 14 15:30:09 CET 2007', 216 creationDate: 'Wed Mar 14 15:30:09 CET 2007',
220 updateDate: 'Wed Mar 14 15:30:09 CET 2007', 217 updateDate: 'Wed Mar 14 15:30:09 CET 2007',
221 accessDate: 'Wed Mar 14 15:30:09 CET 2007' 218 accessDate: 'Wed Mar 14 15:30:09 CET 2007'
222 }, 219 },
223 '88943d709c3ea2442d4f58eaaec6409276037e5a37e0a6d167b9dad9e947e854': { 220 '88943d709c3ea2442d4f58eaaec6409276037e5a37e0a6d167b9dad9e947e854': {
224 header: '####', 221 header: '####',
225 data: 'xI3WXddQLFtLVzxJaZWQaw8wAgSuXLjLnyoNXnFuLecTH0BzU36PatglVh2HK3LM8aDLzzbHILdlLNnJ9CY+YnhmGh8hswF9oKTgq0Wsesgdc20QhSMNFFjmMljY1LSXmcAYK04Q5mIzi6Pe/04DRdj+e4zbe5QI4vEBhp/ohEpxZnNqc4BoX6J0eVf6LA1pwrKWvxzMxorWsJrrr+mn3svdlF437n+MMr89k5sQJogufes2GZ9tTvVZ4247ITxXqxgAhwXtbuIs/A5UqqnNdsxlHfpLKG5KjxB6F0h7TtFA3gkZCve5UmAibBnoBCFaIVWQyVq+VO9iqDm3DeXsK2pepvgIvpSID8Poy+uwN7T95mivAsHG5p7MtgN9KwQzNW3Iu+BfO9FlPBMngSk8L29So2CIXe6lEsXSGEi5Yrgyo6hZi6IkGCXwIQ7TCEMnlQEGyKnnAVik', 222 data: 'xI3WXddQLFtLVzxJaZWQaw8wAgSuXLjLnyoNXnFuLecTH0BzU36PatglVh2HK3LM8aDLzzbHILdlLNnJ9CY+YnhmGh8hswF9oKTgq0Wsesgdc20QhSMNFFjmMljY1LSXmcAYK04Q5mIzi6Pe/04DRdj+e4zbe5QI4vEBhp/ohEpxZnNqc4BoX6J0eVf6LA1pwrKWvxzMxorWsJrrr+mn3svdlF437n+MMr89k5sQJogufes2GZ9tTvVZ4247ITxXqxgAhwXtbuIs/A5UqqnNdsxlHfpLKG5KjxB6F0h7TtFA3gkZCve5UmAibBnoBCFaIVWQyVq+VO9iqDm3DeXsK2pepvgIvpSID8Poy+uwN7T95mivAsHG5p7MtgN9KwQzNW3Iu+BfO9FlPBMngSk8L29So2CIXe6lEsXSGEi5Yrgyo6hZi6IkGCXwIQ7TCEMnlQEGyKnnAVik',
226 version: '0.2', 223 version: '0.2',
227 creationDate: 'Tue Apr 17 19:17:52 CEST 2007', 224 creationDate: 'Tue Apr 17 19:17:52 CEST 2007',
228 updateDate: 'Tue Apr 17 19:17:52 CEST 2007', 225 updateDate: 'Tue Apr 17 19:17:52 CEST 2007',
229 accessDate: 'Mon Jan 19 16:09:25 CET 2009' 226 accessDate: 'Mon Jan 19 16:09:25 CET 2009'
230 }, 227 },
231 '9588b523f39cdfc14efa1e15ea7716c2d8eac45d8efd7bfeb19d716f9df72d66': { 228 '9588b523f39cdfc14efa1e15ea7716c2d8eac45d8efd7bfeb19d716f9df72d66': {
232 header: '####', 229 header: '####',
233 data: 'q6DKkxhgDFs1XkqOYf6dvojPF+yhJbniTLFpSOS+I1sum3EZIJfYxJXyi2Jx3KOVNBMILw1+vrSLe/fh5SSWj8ZBoeppkPPLjyRNdiUyd4IfcRM5OSv2YcTxCubKCH2kIMFAzY/29A6ZGPG+AN8/kxkEHc1fxKaNcj2Cs8qejNR8yK1iKT1Ut9VfEee+Eqy2Ohgdq8wL/xAD5mUzdqHeQl8BY16pXGIYncLxMzR+EJ8E5jJTuGv3O41UbO31lvBSfCt2pfz2MrtsuqNoI8LBHJkcR6t17Bj+rHZUniHlyxSW/1rQJ1NnwpPgUJ1fhfQJZM8Faoif+0bvWFY4xWs/tCCD7oEvf0xM0I3FfcJLbYX8M+wyO08t9BmGdEjnr3VUcuS9qKaJRpdpMP7aQf+vJvioeQDXdOJ6Ceo3BDFc6JdNta1Qc+agGzN2KPbIPrLDL+08hWl61yu3GQ==', 230 data: 'q6DKkxhgDFs1XkqOYf6dvojPF+yhJbniTLFpSOS+I1sum3EZIJfYxJXyi2Jx3KOVNBMILw1+vrSLe/fh5SSWj8ZBoeppkPPLjyRNdiUyd4IfcRM5OSv2YcTxCubKCH2kIMFAzY/29A6ZGPG+AN8/kxkEHc1fxKaNcj2Cs8qejNR8yK1iKT1Ut9VfEee+Eqy2Ohgdq8wL/xAD5mUzdqHeQl8BY16pXGIYncLxMzR+EJ8E5jJTuGv3O41UbO31lvBSfCt2pfz2MrtsuqNoI8LBHJkcR6t17Bj+rHZUniHlyxSW/1rQJ1NnwpPgUJ1fhfQJZM8Faoif+0bvWFY4xWs/tCCD7oEvf0xM0I3FfcJLbYX8M+wyO08t9BmGdEjnr3VUcuS9qKaJRpdpMP7aQf+vJvioeQDXdOJ6Ceo3BDFc6JdNta1Qc+agGzN2KPbIPrLDL+08hWl61yu3GQ==',
234 version: '0.2', 231 version: '0.2',
235 creationDate: 'Wed Mar 14 15:27:35 CET 2007', 232 creationDate: 'Wed Mar 14 15:27:35 CET 2007',
236 updateDate: 'Wed Mar 14 15:27:35 CET 2007', 233 updateDate: 'Wed Mar 14 15:27:35 CET 2007',
237 accessDate: 'Wed Mar 14 15:27:35 CET 2007' 234 accessDate: 'Wed Mar 14 15:27:35 CET 2007'
238 }, 235 },
239 'e5b71df0d4d79a195c7ec3288dd7738069837a7c4da3bccc1ebc05d8e4f19d79': { 236 'e5b71df0d4d79a195c7ec3288dd7738069837a7c4da3bccc1ebc05d8e4f19d79': {
240 header: '####', 237 header: '####',
241 data: '1NvK9Y5r0Q880BfB1W5IqdOR77mmqQU0d1GL1XUeQT75R2EgYE9rK1X1jLygCXboPhxzegEe7TDhUsn5XcHN0LkXcLYz8gD/7+He2HiTFxoHd2oQbI3ceBxDJ7+5kWA6Aiqy42QSCuA+TWIQcDVthSyFU7nNdqNxeBYeXiI4jgwcH3xvm0+pBf1OYLtywjUK1JwntP6o68b1LMQJFinDG+sqRcm25ggaZyxDtoLh1IBdSpmXk0papRnyyTGNgsws78dLxnH0Iqxb7FhqYfgLDIvN3i7+IALI0lF0EuTS0hSPlr/1fTz1/6bVt++wI9GpUsrdafUJJMPerXoCK+gAP8EMneLq4f5487HIkwWh1qON6Hvpg+tB95NOSJpqE72VpVxN4+wTQWyDMhfjqXBuQ1wKvTsD/mUsdinU0Wb/YT/zIWBNZPdqur0rjOC+mrOtSdlYSCH89Jj2', 238 data: '1NvK9Y5r0Q880BfB1W5IqdOR77mmqQU0d1GL1XUeQT75R2EgYE9rK1X1jLygCXboPhxzegEe7TDhUsn5XcHN0LkXcLYz8gD/7+He2HiTFxoHd2oQbI3ceBxDJ7+5kWA6Aiqy42QSCuA+TWIQcDVthSyFU7nNdqNxeBYeXiI4jgwcH3xvm0+pBf1OYLtywjUK1JwntP6o68b1LMQJFinDG+sqRcm25ggaZyxDtoLh1IBdSpmXk0papRnyyTGNgsws78dLxnH0Iqxb7FhqYfgLDIvN3i7+IALI0lF0EuTS0hSPlr/1fTz1/6bVt++wI9GpUsrdafUJJMPerXoCK+gAP8EMneLq4f5487HIkwWh1qON6Hvpg+tB95NOSJpqE72VpVxN4+wTQWyDMhfjqXBuQ1wKvTsD/mUsdinU0Wb/YT/zIWBNZPdqur0rjOC+mrOtSdlYSCH89Jj2',
242 version: '0.2', 239 version: '0.2',
243 creationDate: 'Tue Apr 17 19:15:09 CEST 2007', 240 creationDate: 'Tue Apr 17 19:15:09 CEST 2007',
244 updateDate: 'Tue Apr 17 19:15:09 CEST 2007', 241 updateDate: 'Tue Apr 17 19:15:09 CEST 2007',
245 accessDate: 'Tue Apr 17 19:17:01 CEST 2007' 242 accessDate: 'Tue Apr 17 19:17:01 CEST 2007'
246 } 243 }
247 } 244 }
248 }, 245 },
249 '36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113': { 246 '36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113': {
250 data: '6fhueIibbxKRA7Mtb9TPcWiUKajnikM3D7PbOROBkE39Vw9E/nG8KrtJlwwPQeOGCFhssO/KX3ymYehCR8rfaEL1f9pfdh5x69mSxKRlOmtEknWqUgPzcb1yPenRbQagERadh0LF4zu91M4WjXK9qynEHoxI/pBhwQb1IsnhwtXl4ELtajudv+2Hv3p75v4XOXFsGQMsHPY+Zw7dkFFA8EXhvuxjiGvnxCUkFwNICFRdHTEovkW3VSerLdrYo5lDgjY6ebr/g7wDGuu4RLfUK4+HpzFwZ0+aOrjpFq2ePg2xObvkkMNNjZ2PcR6Cue0sf+aNqzIHIlFPpY2Hmrob8+bwxocKA6aagBu7z5GiUmZNXGE/Vtr/WWBV2+xIJyzXZPet0MLmSnGiALjPJveeKnnFdDtA929ydcAb8efc0/snfU/uDoXDiO5SWEQ8DDNjj1bSo7VPTtvZyFormE1KjqimqSwaUJzbIS4CxPnoDezaBtQmlG4z8mc8jXq1HfPu7s9PUzcbG30gbF0ch2pDj4h47AhE0ZoeiV+VYZTaYateSifQXKBQKjPcuh9PQyDI0HVua3itbbwxXpRubEM4fbvlcd+7gu+Zq03slYICD07fP0I6XGrRHVTfYpDbEb4GJBvRIeZLwRTQzOeFbPLpBU9Lv3zXxfHfcHy9oK+giIxefPdY1ZR2ZFPKOO0xYJsTr0vmTuXeXzy56bKl+yP2lFst5l9QG8j2JcQEotDV1KQS6mbcLjfIpEnltu5fc2t10Q25Noh+F3kF+LcMIYsDjwanojYlOC93mZl01hmSJdimRTk9otjlRTyC7NWwiyy7fe5IyVi7ACNPZyeUYJUPtKWcPbT73Vtf8W3/+HdhmyYNyMQ9PDCBb9WKMon+qW2+ZVH5yv/KqMHRY1fflAfxpHNhrCkwqcAAGw+G/cetbvQjpkfVT2/u/uLupMsITN2Tgvr/8D2IMm3cyDBUCshrp0AfzARRygHFK4x/0uLfCtQSNjw6zMK8mn80R5aS5bZi5gRS8JBMZ4Q0iG4kBlLpIYtsXSBwl8faljjdl/4XvNNWWrdGJn2k0eM4cESlOFFk4s3Yu0Zspo17nKAHINjHAiP3VlhuKSnk5C9hMU5i3vZO8anQmx9UEwUgQVm22azCjyNtUl6jVPYSNsal7A==', 247 data: '6fhueIibbxKRA7Mtb9TPcWiUKajnikM3D7PbOROBkE39Vw9E/nG8KrtJlwwPQeOGCFhssO/KX3ymYehCR8rfaEL1f9pfdh5x69mSxKRlOmtEknWqUgPzcb1yPenRbQagERadh0LF4zu91M4WjXK9qynEHoxI/pBhwQb1IsnhwtXl4ELtajudv+2Hv3p75v4XOXFsGQMsHPY+Zw7dkFFA8EXhvuxjiGvnxCUkFwNICFRdHTEovkW3VSerLdrYo5lDgjY6ebr/g7wDGuu4RLfUK4+HpzFwZ0+aOrjpFq2ePg2xObvkkMNNjZ2PcR6Cue0sf+aNqzIHIlFPpY2Hmrob8+bwxocKA6aagBu7z5GiUmZNXGE/Vtr/WWBV2+xIJyzXZPet0MLmSnGiALjPJveeKnnFdDtA929ydcAb8efc0/snfU/uDoXDiO5SWEQ8DDNjj1bSo7VPTtvZyFormE1KjqimqSwaUJzbIS4CxPnoDezaBtQmlG4z8mc8jXq1HfPu7s9PUzcbG30gbF0ch2pDj4h47AhE0ZoeiV+VYZTaYateSifQXKBQKjPcuh9PQyDI0HVua3itbbwxXpRubEM4fbvlcd+7gu+Zq03slYICD07fP0I6XGrRHVTfYpDbEb4GJBvRIeZLwRTQzOeFbPLpBU9Lv3zXxfHfcHy9oK+giIxefPdY1ZR2ZFPKOO0xYJsTr0vmTuXeXzy56bKl+yP2lFst5l9QG8j2JcQEotDV1KQS6mbcLjfIpEnltu5fc2t10Q25Noh+F3kF+LcMIYsDjwanojYlOC93mZl01hmSJdimRTk9otjlRTyC7NWwiyy7fe5IyVi7ACNPZyeUYJUPtKWcPbT73Vtf8W3/+HdhmyYNyMQ9PDCBb9WKMon+qW2+ZVH5yv/KqMHRY1fflAfxpHNhrCkwqcAAGw+G/cetbvQjpkfVT2/u/uLupMsITN2Tgvr/8D2IMm3cyDBUCshrp0AfzARRygHFK4x/0uLfCtQSNjw6zMK8mn80R5aS5bZi5gRS8JBMZ4Q0iG4kBlLpIYtsXSBwl8faljjdl/4XvNNWWrdGJn2k0eM4cESlOFFk4s3Yu0Zspo17nKAHINjHAiP3VlhuKSnk5C9hMU5i3vZO8anQmx9UEwUgQVm22azCjyNtUl6jVPYSNsal7A==',
251 version: '0.3', 248 version: '0.3',
252 creationDate: 'Wed Mar 14 18:39:35 CET 2007', 249 creationDate: 'Wed Mar 14 18:39:35 CET 2007',
253 updateDate: 'Mon Oct 27 09:16:14 CET 2008', 250 updateDate: 'Mon Oct 27 09:16:14 CET 2008',
254 accessDate: 'Mon Jan 19 16:09:35 CET 2009', 251 accessDate: 'Mon Jan 19 16:09:35 CET 2009',
255 currentVersion: 'a96a6d8b9ac73fcdf874d8a8534ffb2d43da8f5222e96a4a29bd2ae437619463', 252 currentVersion: 'a96a6d8b9ac73fcdf874d8a8534ffb2d43da8f5222e96a4a29bd2ae437619463',
256 versions: { 253 versions: {
257 '381201fd3b67549bd6630841e8902be1499f3ff0c3514dd464ad9679f22f3561': { 254 '381201fd3b67549bd6630841e8902be1499f3ff0c3514dd464ad9679f22f3561': {
258 header: '####', 255 header: '####',
259 data: 'DgjIW4YcJAYnckuEUzBFkfEC841LuanGopPgp+YkyMn3xuzdpGq/ObLFMVQaeAuyErh1B0REHPbq0E/SRUZbeXLXWN720GU4GXvY5bnen2h7pHvl/H4yz+kvyKh3EHJmmBjuz8s0kclFJQB48lter+G93TEmUaFke9c9m0IkKlgzwZ/PQKZyIyfZA09KFaozdSxdFRbswZj2Vq8Df2PQsKLapZWX1wYQ3lXOcyvNdTULy9MCXwPwX6te6hTLWxQOiSPsvB8LItlhQUsSbrJcJEvWPlBupPu5SeI25zDnqKDETPep63Ks2GWf45nXZzYYmQMzL0l2cenYFxlE18TcOd1Ms24TQ/iDKMhi60zZoo13qjVT5AKZ80KNu46t08qbACxjv/LeK2aM5TNycTFixGskPywpnb6MCo8ibRe5rs1WcTJRMD04sNoiuriivO2fiyo4rxjfdyfueMlOz+Zeztk=', 256 data: 'DgjIW4YcJAYnckuEUzBFkfEC841LuanGopPgp+YkyMn3xuzdpGq/ObLFMVQaeAuyErh1B0REHPbq0E/SRUZbeXLXWN720GU4GXvY5bnen2h7pHvl/H4yz+kvyKh3EHJmmBjuz8s0kclFJQB48lter+G93TEmUaFke9c9m0IkKlgzwZ/PQKZyIyfZA09KFaozdSxdFRbswZj2Vq8Df2PQsKLapZWX1wYQ3lXOcyvNdTULy9MCXwPwX6te6hTLWxQOiSPsvB8LItlhQUsSbrJcJEvWPlBupPu5SeI25zDnqKDETPep63Ks2GWf45nXZzYYmQMzL0l2cenYFxlE18TcOd1Ms24TQ/iDKMhi60zZoo13qjVT5AKZ80KNu46t08qbACxjv/LeK2aM5TNycTFixGskPywpnb6MCo8ibRe5rs1WcTJRMD04sNoiuriivO2fiyo4rxjfdyfueMlOz+Zeztk=',
260 version: '0.2', 257 version: '0.2',
261 creationDate: 'Wed Mar 14 18:39:55 CET 2007', 258 creationDate: 'Wed Mar 14 18:39:55 CET 2007',
262 updateDate: 'Wed Mar 14 18:39:55 CET 2007', 259 updateDate: 'Wed Mar 14 18:39:55 CET 2007',
263 accessDate: 'Mon Oct 27 09:07:56 CET 2008' 260 accessDate: 'Mon Oct 27 09:07:56 CET 2008'
264 }, 261 },
265 '99dc86ebeb20a3db0c5393d6d94bc1150187b04316a876970dbbcf517b55d6f2': { 262 '99dc86ebeb20a3db0c5393d6d94bc1150187b04316a876970dbbcf517b55d6f2': {
266 header: '####', 263 header: '####',
267 data: 'AJwqCWNKC9z8DC4TUI0hWnqHvQ40Y/x+jXylnVAkyO2QYQcqg51odLFSfgP0GiGEGPYwDc+kUxRrfO+ITgTNm+hHi2iIWkP/ljAC+AQ56MAEKsU/USTbvl6ShZ0XTAdRpwI/oqqOhYThVs6jTm/J8+lx4tWoMtNj835py88c/9eW26pLQubr7VysLSWuIMi+iDp7zXZZz/0gxGKDe5xNq4MGIYw8/OK1iJCOsjBdrRygLlS/Mz9sRlKkwdrDsohtRG0F/NdsIoaU4FttGs/rY91SCedvHy6ovh0zXhxOO44O6MiMbP085D1jCjWJn9S1RBxjxc368MGfMJeZja87nuvgSnLS2tGDL6zFtVJMNcH/7GqQPXZv/sNEykDNWpypchCnwYUJxvBVb45FcUzagPm+SSiekWK1hrEntZkZuEhQZp7Ud9RcENpa5h7wXUJSV1vPl8xBylx9HWmxez7D9OYRqbOlCRAEDqup4ahNhYB9', 264 data: 'AJwqCWNKC9z8DC4TUI0hWnqHvQ40Y/x+jXylnVAkyO2QYQcqg51odLFSfgP0GiGEGPYwDc+kUxRrfO+ITgTNm+hHi2iIWkP/ljAC+AQ56MAEKsU/USTbvl6ShZ0XTAdRpwI/oqqOhYThVs6jTm/J8+lx4tWoMtNj835py88c/9eW26pLQubr7VysLSWuIMi+iDp7zXZZz/0gxGKDe5xNq4MGIYw8/OK1iJCOsjBdrRygLlS/Mz9sRlKkwdrDsohtRG0F/NdsIoaU4FttGs/rY91SCedvHy6ovh0zXhxOO44O6MiMbP085D1jCjWJn9S1RBxjxc368MGfMJeZja87nuvgSnLS2tGDL6zFtVJMNcH/7GqQPXZv/sNEykDNWpypchCnwYUJxvBVb45FcUzagPm+SSiekWK1hrEntZkZuEhQZp7Ud9RcENpa5h7wXUJSV1vPl8xBylx9HWmxez7D9OYRqbOlCRAEDqup4ahNhYB9',
268 version: '0.3', 265 version: '0.3',
269 creationDate: 'Mon Oct 27 09:09:11 CET 2008', 266 creationDate: 'Mon Oct 27 09:09:11 CET 2008',
270 updateDate: 'Mon Oct 27 09:09:11 CET 2008', 267 updateDate: 'Mon Oct 27 09:09:11 CET 2008',
271 accessDate: 'Mon Oct 27 09:15:58 CET 2008' 268 accessDate: 'Mon Oct 27 09:15:58 CET 2008'
272 }, 269 },
273 '9fbfcd3e7fe30d549a813f0e6c1be58ed45c3ae7305d7367bffefa097b424ee6': { 270 '9fbfcd3e7fe30d549a813f0e6c1be58ed45c3ae7305d7367bffefa097b424ee6': {
274 header: '####', 271 header: '####',
275 data: 'nZ+Lc5LWWLxnPvUrRrHhxG35PHq7GMbVENHfV1oS0Qw7/63NecssNoEbiOwFVMjAshvfUK7IjnzyvfQhNtFRbj2yzHOTWCd0eJ0O0MmvGzjpUntSDu9/G8RFeEu9jDKugwi/NhOa5legjT9pcsEAqR4s4NN/Ac6juQb6D/Z6Wd6wO0JQhT5/QPk1KllDpDeo2i/GPUKvEi/dXpik0KQcVLVylU82rf6hwEgvRQi+j0O5hnFW1E4ttxClrnPBEBv60jkNwcIpD0r+rvomDe8+398xUuB4DVDJoM+WUYfu6Sm3qI0yBfET+tJvjn8WsHhKTgZpOc2BXC7EdF99nNEg6kV5pSxV6AUA1XUz5kW+YfcSzAXzUH74OqroC0SucHe4+BtRKnbJy4h5vRfjTD+FJaj1Va02cxSR55tQhxm/k67z0QeyB98dnU1l/pPHwBlIWa1eR74gswNSeQ2jrzu5JeQ=', 272 data: 'nZ+Lc5LWWLxnPvUrRrHhxG35PHq7GMbVENHfV1oS0Qw7/63NecssNoEbiOwFVMjAshvfUK7IjnzyvfQhNtFRbj2yzHOTWCd0eJ0O0MmvGzjpUntSDu9/G8RFeEu9jDKugwi/NhOa5legjT9pcsEAqR4s4NN/Ac6juQb6D/Z6Wd6wO0JQhT5/QPk1KllDpDeo2i/GPUKvEi/dXpik0KQcVLVylU82rf6hwEgvRQi+j0O5hnFW1E4ttxClrnPBEBv60jkNwcIpD0r+rvomDe8+398xUuB4DVDJoM+WUYfu6Sm3qI0yBfET+tJvjn8WsHhKTgZpOc2BXC7EdF99nNEg6kV5pSxV6AUA1XUz5kW+YfcSzAXzUH74OqroC0SucHe4+BtRKnbJy4h5vRfjTD+FJaj1Va02cxSR55tQhxm/k67z0QeyB98dnU1l/pPHwBlIWa1eR74gswNSeQ2jrzu5JeQ=',
276 version: '0.2', 273 version: '0.2',
277 creationDate: 'Wed Mar 14 18:39:35 CET 2007', 274 creationDate: 'Wed Mar 14 18:39:35 CET 2007',
278 updateDate: 'Wed Mar 14 18:39:35 CET 2007', 275 updateDate: 'Wed Mar 14 18:39:35 CET 2007',
279 accessDate: 'Wed Mar 14 18:39:35 CET 2007' 276 accessDate: 'Wed Mar 14 18:39:35 CET 2007'
280 }, 277 },
281 'a96a6d8b9ac73fcdf874d8a8534ffb2d43da8f5222e96a4a29bd2ae437619463': { 278 'a96a6d8b9ac73fcdf874d8a8534ffb2d43da8f5222e96a4a29bd2ae437619463': {
282 header: '####', 279 header: '####',
283 data: 'm3yhZu81UAjCY6U2Knrgg8mK+LX35Y/iZgIEm8MuRDAlg6UUz9Z1Anu63COFV08YyYQRuBzTgR9YQ8wrUD1S9FG2ZmtCDemqvd+5OUMgdn4sK7G3CuzAc5osOa5neU2m4y19WuobkGnhO78ko7pVVjO42q0DeMT92uFL6KE/2UCkWlq5SdFyS5qXEJEWs2IO5C8nVpdlO/eZ36Pl2+v+afl3QQMTthCVIUR4/zVP2ajbO48yjDXhYxzskFjtXMYLApEn0wO0dcifcsYhPkozz6Locrt/R6IZXnfZfuW5XXHbqhutoJFPK6L6t0Ib3B2r1TNkPaMsVs2g5V1g3ENRd0IlbG/uBk2o5tgeu6gOYlA1scEiL+/ad9ZxiqYB2ENCGZ8DXA4VNMnzxVPbO96OIUCb9suV0fldGOg=', 280 data: 'm3yhZu81UAjCY6U2Knrgg8mK+LX35Y/iZgIEm8MuRDAlg6UUz9Z1Anu63COFV08YyYQRuBzTgR9YQ8wrUD1S9FG2ZmtCDemqvd+5OUMgdn4sK7G3CuzAc5osOa5neU2m4y19WuobkGnhO78ko7pVVjO42q0DeMT92uFL6KE/2UCkWlq5SdFyS5qXEJEWs2IO5C8nVpdlO/eZ36Pl2+v+afl3QQMTthCVIUR4/zVP2ajbO48yjDXhYxzskFjtXMYLApEn0wO0dcifcsYhPkozz6Locrt/R6IZXnfZfuW5XXHbqhutoJFPK6L6t0Ib3B2r1TNkPaMsVs2g5V1g3ENRd0IlbG/uBk2o5tgeu6gOYlA1scEiL+/ad9ZxiqYB2ENCGZ8DXA4VNMnzxVPbO96OIUCb9suV0fldGOg=',
284 version: '0.3', 281 version: '0.3',
285 creationDate: 'Mon Oct 27 09:16:14 CET 2008', 282 creationDate: 'Mon Oct 27 09:16:14 CET 2008',
286 updateDate: 'Mon Oct 27 09:16:14 CET 2008', 283 updateDate: 'Mon Oct 27 09:16:14 CET 2008',
287 accessDate: 'Mon Jan 19 16:09:35 CET 2009' 284 accessDate: 'Mon Jan 19 16:09:35 CET 2009'
288 } 285 }
289 } 286 }
290 }, 287 },
291 '507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a': { 288 '507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a': {
292 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', 289 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',
293 version: '0.2', 290 version: '0.2',
294 creationDate: 'Wed Mar 14 16:01:24 CET 2007', 291 creationDate: 'Wed Mar 14 16:01:24 CET 2007',
295 updateDate: 'Wed Mar 14 16:01:24 CET 2007', 292 updateDate: 'Wed Mar 14 16:01:24 CET 2007',
296 accessDate: 'Mon Jan 19 16:10:11 CET 2009', 293 accessDate: 'Mon Jan 19 16:10:11 CET 2009',
297 currentVersion: '395eb58606138588dcd7e659065db48775610cc1e90cbd03368c063e02e55c8b', 294 currentVersion: '395eb58606138588dcd7e659065db48775610cc1e90cbd03368c063e02e55c8b',
298 versions: { 295 versions: {
299 '395eb58606138588dcd7e659065db48775610cc1e90cbd03368c063e02e55c8b': { 296 '395eb58606138588dcd7e659065db48775610cc1e90cbd03368c063e02e55c8b': {
300 header: '####', 297 header: '####',
301 data: 'sgq3FGcsnlbhTLetMa3TQQE6uFZv/JL6Awha1066IimKoAtQGbAr6E1+mxRmvJle91sL7oRfi6suvDanYHfAI+rrG6qCOtESn70ssS+aGFyO3XwFgypzG/Qa34bjxJ16Aqd93H8IdhzdtOxs2Qmou3CjyxbT7Cq+YW/fAo1WfctL4yE4GBNPWC5lfebxSmINlBY+zTjhv9Pf2aK6vL4p3obHl+zhz0YdKAMBwbDyCLa9tYvhGBnq/W6lFUsyZCPVJJP3bQCQww0TNCcLJLm+SYVSiC0NwCQJq+yNqDkWTvv41p5EDB06eOQ2VqC7l4i/JLE/ql9h9Z++gck74/Qs3ppdVdG7sTzWyPya4v3RW2OTc1awFRZipAX5Zd7I97dyw6Yym4y+/9UT8z8iMDYykQ4+QnOhksDIE9a8q6agDF/rbZ/BCRcMWbFylGTdudk26mu0GdPiuLDu', 298 data: 'sgq3FGcsnlbhTLetMa3TQQE6uFZv/JL6Awha1066IimKoAtQGbAr6E1+mxRmvJle91sL7oRfi6suvDanYHfAI+rrG6qCOtESn70ssS+aGFyO3XwFgypzG/Qa34bjxJ16Aqd93H8IdhzdtOxs2Qmou3CjyxbT7Cq+YW/fAo1WfctL4yE4GBNPWC5lfebxSmINlBY+zTjhv9Pf2aK6vL4p3obHl+zhz0YdKAMBwbDyCLa9tYvhGBnq/W6lFUsyZCPVJJP3bQCQww0TNCcLJLm+SYVSiC0NwCQJq+yNqDkWTvv41p5EDB06eOQ2VqC7l4i/JLE/ql9h9Z++gck74/Qs3ppdVdG7sTzWyPya4v3RW2OTc1awFRZipAX5Zd7I97dyw6Yym4y+/9UT8z8iMDYykQ4+QnOhksDIE9a8q6agDF/rbZ/BCRcMWbFylGTdudk26mu0GdPiuLDu',
302 version: '0.2', 299 version: '0.2',
303 creationDate: 'Wed Mar 14 16:01:24 CET 2007', 300 creationDate: 'Wed Mar 14 16:01:24 CET 2007',
304 updateDate: 'Wed Mar 14 16:01:24 CET 2007', 301 updateDate: 'Wed Mar 14 16:01:24 CET 2007',
305 accessDate: 'Mon Jan 19 16:10:11 CET 2009' 302 accessDate: 'Mon Jan 19 16:10:11 CET 2009'
306 } 303 }
307 } 304 }
308 }, 305 },
309 '5cdac63b317f3942da38f3a3de3b7f0e5d6678200951c6216230295550f63fb4': { 306 '5cdac63b317f3942da38f3a3de3b7f0e5d6678200951c6216230295550f63fb4': {
310 data: 'Xs+z3VzIqsWa7dGBqepwq75lTsx3yemNhTdRYYDDc3Kzpycyp961SgnKXHjE51266mfmj85ASFi/FKCOwk17lbD5UT3iawtc3TdgrQ18vBhBsmOA2F4JAa4yC58bTaXbyld3c4izDp7i9+iyRaFN52NWJznN82SXuRtPdWRtAxXB1V5Tyg==', 307 data: 'Xs+z3VzIqsWa7dGBqepwq75lTsx3yemNhTdRYYDDc3Kzpycyp961SgnKXHjE51266mfmj85ASFi/FKCOwk17lbD5UT3iawtc3TdgrQ18vBhBsmOA2F4JAa4yC58bTaXbyld3c4izDp7i9+iyRaFN52NWJznN82SXuRtPdWRtAxXB1V5Tyg==',
311 version: '0.3', 308 version: '0.3',
312 creationDate: 'Mon Jan 05 17:45:25 CET 2009', 309 creationDate: 'Mon Jan 05 17:45:25 CET 2009',
313 updateDate: 'Mon Jan 05 17:45:25 CET 2009', 310 updateDate: 'Mon Jan 05 17:45:25 CET 2009',
314 accessDate: 'Mon Jan 19 16:10:21 CET 2009', 311 accessDate: 'Mon Jan 19 16:10:21 CET 2009',
315 currentVersion: '00b3a4cd7400cfc1e7f7b369bdc3dcdaa50d6020233e131b30d755c89249ea9d', 312 currentVersion: '00b3a4cd7400cfc1e7f7b369bdc3dcdaa50d6020233e131b30d755c89249ea9d',
316 versions: { 313 versions: {
317 '00b3a4cd7400cfc1e7f7b369bdc3dcdaa50d6020233e131b30d755c89249ea9d': { 314 '00b3a4cd7400cfc1e7f7b369bdc3dcdaa50d6020233e131b30d755c89249ea9d': {
318 header: '####', 315 header: '####',
319 data: 'uGAV9pZTjrTwBy24TX/OUQwGmgzTnXv1JBIxdGkeoLCUhP9tAjbpUVylrUI5+VRrFYkXYyZ0o2HEgKrun2f3PODTxlmAbfkUldOV5tyV/EUxN0vYSBtgsMpqQm3bOKRIAo/uzrhSE3iwMjvKOTH2jUrkmX6hmqhXWZfa4X231GovrnOjek8c7t+LUBmmIjXEr2GSc/UbBoFnni+Q7ZArwtU68xoeCjLame1e8Y9wvCO8gIfAzXQAHsDgzn1MVeiWIqiCBTs8YKCO1yaxZpkzXV0yWzX+bHyXlKWwAk7Fu9w0CuaRULZmRCQhv+MMDw8DEXciTm0R5dRiVmSCFBy8cL9qlSeSX0GlnKl8E4/TSqvhMJblwJJsgmGSZ9cEt2u0E08tHxKuoeaaT1rpAOoiqx+z7BdhqjWOQZOGM4gR3EwqvOQoNYFUaXjAdmiUzW+e+TgE1IBQ8udRFl/D2zCcqFO90Hgc7hHsTDI3aGYvi6bHADu8hFpmZtJAjOMv1JgCX4Hm4n+SsbHd0DIfkEUMeGlVO47lcGWBZNRRm7xl8luZ4sZn', 316 data: 'uGAV9pZTjrTwBy24TX/OUQwGmgzTnXv1JBIxdGkeoLCUhP9tAjbpUVylrUI5+VRrFYkXYyZ0o2HEgKrun2f3PODTxlmAbfkUldOV5tyV/EUxN0vYSBtgsMpqQm3bOKRIAo/uzrhSE3iwMjvKOTH2jUrkmX6hmqhXWZfa4X231GovrnOjek8c7t+LUBmmIjXEr2GSc/UbBoFnni+Q7ZArwtU68xoeCjLame1e8Y9wvCO8gIfAzXQAHsDgzn1MVeiWIqiCBTs8YKCO1yaxZpkzXV0yWzX+bHyXlKWwAk7Fu9w0CuaRULZmRCQhv+MMDw8DEXciTm0R5dRiVmSCFBy8cL9qlSeSX0GlnKl8E4/TSqvhMJblwJJsgmGSZ9cEt2u0E08tHxKuoeaaT1rpAOoiqx+z7BdhqjWOQZOGM4gR3EwqvOQoNYFUaXjAdmiUzW+e+TgE1IBQ8udRFl/D2zCcqFO90Hgc7hHsTDI3aGYvi6bHADu8hFpmZtJAjOMv1JgCX4Hm4n+SsbHd0DIfkEUMeGlVO47lcGWBZNRRm7xl8luZ4sZn',
320 version: '0.3', 317 version: '0.3',
321 creationDate: 'Mon Jan 05 17:45:25 CET 2009', 318 creationDate: 'Mon Jan 05 17:45:25 CET 2009',
322 updateDate: 'Mon Jan 05 17:45:25 CET 2009', 319 updateDate: 'Mon Jan 05 17:45:25 CET 2009',
323 accessDate: 'Mon Jan 19 16:10:21 CET 2009' 320 accessDate: 'Mon Jan 19 16:10:21 CET 2009'
324 } 321 }
325 } 322 }
326 }, 323 },
327 '6026370f3db3860d2c46a08e389a7e906dc14f98c8444b21be9a7e9f405a2728': { 324 '6026370f3db3860d2c46a08e389a7e906dc14f98c8444b21be9a7e9f405a2728': {
328 data: '3oUg1TD+Lu4ou06j/MddOTXDqRM+qSKD+6Iuzia1Hop1w7v/BXidqeoKJZQI2VY9oO9B70Nr3B3wDROF+ycy6Rq+FM/xqUGHKXn1lAaSc6Wgj6TLQ6eRF6YZKSPqTj7TDWyw/2pEWk4HjcT8drTrCaC02tzAXMhYWlYPQPW4fUdq4hawoHIdopUN3vafQuFjY47OhqXKav3bNao=', 325 data: '3oUg1TD+Lu4ou06j/MddOTXDqRM+qSKD+6Iuzia1Hop1w7v/BXidqeoKJZQI2VY9oO9B70Nr3B3wDROF+ycy6Rq+FM/xqUGHKXn1lAaSc6Wgj6TLQ6eRF6YZKSPqTj7TDWyw/2pEWk4HjcT8drTrCaC02tzAXMhYWlYPQPW4fUdq4hawoHIdopUN3vafQuFjY47OhqXKav3bNao=',
329 version: '0.2', 326 version: '0.2',
330 creationDate: 'Tue Apr 17 16:36:08 CEST 2007', 327 creationDate: 'Tue Apr 17 16:36:08 CEST 2007',
331 updateDate: 'Tue Apr 17 16:36:08 CEST 2007', 328 updateDate: 'Tue Apr 17 16:36:08 CEST 2007',
332 accessDate: 'Mon Jan 19 16:09:33 CET 2009', 329 accessDate: 'Mon Jan 19 16:09:33 CET 2009',
333 currentVersion: 'bf8d46022179715d9d27e0a256b56b50828a771c3c6b46fe36fb2982dcb3b4cc', 330 currentVersion: 'bf8d46022179715d9d27e0a256b56b50828a771c3c6b46fe36fb2982dcb3b4cc',
334 versions: { 331 versions: {
335 'bf8d46022179715d9d27e0a256b56b50828a771c3c6b46fe36fb2982dcb3b4cc': { 332 'bf8d46022179715d9d27e0a256b56b50828a771c3c6b46fe36fb2982dcb3b4cc': {
336 header: '####', 333 header: '####',
337 data: 'fehYRMkg/wFj2t/aWu7szbXwrCyCDpjQN4UNck4/OiDlth70a2ve6ow5lAi2jgdlV9WiFrPejfa8dD0Z1g19jx+BBsuUYnBEKD0K+NapdJBBeI0We2nj9nYIij2dfZVx7cuvhy8sN6+DdylUQLsFHbga+Gi5hWcMuULT4GOAIy2WanSQL1RSR4ruA6zm/t+VVboEkkm7PPT+w3LuRl3wRaD4a8ZwYiSV/SzgWooFrh2S3YOUeshdaGCiYpTbXscsOxsCxc11i6wQGBqYSjksmtZDvEegdQdzCmxvq4jaVWJElYYS3av612nD5K/w7Zei6RccBiODBPATjrIczYg7HwmQxIM/6QI9/LQn0LP0yqRVUUtfzaODf0uWNpFzml9l/1lwXuBJyQFBp7H7Th46ekw9yEuPD00oZ+eXvKwbwfUU0JshT4hnEBtIjM8fH974PU0y95f0yLAJ1+M6DVXCxGsBix2aKJx9fuZP4KGpaXg6qCb/6327rph7MGomcrGPIiDjYwD/NTMdGluc55OZfGXtOZUaJCUM6nihqDwU7Ly1ZzYorgcvkX/t/0RNcOkFzGYNByp7mdcotyiHqCDKspqz9mEXAd7Noz3HO5GFpPqbRo7htDigGU1f7dvgbbfRoTz17Bt9Mw==', 334 data: 'fehYRMkg/wFj2t/aWu7szbXwrCyCDpjQN4UNck4/OiDlth70a2ve6ow5lAi2jgdlV9WiFrPejfa8dD0Z1g19jx+BBsuUYnBEKD0K+NapdJBBeI0We2nj9nYIij2dfZVx7cuvhy8sN6+DdylUQLsFHbga+Gi5hWcMuULT4GOAIy2WanSQL1RSR4ruA6zm/t+VVboEkkm7PPT+w3LuRl3wRaD4a8ZwYiSV/SzgWooFrh2S3YOUeshdaGCiYpTbXscsOxsCxc11i6wQGBqYSjksmtZDvEegdQdzCmxvq4jaVWJElYYS3av612nD5K/w7Zei6RccBiODBPATjrIczYg7HwmQxIM/6QI9/LQn0LP0yqRVUUtfzaODf0uWNpFzml9l/1lwXuBJyQFBp7H7Th46ekw9yEuPD00oZ+eXvKwbwfUU0JshT4hnEBtIjM8fH974PU0y95f0yLAJ1+M6DVXCxGsBix2aKJx9fuZP4KGpaXg6qCb/6327rph7MGomcrGPIiDjYwD/NTMdGluc55OZfGXtOZUaJCUM6nihqDwU7Ly1ZzYorgcvkX/t/0RNcOkFzGYNByp7mdcotyiHqCDKspqz9mEXAd7Noz3HO5GFpPqbRo7htDigGU1f7dvgbbfRoTz17Bt9Mw==',
338 version: '0.2', 335 version: '0.2',
339 creationDate: 'Tue Apr 17 16:36:08 CEST 2007', 336 creationDate: 'Tue Apr 17 16:36:08 CEST 2007',
340 updateDate: 'Tue Apr 17 16:36:08 CEST 2007', 337 updateDate: 'Tue Apr 17 16:36:08 CEST 2007',
341 accessDate: 'Mon Jan 19 16:09:33 CET 2009' 338 accessDate: 'Mon Jan 19 16:09:33 CET 2009'
342 } 339 }
343 } 340 }
344 }, 341 },
345 '6c25be8e145efb26a1abd59590522f73fb2e3dbc139af2217074d9e2ba92c16a': { 342 '6c25be8e145efb26a1abd59590522f73fb2e3dbc139af2217074d9e2ba92c16a': {
346 data: 'b2mcYUi59l434kGl7ij6dBu3063UL1dToMIu3Zsa9RV9RzeLKnezJhLKunqoAm7KwiJeqDo/REexHI1cshGYtHasVXXuyJfMx1grH7yhoWnkSRF4Sax6w5E5wnGkEpGJHOxXJ9rOjWHZ7yqCUUCB/dqLw4FwPOtRb/ynkBEYztEJA6EKGJuz0vrrTOsT8HMXtj/w6MEZ7qI3fPs=', 343 data: 'b2mcYUi59l434kGl7ij6dBu3063UL1dToMIu3Zsa9RV9RzeLKnezJhLKunqoAm7KwiJeqDo/REexHI1cshGYtHasVXXuyJfMx1grH7yhoWnkSRF4Sax6w5E5wnGkEpGJHOxXJ9rOjWHZ7yqCUUCB/dqLw4FwPOtRb/ynkBEYztEJA6EKGJuz0vrrTOsT8HMXtj/w6MEZ7qI3fPs=',
347 version: '0.2', 344 version: '0.2',
348 creationDate: 'Mon Apr 02 19:12:44 CEST 2007', 345 creationDate: 'Mon Apr 02 19:12:44 CEST 2007',
349 updateDate: 'Mon Apr 02 19:12:44 CEST 2007', 346 updateDate: 'Mon Apr 02 19:12:44 CEST 2007',
350 accessDate: 'Mon Jan 19 16:10:08 CET 2009', 347 accessDate: 'Mon Jan 19 16:10:08 CET 2009',
351 currentVersion: '2f60193c0fc0e3f2f178955e1c68759675acdf691bcb918cfad329a5a97cfaf3', 348 currentVersion: '2f60193c0fc0e3f2f178955e1c68759675acdf691bcb918cfad329a5a97cfaf3',
352 versions: { 349 versions: {
353 '2f60193c0fc0e3f2f178955e1c68759675acdf691bcb918cfad329a5a97cfaf3': { 350 '2f60193c0fc0e3f2f178955e1c68759675acdf691bcb918cfad329a5a97cfaf3': {
354 header: '####', 351 header: '####',
355 data: 'pZEWSdYIkrX8/r6OYmO0GEuKG9baUgn40Bmw7hXZBd/kfWuRjWsL4/pc5F5Ojrx+N0dxmQn5ZqKAzOOri29Rm4ruxnCbyK+oDsCDyMSnWy/VJcvystnDKzKmBRQVAOSEJtzEb3OtGzvqm0PQ1Dhx1YUAx7L6KlXysmG9h9+MjOcErRL9/1x1LZ33ytR+zK4LvTAb7gN5/9QgwysFyCkNP8bG4nyCzPMiUrBnP0odMTUvDkJDlY0Oia6VjGW6oNxnGIgA5fDraRrW4JH2oejQcrL7+X+jpCp05g==', 352 data: 'pZEWSdYIkrX8/r6OYmO0GEuKG9baUgn40Bmw7hXZBd/kfWuRjWsL4/pc5F5Ojrx+N0dxmQn5ZqKAzOOri29Rm4ruxnCbyK+oDsCDyMSnWy/VJcvystnDKzKmBRQVAOSEJtzEb3OtGzvqm0PQ1Dhx1YUAx7L6KlXysmG9h9+MjOcErRL9/1x1LZ33ytR+zK4LvTAb7gN5/9QgwysFyCkNP8bG4nyCzPMiUrBnP0odMTUvDkJDlY0Oia6VjGW6oNxnGIgA5fDraRrW4JH2oejQcrL7+X+jpCp05g==',
356 version: '0.2', 353 version: '0.2',
357 creationDate: 'Mon Apr 02 19:12:44 CEST 2007', 354 creationDate: 'Mon Apr 02 19:12:44 CEST 2007',
358 updateDate: 'Mon Apr 02 19:12:44 CEST 2007', 355 updateDate: 'Mon Apr 02 19:12:44 CEST 2007',
359 accessDate: 'Mon Jan 19 16:10:08 CET 2009' 356 accessDate: 'Mon Jan 19 16:10:08 CET 2009'
360 } 357 }
361 } 358 }
362 }, 359 },
363 '6d45c2fec275b7482d41c76b20507100cfb6ab49922b876f9dd3040d361f4a18': { 360 '6d45c2fec275b7482d41c76b20507100cfb6ab49922b876f9dd3040d361f4a18': {
364 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==', 361 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==',
365 version: '0.2', 362 version: '0.2',
366 creationDate: 'Wed Mar 14 19:09:05 CET 2007', 363 creationDate: 'Wed Mar 14 19:09:05 CET 2007',
367 updateDate: 'Wed Mar 14 19:09:05 CET 2007', 364 updateDate: 'Wed Mar 14 19:09:05 CET 2007',
368 accessDate: 'Mon Jan 19 16:10:15 CET 2009', 365 accessDate: 'Mon Jan 19 16:10:15 CET 2009',
369 currentVersion: 'e85f085a8ed42d2def7adc796b66a2e0a4c3c88d9f3e785eb12a6f5619d945c5', 366 currentVersion: 'e85f085a8ed42d2def7adc796b66a2e0a4c3c88d9f3e785eb12a6f5619d945c5',
370 versions: { 367 versions: {
371 'e85f085a8ed42d2def7adc796b66a2e0a4c3c88d9f3e785eb12a6f5619d945c5': { 368 'e85f085a8ed42d2def7adc796b66a2e0a4c3c88d9f3e785eb12a6f5619d945c5': {
372 header: '####', 369 header: '####',
373 data: 'BbXNAy0GcKKyDPiwhP1Jk9mIi3uXMHQdhuxpDvoR2C3YITOUBpurxGhhvmCg+a9pS+fKJdZPxL2mPbJj6GfWTEsm7K/ECEjrVkSTHi6PTUUgYVbCumq9EHjUspos+7VrifZry3c73+qAvIKamvUlNB86TchMpOXVJIyx8UgRX+bdhrxk9ZCEVOiLCG1zGPX8IzmcxPmBRZFlHYqE4ibhl/CLEzWXZBYCofTusClhOh7YM/jBgvDt64W7aIN2y2KiKwmFySkFZdnOvbAb34tXVimwqjqWPvPwd6MujQeX1bmaDD7Y0kXac8CJxqasIezLo2WqzLUbEXdIHGilkaPT2ZKpKhKkpHJHFrV2lVuQJVqwPUr0Gf9qMKgVnsyU8kUfq9ox+fhH70+v7BQSjT7bxxDLs0UesQeL7G4SqvNet5hPI4GQEpOY8p5MUFReIBTRm72NQEU=', 370 data: 'BbXNAy0GcKKyDPiwhP1Jk9mIi3uXMHQdhuxpDvoR2C3YITOUBpurxGhhvmCg+a9pS+fKJdZPxL2mPbJj6GfWTEsm7K/ECEjrVkSTHi6PTUUgYVbCumq9EHjUspos+7VrifZry3c73+qAvIKamvUlNB86TchMpOXVJIyx8UgRX+bdhrxk9ZCEVOiLCG1zGPX8IzmcxPmBRZFlHYqE4ibhl/CLEzWXZBYCofTusClhOh7YM/jBgvDt64W7aIN2y2KiKwmFySkFZdnOvbAb34tXVimwqjqWPvPwd6MujQeX1bmaDD7Y0kXac8CJxqasIezLo2WqzLUbEXdIHGilkaPT2ZKpKhKkpHJHFrV2lVuQJVqwPUr0Gf9qMKgVnsyU8kUfq9ox+fhH70+v7BQSjT7bxxDLs0UesQeL7G4SqvNet5hPI4GQEpOY8p5MUFReIBTRm72NQEU=',
374 version: '0.2', 371 version: '0.2',
375 creationDate: 'Wed Mar 14 19:09:05 CET 2007', 372 creationDate: 'Wed Mar 14 19:09:05 CET 2007',
376 updateDate: 'Wed Mar 14 19:09:05 CET 2007', 373 updateDate: 'Wed Mar 14 19:09:05 CET 2007',
377 accessDate: 'Mon Jan 19 16:10:15 CET 2009' 374 accessDate: 'Mon Jan 19 16:10:15 CET 2009'
378 } 375 }
379 } 376 }
380 }, 377 },
381 '7bb69b6366a8012f181c01e368ba18d4f7a82bcabb4959189736ad124c4bbfbb': { 378 '7bb69b6366a8012f181c01e368ba18d4f7a82bcabb4959189736ad124c4bbfbb': {
382 data: 'wYPZIt0UHiNVefNwtGc7z7Lu3YoQrXdfKmWqilZp8yeIrNfSLB9p60DLMrL3GDq/CsvDYkGAZgj1C/6NVnzVsXsJKq7NDZn1UPOGt+hCnw3lEVbD7zHkoMM4VgFDn1sZdjLe8wdpIFfdlQESTipT3GVXv3swG2qX2O2yuwtlopR8yZQTLg==', 379 data: 'wYPZIt0UHiNVefNwtGc7z7Lu3YoQrXdfKmWqilZp8yeIrNfSLB9p60DLMrL3GDq/CsvDYkGAZgj1C/6NVnzVsXsJKq7NDZn1UPOGt+hCnw3lEVbD7zHkoMM4VgFDn1sZdjLe8wdpIFfdlQESTipT3GVXv3swG2qX2O2yuwtlopR8yZQTLg==',
383 version: '0.3', 380 version: '0.3',
384 creationDate: 'Mon Jan 05 17:44:30 CET 2009', 381 creationDate: 'Mon Jan 05 17:44:30 CET 2009',
385 updateDate: 'Mon Jan 05 17:44:30 CET 2009', 382 updateDate: 'Mon Jan 05 17:44:30 CET 2009',
386 accessDate: 'Mon Jan 19 16:10:18 CET 2009', 383 accessDate: 'Mon Jan 19 16:10:18 CET 2009',
387 currentVersion: '23f5fb503e54c0cafe3d4944ddaf40bc74fab8b5d96e2bbddf693b1afb225e5b', 384 currentVersion: '23f5fb503e54c0cafe3d4944ddaf40bc74fab8b5d96e2bbddf693b1afb225e5b',
388 versions: { 385 versions: {
389 '23f5fb503e54c0cafe3d4944ddaf40bc74fab8b5d96e2bbddf693b1afb225e5b': { 386 '23f5fb503e54c0cafe3d4944ddaf40bc74fab8b5d96e2bbddf693b1afb225e5b': {
390 header: '####', 387 header: '####',
391 data: 'IpYj+7t3DhSVD8r9PkLbF5xpGrHhg8omY014P1vkT2KkGDEUj+ekQAbQ1g66Z7oNhRDpjS1/dcDjzH0IIQLjGuQ0oRfL0xZefVTx3N88ZLE39m3cJz10K2xyg3xp06jFBmdNJuCkgRhMzeUXeEJujw4lS2kv7cO04Uh2Maui6jDR7E498rgePY3L32vG1S66li/xU1vPjNn06aFTqSYxUL17/mlJNbgp3XWjGC+l0dXLLfXy1wOm+/I3zp2caTs+a2zDUZ15s+3XeaAWpBH7QCaQsvsQmoBqPbMvkjOQwW3taDvV7Hvkh+qTjCEcLjRFwhZkMNn3N2ewcLWQa2aVIjxt6Z0F4s/1URztWlKVzCfto8RmrLajYRn3ggG12kX2xDJFjNPNfs/7A3tMn+FqXQCCNG5GI06JZ32aQfpnjtmXScUuEs8UeFgsNeYclQhcm5R0sUwISK+D345B8859w+4+9OTY38NgYQQ9o/tmpCjWj1tLYLx/m/GcR2em7iyDpBdcnWUb+tK6Ah89qvXriHwPLSNzhOH2wxmi7nXTRQWMv7g2', 388 data: 'IpYj+7t3DhSVD8r9PkLbF5xpGrHhg8omY014P1vkT2KkGDEUj+ekQAbQ1g66Z7oNhRDpjS1/dcDjzH0IIQLjGuQ0oRfL0xZefVTx3N88ZLE39m3cJz10K2xyg3xp06jFBmdNJuCkgRhMzeUXeEJujw4lS2kv7cO04Uh2Maui6jDR7E498rgePY3L32vG1S66li/xU1vPjNn06aFTqSYxUL17/mlJNbgp3XWjGC+l0dXLLfXy1wOm+/I3zp2caTs+a2zDUZ15s+3XeaAWpBH7QCaQsvsQmoBqPbMvkjOQwW3taDvV7Hvkh+qTjCEcLjRFwhZkMNn3N2ewcLWQa2aVIjxt6Z0F4s/1URztWlKVzCfto8RmrLajYRn3ggG12kX2xDJFjNPNfs/7A3tMn+FqXQCCNG5GI06JZ32aQfpnjtmXScUuEs8UeFgsNeYclQhcm5R0sUwISK+D345B8859w+4+9OTY38NgYQQ9o/tmpCjWj1tLYLx/m/GcR2em7iyDpBdcnWUb+tK6Ah89qvXriHwPLSNzhOH2wxmi7nXTRQWMv7g2',
392 version: '0.3', 389 version: '0.3',
393 creationDate: 'Mon Jan 05 17:44:30 CET 2009', 390 creationDate: 'Mon Jan 05 17:44:30 CET 2009',
394 updateDate: 'Mon Jan 05 17:44:30 CET 2009', 391 updateDate: 'Mon Jan 05 17:44:30 CET 2009',
395 accessDate: 'Mon Jan 19 16:10:18 CET 2009' 392 accessDate: 'Mon Jan 19 16:10:18 CET 2009'
396 } 393 }
397 } 394 }
398 }, 395 },
399 '8b18e8593b5bc2f7ea39a5fab222047034ef2f380fee05be0fa6e1c0972fea39': { 396 '8b18e8593b5bc2f7ea39a5fab222047034ef2f380fee05be0fa6e1c0972fea39': {
400 data: 'pOMTY3PnUAbwMLDEYNJCMzp4iIA42YWr6gqoomg+P40e7LFUtbt/RQRelQwNIztyUSVLl0rilkZZkBUVvxrtTqvibKITCjJQGQIzvcb+Yl4mNosl2Rpp0xxMU03f1+G7eGbuCc5hJXYVAglhEYplaAPzHbRWXMY8iZXZPBuLVf5PN+rdpgAfkGeZ7Uf9RsQ9p/EglrWXYnTwXi3saUfzIjfvSHm5C+dXTY3FHpIc1YkjFrdVgMkhYQGV60JtZcwFtCEL2NpVljAbRgHoIXTOkzUvep4vxrtfBBWWMuAWEI06432gtnH6IQbrR6jOpwuMt7k/09qy/fARPHs3r4qTJ9r2uqWHJ7tjJw+IChQPC+3l5HcPpFURiw8LGAN1NyY1hUrF6N84RSn7AKS0bLa5qN++5lcjjxn/k8+JqmeUqN1/SYIbGwNnJeZ0vA8yvOxnD20iVADX5kOVqJDwXRPLaF6Oz9KkbOrmANCh+PmGw1i6PduB+FgAU4HViYCw5IGOUZ30Pm1NJofqfbhXvgzn7ey2+kUIAwDyOUpJ9fW+9jW/JU4rcawmzwBYN2V8apOoyc3wQJICm2984wIfVBpygCOZM0QDyVgNo57qKtYH3yMDQSkKvpEUmuhklMYhcV+4X5ggdqx7lYXO9IMDnFf2ZDiZyieTlOlRv/nNVecUB177Xpnq2e+X/ik2rCQWVrIymiV6ltr1DEv0krXKfvXGG/FMZHUmo3m+B5bG4xVhmt0GnHseqvY2Vrl9NksLgq3hTDOGSGIy5Nv8kfrd8B4/6Tavh0SumiyXnrTXyYXzCK9E7IqO/0KAln63VkcHsbOtS8mj1drN0YQ2KKaeIW+Yr3Gm0pbcODsgA6aFfz1itZVeovBqUklhXS+/Es8J8xOSvvSyD/TmlFjuErHa+wwNQvftosfwk9ZTt0eIJS5aLHdU2QsCjdfSy0DEPkk2siGhBX5ZhRzqyIAyXApSmy+e7PIqn/dDR51+D1ZHwoTQyTrd+F08jBWZgU/OvS8MRxNZSxQwsi7bcWZG+w0utrIDB8eSOMVBXI5XBeJb4h5Bzut18C1shGHeGkSJp04=', 397 data: 'pOMTY3PnUAbwMLDEYNJCMzp4iIA42YWr6gqoomg+P40e7LFUtbt/RQRelQwNIztyUSVLl0rilkZZkBUVvxrtTqvibKITCjJQGQIzvcb+Yl4mNosl2Rpp0xxMU03f1+G7eGbuCc5hJXYVAglhEYplaAPzHbRWXMY8iZXZPBuLVf5PN+rdpgAfkGeZ7Uf9RsQ9p/EglrWXYnTwXi3saUfzIjfvSHm5C+dXTY3FHpIc1YkjFrdVgMkhYQGV60JtZcwFtCEL2NpVljAbRgHoIXTOkzUvep4vxrtfBBWWMuAWEI06432gtnH6IQbrR6jOpwuMt7k/09qy/fARPHs3r4qTJ9r2uqWHJ7tjJw+IChQPC+3l5HcPpFURiw8LGAN1NyY1hUrF6N84RSn7AKS0bLa5qN++5lcjjxn/k8+JqmeUqN1/SYIbGwNnJeZ0vA8yvOxnD20iVADX5kOVqJDwXRPLaF6Oz9KkbOrmANCh+PmGw1i6PduB+FgAU4HViYCw5IGOUZ30Pm1NJofqfbhXvgzn7ey2+kUIAwDyOUpJ9fW+9jW/JU4rcawmzwBYN2V8apOoyc3wQJICm2984wIfVBpygCOZM0QDyVgNo57qKtYH3yMDQSkKvpEUmuhklMYhcV+4X5ggdqx7lYXO9IMDnFf2ZDiZyieTlOlRv/nNVecUB177Xpnq2e+X/ik2rCQWVrIymiV6ltr1DEv0krXKfvXGG/FMZHUmo3m+B5bG4xVhmt0GnHseqvY2Vrl9NksLgq3hTDOGSGIy5Nv8kfrd8B4/6Tavh0SumiyXnrTXyYXzCK9E7IqO/0KAln63VkcHsbOtS8mj1drN0YQ2KKaeIW+Yr3Gm0pbcODsgA6aFfz1itZVeovBqUklhXS+/Es8J8xOSvvSyD/TmlFjuErHa+wwNQvftosfwk9ZTt0eIJS5aLHdU2QsCjdfSy0DEPkk2siGhBX5ZhRzqyIAyXApSmy+e7PIqn/dDR51+D1ZHwoTQyTrd+F08jBWZgU/OvS8MRxNZSxQwsi7bcWZG+w0utrIDB8eSOMVBXI5XBeJb4h5Bzut18C1shGHeGkSJp04=',
401 version: '0.2', 398 version: '0.2',
402 creationDate: 'Tue May 01 01:10:17 CEST 2007', 399 creationDate: 'Tue May 01 01:10:17 CEST 2007',
403 updateDate: 'Tue May 01 01:13:27 CEST 2007', 400 updateDate: 'Tue May 01 01:13:27 CEST 2007',
404 accessDate: 'Mon Jan 19 16:10:02 CET 2009', 401 accessDate: 'Mon Jan 19 16:10:02 CET 2009',
405 currentVersion: 'd175358ea0b9d32c23e4bceff2020eae9a8459466abc18d4399d988e733fc0f8', 402 currentVersion: 'd175358ea0b9d32c23e4bceff2020eae9a8459466abc18d4399d988e733fc0f8',
406 versions: { 403 versions: {
407 '8a032b53f7356e2d8b28665211abbe2cf1c79fd8eee4752e83cebdced1c19911': { 404 '8a032b53f7356e2d8b28665211abbe2cf1c79fd8eee4752e83cebdced1c19911': {
408 header: '####', 405 header: '####',
diff --git a/frontend/gamma/tests/tests/Components/UnlockPassword/index.html b/frontend/gamma/tests/tests/Components/UnlockPassword/index.html
index 5534068..7a5e95b 100644
--- a/frontend/gamma/tests/tests/Components/UnlockPassword/index.html
+++ b/frontend/gamma/tests/tests/Components/UnlockPassword/index.html
@@ -1,117 +1,114 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27--> 24-->
28 25
29<html> 26<html>
30<head> 27<head>
31 <title>UnlockPassword - test</title> 28 <title>UnlockPassword - test</title>
32 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 29 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
33 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script> 30 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script>
34 31
35 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> 32 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
36 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script> 33 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
37 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 34 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
38 <script type='text/javascript' src='../../../../js/Clipperz/Date.js'></script> 35 <script type='text/javascript' src='../../../../js/Clipperz/Date.js'></script>
39 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script> 36 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script>
40 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 37 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
41 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script> 38 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script> 39 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script>
43 40
44 <script type='text/javascript' src='../../../../js/Clipperz/Signal.js'></script> 41 <script type='text/javascript' src='../../../../js/Clipperz/Signal.js'></script>
45 <script type='text/javascript' src='../../../../js/Clipperz/Style.js'></script> 42 <script type='text/javascript' src='../../../../js/Clipperz/Style.js'></script>
46 <script type='text/javascript' src='../../../../js/Clipperz/Visual.js'></script> 43 <script type='text/javascript' src='../../../../js/Clipperz/Visual.js'></script>
47 <script type='text/javascript' src='../../../../js/Clipperz/Set.js'></script> 44 <script type='text/javascript' src='../../../../js/Clipperz/Set.js'></script>
48 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script> 45 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script>
49 46
50 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> 47 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
51 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> 48 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
52 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script> 49 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
53 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> 50 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
54 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script> 51 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
55 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script> 52 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script>
56 53
57 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script> 54 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script>
58 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script> 55 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script>
59 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script> 56 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script>
60 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script> 57 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script>
61 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script> 58 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script>
62 59
63 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script> 60 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script>
64 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script> 61 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script>
65 62
66 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings.js'></script> 63 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings.js'></script>
67 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script> 64 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script>
68 <script type='text/javascript' src='../../../../js/Clipperz/PM/Date.js'></script> 65 <script type='text/javascript' src='../../../../js/Clipperz/PM/Date.js'></script>
69 <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>
70 <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>
71 <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>
72 <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>
73 <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>
74 <!-- 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 -->
75 <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>
76 <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>
77 <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>
78 75
79 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/BaseComponent.js'></script> 76 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/BaseComponent.js'></script>
80 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/Button.js'></script> 77 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/Button.js'></script>
81 <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/ComponentSlot.js'></script>
82 <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/PasswordEntropyDisplay.js'></script>
83 <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/ProgressBar.js'></script>
84 <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/SimpleMessagePanel.js'></script>
85 <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/TabPanelComponent.js'></script>
86 <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/Tooltip.js'></script>
87 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TranslatorWidget.js'></script> 84 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TranslatorWidget.js'></script>
88 85
89 <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/CardDialogComponent.js'></script>
90 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogRecordFieldComponent.js'></script> 87 <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/UnlockPasswordComponent.js'></script> 88 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/UnlockPasswordComponent.js'></script>
92 89
93 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/TabPanelController.js'></script> 90 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/TabPanelController.js'></script>
94 91
95 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/CardDialogController.js'></script> 92 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/CardDialogController.js'></script>
96 93
97 <script type='text/javascript' src='./User.data.js'></script> 94 <script type='text/javascript' src='./User.data.js'></script>
98 <script type='text/javascript' src='./unlockPassword_test.js'></script> 95 <script type='text/javascript' src='./unlockPassword_test.js'></script>
99<script> 96<script>
100 Clipperz_IEisBroken = false; 97 Clipperz_IEisBroken = false;
101</script> 98</script>
102 99
103<!--[if IE]><script> 100<!--[if IE]><script>
104Clipperz_IEisBroken = true; 101Clipperz_IEisBroken = true;
105</script><![endif]--> 102</script><![endif]-->
106 103
107 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/clipperz.css" /> 104 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/clipperz.css" />
108 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/compact.css" /> 105 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/compact.css" />
109 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/ytheme-clipperz.css" /> 106 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/ytheme-clipperz.css" />
110 107
111</head> 108</head>
112<body> 109<body>
113 110
114<div id="tableWrapper"></div> 111<div id="tableWrapper"></div>
115 112
116</body> 113</body>
117</html> 114</html>
diff --git a/frontend/gamma/tests/tests/Components/UnlockPassword/unlockPassword_test.js b/frontend/gamma/tests/tests/Components/UnlockPassword/unlockPassword_test.js
index 87f3275..80a8c30 100644
--- a/frontend/gamma/tests/tests/Components/UnlockPassword/unlockPassword_test.js
+++ b/frontend/gamma/tests/tests/Components/UnlockPassword/unlockPassword_test.js
@@ -1,136 +1,133 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29Clipperz.Base.module('Clipperz.Tests.SimpleMessagePanel'); 26Clipperz.Base.module('Clipperz.Tests.SimpleMessagePanel');
30 27
31Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); 28Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
32Clipperz.PM.Strings.Languages.initSetup(); 29Clipperz.PM.Strings.Languages.initSetup();
33 30
34Clipperz.Tests.SimpleMessagePanel.Tester = function(args) { 31Clipperz.Tests.SimpleMessagePanel.Tester = function(args) {
35 args = args || {}; 32 args = args || {};
36 33
37 Clipperz.Tests.SimpleMessagePanel.Tester.superclass.constructor.call(this, args); 34 Clipperz.Tests.SimpleMessagePanel.Tester.superclass.constructor.call(this, args);
38 35
39 this._user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:MochiKit.Base.method(this, 'getUserPassphrase')}); 36 this._user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:MochiKit.Base.method(this, 'getUserPassphrase')});
40 this._unlockPasswordComponent = new Clipperz.PM.UI.Web.Components.UnlockPasswordComponent({ 37 this._unlockPasswordComponent = new Clipperz.PM.UI.Web.Components.UnlockPasswordComponent({
41 'title':"Unlock account", 38 'title':"Unlock account",
42 'text': "Insert the passprase to unlock the account", 39 'text': "Insert the passprase to unlock the account",
43 'type': 'INFO', 40 'type': 'INFO',
44 'buttons': [ 41 'buttons': [
45 {text:"Cancel",result:'CANCEL'}, 42 {text:"Cancel",result:'CANCEL'},
46 {text:"Unlock", result:'OK',isDefault:true} 43 {text:"Unlock", result:'OK',isDefault:true}
47 ], 44 ],
48 'openFromElement': null, 45 'openFromElement': null,
49 'onOkCloseToElement': null, //this.getElement('cancelButton'), 46 'onOkCloseToElement': null, //this.getElement('cancelButton'),
50 'onCancelCloseToElement':null 47 'onCancelCloseToElement':null
51 }); 48 });
52 49
53 return this; 50 return this;
54}; 51};
55 52
56Clipperz.Base.extend(Clipperz.Tests.SimpleMessagePanel.Tester, Object, { 53Clipperz.Base.extend(Clipperz.Tests.SimpleMessagePanel.Tester, Object, {
57 54
58 'toString': function() { 55 'toString': function() {
59 return "Clipperz.Tests.SimpleMessagePanel.Tester"; 56 return "Clipperz.Tests.SimpleMessagePanel.Tester";
60 }, 57 },
61 58
62 //------------------------------------------------------------------------- 59 //-------------------------------------------------------------------------
63 60
64 'user': function () { 61 'user': function () {
65 return this._user; 62 return this._user;
66 }, 63 },
67 64
68 'unlockPasswordComponent': function () { 65 'unlockPasswordComponent': function () {
69 return this._unlockPasswordComponent; 66 return this._unlockPasswordComponent;
70 }, 67 },
71 68
72 //------------------------------------------------------------------------- 69 //-------------------------------------------------------------------------
73 70
74 'run': function () { 71 'run': function () {
75 var deferredResult; 72 var deferredResult;
76 var proxy; 73 var proxy;
77 74
78 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); 75 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false});
79 76
80 deferredResult = new Clipperz.Async.Deferred("unlockPassword_test.run", {trace:false}); 77 deferredResult = new Clipperz.Async.Deferred("unlockPassword_test.run", {trace:false});
81 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']); 78 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']);
82 deferredResult.addMethod(this.user(), 'login'); 79 deferredResult.addMethod(this.user(), 'login');
83 deferredResult.addMethod(this.user(), 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); 80 deferredResult.addMethod(this.user(), 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13');
84 // deferredResult.addCallback(MochiKit.Base.bind(function (aRecord) { 81 // deferredResult.addCallback(MochiKit.Base.bind(function (aRecord) {
85 // cardDialogController = new Clipperz.PM.UI.Web.Controllers.CardDialogController({record:aRecord, delegate:this}); 82 // cardDialogController = new Clipperz.PM.UI.Web.Controllers.CardDialogController({record:aRecord, delegate:this});
86 // cardDialogController.run(); 83 // cardDialogController.run();
87 // }, this)); 84 // }, this));
88 deferredResult.callback(); 85 deferredResult.callback();
89 86
90 return deferredResult; 87 return deferredResult;
91 }, 88 },
92 89
93 //========================================================================= 90 //=========================================================================
94 91
95 'getUserPassphrase': function () { 92 'getUserPassphrase': function () {
96 return this.unlockPasswordComponent().getPassphrase(); 93 return this.unlockPasswordComponent().getPassphrase();
97/* 94/*
98 var deferredResult; 95 var deferredResult;
99 var confirmationDialog; 96 var confirmationDialog;
100 97
101 confirmationDialog = new Clipperz.PM.UI.Web.Components.UnlockPasswordComponent({ 98 confirmationDialog = new Clipperz.PM.UI.Web.Components.UnlockPasswordComponent({
102 title:"Unlock account", 99 title:"Unlock account",
103 text:"Insert the passprase to unlock the account", 100 text:"Insert the passprase to unlock the account",
104 type:'INFO', 101 type:'INFO',
105 buttons: [ 102 buttons: [
106 {text:"Cancel",result:'CANCEL'}, 103 {text:"Cancel",result:'CANCEL'},
107 {text:"Unlock", result:'OK',isDefault:true} 104 {text:"Unlock", result:'OK',isDefault:true}
108 ] 105 ]
109 }); 106 });
110 107
111 deferredResult = new Clipperz.Async.Deferred("CardDialogComponent.askConfirmationForLoosingPendingChanges", {trace:false}); 108 deferredResult = new Clipperz.Async.Deferred("CardDialogComponent.askConfirmationForLoosingPendingChanges", {trace:false});
112 deferredResult.addMethod(confirmationDialog, 'deferredShow', { 109 deferredResult.addMethod(confirmationDialog, 'deferredShow', {
113 'openFromElement': null, 110 'openFromElement': null,
114 'onOkCloseToElement': null, //this.getElement('cancelButton'), 111 'onOkCloseToElement': null, //this.getElement('cancelButton'),
115 'onCancelCloseToElement':null 112 'onCancelCloseToElement':null
116 }); 113 });
117 deferredResult.callback(); 114 deferredResult.callback();
118 115
119 return deferredResult; 116 return deferredResult;
120*/ 117*/
121 }, 118 },
122 119
123 //========================================================================= 120 //=========================================================================
124 __syntaxFix__: "syntax fix" 121 __syntaxFix__: "syntax fix"
125}); 122});
126 123
127 124
128 125
129init = function () { 126init = function () {
130 vartester; 127 vartester;
131 128
132 tester = new Clipperz.Tests.SimpleMessagePanel.Tester(); 129 tester = new Clipperz.Tests.SimpleMessagePanel.Tester();
133 tester.run(); 130 tester.run();
134}; 131};
135 132
136MochiKit.DOM.addLoadEvent(init); 133MochiKit.DOM.addLoadEvent(init);
diff --git a/frontend/gamma/tests/tests/Components/crossWindowsBookmarklet/CrossWindowsBookmarklet_test.js b/frontend/gamma/tests/tests/Components/crossWindowsBookmarklet/CrossWindowsBookmarklet_test.js
index cb80473..9908c6a 100644
--- a/frontend/gamma/tests/tests/Components/crossWindowsBookmarklet/CrossWindowsBookmarklet_test.js
+++ b/frontend/gamma/tests/tests/Components/crossWindowsBookmarklet/CrossWindowsBookmarklet_test.js
@@ -1,66 +1,63 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27*/ 24*/
28 25
29newWindow = function (anEvent) { 26newWindow = function (anEvent) {
30 var windowURL; 27 var windowURL;
31 var htmlString; 28 var htmlString;
32 var newWindow; 29 var newWindow;
33 30
34 anEvent.preventDefault(); 31 anEvent.preventDefault();
35 32
36 //htmlString = '<html><head><title>TARGET WINDOW</title></head><body><h3>this is the target window</h3></body></html>'; 33 //htmlString = '<html><head><title>TARGET WINDOW</title></head><body><h3>this is the target window</h3></body></html>';
37 // windowURL = 'data:text/html;charset=utf-8;base64,' + (new Clipperz.ByteArray(htmlString)).toBase64String(); 34 // windowURL = 'data:text/html;charset=utf-8;base64,' + (new Clipperz.ByteArray(htmlString)).toBase64String();
38 35
39 //newWindow = window.open(windowURL, 'CrossWindowsBookmarklet_TEST'); 36 //newWindow = window.open(windowURL, 'CrossWindowsBookmarklet_TEST');
40 newWindow = window.open('http://mail.google.com', 'CrossWindowsBookmarklet_TEST'); 37 newWindow = window.open('http://mail.google.com', 'CrossWindowsBookmarklet_TEST');
41 MochiKit.Signal.connect(newWindow, 'onload', targetWindowDidLoad) 38 MochiKit.Signal.connect(newWindow, 'onload', targetWindowDidLoad)
42 console.log("new window", newWindow); 39 console.log("new window", newWindow);
43 40
44 MochiKit.Async.callLater(2, runBookmarkletScript); 41 MochiKit.Async.callLater(2, runBookmarkletScript);
45}; 42};
46 43
47targetWindowDidLoad = function () { 44targetWindowDidLoad = function () {
48//console.log(">>> targetWindowDidLoad") 45//console.log(">>> targetWindowDidLoad")
49 runBookmarkletScript(null); 46 runBookmarkletScript(null);
50}; 47};
51 48
52runBookmarkletScript = function (anEvent) { 49runBookmarkletScript = function (anEvent) {
53 if (anEvent != null) { 50 if (anEvent != null) {
54 anEvent.preventDefault(); 51 anEvent.preventDefault();
55 } 52 }
56 53
57 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'); 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');
58 console.log("runBookmarkletScript"); 55 console.log("runBookmarkletScript");
59}; 56};
60 57
61init = function () { 58init = function () {
62 MochiKit.Signal.connect('newWindow', 'onclick', newWindow); 59 MochiKit.Signal.connect('newWindow', 'onclick', newWindow);
63 MochiKit.Signal.connect('runBookmarkletScript', 'onclick', runBookmarkletScript); 60 MochiKit.Signal.connect('runBookmarkletScript', 'onclick', runBookmarkletScript);
64}; 61};
65 62
66MochiKit.DOM.addLoadEvent(init); 63MochiKit.DOM.addLoadEvent(init);
diff --git a/frontend/gamma/tests/tests/Components/crossWindowsBookmarklet/index.html b/frontend/gamma/tests/tests/Components/crossWindowsBookmarklet/index.html
index 10e2f2e..50928d2 100644
--- a/frontend/gamma/tests/tests/Components/crossWindowsBookmarklet/index.html
+++ b/frontend/gamma/tests/tests/Components/crossWindowsBookmarklet/index.html
@@ -1,73 +1,70 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27--> 24-->
28 25
29<html> 26<html>
30<head> 27<head>
31 <title>Cross Window Bookmarklet execution - test</title> 28 <title>Cross Window Bookmarklet execution - test</title>
32 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 29 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
33 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script> 30 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script>
34 31
35 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> 32 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
36 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script> 33 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
37 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 34 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
38 <script type='text/javascript' src='../../../../js/Clipperz/Date.js'></script> 35 <script type='text/javascript' src='../../../../js/Clipperz/Date.js'></script>
39 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script> 36 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script>
40 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 37 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
41 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script> 38 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script> 39 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script>
43 40
44 <script type='text/javascript' src='../../../../js/Clipperz/Signal.js'></script> 41 <script type='text/javascript' src='../../../../js/Clipperz/Signal.js'></script>
45 <script type='text/javascript' src='../../../../js/Clipperz/Style.js'></script> 42 <script type='text/javascript' src='../../../../js/Clipperz/Style.js'></script>
46 <script type='text/javascript' src='../../../../js/Clipperz/Visual.js'></script> 43 <script type='text/javascript' src='../../../../js/Clipperz/Visual.js'></script>
47 <script type='text/javascript' src='../../../../js/Clipperz/Set.js'></script> 44 <script type='text/javascript' src='../../../../js/Clipperz/Set.js'></script>
48 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script> 45 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script>
49 46
50 <script type='text/javascript' src='./CrossWindowsBookmarklet_test.js'></script> 47 <script type='text/javascript' src='./CrossWindowsBookmarklet_test.js'></script>
51<script> 48<script>
52 Clipperz_IEisBroken = false; 49 Clipperz_IEisBroken = false;
53</script> 50</script>
54 51
55<!--[if IE]><script> 52<!--[if IE]><script>
56Clipperz_IEisBroken = true; 53Clipperz_IEisBroken = true;
57</script><![endif]--> 54</script><![endif]-->
58 55
59 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/clipperz.css" /> 56 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/clipperz.css" />
60 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/compact.css" /> 57 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/compact.css" />
61 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/ytheme-clipperz.css" /> 58 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/ytheme-clipperz.css" />
62 59
63</head> 60</head>
64<body> 61<body>
65 62
66<div id="tableWrapper"></div> 63<div id="tableWrapper"></div>
67 64
68<ul> 65<ul>
69 <li><a href="#" id="newWindow">open window</a></li> 66 <li><a href="#" id="newWindow">open window</a></li>
70 <li><a href="#" id="runBookmarkletScript">run bookmarklet script</a></li> 67 <li><a href="#" id="runBookmarkletScript">run bookmarklet script</a></li>
71</ul> 68</ul>
72</body> 69</body>
73</html> 70</html>
diff --git a/frontend/gamma/tests/tests/index.html b/frontend/gamma/tests/tests/index.html
index 75b8e95..9775f93 100644
--- a/frontend/gamma/tests/tests/index.html
+++ b/frontend/gamma/tests/tests/index.html
@@ -1,48 +1,45 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2011 Clipperz Srl
4 4
5This file is part of Clipperz's Javascript Crypto Library. 5This file is part of Clipperz Community Edition.
6Javascript Crypto Library provides web developers with an extensive 6Clipperz Community Edition is an online password manager.
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please 7For further information about its features and functionalities please
11refer to http://www.clipperz.com 8refer to http://www.clipperz.com.
12 9
13* Javascript Crypto Library is free software: you can redistribute 10* Clipperz Community Edition is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public 11 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version 12 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version. 13 3 of the License, or (at your option) any later version.
17 14
18* Javascript Crypto Library is distributed in the hope that it will 15* Clipperz Community Edition is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied 16 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details. 18 See the GNU Affero General Public License for more details.
22 19
23* You should have received a copy of the GNU Affero General Public 20* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see 21 License along with Clipperz Community Edition. If not, see
25 <http://www.gnu.org/licenses/>. 22 <http://www.gnu.org/licenses/>.
26 23
27--> 24-->
28 25
29<html> 26<html>
30<head> 27<head>
31 <title>Complete TEST suite</title> 28 <title>Complete TEST suite</title>
32 <script type="text/javascript" src="../../js/MochiKit/MochiKit.js"></script> 29 <script type="text/javascript" src="../../js/MochiKit/MochiKit.js"></script>
33 <script type="text/javascript" src="../SimpleTest/TestRunner.js"></script> 30 <script type="text/javascript" src="../SimpleTest/TestRunner.js"></script>
34</head> 31</head>
35<body> 32<body>
36<script> 33<script>
37TestRunner.runTests( 34TestRunner.runTests(
38 'Clipperz/index.html', 35 'Clipperz/index.html',
39 'Clipperz/Crypto/index.html', 36 'Clipperz/Crypto/index.html',
40 'Clipperz/PM/index.html', 37 'Clipperz/PM/index.html',
41 'Clipperz/PM/DataModel/index.html', 38 'Clipperz/PM/DataModel/index.html',
42 'Clipperz/PM/UI/index.html', 39 'Clipperz/PM/UI/index.html',
43 'Clipperz/PM/UI/Web/index.html', 40 'Clipperz/PM/UI/Web/index.html',
44 'Clipperz/PM/UI/Web/Controllers/index.html' 41 'Clipperz/PM/UI/Web/Controllers/index.html'
45); 42);
46</script> 43</script>
47</body> 44</body>
48</html> \ No newline at end of file 45</html> \ No newline at end of file