mirror of
http://git.whoc.org.uk/git/password-manager.git
synced 2025-12-14 02:22:43 +01:00
First version of the newly restructured repository
This commit is contained in:
196
frontend/gamma/js/Clipperz/PM/BookmarkletProcessor.js
Normal file
196
frontend/gamma/js/Clipperz/PM/BookmarkletProcessor.js
Normal file
@@ -0,0 +1,196 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
/*
|
||||
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
|
||||
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
|
||||
|
||||
Clipperz.PM.BookmarkletProcessor = function(aConfiguration) {
|
||||
this._configuration = aConfiguration;
|
||||
|
||||
this._editableFields = null;
|
||||
this._favicon = null;
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
Clipperz.PM.BookmarkletProcessor.prototype = MochiKit.Base.update(null, {
|
||||
|
||||
'toString': function() {
|
||||
return "Clipperz.PM.BookmarkletProcessor";
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'configuration': function() {
|
||||
return this._configuration;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'pageTitle': function() {
|
||||
return this.configuration().page.title;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'fields': function() {
|
||||
return this.configuration().form.inputs;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'editableFields': function() {
|
||||
if (this._editableFields == null) {
|
||||
this._editableFields = MochiKit.Base.filter(function(aField) {
|
||||
var result;
|
||||
var type;
|
||||
|
||||
type = aField['type'].toLowerCase();
|
||||
result = ((type != 'hidden') && (type != 'submit') && (type != 'checkbox') && (type != 'radio') && (type != 'select'));
|
||||
|
||||
return result;
|
||||
}, this.fields())
|
||||
}
|
||||
|
||||
return this._editableFields;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'hostname': function() {
|
||||
if (this._hostname == null) {
|
||||
var actionUrl;
|
||||
|
||||
actionUrl = this.configuration()['form']['attributes']['action'];
|
||||
this._hostname = actionUrl.replace(/ ^ h t t p s ? : \ / \ / ( [ ^ \ / ] * ) \ / . * /, '$1');
|
||||
}
|
||||
|
||||
return this._hostname;
|
||||
},
|
||||
|
||||
'favicon': function() {
|
||||
if (this._favicon == null) {
|
||||
this._favicon = "http://" + this.hostname() + "/favicon.ico";
|
||||
}
|
||||
|
||||
return this._favicon;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
__syntaxFix__: "syntax fix"
|
||||
});
|
||||
|
||||
//#############################################################################
|
||||
/ *
|
||||
Clipperz.PM.BookmarkletProcessor.createRecordFromBookmarkletConfiguration = function(anUser, aConfiguration) {
|
||||
var processor;
|
||||
var record;
|
||||
var recordVersion;
|
||||
var directLogin;
|
||||
var bindings;
|
||||
var i,c;
|
||||
|
||||
processor = new Clipperz.PM.BookmarkletProcessor(aConfiguration);
|
||||
|
||||
record = new Clipperz.PM.DataModel.Record({
|
||||
'label': processor.pageTitle(),
|
||||
'notes': "",
|
||||
'user': anUser
|
||||
});
|
||||
recordVersion = new Clipperz.PM.DataModel.Record.Version(record, {})
|
||||
record.setCurrentVersion(recordVersion);
|
||||
|
||||
bindings = {};
|
||||
|
||||
c = processor.editableFields().length;
|
||||
for (i=0; i<c; i++) {
|
||||
var formField;
|
||||
var recordField;
|
||||
|
||||
formField = processor.editableFields()[i];
|
||||
recordField = new Clipperz.PM.DataModel.RecordField({
|
||||
'label': formField['name'],
|
||||
'value': formField['value'],
|
||||
'type': Clipperz.PM.Strings.inputTypeToRecordFieldType[formField['type']],
|
||||
'hidden': false,
|
||||
'recordVersion': recordVersion
|
||||
});
|
||||
recordVersion.addField(recordField);
|
||||
|
||||
bindings[formField['name']] = recordField.key();
|
||||
}
|
||||
|
||||
directLogin = new Clipperz.PM.DataModel.DirectLogin({
|
||||
'record': record,
|
||||
'label': processor.pageTitle(),
|
||||
'favicon': processor.favicon(),
|
||||
'formData': processor.configuration()['form'],
|
||||
'bindingData': bindings,
|
||||
'bookmarkletVersion': '0.2'
|
||||
});
|
||||
record.addDirectLogin(directLogin);
|
||||
|
||||
anUser.addRecord(record);
|
||||
|
||||
return record;
|
||||
};
|
||||
* /
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
Clipperz.PM.BookmarkletProcessor.sanitizeBookmarkletConfiguration = function(aConfiguration) {
|
||||
var result;
|
||||
|
||||
// throw "XSS Bookmarklet attempt";
|
||||
|
||||
result = aConfiguration;
|
||||
|
||||
return result;
|
||||
};
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
Clipperz.PM.BookmarkletProcessor.checkBookmarkletConfiguration = function(aConfiguration) {
|
||||
var result;
|
||||
|
||||
try {
|
||||
result = Clipperz.Base.evalJSON(aConfiguration);
|
||||
result = Clipperz.PM.BookmarkletProcessor.sanitizeBookmarkletConfiguration(result);
|
||||
|
||||
if (result['version'] != '0.2.3') {
|
||||
throw "WrongBookmarkletVersion";
|
||||
}
|
||||
} catch (exception) {
|
||||
throw exception;
|
||||
}
|
||||
|
||||
return result;
|
||||
};
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
*/
|
||||
619
frontend/gamma/js/Clipperz/PM/Connection.js
Normal file
619
frontend/gamma/js/Clipperz/PM/Connection.js
Normal file
@@ -0,0 +1,619 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
|
||||
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
//
|
||||
// Abstract C O N N E C T I O N class
|
||||
//
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
Clipperz.PM.Connection = function (args) {
|
||||
args = args || {};
|
||||
|
||||
this._proxy = args.proxy || Clipperz.PM.Proxy.defaultProxy;
|
||||
this._getCredentialsFunction = args.getCredentialsFunction;
|
||||
|
||||
this._clipperz_pm_crypto_version = null;
|
||||
this._connectionId = null;
|
||||
this._sharedSecret = null;
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
Clipperz.PM.Connection.prototype = MochiKit.Base.update(null, {
|
||||
|
||||
'toString': function() {
|
||||
return "Connection [" + this.version() + "]";
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'version': function() {
|
||||
throw Clipperz.Base.exception.AbstractMethod;
|
||||
},
|
||||
|
||||
'clipperz_pm_crypto_version': function() {
|
||||
if (this._clipperz_pm_crypto_version == null) {
|
||||
var connectionVersions;
|
||||
var versions;
|
||||
var version;
|
||||
var i, c;
|
||||
|
||||
version = null;
|
||||
connectionVersions = Clipperz.PM.Connection.communicationProtocol.versions;
|
||||
versions = MochiKit.Base.keys(connectionVersions);
|
||||
c = versions.length;
|
||||
for (i=0; i<c; i++) {
|
||||
if (! (versions[i] == 'current')) {
|
||||
if (this instanceof connectionVersions[versions[i]]) {
|
||||
version = versions[i];
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
this._clipperz_pm_crypto_version = version;
|
||||
}
|
||||
|
||||
return this._clipperz_pm_crypto_version;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'defaultErrorHandler': function(anErrorString, anException) {
|
||||
MochiKit.Logging.logError("### Connection.defaultErrorHandler: " + anErrorString + " (" + anException + ")");
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'getCredentialsFunction': function () {
|
||||
return this._getCredentialsFunction;
|
||||
},
|
||||
|
||||
'normalizedCredentials': function(someValues) {
|
||||
throw Clipperz.Base.exception.AbstractMethod;
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'proxy': function () {
|
||||
return this._proxy;
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'register': function () {
|
||||
throw Clipperz.Base.exception.AbstractMethod;
|
||||
},
|
||||
|
||||
'login': function() {
|
||||
throw Clipperz.Base.exception.AbstractMethod;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'message': function(someArguments, aCallback) {
|
||||
throw Clipperz.Base.exception.AbstractMethod;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'serverSideUserCredentials': function() {
|
||||
throw Clipperz.Base.exception.AbstractMethod;
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'sharedSecret': function () {
|
||||
return this._sharedSecret;
|
||||
},
|
||||
|
||||
'setSharedSecret': function (aValue) {
|
||||
this._sharedSecret = aValue;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'connectionId': function() {
|
||||
return this._connectionId;
|
||||
},
|
||||
|
||||
'setConnectionId': function(aValue) {
|
||||
this._connectionId = aValue;
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
/*
|
||||
// TODO: ?????
|
||||
'oneTimePassword': function() {
|
||||
return this._oneTimePassword;
|
||||
},
|
||||
|
||||
'setOneTimePassword': function(aValue) {
|
||||
this._oneTimePassword = aValue;
|
||||
},
|
||||
*/
|
||||
//=========================================================================
|
||||
|
||||
'reset': function() {
|
||||
this.setSharedSecret(null);
|
||||
this.setConnectionId(null);
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
__syntaxFix__: "syntax fix"
|
||||
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
if (typeof(Clipperz.PM.Connection.SRP) == 'undefined') { Clipperz.PM.Connection.SRP = {}; }
|
||||
//-----------------------------------------------------------------------------
|
||||
//
|
||||
// S R P [ 1 . 0 ] C O N N E C T I O N class
|
||||
//
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
Clipperz.PM.Connection.SRP['1.0'] = function (args) {
|
||||
Clipperz.PM.Connection.call(this, args);
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
Clipperz.PM.Connection.SRP['1.0'].prototype = MochiKit.Base.update(new Clipperz.PM.Connection(), {
|
||||
|
||||
'version': function() {
|
||||
return '1.0';
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'register': function (someUserData) {
|
||||
var deferredResult;
|
||||
var cryptoVersion;
|
||||
var srpConnection;
|
||||
|
||||
cryptoVersion = this.clipperz_pm_crypto_version();
|
||||
|
||||
deferredResult = new Clipperz.Async.Deferred("Connection.registerWithVersion", {trace:false});
|
||||
deferredResult.collectResults({
|
||||
'credentials': [
|
||||
this.getCredentialsFunction(),
|
||||
MochiKit.Base.method(this, 'normalizedCredentials'),
|
||||
MochiKit.Base.bind(function(someCredentials) {
|
||||
var srpConnection;
|
||||
var result;
|
||||
|
||||
srpConnection = new Clipperz.Crypto.SRP.Connection({ C:someCredentials['username'], P:someCredentials['password'], hash:this.hash() });
|
||||
result = srpConnection.serverSideCredentials();
|
||||
result['version'] = Clipperz.PM.Connection.communicationProtocol.currentVersion;
|
||||
|
||||
return result;
|
||||
}, this)
|
||||
],
|
||||
'user': MochiKit.Base.partial(MochiKit.Async.succeed, someUserData),
|
||||
'version': MochiKit.Base.partial(MochiKit.Async.succeed, Clipperz.PM.Connection.communicationProtocol.currentVersion),
|
||||
'message': MochiKit.Base.partial(MochiKit.Async.succeed, 'completeRegistration')
|
||||
});
|
||||
deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
|
||||
deferredResult.addMethod(this.proxy(), 'registration');
|
||||
deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
|
||||
|
||||
deferredResult.callback();
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'updateCredentials': function (aUsername, aPassphrase, someUserData) {
|
||||
var deferredResult;
|
||||
|
||||
deferredResult = new Clipperz.Async.Deferred("Connection.updateCredentials", {trace:false});
|
||||
deferredResult.collectResults({
|
||||
'credentials': [
|
||||
MochiKit.Base.method(this, 'normalizedCredentials', {username:aUsername, password:aPassphrase}),
|
||||
MochiKit.Base.bind(function(someCredentials) {
|
||||
var srpConnection;
|
||||
var result;
|
||||
|
||||
srpConnection = new Clipperz.Crypto.SRP.Connection({ C:someCredentials['username'], P:someCredentials['password'], hash:this.hash() });
|
||||
result = srpConnection.serverSideCredentials();
|
||||
result['version'] = Clipperz.PM.Connection.communicationProtocol.currentVersion;
|
||||
|
||||
return result;
|
||||
}, this)
|
||||
],
|
||||
'user': MochiKit.Base.partial(MochiKit.Async.succeed, someUserData)
|
||||
});
|
||||
deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
|
||||
deferredResult.addMethod(this, 'message', 'upgradeUserCredentials');
|
||||
deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
|
||||
deferredResult.callback();
|
||||
|
||||
return deferredResult;
|
||||
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'redeemOneTimePassword': function (someParameters) {
|
||||
//console.log("Connections.redeemOneTimePassword", someParameters['username'], someParameters['password']);
|
||||
/*
|
||||
//=========================================================================
|
||||
// LOGIN WITH PASSPHRASE, extracted from the TRUNK version (LoginPanel.js)
|
||||
deferredResult.addCallback(function(anUsername, aOneTimePassword) {
|
||||
var args;
|
||||
|
||||
args = {
|
||||
'message': 'oneTimePassword',
|
||||
'version': Clipperz.PM.Crypto.communicationProtocol.currentVersion,
|
||||
'parameters': {
|
||||
'oneTimePasswordKey': Clipperz.PM.DataModel.OneTimePassword.computeKeyWithUsernameAndPassword(anUsername, aOneTimePassword),
|
||||
'oneTimePasswordKeyChecksum': Clipperz.PM.DataModel.OneTimePassword.computeKeyChecksumWithUsernameAndPassword(anUsername, aOneTimePassword)
|
||||
}
|
||||
}
|
||||
|
||||
return args;
|
||||
}, anUsername, oneTimePassword);
|
||||
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'OTP_login_loadingOTP');
|
||||
deferredResult.addCallback(MochiKit.Base.method(Clipperz.PM.Proxy.defaultProxy, 'handshake'));
|
||||
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'OTP_login_extractingPassphrase');
|
||||
deferredResult.addCallback(function(aResult) {
|
||||
return Clipperz.PM.Crypto.deferredDecrypt(oneTimePassword, aResult['data'], aResult['version']);
|
||||
});
|
||||
deferredResult.addCallback(function(aResult) {
|
||||
return (new Clipperz.ByteArray().appendBase64String(aResult['passphrase'])).asString();
|
||||
});
|
||||
deferredResult.addMethod(this, 'doLoginWithUsernameAndPassphrase', anUsername),
|
||||
*/
|
||||
var args;
|
||||
var normalizedOTP;
|
||||
|
||||
normalizedOTP = Clipperz.PM.DataModel.OneTimePassword.normalizedOneTimePassword(someParameters['password']);
|
||||
|
||||
args = {
|
||||
'message': 'oneTimePassword',
|
||||
'version': Clipperz.PM.Connection.communicationProtocol.currentVersion,
|
||||
'parameters': {
|
||||
'oneTimePasswordKey': Clipperz.PM.DataModel.OneTimePassword.computeKeyWithUsernameAndPassword(someParameters['username'], normalizedOTP),
|
||||
'oneTimePasswordKeyChecksum': Clipperz.PM.DataModel.OneTimePassword.computeKeyChecksumWithUsernameAndPassword(someParameters['username'], normalizedOTP)
|
||||
}
|
||||
}
|
||||
|
||||
return Clipperz.Async.callbacks("Connction.redeemOTP", [
|
||||
MochiKit.Base.method(this.proxy(), 'handshake', args),
|
||||
function(aResult) {
|
||||
return Clipperz.PM.Crypto.deferredDecrypt({
|
||||
value: aResult['data'],
|
||||
key: normalizedOTP,
|
||||
version:aResult['version']
|
||||
});
|
||||
},
|
||||
function(aResult) {
|
||||
return (new Clipperz.ByteArray().appendBase64String(aResult['passphrase'])).asString();
|
||||
}
|
||||
], {trace:false})
|
||||
},
|
||||
|
||||
'login': function(/*anUsername, aPassphrase*/) {
|
||||
var deferredResult;
|
||||
var cryptoVersion;
|
||||
var srpConnection;
|
||||
|
||||
cryptoVersion = this.clipperz_pm_crypto_version();
|
||||
|
||||
deferredResult = new Clipperz.Async.Deferred("Connection.login", {trace:false});
|
||||
deferredResult.addCallback(this.getCredentialsFunction());
|
||||
deferredResult.addMethod(this, 'normalizedCredentials');
|
||||
// deferredResult.addCallbackPass(MochiKit.Signal.signal, this, 'updatedProgressState', 'connection_sendingCredentials');
|
||||
deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
|
||||
deferredResult.addCallback(MochiKit.Base.bind(function(someCredentials) {
|
||||
srpConnection = new Clipperz.Crypto.SRP.Connection({ C:someCredentials['username'], P:someCredentials['password'], hash:this.hash() });
|
||||
}, this));
|
||||
deferredResult.addCallback(function() {
|
||||
var result;
|
||||
|
||||
result = {
|
||||
message: 'connect',
|
||||
version: cryptoVersion,
|
||||
parameters: {
|
||||
C: srpConnection.C(),
|
||||
A: srpConnection.A().asString(16)
|
||||
// reconnecting: this.connectionId()
|
||||
}
|
||||
};
|
||||
|
||||
// TODO: ?????
|
||||
// if (isReconnecting == true) {
|
||||
// args.parameters['reconnecting'] = aConnection.connectionId();
|
||||
// }
|
||||
|
||||
return result;
|
||||
});
|
||||
deferredResult.addMethod(this.proxy(), 'handshake');
|
||||
// deferredResult.addCallbackPass(MochiKit.Signal.signal, this, 'updatedProgressState', 'connection_credentialVerification');
|
||||
deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
|
||||
deferredResult.addCallback(function(someParameters) {
|
||||
var result;
|
||||
|
||||
srpConnection.set_s(new Clipperz.Crypto.BigInt(someParameters['s'], 16));
|
||||
srpConnection.set_B(new Clipperz.Crypto.BigInt(someParameters['B'], 16));
|
||||
|
||||
// TODO: ?????
|
||||
// if (typeof(someParameters['oneTimePassword']) != 'undefined') {
|
||||
// this.setOneTimePassword(someParameters['oneTimePassword']);
|
||||
// }
|
||||
|
||||
result = {
|
||||
message: 'credentialCheck',
|
||||
version: cryptoVersion,
|
||||
parameters: {
|
||||
M1: srpConnection.M1()
|
||||
}
|
||||
};
|
||||
|
||||
return result;
|
||||
});
|
||||
deferredResult.addMethod(this.proxy(), 'handshake');
|
||||
deferredResult.addCallback(function(someParameters) {
|
||||
var result;
|
||||
|
||||
if (someParameters['M2'] == srpConnection.M2()) {
|
||||
result = MochiKit.Async.succeed(someParameters);
|
||||
} else {
|
||||
result = MochiKit.Async.fail(Clipperz.PM.Connection.exception.WrongChecksum);
|
||||
}
|
||||
|
||||
return result;
|
||||
});
|
||||
deferredResult.addCallback(MochiKit.Base.bind(function(someParameters) {
|
||||
this.setConnectionId(someParameters['connectionId']);
|
||||
this.setSharedSecret(srpConnection.K());
|
||||
|
||||
// TODO: ?????
|
||||
// if (this.oneTimePassword() != null) {
|
||||
/// ?? result = this.user().oneTimePasswordManager().archiveOneTimePassword(this.oneTimePassword()));
|
||||
// }
|
||||
return someParameters;
|
||||
}, this));
|
||||
// deferredResult.addCallbackPass(MochiKit.Signal.signal, this, 'updatedProgressState', 'connection_loggedIn');
|
||||
deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
|
||||
deferredResult.addCallback(MochiKit.Async.succeed, {result:"done"});
|
||||
|
||||
deferredResult.callback();
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'logout': function() {
|
||||
return Clipperz.Async.callbacks("Connection.logout", [
|
||||
MochiKit.Base.method(this, 'setSharedSecret'),
|
||||
MochiKit.Base.method(this.proxy(), 'logout', {})
|
||||
], {trace:false});
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'ping': function () {
|
||||
// TODO: ping the server in order to have a valid session
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'message': function(aMessageName, someParameters) {
|
||||
var args;
|
||||
|
||||
//console.log(">>> Connection.message", aMessageName, someParameters);
|
||||
args = {
|
||||
message: aMessageName,
|
||||
srpSharedSecret: this.sharedSecret(),
|
||||
parameters: (someParameters || {})
|
||||
}
|
||||
|
||||
return this.sendMessage(args);
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'sendMessage': function(someArguments) {
|
||||
var deferredResult;
|
||||
|
||||
deferredResult = new Clipperz.Async.Deferred("Connection.sendMessage", {trace:false});
|
||||
deferredResult.addMethod(this.proxy(), 'message', someArguments);
|
||||
deferredResult.addCallback(MochiKit.Base.bind(function(res) {
|
||||
if (typeof(res['lock']) != 'undefined') {
|
||||
// TODO: ?????
|
||||
// ?? this.user().setLock(res['lock']);
|
||||
}
|
||||
return res;
|
||||
}, this));
|
||||
|
||||
deferredResult.addErrback(MochiKit.Base.method(this, 'messageExceptionHandler'), someArguments);
|
||||
deferredResult.callback();
|
||||
|
||||
return deferredResult
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'messageExceptionHandler': function(anOriginalMessageArguments, anError) {
|
||||
var result;
|
||||
|
||||
console.log(">>> Connection.messageExceptionHandler", anError, anError.message);
|
||||
if (anError instanceof MochiKit.Async.CancelledError) {
|
||||
result = anError;
|
||||
} else {
|
||||
if ((anError.message == 'Trying to communicate without an active connection') ||
|
||||
(anError.message == 'No tollManager available for current session')
|
||||
) {
|
||||
result = this.reestablishConnection(anOriginalMessageArguments);
|
||||
} else if (anError.message == 'Session with stale data') {
|
||||
MochiKit.Signal.signal(this, 'EXCEPTION');
|
||||
} else {
|
||||
result = anError;
|
||||
}
|
||||
}
|
||||
console.log("<<< Connection.messageExceptionHandler", anError)
|
||||
|
||||
return result;;
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'reestablishConnection': function(anOriginalMessageArguments) {
|
||||
var deferredResult;
|
||||
|
||||
deferredResult = new Clipperz.Async.Deferred("Connection.reestablishConnection");
|
||||
deferredResult.addMethod(this, 'reset');
|
||||
deferredResult.addMethod(this, 'login', true);
|
||||
deferredResult.addCallback(MochiKit.Base.bind(function(aMessage) {
|
||||
aMessage['srpSharedSecret'] = this.sharedSecret();
|
||||
return aMessage;
|
||||
}, this), anOriginalMessageArguments);
|
||||
deferredResult.addMethod(this, 'sendMessage');
|
||||
deferredResult.addErrback(MochiKit.Signal.signal, this, 'EXCEPTION', null);
|
||||
deferredResult.callback();
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'serverSideUserCredentials': function(aUsername, aPassword) {
|
||||
var result;
|
||||
var newSrpConnection;
|
||||
var normalizedAttributes;
|
||||
|
||||
normalizedAttributes = this.normalizedCredentials({username:aUsername, password:aPassword});
|
||||
newSrpConnection = new Clipperz.Crypto.SRP.Connection({ C:normalizedAttributes['username'], P:normalizedAttributes['password'], hash:this.hash() });
|
||||
result = newSrpConnection.serverSideCredentials();
|
||||
result['version'] = this.clipperz_pm_crypto_version();
|
||||
|
||||
return result;
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'normalizedCredentials': function(someValues) {
|
||||
var result;
|
||||
|
||||
result = {}
|
||||
result['username'] = this.hash()(new Clipperz.ByteArray(someValues['username'])).toHexString().substring(2);
|
||||
result['password'] = this.hash()(new Clipperz.ByteArray(someValues['password'] + someValues['username'])).toHexString().substring(2);
|
||||
|
||||
return result;
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
'hash': function() {
|
||||
return Clipperz.PM.Crypto.encryptingFunctions.versions['0.1'].hash;
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
__syntaxFix__: "syntax fix"
|
||||
|
||||
});
|
||||
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
//
|
||||
// S R P [ 1 . 1 ] C O N N E C T I O N class
|
||||
//
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
Clipperz.PM.Connection.SRP['1.1'] = function (args) {
|
||||
Clipperz.PM.Connection.SRP['1.0'].call(this, args);
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
Clipperz.PM.Connection.SRP['1.1'].prototype = MochiKit.Base.update(new Clipperz.PM.Connection.SRP['1.0'](), {
|
||||
|
||||
'version': function() {
|
||||
return '1.1';
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
'normalizedCredentials': function(someValues) {
|
||||
var result;
|
||||
|
||||
result = {}
|
||||
result['username'] = this.hash()(new Clipperz.ByteArray(someValues['username'] + someValues['password'])).toHexString().substring(2);
|
||||
result['password'] = this.hash()(new Clipperz.ByteArray(someValues['password'] + someValues['username'])).toHexString().substring(2);
|
||||
|
||||
return result;
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
'hash': function() {
|
||||
return Clipperz.PM.Crypto.encryptingFunctions.versions['0.2'].hash;
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
__syntaxFix__: "syntax fix"
|
||||
|
||||
});
|
||||
|
||||
Clipperz.PM.Connection.exception = {
|
||||
WrongChecksum: new MochiKit.Base.NamedError("Clipperz.ByteArray.exception.InvalidValue"),
|
||||
UnexpectedRequest: new MochiKit.Base.NamedError("Clipperz.ByteArray.exception.UnexpectedRequest")
|
||||
};
|
||||
|
||||
|
||||
Clipperz.PM.Connection.communicationProtocol = {
|
||||
'currentVersion': '0.2',
|
||||
'versions': {
|
||||
'0.1': Clipperz.PM.Connection.SRP['1.0'], //Clipperz.Crypto.SRP.versions['1.0'].Connection,
|
||||
'0.2': Clipperz.PM.Connection.SRP['1.1'] //Clipperz.Crypto.SRP.versions['1.1'].Connection
|
||||
},
|
||||
'fallbackVersions': {
|
||||
// 'current': '0.1',
|
||||
'0.2': '0.1',
|
||||
'0.1': null
|
||||
}
|
||||
};
|
||||
|
||||
MochiKit.Base.update(Clipperz.PM.Connection.communicationProtocol.versions, {
|
||||
'current': Clipperz.PM.Connection.communicationProtocol.versions[Clipperz.PM.Connection.communicationProtocol.currentVersion]
|
||||
});
|
||||
|
||||
MochiKit.Base.update(Clipperz.PM.Connection.communicationProtocol.fallbackVersions, {
|
||||
'current': Clipperz.PM.Connection.communicationProtocol.fallbackVersions[Clipperz.PM.Connection.communicationProtocol.currentVersion]
|
||||
});
|
||||
|
||||
|
||||
|
||||
513
frontend/gamma/js/Clipperz/PM/Crypto.js
Normal file
513
frontend/gamma/js/Clipperz/PM/Crypto.js
Normal file
@@ -0,0 +1,513 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
|
||||
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
|
||||
if (typeof(Clipperz.PM.Crypto) == 'undefined') { Clipperz.PM.Crypto = {}; }
|
||||
|
||||
Clipperz.PM.Crypto.VERSION = "0.2";
|
||||
Clipperz.PM.Crypto.NAME = "Clipperz.PM.Crypto";
|
||||
|
||||
Clipperz.PM.Crypto.encryptingFunctions = {};
|
||||
|
||||
MochiKit.Base.update(Clipperz.PM.Crypto, {
|
||||
|
||||
'__repr__': function () {
|
||||
return "[" + this.NAME + " " + this.VERSION + "]";
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'toString': function () {
|
||||
return this.__repr__();
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
/*
|
||||
'communicationProtocol': {
|
||||
'currentVersion': '0.2',
|
||||
'versions': {
|
||||
'0.1': Clipperz.PM.Connection.SRP['1.0'], //Clipperz.Crypto.SRP.versions['1.0'].Connection,
|
||||
'0.2': Clipperz.PM.Connection.SRP['1.1'] //Clipperz.Crypto.SRP.versions['1.1'].Connection
|
||||
},
|
||||
'fallbackVersions': {
|
||||
'current': '0.1',
|
||||
'0.2': '0.1',
|
||||
'0.1': null
|
||||
}
|
||||
},
|
||||
*/
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'encryptingFunctions': {
|
||||
'currentVersion': '0.3',
|
||||
'versions': {
|
||||
|
||||
//#####################################################################
|
||||
|
||||
'0.1': {
|
||||
'encrypt': function(aKey, aValue) {
|
||||
return Clipperz.Crypto.Base.encryptUsingSecretKey(aKey, Clipperz.Base.serializeJSON(aValue));
|
||||
},
|
||||
|
||||
'deferredEncrypt': function(aKey, aValue) {
|
||||
var deferredResult;
|
||||
|
||||
deferredResult = new Clipperz.Async.Deferred("Crypto[0.1].deferredEncrypt");
|
||||
deferredResult.addCallback(Clipperz.PM.Crypto.encryptingFunctions.versions['0.1'].encrypt, aKey, aValue);
|
||||
deferredResult.callback();
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
'decrypt': function(aKey, aValue) {
|
||||
var result;
|
||||
|
||||
if (aValue != null) {
|
||||
result = Clipperz.Base.evalJSON(Clipperz.Crypto.Base.decryptUsingSecretKey(aKey, aValue));
|
||||
} else {
|
||||
result = null;
|
||||
}
|
||||
|
||||
return result;
|
||||
},
|
||||
|
||||
'deferredDecrypt': function(aKey, aValue) {
|
||||
var deferredResult;
|
||||
|
||||
deferredResult = new Clipperz.Async.Deferred("Crypto.[0.1].deferredDecrypt");
|
||||
deferredResult.addCallback(Clipperz.PM.Crypto.encryptingFunctions.versions['0.1'].decrypt, aKey, aValue);
|
||||
deferredResult.callback();
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
'hash': function(aValue) {
|
||||
var result;
|
||||
var strngResult;
|
||||
|
||||
stringResult = Clipperz.Crypto.Base.computeHashValue(aValue.asString()); // !!!!!!!
|
||||
result = new Clipperz.ByteArray("0x" + stringResult);
|
||||
|
||||
return result;
|
||||
},
|
||||
|
||||
'deriveKey': function(aStringValue) {
|
||||
return Clipperz.Crypto.Base.computeHashValue(aStringValue);
|
||||
}
|
||||
},
|
||||
|
||||
//#####################################################################
|
||||
|
||||
'0.2': {
|
||||
'encrypt': function(aKey, aValue, aNonce) {
|
||||
var result;
|
||||
var key, value;
|
||||
var dataToEncrypt;
|
||||
var encryptedData;
|
||||
|
||||
key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
|
||||
value = new Clipperz.ByteArray(Clipperz.Base.serializeJSON(aValue));
|
||||
dataToEncrypt = Clipperz.Crypto.SHA.sha_d256(value).appendBlock(value);
|
||||
encryptedData = Clipperz.Crypto.AES.encrypt(key, dataToEncrypt, aNonce);
|
||||
result = encryptedData.toBase64String();
|
||||
|
||||
return result;
|
||||
},
|
||||
|
||||
'deferredEncrypt': function(aKey, aValue, aNonce) {
|
||||
var deferredResult;
|
||||
var key, value;
|
||||
var dataToEncrypt;
|
||||
// var encryptedData;
|
||||
|
||||
key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
|
||||
value = new Clipperz.ByteArray(Clipperz.Base.serializeJSON(aValue));
|
||||
dataToEncrypt = Clipperz.Crypto.SHA.sha_d256(value).appendBlock(value);
|
||||
|
||||
deferredResult = new Clipperz.Async.Deferred("Crypto[0.2].deferredEncrypt")
|
||||
deferredResult.addCallback(Clipperz.Crypto.AES.deferredEncrypt, key, dataToEncrypt, aNonce);
|
||||
deferredResult.addCallback(function(aResult) {
|
||||
return aResult.toBase64String();
|
||||
})
|
||||
deferredResult.callback();
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
'decrypt': function(aKey, aValue) {
|
||||
var result;
|
||||
|
||||
if (aValue != null) {
|
||||
var key, value;
|
||||
var decryptedData;
|
||||
var decryptedValue;
|
||||
|
||||
key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
|
||||
value = new Clipperz.ByteArray().appendBase64String(aValue);
|
||||
|
||||
decryptedData = Clipperz.Crypto.AES.decrypt(key, value);
|
||||
decryptedValue = decryptedData.split((256/8));
|
||||
|
||||
try {
|
||||
result = Clipperz.Base.evalJSON(decryptedValue.asString());
|
||||
} catch (exception) {
|
||||
MochiKit.Logging.logError("Error while decrypting data [1]");
|
||||
throw Clipperz.Crypto.Base.exception.CorruptedMessage;
|
||||
}
|
||||
} else {
|
||||
result = null;
|
||||
}
|
||||
|
||||
return result;
|
||||
},
|
||||
|
||||
'deferredDecrypt': function(aKey, aValue) {
|
||||
var result;
|
||||
|
||||
if (aValue != null) {
|
||||
var deferredResult;
|
||||
var key, value;
|
||||
// var decryptedData;
|
||||
|
||||
key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
|
||||
value = new Clipperz.ByteArray().appendBase64String(aValue);
|
||||
|
||||
deferredResult = new Clipperz.Async.Deferred("Crypto.[0.2].deferredDecrypt");
|
||||
deferredResult.addCallback(Clipperz.Crypto.AES.deferredDecrypt, key, value);
|
||||
deferredResult.addCallback(function(aResult) {
|
||||
var result;
|
||||
var decryptedData;
|
||||
|
||||
decryptedData = aResult.split((256/8));
|
||||
|
||||
try {
|
||||
result = Clipperz.Base.evalJSON(decryptedData.asString());
|
||||
} catch (exception) {
|
||||
MochiKit.Logging.logError("Error while decrypting data [2]");
|
||||
throw Clipperz.Crypto.Base.exception.CorruptedMessage;
|
||||
}
|
||||
|
||||
return result;
|
||||
})
|
||||
deferredResult.callback();
|
||||
|
||||
result = deferredResult;
|
||||
} else {
|
||||
result = MochiKit.Async.succeed(null);
|
||||
}
|
||||
|
||||
return result;
|
||||
},
|
||||
|
||||
'hash': Clipperz.Crypto.SHA.sha_d256,
|
||||
|
||||
'deriveKey': function(aStringValue) {
|
||||
var byteData;
|
||||
var result;
|
||||
|
||||
byteData = new Clipperz.ByteArray(aStringValue);
|
||||
result = Clipperz.Crypto.SHA.sha_d256(byteData);
|
||||
|
||||
return result;
|
||||
}
|
||||
},
|
||||
|
||||
//#####################################################################
|
||||
|
||||
'0.3': {
|
||||
'encrypt': function(aKey, aValue, aNonce) {
|
||||
var result;
|
||||
var key, value;
|
||||
var data;
|
||||
var dataToEncrypt;
|
||||
var encryptedData;
|
||||
|
||||
key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
|
||||
value = Clipperz.Base.serializeJSON(aValue);
|
||||
data = new Clipperz.ByteArray(value);
|
||||
encryptedData = Clipperz.Crypto.AES.encrypt(key, data, aNonce);
|
||||
result = encryptedData.toBase64String();
|
||||
|
||||
return result;
|
||||
},
|
||||
|
||||
'deferredEncrypt': function(aKey, aValue, aNonce) {
|
||||
var deferredResult;
|
||||
var key, value;
|
||||
var data;
|
||||
var dataToEncrypt;
|
||||
var encryptedData;
|
||||
|
||||
key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
|
||||
value = Clipperz.Base.serializeJSON(aValue);
|
||||
data = new Clipperz.ByteArray(value);
|
||||
|
||||
deferredResult = new Clipperz.Async.Deferred("Crypto[0.3].deferredEncrypt")
|
||||
deferredResult.addCallback(Clipperz.Crypto.AES.deferredEncrypt, key, data, aNonce);
|
||||
deferredResult.addCallback(function(aResult) {
|
||||
return aResult.toBase64String();
|
||||
})
|
||||
deferredResult.callback();
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
'decrypt': function(aKey, aValue) {
|
||||
var result;
|
||||
|
||||
if (aValue != null) {
|
||||
var key, value;
|
||||
var decryptedData;
|
||||
|
||||
key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
|
||||
value = new Clipperz.ByteArray().appendBase64String(aValue);
|
||||
|
||||
decryptedData = Clipperz.Crypto.AES.decrypt(key, value);
|
||||
|
||||
value = decryptedData.asString();
|
||||
try {
|
||||
result = Clipperz.Base.evalJSON(value);
|
||||
} catch (exception) {
|
||||
MochiKit.Logging.logError("Error while decrypting data [3]");
|
||||
throw Clipperz.Crypto.Base.exception.CorruptedMessage;
|
||||
}
|
||||
} else {
|
||||
result = null;
|
||||
}
|
||||
|
||||
return result;
|
||||
},
|
||||
|
||||
'deferredDecrypt': function(aKey, aValue) {
|
||||
var deferredResult;
|
||||
|
||||
deferredResult = new Clipperz.Async.Deferred("Crypto[0.3].deferredDecrypt", {trace: false});
|
||||
// now = new Date;
|
||||
|
||||
if (aValue != null) {
|
||||
var key, value;
|
||||
// var decryptedData;
|
||||
|
||||
key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
|
||||
value = new Clipperz.ByteArray().appendBase64String(aValue);
|
||||
|
||||
deferredResult.addCallback(Clipperz.Crypto.AES.deferredDecrypt, key, value);
|
||||
deferredResult.addCallback(MochiKit.Async.wait, 0.1);
|
||||
deferredResult.addCallback(function(aResult) {
|
||||
return aResult.asString();
|
||||
});
|
||||
deferredResult.addCallback(MochiKit.Async.wait, 0.1);
|
||||
deferredResult.addCallback(Clipperz.Base.evalJSON);
|
||||
deferredResult.addErrback(function(anError) {
|
||||
MochiKit.Logging.logError("Error while decrypting data [4]");
|
||||
throw Clipperz.Crypto.Base.exception.CorruptedMessage;
|
||||
})
|
||||
} else {
|
||||
deferredResult.addCallback(function() {
|
||||
return null;
|
||||
});
|
||||
}
|
||||
deferredResult.callback();
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
'hash': Clipperz.Crypto.SHA.sha_d256,
|
||||
|
||||
'deriveKey': function(aStringValue) {
|
||||
var byteData;
|
||||
var result;
|
||||
|
||||
byteData = new Clipperz.ByteArray(aStringValue);
|
||||
result = Clipperz.Crypto.SHA.sha_d256(byteData);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
//#####################################################################
|
||||
/*
|
||||
'0.4': {
|
||||
'encrypt': function(aKey, aValue, aNonce) {
|
||||
var result;
|
||||
var key, value;
|
||||
var data;
|
||||
var dataToEncrypt;
|
||||
var encryptedData;
|
||||
|
||||
//MochiKit.Logging.logDebug(">>> [" + (new Date()).valueOf() + "] Clipperz.PM.Crypto.versions[0.3].encrypt");
|
||||
key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
|
||||
//MochiKit.Logging.logDebug("--- [" + (new Date()).valueOf() + "] Clipperz.PM.Crypto.versions[0.3].encrypt - 1");
|
||||
value = Clipperz.Base.serializeJSON(aValue);
|
||||
//MochiKit.Logging.logDebug("--- [" + (new Date()).valueOf() + "] Clipperz.PM.Crypto.versions[0.3].encrypt - 2");
|
||||
/ *
|
||||
//MochiKit.Logging.logDebug("--> encrypt.fullSize: " + value.length);
|
||||
value = value.replace(/":{"label":"/g, '":{l:"');
|
||||
value = value.replace(/":{"key":"/g, '":{k:"');
|
||||
value = value.replace(/":{"notes":"/g, '":{n:"');
|
||||
value = value.replace(/":{"record":"/g, '":{r:"');
|
||||
value = value.replace(/", "label":"/g, '",l:"');
|
||||
value = value.replace(/", "favicon":"/g, '",f:"');
|
||||
//MochiKit.Logging.logDebug("<-- encrypt.compressed: " + value.length);
|
||||
* /
|
||||
data = new Clipperz.ByteArray(value);
|
||||
//MochiKit.Logging.logDebug("--- [" + (new Date()).valueOf() + "] Clipperz.PM.Crypto.versions[0.3].encrypt - 3");
|
||||
encryptedData = Clipperz.Crypto.AES.encrypt(key, data, aNonce);
|
||||
//MochiKit.Logging.logDebug("--- [" + (new Date()).valueOf() + "] Clipperz.PM.Crypto.versions[0.3].encrypt - 4");
|
||||
result = encryptedData.toBase64String();
|
||||
//MochiKit.Logging.logDebug("<<< [" + (new Date()).valueOf() + "] Clipperz.PM.Crypto.versions[0.3].encrypt");
|
||||
|
||||
return result;
|
||||
},
|
||||
|
||||
'decrypt': function(aKey, aValue) {
|
||||
var result;
|
||||
|
||||
if (aValue != null) {
|
||||
var key, value;
|
||||
var decryptedData;
|
||||
|
||||
key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
|
||||
value = new Clipperz.ByteArray().appendBase64String(aValue);
|
||||
|
||||
decryptedData = Clipperz.Crypto.AES.decrypt(key, value);
|
||||
|
||||
value = decryptedData.asString();
|
||||
/ *
|
||||
value = value.replace(/":{l:"/g, '":{"label":"');
|
||||
value = value.replace(/":{k:"/g, '":{"key":"');
|
||||
value = value.replace(/":{n:"/g, '":{"notes":"');
|
||||
value = value.replace(/":{r:"/g, '":{"record":"');
|
||||
value = value.replace(/",l:"/g, '", "label":"');
|
||||
value = value.replace(/",f:"/g, '", "favicon":"');
|
||||
* /
|
||||
try {
|
||||
result = Clipperz.Base.evalJSON(value);
|
||||
} catch (exception) {
|
||||
MochiKit.Logging.logError("Error while decrypting data");
|
||||
throw Clipperz.Crypto.Base.exception.CorruptedMessage;
|
||||
}
|
||||
|
||||
|
||||
} else {
|
||||
result = null;
|
||||
}
|
||||
|
||||
return result;
|
||||
},
|
||||
|
||||
'hash': Clipperz.Crypto.SHA.sha_d256
|
||||
},
|
||||
*/
|
||||
//#####################################################################
|
||||
__syntaxFix__: "syntax fix"
|
||||
}
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'encrypt': function(aKey, aValue, aVersion) {
|
||||
return Clipperz.PM.Crypto.encryptingFunctions.versions[aVersion].encrypt(aKey, aValue);
|
||||
},
|
||||
|
||||
'deferredEncrypt': function(someParameters) {
|
||||
return Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters['version']].deferredEncrypt(someParameters['key'], someParameters['value']);
|
||||
},
|
||||
|
||||
//.........................................................................
|
||||
|
||||
'decrypt': function(aKey, aValue, aVersion) {
|
||||
return Clipperz.PM.Crypto.encryptingFunctions.versions[aVersion].decrypt(aKey, aValue);
|
||||
},
|
||||
|
||||
'deferredDecrypt': function(someParameters) {
|
||||
return Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters['version']].deferredDecrypt(someParameters['key'], someParameters['value']);
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'hash': function(aValue) {
|
||||
return Clipperz.PM.Crypto.encryptingFunctions.versions[Clipperz.PM.Crypto.encryptingFunctions.currentVersion]['hash'](aValue);
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'randomKey': function() {
|
||||
return Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2);
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'deriveKey': function(aValue) {
|
||||
return Clipperz.PM.Crypto.encryptingFunctions.versions[Clipperz.PM.Crypto.encryptingFunctions.currentVersion].deriveKey(aValue);
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'passwordEntropy': function(aValue) {
|
||||
var result;
|
||||
var bitPerChar;
|
||||
|
||||
bitPerChar = 4;
|
||||
if (/[a-z]/.test(aValue)) {
|
||||
bitPerChar ++;
|
||||
}
|
||||
if (/[A-Z]/.test(aValue)) {
|
||||
bitPerChar ++;
|
||||
}
|
||||
if (/[^a-zA-Z0-9]/.test(aValue)) {
|
||||
bitPerChar ++;
|
||||
}
|
||||
|
||||
result = aValue.length * bitPerChar;
|
||||
|
||||
return result;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'nullValue': '####',
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
__syntaxFix__: "syntax fix"
|
||||
|
||||
});
|
||||
|
||||
//*****************************************************************************
|
||||
|
||||
//MochiKit.Base.update(Clipperz.PM.Connection.communicationProtocol.versions, {
|
||||
// 'current': Clipperz.PM.Connection.communicationProtocol.versions[Clipperz.PM.Connection.communicationProtocol.currentVersion]
|
||||
//});
|
||||
|
||||
MochiKit.Base.update(Clipperz.PM.Crypto.encryptingFunctions.versions, {
|
||||
'current': Clipperz.PM.Crypto.encryptingFunctions.versions[Clipperz.PM.Crypto.encryptingFunctions.currentVersion]
|
||||
});
|
||||
|
||||
//*****************************************************************************
|
||||
1076
frontend/gamma/js/Clipperz/PM/DataModel/DirectLogin.js
Normal file
1076
frontend/gamma/js/Clipperz/PM/DataModel/DirectLogin.js
Normal file
File diff suppressed because it is too large
Load Diff
125
frontend/gamma/js/Clipperz/PM/DataModel/DirectLoginBinding.js
Normal file
125
frontend/gamma/js/Clipperz/PM/DataModel/DirectLoginBinding.js
Normal file
@@ -0,0 +1,125 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
|
||||
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
|
||||
if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; }
|
||||
|
||||
|
||||
//#############################################################################
|
||||
|
||||
Clipperz.PM.DataModel.DirectLoginBinding = function(aDirectLogin, args) {
|
||||
args = args || {};
|
||||
|
||||
this._directLogin = aDirectLogin|| Clipperz.Base.exception.raise('MandatoryParameter');
|
||||
|
||||
this._key = args.key || Clipperz.Base.exception.raise('MandatoryParameter');
|
||||
this._fieldKey = args.field || /* this.directLogin().fieldWithName(args.fieldName).reference() || */ null;
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
Clipperz.PM.DataModel.DirectLoginBinding.prototype = MochiKit.Base.update(null, {
|
||||
|
||||
'toString': function() {
|
||||
return "DirectLoginBinding (" + this.key() + ", " + this.fieldKey() + ")";
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'directLogin': function () {
|
||||
return this._directLogin;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'key': function() {
|
||||
return this._key;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'fieldKey': function() {
|
||||
return this._fieldKey;
|
||||
},
|
||||
|
||||
'setFieldKey': function(aValue) {
|
||||
this._fieldKey = aValue;
|
||||
|
||||
return this.directLogin().setValue('bindingData' + '.' + this.key(), aValue);
|
||||
},
|
||||
|
||||
// 'fieldName': function() {
|
||||
// return this._fieldName;
|
||||
// },
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'field': function() {
|
||||
var deferredResult;
|
||||
|
||||
if (this.fieldKey() != null) {
|
||||
deferredResult = Clipperz.Async.callbacks("DirectLoginBinding.field [1]", [
|
||||
MochiKit.Base.method(this.directLogin().record(), 'fields'),
|
||||
MochiKit.Base.itemgetter(this.fieldKey())
|
||||
], {trace:false});
|
||||
// } else if (this.fieldName() != null) {
|
||||
// WTF = TODO;
|
||||
// result = this.directLogin().record().fieldWithName(this.fieldName());
|
||||
//
|
||||
// this.setFieldKey(result.key());
|
||||
} else {
|
||||
deferredResult = MochiKit.Async.succeed(null);
|
||||
}
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
'setField': function (aField) {
|
||||
this.setFieldKey(aField.reference());
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
/*
|
||||
'fieldValue': function () {
|
||||
return Clipperz.Async.callbacks("DirectLoginBinding.fieldValue", [
|
||||
MochiKit.Base.method('field'),
|
||||
MochiKit.Base.methodcaller('value')
|
||||
], {trace:false});
|
||||
},
|
||||
*/
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'serializedData': function() {
|
||||
return this.fieldKey();
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
__syntaxFix__: "syntax fix"
|
||||
});
|
||||
|
||||
107
frontend/gamma/js/Clipperz/PM/DataModel/DirectLoginFormValue.js
Normal file
107
frontend/gamma/js/Clipperz/PM/DataModel/DirectLoginFormValue.js
Normal file
@@ -0,0 +1,107 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
|
||||
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
|
||||
if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; }
|
||||
|
||||
|
||||
//#############################################################################
|
||||
|
||||
Clipperz.PM.DataModel.DirectLoginFormValue = function(aDirectLogin, args) {
|
||||
args = args || {};
|
||||
|
||||
this._directLogin = aDirectLogin|| Clipperz.Base.exception.raise('MandatoryParameter');
|
||||
|
||||
this._key = args.key || Clipperz.Base.exception.raise('MandatoryParameter');
|
||||
this._fieldOptions = args.fieldOptions || Clipperz.Base.exception.raise('MandatoryParameter');
|
||||
this._value = args.value || null;
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
Clipperz.PM.DataModel.DirectLoginFormValue.prototype = MochiKit.Base.update(null, {
|
||||
|
||||
'toString': function() {
|
||||
return "DirectLoginFormValue (" + this.key() + ", " + this.value() + ")";
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'directLogin': function () {
|
||||
return this._directLogin;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'key': function() {
|
||||
return this._key;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'fieldOptions': function() {
|
||||
return this._fieldOptions;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'type': function () {
|
||||
return this.fieldOptions()['type'];
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'value': function() {
|
||||
var result;
|
||||
|
||||
result = this._value;
|
||||
|
||||
// if ((result == null) && (this.type() == 'checkbox')) {
|
||||
// result = false;
|
||||
// };
|
||||
|
||||
return result;
|
||||
},
|
||||
|
||||
'setValue': function (aValue) {
|
||||
//console.log("DirectLoginFormValue.setValue", aValue);
|
||||
this._value = aValue;
|
||||
return this.directLogin().setValue('formValues' + '.' + this.key(), aValue);
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
/*
|
||||
'serializedData': function() {
|
||||
return this.value();
|
||||
},
|
||||
*/
|
||||
//-------------------------------------------------------------------------
|
||||
__syntaxFix__: "syntax fix"
|
||||
});
|
||||
|
||||
203
frontend/gamma/js/Clipperz/PM/DataModel/DirectLoginInput.js
Normal file
203
frontend/gamma/js/Clipperz/PM/DataModel/DirectLoginInput.js
Normal file
@@ -0,0 +1,203 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
|
||||
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
|
||||
if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; }
|
||||
|
||||
//#############################################################################
|
||||
|
||||
Clipperz.PM.DataModel.DirectLoginInput = function(args) {
|
||||
this._args = args;
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
Clipperz.PM.DataModel.DirectLoginInput.prototype = MochiKit.Base.update(null, {
|
||||
|
||||
'args': function() {
|
||||
return this._args;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'name': function() {
|
||||
return this.args()['name'];
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'type': function() {
|
||||
var result;
|
||||
|
||||
result = this.args()['type'];
|
||||
|
||||
if (result != null) {
|
||||
result = result.toLowerCase();
|
||||
}
|
||||
return result;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'options': function() {
|
||||
return this.args()['options'];
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'value': function() {
|
||||
return this.args()['value'];
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
/*
|
||||
'formConfiguration': function(someFormValues, someBindings, someFields) {
|
||||
var result;
|
||||
//console.log("### DirectLoginInput.formConfiguration", someFields);
|
||||
if (this.shouldSetValue()) {
|
||||
switch (this.type()) {
|
||||
case 'select':
|
||||
var currentValue;
|
||||
var options;
|
||||
|
||||
// currentValue = this.directLogin()._configuration['formValues'][this.name()];
|
||||
currentValue = someFormValues[this.name()];
|
||||
options = this.args()['options'];
|
||||
|
||||
result = MochiKit.DOM.SELECT({name:this.name()},
|
||||
MochiKit.Base.map(function(anOption) {
|
||||
var options;
|
||||
|
||||
options = {value:anOption['value']};
|
||||
if (currentValue == anOption['value']) {
|
||||
options.selected = true;
|
||||
}
|
||||
|
||||
return MochiKit.DOM.OPTION(options, anOption['label'])
|
||||
}, options)
|
||||
)
|
||||
break;
|
||||
case 'checkbox':
|
||||
var options;
|
||||
|
||||
options = {type:'checkbox', name: this.name()};
|
||||
// if (this.directLogin()._configuration['formValues'][this.name()] == true) {
|
||||
if (someFormValues[this.name()] == true) {
|
||||
options['checked'] = true;
|
||||
};
|
||||
|
||||
result = MochiKit.DOM.INPUT(options, null);
|
||||
break;
|
||||
case 'radio':
|
||||
var currentName;
|
||||
var currentValue;
|
||||
var options;
|
||||
|
||||
currentName = this.name();
|
||||
// currentValue = this.directLogin()._configuration['formValues'][this.name()];
|
||||
currentValue = someFormValues[this.name()];
|
||||
options = this.args()['options'];
|
||||
|
||||
result = MochiKit.DOM.DIV(null,
|
||||
MochiKit.Base.map(function(anOption) {
|
||||
var options;
|
||||
var isChecked;
|
||||
var inputNode;
|
||||
var divNode;
|
||||
|
||||
options = {type:'radio', name:currentName, value:anOption['value']}
|
||||
isChecked = (currentValue == anOption['value']);
|
||||
if (isChecked) {
|
||||
options.checked = true;
|
||||
}
|
||||
|
||||
if (Clipperz_IEisBroken == true) {
|
||||
var checkedValue;
|
||||
|
||||
checkedValue = (isChecked ? " CHECKED" : "");
|
||||
inputNode = MochiKit.DOM.currentDocument().createElement("<INPUT TYPE='RADIO' NAME='" + currentName + "' VALUE='" + anOption['value'] + "'" + checkedValue + ">");
|
||||
} else {
|
||||
inputNode = MochiKit.DOM.INPUT(options, anOption['value']);
|
||||
}
|
||||
divNode = MochiKit.DOM.DIV(null, inputNode);
|
||||
|
||||
return divNode;
|
||||
}, options)
|
||||
);
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
var binding;
|
||||
// binding = this.directLogin().bindings()[this.name()];
|
||||
binding = someBindings[this.name()];
|
||||
|
||||
//console.log("### binding", binding);
|
||||
//if (binding != null) {
|
||||
/// console.log(" binding.field()", binding.field());
|
||||
/// console.log(" binding.field().value()", binding.field().value());
|
||||
// console.log(" someFields[binding.fieldKey()].value()", someFields[binding.fieldKey()].value());
|
||||
//}
|
||||
result = MochiKit.DOM.INPUT({
|
||||
type:((this.type() != 'password') ? this.type() : 'text'),
|
||||
name:this.name(),
|
||||
// value:((binding != null)? binding.field().value() : this.value())
|
||||
value:((binding != null)? someFields[binding.fieldKey()]['value'] : this.value())
|
||||
// value:((binding != null)? someFields[binding.fieldKey()].value() : this.value())
|
||||
}, null);
|
||||
}
|
||||
|
||||
return result;
|
||||
},
|
||||
*/
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'needsFormValue': function() {
|
||||
var type;
|
||||
var result;
|
||||
|
||||
type = this.type();
|
||||
result = ((type == 'checkbox') || (type == 'radio') || (type == 'select'));
|
||||
|
||||
return result;
|
||||
},
|
||||
|
||||
'needsBinding': function() {
|
||||
var type;
|
||||
var result;
|
||||
|
||||
type = this.type();
|
||||
result = ((type == 'text') || (type == 'password'));
|
||||
|
||||
return result;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
__syntaxFix__: "syntax fix"
|
||||
});
|
||||
|
||||
551
frontend/gamma/js/Clipperz/PM/DataModel/EncryptedRemoteObject.js
Normal file
551
frontend/gamma/js/Clipperz/PM/DataModel/EncryptedRemoteObject.js
Normal file
@@ -0,0 +1,551 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
try { if (typeof(Clipperz.KeyValueObjectStore) == 'undefined') { throw ""; }} catch (e) {
|
||||
throw "Clipperz.PM.DataModel.EncryptedRemoteObject depends on Clipperz.KeyValueObjectStore!";
|
||||
}
|
||||
|
||||
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
|
||||
if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; }
|
||||
|
||||
Clipperz.PM.DataModel.EncryptedRemoteObject = function(args) {
|
||||
args = args || {};
|
||||
|
||||
this._name = args.name || null;
|
||||
this._reference = args.reference || Clipperz.PM.Crypto.randomKey();
|
||||
this._isBrandNew = ((args.reference == null) && (args.remoteData == null));
|
||||
|
||||
if ((this._isBrandNew == false) && (args['retrieveKeyFunction'] == null)) {
|
||||
Clipperz.Base.exception.raise('MandatoryParameter');
|
||||
} else {
|
||||
this._retrieveKeyFunction = args['retrieveKeyFunction'];
|
||||
}
|
||||
|
||||
this._retrieveRemoteDataFunction = args.retrieveRemoteDataFunction || null;
|
||||
this._remoteData = args.remoteData || null;
|
||||
// this._remoteData = args.remoteData ? Clipperz.Base.deepClone(args.remoteData) : null;
|
||||
if ((!this._isBrandNew) && ((this._retrieveRemoteDataFunction == null) && (this._remoteData == null))) {
|
||||
Clipperz.Base.exception.raise('MandatoryParameter');
|
||||
}
|
||||
|
||||
|
||||
this._encryptedDataKeypath = args.encryptedDataKeypath || 'data'; //Clipperz.Base.exception.raise('MandatoryParameter');
|
||||
this._encryptedVersionKeypath = args.encryptedVersionKeypath || 'version'; //Clipperz.Base.exception.raise('MandatoryParameter');
|
||||
|
||||
|
||||
this._transientState = null;
|
||||
this._deferredLocks = {};
|
||||
|
||||
if (this._isBrandNew == true) {
|
||||
this._objectDataStore = new Clipperz.KeyValueObjectStore(/*{'name':'EncryptedRemoteObject.objectDataStore [1]'}*/);
|
||||
} else {
|
||||
this._objectDataStore = null;
|
||||
}
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
//
|
||||
// Basic data workflow
|
||||
// =======================
|
||||
//
|
||||
// getRemoteData
|
||||
// unpackRemoteData
|
||||
// getDecryptData [encryptedDataKeypath, encryptedVersionKeypath]
|
||||
// unpackData
|
||||
//
|
||||
//
|
||||
// ?? packData
|
||||
// ?? encryptDataWithKey
|
||||
// ?? packRemoteData [encryptedDataKeypath (?), encryptedVersionKeypath (?)]
|
||||
//
|
||||
|
||||
Clipperz.PM.DataModel.EncryptedRemoteObject.prototype = MochiKit.Base.update(null, {
|
||||
|
||||
'toString': function () {
|
||||
return "Clipperz.PM.DataModel.EncryptedRemoteObject" + (this.name() != null ? " - " + this.name() : "");
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'name': function () {
|
||||
return this._name;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'reference': function () {
|
||||
return this._reference;
|
||||
},
|
||||
|
||||
'setReference': function (aValue) {
|
||||
this._reference = aValue;
|
||||
|
||||
return this._reference;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'transientState': function () {
|
||||
if (this._transientState == null) {
|
||||
this._transientState = new Clipperz.KeyValueObjectStore(/*{'name':'EncryptedRemoteObject.transientState [2]'}*/);
|
||||
}
|
||||
|
||||
return this._transientState;
|
||||
},
|
||||
|
||||
'resetTransientState': function (isCommitting) {
|
||||
if (this._transientState != null) {
|
||||
this._transientState.removeAllData();
|
||||
}
|
||||
|
||||
this._transientState = null;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'isBrandNew': function () {
|
||||
return this._isBrandNew;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'getKey': function () {
|
||||
var deferredResult;
|
||||
var deferredLock;
|
||||
|
||||
deferredLock = this.getDeferredLockForKey('key');
|
||||
|
||||
deferredResult = new Clipperz.Async.Deferred("EncryptedRemoteObject.getKey", {trace:false});
|
||||
deferredResult.acquireLock(deferredLock);
|
||||
deferredResult.addMethod(
|
||||
this.decryptedDataStore(),
|
||||
'deferredGetOrSet',
|
||||
'decryptionKey',
|
||||
MochiKit.Base.partial(this.retrieveKeyFunction(), this.reference())
|
||||
);
|
||||
deferredResult.releaseLock(deferredLock);
|
||||
deferredResult.callback();
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
// . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
|
||||
|
||||
'retrieveKeyFunction': function () {
|
||||
return this._retrieveKeyFunction;
|
||||
},
|
||||
|
||||
'setRetrieveKeyFunction': function (aFunction) {
|
||||
this._retrieveKeyFunction = aFunction;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'hasLoadedRemoteData': function () {
|
||||
return (this._remoteData != null);
|
||||
},
|
||||
|
||||
'getRemoteData': function () {
|
||||
var deferredResult;
|
||||
var deferredLock;
|
||||
|
||||
deferredLock = this.getDeferredLockForKey('remoteData');
|
||||
|
||||
deferredResult = new Clipperz.Async.Deferred("EncryptedRemoteObjects.getRemoteData", {trace:false});
|
||||
deferredResult.acquireLock(deferredLock);
|
||||
deferredResult.addCallback(MochiKit.Base.bind(function () {
|
||||
var innerDeferredResult;
|
||||
|
||||
if (this._remoteData != null) {
|
||||
innerDeferredResult = MochiKit.Async.succeed(this._remoteData);
|
||||
} else {
|
||||
innerDeferredResult = Clipperz.Async.callbacks("EncryptedRemoteObjects.getRemoteData <inner deferred>", [
|
||||
MochiKit.Base.partial(this.retrieveRemoteDataFunction(), this.reference()),
|
||||
MochiKit.Base.method(this, 'unpackRemoteData'),
|
||||
MochiKit.Base.bind(function (someData) {
|
||||
this._remoteData = someData;
|
||||
return this._remoteData;
|
||||
}, this)
|
||||
], {trace:false});
|
||||
}
|
||||
|
||||
return innerDeferredResult;
|
||||
}, this))
|
||||
deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
|
||||
deferredResult.releaseLock(deferredLock);
|
||||
|
||||
deferredResult.callback();
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'unpackRemoteData': function (someData) {
|
||||
return MochiKit.Async.succeed(someData);
|
||||
},
|
||||
|
||||
//.........................................................................
|
||||
|
||||
'packRemoteData': function (someData) {
|
||||
var result;
|
||||
|
||||
result = {
|
||||
'reference': this.reference(),
|
||||
'data': someData,
|
||||
'version': Clipperz.PM.Crypto.encryptingFunctions.currentVersion
|
||||
};
|
||||
|
||||
return MochiKit.Async.succeed(result);
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'retrieveRemoteDataFunction': function () {
|
||||
return this._retrieveRemoteDataFunction;
|
||||
},
|
||||
|
||||
'setRetrieveRemoteDataFunction': function (aFunction) {
|
||||
this._retrieveRemoteDataFunction = aFunction;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'decryptedDataStore': function () {
|
||||
if (this._decryptedDataStore == null) {
|
||||
this._decryptedDataStore = new Clipperz.KeyValueObjectStore(/*{'name':'EncryptedRemoteObject.decryptedDataStore [3]'}*/);
|
||||
};
|
||||
|
||||
return this._decryptedDataStore;
|
||||
},
|
||||
|
||||
//.........................................................................
|
||||
|
||||
'getDecryptedData': function () {
|
||||
var deferredResult;
|
||||
var deferredLock;
|
||||
|
||||
deferredLock = this.getDeferredLockForKey('decryptedData');
|
||||
|
||||
deferredResult = new Clipperz.Async.Deferred("EncryptedRemoteObject.getDecryptedData", {trace:false});
|
||||
deferredResult.acquireLock(deferredLock);
|
||||
deferredResult.addMethod(this, 'decryptedDataStore');
|
||||
deferredResult.addCallback(MochiKit.Base.methodcaller('deferredGetOrSet', 'decryptedData', MochiKit.Base.bind(function () {
|
||||
var innerDeferredResult;
|
||||
|
||||
innerDeferredResult = new Clipperz.Async.Deferred("EncryptedRemoteObject.getDecryptedData <inner deferred>", {trace:false});
|
||||
|
||||
innerDeferredResult.addMethod(this, 'getRemoteData');
|
||||
innerDeferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
|
||||
innerDeferredResult.collectResults({
|
||||
'key': MochiKit.Base.method(this, 'getKey'),
|
||||
'value': MochiKit.Base.itemgetter(this._encryptedDataKeypath),
|
||||
'version': MochiKit.Base.itemgetter(this._encryptedVersionKeypath)
|
||||
});
|
||||
|
||||
innerDeferredResult.addCallback(Clipperz.PM.Crypto.deferredDecrypt);
|
||||
innerDeferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
|
||||
innerDeferredResult.addMethod(this, 'unpackData');
|
||||
innerDeferredResult.callback();
|
||||
|
||||
return innerDeferredResult;
|
||||
}, this)));
|
||||
deferredResult.releaseLock(deferredLock);
|
||||
deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
|
||||
deferredResult.callback();
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'setValue': function(aKey, aValue) {
|
||||
var deferredResult;
|
||||
|
||||
deferredResult = new Clipperz.Async.Deferred("EncryptedRemoteObject.setValue", {trace:false});
|
||||
deferredResult.addMethod(this, '_getObjectDataStore');
|
||||
deferredResult.addCallback(MochiKit.Base.methodcaller('setValue', aKey, aValue));
|
||||
deferredResult.callback();
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//.........................................................................
|
||||
|
||||
'getValue': function (aKey) {
|
||||
return Clipperz.Async.callbacks("EncryptedRemoteObject.getValue", [
|
||||
MochiKit.Base.method(this, '_getObjectDataStore'),
|
||||
MochiKit.Base.methodcaller('getValue', aKey)
|
||||
], {trace:false});
|
||||
},
|
||||
|
||||
//.........................................................................
|
||||
|
||||
'removeValue': function (aKey) {
|
||||
return Clipperz.Async.callbacks("EncryptedRemoteObject.removeValue", [
|
||||
MochiKit.Base.method(this, '_getObjectDataStore'),
|
||||
MochiKit.Base.methodcaller('removeValue', aKey)
|
||||
], {trace:false});
|
||||
},
|
||||
|
||||
//.........................................................................
|
||||
|
||||
'values': function () {
|
||||
return Clipperz.Async.callbacks("EncryptedRemoteObject.values", [
|
||||
MochiKit.Base.method(this, '_getObjectDataStore'),
|
||||
MochiKit.Base.methodcaller('values')
|
||||
], {trace:false});
|
||||
},
|
||||
|
||||
'setValues': function (someValues) {
|
||||
return Clipperz.Async.callbacks("EncryptedRemoteObject.values", [
|
||||
MochiKit.Base.method(this, '_getObjectDataStore'),
|
||||
MochiKit.Base.methodcaller('setValues', someValues)
|
||||
], {trace:false});
|
||||
},
|
||||
|
||||
//.........................................................................
|
||||
|
||||
'_getObjectDataStore': function () {
|
||||
var deferredResult;
|
||||
var deferredLock;
|
||||
|
||||
deferredLock = this.getDeferredLockForKey('objectDataStore');
|
||||
|
||||
deferredResult = new Clipperz.Async.Deferred("EncryptedRemoteObject._getObjectDataStore", {trace:false});
|
||||
deferredResult.acquireLock(deferredLock);
|
||||
deferredResult.addCallback(MochiKit.Base.bind(function () {
|
||||
var innerDeferredResult;
|
||||
|
||||
if (this._objectDataStore == null) {
|
||||
this._objectDataStore = new Clipperz.KeyValueObjectStore(/*{'name':'EncryptedRemoteObject.objectDataStore [4]'}*/);
|
||||
|
||||
innerDeferredResult = new Clipperz.Async.Deferred("EncryptedRemoteObject._getObjectDataStore <inner deferred>", {trace:false});
|
||||
innerDeferredResult.addMethod(this, 'getDecryptedData');
|
||||
innerDeferredResult.addMethod(this._objectDataStore, 'initWithValues');
|
||||
innerDeferredResult.callback();
|
||||
} else {
|
||||
innerDeferredResult = MochiKit.Async.succeed(this._objectDataStore);
|
||||
}
|
||||
|
||||
return innerDeferredResult;
|
||||
}, this));
|
||||
deferredResult.releaseLock(deferredLock);
|
||||
deferredResult.callback();
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
'hasInitiatedObjectDataStore': function () {
|
||||
return (this._objectDataStore != null);
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'getDeferredLockForKey': function (aKey) {
|
||||
var result;
|
||||
|
||||
result = this._deferredLocks[aKey];
|
||||
|
||||
if (typeof(result) == 'undefined') {
|
||||
result = new MochiKit.Async.DeferredLock();
|
||||
this._deferredLocks[aKey] = result;
|
||||
}
|
||||
|
||||
return result;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'unpackData': function (someData) { // ++
|
||||
return someData;
|
||||
},
|
||||
|
||||
'packData': function (someData) { // ++
|
||||
return someData;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'hasPendingChanges': function () {
|
||||
var deferredResult;
|
||||
var tempObj = this;
|
||||
|
||||
if (this.isBrandNew()) {
|
||||
// deferredResult = MochiKit.Async.succeed(true);
|
||||
deferredResult = this.hasPendingChangesWhenBrandNew();
|
||||
} else if (this.hasInitiatedObjectDataStore()) {
|
||||
deferredResult = new Clipperz.Async.Deferred("EncryptedRemoteObject.hasPendingChanges", {trace:false});
|
||||
deferredResult.collectResults({
|
||||
'decryptedData': [
|
||||
MochiKit.Base.method(this, 'getDecryptedData'),
|
||||
Clipperz.Base.serializeJSON
|
||||
],
|
||||
'objectData': [
|
||||
MochiKit.Base.method(this, '_getObjectDataStore'),
|
||||
MochiKit.Base.methodcaller('values'),
|
||||
Clipperz.Base.serializeJSON
|
||||
]
|
||||
});
|
||||
deferredResult.addCallback(function (someValues) {
|
||||
//if (someValues['decryptedData'] != someValues['objectData']) {
|
||||
// console.log("ORIGINAL DATA", '[[[' + someValues['decryptedData'] + ']]]');
|
||||
// console.log("CURRENT DATA", '>>>' + someValues['objectData'] + '<<<');
|
||||
//}
|
||||
return (someValues['decryptedData'] != someValues['objectData']);
|
||||
});
|
||||
deferredResult.callback();
|
||||
} else {
|
||||
deferredResult = MochiKit.Async.succeed(false);
|
||||
}
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
'hasPendingChangesWhenBrandNew': function () {
|
||||
return MochiKit.Async.succeed(true);
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'commitTransientState': function () {
|
||||
var deferredResult;
|
||||
|
||||
// if (this.transientState().getValue('__prepareRemoteData') == true) {
|
||||
if (this.transientState().getValue('packedRemoteData') != null) {
|
||||
deferredResult = Clipperz.Async.callbacks("EncryptedRemoteObject.commitTransientState - prepareRemoteData", [
|
||||
MochiKit.Base.bind(function (someData) {
|
||||
this._remoteData = this.transientState().getValue('packedRemoteData');
|
||||
}, this),
|
||||
|
||||
MochiKit.Base.method(this, '_getObjectDataStore'),
|
||||
MochiKit.Base.methodcaller('values'),
|
||||
Clipperz.Base.deepClone,
|
||||
MochiKit.Base.method(this.decryptedDataStore(), 'setValue', 'decryptedData'),
|
||||
|
||||
MochiKit.Base.method(this, 'resetTransientState', true)
|
||||
], {trace:false});
|
||||
|
||||
} else {
|
||||
deferredResult = Clipperz.Async.callbacks("EncryptedRemoteObject.commitTransientState - NO prepareRemoteData", [
|
||||
MochiKit.Base.method(this, 'resetTransientState', true)
|
||||
], {trace:false});
|
||||
}
|
||||
|
||||
this._isBrandNew = false;
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'revertChanges': function () {
|
||||
if (this.hasInitiatedObjectDataStore()) {
|
||||
this._objectDataStore.removeAllData();
|
||||
this._objectDataStore = null;
|
||||
}
|
||||
this.resetTransientState(false);
|
||||
|
||||
return MochiKit.Async.succeed();
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'deleteAllCleanTextData': function () {
|
||||
var deferredResult;
|
||||
|
||||
deferredResult = new Clipperz.Async.Deferred("EncryptedRemoteObject.deleteAllCleanTextData", {trace:false});
|
||||
|
||||
deferredResult.addMethod(this, 'resetTransientState', false);
|
||||
|
||||
deferredResult.acquireLock(this.getDeferredLockForKey('decryptedData'));
|
||||
deferredResult.addCallback(MochiKit.Base.bind(function () {
|
||||
if (this._decryptedDataStore != null) {
|
||||
this._decryptedDataStore.removeAllData();
|
||||
}
|
||||
}, this));
|
||||
deferredResult.releaseLock(this.getDeferredLockForKey('decryptedData'));
|
||||
|
||||
deferredResult.acquireLock(this.getDeferredLockForKey('objectDataStore'));
|
||||
deferredResult.addCallback(MochiKit.Base.bind(function () {
|
||||
if (this._objectDataStore != null) {
|
||||
this._objectDataStore.removeAllData();
|
||||
this._objectDataStore = null;
|
||||
}
|
||||
}, this));
|
||||
deferredResult.releaseLock(this.getDeferredLockForKey('objectDataStore'));
|
||||
|
||||
deferredResult.callback();
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//.........................................................................
|
||||
|
||||
'hasAnyCleanTextData': function () {
|
||||
var result;
|
||||
|
||||
result = false;
|
||||
|
||||
result = result || (! this.decryptedDataStore().isEmpty());
|
||||
result = result || (! this.transientState().isEmpty());
|
||||
if (this.hasInitiatedObjectDataStore()) {
|
||||
result = result || (! this._objectDataStore.isEmpty());
|
||||
}
|
||||
|
||||
return MochiKit.Async.succeed(result);
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'prepareRemoteDataWithKey': function (aKey) {
|
||||
return Clipperz.Async.callbacks("EncryptedRemoteObject.prepareRemoteDataWithKey", [
|
||||
// MochiKit.Base.method(this.transientState(), 'setValue', '__prepareRemoteData', true),
|
||||
MochiKit.Base.method(this, '_getObjectDataStore'),
|
||||
MochiKit.Base.methodcaller('values'),
|
||||
MochiKit.Base.method(this, 'packData'),
|
||||
function (someData) {
|
||||
return Clipperz.PM.Crypto.deferredEncrypt({
|
||||
'key': aKey,
|
||||
'value': someData,
|
||||
'version': Clipperz.PM.Crypto.encryptingFunctions.currentVersion
|
||||
})
|
||||
},
|
||||
MochiKit.Base.method(this, 'packRemoteData'),
|
||||
MochiKit.Base.method(this.transientState(), 'setValue', 'packedRemoteData'),
|
||||
function (someData) {
|
||||
MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'advanceProgress');
|
||||
return someData;
|
||||
}
|
||||
], {trace:false});
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
__syntaxFix__: "syntax fix"
|
||||
});
|
||||
357
frontend/gamma/js/Clipperz/PM/DataModel/OneTimePassword.js
Normal file
357
frontend/gamma/js/Clipperz/PM/DataModel/OneTimePassword.js
Normal file
@@ -0,0 +1,357 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
|
||||
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
|
||||
if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; }
|
||||
|
||||
|
||||
//#############################################################################
|
||||
|
||||
Clipperz.PM.DataModel.OneTimePassword = function(args) {
|
||||
args = args || {};
|
||||
|
||||
// this._user = args['user'];
|
||||
this._reference = args['reference'] || Clipperz.PM.Crypto.randomKey();
|
||||
this._password = args['password'];
|
||||
this._passwordValue = Clipperz.PM.DataModel.OneTimePassword.normalizedOneTimePassword(args['password']);
|
||||
this._creationDate = args['created'] ? Clipperz.PM.Date.parseDateWithUTCFormat(args['created']) : new Date();
|
||||
this._usageDate = args['used'] ? Clipperz.PM.Date.parseDateWithUTCFormat(args['used']) : null;
|
||||
|
||||
this._status = args['status'] || 'ACTIVE'; // 'REQUESTED', 'USED', 'DISABLED'
|
||||
this._connectionInfo= null;
|
||||
|
||||
this._key = null;
|
||||
this._keyChecksum = null;
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
Clipperz.PM.DataModel.OneTimePassword.prototype = MochiKit.Base.update(null, {
|
||||
|
||||
'toString': function() {
|
||||
return "Clipperz.PM.DataModel.OneTimePassword";
|
||||
},
|
||||
/*
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'user': function() {
|
||||
return this._user;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'password': function() {
|
||||
return this._password;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'passwordValue': function() {
|
||||
return this._passwordValue;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'creationDate': function() {
|
||||
return this._creationDate;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'reference': function() {
|
||||
return this._reference;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'key': function() {
|
||||
if (this._key == null) {
|
||||
this._key = Clipperz.PM.DataModel.OneTimePassword.computeKeyWithUsernameAndPassword(this.user().username(), this.passwordValue());
|
||||
}
|
||||
|
||||
return this._key;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'keyChecksum': function() {
|
||||
if (this._keyChecksum == null) {
|
||||
this._keyChecksum = Clipperz.PM.DataModel.OneTimePassword.computeKeyChecksumWithUsernameAndPassword(this.user().username(), this.passwordValue());
|
||||
}
|
||||
|
||||
return this._keyChecksum;
|
||||
},
|
||||
*/
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'status': function() {
|
||||
return this._status;
|
||||
},
|
||||
|
||||
'setStatus': function(aValue) {
|
||||
this._status = aValue;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
/*
|
||||
'serializedData': function() {
|
||||
var result;
|
||||
|
||||
result = {
|
||||
'password': this.password(),
|
||||
'created': this.creationDate() ? Clipperz.PM.Date.formatDateWithUTCFormat(this.creationDate()) : null,
|
||||
'used': this.usageDate() ? Clipperz.PM.Date.formatDateWithUTCFormat(this.usageDate()) : null,
|
||||
'status': this.status()
|
||||
};
|
||||
|
||||
return result;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'packedPassphrase': function() {
|
||||
var result;
|
||||
var packedPassphrase;
|
||||
var encodedPassphrase;
|
||||
var prefixPadding;
|
||||
var suffixPadding;
|
||||
var getRandomBytes;
|
||||
|
||||
getRandomBytes = MochiKit.Base.method(Clipperz.Crypto.PRNG.defaultRandomGenerator(), 'getRandomBytes');
|
||||
|
||||
encodedPassphrase = new Clipperz.ByteArray(this.user().passphrase()).toBase64String();
|
||||
//MochiKit.Logging.logDebug("--- encodedPassphrase.length: " + encodedPassphrase.length);
|
||||
prefixPadding = getRandomBytes(getRandomBytes(1).byteAtIndex(0)).toBase64String();
|
||||
//MochiKit.Logging.logDebug("--- prefixPadding.length: " + prefixPadding.length);
|
||||
suffixPadding = getRandomBytes((500 - prefixPadding.length - encodedPassphrase.length) * 6 / 8).toBase64String();
|
||||
//MochiKit.Logging.logDebug("--- suffixPadding.length: " + suffixPadding.length);
|
||||
//MochiKit.Logging.logDebug("--- total.length: " + (prefixPadding.length + encodedPassphrase.length + suffixPadding.length));
|
||||
|
||||
packedPassphrase = {
|
||||
'prefix': prefixPadding,
|
||||
'passphrase': encodedPassphrase,
|
||||
'suffix': suffixPadding
|
||||
};
|
||||
|
||||
// result = Clipperz.Base.serializeJSON(packedPassphrase);
|
||||
result = packedPassphrase;
|
||||
//MochiKit.Logging.logDebug("===== OTP packedPassprase: [" + result.length + "]" + result);
|
||||
//MochiKit.Logging.logDebug("<<< OneTimePassword.packedPassphrase");
|
||||
|
||||
return result;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'encryptedPackedPassphrase': function() {
|
||||
return Clipperz.PM.Crypto.deferredEncryptWithCurrentVersion(this.passwordValue(), this.packedPassphrase())
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'encryptedData': function() {
|
||||
var deferredResult;
|
||||
var result;
|
||||
|
||||
//MochiKit.Logging.logDebug(">>> OneTimePassword.encryptedData");
|
||||
//MochiKit.Logging.logDebug("--- OneTimePassword.encryptedData - id: " + this.reference());
|
||||
result = {
|
||||
'reference': this.reference(),
|
||||
'key': this.key(),
|
||||
'keyChecksum': this.keyChecksum(),
|
||||
'data': "",
|
||||
'version': Clipperz.PM.Crypto.encryptingFunctions.currentVersion
|
||||
}
|
||||
//MochiKit.Logging.logDebug("--- OneTimePassword.encryptedData - 2: " + Clipperz.Base.serializeJSON(result));
|
||||
deferredResult = new MochiKit.Async.Deferred();
|
||||
//MochiKit.Logging.logDebug("--- OneTimePassword.encryptedData - 3");
|
||||
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("OneTimePassword.encryptedData - 1: " + res); return res;});
|
||||
//# deferredResult.addCallback(Clipperz.PM.Crypto.deferredEncryptWithCurrentVersion, this.passwordValue(), this.packedPassphrase());
|
||||
deferredResult.addCallback(MochiKit.Base.method(this, 'encryptedPackedPassphrase'));
|
||||
//MochiKit.Logging.logDebug("--- OneTimePassword.encryptedData - 4");
|
||||
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("OneTimePassword.encryptedData - 2: [" + res.length + "]" + res); return res;});
|
||||
deferredResult.addCallback(function(aResult, res) {
|
||||
aResult['data'] = res;
|
||||
return aResult;
|
||||
}, result);
|
||||
//MochiKit.Logging.logDebug("--- OneTimePassword.encryptedData - 5");
|
||||
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("OneTimePassword.encryptedData - 3: " + Clipperz.Base.serializeJSON(res)); return res;});
|
||||
deferredResult.callback();
|
||||
//MochiKit.Logging.logDebug("--- OneTimePassword.encryptedData - 6");
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'saveChanges': function() {
|
||||
var deferredResult;
|
||||
var result;
|
||||
|
||||
//MochiKit.Logging.logDebug(">>> OneTimePassword.saveChanges");
|
||||
result = {};
|
||||
deferredResult = new MochiKit.Async.Deferred();
|
||||
|
||||
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'saveOTP_encryptUserData');
|
||||
deferredResult.addCallback(MochiKit.Base.method(this.user(), 'encryptedData'));
|
||||
deferredResult.addCallback(function(aResult, res) {
|
||||
aResult['user'] = res;
|
||||
return aResult;
|
||||
}, result);
|
||||
|
||||
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'saveOTP_encryptOTPData');
|
||||
deferredResult.addCallback(MochiKit.Base.method(this, 'encryptedData'));
|
||||
deferredResult.addCallback(function(aResult, res) {
|
||||
aResult['oneTimePassword'] = res;
|
||||
return aResult;
|
||||
}, result);
|
||||
|
||||
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'saveOTP_sendingData');
|
||||
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("OneTimePassword.saveChanges - 1: " + Clipperz.Base.serializeJSON(res)); return res;});
|
||||
deferredResult.addCallback(MochiKit.Base.method(this.user().connection(), 'message'), 'addNewOneTimePassword');
|
||||
|
||||
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'saveOTP_updatingInterface');
|
||||
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("OneTimePassword.saveChanges - 2: " + res); return res;});
|
||||
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'notify', 'OTPUpdated');
|
||||
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'oneTimePassword_saveChanges_done', null);
|
||||
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("OneTimePassword.saveChanges - 2: " + res); return res;});
|
||||
deferredResult.callback();
|
||||
//MochiKit.Logging.logDebug("<<< OneTimePassword.saveChanges");
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'usageDate': function() {
|
||||
return this._usageDate;
|
||||
},
|
||||
|
||||
'setUsageDate': function(aValue) {
|
||||
this._usageDate = aValue;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'connectionInfo': function() {
|
||||
return this._connectionInfo;
|
||||
},
|
||||
|
||||
'setConnectionInfo': function(aValue) {
|
||||
this._connectionInfo = aValue;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'isExpired': function() {
|
||||
return (this.usageDate() != null);
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'updateStatusWithValues': function(someValues) {
|
||||
var result;
|
||||
|
||||
result = false;
|
||||
|
||||
if (someValues['status'] != this.status()) {
|
||||
result = true;
|
||||
}
|
||||
|
||||
this.setStatus(someValues['status']);
|
||||
this.setUsageDate(Clipperz.PM.Date.parseDateWithUTCFormat(someValues['requestDate']));
|
||||
this.setConnectionInfo(someValues['connection']);
|
||||
|
||||
return result;
|
||||
},
|
||||
*/
|
||||
//-------------------------------------------------------------------------
|
||||
__syntaxFix__: "syntax fix"
|
||||
});
|
||||
|
||||
//#############################################################################
|
||||
|
||||
Clipperz.PM.DataModel.OneTimePassword.computeKeyWithUsernameAndPassword = function(anUsername, aPassword) {
|
||||
return Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aPassword)).toHexString().substring(2);
|
||||
}
|
||||
|
||||
Clipperz.PM.DataModel.OneTimePassword.computeKeyChecksumWithUsernameAndPassword = function(anUsername, aPassword) {
|
||||
return Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(anUsername + aPassword)).toHexString().substring(2);
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
|
||||
Clipperz.PM.DataModel.OneTimePassword.isValidOneTimePasswordValue = function(aPassword) {
|
||||
var result;
|
||||
|
||||
// "yaxx k7ww - f8y6 tqz5 - 58b6 th44 - 9cwv q0fg"
|
||||
//console.log("Clipperz.PM.DataModel.OneTimePassword.isValidOneTimePasswordValue", aPassword);
|
||||
if (aPassword.replace(/[\s\-]/g, '').length == 32) {
|
||||
try {
|
||||
var passwordByteArray;
|
||||
|
||||
passwordByteArray = new Clipperz.ByteArray();
|
||||
passwordByteArray.appendBase32String(aPassword);
|
||||
|
||||
result = true;
|
||||
} catch(exception) {
|
||||
result = false;
|
||||
}
|
||||
} else {
|
||||
result = false;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
|
||||
Clipperz.PM.DataModel.OneTimePassword.normalizedOneTimePassword = function(aPassword) {
|
||||
var result;
|
||||
|
||||
if (aPassword.replace(/[\s\-]/g, '').length == 32) {
|
||||
try {
|
||||
var passwordByteArray;
|
||||
|
||||
passwordByteArray = new Clipperz.ByteArray();
|
||||
passwordByteArray.appendBase32String(aPassword);
|
||||
|
||||
result = passwordByteArray.toBase64String();
|
||||
} catch(exception) {
|
||||
result = aPassword;
|
||||
}
|
||||
} else {
|
||||
result = aPassword;
|
||||
}
|
||||
|
||||
//console.log("Clipperz.PM.DataModel.OneTimePassword.normalizedOneTimePassword", aPassword, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
//#############################################################################
|
||||
167
frontend/gamma/js/Clipperz/PM/DataModel/Record.Version.Field.js
Normal file
167
frontend/gamma/js/Clipperz/PM/DataModel/Record.Version.Field.js
Normal file
@@ -0,0 +1,167 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
try { if (typeof(Clipperz.PM.DataModel.Record.Version) == 'undefined') { throw ""; }} catch (e) {
|
||||
throw "Clipperz.PM.DataModel.Record.Version.Field depends on Clipperz.PM.DataModel.Record.Version!";
|
||||
}
|
||||
|
||||
Clipperz.PM.DataModel.Record.Version.Field = function(args) {
|
||||
Clipperz.PM.DataModel.Record.Version.Field.superclass.constructor.apply(this, arguments);
|
||||
|
||||
this._recordVersion = args.recordVersion || Clipperz.Base.exception.raise('MandatoryParameter');
|
||||
this._reference = args.reference || Clipperz.PM.Crypto.randomKey();
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
Clipperz.Base.extend(Clipperz.PM.DataModel.Record.Version.Field, Object, {
|
||||
|
||||
'toString': function() {
|
||||
return "Record.Version.Field (" + this.reference() + ")";
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'recordVersion': function () {
|
||||
return this._recordVersion;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'reference': function () {
|
||||
return this._reference;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'getItem': function (aKey) {
|
||||
return Clipperz.Async.callbacks("Clipperz.PM.DataModel.Record.Version.Field.getItem", [
|
||||
MochiKit.Base.method(this, 'recordVersion'),
|
||||
MochiKit.Base.methodcaller('getValue', 'fields' + '.' + this.reference() + '.' + aKey)
|
||||
], {trace:false});
|
||||
},
|
||||
|
||||
'setItem': function (aKey, aValue) {
|
||||
return Clipperz.Async.callbacks("Clipperz.PM.DataModel.Record.Version.Field.getItem", [
|
||||
MochiKit.Base.method(this, 'recordVersion'),
|
||||
MochiKit.Base.methodcaller('setValue', 'fields' + '.' + this.reference() + '.' + aKey, aValue)
|
||||
], {trace:false});
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'label': function () {
|
||||
return this.getItem('label');
|
||||
},
|
||||
|
||||
'setLabel': function (aValue) {
|
||||
return this.setItem('label', aValue);
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'value': function () {
|
||||
return this.getItem('value');
|
||||
},
|
||||
|
||||
'setValue': function (aValue) {
|
||||
return this.setItem('value', aValue);
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'actionType': function () {
|
||||
return Clipperz.Async.callbacks("Clipperz.PM.DataModel.Record.Version.Field.actionType", [
|
||||
Clipperz.Async.collectResults("Clipperz.PM.DataModel.Record.Version.Field.actionType [collect results]", {
|
||||
'isHidden': MochiKit.Base.method(this, 'isHidden'),
|
||||
'value': MochiKit.Base.method(this, 'value')
|
||||
}, {trace:false}),
|
||||
function (someValues) {
|
||||
var result; // 'NONE', 'URL', 'EMAIL', 'PASSWORD'
|
||||
|
||||
result = 'NONE';
|
||||
|
||||
if (someValues['isHidden']) {
|
||||
result = 'PASSWORD';
|
||||
} else if (Clipperz.Base.isUrl(someValues['value'])) {
|
||||
result = 'URL'
|
||||
} else if (Clipperz.Base.isEmail(someValues['value'])) {
|
||||
result = 'EMAIL'
|
||||
};
|
||||
|
||||
return result;
|
||||
}
|
||||
], {trace:false});
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'isHidden': function () {
|
||||
return this.getItem('hidden');
|
||||
},
|
||||
|
||||
'setIsHidden': function (aValue) {
|
||||
return this.setItem('hidden', aValue);
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'isEmpty': function () {
|
||||
var deferredResult;
|
||||
|
||||
deferredResult = new Clipperz.Async.Deferred("Clipperz.PM.DataModel.Record.Version.Field.isEmpty", {trace:false});
|
||||
|
||||
deferredResult.collectResults({
|
||||
'label': [
|
||||
MochiKit.Base.method(this, 'label'),
|
||||
MochiKit.Base.partial(MochiKit.Base.operator.eq, '')
|
||||
],
|
||||
'value': [
|
||||
MochiKit.Base.method(this, 'value'),
|
||||
MochiKit.Base.partial(MochiKit.Base.operator.eq, '')
|
||||
],
|
||||
'isHidden': [
|
||||
MochiKit.Base.method(this, 'isHidden'),
|
||||
MochiKit.Base.partial(MochiKit.Base.operator.eq, false)
|
||||
]
|
||||
});
|
||||
deferredResult.addCallback(MochiKit.Base.values);
|
||||
deferredResult.addCallback(function(someValues) {
|
||||
return MochiKit.Iter.every(someValues, MochiKit.Base.operator.identity);
|
||||
});
|
||||
deferredResult.callback();
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
__syntaxFix__: "syntax fix"
|
||||
});
|
||||
|
||||
|
||||
336
frontend/gamma/js/Clipperz/PM/DataModel/Record.Version.js
Normal file
336
frontend/gamma/js/Clipperz/PM/DataModel/Record.Version.js
Normal file
@@ -0,0 +1,336 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
try { if (typeof(Clipperz.PM.DataModel.Record) == 'undefined') { throw ""; }} catch (e) {
|
||||
throw "Clipperz.PM.DataModel.Record.Version depends on Clipperz.PM.DataModel.Record!";
|
||||
}
|
||||
|
||||
Clipperz.PM.DataModel.Record.Version = function(args) {
|
||||
//console.log(">>> Record.new");
|
||||
Clipperz.PM.DataModel.Record.Version.superclass.constructor.apply(this, arguments);
|
||||
|
||||
this._getVersionFunction = args.getVersion || Clipperz.Base.exception.raise('MandatoryParameter');
|
||||
this._fields = null;
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
Clipperz.Base.extend(Clipperz.PM.DataModel.Record.Version, Clipperz.PM.DataModel.EncryptedRemoteObject, {
|
||||
|
||||
'toString': function() {
|
||||
return "Record.Version (" + this.reference() + ")";
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'reference': function () {
|
||||
return this._reference;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
/*
|
||||
'hasPendingChanges': function () {
|
||||
var deferredResult;
|
||||
|
||||
deferredResult = new Clipperz.Async.Deferred("Clipperz.PM.DataModel.Record.Version.hasPendingChanges", {trace:false});
|
||||
deferredResult.addCallback(MochiKit.Base.bind(Clipperz.PM.DataModel.Record.Version.superclass.hasPendingChanges, this));
|
||||
deferredResult.callback();
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
*/
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
|
||||
'hasPendingChangesWhenBrandNew': function () {
|
||||
var deferredResult;
|
||||
|
||||
deferredResult = new Clipperz.Async.Deferred("Clipperz.PM.DataModel.Record.Version.hasPendingChangesWhenBrandNew", {trace:false});
|
||||
deferredResult.addMethod(this, 'fields');
|
||||
deferredResult.addCallback(MochiKit.Base.values);
|
||||
deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.methodcaller('isEmpty'))
|
||||
deferredResult.addCallback(Clipperz.Async.collectAll);
|
||||
deferredResult.addCallback(function(someValues) {
|
||||
return MochiKit.Iter.every(someValues, MochiKit.Base.operator.identity);
|
||||
});
|
||||
deferredResult.addCallback(MochiKit.Base.operator.lognot)
|
||||
deferredResult.callback();
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'commitTransientState': function () {
|
||||
var deferredResult;
|
||||
|
||||
deferredResult = new Clipperz.Async.Deferred("Clipperz.PM.DataModel.Record.Version.commitTransientState", {trace:false});
|
||||
deferredResult.addCallback(MochiKit.Base.bind(Clipperz.PM.DataModel.Record.Version.superclass.commitTransientState, this));
|
||||
deferredResult.callback();
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'unpackData': function (someData) { // ++
|
||||
var result;
|
||||
|
||||
//console.log("Record.Version - UNPACK DATA", this, someData);
|
||||
result = someData;
|
||||
if ((someData['fields'] != null) && (someData['fields'] instanceof Array)) {
|
||||
var fields;
|
||||
var i,c;
|
||||
|
||||
fields = someData['fields'];
|
||||
delete someData['fields'];
|
||||
|
||||
someData['fields'] = {};
|
||||
c = fields.length;
|
||||
for (i=0; i<c; i++) {
|
||||
someData['fields'][i] = fields[i];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
return result;
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'fields': function () {
|
||||
var deferredResult;
|
||||
var deferredLock;
|
||||
|
||||
deferredLock = this.getDeferredLockForKey('fields');
|
||||
|
||||
deferredResult = new Clipperz.Async.Deferred("Record.Version.fields", {trace:false});
|
||||
deferredResult.acquireLock(deferredLock);
|
||||
deferredResult.addCallback(MochiKit.Base.bind(function () {
|
||||
var innerDeferredResult;
|
||||
|
||||
if (this._fields == null) {
|
||||
innerDeferredResult = new Clipperz.Async.Deferred("Record.Version.fields <inner deferred>", {trace:false});
|
||||
innerDeferredResult.addMethod(this, 'getValue', 'fields');
|
||||
innerDeferredResult.addCallback(MochiKit.Base.bind(function (someObjectData) {
|
||||
var reference;
|
||||
|
||||
this._fields = {};
|
||||
|
||||
for (reference in someObjectData) {
|
||||
var recordVersionField;
|
||||
|
||||
recordVersionField = new Clipperz.PM.DataModel.Record.Version.Field({
|
||||
'recordVersion': this,
|
||||
'reference': reference
|
||||
});
|
||||
|
||||
this._fields[reference] = recordVersionField;
|
||||
}
|
||||
|
||||
return this._fields;
|
||||
}, this));
|
||||
innerDeferredResult.callback();
|
||||
} else {
|
||||
innerDeferredResult = MochiKit.Async.succeed(this._fields);
|
||||
}
|
||||
|
||||
return innerDeferredResult;
|
||||
}, this));
|
||||
deferredResult.releaseLock(deferredLock);
|
||||
deferredResult.callback();
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'getFieldsValues': function () {
|
||||
return this.getValue('fields');
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'addField': function (someParameters) {
|
||||
var newField;
|
||||
|
||||
newField = new Clipperz.PM.DataModel.Record.Version.Field({recordVersion:this});
|
||||
|
||||
return Clipperz.Async.callbacks("Record.Version.addField", [
|
||||
MochiKit.Base.method(this, 'fields'),
|
||||
|
||||
MochiKit.Base.method(this, '_getObjectDataStore'),
|
||||
MochiKit.Base.methodcaller('values'),
|
||||
Clipperz.Base.serializeJSON,
|
||||
|
||||
MochiKit.Base.bind(function () { this._fields[newField.reference()] = newField; }, this),
|
||||
MochiKit.Base.method(newField, 'setLabel', someParameters['label']),
|
||||
MochiKit.Base.method(newField, 'setValue', someParameters['value']),
|
||||
MochiKit.Base.method(newField, 'setIsHidden', someParameters['isHidden']),
|
||||
|
||||
MochiKit.Base.method(this, '_getObjectDataStore'),
|
||||
MochiKit.Base.methodcaller('values'),
|
||||
Clipperz.Base.serializeJSON,
|
||||
|
||||
MochiKit.Base.partial(MochiKit.Async.succeed, newField)
|
||||
], {trace:false});
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'removeField': function (aField) {
|
||||
return Clipperz.Async.callbacks("Record.Version.removeField", [
|
||||
MochiKit.Base.method(this, 'fields'),
|
||||
MochiKit.Base.bind(function () { delete this._fields[aField.reference()]; }, this),
|
||||
MochiKit.Base.method(this, 'removeValue', 'fields' + '.' + aField.reference())
|
||||
], {trace:false});
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
/*
|
||||
'sortFieldReference': function (someSortedFieldReferences) {
|
||||
|
||||
|
||||
|
||||
},
|
||||
*/
|
||||
//=========================================================================
|
||||
/*
|
||||
'directLogins': function () {
|
||||
return MochiKit.Base.values(this._directLogins);
|
||||
},
|
||||
|
||||
'addDirectLogin': function (aDirectLogin) {
|
||||
this._directLogins[aDirectLogin.reference()] = aDirectLogin;
|
||||
},
|
||||
*/
|
||||
|
||||
//=========================================================================
|
||||
/*
|
||||
'updateValues': function (anotherVersion) {
|
||||
return Clipperz.Async.callbacks("Record.Version.updateValue", [
|
||||
MochiKit.Base.partial(MochiKit.Async.succeed, this)
|
||||
], {trace:false});
|
||||
},
|
||||
*/
|
||||
//=========================================================================
|
||||
|
||||
'setRemoteData': function (aValue) {
|
||||
this._remoteData = aValue;
|
||||
|
||||
return aValue;
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'getVersionFunction': function () {
|
||||
return this._getVersionFunction;
|
||||
},
|
||||
|
||||
'previousVersion': function () {
|
||||
return Clipperz.Async.callbacks("Record.Versions.previousVersion", [
|
||||
MochiKit.Base.method(this, 'previousVersionReference'),
|
||||
this.getVersionFunction()
|
||||
], {trace:false});
|
||||
},
|
||||
|
||||
'previousVersionReference': function () {
|
||||
return this.getValue('previousVersionReference');
|
||||
},
|
||||
|
||||
'previousVersionKey': function () {
|
||||
// TODO: this value i encrypted on its own. So it can not be saved in the main objectStore!!!
|
||||
return this.getValue('previousVersionKey');
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'setPreviousVersionReferenceAndKey': function (aVersionObjectAndKey) {
|
||||
// this._previousVersion = anotherVersion;
|
||||
return Clipperz.Async.callbacks("Record.Version.setPreviousVersion", [
|
||||
MochiKit.Base.method(this, 'setValue', 'previousVersionReference', aVersionObjectAndKey['reference']),
|
||||
MochiKit.Base.method(this, 'setValue', 'previousVersionKey', aVersionObjectAndKey['key'])
|
||||
], {trace:false});
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'revertChanges': function () {
|
||||
this.setReference(this.transientState()['originalReference']);
|
||||
Clipperz.PM.DataModel.Record.Version.superclass.revertChanges.apply(this, arguments);
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'prepareRemoteDataWithKey': function (aKey) {
|
||||
var deferredResult;
|
||||
var result;
|
||||
|
||||
result = {};
|
||||
|
||||
//console.log("prepareRemoteDataWithKey", aKey);
|
||||
deferredResult = new Clipperz.Async.Deferred("Record.Version.prepareRemoteDataWithKey", {trace:false});
|
||||
if (this.isBrandNew() == false) {
|
||||
this.transientState()['originalReference'] = this.reference();
|
||||
|
||||
deferredResult.collectResults({
|
||||
'key': MochiKit.Base.partial(MochiKit.Async.succeed, aKey),
|
||||
'value': MochiKit.Base.method(this, 'getKey'),
|
||||
'version': MochiKit.Base.partial(MochiKit.Async.succeed, Clipperz.PM.Crypto.encryptingFunctions.currentVersion)
|
||||
});
|
||||
deferredResult.addCallback(Clipperz.PM.Crypto.deferredEncrypt);
|
||||
deferredResult.addCallback(Clipperz.Async.setItem, result, 'previousVersionKey');
|
||||
} else {
|
||||
deferredResult.addCallback(Clipperz.Async.setItem, result, 'previousVersionKey', Clipperz.PM.Crypto.nullValue);
|
||||
}
|
||||
deferredResult.addCallback(MochiKit.Base.bind(Clipperz.PM.DataModel.Record.superclass.prepareRemoteDataWithKey, this, aKey));
|
||||
deferredResult.addCallback(MochiKit.Base.update, result);
|
||||
deferredResult.addMethod(this, 'setRemoteData');
|
||||
|
||||
deferredResult.callback();
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
/*
|
||||
'deleteAllCleanTextData': function () {
|
||||
return Clipperz.PM.DataModel.Record.Version.superclass.deleteAllCleanTextData.apply(this, arguments);
|
||||
},
|
||||
|
||||
'hasAnyCleanTextData': function () {
|
||||
return Clipperz.PM.DataModel.Record.Version.superclass.hasAnyCleanTextData.apply(this, arguments);
|
||||
},
|
||||
*/
|
||||
//=========================================================================
|
||||
__syntaxFix__: "syntax fix"
|
||||
});
|
||||
|
||||
|
||||
881
frontend/gamma/js/Clipperz/PM/DataModel/Record.js
Normal file
881
frontend/gamma/js/Clipperz/PM/DataModel/Record.js
Normal file
@@ -0,0 +1,881 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
|
||||
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
|
||||
if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; }
|
||||
|
||||
|
||||
Clipperz.PM.DataModel.Record = function(args) {
|
||||
//console.log(">>> new Clipperz.PM.DataModel.Record", args);
|
||||
Clipperz.PM.DataModel.Record.superclass.constructor.apply(this, arguments);
|
||||
|
||||
this._updateDate = (args.updateDate ? Clipperz.PM.Date.parse(args.updateDate) : Clipperz.Base.exception.raise('MandatoryParameter'));
|
||||
|
||||
this._retrieveIndexDataFunction = args.retrieveIndexDataFunction || Clipperz.Base.exception.raise('MandatoryParameter');
|
||||
this._updateIndexDataFunction = args.updateIndexDataFunction || Clipperz.Base.exception.raise('MandatoryParameter');
|
||||
|
||||
this._retrieveDirectLoginIndexDataFunction = args.retrieveDirectLoginIndexDataFunction || null;
|
||||
this._setDirectLoginIndexDataFunction = args.setDirectLoginIndexDataFunction || null;
|
||||
this._removeDirectLoginIndexDataFunction = args.removeDirectLoginIndexDataFunction || null;
|
||||
|
||||
this._createNewDirectLoginFunction = args.createNewDirectLoginFunction || null;
|
||||
|
||||
this._directLogins = {};
|
||||
|
||||
this._versions = {};
|
||||
|
||||
this._currentRecordVersion = null;
|
||||
if (this.isBrandNew()) {
|
||||
var newVersion;
|
||||
|
||||
this.setNotes('');
|
||||
newVersion = new Clipperz.PM.DataModel.Record.Version({
|
||||
'retrieveKeyFunction': MochiKit.Base.method(this, 'getVersionKey'),
|
||||
'getVersion': MochiKit.Base.method(this, 'getVersion')
|
||||
|
||||
});
|
||||
this._versions[newVersion.reference()] = newVersion;
|
||||
this._currentVersionReference = newVersion.reference();
|
||||
// this.setLabel('');
|
||||
}
|
||||
|
||||
//console.log("<<< new Clipperz.PM.DataModel.Record", args);
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
Clipperz.Base.extend(Clipperz.PM.DataModel.Record, Clipperz.PM.DataModel.EncryptedRemoteObject, {
|
||||
|
||||
'toString': function() {
|
||||
return "Record (" + this.reference() + ")";
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'reference': function () {
|
||||
return this._reference;
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'getIndexData': function () {
|
||||
return this._retrieveIndexDataFunction(this.reference());
|
||||
},
|
||||
|
||||
//.........................................................................
|
||||
|
||||
'getIndexDataForKey': function (aKey) {
|
||||
return Clipperz.Async.callbacks("Record.getIndexDataForKey", [
|
||||
MochiKit.Base.method(this, 'getIndexData'),
|
||||
MochiKit.Base.itemgetter(aKey)
|
||||
], {trace:false});
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'setIndexDataForKey': function (aKey, aValue) {
|
||||
// return this._updateIndexDataFunction(this.reference(), aKey, aValue);
|
||||
|
||||
var deferredResult;
|
||||
|
||||
deferredResult = new Clipperz.Async.Deferred("Record.setIndexDataForKey", {trace:false});
|
||||
deferredResult.addMethod(this, 'getIndexDataForKey', aKey);
|
||||
deferredResult.addCallback(MochiKit.Base.bind(function (aCurrentValue) {
|
||||
var result;
|
||||
var originalValue;
|
||||
|
||||
originalValue = this.transientState().getValue('originalValues.indexData.' + aKey);
|
||||
if (originalValue == null) {
|
||||
originalValue = this.transientState().setValue('originalValues.indexData.' + aKey, aCurrentValue);
|
||||
}
|
||||
|
||||
if (aCurrentValue != aValue) {
|
||||
if (originalValue != aValue) {
|
||||
this.transientState().setValue('hasPendingChanges.indexData.' + aKey, true);
|
||||
} else {
|
||||
this.transientState().setValue('hasPendingChanges.indexData.' + aKey, false);
|
||||
}
|
||||
|
||||
result = this._updateIndexDataFunction(this.reference(), aKey, aValue);
|
||||
} else {
|
||||
result = MochiKit.Async.succeed(aValue);
|
||||
}
|
||||
|
||||
return result;
|
||||
}, this));
|
||||
|
||||
deferredResult.callback();
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
/*
|
||||
'key': function () {
|
||||
return this.getIndexDataForKey('key');
|
||||
},
|
||||
*/
|
||||
//=========================================================================
|
||||
|
||||
'label': function () {
|
||||
return this.getIndexDataForKey('label');
|
||||
},
|
||||
|
||||
//.........................................................................
|
||||
|
||||
'setLabel': function (aValue) {
|
||||
return this.setIndexDataForKey('label', aValue);
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'headerNotes': function () {
|
||||
return this.getIndexDataForKey('notes');
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'notes': function () {
|
||||
return Clipperz.Async.callbacks("Record.notes", [
|
||||
MochiKit.Base.method(this, 'headerNotes'),
|
||||
MochiKit.Base.bind(function (someHeaderNotes) {
|
||||
var result;
|
||||
|
||||
if ((someHeaderNotes == null) || (typeof(someHeaderNotes) == 'undefined')) {
|
||||
result = this.getValue('notes');
|
||||
} else {
|
||||
result = MochiKit.Async.succeed(someHeaderNotes);
|
||||
}
|
||||
|
||||
return result;
|
||||
}, this)
|
||||
], {trace:false});
|
||||
},
|
||||
|
||||
//.........................................................................
|
||||
|
||||
'setNotes': function (aValue) {
|
||||
return this.setValue('notes', aValue);
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'updateDate': function () {
|
||||
return MochiKit.Async.succeed(this._updateDate);
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'favicon': function () {
|
||||
var result;
|
||||
var directLogins;
|
||||
|
||||
directLogins = MochiKit.Base.values(this.directLogins());
|
||||
if (directLogins.length > 0) {
|
||||
result = directLogins[0].favicon();
|
||||
// } else if (/* is there an URL to use for searching a favicon */){
|
||||
} else {
|
||||
result = null; // MochiKit.Async.succeed(Clipperz.PM.Strings['defaultFaviconUrl']);
|
||||
}
|
||||
|
||||
return result;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'searchableContent': function () {
|
||||
var deferredResult;
|
||||
|
||||
//console.log(">>> searchableContent");
|
||||
deferredResult = new Clipperz.Async.Deferred("Record.searchableContent", {trace:false});
|
||||
|
||||
deferredResult.collectResults({
|
||||
'recordLabel': MochiKit.Base.method(this, 'label'),
|
||||
'directLoginLabels': [
|
||||
MochiKit.Base.method(this, 'directLoginReferences'),
|
||||
MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.itemgetter('label'))
|
||||
]
|
||||
})
|
||||
deferredResult.addCallback(function (someValues) {
|
||||
return someValues['recordLabel'] + ' ' + someValues['directLoginLabels'].join(' ');
|
||||
});
|
||||
deferredResult.callback();
|
||||
//console.log("<<< searchableContent");
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'isMatching': function (aRegExp) {
|
||||
return Clipperz.Async.callbacks("deferredFilterFunction", [
|
||||
MochiKit.Base.method(this, 'searchableContent'),
|
||||
MochiKit.Base.method(aRegExp, 'test'),
|
||||
function (doesItMatch) {
|
||||
var result;
|
||||
|
||||
if (doesItMatch) {
|
||||
result = MochiKit.Async.succeed('match');
|
||||
} else {
|
||||
result = MochiKit.Async.fail('miss');
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
], {trace:false});
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'directLogins': function () {
|
||||
return this._directLogins;
|
||||
},
|
||||
|
||||
'addDirectLogin': function (aDirectLogin) {
|
||||
this._directLogins[aDirectLogin.reference()] = aDirectLogin;
|
||||
},
|
||||
|
||||
'directLoginWithReference': function (aDirectLoginReference) {
|
||||
return this._directLogins[aDirectLoginReference];
|
||||
},
|
||||
|
||||
'createNewDirectLoginFunction': function () {
|
||||
return this._createNewDirectLoginFunction;
|
||||
},
|
||||
|
||||
'saveOriginalDirectLoginStatusToTransientState': function () {
|
||||
if (this.transientState().getValue('directLogins') == null) {
|
||||
// this.transientState().setValue('directLogins', this._directLogins)
|
||||
//console.log("SET TRANSIENT STATE", Clipperz.Base.serializeJSON(MochiKit.Base.keys(this.transientState().getValue('directLogins'))))
|
||||
MochiKit.Iter.forEach(MochiKit.Base.keys(this._directLogins), MochiKit.Base.bind(function(aKey) {
|
||||
this.transientState().setValue('directLogins' + '.' + aKey, this._directLogins[aKey])
|
||||
}, this))
|
||||
}
|
||||
},
|
||||
|
||||
'createNewDirectLogin': function () {
|
||||
this.saveOriginalDirectLoginStatusToTransientState();
|
||||
|
||||
return this.createNewDirectLoginFunction()(this);
|
||||
},
|
||||
|
||||
'removeDirectLogin': function(aDirectLogin) {
|
||||
this.saveOriginalDirectLoginStatusToTransientState();
|
||||
|
||||
return Clipperz.Async.callbacks("Record.removeDirectLogin", [
|
||||
MochiKit.Base.method(this, 'removeValue', 'directLogins' + '.' + aDirectLogin.reference()),
|
||||
MochiKit.Base.bind(function () {
|
||||
delete this._directLogins[aDirectLogin.reference()]
|
||||
}, this)
|
||||
], {trace:false});
|
||||
|
||||
},
|
||||
|
||||
'directLoginReferences': function () {
|
||||
var result;
|
||||
|
||||
result = Clipperz.Async.callbacks("Record.directLoginReferences", [
|
||||
MochiKit.Base.method(this, 'directLogins'),
|
||||
MochiKit.Base.values,
|
||||
function (someDirectLogins) {
|
||||
var result;
|
||||
var i,c;
|
||||
|
||||
result = [];
|
||||
c = someDirectLogins.length;
|
||||
for (i=0; i<c; i++) {
|
||||
result.push(Clipperz.Async.collectResults("Record.directLoginReferences - collectResults", {
|
||||
'_rowObject': MochiKit.Async.succeed,
|
||||
'_reference': MochiKit.Base.methodcaller('reference'),
|
||||
'label': MochiKit.Base.methodcaller('label'),
|
||||
'favicon': MochiKit.Base.methodcaller('favicon')
|
||||
}, {trace:false})(someDirectLogins[i]));
|
||||
};
|
||||
|
||||
return result;
|
||||
},
|
||||
Clipperz.Async.collectAll
|
||||
], {trace:false});
|
||||
|
||||
return result;
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'unpackRemoteData': function (someData) {
|
||||
var result;
|
||||
|
||||
//console.log("new Clipperz.PM.DataModel.Record.Version [2]");
|
||||
/*
|
||||
this._currentRecordVersion = new Clipperz.PM.DataModel.Record.Version({
|
||||
'reference': someData['currentVersion']['reference'],
|
||||
'retrieveKeyFunction': MochiKit.Base.method(this, 'getCurrentRecordVersionKey'),
|
||||
'remoteData': someData['currentVersion'],
|
||||
});
|
||||
*/
|
||||
var versionKey;
|
||||
|
||||
for (versionKey in someData['versions']) {
|
||||
//console.log("### versionKey", versionKey);
|
||||
this._versions[versionKey] = new Clipperz.PM.DataModel.Record.Version({
|
||||
'reference': versionKey,
|
||||
'retrieveKeyFunction': MochiKit.Base.method(this, 'getVersionKey'),
|
||||
'remoteData': someData['versions'][versionKey],
|
||||
'getVersion': MochiKit.Base.method(this, 'getVersion')
|
||||
})
|
||||
}
|
||||
|
||||
// this._currentVersionReference = someData['currentVersion']['reference'];
|
||||
this._currentVersionReference = someData['currentVersion'];
|
||||
//console.log("=== currentVersionReference", this._currentVersionReference, someData);
|
||||
|
||||
result = Clipperz.PM.DataModel.Record.superclass.unpackRemoteData.apply(this, arguments);
|
||||
|
||||
return result;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'unpackData': function (someData) {
|
||||
var result;
|
||||
|
||||
result = Clipperz.PM.DataModel.Record.superclass.unpackData.apply(this, arguments);
|
||||
|
||||
if (MochiKit.Base.isUndefinedOrNull(result['notes'])) {
|
||||
result['notes'] = ''
|
||||
}
|
||||
|
||||
return result;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'prepareRemoteDataWithKey': function (aKey) {
|
||||
var deferredResult;
|
||||
var newVersionKey;
|
||||
var result;
|
||||
|
||||
newVersionKey = Clipperz.PM.Crypto.randomKey();
|
||||
result = {};
|
||||
|
||||
deferredResult = new Clipperz.Async.Deferred("Record.prepareRemoteDataWithKey", {trace:false});
|
||||
deferredResult.addCallbackList([
|
||||
Clipperz.Async.collectResults("Record.prepareRemoteDataWithKey - collect results", {
|
||||
'isBrandNew': MochiKit.Base.method(this, 'isBrandNew'),
|
||||
'versionHasPendingChanges': [
|
||||
// MochiKit.Base.method(this, 'getCurrentRecordVersion'),
|
||||
// MochiKit.Base.methodcaller('hasPendingChanges')
|
||||
MochiKit.Base.method(this, 'invokeCurrentRecordVersionMethod', 'hasPendingChanges')
|
||||
]
|
||||
}),
|
||||
Clipperz.Async.or,
|
||||
|
||||
Clipperz.Async.deferredIf("Current Version has pending changes", [
|
||||
MochiKit.Base.method(this, 'createNewRecordVersion'),
|
||||
MochiKit.Base.methodcaller('prepareRemoteDataWithKey', newVersionKey),
|
||||
MochiKit.Base.partial(Clipperz.Async.setItem, result, 'currentRecordVersion'),
|
||||
MochiKit.Base.method(this, 'setCurrentRecordVersionKey', newVersionKey)
|
||||
], []),
|
||||
|
||||
MochiKit.Base.bind(Clipperz.PM.DataModel.Record.superclass.prepareRemoteDataWithKey, this, aKey),
|
||||
MochiKit.Base.partial(Clipperz.Async.setItem, result, 'record'),
|
||||
|
||||
MochiKit.Base.partial(MochiKit.Async.succeed, result)
|
||||
]);
|
||||
|
||||
deferredResult.callback();
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'fields': function () {
|
||||
return this.invokeCurrentRecordVersionMethod('fields');
|
||||
},
|
||||
|
||||
'addField': function (someParameters) {
|
||||
return this.invokeCurrentRecordVersionMethod('addField', someParameters);
|
||||
},
|
||||
|
||||
'removeField': function (someParameters) {
|
||||
return this.invokeCurrentRecordVersionMethod('removeField', someParameters);
|
||||
},
|
||||
|
||||
// 'sortFieldReference': function (someSortedFieldReferences) {
|
||||
// return this.invokeCurrentRecordVersionMethod('sortFieldReference', someSortedFieldReferences);
|
||||
// },
|
||||
|
||||
'getFieldsValues': function () {
|
||||
return this.invokeCurrentRecordVersionMethod('getFieldsValues');
|
||||
},
|
||||
|
||||
'fieldWithLabel': function (aLabel) {
|
||||
return Clipperz.Async.callbacks("Record.fieldWithLabel", [
|
||||
MochiKit.Base.method(this, 'fields'),
|
||||
MochiKit.Base.values,
|
||||
MochiKit.Base.partial(Clipperz.Async.deferredFilter, function (aField) {
|
||||
return Clipperz.Async.callbacks("Record.fieldWithLabel - check field label", [
|
||||
MochiKit.Base.methodcaller('label'),
|
||||
MochiKit.Base.partial(MochiKit.Base.operator.eq, aLabel)
|
||||
], {trace:false}, aField);
|
||||
}),
|
||||
function (someFilteredResults) {
|
||||
var result;
|
||||
|
||||
switch (someFilteredResults.length) {
|
||||
case 0:
|
||||
result = null;
|
||||
break;
|
||||
case 1:
|
||||
result = someFilteredResults[0];
|
||||
break;
|
||||
default:
|
||||
WTF = TODO;
|
||||
break;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
], {trace:false});
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'getVersion': function (aVersionReference) {
|
||||
return Clipperz.Async.callbacks("Record.getVersion", [
|
||||
MochiKit.Base.method(this, 'getVersions'),
|
||||
MochiKit.Base.itemgetter(aVersionReference)
|
||||
], {trace:false});
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'getVersionKey': function (aVersionReference) {
|
||||
var deferredResult;
|
||||
var transientStateKey;
|
||||
|
||||
transientStateKey = 'versionKeys' + '.' + aVersionReference;
|
||||
if (this.transientState().getValue(transientStateKey) != null) {
|
||||
deferredResult = MochiKit.Async.succeed(this.transientState().getValue(transientStateKey));
|
||||
} else {
|
||||
deferredResult = Clipperz.Async.callbacks("Record.getVersionKey", [
|
||||
MochiKit.Base.method(this, 'getVersions'),
|
||||
MochiKit.Base.partial(MochiKit.Base.operator.eq, aVersionReference, this.currentVersionReference()),
|
||||
Clipperz.Async.deferredIf("getVersionKey for current version", [
|
||||
MochiKit.Base.method(this, 'getCurrentRecordVersionKey'),
|
||||
MochiKit.Base.method(this.transientState(), 'setValue', transientStateKey)
|
||||
],[
|
||||
MochiKit.Async.fail
|
||||
])
|
||||
], {trace:false});
|
||||
}
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'versions': function () {
|
||||
return this._versions;
|
||||
},
|
||||
|
||||
'getVersions': function () {
|
||||
return Clipperz.Async.callbacks("Record.versions", [
|
||||
MochiKit.Base.method(this, 'getValue', 'fakeKey, just to trigger unpackRemoteData'),
|
||||
MochiKit.Base.bind(function () { return this._versions; }, this)
|
||||
], {trace:false});
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'getCurrentRecordVersion': function () {
|
||||
return Clipperz.Async.callbacks("Record.getCurrentRecordVersion", [
|
||||
// MochiKit.Base.method(this, 'getValue', 'fakeKey, just to trigger unpackRemoteData'),
|
||||
// MochiKit.Base.bind(function () { return this._currentRecordVersion; }, this)
|
||||
|
||||
MochiKit.Base.method(this, 'versions'),
|
||||
MochiKit.Base.itemgetter(this.currentVersionReference()),
|
||||
Clipperz.Async.deferredIf("The current version is available", [
|
||||
MochiKit.Async.succeed
|
||||
], [
|
||||
MochiKit.Base.method(this, 'getVersions'),
|
||||
MochiKit.Base.bind(function (someVersions) { return someVersions[this.currentVersionReference()]}, this)
|
||||
])
|
||||
], {trace:false});
|
||||
},
|
||||
|
||||
'setCurrentRecordVersion': function (aRecordVersion) {
|
||||
this._currentVersionReference = aRecordVersion.reference();
|
||||
},
|
||||
|
||||
//.........................................................................
|
||||
|
||||
'currentVersionReference': function () {
|
||||
//console.log("currentVersionReference");
|
||||
return this._currentVersionReference;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'createNewRecordVersion': function () {
|
||||
var deferredResult;
|
||||
|
||||
if (this.isBrandNew()) {
|
||||
deferredResult = this.getCurrentRecordVersion();
|
||||
} else {
|
||||
var newVersion;
|
||||
|
||||
newVersion = new Clipperz.PM.DataModel.Record.Version({
|
||||
// 'reference': versionKey,
|
||||
'retrieveKeyFunction': MochiKit.Base.method(this, 'getVersionKey'),
|
||||
// 'remoteData': {},
|
||||
'getVersion': MochiKit.Base.method(this, 'getVersion')
|
||||
})
|
||||
this._versions[newVersion.reference()] = newVersion;
|
||||
|
||||
deferredResult = Clipperz.Async.callbacks("Record.createNewRecordVersion", [
|
||||
// MochiKit.Base.method(this, 'getCurrentRecordVersion'),
|
||||
// MochiKit.Base.methodcaller('values'),
|
||||
MochiKit.Base.method(this, 'invokeCurrentRecordVersionMethod', 'values'),
|
||||
MochiKit.Base.method(newVersion, 'setValues'),
|
||||
|
||||
Clipperz.Async.collectResults("Record.createNewRecordVersion [collect results]", {
|
||||
'reference': MochiKit.Base.method(this, 'currentVersionReference'),
|
||||
'key': MochiKit.Base.method(this, 'getCurrentRecordVersionKey')
|
||||
}, {trace:false}),
|
||||
MochiKit.Base.method(newVersion, 'setPreviousVersionReferenceAndKey'),
|
||||
|
||||
// MochiKit.Base.method(this, 'getCurrentRecordVersion'),
|
||||
// MochiKit.Base.method(this, 'revertChanges'),
|
||||
MochiKit.Base.method(this, 'invokeCurrentRecordVersionMethod', 'revertChanges'),
|
||||
|
||||
MochiKit.Base.method(this, 'setCurrentRecordVersion', newVersion),
|
||||
MochiKit.Base.partial(MochiKit.Async.succeed, newVersion)
|
||||
], {trace:false});
|
||||
}
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'getCurrentRecordVersionKey': function () {
|
||||
//console.log("getCurrentRecordVersionKey");
|
||||
return Clipperz.Async.callbacks("Record.getCurrentRecordVersionKey", [
|
||||
MochiKit.Base.method(this, 'getValue', 'currentVersionKey'),
|
||||
Clipperz.Async.deferredIf("currentVersionKey is NOT null", [
|
||||
MochiKit.Async.succeed
|
||||
], [
|
||||
MochiKit.Base.method(this, 'getKey')
|
||||
])
|
||||
], {trace:false});
|
||||
},
|
||||
|
||||
'setCurrentRecordVersionKey': function (aValue) {
|
||||
// TODO: triple check this method!
|
||||
return Clipperz.Async.callbacks("Record.setCurrentRecordVersionKey", [
|
||||
MochiKit.Base.method(this, 'setValue', 'currentVersionKey', aValue)
|
||||
], {trace:false});
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'invokeCurrentRecordVersionMethod': function (aMethodName, someValues) {
|
||||
//console.log(">>> invokeCurrentRecordVersionMethod", aMethodName);
|
||||
return Clipperz.Async.callbacks("Record.invokeCurrentRecordVersionMethod", [
|
||||
MochiKit.Base.method(this, 'getCurrentRecordVersion'),
|
||||
//function (aValue) { console.log("=== getCurrentRecordVersion", aValue); return aValue},
|
||||
MochiKit.Base.methodcaller(aMethodName, someValues)
|
||||
], {trace:false});
|
||||
},
|
||||
|
||||
|
||||
'lazilyinvokeCurrentRecordVersionMethod': function (aMethodName, someValues, defaultResult) {
|
||||
return Clipperz.Async.callbacks("Record.lazilyinvokeCurrentRecordVersionMethod", [
|
||||
MochiKit.Base.method(this, 'currentVersionReference'),
|
||||
//function (aValue) { console.log("LAZY -> versions", aValue); return aValue; },
|
||||
Clipperz.Async.deferredIf("versions has been loaded", [
|
||||
//function (aValue) { console.log("LAZY -> then"); return aValue; },
|
||||
MochiKit.Base.method(this, 'getCurrentRecordVersion'),
|
||||
MochiKit.Base.methodcaller(aMethodName, someValues),
|
||||
//function (aValue) { console.log("LAZY <- then"); return aValue; }
|
||||
], [
|
||||
//function (aValue) { console.log("LAZY -> else"); return aValue; },
|
||||
MochiKit.Base.partial(MochiKit.Async.succeed, defaultResult),
|
||||
//function (aValue) { console.log("LAZY <- else"); return aValue; }
|
||||
])
|
||||
], {trace:false});
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'hasPendingChanges': function () {
|
||||
var deferredResult;
|
||||
|
||||
if (this.hasInitiatedObjectDataStore()) {
|
||||
deferredResult = new Clipperz.Async.Deferred("Clipperz.PM.DataModel.Record.hasPendingChanges", {trace:false});
|
||||
deferredResult.collectResults({
|
||||
'super': MochiKit.Base.bind(Clipperz.PM.DataModel.Record.superclass.hasPendingChanges, this),
|
||||
'currentVersion': [
|
||||
// MochiKit.Base.method(this, 'getCurrentRecordVersion'),
|
||||
// MochiKit.Base.methodcaller('hasPendingChanges')
|
||||
MochiKit.Base.method(this, 'invokeCurrentRecordVersionMethod', 'hasPendingChanges')
|
||||
],
|
||||
'directLogins': [
|
||||
MochiKit.Base.method(this, 'directLogins'),
|
||||
//function (aValue) { console.log("Record.directLogins", aValue); return aValue; },
|
||||
MochiKit.Base.values,
|
||||
MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('hasPendingChanges')),
|
||||
Clipperz.Async.collectAll,
|
||||
Clipperz.Async.or
|
||||
// function(someValues) {
|
||||
// return MochiKit.Iter.some(someValues, MochiKit.Base.operator.identity);
|
||||
// }
|
||||
]
|
||||
});
|
||||
//deferredResult.addCallback(function (aValue) { console.log("Record.hasPendingResults", aValue); return aValue; });
|
||||
deferredResult.addCallback(MochiKit.Base.values);
|
||||
deferredResult.addCallback(MochiKit.Base.bind(function(someValues) {
|
||||
var result;
|
||||
result = MochiKit.Iter.some(someValues, MochiKit.Base.operator.identity);
|
||||
|
||||
if ((result == false) && (this.isBrandNew() == false)) {
|
||||
result = MochiKit.Iter.some(MochiKit.Base.values(this.transientState().getValue('hasPendingChanges.indexData')), MochiKit.Base.operator.identity);
|
||||
}
|
||||
|
||||
return result;
|
||||
}, this));
|
||||
|
||||
deferredResult.callback();
|
||||
} else {
|
||||
deferredResult = Clipperz.Async.callbacks("Recrod.hasPendingChanges [hasInitiatedObjectDataStore == false]", [
|
||||
MochiKit.Base.method(this, 'directLogins'),
|
||||
MochiKit.Base.values,
|
||||
MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('hasPendingChanges')),
|
||||
Clipperz.Async.collectAll,
|
||||
Clipperz.Async.or
|
||||
// function(someValues) {
|
||||
// return MochiKit.Iter.some(someValues, MochiKit.Base.operator.identity);
|
||||
// }
|
||||
], {trace:false})
|
||||
}
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'hasPendingChangesWhenBrandNew': function () {
|
||||
var deferredResult;
|
||||
|
||||
deferredResult = new Clipperz.Async.Deferred("Clipperz.PM.DataModel.Record.hasPendingChangesWhenBrandNew", {trace:false});
|
||||
deferredResult.collectResults({
|
||||
'label': [
|
||||
MochiKit.Base.method(this, 'label'),
|
||||
MochiKit.Base.partial(MochiKit.Base.operator.ne, '')
|
||||
],
|
||||
'notes': [
|
||||
MochiKit.Base.method(this, 'notes'),
|
||||
MochiKit.Base.partial(MochiKit.Base.operator.ne, '')
|
||||
]
|
||||
});
|
||||
// deferredResult.addCallback(MochiKit.Base.values);
|
||||
// deferredResult.addCallback(function(someValues) {
|
||||
// return MochiKit.Iter.some(someValues, MochiKit.Base.operator.identity);
|
||||
// });
|
||||
deferredResult.addCallback(Clipperz.Async.or);
|
||||
|
||||
deferredResult.callback();
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'isBrandNewWithNoPendingChanges': function () {
|
||||
var deferredResult;
|
||||
|
||||
if (this.isBrandNew() == false) {
|
||||
deferredResult = MochiKit.Async.succeed(false);
|
||||
} else {
|
||||
deferredResult = Clipperz.Async.callbacks("Record.isBrandNewWithNoPendingChanges", [
|
||||
MochiKit.Base.method(this, 'hasPendingChanges'),
|
||||
MochiKit.Base.operator.lognot
|
||||
], {trace:false});
|
||||
}
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'revertChanges': function () {
|
||||
var deferredResult;
|
||||
|
||||
if (this.isBrandNew() == false) {
|
||||
deferredResult = new Clipperz.Async.Deferred("Clipperz.PM.DataModel.Record.revertChanges", {trace:false});
|
||||
deferredResult.addMethod(this, 'hasPendingChanges');
|
||||
deferredResult.addIf([
|
||||
// MochiKit.Base.method(this, 'getCurrentRecordVersion'),
|
||||
// MochiKit.Base.methodcaller('revertChanges'),
|
||||
MochiKit.Base.method(this,'invokeCurrentRecordVersionMethod', 'revertChanges'),
|
||||
|
||||
MochiKit.Base.method(this, 'directLogins'),
|
||||
MochiKit.Base.values,
|
||||
MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('revertChanges')),
|
||||
|
||||
MochiKit.Base.bind(Clipperz.PM.DataModel.Record.superclass.revertChanges, this)
|
||||
], [
|
||||
MochiKit.Async.succeed
|
||||
]);
|
||||
deferredResult.callback();
|
||||
} else {
|
||||
// this.deleteAllCleanTextData();
|
||||
deferredResult = MochiKit.Async.succeed();
|
||||
}
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'resetTransientState': function (isCommitting) {
|
||||
// if ((isCommitting == false) && (this.transientState().getValue('directLogins') != null)) {
|
||||
// this._directLogins = this.transientState().getValue('directLogins');
|
||||
// }
|
||||
|
||||
return Clipperz.Async.callbacks("Record.resetTransientState", [
|
||||
//- MochiKit.Base.method(this, 'getCurrentRecordVersion'),
|
||||
//- MochiKit.Base.methodcaller('resetTransientState'),
|
||||
// MochiKit.Base.method(this, 'invokeCurrentRecordVersionMethod', 'resetTransientState'),
|
||||
MochiKit.Base.method(this, 'lazilyinvokeCurrentRecordVersionMethod', 'resetTransientState'),
|
||||
|
||||
MochiKit.Base.method(this, 'directLogins'),
|
||||
//function (aValue) { console.log("resetTransientState - directLogins", aValue); return aValue; },
|
||||
MochiKit.Base.values,
|
||||
MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('resetTransientState')),
|
||||
|
||||
MochiKit.Base.bind(function () {
|
||||
if ((isCommitting == false) && (this.transientState().getValue('directLogins') != null)) {
|
||||
this._directLogins = this.transientState().getValue('directLogins');
|
||||
}
|
||||
}, this),
|
||||
|
||||
MochiKit.Base.bind(Clipperz.PM.DataModel.Record.superclass.resetTransientState, this, isCommitting)
|
||||
], {trace:false})
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'commitTransientState': function () {
|
||||
var deferredResult;
|
||||
|
||||
deferredResult = new Clipperz.Async.Deferred("Clipperz.PM.DataModel.Record.commitTransientState", {trace:false});
|
||||
deferredResult.addMethod(this, 'hasPendingChanges');
|
||||
deferredResult.addIf([
|
||||
MochiKit.Base.bind(Clipperz.PM.DataModel.Record.superclass.commitTransientState, this),
|
||||
// MochiKit.Base.method(this, 'getCurrentRecordVersion'),
|
||||
// MochiKit.Base.methodcaller('commitTransientState'),
|
||||
MochiKit.Base.method(this, 'invokeCurrentRecordVersionMethod', 'commitTransientState'),
|
||||
MochiKit.Base.method(this, 'directLogins'),
|
||||
MochiKit.Base.values,
|
||||
MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('commitTransientState'))
|
||||
], [
|
||||
MochiKit.Async.succeed
|
||||
]);
|
||||
deferredResult.callback();
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'retrieveDirectLoginIndexDataFunction': function () {
|
||||
//console.log("Record.retrieveDirectLoginIndexDataFunction", this._retrieveDirectLoginIndexDataFunction);
|
||||
return this._retrieveDirectLoginIndexDataFunction;
|
||||
},
|
||||
|
||||
'setDirectLoginIndexDataFunction': function () {
|
||||
return this._setDirectLoginIndexDataFunction;
|
||||
},
|
||||
|
||||
'removeDirectLoginIndexDataFunction': function () {
|
||||
return this._removeDirectLoginIndexDataFunction;
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'deleteAllCleanTextData': function () {
|
||||
// return Clipperz.PM.DataModel.Record.superclass.deleteAllCleanTextData.apply(this, arguments);
|
||||
|
||||
return Clipperz.Async.callbacks("Record.deleteAllCleanTextData", [
|
||||
MochiKit.Base.method(this, 'versions'),
|
||||
MochiKit.Base.values,
|
||||
MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('deleteAllCleanTextData')),
|
||||
|
||||
MochiKit.Base.method(this, 'directLogins'),
|
||||
MochiKit.Base.values,
|
||||
MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('deleteAllCleanTextData')),
|
||||
|
||||
MochiKit.Base.bind(Clipperz.PM.DataModel.Record.superclass.deleteAllCleanTextData, this)
|
||||
], {trace:false});
|
||||
},
|
||||
|
||||
'hasAnyCleanTextData': function () {
|
||||
// return Clipperz.PM.DataModel.Record.superclass.hasAnyCleanTextData.apply(this, arguments);
|
||||
|
||||
return Clipperz.Async.callbacks("Record.hasAnyCleanTextData", [
|
||||
Clipperz.Async.collectResults("Record.hasAnyCleanTextData [collect results]", {
|
||||
'versions': [
|
||||
MochiKit.Base.method(this, 'versions'),
|
||||
MochiKit.Base.values,
|
||||
MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('hasAnyCleanTextData')),
|
||||
Clipperz.Async.collectAll
|
||||
],
|
||||
'directLogins': [
|
||||
MochiKit.Base.method(this, 'directLogins'),
|
||||
MochiKit.Base.values,
|
||||
MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('hasAnyCleanTextData')),
|
||||
Clipperz.Async.collectAll
|
||||
],
|
||||
'super': [
|
||||
MochiKit.Base.bind(Clipperz.PM.DataModel.Record.superclass.hasAnyCleanTextData, this)
|
||||
]
|
||||
}, {trace:false}),
|
||||
Clipperz.Async.or
|
||||
])
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
__syntaxFix__: "syntax fix"
|
||||
});
|
||||
|
||||
|
||||
187
frontend/gamma/js/Clipperz/PM/DataModel/User.Header.Legacy.js
Normal file
187
frontend/gamma/js/Clipperz/PM/DataModel/User.Header.Legacy.js
Normal file
@@ -0,0 +1,187 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
try { if (typeof(Clipperz.PM.DataModel.User) == 'undefined') { throw ""; }} catch (e) {
|
||||
throw "Clipperz.PM.DataModel.User.Header.Legacy depends on Clipperz.PM.DataModel.User!";
|
||||
}
|
||||
|
||||
if (typeof(Clipperz.PM.DataModel.User.Header) == 'undefined') { Clipperz.PM.DataModel.User.Header = {}; }
|
||||
|
||||
Clipperz.PM.DataModel.User.Header.Legacy = function(args) {
|
||||
// args = args || {};
|
||||
Clipperz.PM.DataModel.User.Header.Legacy.superclass.constructor.apply(this, arguments);
|
||||
|
||||
this._retrieveRecordDetailFunction = args.retrieveRecordDetailFunction || Clipperz.Base.exception.raise('MandatoryParameter');
|
||||
this._records = null;
|
||||
// this._directLogins = null;
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
Clipperz.Base.extend(Clipperz.PM.DataModel.User.Header.Legacy, Clipperz.PM.DataModel.EncryptedRemoteObject, {
|
||||
|
||||
'toString': function() {
|
||||
return "Clipperz.PM.DataModel.User.Header.Legacy";
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'retrieveRecordDetailFunction': function () {
|
||||
return this._retrieveRecordDetailFunction;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'getRecordKey': function (aRecordReference) {
|
||||
var deferredResult;
|
||||
|
||||
deferredResult = new Clipperz.Async.Deferred("User.Header.Legacy.getRecordKey", {trace:false});
|
||||
deferredResult.addMethod(this, 'getRecordIndexData');
|
||||
deferredResult.addCallback(MochiKit.Base.itemgetter('key'))
|
||||
deferredResult.callback();
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'getRecordIndexData': function (aRecordReference) {
|
||||
return this.getValue('records.' + aRecordReference);
|
||||
},
|
||||
|
||||
'updateRecordIndexData': function (aRecordReference, aKey, aValue) {
|
||||
return this.setValue('records.' + aRecordReference + "." + aKey, aValue);
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'getDirectLoginIndexData': function (aDirectLoginReference) {
|
||||
return this.getValue('directLogins.' + aDirectLoginReference);
|
||||
},
|
||||
|
||||
'setDirectLoginIndexData': function (aDirectLoginReference, aKey, aValue) {
|
||||
return this.setValue('directLogins.' + aDirectLoginReference + '.' + aKey, aValue);
|
||||
},
|
||||
|
||||
'removeDirectLoginIndexData': function (aDirectLoginReference) {
|
||||
return this.removeValue('directLogins.' + aDirectLoginReference);
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'records': function () {
|
||||
var deferredResult;
|
||||
var deferredLock;
|
||||
|
||||
deferredLock = this.getDeferredLockForKey('records');
|
||||
|
||||
deferredResult = new Clipperz.Async.Deferred("User.Header.Legacy.records", {trace:false});
|
||||
deferredResult.acquireLock(deferredLock);
|
||||
deferredResult.addCallback(MochiKit.Base.bind(function () {
|
||||
var innerDeferredResult;
|
||||
|
||||
if (this._records == null) {
|
||||
innerDeferredResult = new Clipperz.Async.Deferred("User.Header.Legacy.records <inner deferred>", {trace:false});
|
||||
innerDeferredResult.collectResults({
|
||||
'header': [
|
||||
// MochiKit.Base.method(this, 'getObjectDataStore'),
|
||||
// MochiKit.Base.methodcaller('values')
|
||||
MochiKit.Base.method(this, 'values')
|
||||
],
|
||||
'recordsStats': [
|
||||
MochiKit.Base.method(this, 'getRemoteData'),
|
||||
MochiKit.Base.itemgetter('recordsStats')
|
||||
]
|
||||
});
|
||||
innerDeferredResult.addCallback(MochiKit.Base.bind(function (someObjectData) {
|
||||
var reference;
|
||||
|
||||
this._records = {};
|
||||
// this._directLogins = {};
|
||||
|
||||
for (reference in someObjectData['header']['records']) {
|
||||
var record;
|
||||
|
||||
record = new Clipperz.PM.DataModel.Record({
|
||||
'reference': reference,
|
||||
'retrieveKeyFunction': MochiKit.Base.method(this, 'getRecordKey'),
|
||||
'retrieveRemoteDataFunction': this.retrieveRecordDetailFunction(),
|
||||
// 'encryptedDataKeypath': 'data',
|
||||
// 'encryptedVersionKeypath': 'version',
|
||||
|
||||
'retrieveIndexDataFunction': MochiKit.Base.method(this, 'getRecordIndexData'),
|
||||
'updateIndexDataFunction': MochiKit.Base.method(this, 'updateRecordIndexData'),
|
||||
'updateDate': someObjectData['recordsStats'][reference]['updateDate'],
|
||||
|
||||
'retrieveDirectLoginIndexDataFunction': MochiKit.Base.method(this, 'getDirectLoginIndexData'),
|
||||
'setDirectLoginIndexDataFunction': MochiKit.Base.method(this, 'setDirectLoginIndexData'),
|
||||
'removeDirectLoginIndexDataFunction': MochiKit.Base.method(this, 'removeDirectLoginIndexData')
|
||||
});
|
||||
|
||||
this._records[reference] = record;
|
||||
}
|
||||
|
||||
for (reference in someObjectData['header']['directLogins']) {
|
||||
var directLogin;
|
||||
var record;
|
||||
|
||||
record = this._records[someObjectData['header']['directLogins'][reference]['record']];
|
||||
if (record != null) {
|
||||
directLogin = new Clipperz.PM.DataModel.DirectLogin({
|
||||
'reference': reference,
|
||||
'record': record //,
|
||||
// 'retrieveIndexDataFunction': MochiKit.Base.method(this, 'getDirectLoginIndexData'),
|
||||
// 'setIndexDataFunction': MochiKit.Base.method(this, 'setDirectLoginIndexData'),
|
||||
// 'removeIndexDataFunction': MochiKit.Base.method(this, 'removeDirectLoginIndexData')
|
||||
});
|
||||
} else {
|
||||
Clipperz.log("WARNING: DIRECT LOGIN without a matching RECORD!!");
|
||||
}
|
||||
}
|
||||
|
||||
return this._records;
|
||||
}, this));
|
||||
innerDeferredResult.callback();
|
||||
} else {
|
||||
innerDeferredResult = MochiKit.Async.succeed(this._records);
|
||||
}
|
||||
|
||||
return innerDeferredResult;
|
||||
}, this));
|
||||
deferredResult.releaseLock(deferredLock);
|
||||
deferredResult.callback();
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
__syntaxFix__: "syntax fix"
|
||||
});
|
||||
|
||||
|
||||
@@ -0,0 +1,128 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
try { if (typeof(Clipperz.PM.DataModel.User) == 'undefined') { throw ""; }} catch (e) {
|
||||
throw "Clipperz.PM.DataModel.User.Header.OneTimePasswords depends on Clipperz.PM.DataModel.User!";
|
||||
}
|
||||
if (typeof(Clipperz.PM.DataModel.User.Header) == 'undefined') { Clipperz.PM.DataModel.User.Header = {}; }
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
Clipperz.PM.DataModel.User.Header.OneTimePasswords = function(args) {
|
||||
Clipperz.PM.DataModel.User.Header.OneTimePasswords.superclass.constructor.apply(this, arguments);
|
||||
|
||||
this._oneTimePasswords = null;
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
Clipperz.Base.extend(Clipperz.PM.DataModel.User.Header.OneTimePasswords, Clipperz.PM.DataModel.EncryptedRemoteObject, {
|
||||
|
||||
'toString': function() {
|
||||
return "Clipperz.PM.DataModel.User.Header.OneTimePasswords";
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
/*
|
||||
'packData': function (someData) { // ++
|
||||
var result;
|
||||
|
||||
console.log(">>> OneTimePasswords.packData", someData);
|
||||
result = Clipperz.PM.DataModel.User.Header.OneTimePasswords.superclass.packData.apply(this, arguments);
|
||||
console.log("<<< OneTimePasswords.packData");
|
||||
|
||||
return result;
|
||||
},
|
||||
*/
|
||||
//-------------------------------------------------------------------------
|
||||
/*
|
||||
'packRemoteData': function (someData) {
|
||||
var result;
|
||||
|
||||
console.log(">>> OneTimePasswords.packRemoteData", someData);
|
||||
result = Clipperz.PM.DataModel.User.Header.OneTimePasswords.superclass.packRemoteData.apply(this, arguments);
|
||||
console.log("<<< OneTimePasswords.packRemoteData");
|
||||
|
||||
return result;
|
||||
},
|
||||
*/
|
||||
//-------------------------------------------------------------------------
|
||||
/*
|
||||
'prepareRemoteDataWithKey': function (aKey) {
|
||||
var result;
|
||||
|
||||
console.log(">>> OneTimePasswords.prepareRemoteDataWithKey");
|
||||
result = Clipperz.PM.DataModel.User.Header.OneTimePasswords.superclass.prepareRemoteDataWithKey.apply(this, arguments);
|
||||
console.log("<<< OneTimePasswords.prepareRemoteDataWithKey");
|
||||
|
||||
return result;
|
||||
},
|
||||
*/
|
||||
//=========================================================================
|
||||
|
||||
'oneTimePasswords': function () {
|
||||
var deferredResult;
|
||||
|
||||
deferredResult = new Clipperz.Async.Deferred("User.Header.OneTimePasswords.oneTimePasswords", {trace:false});
|
||||
if (this._oneTimePasswords == null) {
|
||||
deferredResult.addMethod(this, 'values')
|
||||
deferredResult.addCallback(MochiKit.Base.bind(function (someData) {
|
||||
var otpKey;
|
||||
|
||||
this._oneTimePasswords = {};
|
||||
|
||||
for (otpKey in someData) {
|
||||
var otp;
|
||||
var otpParameters;
|
||||
|
||||
otpParameters = Clipperz.Base.deepClone(someData[otpKey]);
|
||||
otpParameters['reference'] = otpKey;
|
||||
|
||||
otp = new Clipperz.PM.DataModel.OneTimePassword(otpParameters);
|
||||
this._oneTimePasswords[otpKey] = otp;
|
||||
}
|
||||
|
||||
return this._oneTimePasswords;
|
||||
|
||||
}, this));
|
||||
deferredResult.callback();
|
||||
} else {
|
||||
deferredResult = MochiKit.Async.succeed(this._oneTimePasswords);
|
||||
}
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
__syntaxFix__: "syntax fix"
|
||||
});
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
try { if (typeof(Clipperz.PM.DataModel.User) == 'undefined') { throw ""; }} catch (e) {
|
||||
throw "Clipperz.PM.DataModel.User.Header.Preferences depends on Clipperz.PM.DataModel.User!";
|
||||
}
|
||||
|
||||
if (typeof(Clipperz.PM.DataModel.User.Header) == 'undefined') { Clipperz.PM.DataModel.User.Header = {}; }
|
||||
|
||||
Clipperz.PM.DataModel.User.Header.Preferences = function(args) {
|
||||
Clipperz.PM.DataModel.User.Header.Preferences.superclass.constructor.apply(this, arguments);
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
Clipperz.Base.extend(Clipperz.PM.DataModel.User.Header.Preferences, Clipperz.PM.DataModel.EncryptedRemoteObject, {
|
||||
|
||||
'toString': function() {
|
||||
return "Clipperz.PM.DataModel.User.Header.Preferences";
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
//=========================================================================
|
||||
__syntaxFix__: "syntax fix"
|
||||
});
|
||||
|
||||
|
||||
@@ -0,0 +1,705 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
try { if (typeof(Clipperz.PM.DataModel.User) == 'undefined') { throw ""; }} catch (e) {
|
||||
throw "Clipperz.PM.DataModel.User.Header.RecordIndex depends on Clipperz.PM.DataModel.User!";
|
||||
}
|
||||
|
||||
if (typeof(Clipperz.PM.DataModel.User.Header) == 'undefined') { Clipperz.PM.DataModel.User.Header = {}; }
|
||||
|
||||
Clipperz.PM.DataModel.User.Header.RecordIndex = function(args) {
|
||||
Clipperz.PM.DataModel.User.Header.RecordIndex.superclass.constructor.apply(this, arguments);
|
||||
|
||||
//console.log("NEW Clipperz.PM.DataModel.User.Header.RecordIndex", args);
|
||||
this._recordsData = new Clipperz.PM.DataModel.EncryptedRemoteObject({
|
||||
'name': 'recordsData',
|
||||
'retrieveKeyFunction': args.retrieveKeyFunction,
|
||||
'remoteData': {
|
||||
'data': args.recordsData['data'],
|
||||
'version': args.encryptedDataVersion,
|
||||
'recordsStats': args.recordsStats
|
||||
}//,
|
||||
// 'encryptedDataKeypath': 'data',
|
||||
// 'encryptedVersionKeypath': 'version'
|
||||
});
|
||||
|
||||
this._directLoginsData = new Clipperz.PM.DataModel.EncryptedRemoteObject({
|
||||
'name': 'directLoginsData',
|
||||
'retrieveKeyFunction': args.retrieveKeyFunction,
|
||||
'remoteData': {
|
||||
'data': args.directLoginsData['data'],
|
||||
'version': args.encryptedDataVersion
|
||||
}//,
|
||||
// 'encryptedDataKeypath': 'data',
|
||||
// 'encryptedVersionKeypath': 'version'
|
||||
});
|
||||
|
||||
this._lock = new MochiKit.Async.DeferredLock();
|
||||
this._transientState = null;
|
||||
|
||||
this._retrieveRecordDetailFunction = args.retrieveRecordDetailFunction || Clipperz.Base.exception.raise('MandatoryParameter');
|
||||
this._recordsIndex = args.recordsData['index'] || Clipperz.Base.exception.raise('MandatoryParameter');
|
||||
this._directLoginsIndex = args.directLoginsData['index'] || Clipperz.Base.exception.raise('MandatoryParameter');
|
||||
|
||||
this._records = null;
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
Clipperz.Base.extend(Clipperz.PM.DataModel.User.Header.RecordIndex, Object, {
|
||||
|
||||
'toString': function() {
|
||||
return "Clipperz.PM.DataModel.User.Header.RecordIndex";
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'retrieveRecordDetailFunction': function () {
|
||||
return this._retrieveRecordDetailFunction;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'recordsIndex': function () {
|
||||
return this._recordsIndex;
|
||||
},
|
||||
|
||||
'recordsData': function () {
|
||||
return this._recordsData;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'directLoginsIndex': function () {
|
||||
return this._directLoginsIndex;
|
||||
},
|
||||
|
||||
'directLoginsData': function () {
|
||||
return this._directLoginsData;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'lock': function () {
|
||||
return this._lock;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'transientState': function () {
|
||||
if (this._transientState == null) {
|
||||
this._transientState = new Clipperz.KeyValueObjectStore(/*{'name':'User.Header.RecordIndex.transientState [1]'}*/);
|
||||
}
|
||||
|
||||
return this._transientState;
|
||||
},
|
||||
|
||||
'resetTransientState': function (isCommitting) {
|
||||
//console.log("######## UserHeaderRecordIndex - resetTransientState", Clipperz.Base.deepClone(this._transientState));
|
||||
if (this._transientState != null) {
|
||||
this._transientState.removeAllData();
|
||||
}
|
||||
|
||||
this._transientState = null;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'getRecordKey': function (aRecordReference) {
|
||||
return Clipperz.Async.callbacks("User.Header.RecordIndex.getRecordKey", [
|
||||
MochiKit.Base.method(this, 'getRecordIndexData', aRecordReference),
|
||||
MochiKit.Base.itemgetter('key')
|
||||
], {trace:false});
|
||||
},
|
||||
|
||||
'setRecordKey': function (aRecordReference, aValue) {
|
||||
return this.updateRecordIndexData(aRecordReference, 'key', aValue);
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'getRecordIndexData': function (aRecordReference) {
|
||||
return this.recordsData().getValue(this.recordsIndex()[aRecordReference]);
|
||||
},
|
||||
|
||||
//.........................................................................
|
||||
|
||||
'updateRecordIndexData': function (aRecordReference, aKey, aValue) {
|
||||
return this.recordsData().setValue(this.recordsIndex()[aRecordReference]+'.'+aKey, aValue);
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'getDirectLoginIndexData': function (aDirectLoginReference) {
|
||||
return this.directLoginsData().getValue(this.directLoginsIndex()[aDirectLoginReference]);
|
||||
},
|
||||
|
||||
'setDirectLoginIndexData': function (aDirectLoginReference, aKey, aValue) {
|
||||
//console.log("UserHeaderRecordIndex.setDirectLoginIndexData", aDirectLoginReference, this.directLoginsIndex()[aDirectLoginReference], aKey);
|
||||
//if (MochiKit.Base.isUndefinedOrNull(this.directLoginsIndex()[aDirectLoginReference])) {
|
||||
// throw "PIPPO";
|
||||
//}
|
||||
return this.directLoginsData().setValue(this.directLoginsIndex()[aDirectLoginReference] + '.' + aKey, aValue);
|
||||
},
|
||||
|
||||
'addDirectLoginIndexData': function (aDirectLoginReference) {
|
||||
//console.log("UserHeaderRecordIndex.addDirectLoginIndexData", aDirectLoginReference, this.directLoginsIndex()[aDirectLoginReference]);
|
||||
return this.directLoginsData().setValue(this.directLoginsIndex()[aDirectLoginReference], {});
|
||||
},
|
||||
|
||||
'removeDirectLoginIndexData': function (aDirectLoginReference) {
|
||||
return this.directLoginsData().removeValue(this.directLoginsIndex()[aDirectLoginReference])
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'records': function () {
|
||||
var deferredResult;
|
||||
|
||||
deferredResult = new Clipperz.Async.Deferred("User.Header.RecordIndex.records", {trace:false});
|
||||
deferredResult.acquireLock(this.lock());
|
||||
deferredResult.addCallback(MochiKit.Base.bind(function () {
|
||||
var innerDeferredResult;
|
||||
|
||||
if (this._records == null) {
|
||||
innerDeferredResult = new Clipperz.Async.Deferred("User.Header.RecordIndex.records <inner deferred>", {trace:false});
|
||||
innerDeferredResult.collectResults({
|
||||
'records': [
|
||||
// MochiKit.Base.method(this.recordsData(), 'getObjectDataStore'),
|
||||
// MochiKit.Base.methodcaller('values')
|
||||
MochiKit.Base.method(this.recordsData(), 'values')
|
||||
],
|
||||
'recordsStats': [
|
||||
MochiKit.Base.method(this.recordsData(), 'getRemoteData'),
|
||||
MochiKit.Base.itemgetter('recordsStats')
|
||||
],
|
||||
'directLogins': [
|
||||
// MochiKit.Base.method(this.directLoginsData(), 'getObjectDataStore'),
|
||||
// MochiKit.Base.methodcaller('values')
|
||||
MochiKit.Base.method(this.directLoginsData(), 'values')
|
||||
]
|
||||
})
|
||||
innerDeferredResult.addCallback(MochiKit.Base.bind(function (someData) {
|
||||
var indexReference;
|
||||
var recordsInvertedIndex;
|
||||
var directLoginsInvertedIndex;
|
||||
|
||||
recordsInvertedIndex = Clipperz.PM.DataModel.User.Header.RecordIndex.invertIndex(this.recordsIndex());
|
||||
directLoginsInvertedIndex = Clipperz.PM.DataModel.User.Header.RecordIndex.invertIndex(this.directLoginsIndex());
|
||||
|
||||
this._records = {};
|
||||
|
||||
for (indexReference in someData['records']) {
|
||||
var record;
|
||||
var reference;
|
||||
var updateDate;
|
||||
|
||||
reference = recordsInvertedIndex[indexReference];
|
||||
|
||||
if (typeof(someData['recordsStats'][reference]) != 'undefined') {
|
||||
updateDate = someData['recordsStats'][reference]['updateDate'];
|
||||
|
||||
record = new Clipperz.PM.DataModel.Record({
|
||||
'reference': reference,
|
||||
'retrieveKeyFunction': MochiKit.Base.method(this, 'getRecordKey'),
|
||||
'retrieveRemoteDataFunction': this.retrieveRecordDetailFunction(),
|
||||
|
||||
'retrieveIndexDataFunction': MochiKit.Base.method(this, 'getRecordIndexData'),
|
||||
'updateIndexDataFunction': MochiKit.Base.method(this, 'updateRecordIndexData'),
|
||||
'updateDate': updateDate,
|
||||
|
||||
'retrieveDirectLoginIndexDataFunction': MochiKit.Base.method(this, 'getDirectLoginIndexData'),
|
||||
'setDirectLoginIndexDataFunction': MochiKit.Base.method(this, 'setDirectLoginIndexData'),
|
||||
'removeDirectLoginIndexDataFunction': MochiKit.Base.method(this, 'removeDirectLoginIndexData'),
|
||||
|
||||
'createNewDirectLoginFunction': MochiKit.Base.method(this, 'createNewDirectLogin')
|
||||
});
|
||||
|
||||
this._records[reference] = record;
|
||||
} else {
|
||||
Clipperz.log("SKIPPING record " + reference + " as there are no stas associated - " + Clipperz.Base.serializeJSON(someData['records'][reference]));
|
||||
// # skip the record, as it seems it is not present in the DB
|
||||
// updateDate = Clipperz.PM.Date.formatDateWithUTCFormat(new Date());
|
||||
}
|
||||
}
|
||||
|
||||
for (indexReference in someData['directLogins']) {
|
||||
// var directLogin;
|
||||
var reference;
|
||||
var record;
|
||||
|
||||
reference = directLoginsInvertedIndex[indexReference];
|
||||
record = this._records[recordsInvertedIndex[someData['directLogins'][indexReference]['record']]];
|
||||
|
||||
if (record != null) {
|
||||
// directLogin = new Clipperz.PM.DataModel.DirectLogin({
|
||||
new Clipperz.PM.DataModel.DirectLogin({
|
||||
'reference': reference,
|
||||
'record': record
|
||||
});
|
||||
} else {
|
||||
Clipperz.log("WARNING: DIRECT LOGIN without a matching RECORD!!");
|
||||
//console.log("direct login data", someData['directLogins']);
|
||||
//console.log("current direct login data", someData['directLogins'][indexReference])
|
||||
//console.log("reference", reference);
|
||||
//console.log("record index", this.recordsIndex());
|
||||
//console.log("record inverted index", recordsInvertedIndex);
|
||||
}
|
||||
}
|
||||
|
||||
return this._records;
|
||||
}, this));
|
||||
innerDeferredResult.callback();
|
||||
} else {
|
||||
innerDeferredResult = MochiKit.Async.succeed(this._records);
|
||||
}
|
||||
|
||||
return innerDeferredResult;
|
||||
}, this));
|
||||
deferredResult.releaseLock(this.lock());
|
||||
deferredResult.callback();
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'updateRecordIndexForNewRecord': function (aNewRecord) {
|
||||
var newRecordIndex;
|
||||
var recordReference;
|
||||
|
||||
recordReference = aNewRecord.reference();
|
||||
newRecordIndex = (MochiKit.Base.listMax(MochiKit.Base.map(MochiKit.Base.partial(MochiKit.Base.operator.mul, 1), MochiKit.Base.values(this.recordsIndex()))) + 1) + '';
|
||||
this.recordsIndex()[recordReference] = newRecordIndex;
|
||||
|
||||
this.transientState().setValue('newlyCreatedRecordsIndex' + '.' + recordReference, newRecordIndex);
|
||||
this.transientState().setValue('newlyCreatedRecordsReferences' + '.' + recordReference, aNewRecord);
|
||||
},
|
||||
|
||||
//.........................................................................
|
||||
|
||||
'createNewRecord': function () {
|
||||
var deferredResult;
|
||||
var newRecord;
|
||||
|
||||
//console.log("#### new Clipperz.PM.DataModel.Record [4]");
|
||||
newRecord = new Clipperz.PM.DataModel.Record({
|
||||
'retrieveKeyFunction': MochiKit.Base.method(this, 'getRecordKey'),
|
||||
'retrieveRemoteDataFunction': this.retrieveRecordDetailFunction(),
|
||||
|
||||
'retrieveIndexDataFunction': MochiKit.Base.method(this, 'getRecordIndexData'),
|
||||
'updateIndexDataFunction': MochiKit.Base.method(this, 'updateRecordIndexData'),
|
||||
'updateDate': Clipperz.PM.Date.formatDateWithUTCFormat(new Date()),
|
||||
|
||||
'retrieveDirectLoginIndexDataFunction': MochiKit.Base.method(this, 'getDirectLoginIndexData'),
|
||||
'setDirectLoginIndexDataFunction': MochiKit.Base.method(this, 'setDirectLoginIndexData'),
|
||||
'removeDirectLoginIndexDataFunction': MochiKit.Base.method(this, 'removeDirectLoginIndexData'),
|
||||
|
||||
'createNewDirectLoginFunction': MochiKit.Base.method(this, 'createNewDirectLogin')
|
||||
});
|
||||
|
||||
this.transientState().setValue('newRecordsReferences' + '.' + newRecord.reference(), newRecord);
|
||||
this.updateRecordIndexForNewRecord(newRecord);
|
||||
|
||||
deferredResult = Clipperz.Async.callbacks("User.Header.RecordIndex.createNewRecord", [
|
||||
MochiKit.Base.method(this, 'records'),
|
||||
MochiKit.Base.partial(Clipperz.Async.setItemOnObject, newRecord.reference(), newRecord),
|
||||
MochiKit.Base.method(this, 'setRecordKey', newRecord.reference(), Clipperz.PM.Crypto.randomKey()),
|
||||
MochiKit.Base.method(newRecord, 'setLabel', ''),
|
||||
MochiKit.Base.partial(MochiKit.Async.succeed, newRecord)
|
||||
], {trace:false});
|
||||
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'deleteRecord': function (aRecord) {
|
||||
var deferredResult;
|
||||
var recordReference;
|
||||
|
||||
recordReference = aRecord.reference();
|
||||
|
||||
deferredResult = new Clipperz.Async.Deferred("User.Header.RecordIndex.deleteRecord", {trace:false});
|
||||
|
||||
deferredResult.addMethod(aRecord, 'directLogins');
|
||||
deferredResult.addCallback(MochiKit.Base.values);
|
||||
deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.method(this, 'removeDirectLogin'));
|
||||
|
||||
deferredResult.addMethod(this.recordsData(), 'removeValue', this.recordsIndex()[recordReference]);
|
||||
deferredResult.addCallback(MochiKit.Base.bind(function () {
|
||||
this.transientState().setValue('deleteRecordsIndex' + '.' + recordReference, this.recordsIndex()[recordReference]);
|
||||
delete this.recordsIndex()[recordReference];
|
||||
}, this));
|
||||
|
||||
deferredResult.addMethod(this, 'records');
|
||||
deferredResult.addCallback(MochiKit.Base.itemgetter(recordReference));
|
||||
deferredResult.addMethod(this.transientState(), 'setValue', 'deleteRecordsReferences' + '.' + recordReference);
|
||||
|
||||
deferredResult.addMethod(this, 'records');
|
||||
deferredResult.addCallback(MochiKit.Base.bind(function (someRecords) {
|
||||
delete someRecords[recordReference];
|
||||
}, this));
|
||||
deferredResult.callback();
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'removeDirectLogin': function (aDirectLogin) {
|
||||
this.directLoginsData().removeValue(this.directLoginsIndex()[aDirectLogin.reference()]);
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'createNewDirectLogin': function (aRecord) {
|
||||
var newDirectLogin;
|
||||
var newDirectLoginIndexValue;
|
||||
|
||||
newDirectLogin = new Clipperz.PM.DataModel.DirectLogin({record:aRecord});
|
||||
newDirectLoginIndexValue = MochiKit.Base.listMax(MochiKit.Base.map(function (aValue) { return aValue * 1; }, MochiKit.Base.values(this.directLoginsIndex()))) + 1;
|
||||
|
||||
this.transientState().setValue('newDirectLoginReferences' + '.' + newDirectLogin.reference(), newDirectLogin);
|
||||
|
||||
//console.log("UserHeaderRecordIndex.createNewDirectLogin [1]", newDirectLogin.reference(), newDirectLoginIndexValue);
|
||||
this.directLoginsIndex()[newDirectLogin.reference()] = newDirectLoginIndexValue;
|
||||
//console.log("UserHeaderRecordIndex.createNewDirectLogin [2]", newDirectLogin.reference(), this.directLoginsIndex()[newDirectLogin.reference()]);
|
||||
this.directLoginsData().setValue(this.directLoginsIndex()[newDirectLogin.reference()], {'record': this.recordsIndex()[aRecord.reference()]});
|
||||
|
||||
return newDirectLogin;
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'deleteAllCleanTextData': function () {
|
||||
return Clipperz.Async.callbacks("User.Header.RecordIndex.deleteAllCleanTextData", [
|
||||
// MochiKit.Base.method(this, 'records'),
|
||||
// MochiKit.Base.values,
|
||||
// MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('deleteAllCleanTextData')),
|
||||
|
||||
MochiKit.Base.method(this, 'recordsData'),
|
||||
MochiKit.Base.methodcaller('deleteAllCleanTextData'),
|
||||
MochiKit.Base.method(this, 'directLoginsData'),
|
||||
MochiKit.Base.methodcaller('deleteAllCleanTextData')
|
||||
], {trace:false});
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'hasAnyCleanTextData': function () {
|
||||
var deferredResult;
|
||||
|
||||
deferredResult = new Clipperz.Async.Deferred({trace:false});
|
||||
deferredResult.collectResults({
|
||||
'recordsData': [
|
||||
MochiKit.Base.method(this, 'recordsData'),
|
||||
MochiKit.Base.methodcaller('hasAnyCleanTextData')
|
||||
],
|
||||
'directLoginsData': [
|
||||
MochiKit.Base.method(this, 'directLoginsData'),
|
||||
MochiKit.Base.methodcaller('hasAnyCleanTextData')
|
||||
],
|
||||
// 'records': [
|
||||
// MochiKit.Base.method(this, 'records'),
|
||||
// MochiKit.Base.values,
|
||||
// MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('hasAnyCleanTextData')),
|
||||
// Clipperz.Async.collectAll
|
||||
// ]
|
||||
});
|
||||
//deferredResult.addCallback(function (aValue) { console.log("USER.Header.RecordIndex.hasAnyCleanTextData", aValue); return aValue});
|
||||
|
||||
// deferredResult.addCallback(MochiKit.Base.values);
|
||||
// deferredResult.addCallback(MochiKit.Base.flattenArguments);
|
||||
// deferredResult.addCallback(function(someValues) {
|
||||
// return MochiKit.Iter.some(someValues, MochiKit.Base.operator.identity);
|
||||
// });
|
||||
deferredResult.addCallback(Clipperz.Async.or);
|
||||
|
||||
deferredResult.callback();
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'hasPendingChanges': function () {
|
||||
var deferredResult;
|
||||
|
||||
deferredResult = new Clipperz.Async.Deferred("User.Header.RecordIndex.hasPendingChanges", {trace:false});
|
||||
deferredResult.collectResults({
|
||||
'recordsData': [
|
||||
MochiKit.Base.method(this, 'recordsData'),
|
||||
MochiKit.Base.methodcaller('hasPendingChanges')
|
||||
],
|
||||
'directLoginsData': [
|
||||
MochiKit.Base.method(this, 'directLoginsData'),
|
||||
MochiKit.Base.methodcaller('hasPendingChanges')
|
||||
]
|
||||
});
|
||||
//deferredResult.addCallback(function (aValue) { console.log("UserHeaderIndex.hasPendingResults", aValue); return aValue; });
|
||||
deferredResult.addCallback(Clipperz.Async.or);
|
||||
// deferredResult.addCallback(MochiKit.Base.values);
|
||||
// deferredResult.addCallback(MochiKit.Base.flattenArguments);
|
||||
// deferredResult.addCallback(function(someValues) {
|
||||
// return MochiKit.Iter.some(someValues, MochiKit.Base.operator.identity);
|
||||
// });
|
||||
deferredResult.callback();
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'commitTransientState': function () {
|
||||
var deferredResult;
|
||||
|
||||
deferredResut = Clipperz.Async.callbacks("User.Header.RecordIndex.commitTransientState", [
|
||||
MochiKit.Base.method(this, 'recordsData'),
|
||||
MochiKit.Base.methodcaller('commitTransientState'),
|
||||
|
||||
MochiKit.Base.method(this, 'directLoginsData'),
|
||||
MochiKit.Base.methodcaller('commitTransientState'),
|
||||
|
||||
MochiKit.Base.method(this, 'resetTransientState', true)
|
||||
], {trace:false});
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'revertChanges': function () {
|
||||
return Clipperz.Async.callbacks("User.Header.RecordIndex.revertChanges", [
|
||||
MochiKit.Base.method(this, 'recordsData'),
|
||||
MochiKit.Base.methodcaller('revertChanges'),
|
||||
|
||||
// MochiKit.Base.method(this, 'directLoginsData'),
|
||||
// MochiKit.Base.methodcaller('revertChanges'),
|
||||
|
||||
MochiKit.Base.method(this, 'records'),
|
||||
MochiKit.Base.bind(function (someRecords) {
|
||||
var recordReference;
|
||||
|
||||
for (recordReference in this.transientState().getValue('deleteRecordsReferences')) {
|
||||
this.recordsIndex()[recordReference] = this.transientState().getValue('deleteRecordsIndex' + '.' + recordReference);
|
||||
someRecords[recordReference] = this.transientState().getValue('deleteRecordsReferences' + '.' + recordReference);
|
||||
}
|
||||
|
||||
for (recordReference in this.transientState().getValue('newRecordsReferences')) {
|
||||
delete this.recordsIndex()[recordReference];
|
||||
delete someRecords[recordReference];
|
||||
}
|
||||
}, this),
|
||||
|
||||
// MochiKit.Base.method(this, 'directLogins'),
|
||||
MochiKit.Base.bind(function () {
|
||||
var directLoginReference;
|
||||
|
||||
// this.transientState().setValue('newDirectLoginReferences' + '.' + newDirectLogin.reference(), newDirectLogin);
|
||||
//
|
||||
// this.directLoginsIndex()[newDirectLogin.reference()] = newDirectLoginIndexValue;
|
||||
// this.directLoginsData().setValue(this.directLoginsIndex()[newDirectLogin.reference()], {'record': this.recordsIndex()[aRecord.reference()]});
|
||||
|
||||
|
||||
// for (directLoginReference in this.transientState().getValue('deleteDirectLoginReferences')) {
|
||||
// someDirectLogins[directLoginReference] = this.transientState().getValue('deleteDirectLoginReferences' + '.' + recordReference);
|
||||
// }
|
||||
|
||||
for (directLoginReference in this.transientState().getValue('newDirectLoginReferences')) {
|
||||
// this.directLoginsData().removeValue(this.directLoginsIndex()[directLoginReference]);
|
||||
delete this.directLoginsIndex()[directLoginReference];
|
||||
}
|
||||
}, this),
|
||||
|
||||
MochiKit.Base.method(this, 'directLoginsData'),
|
||||
MochiKit.Base.methodcaller('revertChanges'),
|
||||
|
||||
MochiKit.Base.method(this, 'resetTransientState', false)
|
||||
], {trace:false});
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'prepareRemoteDataWithKey': function (aKey) {
|
||||
// "records": {
|
||||
// "index": {
|
||||
// "eeda70e0392261967bda71c3764da78989c45bbd2bb7be6b941b90f81d9b81b5": "0",
|
||||
// "13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551": "1",
|
||||
// ...
|
||||
// "465a067a0bd2b470fa834de5397e38494de0c7707938262fae3427932e219744": "18",
|
||||
// "4fd1dc2ca860b7fb47cef10a84edb3270da05510b0a30a6b0b083898712d4b9e": "19"
|
||||
// },
|
||||
// "data": "n+AzGEEQXaSRSY4d ... BDypotrXgPo94uHfoXvGFzwCn8w="
|
||||
// },
|
||||
// "directLogins": {
|
||||
// "index": {
|
||||
// "61e87fdc4f1d9112e3b30c1f6812d095dcdb24f014c83319091eb6c9899ec348":"0",
|
||||
// "989593d4c48929f0c8f1581aa96969c622807e99619ed4732026e967530a68ad":"1",
|
||||
// ...
|
||||
// "cb9ae0bba1957075ccdbfd3b3481704d62087687a2ac7c411a4f07d444bde0f7":"17",
|
||||
// "7e1d069b7fa57c03bd7bf48807520feb953157834503aaff8c9d493f37dea69d":"18"
|
||||
// },
|
||||
// "data":"5YG9KKU/OZ5guUgFlms6k1 ... ZG/5Fn0uN+LoAsNfHm+EE62x"
|
||||
// },
|
||||
|
||||
var deferredResult;
|
||||
var result;
|
||||
|
||||
//console.log("recordsIndex", this.recordsIndex());
|
||||
result = {};
|
||||
|
||||
deferredResult = new Clipperz.Async.Deferred("User.Header.RecordIndex.prepareRemoteDataWithKey", {trace:false});
|
||||
deferredResult.collectResults({
|
||||
'index': MochiKit.Base.partial(MochiKit.Async.succeed, this.recordsIndex()),
|
||||
'data': [
|
||||
MochiKit.Base.method(this.recordsData(), 'prepareRemoteDataWithKey', aKey),
|
||||
MochiKit.Base.itemgetter('data')
|
||||
]
|
||||
});
|
||||
deferredResult.addCallback(Clipperz.Async.setItem, result, 'records');
|
||||
|
||||
deferredResult.collectResults({
|
||||
'index': MochiKit.Base.partial(MochiKit.Async.succeed, this.directLoginsIndex()),
|
||||
'data': [
|
||||
MochiKit.Base.method(this.directLoginsData(), 'prepareRemoteDataWithKey', aKey),
|
||||
MochiKit.Base.itemgetter('data')
|
||||
]
|
||||
});
|
||||
deferredResult.addCallback(Clipperz.Async.setItem, result, 'directLogins');
|
||||
|
||||
deferredResult.addCallback(MochiKit.Async.succeed, result);
|
||||
|
||||
deferredResult.callback();
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'updateRecordKeyAndPrepareRemoteData': function (aRecord) {
|
||||
var newRecordKey;
|
||||
var deferredResult;
|
||||
|
||||
newRecordKey = Clipperz.PM.Crypto.randomKey();
|
||||
|
||||
deferredResult = new Clipperz.Async.Deferred("User.Header.RecordIndex.updateRecordKeyAndPrepareRemoteData", {trace:false});
|
||||
deferredResult.addCallback(MochiKit.Base.method(aRecord, 'prepareRemoteDataWithKey', newRecordKey));
|
||||
deferredResult.addCallbackPass(MochiKit.Base.method(this, 'setRecordKey', aRecord.reference(), newRecordKey));
|
||||
deferredResult.callback();
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//.........................................................................
|
||||
|
||||
'removeNewRecordWithNoChanges': function (aRecord) {
|
||||
var deferredResult;
|
||||
var recordReference;
|
||||
|
||||
recordReference = aRecord.reference();
|
||||
|
||||
deferredResult = new Clipperz.Async.Deferred("User.Header.RecordIndex.removeNewRecordWithNoChanges", {trace:false});
|
||||
|
||||
deferredResult.addMethod(this.recordsData(), 'removeValue', this.recordsIndex()[recordReference]);
|
||||
deferredResult.addCallback(MochiKit.Base.bind(function () {
|
||||
delete this.recordsIndex()[recordReference];
|
||||
}, this));
|
||||
|
||||
deferredResult.addMethod(this, 'records');
|
||||
deferredResult.addCallback(MochiKit.Base.bind(function (someRecords) {
|
||||
delete someRecords[recordReference];
|
||||
}, this));
|
||||
deferredResult.callback();
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//.........................................................................
|
||||
|
||||
'prepareRemoteDataForChangedRecords': function () {
|
||||
var deferredResult;
|
||||
var result;
|
||||
|
||||
result = {};
|
||||
|
||||
deferredResult = new Clipperz.Async.Deferred("User.Header.RecordIndex.prepareRemoteDataForChangedRecords", {trace:false});
|
||||
|
||||
deferredResult.addMethod(this, 'records');
|
||||
deferredResult.addCallback(MochiKit.Base.values);
|
||||
deferredResult.addCallback(Clipperz.Async.deferredFilter, MochiKit.Base.methodcaller('isBrandNewWithNoPendingChanges'));
|
||||
deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.method(this, 'removeNewRecordWithNoChanges'));
|
||||
|
||||
deferredResult.addMethod(this, 'records');
|
||||
deferredResult.addCallback(MochiKit.Base.values);
|
||||
deferredResult.addCallback(Clipperz.Async.deferredFilter, MochiKit.Base.methodcaller('hasPendingChanges'));
|
||||
deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.method(this, 'updateRecordKeyAndPrepareRemoteData'));
|
||||
deferredResult.addCallback(Clipperz.Async.collectAll);
|
||||
|
||||
deferredResult.addCallback(Clipperz.Async.deferredIf("updated records != null", [
|
||||
MochiKit.Base.operator.identity
|
||||
], [
|
||||
MochiKit.Base.partial(MochiKit.Async.succeed, [])
|
||||
]));
|
||||
deferredResult.addCallback(Clipperz.Async.setItem, result, 'updated');
|
||||
|
||||
deferredResult.addMethod(this.transientState(), 'getValue', 'deleteRecordsReferences');
|
||||
deferredResult.addCallback(MochiKit.Base.keys);
|
||||
deferredResult.addCallback(Clipperz.Async.deferredIf("deleted records != null", [
|
||||
MochiKit.Base.operator.identity
|
||||
], [
|
||||
MochiKit.Base.partial(MochiKit.Async.succeed, [])
|
||||
]));
|
||||
deferredResult.addCallback(Clipperz.Async.setItem, result, 'deleted');
|
||||
|
||||
deferredResult.addCallback(MochiKit.Async.succeed, result);
|
||||
deferredResult.callback();
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
__syntaxFix__: "syntax fix"
|
||||
});
|
||||
|
||||
|
||||
|
||||
Clipperz.PM.DataModel.User.Header.RecordIndex.invertIndex = function (anIndex) {
|
||||
var result;
|
||||
var key;
|
||||
|
||||
result = {};
|
||||
|
||||
for (key in anIndex) {
|
||||
result[anIndex[key]] = key;
|
||||
}
|
||||
|
||||
return result;
|
||||
};
|
||||
817
frontend/gamma/js/Clipperz/PM/DataModel/User.js
Normal file
817
frontend/gamma/js/Clipperz/PM/DataModel/User.js
Normal file
@@ -0,0 +1,817 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
|
||||
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
|
||||
if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; }
|
||||
|
||||
|
||||
//#############################################################################
|
||||
|
||||
Clipperz.PM.DataModel.User = function (args) {
|
||||
args = args || {};
|
||||
|
||||
Clipperz.PM.DataModel.User.superclass.constructor.apply(this, arguments);
|
||||
|
||||
this._username = args.username || null;
|
||||
this._getPassphraseFunction = args.getPassphraseFunction || null;
|
||||
|
||||
this._data = null;
|
||||
|
||||
this._connection = null;
|
||||
this._connectionVersion = 'current';
|
||||
|
||||
this._serverData = null;
|
||||
this._serverLockValue = null;
|
||||
this._transientState = null;
|
||||
|
||||
this._deferredLocks = {
|
||||
'passphrase': new MochiKit.Async.DeferredLock(),
|
||||
'serverData': new MochiKit.Async.DeferredLock(),
|
||||
// 'recordsIndex': new MochiKit.Async.DeferredLock(),
|
||||
// 'directLoginsIndex': new MochiKit.Async.DeferredLock()
|
||||
// 'preferences': new MochiKit.Async.DeferredLock()
|
||||
// 'oneTimePasswords': new MochiKit.Async.DeferredLock()
|
||||
'__syntaxFix__': 'syntax fix'
|
||||
};
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
Clipperz.Base.extend(Clipperz.PM.DataModel.User, Object, {
|
||||
|
||||
'toString': function () {
|
||||
return "Clipperz.PM.DataModel.User - " + this.username();
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'username': function () {
|
||||
return this._username;
|
||||
},
|
||||
|
||||
'setUsername': function (aValue) {
|
||||
this._username = aValue;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'displayName': function() {
|
||||
return "" + this.username() + "";
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'data': function () {
|
||||
if (this._data == null) {
|
||||
this._data = new Clipperz.KeyValueObjectStore(/*{'name':'User.data [1]'}*/);
|
||||
};
|
||||
|
||||
return this._data;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'serverLockValue': function () {
|
||||
return this._serverLockValue;
|
||||
},
|
||||
|
||||
'setServerLockValue': function (aValue) {
|
||||
this._serverLockValue = aValue;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'transientState': function () {
|
||||
if (this._transientState == null) {
|
||||
this._transientState = {}
|
||||
}
|
||||
|
||||
return this._transientState;
|
||||
},
|
||||
|
||||
'resetTransientState': function (isCommitting) {
|
||||
this._transientState = null;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'deferredLockForSection': function(aSectionName) {
|
||||
return this._deferredLocks[aSectionName];
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'getPassphrase': function() {
|
||||
var deferredResult;
|
||||
|
||||
deferredResult = new Clipperz.Async.Deferred("User.getPassphrase", {trace:false});
|
||||
deferredResult.acquireLock(this.deferredLockForSection('passphrase'));
|
||||
deferredResult.addMethod(this.data(), 'deferredGetOrSet', 'passphrase', this.getPassphraseFunction());
|
||||
deferredResult.releaseLock(this.deferredLockForSection('passphrase'));
|
||||
deferredResult.callback();
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
'getPassphraseFunction': function () {
|
||||
return this._getPassphraseFunction;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'getCredentials': function () {
|
||||
return Clipperz.Async.collectResults("User; get username and passphrase", {
|
||||
'username': MochiKit.Base.method(this, 'username'),
|
||||
'password': MochiKit.Base.method(this, 'getPassphrase')
|
||||
}, {trace:false})();
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'changePassphrase': function (aNewValue) {
|
||||
return this.updateCredentials(this.username(), aNewValue);
|
||||
},
|
||||
|
||||
//.........................................................................
|
||||
|
||||
'updateCredentials': function (aUsername, aPassphrase) {
|
||||
var deferredResult;
|
||||
|
||||
deferredResult = new Clipperz.Async.Deferred("User.updateCredentials", {trace:false});
|
||||
// deferredResult.addMethod(this, 'getPassphrase');
|
||||
// deferredResult.setValue('currentPassphrase');
|
||||
deferredResult.addMethod(this.connection(), 'ping');
|
||||
deferredResult.addMethod(this, 'setUsername', aUsername)
|
||||
deferredResult.acquireLock(this.deferredLockForSection('passphrase'));
|
||||
deferredResult.addMethod(this.data(), 'deferredGetOrSet', 'passphrase', aPassphrase);
|
||||
deferredResult.releaseLock(this.deferredLockForSection('passphrase'));
|
||||
// deferredResult.getValue('currentPassphrase');
|
||||
deferredResult.addMethod(this, 'prepareRemoteDataWithKey', aPassphrase);
|
||||
deferredResult.addMethod(this.connection(), 'updateCredentials', aUsername, aPassphrase);
|
||||
deferredResult.callback();
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'initialSetupWithNoData': function () {
|
||||
this._serverData = {
|
||||
'version': '0.1',
|
||||
'statistics': "",
|
||||
'header': {
|
||||
'data': null,
|
||||
'version': Clipperz.PM.Crypto.encryptingFunctions.currentVersion,
|
||||
|
||||
'recordsIndex': new Clipperz.PM.DataModel.User.Header.RecordIndex({
|
||||
'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase'),
|
||||
'recordsData': {'data':null, 'index':{}},
|
||||
'recordsStats': null,
|
||||
'directLoginsData': {'data':null, 'index':{}},
|
||||
'encryptedDataVersion': Clipperz.PM.Crypto.encryptingFunctions.currentVersion,
|
||||
'retrieveRecordDetailFunction': MochiKit.Base.method(this, 'getRecordDetail')
|
||||
}),
|
||||
'preferences': new Clipperz.PM.DataModel.User.Header.Preferences({
|
||||
'name': 'preferences',
|
||||
'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase')
|
||||
}),
|
||||
'oneTimePasswords': new Clipperz.PM.DataModel.User.Header.OneTimePasswords({
|
||||
'name': 'preferences',
|
||||
'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase')
|
||||
})
|
||||
}
|
||||
};
|
||||
|
||||
// this._serverLockValue = Clipperz.PM.Crypto.randomKey();
|
||||
},
|
||||
|
||||
//.........................................................................
|
||||
|
||||
'registerAsNewAccount': function () {
|
||||
var deferredResult;
|
||||
|
||||
deferredResult = new Clipperz.Async.Deferred("User.registerAsNewAccount", {trace:false});
|
||||
deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'updateProgress', {'extraSteps':3});
|
||||
deferredResult.addMethod(this, 'initialSetupWithNoData')
|
||||
deferredResult.addMethod(this, 'getPassphrase');
|
||||
deferredResult.addMethod(this, 'prepareRemoteDataWithKey');
|
||||
deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
|
||||
deferredResult.addMethod(this.connection(), 'register');
|
||||
deferredResult.addCallback(MochiKit.Base.itemgetter('lock'));
|
||||
deferredResult.addMethod(this, 'setServerLockValue');
|
||||
deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'userSuccessfullyRegistered');
|
||||
|
||||
// deferredResult.addErrback (MochiKit.Base.method(this, 'handleRegistrationFailure'));
|
||||
|
||||
deferredResult.callback();
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'login': function () {
|
||||
var deferredResult;
|
||||
|
||||
deferredResult = new Clipperz.Async.Deferred("User.login", {trace:false});
|
||||
deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'updateProgress', {'extraSteps':3});
|
||||
deferredResult.addMethod(this, 'getPassphrase');
|
||||
deferredResult.addCallback(Clipperz.PM.DataModel.OneTimePassword.isValidOneTimePasswordValue);
|
||||
deferredResult.addCallback(Clipperz.Async.deferredIf("Is the passphrase an OTP", [
|
||||
MochiKit.Base.partial(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'updateProgress', {'extraSteps':1}),
|
||||
MochiKit.Base.method(this, 'getCredentials'),
|
||||
MochiKit.Base.method(this.connection(), 'redeemOneTimePassword'),
|
||||
MochiKit.Base.method(this.data(), 'setValue', 'passphrase')
|
||||
], []));
|
||||
deferredResult.addErrback(MochiKit.Base.method(this, 'getPassphrase'));
|
||||
deferredResult.addMethod(this.connection(), 'login');
|
||||
deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'userSuccessfullyLoggedIn');
|
||||
deferredResult.addErrback (MochiKit.Base.method(this, 'handleConnectionFallback'));
|
||||
|
||||
deferredResult.callback();
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//.........................................................................
|
||||
|
||||
'handleConnectionFallback': function(aValue) {
|
||||
var result;
|
||||
|
||||
if (aValue instanceof MochiKit.Async.CancelledError) {
|
||||
result = aValue;
|
||||
} else {
|
||||
this.setConnectionVersion(Clipperz.PM.Connection.communicationProtocol.fallbackVersions[this.connectionVersion()]);
|
||||
|
||||
if (this.connectionVersion() != null) {
|
||||
result = new Clipperz.Async.Deferred("User.handleConnectionFallback - retry");
|
||||
|
||||
result.addMethod(this, 'login');
|
||||
result.callback();
|
||||
} else {
|
||||
result = Clipperz.Async.callbacks("User.handleConnectionFallback - failed", [
|
||||
MochiKit.Base.method(this.data(), 'removeValue', 'passphrase'),
|
||||
MochiKit.Base.method(this, 'setConnectionVersion', 'current'),
|
||||
MochiKit.Base.partial(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'userLoginFailed'),
|
||||
MochiKit.Base.partial(MochiKit.Async.fail, Clipperz.PM.DataModel.User.exception.LoginFailed)
|
||||
], {trace:false});
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'lock': function () {
|
||||
return Clipperz.Async.callbacks("User.lock", [
|
||||
MochiKit.Base.method(this, 'deleteAllCleanTextData')
|
||||
], {trace:false});
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'logout': function () {
|
||||
return Clipperz.Async.callbacks("User.logout", [
|
||||
MochiKit.Base.method(this, 'deleteAllCleanTextData'),
|
||||
MochiKit.Base.method(this.connection(), 'logout')
|
||||
], {trace:false});
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'headerFormatVersion': function(anHeader) {
|
||||
var result;
|
||||
|
||||
if (anHeader.charAt(0) == '{') {
|
||||
var headerData;
|
||||
|
||||
headerData = Clipperz.Base.evalJSON(anHeader);
|
||||
result = headerData['version'];
|
||||
} else {
|
||||
result = 'LEGACY';
|
||||
}
|
||||
|
||||
return result;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'unpackServerData': function (someServerData) {
|
||||
var unpackedData;
|
||||
var headerVersion;
|
||||
|
||||
var recordsIndex;
|
||||
var preferences;
|
||||
var oneTimePasswords;
|
||||
|
||||
//console.log(">>> ***************** user.unpackServerData", someServerData);
|
||||
this.setServerLockValue(someServerData['lock']);
|
||||
|
||||
headerVersion = this.headerFormatVersion(someServerData['header']);
|
||||
|
||||
switch (headerVersion) {
|
||||
case 'LEGACY':
|
||||
var legacyHeader;
|
||||
|
||||
legacyHeader = new Clipperz.PM.DataModel.User.Header.Legacy({
|
||||
'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase'),
|
||||
'remoteData': {
|
||||
'data': someServerData['header'],
|
||||
'version': someServerData['version'],
|
||||
'recordsStats': someServerData['recordsStats']
|
||||
},
|
||||
// 'encryptedDataKeypath': 'data',
|
||||
// 'encryptedVersionKeypath': 'version',
|
||||
'retrieveRecordDetailFunction': MochiKit.Base.method(this, 'getRecordDetail')
|
||||
});
|
||||
|
||||
recordsIndex = legacyHeader;
|
||||
preferences = legacyHeader;
|
||||
oneTimePasswords = legacyHeader;
|
||||
break;
|
||||
case '0.1':
|
||||
var headerData;
|
||||
|
||||
headerData = Clipperz.Base.evalJSON(someServerData['header']);
|
||||
|
||||
recordsIndex = new Clipperz.PM.DataModel.User.Header.RecordIndex({
|
||||
'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase'),
|
||||
'recordsData': headerData['records'],
|
||||
'recordsStats': someServerData['recordsStats'],
|
||||
'directLoginsData': headerData['directLogins'],
|
||||
'encryptedDataVersion': someServerData['version'],
|
||||
'retrieveRecordDetailFunction': MochiKit.Base.method(this, 'getRecordDetail')
|
||||
});
|
||||
|
||||
// Still missing a test case that actually fais with the old version of the code, where the check for undefined was missing
|
||||
if (typeof(headerData['preferences']) != 'undefined') {
|
||||
preferences = new Clipperz.PM.DataModel.User.Header.Preferences({
|
||||
'name': 'preferences',
|
||||
'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase'),
|
||||
'remoteData': {
|
||||
'data': headerData['preferences']['data'],
|
||||
'version': someServerData['version']
|
||||
}
|
||||
});
|
||||
} else {
|
||||
preferences = new Clipperz.PM.DataModel.User.Header.Preferences({
|
||||
'name': 'preferences',
|
||||
'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase')
|
||||
});
|
||||
}
|
||||
|
||||
if (typeof(headerData['oneTimePasswords']) != 'undefined') {
|
||||
oneTimePasswords = new Clipperz.PM.DataModel.User.Header.OneTimePasswords({
|
||||
'name': 'preferences',
|
||||
'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase'),
|
||||
'remoteData': {
|
||||
'data': headerData['oneTimePasswords']['data'],
|
||||
'version': someServerData['version']
|
||||
}
|
||||
});
|
||||
} else {
|
||||
oneTimePasswords = new Clipperz.PM.DataModel.User.Header.OneTimePasswords({
|
||||
'name': 'preferences',
|
||||
'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase')
|
||||
});
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
unpackedData = {
|
||||
'version': someServerData['version'],
|
||||
'statistics': someServerData['statistics'],
|
||||
'header': {
|
||||
'data': someServerData['header'],
|
||||
'version': headerVersion,
|
||||
|
||||
'recordsIndex': recordsIndex,
|
||||
'preferences': preferences,
|
||||
'oneTimePasswords': oneTimePasswords
|
||||
}
|
||||
};
|
||||
|
||||
this._serverData = unpackedData;
|
||||
//console.log("<<< ***************** user.unpackServerData", this._serverData);
|
||||
|
||||
return this._serverData;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'getServerData': function() {
|
||||
var deferredResult;
|
||||
|
||||
deferredResult = new Clipperz.Async.Deferred("User.getServerData", {trace:false});
|
||||
deferredResult.acquireLock(this.deferredLockForSection('serverData'));
|
||||
deferredResult.addCallback(MochiKit.Base.bind(function(aResult) {
|
||||
var innerDeferredResult;
|
||||
|
||||
innerDeferredResult = new Clipperz.Async.Deferred("User.getUserDetails.innerDeferred", {trace:false});
|
||||
if (this._serverData == null) {
|
||||
innerDeferredResult.addCallbackPass(MochiKit.Signal.signal, this, 'loadingUserDetails');
|
||||
innerDeferredResult.addMethod(this.connection(), 'message', 'getUserDetails');
|
||||
innerDeferredResult.addMethod(this, 'unpackServerData');
|
||||
innerDeferredResult.addCallbackPass(MochiKit.Signal.signal, this, 'loadedUserDetails');
|
||||
}
|
||||
|
||||
innerDeferredResult.addCallback(MochiKit.Base.bind(function () {
|
||||
return this._serverData;
|
||||
},this));
|
||||
innerDeferredResult.callback();
|
||||
|
||||
return innerDeferredResult;
|
||||
}, this));
|
||||
deferredResult.releaseLock(this.deferredLockForSection('serverData'));
|
||||
deferredResult.callback();
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'connectionVersion': function() {
|
||||
return this._connectionVersion;
|
||||
},
|
||||
|
||||
'setConnectionVersion': function(aValue) {
|
||||
if (this._connectionVersion != aValue) {
|
||||
this.resetConnection();
|
||||
}
|
||||
this._connectionVersion = aValue;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'connection': function() {
|
||||
if ((this._connection == null) && (this.connectionVersion() != null) ){
|
||||
this._connection = new Clipperz.PM.Connection.communicationProtocol.versions[this.connectionVersion()]({
|
||||
getCredentialsFunction: MochiKit.Base.method(this, 'getCredentials')
|
||||
});
|
||||
}
|
||||
|
||||
return this._connection;
|
||||
},
|
||||
|
||||
'resetConnection': function(aValue) {
|
||||
if (this._connection != null) {
|
||||
this._connection.reset();
|
||||
}
|
||||
|
||||
this._connection = null;
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'getHeaderIndex': function (aKey) {
|
||||
return Clipperz.Async.callbacks("User.getHeaderIndex", [
|
||||
MochiKit.Base.method(this, 'getServerData'),
|
||||
MochiKit.Base.itemgetter('header'),
|
||||
MochiKit.Base.itemgetter(aKey)
|
||||
], {trace:false})
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'getRecords': function () {
|
||||
return Clipperz.Async.callbacks("User.getRecords", [
|
||||
MochiKit.Base.method(this, 'getHeaderIndex', 'recordsIndex'),
|
||||
MochiKit.Base.methodcaller('records'),
|
||||
MochiKit.Base.values
|
||||
], {trace:false});
|
||||
},
|
||||
|
||||
'recordWithLabel': function (aLabel) {
|
||||
return Clipperz.Async.callbacks("User.recordWithLabel", [
|
||||
MochiKit.Base.method(this, 'getRecords'),
|
||||
MochiKit.Base.partial(Clipperz.Async.deferredFilter, function (aRecord) {
|
||||
return Clipperz.Async.callbacks("User.recordWithLabel - check record label", [
|
||||
MochiKit.Base.methodcaller('label'),
|
||||
MochiKit.Base.partial(MochiKit.Base.operator.eq, aLabel)
|
||||
], {trace:false}, aRecord);
|
||||
}),
|
||||
function (someFilteredResults) {
|
||||
var result;
|
||||
|
||||
switch (someFilteredResults.length) {
|
||||
case 0:
|
||||
result = null;
|
||||
break;
|
||||
case 1:
|
||||
result = someFilteredResults[0];
|
||||
break;
|
||||
default:
|
||||
WTF = TODO;
|
||||
break;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
], {trace:false});
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'getRecord': function (aRecordReference) {
|
||||
return Clipperz.Async.callbacks("User.getRecord", [
|
||||
MochiKit.Base.method(this, 'getHeaderIndex', 'recordsIndex'),
|
||||
MochiKit.Base.methodcaller('records'),
|
||||
MochiKit.Base.itemgetter(aRecordReference),
|
||||
|
||||
Clipperz.Async.deferredIf("record != null", [
|
||||
MochiKit.Base.operator.identity
|
||||
], [
|
||||
function () { throw "Record does not exists"}
|
||||
])
|
||||
], {trace:false});
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'getRecordDetail': function (aRecordReference) {
|
||||
return this.connection().message('getRecordDetail', {reference: aRecordReference});
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'deleteRecord': function (aRecord) {
|
||||
return Clipperz.Async.callbacks("User.deleteRecord", [
|
||||
MochiKit.Base.method(this, 'getHeaderIndex', 'recordsIndex'),
|
||||
MochiKit.Base.methodcaller('deleteRecord', aRecord)
|
||||
], {trace:false});
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'createNewRecord': function () {
|
||||
return Clipperz.Async.callbacks("User.createNewRecord", [
|
||||
MochiKit.Base.method(this, 'getHeaderIndex', 'recordsIndex'),
|
||||
MochiKit.Base.methodcaller('createNewRecord')
|
||||
], {trace:false});
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'getDirectLogins': function() {
|
||||
var deferredResult;
|
||||
|
||||
deferredResult = new Clipperz.Async.Deferred("User.getDirectLogins", {trace:false});
|
||||
deferredResult.addMethod(this, 'getRecords');
|
||||
deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.compose(MochiKit.Base.values, MochiKit.Base.methodcaller('directLogins')));
|
||||
deferredResult.addCallback(MochiKit.Base.flattenArray);
|
||||
deferredResult.callback();
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'getOneTimePasswords': function () {
|
||||
return Clipperz.Async.callbacks("User.getOneTimePasswords", [
|
||||
MochiKit.Base.method(this, 'getHeaderIndex', 'oneTimePasswords'),
|
||||
MochiKit.Base.methodcaller('oneTimePasswords'),
|
||||
MochiKit.Base.values
|
||||
], {trace:false});
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'invokeMethodNamedOnHeader': function (aMethodName, aValue) {
|
||||
return Clipperz.Async.collectResults("User.invokeMethodNamedOnHeader [" + aMethodName + "]", {
|
||||
'recordIndex': [
|
||||
MochiKit.Base.method(this, 'getHeaderIndex', 'recordsIndex'),
|
||||
MochiKit.Base.methodcaller(aMethodName, aValue)
|
||||
],
|
||||
'preferences': [
|
||||
MochiKit.Base.method(this, 'getHeaderIndex', 'preferences'),
|
||||
MochiKit.Base.methodcaller(aMethodName, aValue)
|
||||
],
|
||||
'oneTimePasswords': [
|
||||
MochiKit.Base.method(this, 'getHeaderIndex', 'oneTimePasswords'),
|
||||
MochiKit.Base.methodcaller(aMethodName, aValue)
|
||||
]//,
|
||||
// 'statistics': [
|
||||
// MochiKit.Base.method(this, 'getStatistics'),
|
||||
// MochiKit.Base.methodcaller(aMethodName, aValue)
|
||||
// ]
|
||||
}, {trace:false})();
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'invokeMethodNamedOnRecords': function (aMethodName, aValue) {
|
||||
return Clipperz.Async.callbacks("User.invokeMethodNamedOnRecords[" + aMethodName + "]", [
|
||||
MochiKit.Base.method(this, 'getRecords'),
|
||||
MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller(aMethodName, aValue)),
|
||||
Clipperz.Async.collectAll
|
||||
], {trace:false});
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'hasPendingChanges': function () {
|
||||
var deferredResult;
|
||||
|
||||
deferredResult = new Clipperz.Async.Deferred("User.hasPendingChanges", {trace:false});
|
||||
deferredResult.collectResults({
|
||||
'header': [
|
||||
MochiKit.Base.method(this, 'invokeMethodNamedOnHeader', 'hasPendingChanges'),
|
||||
MochiKit.Base.values
|
||||
],
|
||||
'records': MochiKit.Base.method(this, 'invokeMethodNamedOnRecords', 'hasPendingChanges')
|
||||
});
|
||||
deferredResult.addCallback(Clipperz.Async.or);
|
||||
deferredResult.callback();
|
||||
// recordsIndex = legacyHeader;
|
||||
// preferences = legacyHeader;
|
||||
// oneTimePasswords = legacyHeader;
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'commitTransientState': function () {
|
||||
return Clipperz.Async.callbacks("User.commitTransientState", [
|
||||
MochiKit.Base.method(this, 'invokeMethodNamedOnHeader', 'commitTransientState'),
|
||||
MochiKit.Base.method(this, 'invokeMethodNamedOnRecords', 'commitTransientState'),
|
||||
|
||||
MochiKit.Base.method(this, 'transientState'),
|
||||
MochiKit.Base.itemgetter('lock'),
|
||||
MochiKit.Base.method(this, 'setServerLockValue'),
|
||||
MochiKit.Base.method(this, 'resetTransientState', true)
|
||||
], {trace:false});
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'revertChanges': function () {
|
||||
return Clipperz.Async.callbacks("User.revertChanges", [
|
||||
MochiKit.Base.method(this, 'invokeMethodNamedOnHeader', 'revertChanges'),
|
||||
MochiKit.Base.method(this, 'invokeMethodNamedOnRecords', 'revertChanges'),
|
||||
MochiKit.Base.method(this, 'resetTransientState', false)
|
||||
], {trace:false});
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'deleteAllCleanTextData': function () {
|
||||
return Clipperz.Async.callbacks("User.deleteAllCleanTextData", [
|
||||
MochiKit.Base.method(this, 'invokeMethodNamedOnRecords', 'deleteAllCleanTextData'),
|
||||
MochiKit.Base.method(this, 'invokeMethodNamedOnHeader', 'deleteAllCleanTextData'),
|
||||
|
||||
MochiKit.Base.method(this.data(), 'removeAllData'),
|
||||
MochiKit.Base.method(this, 'resetTransientState', false)
|
||||
], {trace:false});
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'hasAnyCleanTextData': function () {
|
||||
var deferredResult;
|
||||
|
||||
deferredResult = new Clipperz.Async.Deferred("User.hasAnyCleanTextData", {trace:false});
|
||||
deferredResult.collectResults({
|
||||
'header': [
|
||||
MochiKit.Base.method(this, 'invokeMethodNamedOnHeader', 'hasAnyCleanTextData'),
|
||||
MochiKit.Base.values
|
||||
],
|
||||
'records': MochiKit.Base.method(this, 'invokeMethodNamedOnRecords', 'hasAnyCleanTextData'),
|
||||
'data': MochiKit.Base.bind(function () {
|
||||
return MochiKit.Async.succeed(! this.data().isEmpty());
|
||||
}, this),
|
||||
'transientState': MochiKit.Base.bind(function () {
|
||||
return MochiKit.Async.succeed(MochiKit.Base.keys(this.transientState()).length != 0);
|
||||
}, this)
|
||||
});
|
||||
deferredResult.addCallback(Clipperz.Async.or);
|
||||
deferredResult.callback();
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'prepareRemoteDataWithKey': function (aKey /*, aCurrentKey*/) {
|
||||
var deferredResult;
|
||||
var result;
|
||||
|
||||
result = {};
|
||||
deferredResult = new Clipperz.Async.Deferred("User.prepareRemoteDataWithKey", {trace:false});
|
||||
deferredResult.addMethod(this, 'invokeMethodNamedOnHeader', 'prepareRemoteDataWithKey', aKey /*, aCurrentKey*/);
|
||||
deferredResult.addCallback(MochiKit.Base.bind(function (aResult, someHeaderPackedData) {
|
||||
var header;
|
||||
|
||||
header = {};
|
||||
header['records'] = someHeaderPackedData['recordIndex']['records'];
|
||||
header['directLogins'] = someHeaderPackedData['recordIndex']['directLogins'];
|
||||
header['preferences'] = {'data': someHeaderPackedData['preferences']['data']}; // this._serverData['header']['preferences']; // Clipperz.Base.evalJSON(this._serverData['header']['data'])['preferences']; // ???????????
|
||||
header['oneTimePasswords'] = {'data': someHeaderPackedData['oneTimePasswords']['data']}; // this._serverData['header']['oneTimePasswords']; // Clipperz.Base.evalJSON(this._serverData['header']['data'])['oneTimePasswords']; // ???????????
|
||||
header['version'] = '0.1';
|
||||
|
||||
aResult['header'] = Clipperz.Base.serializeJSON(header);
|
||||
aResult['statistics'] = this._serverData['statistics']; // "someHeaderPackedData['statistics']['data']";
|
||||
|
||||
return aResult;
|
||||
}, this), result);
|
||||
deferredResult.addCallback(Clipperz.Async.setItem, result, 'version', Clipperz.PM.Crypto.encryptingFunctions.currentVersion);
|
||||
deferredResult.addCallback(Clipperz.Async.setItem, result, 'lock', this.serverLockValue());
|
||||
deferredResult.callback();
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'saveChanges': function () {
|
||||
var deferredResult;
|
||||
var messageParameters;
|
||||
|
||||
messageParameters = {};
|
||||
|
||||
deferredResult = new Clipperz.Async.Deferred("User.saveChangaes", {trace:false});
|
||||
|
||||
deferredResult.addMethod(this, 'getHeaderIndex', 'recordsIndex');
|
||||
deferredResult.addCallback(MochiKit.Base.methodcaller('prepareRemoteDataForChangedRecords'));
|
||||
deferredResult.addCallback(Clipperz.Async.setItem, messageParameters, 'records');
|
||||
deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
|
||||
|
||||
deferredResult.addMethod(this, 'getPassphrase');
|
||||
deferredResult.addMethod(this, 'prepareRemoteDataWithKey');
|
||||
deferredResult.addCallback(Clipperz.Async.setItem, messageParameters, 'user');
|
||||
deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
|
||||
|
||||
deferredResult.addCallback(MochiKit.Async.succeed, messageParameters);
|
||||
deferredResult.addMethod(this.connection(), 'message', 'saveChanges');
|
||||
deferredResult.addCallback(MochiKit.Base.update, this.transientState())
|
||||
deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
|
||||
|
||||
deferredResult.addMethod(this, 'commitTransientState');
|
||||
deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
|
||||
deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'userDataSuccessfullySaved');
|
||||
|
||||
deferredResult.addErrbackPass(MochiKit.Base.method(this, 'revertChanges'));
|
||||
deferredResult.addErrbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'failureWhileSavingUserData');
|
||||
|
||||
deferredResult.callback();
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
__syntaxFix__: "syntax fix"
|
||||
});
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
Clipperz.PM.DataModel.User.registerNewAccount = function (anUsername, aPassphraseFunction) {
|
||||
var deferredResult;
|
||||
var user;
|
||||
|
||||
user = new Clipperz.PM.DataModel.User({'username':anUsername, 'getPassphraseFunction':aPassphraseFunction});
|
||||
|
||||
deferredResult = new Clipperz.Async.Deferred("Clipperz.PM.DataModel.User.registerNewAccount", {trace:false});
|
||||
deferredResult.addMethod(user, 'registerAsNewAccount');
|
||||
deferredResult.addMethod(user, 'login');
|
||||
deferredResult.addCallback(MochiKit.Async.succeed, user);
|
||||
deferredResult.callback();
|
||||
|
||||
return deferredResult;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
Clipperz.PM.DataModel.User.exception = {
|
||||
LoginFailed: new MochiKit.Base.NamedError("Clipperz.PM.DataModel.User.exception.LoginFailed"),
|
||||
CredentialUpgradeFailed: new MochiKit.Base.NamedError("Clipperz.PM.DataModel.User.exception.CredentialUpgradeFailed")
|
||||
};
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
201
frontend/gamma/js/Clipperz/PM/Date.js
Normal file
201
frontend/gamma/js/Clipperz/PM/Date.js
Normal file
@@ -0,0 +1,201 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
|
||||
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
|
||||
if (typeof(Clipperz.PM.Date) == 'undefined') { Clipperz.PM.Date = {}; }
|
||||
|
||||
Clipperz.PM.Date.VERSION = "0.1";
|
||||
Clipperz.PM.Date.NAME = "Clipperz.PM.Date";
|
||||
|
||||
MochiKit.Base.update(Clipperz.PM.Date, {
|
||||
|
||||
'__repr__': function () {
|
||||
return "[" + this.NAME + " " + this.VERSION + "]";
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'toString': function () {
|
||||
return this.__repr__();
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'locale': function() {
|
||||
return {
|
||||
'amDesignation': Clipperz.PM.Strings.getValue('calendarStrings.amDesignation'),
|
||||
'pmDesignation': Clipperz.PM.Strings.getValue('calendarStrings.pmDesignation'),
|
||||
'days': Clipperz.PM.Strings.getValue('calendarStrings.days'),
|
||||
'shortDays': Clipperz.PM.Strings.getValue('calendarStrings.shortDays'),
|
||||
'shortMonths': Clipperz.PM.Strings.getValue('calendarStrings.shortMonths'),
|
||||
'months': Clipperz.PM.Strings.getValue('calendarStrings.months')
|
||||
}
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
/*
|
||||
'formatDateWithPHPLikeTemplate': function(aDate, aTemplate) {
|
||||
return Clipperz.Date.formatDateWithPHPLikeTemplateAndLocale(aDate, aTemplate, Clipperz.PM.Date.locale());
|
||||
},
|
||||
|
||||
'parseDateWithPHPLikeTemplate': function(aDate, aTemplate) {
|
||||
return Clipperz.Date.parseDateWithPHPTemplateAndLocale(aDate, aTemplate, Clipperz.PM.Date.locale());
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'formatDateWithJavaLikeTemplate': function(aDate, aTemplate) {
|
||||
return Clipperz.Date.formatDateWithJavaLikeTemplateAndLocale(aDate, aTemplate, Clipperz.PM.Date.locale());
|
||||
},
|
||||
|
||||
'parseDateWithJavaLikeTemplate': function(aDate, aTemplate) {
|
||||
return Clipperz.Date.parseDateWithJavaLikeTemplateAndLocale(aDate, aTemplate, Clipperz.PM.Date.locale());
|
||||
},
|
||||
*/
|
||||
//=========================================================================
|
||||
|
||||
'formatWithTemplate': function (aTemplate, aDate) {
|
||||
return Clipperz.PM.Date.formatDateWithTemplate(aDate, aTemplate);
|
||||
},
|
||||
|
||||
'formatDateWithTemplate': function(aDate, aTemplate) {
|
||||
var result;
|
||||
|
||||
if (aDate == null) {
|
||||
result = ""
|
||||
} else {
|
||||
result = Clipperz.Date.formatDateWithPHPLikeTemplateAndLocale(aDate, aTemplate, Clipperz.PM.Date.locale());
|
||||
};
|
||||
|
||||
return result;
|
||||
},
|
||||
|
||||
'parseDateWithTemplate': function(aValue, aTemplate) {
|
||||
return Clipperz.Date.parseDateWithPHPTemplateAndLocale(aValue, aTemplate, Clipperz.PM.Date.locale());
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'formatDateWithUTCFormat': function(aDate) {
|
||||
return Clipperz.Date.formatDateWithUTCFormatAndLocale(aDate, Clipperz.PM.Date.locale());
|
||||
},
|
||||
|
||||
'parseDateWithUTCFormat': function(aValue) {
|
||||
var result;
|
||||
|
||||
if (aValue == null) {
|
||||
result = null;
|
||||
} else {
|
||||
result = Clipperz.Date.parseDateWithUTCFormatAndLocale(aValue, Clipperz.PM.Date.locale());
|
||||
}
|
||||
|
||||
return result;
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'getElapsedTimeDescription': function(aDate) {
|
||||
var result;
|
||||
|
||||
result = ""
|
||||
|
||||
if (aDate != null) {
|
||||
var now;
|
||||
var elapsedTime;
|
||||
|
||||
var millisencondsInAMinute;
|
||||
var millisencondsInAnHour;
|
||||
var millisencondsInADay;
|
||||
var millisencondsInAWeek;
|
||||
var millisencondsInAMonth;
|
||||
|
||||
now = new Date();
|
||||
elapsedTime = now.getTime() - aDate.getTime();
|
||||
|
||||
millisencondsInAMinute = 60 * 1000;
|
||||
millisencondsInAnHour = millisencondsInAMinute * 60;
|
||||
millisencondsInADay = millisencondsInAnHour * 24;
|
||||
millisencondsInAWeek = millisencondsInADay * 7;
|
||||
millisencondsInAMonth = millisencondsInAWeek * 5;
|
||||
|
||||
if ((elapsedTime / millisencondsInAMonth) > 1) {
|
||||
result = Clipperz.PM.Strings.getValue('elapsedTimeDescriptions.MORE_THAN_A_MONTH_AGO');
|
||||
} else if ((elapsedTime / millisencondsInAWeek) > 1) {
|
||||
var elapsedWeeks;
|
||||
|
||||
elapsedWeeks = Math.floor((elapsedTime / millisencondsInAWeek));
|
||||
if (elapsedWeeks == 1) {
|
||||
result = Clipperz.PM.Strings.getValue('elapsedTimeDescriptions.MORE_THAN_A_WEEK_AGO');
|
||||
} else {
|
||||
result = Clipperz.PM.Strings.getValue('elapsedTimeDescriptions.MORE_THAN_*_WEEKS_AGO').replace(/__elapsed__/, elapsedWeeks);
|
||||
}
|
||||
} else if ((elapsedTime / millisencondsInADay) > 1) {
|
||||
var elapsedDays;
|
||||
|
||||
elapsedDays = Math.floor((elapsedTime / millisencondsInADay));
|
||||
if (elapsedDays == 1) {
|
||||
result = Clipperz.PM.Strings.getValue('elapsedTimeDescriptions.YESTERDAY');
|
||||
} else {
|
||||
result = Clipperz.PM.Strings.getValue('elapsedTimeDescriptions.*_DAYS_AGO').replace(/__elapsed__/, elapsedDays);
|
||||
}
|
||||
} else if ((elapsedTime / millisencondsInAnHour) > 1) {
|
||||
var elapsedHours;
|
||||
|
||||
elapsedHours = Math.floor((elapsedTime / millisencondsInAnHour));
|
||||
if (elapsedHours == 1) {
|
||||
result = Clipperz.PM.Strings.getValue('elapsedTimeDescriptions.ABOUT_AN_HOUR_AGO');
|
||||
} else {
|
||||
result = Clipperz.PM.Strings.getValue('elapsedTimeDescriptions.*_HOURS_AGO').replace(/__elapsed__/, elapsedHours);
|
||||
}
|
||||
} else {
|
||||
var elapsed10Minutes;
|
||||
|
||||
elapsed10Minutes = (Math.floor((elapsedTime / millisencondsInAMinute) / 10)) * 10;
|
||||
if (elapsed10Minutes == 0) {
|
||||
result = Clipperz.PM.Strings.getValue('elapsedTimeDescriptions.JUST_A_FEW_MINUTES_AGO');
|
||||
} else {
|
||||
result = Clipperz.PM.Strings.getValue('elapsedTimeDescriptions.ABOUT_*_MINUTES_AGO').replace(/__elapsed__/, elapsed10Minutes+"");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'parse': function (aValue) {
|
||||
return Clipperz.PM.Date.parseDateWithUTCFormat(aValue);
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
__syntaxFix__: "syntax fix"
|
||||
|
||||
});
|
||||
|
||||
172
frontend/gamma/js/Clipperz/PM/Proxy.js
Normal file
172
frontend/gamma/js/Clipperz/PM/Proxy.js
Normal file
@@ -0,0 +1,172 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
|
||||
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
|
||||
|
||||
//=============================================================================
|
||||
|
||||
Clipperz.PM.Proxy = function(args) {
|
||||
args = args || {};
|
||||
|
||||
this._shouldPayTolls = args.shouldPayTolls || false;
|
||||
|
||||
this._tolls = {
|
||||
'CONNECT': [],
|
||||
'REGISTER': [],
|
||||
'MESSAGE': []
|
||||
};
|
||||
|
||||
if (args.isDefault === true) {
|
||||
Clipperz.PM.Proxy.defaultProxy = this;
|
||||
}
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
Clipperz.PM.Proxy.prototype = MochiKit.Base.update(null, {
|
||||
|
||||
'toString': function() {
|
||||
return "Clipperz.PM.Proxy";
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'shouldPayTolls': function() {
|
||||
return this._shouldPayTolls;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'tolls': function() {
|
||||
return this._tolls;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'payToll': function(aRequestType, someParameters) {
|
||||
var deferredResult;
|
||||
|
||||
//console.log(">>> Proxy.payToll", aRequestType, someParameters);
|
||||
if (this.shouldPayTolls()) {
|
||||
deferredResult = new Clipperz.Async.Deferred("Proxy.payToll", {trace:false});
|
||||
|
||||
if (this.tolls()[aRequestType].length == 0) {
|
||||
deferredResult.addMethod(this, 'sendMessage', 'knock', {requestType:aRequestType});
|
||||
deferredResult.addMethod(this, 'setTollCallback');
|
||||
}
|
||||
deferredResult.addMethod(this.tolls()[aRequestType], 'pop');
|
||||
deferredResult.addCallback(MochiKit.Base.methodcaller('deferredPay'));
|
||||
deferredResult.addCallback(function(aToll) {
|
||||
var result;
|
||||
|
||||
result = {
|
||||
parameters: someParameters,
|
||||
toll: aToll
|
||||
}
|
||||
|
||||
return result;
|
||||
});
|
||||
|
||||
deferredResult.callback();
|
||||
} else {
|
||||
deferredResult = MochiKit.Async.succeed({parameters:someParameters});
|
||||
}
|
||||
//console.log("<<< Proxy.payToll");
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'addToll': function(aToll) {
|
||||
//console.log(">>> Proxy.addToll", aToll);
|
||||
this.tolls()[aToll.requestType()].push(aToll);
|
||||
//console.log("<<< Proxy.addToll");
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'setTollCallback': function(someParameters) {
|
||||
//console.log(">>> Proxy.setTollCallback", someParameters);
|
||||
if (typeof(someParameters['toll']) != 'undefined') {
|
||||
//console.log("added a new toll", someParameters['toll']);
|
||||
this.addToll(new Clipperz.PM.Toll(someParameters['toll']));
|
||||
}
|
||||
//console.log("<<< Proxy.setTallCallback", someParameters['result']);
|
||||
return someParameters['result'];
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'registration': function (someParameters) {
|
||||
return this.processMessage('registration', someParameters, 'REGISTER');
|
||||
},
|
||||
|
||||
'handshake': function (someParameters) {
|
||||
return this.processMessage('handshake', someParameters, 'CONNECT');
|
||||
},
|
||||
|
||||
'message': function (someParameters) {
|
||||
return this.processMessage('message', someParameters, 'MESSAGE');
|
||||
},
|
||||
|
||||
'logout': function (someParameters) {
|
||||
return this.processMessage('logout', someParameters, 'MESSAGE');
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'processMessage': function (aFunctionName, someParameters, aRequestType) {
|
||||
var deferredResult;
|
||||
|
||||
deferredResult = new Clipperz.Async.Deferred("Proxy.processMessage", {trace:false});
|
||||
deferredResult.addMethod(this, 'payToll', aRequestType);
|
||||
deferredResult.addMethod(this, 'sendMessage', aFunctionName);
|
||||
deferredResult.addMethod(this, 'setTollCallback');
|
||||
deferredResult.callback(someParameters);
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'sendMessage': function () {
|
||||
throw Clipperz.Base.exception.AbstractMethod;
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'isReadOnly': function () {
|
||||
return false;
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
__syntaxFix__: "syntax fix"
|
||||
|
||||
});
|
||||
94
frontend/gamma/js/Clipperz/PM/Proxy/Proxy.JSON.js
Executable file
94
frontend/gamma/js/Clipperz/PM/Proxy/Proxy.JSON.js
Executable file
@@ -0,0 +1,94 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
|
||||
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
|
||||
|
||||
//=============================================================================
|
||||
|
||||
Clipperz.PM.Proxy.JSON = function(args) {
|
||||
Clipperz.PM.Proxy.JSON.superclass.constructor.call(this, args);
|
||||
|
||||
this._url = args.url || Clipperz.Base.exception.raise('MandatoryParameter');
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
Clipperz.Base.extend(Clipperz.PM.Proxy.JSON, Clipperz.PM.Proxy, {
|
||||
|
||||
'toString': function() {
|
||||
return "Clipperz.PM.Proxy.JSON";
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'url': function () {
|
||||
return this._url;
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'sendMessage': function(aFunctionName, someParameters) {
|
||||
var deferredResult;
|
||||
var parameters;
|
||||
|
||||
parameters = {
|
||||
method: aFunctionName,
|
||||
// version: someParameters['version'],
|
||||
// message: someParameters['message'],
|
||||
parameters: Clipperz.Base.serializeJSON(someParameters)
|
||||
};
|
||||
|
||||
deferredResult = new Clipperz.Async.Deferred("Proxy.JSON.sendMessage", {trace:false});
|
||||
deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'remoteRequestSent');
|
||||
deferredResult.addCallback(MochiKit.Async.doXHR, this.url(), {
|
||||
method:'POST',
|
||||
sendContent:MochiKit.Base.queryString(parameters),
|
||||
headers:{"Content-Type":"application/x-www-form-urlencoded"}
|
||||
});
|
||||
deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'remoteRequestReceived');
|
||||
// deferredResult.addCallback(MochiKit.Async.evalJSONRequest);
|
||||
deferredResult.addCallback(MochiKit.Base.itemgetter('responseText'));
|
||||
deferredResult.addCallback(Clipperz.Base.evalJSON);
|
||||
deferredResult.addCallback(function (someValues) {
|
||||
if (someValues['result'] == 'EXCEPTION') {
|
||||
throw someValues['message'];
|
||||
}
|
||||
|
||||
return someValues;
|
||||
})
|
||||
// return MochiKit.Base.evalJSON(req.responseText);
|
||||
deferredResult.callback();
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
__syntaxFix__: "syntax fix"
|
||||
|
||||
});
|
||||
811
frontend/gamma/js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js
Normal file
811
frontend/gamma/js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js
Normal file
@@ -0,0 +1,811 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
try { if (typeof(Clipperz.PM.Proxy.Offline) == 'undefined') { throw ""; }} catch (e) {
|
||||
throw "Clipperz.PM.Proxy.Offline.DataStore depends on Clipperz.PM.Proxy.Offline!";
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
|
||||
Clipperz.PM.Proxy.Offline.DataStore = function(args) {
|
||||
args = args || {};
|
||||
|
||||
this._data = args.data || (typeof(_clipperz_dump_data_) != 'undefined' ? _clipperz_dump_data_ : null);
|
||||
this._isReadOnly = (typeof(args.readOnly) == 'undefined' ? true : args.readOnly);
|
||||
this._shouldPayTolls = args.shouldPayTolls || false;
|
||||
|
||||
this._tolls = {};
|
||||
this._currentStaticConnection = null;
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
Clipperz.Base.extend(Clipperz.PM.Proxy.Offline.DataStore, Object, {
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'isReadOnly': function () {
|
||||
return this._isReadOnly;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'shouldPayTolls': function() {
|
||||
return this._shouldPayTolls;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'data': function () {
|
||||
return this._data;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'tolls': function () {
|
||||
return this._tolls;
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'resetData': function() {
|
||||
this._data = {
|
||||
'users': {
|
||||
'catchAllUser': {
|
||||
__masterkey_test_value__: 'masterkey',
|
||||
s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00',
|
||||
v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00'
|
||||
}
|
||||
}
|
||||
};
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'setupWithEncryptedData': function(someData) {
|
||||
this._data = Clipperz.Base.deepClone(someData);
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'setupWithData': function(someData) {
|
||||
var deferredResult;
|
||||
var resultData;
|
||||
var i, c;
|
||||
|
||||
//Clipperz.log(">>> Proxy.Test.setupWithData");
|
||||
resultData = this._data;
|
||||
|
||||
deferredResult = new Clipperz.Async.Deferred("Proxy.Test.seupWithData", {trace:false});
|
||||
c = someData['users'].length;
|
||||
|
||||
for (i=0; i<c; i++) {
|
||||
var newConnection;
|
||||
var recordConfiguration;
|
||||
|
||||
deferredResult.addMethod(this, 'userSerializedEncryptedData', someData['users'][i]);
|
||||
deferredResult.addCallback(MochiKit.Base.bind(function(aUserSerializationContext) {
|
||||
//console.log("SERIALIZED USER", aUserSerializationContext);
|
||||
resultData['users'][aUserSerializationContext['credentials']['C']] = {
|
||||
's': aUserSerializationContext['credentials']['s'],
|
||||
'v': aUserSerializationContext['credentials']['v'],
|
||||
'version': aUserSerializationContext['data']['connectionVersion'],
|
||||
'userDetails': aUserSerializationContext['encryptedData']['user']['header'],
|
||||
'userDetailsVersion': aUserSerializationContext['encryptedData']['user']['version'],
|
||||
'statistics': aUserSerializationContext['encryptedData']['user']['statistics'],
|
||||
'lock': aUserSerializationContext['encryptedData']['user']['lock'],
|
||||
'records': this.rearrangeRecordsData(aUserSerializationContext['encryptedData']['records'])
|
||||
}
|
||||
}, this));
|
||||
}
|
||||
|
||||
deferredResult.addCallback(MochiKit.Base.bind(function() {
|
||||
//console.log("this._data", resultData);
|
||||
this._data = resultData;
|
||||
}, this));
|
||||
|
||||
deferredResult.callback();
|
||||
//Clipperz.log("<<< Proxy.Test.setupWithData");
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'getTollForRequestType': function (aRequestType) {
|
||||
var result;
|
||||
var targetValue;
|
||||
var cost;
|
||||
|
||||
targetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2);
|
||||
switch (aRequestType) {
|
||||
case 'REGISTER':
|
||||
cost = 5;
|
||||
break;
|
||||
case 'CONNECT':
|
||||
cost = 5;
|
||||
break;
|
||||
case 'MESSAGE':
|
||||
cost = 2;
|
||||
break;
|
||||
}
|
||||
|
||||
result = {
|
||||
requestType: aRequestType,
|
||||
targetValue: targetValue,
|
||||
cost: cost
|
||||
}
|
||||
|
||||
if (this.shouldPayTolls()) {
|
||||
this.tolls()[targetValue] = result;
|
||||
}
|
||||
|
||||
return result;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'checkToll': function (aFunctionName, someParameters) {
|
||||
if (this.shouldPayTolls()) {
|
||||
var localToll;
|
||||
var tollParameters;
|
||||
|
||||
tollParameters = someParameters['toll'];
|
||||
localToll = this.tolls()[tollParameters['targetValue']];
|
||||
|
||||
if (localToll != null) {
|
||||
if (! Clipperz.PM.Toll.validate(tollParameters['targetValue'], tollParameters['toll'], localToll['cost'])) {
|
||||
throw "Toll value too low.";
|
||||
};
|
||||
} else {
|
||||
throw "Missing toll";
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'currentStaticConnection': function () {
|
||||
if (this._currentStaticConnection == null) {
|
||||
this._currentStaticConnection = {};
|
||||
}
|
||||
|
||||
return this._currentStaticConnection;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'getConnectionForRequest': function (aFunctionName, someParameters) {
|
||||
var result;
|
||||
|
||||
if (this.shouldPayTolls()) {
|
||||
if ((typeof(someParameters['toll']) != 'undefined') && (typeof(someParameters['toll']['targetValue']) != 'undefined')) {
|
||||
result = this.tolls()[someParameters['toll']['targetValue']]['connection'];
|
||||
if (typeof(result) == 'undefined') {
|
||||
result = {};
|
||||
}
|
||||
} else {
|
||||
result = {};
|
||||
}
|
||||
} else {
|
||||
result = this.currentStaticConnection();
|
||||
}
|
||||
|
||||
return result;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'storeConnectionForRequestWithConnectionAndResponse': function (aFunctionName, someParameters, aConnection, aResponse) {
|
||||
if (this.shouldPayTolls()) {
|
||||
if ((typeof(aResponse['toll']) != 'undefined')
|
||||
&& (typeof(aResponse['toll']['targetValue']) != 'undefined')
|
||||
&& (typeof(this.tolls()[aResponse['toll']['targetValue']]) != 'undefined')
|
||||
) {
|
||||
this.tolls()[aResponse['toll']['targetValue']]['connection'] = aConnection;
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'processMessage': function (aFunctionName, someParameters) {
|
||||
var result;
|
||||
var connection;
|
||||
|
||||
connection = this.getConnectionForRequest(aFunctionName, someParameters);
|
||||
|
||||
switch(aFunctionName) {
|
||||
case 'knock':
|
||||
result = this._knock(connection, someParameters);
|
||||
break;
|
||||
case 'registration':
|
||||
this.checkToll(aFunctionName, someParameters);
|
||||
result = this._registration(connection, someParameters.parameters);
|
||||
break;
|
||||
case 'handshake':
|
||||
this.checkToll(aFunctionName, someParameters);
|
||||
result = this._handshake(connection, someParameters.parameters);
|
||||
break;
|
||||
case 'message':
|
||||
this.checkToll(aFunctionName, someParameters);
|
||||
result = this._message(connection, someParameters.parameters);
|
||||
break;
|
||||
case 'logout':
|
||||
this._currentStaticConnection = null;
|
||||
result = this._logout(connection, someParameters.parameters);
|
||||
break;
|
||||
}
|
||||
|
||||
this.storeConnectionForRequestWithConnectionAndResponse(aFunctionName, someParameters, connection, result);
|
||||
|
||||
return MochiKit.Async.succeed(result);
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'_knock': function(aConnection, someParameters) {
|
||||
var result;
|
||||
|
||||
result = {
|
||||
toll: this.getTollForRequestType(someParameters['requestType'])
|
||||
}
|
||||
|
||||
return result;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'_registration': function(aConnection, someParameters) {
|
||||
if (this.isReadOnly() == false) {
|
||||
if (typeof(this.data()['users'][someParameters['credentials']['C']]) == 'undefined') {
|
||||
this.data()['users'][someParameters['credentials']['C']] = {
|
||||
's': someParameters['credentials']['s'],
|
||||
'v': someParameters['credentials']['v'],
|
||||
'version': someParameters['credentials']['version'],
|
||||
'lock': Clipperz.Crypto.Base.generateRandomSeed(),
|
||||
'userDetails': someParameters['user']['header'],
|
||||
'statistics': someParameters['user']['statistics'],
|
||||
'userDetailsVersion': someParameters['user']['version'],
|
||||
'records': {}
|
||||
}
|
||||
} else {
|
||||
throw "user already exists";
|
||||
}
|
||||
} else {
|
||||
throw Clipperz.PM.Proxy.Offline.DataStore.exception.ReadOnly;
|
||||
}
|
||||
|
||||
result = {
|
||||
result: {
|
||||
'lock': this.data()['users'][someParameters['credentials']['C']]['lock'],
|
||||
'result': 'done'
|
||||
},
|
||||
toll: this.getTollForRequestType('CONNECT')
|
||||
}
|
||||
|
||||
return result;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'_handshake': function(aConnection, someParameters) {
|
||||
var result;
|
||||
var nextTollRequestType;
|
||||
|
||||
result = {};
|
||||
if (someParameters.message == "connect") {
|
||||
var userData;
|
||||
var randomBytes;
|
||||
var v;
|
||||
|
||||
userData = this.data()['users'][someParameters.parameters.C];
|
||||
|
||||
if ((typeof(userData) != 'undefined') && (userData['version'] == someParameters.version)) {
|
||||
aConnection['userData'] = userData;
|
||||
aConnection['C'] = someParameters.parameters.C;
|
||||
} else {
|
||||
aConnection['userData'] = this.data()['users']['catchAllUser'];
|
||||
}
|
||||
|
||||
randomBytes = Clipperz.Crypto.Base.generateRandomSeed();
|
||||
aConnection['b'] = new Clipperz.Crypto.BigInt(randomBytes, 16);
|
||||
v = new Clipperz.Crypto.BigInt(aConnection['userData']['v'], 16);
|
||||
aConnection['B'] = v.add(Clipperz.Crypto.SRP.g().powerModule(aConnection['b'], Clipperz.Crypto.SRP.n()));
|
||||
|
||||
aConnection['A'] = someParameters.parameters.A;
|
||||
|
||||
result['s'] = aConnection['userData']['s'];
|
||||
result['B'] = aConnection['B'].asString(16);
|
||||
|
||||
nextTollRequestType = 'CONNECT';
|
||||
} else if (someParameters.message == "credentialCheck") {
|
||||
var v, u, S, A, K, M1;
|
||||
|
||||
v = new Clipperz.Crypto.BigInt(aConnection['userData']['v'], 16);
|
||||
u = new Clipperz.Crypto.BigInt(Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters.version].hash(new Clipperz.ByteArray(aConnection['B'].asString(10))).toHexString(), 16);
|
||||
A = new Clipperz.Crypto.BigInt(aConnection['A'], 16);
|
||||
S = (A.multiply(v.powerModule(u, Clipperz.Crypto.SRP.n()))).powerModule(aConnection['b'], Clipperz.Crypto.SRP.n());
|
||||
|
||||
K = Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters.version].hash(new Clipperz.ByteArray(S.asString(10))).toHexString().slice(2);
|
||||
|
||||
M1 = Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters.version].hash(new Clipperz.ByteArray(A.asString(10) + aConnection['B'].asString(10) + K)).toHexString().slice(2);
|
||||
if (someParameters.parameters.M1 == M1) {
|
||||
var M2;
|
||||
|
||||
M2 = Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters.version].hash(new Clipperz.ByteArray(A.asString(10) + someParameters.parameters.M1 + K)).toHexString().slice(2);
|
||||
result['M2'] = M2;
|
||||
} else {
|
||||
throw new Error("Client checksum verification failed! Expected <" + M1 + ">, received <" + someParameters.parameters.M1 + ">.", "Error");
|
||||
}
|
||||
|
||||
nextTollRequestType = 'MESSAGE';
|
||||
} else if (someParameters.message == "oneTimePassword") {
|
||||
var otpData;
|
||||
|
||||
otpData = this.data()['onetimePasswords'][someParameters.parameters.oneTimePasswordKey];
|
||||
|
||||
try {
|
||||
if (typeof(otpData) != 'undefined') {
|
||||
if (otpData['status'] == 'ACTIVE') {
|
||||
if (otpData['key_checksum'] == someParameters.parameters.oneTimePasswordKeyChecksum) {
|
||||
result = {
|
||||
'data': otpData['data'],
|
||||
'version': otpData['version']
|
||||
}
|
||||
|
||||
otpData['status'] = 'REQUESTED';
|
||||
} else {
|
||||
otpData['status'] = 'DISABLED';
|
||||
throw "The requested One Time Password has been disabled, due to a wrong keyChecksum";
|
||||
}
|
||||
} else {
|
||||
throw "The requested One Time Password was not active";
|
||||
}
|
||||
} else {
|
||||
throw "The requested One Time Password has not been found"
|
||||
}
|
||||
} catch (exception) {
|
||||
result = {
|
||||
'data': Clipperz.PM.Crypto.randomKey(),
|
||||
'version': Clipperz.PM.Connection.communicationProtocol.currentVersion
|
||||
}
|
||||
}
|
||||
nextTollRequestType = 'CONNECT';
|
||||
} else {
|
||||
MochiKit.Logging.logError("Clipperz.PM.Proxy.Test.handshake - unhandled message: " + someParameters.message);
|
||||
}
|
||||
|
||||
result = {
|
||||
result: result,
|
||||
toll: this.getTollForRequestType(nextTollRequestType)
|
||||
}
|
||||
|
||||
return result;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'_message': function(aConnection, someParameters) {
|
||||
var result;
|
||||
|
||||
result = {};
|
||||
|
||||
//=====================================================================
|
||||
//
|
||||
// R E A D - O N L Y M e t h o d s
|
||||
//
|
||||
//=====================================================================
|
||||
if (someParameters.message == 'getUserDetails') {
|
||||
var recordsStats;
|
||||
var recordReference;
|
||||
|
||||
recordsStats = {};
|
||||
for (recordReference in aConnection['userData']['records']) {
|
||||
recordsStats[recordReference] = {
|
||||
'updateDate': aConnection['userData']['records'][recordReference]['updateDate']
|
||||
}
|
||||
}
|
||||
|
||||
result['header'] = this.userDetails(aConnection);
|
||||
result['statistics'] = this.statistics(aConnection);
|
||||
result['maxNumberOfRecords'] = aConnection['userData']['maxNumberOfRecords'];
|
||||
result['version'] = aConnection['userData']['userDetailsVersion'];
|
||||
result['recordsStats'] = recordsStats;
|
||||
|
||||
if (this.isReadOnly() == false) {
|
||||
var lock;
|
||||
|
||||
if (typeof(aConnection['userData']['lock']) == 'undefined') {
|
||||
aConnection['userData']['lock'] = "<<LOCK>>";
|
||||
}
|
||||
|
||||
result['lock'] = aConnection['userData']['lock'];
|
||||
}
|
||||
|
||||
//=====================================================================
|
||||
} else if (someParameters.message == 'getRecordDetail') {
|
||||
/*
|
||||
var recordData;
|
||||
var currentVersionData;
|
||||
|
||||
recordData = this.userData()['records'][someParameters['parameters']['reference']];
|
||||
result['reference'] = someParameters['parameters']['reference'];
|
||||
result['data'] = recordData['data'];
|
||||
result['version'] = recordData['version'];
|
||||
result['creationData'] = recordData['creationDate'];
|
||||
result['updateDate'] = recordData['updateDate'];
|
||||
result['accessDate'] = recordData['accessDate'];
|
||||
|
||||
currentVersionData = recordData['versions'][recordData['currentVersion']];
|
||||
|
||||
result['currentVersion'] = {};
|
||||
result['currentVersion']['reference'] = recordData['currentVersion'];
|
||||
result['currentVersion']['version'] = currentVersionData['version'];
|
||||
result['currentVersion']['header'] = currentVersionData['header'];
|
||||
result['currentVersion']['data'] = currentVersionData['data'];
|
||||
result['currentVersion']['creationData'] = currentVersionData['creationDate'];
|
||||
result['currentVersion']['updateDate'] = currentVersionData['updateDate'];
|
||||
result['currentVersion']['accessDate'] = currentVersionData['accessDate'];
|
||||
if (typeof(currentVersionData['previousVersion']) != 'undefined') {
|
||||
result['currentVersion']['previousVersionKey'] = currentVersionData['previousVersionKey'];
|
||||
result['currentVersion']['previousVersion'] = currentVersionData['previousVersion'];
|
||||
}
|
||||
*/
|
||||
MochiKit.Base.update(result, aConnection['userData']['records'][someParameters['parameters']['reference']]);
|
||||
result['reference'] = someParameters['parameters']['reference'];
|
||||
|
||||
//=====================================================================
|
||||
//
|
||||
// R E A D - W R I T E M e t h o d s
|
||||
//
|
||||
//=====================================================================
|
||||
} else if (someParameters.message == 'upgradeUserCredentials') {
|
||||
if (this.isReadOnly() == false) {
|
||||
var parameters;
|
||||
var credentials;
|
||||
|
||||
parameters = someParameters['parameters'];
|
||||
credentials = parameters['credentials'];
|
||||
|
||||
if ((credentials['C'] == null)
|
||||
|| (credentials['s'] == null)
|
||||
|| (credentials['v'] == null)
|
||||
|| (credentials['version'] != Clipperz.PM.Connection.communicationProtocol.currentVersion)
|
||||
) {
|
||||
result = Clipperz.PM.DataModel.User.exception.CredentialUpgradeFailed;
|
||||
} else {
|
||||
var oldCValue;
|
||||
oldCValue = aConnection['C'];
|
||||
|
||||
this.data()['users'][credentials['C']] = aConnection['userData'];
|
||||
aConnection['C'] = credentials['C'];
|
||||
|
||||
aConnection['userData']['s'] = credentials['s'];
|
||||
aConnection['userData']['v'] = credentials['v'];
|
||||
aConnection['userData']['version'] = credentials['version'];
|
||||
|
||||
aConnection['userData']['userDetails'] = parameters['user']['header'];
|
||||
aConnection['userData']['userDetailsVersion'] = parameters['user']['version'];
|
||||
aConnection['userData']['statistics'] = parameters['user']['statistics'];
|
||||
|
||||
aConnection['userData']['lock'] = parameters['user']['lock'];
|
||||
|
||||
delete this.data()['users'][oldCValue];
|
||||
|
||||
result = {result:"done", parameters:parameters};
|
||||
}
|
||||
} else {
|
||||
throw Clipperz.PM.Proxy.Offline.DataStore.exception.ReadOnly;
|
||||
}
|
||||
//=====================================================================
|
||||
/* } else if (someParameters.message == 'updateData') {
|
||||
if (this.isReadOnly() == false) {
|
||||
var i, c;
|
||||
|
||||
//console.log("###===============================================================");
|
||||
//console.log("###>>>", Clipperz.Base.serializeJSON(someParameters));
|
||||
//console.log("###--- userData", Clipperz.Base.serializeJSON(this.userData()));
|
||||
if (this.userData()['lock'] != someParameters['parameters']['user']['lock']) {
|
||||
throw "the lock attribute is not processed correctly"
|
||||
}
|
||||
|
||||
this.userData()['userDetails'] = someParameters['parameters']['user']['header'];
|
||||
this.userData()['statistics'] = someParameters['parameters']['user']['statistics'];
|
||||
this.userData()['userDetailsVersions'] = someParameters['parameters']['user']['version'];
|
||||
|
||||
c = someParameters['parameters']['records'].length;
|
||||
for (i=0; i<c; i++) {
|
||||
var currentRecord;
|
||||
var currentRecordData;
|
||||
|
||||
currentRecordData = someParameters['parameters']['records'][i];
|
||||
currentRecord = this.userData()['records'][currentRecordData['record']['reference']];
|
||||
|
||||
if (currentRecord == null) {
|
||||
}
|
||||
|
||||
currentRecord['data'] = currentRecordData['record']['data'];
|
||||
currentRecord['version'] = currentRecordData['record']['version'];
|
||||
currentRecord['currentVersion'] = currentRecordData['currentRecordVersion']['reference'];
|
||||
|
||||
currentRecord['versions'][currentRecordData['currentRecordVersion']['reference']] = {
|
||||
'data': currentRecordData['currentRecordVersion']['data'],
|
||||
'version': currentRecordData['currentRecordVersion']['version'],
|
||||
'previousVersion': currentRecordData['currentRecordVersion']['previousVersion'],
|
||||
'previousVersionKey': currentRecordData['currentRecordVersion']['previousVersionKey']
|
||||
}
|
||||
}
|
||||
|
||||
this.userData()['lock'] = Clipperz.PM.Crypto.randomKey();
|
||||
result['lock'] = this.userData()['lock'];
|
||||
result['result'] = 'done';
|
||||
//console.log("###<<< userData", Clipperz.Base.serializeJSON(this.userData()));
|
||||
} else {
|
||||
throw Clipperz.PM.Proxy.Offline.DataStore.exception.ReadOnly;
|
||||
}
|
||||
*/ //=====================================================================
|
||||
} else if (someParameters.message == 'saveChanges') {
|
||||
if (this.isReadOnly() == false) {
|
||||
var i, c;
|
||||
|
||||
//console.log("###===============================================================");
|
||||
//console.log("###>>>", someParameters);
|
||||
//console.log("###>>>", Clipperz.Base.serializeJSON(someParameters));
|
||||
//console.log("###--- userData", Clipperz.Base.serializeJSON(this.userData()));
|
||||
//console.log("###===============================================================");
|
||||
//console.log("--- userData.lock ", this.userData()['lock']);
|
||||
//console.log("--- parameters.lock", someParameters['parameters']['user']['lock']);
|
||||
if (aConnection['userData']['lock'] != someParameters['parameters']['user']['lock']) {
|
||||
throw "the lock attribute is not processed correctly"
|
||||
}
|
||||
|
||||
aConnection['userData']['userDetails'] = someParameters['parameters']['user']['header'];
|
||||
aConnection['userData']['statistics'] = someParameters['parameters']['user']['statistics'];
|
||||
aConnection['userData']['userDetailsVersions'] = someParameters['parameters']['user']['version'];
|
||||
|
||||
c = someParameters['parameters']['records']['updated'].length;
|
||||
for (i=0; i<c; i++) {
|
||||
var currentRecord;
|
||||
var currentRecordData;
|
||||
|
||||
currentRecordData = someParameters['parameters']['records']['updated'][i];
|
||||
currentRecord = aConnection['userData']['records'][currentRecordData['record']['reference']];
|
||||
|
||||
if (
|
||||
(typeof(aConnection['userData']['records'][currentRecordData['record']['reference']]) == 'undefined')
|
||||
&&
|
||||
(typeof(currentRecordData['currentRecordVersion']) == 'undefined')
|
||||
) {
|
||||
//console.log("######## SHIT HAPPENS");
|
||||
throw "Record added without a recordVersion";
|
||||
}
|
||||
|
||||
if (currentRecord == null) {
|
||||
currentRecord = {};
|
||||
currentRecord['versions'] = {};
|
||||
currentRecord['creationDate'] = Clipperz.PM.Date.formatDateWithUTCFormat(new Date());
|
||||
currentRecord['accessDate'] = Clipperz.PM.Date.formatDateWithUTCFormat(new Date());
|
||||
|
||||
aConnection['userData']['records'][currentRecordData['record']['reference']] = currentRecord;
|
||||
}
|
||||
|
||||
currentRecord['data'] = currentRecordData['record']['data'];
|
||||
currentRecord['version'] = currentRecordData['record']['version'];
|
||||
currentRecord['updateDate'] = Clipperz.PM.Date.formatDateWithUTCFormat(new Date());
|
||||
|
||||
if (typeof(currentRecordData['currentRecordVersion']) != 'undefined') {
|
||||
currentRecord['currentVersion'] = currentRecordData['currentRecordVersion']['reference'];
|
||||
currentRecord['versions'][currentRecordData['currentRecordVersion']['reference']] = {
|
||||
'data': currentRecordData['currentRecordVersion']['data'],
|
||||
'version': currentRecordData['currentRecordVersion']['version'],
|
||||
'previousVersion': currentRecordData['currentRecordVersion']['previousVersion'],
|
||||
'previousVersionKey': currentRecordData['currentRecordVersion']['previousVersionKey'],
|
||||
'creationDate': Clipperz.PM.Date.formatDateWithUTCFormat(new Date()),
|
||||
'updateDate': Clipperz.PM.Date.formatDateWithUTCFormat(new Date()),
|
||||
'accessDate': Clipperz.PM.Date.formatDateWithUTCFormat(new Date())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
c = someParameters['parameters']['records']['deleted'].length;
|
||||
for (i=0; i<c; i++) {
|
||||
var currentRecordReference;
|
||||
|
||||
currentRecordReference = someParameters['parameters']['records']['deleted'][i];
|
||||
//console.log("DELETING records", currentRecordReference);
|
||||
delete aConnection['userData']['records'][currentRecordReference];
|
||||
}
|
||||
|
||||
aConnection['userData']['lock'] = Clipperz.PM.Crypto.randomKey();
|
||||
result['lock'] = aConnection['userData']['lock'];
|
||||
result['result'] = 'done';
|
||||
//console.log("###<<< userData", Clipperz.Base.serializeJSON(this.userData()));
|
||||
} else {
|
||||
throw Clipperz.PM.Proxy.Offline.DataStore.exception.ReadOnly;
|
||||
}
|
||||
|
||||
//=====================================================================
|
||||
//
|
||||
// U N H A N D L E D M e t h o d
|
||||
//
|
||||
//=====================================================================
|
||||
} else {
|
||||
MochiKit.Logging.logError("Clipperz.PM.Proxy.Test.message - unhandled message: " + someParameters.message);
|
||||
}
|
||||
|
||||
result = {
|
||||
result: result,
|
||||
toll: this.getTollForRequestType('MESSAGE')
|
||||
}
|
||||
|
||||
// return MochiKit.Async.succeed(result);
|
||||
return result;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'_logout': function(someParameters) {
|
||||
// return MochiKit.Async.succeed({result: 'done'});
|
||||
return {result: 'done'};
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
//#########################################################################
|
||||
|
||||
'isTestData': function(aConnection) {
|
||||
return (typeof(aConnection['userData']['__masterkey_test_value__']) != 'undefined');
|
||||
},
|
||||
|
||||
'userDetails': function(aConnection) {
|
||||
var result;
|
||||
|
||||
if (this.isTestData(aConnection)) {
|
||||
var serializedHeader;
|
||||
var version;
|
||||
|
||||
//MochiKit.Logging.logDebug("### test data");
|
||||
version = aConnection['userData']['userDetailsVersion'];
|
||||
serializedHeader = Clipperz.Base.serializeJSON(aConnection['userData']['userDetails']);
|
||||
result = Clipperz.PM.Crypto.encryptingFunctions.versions[version].encrypt(aConnection['userData']['__masterkey_test_value__'], serializedHeader);
|
||||
} else {
|
||||
//MochiKit.Logging.logDebug("### NOT test data");
|
||||
result = aConnection['userData']['userDetails'];
|
||||
}
|
||||
|
||||
return result;
|
||||
},
|
||||
|
||||
'statistics': function(aConnection) {
|
||||
var result;
|
||||
|
||||
if (aConnection['userData']['statistics'] != null) {
|
||||
if (this.isTestData(aConnection)) {
|
||||
var serializedStatistics;
|
||||
var version;
|
||||
|
||||
version = aConnection['userData']['userDetailsVersion'];
|
||||
serializedStatistics = Clipperz.Base.serializeJSON(aConnection['userData']['statistics']);
|
||||
result = Clipperz.PM.Crypto.encryptingFunctions.versions[version].encrypt(aConnection['userData']['__masterkey_test_value__'], serializedStatistics);
|
||||
} else {
|
||||
result = aConnection['userData']['statistics'];
|
||||
}
|
||||
} else {
|
||||
result = null;
|
||||
}
|
||||
|
||||
return result;
|
||||
},
|
||||
|
||||
/*
|
||||
'userSerializedEncryptedData': function(someData) {
|
||||
var deferredResult;
|
||||
var deferredContext;
|
||||
|
||||
deferredContext = { 'data': someData };
|
||||
|
||||
deferredResult = new Clipperz.Async.Deferred('Proxy.Test.serializeUserEncryptedData', {trace:false});
|
||||
deferredResult.addCallback(MochiKit.Base.bind(function(aDeferredContext) {
|
||||
aDeferredContext['user'] = this.createUserUsingConfigurationData(aDeferredContext['data']);
|
||||
return aDeferredContext;
|
||||
}, this));
|
||||
deferredResult.addCallback(function(aDeferredContext) {
|
||||
// return aDeferredContext['user'].encryptedDataUsingVersion(aDeferredContext['data']['version']);
|
||||
return aDeferredContext['user'].serializedDataUsingVersion(MochiKit.Base.values(aDeferredContext['user'].records()), aDeferredContext['data']['version']);
|
||||
});
|
||||
deferredResult.addCallback(function(aUserEncryptedData) {
|
||||
deferredContext['encryptedData'] = aUserEncryptedData;
|
||||
return deferredContext;
|
||||
});
|
||||
deferredResult.addCallback(function(aDeferredContext) {
|
||||
var connection;
|
||||
|
||||
connection = new Clipperz.PM.Connection.communicationProtocol.versions[aDeferredContext['data']['connectionVersion']]()
|
||||
aDeferredContext['credentials'] = connection.serverSideUserCredentials(aDeferredContext['user'].username(),aDeferredContext['user'].passphrase());
|
||||
|
||||
return aDeferredContext;
|
||||
});
|
||||
|
||||
// deferredResult.addCallback(function(aDeferredContext) {
|
||||
//console.log("#-#-#-#-#", aDeferredContext);
|
||||
// return aDeferredContext['user'].serializedDataUsingVersion(MochiKit.Base.values(aDeferredContext['user'].records()), aDeferredContext['data']['version']);
|
||||
// }, deferredContext);
|
||||
// deferredResult.addCallback(function(aUserSerializedData) {
|
||||
//console.log("USER SERIALIZED DATA", aUserSerializedData);
|
||||
// });
|
||||
//
|
||||
// deferredResult.addCallback(MochiKit.Async.succeed, deferredContext);
|
||||
deferredResult.callback(deferredContext);
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
'createUserUsingConfigurationData': function(someData) {
|
||||
var result;
|
||||
var user;
|
||||
var recordLabel;
|
||||
|
||||
user = new Clipperz.PM.DataModel.User();
|
||||
user.initForTests();
|
||||
user.setUsername(someData['username']);
|
||||
user.setPassphrase(someData['passphrase']);
|
||||
|
||||
for (recordLabel in someData['records']) {
|
||||
var recordData;
|
||||
var record;
|
||||
var i, c;
|
||||
|
||||
recordData = someData['records'][recordLabel];
|
||||
record = new Clipperz.PM.DataModel.Record({user:user, label:recordLabel});
|
||||
record.setNotes(recordData['notes']);
|
||||
|
||||
c = recordData['fields'].length;
|
||||
for (i=0; i<c; i++) {
|
||||
var recordField;
|
||||
|
||||
recordField = new Clipperz.PM.DataModel.RecordField();
|
||||
recordField.setLabel(recordData['fields'][i]['name']);
|
||||
recordField.setValue(recordData['fields'][i]['value']);
|
||||
recordField.setType(recordData['fields'][i]['type']);
|
||||
record.addField(recordField);
|
||||
}
|
||||
user.addRecord(record, true);
|
||||
}
|
||||
|
||||
result = user;
|
||||
|
||||
return result;
|
||||
},
|
||||
*/
|
||||
//=========================================================================
|
||||
__syntaxFix__: "syntax fix"
|
||||
});
|
||||
|
||||
Clipperz.PM.Proxy.Offline.DataStore['exception'] = {
|
||||
'ReadOnly': new MochiKit.Base.NamedError("Clipperz.PM.Proxy.Offline.DataStore.exception.ReadOnly")
|
||||
};
|
||||
67
frontend/gamma/js/Clipperz/PM/Proxy/Proxy.Offline.js
Normal file
67
frontend/gamma/js/Clipperz/PM/Proxy/Proxy.Offline.js
Normal file
@@ -0,0 +1,67 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
|
||||
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
|
||||
|
||||
//=============================================================================
|
||||
|
||||
Clipperz.PM.Proxy.Offline = function(args) {
|
||||
args = args || {};
|
||||
|
||||
Clipperz.PM.Proxy.Offline.superclass.constructor.call(this, args);
|
||||
|
||||
this._dataStore = args.dataStore || new Clipperz.PM.Proxy.Offline.DataStore(args);
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
Clipperz.Base.extend(Clipperz.PM.Proxy.Offline, Clipperz.PM.Proxy, {
|
||||
|
||||
'toString': function () {
|
||||
return "Clipperz.PM.Proxy.Offline";
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'dataStore': function () {
|
||||
return this._dataStore;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'sendMessage': function(aFunctionName, someParameters) {
|
||||
return this.dataStore().processMessage(aFunctionName, someParameters);
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
__syntaxFix__: "syntax fix"
|
||||
|
||||
});
|
||||
|
||||
167
frontend/gamma/js/Clipperz/PM/Proxy/Proxy.Test.js
Normal file
167
frontend/gamma/js/Clipperz/PM/Proxy/Proxy.Test.js
Normal file
@@ -0,0 +1,167 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
|
||||
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
|
||||
if (typeof(Clipperz.PM.Proxy) == 'undefined') { Clipperz.PM.Proxy = {}; }
|
||||
|
||||
//=============================================================================
|
||||
|
||||
Clipperz.PM.Proxy.Test = function(args) {
|
||||
Clipperz.PM.Proxy.Test.superclass.constructor.call(this, args);
|
||||
|
||||
args = args || {};
|
||||
|
||||
this._expectedRequests = (args.shouldCheckExpectedRequests === true) ? [] : null;
|
||||
this._isExpectingRequests = true;
|
||||
this._unexpectedRequests = [];
|
||||
|
||||
this.dataStore().resetData();
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
Clipperz.Base.extend(Clipperz.PM.Proxy.Test, Clipperz.PM.Proxy.Offline, {
|
||||
|
||||
'toString': function() {
|
||||
return "Clipperz.PM.Proxy.Test";
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'expectedRequests': function () {
|
||||
return this._expectedRequests;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'shouldCheckExpectedRequests': function () {
|
||||
return (this._expectedRequests != null);
|
||||
},
|
||||
|
||||
'setShouldCheckExpectedRequests': function(aValue) {
|
||||
if (aValue) {
|
||||
this._expectedRequests = aValue;
|
||||
} else {
|
||||
this._expectedRequests = null;
|
||||
}
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'shouldNotReceiveAnyFurtherRequest': function () {
|
||||
this._isExpectingRequests = false;
|
||||
},
|
||||
|
||||
'mayReceiveMoreRequests': function () {
|
||||
this._isExpectingRequests = true;
|
||||
this.resetUnexpectedRequests();
|
||||
},
|
||||
|
||||
'isExpectingRequests': function () {
|
||||
return this._isExpectingRequests;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'unexpectedRequests': function () {
|
||||
return this._unexpectedRequests;
|
||||
},
|
||||
|
||||
'resetUnexpectedRequests': function () {
|
||||
this._unexpectedRequests = [];
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'testExpectedRequestParameters': function (aPath, anActualRequest, anExpectedRequest) {
|
||||
var aKey;
|
||||
//console.log(">>> Proxy.testExpectedRequestParameters [" + aPath + "]", anActualRequest, anExpectedRequest);
|
||||
for (aKey in anExpectedRequest) {
|
||||
if (typeof(anActualRequest[aKey]) == 'undefined') {
|
||||
throw "the expected paramter [" + aKey + "] is missing from the actual request";
|
||||
}
|
||||
if (typeof(anExpectedRequest[aKey]) == 'object') {
|
||||
this.testExpectedRequestParameters(aPath + "." + aKey, anActualRequest[aKey], anExpectedRequest[aKey])
|
||||
} else {
|
||||
if (! anExpectedRequest[aKey](anActualRequest[aKey])) {
|
||||
throw "wrong value for paramter [" + aKey + "]; got '" + anActualRequest[aKey] + "'";
|
||||
}
|
||||
}
|
||||
}
|
||||
//console.log("<<< Proxy.testExpectedRequestParameters");
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'checkRequest': function(aFunctionName, someParameters) {
|
||||
if (this.shouldCheckExpectedRequests()) {
|
||||
var expectedRequest;
|
||||
|
||||
//console.log(">>> Proxy.Test.checkRequest - " + aFunctionName, someParameters);
|
||||
expectedRequest = this.expectedRequests().pop();
|
||||
//console.log("--- Proxy.Test.checkRequest - expectedRequest", expectedRequest);
|
||||
if (expectedRequest == null) {
|
||||
throw "Proxy.Test.sentMessage: no expected result specified. Got request '" + aFunctionName + "': " + someParameters;
|
||||
}
|
||||
|
||||
try {
|
||||
if (aFunctionName != expectedRequest.functionName) {
|
||||
throw "wrong function name. Got '" + aFunctionName + "', expected '" + expectedRequest.request.functionName + "'";
|
||||
}
|
||||
|
||||
this.testExpectedRequestParameters("parameters", someParameters, expectedRequest.parameters);
|
||||
} catch(exception) {
|
||||
//console.log("EXCEPTION: Proxy.Test.sentMessage[" + expectedRequest.name + "]", exception)
|
||||
throw "Proxy.Test.sentMessage[" + expectedRequest.name + "]: " + exception;
|
||||
}
|
||||
}
|
||||
//console.log("<<< Proxy.Test.checkRequest");
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'sendMessage': function(aFunctionName, someParameters) {
|
||||
var result;
|
||||
|
||||
if (this.isExpectingRequests() == false) {
|
||||
// throw Clipperz.PM.Connection.exception.UnexpectedRequest;
|
||||
Clipperz.log("UNEXPECTED REQUEST " + aFunctionName /* + ": " + Clipperz.Base.serializeJSON(someParameters) */);
|
||||
this.unexpectedRequests().push({'functionName':aFunctionName, 'someParameters': someParameters});
|
||||
};
|
||||
this.checkRequest(aFunctionName, someParameters);
|
||||
result = Clipperz.PM.Proxy.Test.superclass.sendMessage.call(this, aFunctionName, someParameters);
|
||||
|
||||
return result;
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
__syntaxFix__: "syntax fix"
|
||||
|
||||
});
|
||||
|
||||
295
frontend/gamma/js/Clipperz/PM/Strings.js
Normal file
295
frontend/gamma/js/Clipperz/PM/Strings.js
Normal file
@@ -0,0 +1,295 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
|
||||
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
|
||||
if (typeof(Clipperz.PM.Strings) == 'undefined') { Clipperz.PM.Strings = {}; }
|
||||
if (typeof(Clipperz.PM.Strings.Languages) == 'undefined') { Clipperz.PM.Strings.Languages = {}; }
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
/*
|
||||
Clipperz.PM.Strings.standardStrings = {
|
||||
'loginPanelSwitchLanguageSelectOptions': [
|
||||
/ *
|
||||
{tag:'option', html:"Arabic (Oman) (العربية)", value:'ar-OM', disabled:true},
|
||||
{tag:'option', html:"Arabic (Syria) (العربية)", value:'ar-SY', disabled:true},
|
||||
{tag:'option', html:"Bahasa Indonesia", value:'id-ID', disabled:true},
|
||||
{tag:'option', html:"Bulgarian (Български)", value:'bg-BG', disabled:true},
|
||||
{tag:'option', html:"Català", value:'ca-ES', disabled:true},
|
||||
{tag:'option', html:"Chinese (Simplified) (简体中文)", value:'zh-CN', disabled:true},
|
||||
{tag:'option', html:"Chinese (Traditional) (正體中文)", value:'zh-TW', disabled:true},
|
||||
{tag:'option', html:"Czech (Česky)", value:'cs-CZ', disabled:true},
|
||||
{tag:'option', html:"Dansk", value:'da-DK', disabled:true},
|
||||
{tag:'option', html:"Deutsch", value:'de-DE'/ *, disabled:true* /},
|
||||
{tag:'option', html:"English (American)", value:'en-US'/ *, disabled:true* /},
|
||||
{tag:'option', html:"English (British)", value:'en-GB'/ *, disabled:true* /},
|
||||
{tag:'option', html:"English (Canadian)", value:'en-CA'/ *, disabled:true* /},
|
||||
{tag:'option', html:"Español", value:'es-ES', disabled:true},
|
||||
{tag:'option', html:"Eesti", value:'et-EE', disabled:true},
|
||||
{tag:'option', html:"Français", value:'fr-FR', disabled:true},
|
||||
{tag:'option', html:"Galego", value:'gl-ES', disabled:true},
|
||||
{tag:'option', html:"Greek (Ελληνικά)", value:'el-GR', disabled:true},
|
||||
{tag:'option', html:"Íslenska", value:'is-IS', disabled:true},
|
||||
{tag:'option', html:"Italiano", value:'it-IT'/ *, disabled:true* /},
|
||||
{tag:'option', html:"Japanese (日本語)", value:'ja-JP', disabled:true},
|
||||
{tag:'option', html:"Korean (한국어)", value:'ko-KR', disabled:true},
|
||||
{tag:'option', html:"Latviešu", value:'lv-LV', disabled:true},
|
||||
{tag:'option', html:"Lietuvių", value:'lt-LT', disabled:true},
|
||||
{tag:'option', html:"Macedonian (Македонски)", value:'mk-MK', disabled:true},
|
||||
{tag:'option', html:"Magyar", value:'hu-HU', disabled:true},
|
||||
{tag:'option', html:"Nederlands", value:'nl-NL', disabled:true},
|
||||
{tag:'option', html:"Norsk bokmål", value:'nb-NO', disabled:true},
|
||||
{tag:'option', html:"Norsk nynorsk", value:'nn-NO', disabled:true},
|
||||
{tag:'option', html:"Persian (Western) (فارسى)", value:'fa-IR', disabled:true},
|
||||
{tag:'option', html:"Polski", value:'pl-PL', disabled:true},
|
||||
{tag:'option', html:"Português", value:'pt-PT'/ *, disabled:true* /},
|
||||
{tag:'option', html:"Português Brasileiro", value:'pt-BR'/ *, disabled:true* /},
|
||||
{tag:'option', html:"Românä", value:'ro-RO', disabled:true},
|
||||
{tag:'option', html:"Russian (Русский)", value:'ru-RU', disabled:true},
|
||||
{tag:'option', html:"Slovak (Slovenčina)", value:'sk-SK', disabled:true},
|
||||
{tag:'option', html:"Slovenian (Slovenščina)", value:'sl-SI', disabled:true},
|
||||
{tag:'option', html:"Suomi", value:'fi-FI', disabled:true},
|
||||
{tag:'option', html:"Svenska", value:'sv-SE', disabled:true},
|
||||
{tag:'option', html:"Thai (ไทย)", value:'th-TH', disabled:true},
|
||||
{tag:'option', html:"Türkçe", value:'tr-TR', disabled:true},
|
||||
{tag:'option', html:"Ukrainian (Українська)", value:'uk-UA', disabled:true}
|
||||
* /
|
||||
{tag:'option', html:"Arabic (العربية)", value:"ar", disabled:true, cls:'disabledOption'},
|
||||
// {tag:'option', html:"Chinese (中文)", value:"zh", disabled:true},
|
||||
{tag:'option', html:"Chinese (Simplified) (简体中文)", value:'zh-CN'},
|
||||
{tag:'option', html:"Dutch (Nederlands)", value:"nl-NL", disabled:true, cls:'disabledOption'},
|
||||
{tag:'option', html:"English", value:"en-US"},
|
||||
{tag:'option', html:"French (Français)", value:"fr-FR"},
|
||||
{tag:'option', html:"German (Deutsch)", value:"de-DE", disabled:true, cls:'disabledOption'},
|
||||
{tag:'option', html:"Greek (Ελληνικά)", value:"el-GR", disabled:true, cls:'disabledOption'},
|
||||
{tag:'option', html:"Hebrew (עברית)", value:"he-IL", disabled:true, cls:'disabledOption'},
|
||||
{tag:'option', html:"Italian (Italiano)", value:"it-IT"},
|
||||
{tag:'option', html:"Japanese (日本語)", value:"ja-JP"},
|
||||
{tag:'option', html:"Korean (한국어)", value:"ko-KR", disabled:true, cls:'disabledOption'},
|
||||
{tag:'option', html:"Norwegian (Norsk)", value:"no", disabled:true, cls:'disabledOption'},
|
||||
{tag:'option', html:"Persian (فارسی)", value:"fa-IR", disabled:true, cls:'disabledOption'},
|
||||
{tag:'option', html:"Polish (Polski)", value:"pl-PL", disabled:true, cls:'disabledOption'},
|
||||
{tag:'option', html:"Portuguese (Português)", value:"pt-BR"},
|
||||
{tag:'option', html:"Russian (Русский)", value:"ru-RU", disabled:true, cls:'disabledOption'},
|
||||
{tag:'option', html:"Spanish (Español)", value:"es-ES"},
|
||||
{tag:'option', html:"Swedish (Svenska)", value:"sv-SE", disabled:true, cls:'disabledOption'},
|
||||
{tag:'option', html:"Turkish (Türkçe)", value:"tr-TR", disabled:true, cls:'disabledOption'},
|
||||
{tag:'option', html:"Vietnamese (Tiếng Việt)", value:"vi-VN", disabled:true, cls:'disabledOption'}
|
||||
]
|
||||
}
|
||||
*/
|
||||
|
||||
Clipperz.PM.Strings.GeneralSettings = {
|
||||
'defaults': {
|
||||
// 'loginFormAarghThatsBadUrl': "http://www.clipperz.com/support/faq/account_faq",
|
||||
// 'loginFormVerifyTheCodeUrl': "http://www.clipperz.com/learn_more/reviewing_the_code",
|
||||
|
||||
// 'donateHeaderLinkUrl': "http://www.clipperz.com/donations",
|
||||
// 'creditsHeaderLinkUrl': "http://www.clipperz.com/credits",
|
||||
// 'feedbackHeaderLinkUrl': "http://www.clipperz.com/contact",
|
||||
// 'helpHeaderLinkUrl': "http://www.clipperz.com/support/user_guide",
|
||||
// 'forumHeaderLinkUrl': "http://www.clipperz.com/forum",
|
||||
|
||||
// 'httpAuthBookmarkletConfiguration': {tag:'textarea', id:'httpAuthDefaultConfiguration', html:"" +
|
||||
// "{ \"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\"}"
|
||||
// },
|
||||
|
||||
'directLoginJumpPageUrl': "",
|
||||
'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=",
|
||||
'defaultFaviconUrl_IE': "https://www.clipperz.com/images/icons/misc/favicon.ico",
|
||||
|
||||
// 'icons_baseUrl': "https://www.clipperz.com/images/icons",
|
||||
|
||||
// 'passwordGeneratorLowercaseCharset': "abcdefghijklmnopqrstuvwxyz",
|
||||
// 'passwordGeneratorUppercaseCharset': "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
|
||||
// 'passwordGeneratorNumberCharset': "0123456789",
|
||||
// 'passwordGeneratorSymbolCharset': "!@#$%^&*+?[]{}/|\\<>,.;:~=-_",
|
||||
|
||||
// 'passwordGenerator': {
|
||||
// 'lowercaseCharset': "abcdefghijklmnopqrstuvwxyz",
|
||||
// 'uppercaseCharset': "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
|
||||
// 'numberCharset': "0123456789",
|
||||
// 'symbolCharset': "!@#$%^&*+?[]{}/|\\<>,.;:~=-_",
|
||||
// },
|
||||
|
||||
'_': ""
|
||||
}
|
||||
}
|
||||
|
||||
Clipperz.PM.Strings.defaultLanguages = {
|
||||
'default': "en-us",
|
||||
|
||||
// 'de': "de-de",
|
||||
// 'el': "el-gr",
|
||||
// 'he': "he-il",
|
||||
// 'ru': "ru-ru",
|
||||
|
||||
'fr': "fr-fr",
|
||||
'es': "es-es",
|
||||
'zh': "zh-cn",
|
||||
'ja': "ja-jp",
|
||||
'pt': "pt-br",
|
||||
'it': "it-it",
|
||||
'en': "en-us"
|
||||
}
|
||||
|
||||
Clipperz.PM.Strings.inputTypeToRecordFieldType = {
|
||||
'text': 'TXT',
|
||||
'password': 'PWD',
|
||||
'checkbox': 'CHECK',
|
||||
'radio': 'RADIO',
|
||||
'select': 'SELECT'
|
||||
};
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
Clipperz.PM.Strings.translateBookmarklet = function (aBookmarkletString) {
|
||||
var result;
|
||||
|
||||
result = aBookmarkletString;
|
||||
|
||||
result = result.replace(/@BOOKMARKLET_NO_EXCEPTION_MESSAGE@/, Clipperz.PM.Strings.getValue('bookmarkletCopy.noExceptionMessage'));
|
||||
result = result.replace(/@BOOKMARKLET_EXCEPTION_MESSAGE@/, Clipperz.PM.Strings.getValue('bookmarkletCopy.exceptionMessage'));
|
||||
result = result.replace(/@BOOKMARKLET_COPY@/, Clipperz.PM.Strings.getValue('bookmarkletCopy.copy'));
|
||||
result = result.replace(/@BOOKMARKLET_SUCCESSFUL_MESSAGE@/, Clipperz.PM.Strings.getValue('bookmarkletCopy.successfulMessage'));
|
||||
result = result.replace(/@BOOKMARKLET_FAIL_MESSAGE@/, Clipperz.PM.Strings.getValue('bookmarkletCopy.failMessage'));
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
Clipperz.PM.Strings.Languages.setSelectedLanguage = function(aLanguage) {
|
||||
var language;
|
||||
var selectedLanguage;
|
||||
|
||||
language = (aLanguage || Clipperz.PM.Strings.preferredLanguage || 'default').toLowerCase();
|
||||
if (typeof(Clipperz.PM.Strings.defaultLanguages[language]) != 'undefined') {
|
||||
language = Clipperz.PM.Strings.defaultLanguages[language];
|
||||
}
|
||||
|
||||
if (typeof(Clipperz.PM.Strings.Languages[language]) != 'undefined') {
|
||||
selectedLanguage = language;
|
||||
} else if (typeof(Clipperz.PM.Strings.defaultLanguages[language.substr(0,2)]) != 'undefined') {
|
||||
selectedLanguage = Clipperz.PM.Strings.defaultLanguages[language.substr(0,2)];
|
||||
} else {
|
||||
selectedLanguage = Clipperz.PM.Strings.defaultLanguages['default'];
|
||||
}
|
||||
|
||||
if (selectedLanguage != Clipperz.PM.Strings.selectedLanguage) {
|
||||
var translations;
|
||||
|
||||
Clipperz.PM.Strings.selectedLanguage = selectedLanguage;
|
||||
|
||||
translations = {};
|
||||
// MochiKit.Base.update(translations, Clipperz.PM.Strings.standardStrings)
|
||||
|
||||
MochiKit.Base.updatetree(translations, Clipperz.PM.Strings.Languages['defaults']);
|
||||
MochiKit.Base.updatetree(translations, Clipperz.PM.Strings.GeneralSettings['defaults']);
|
||||
|
||||
MochiKit.Base.updatetree(translations, Clipperz.PM.Strings.Languages[Clipperz.PM.Strings.defaultLanguages['default']]);
|
||||
MochiKit.Base.updatetree(translations, Clipperz.PM.Strings.GeneralSettings[Clipperz.PM.Strings.defaultLanguages['default']]);
|
||||
|
||||
MochiKit.Base.updatetree(translations, Clipperz.PM.Strings.Languages[selectedLanguage]);
|
||||
MochiKit.Base.updatetree(translations, Clipperz.PM.Strings.GeneralSettings[selectedLanguage]);
|
||||
|
||||
Clipperz.PM.Strings.stringsObjectStore = new Clipperz.KeyValueObjectStore(/*{'name':'String.stringsObjectStore [1]'}*/);
|
||||
Clipperz.PM.Strings.stringsObjectStore.initWithValues(translations);
|
||||
|
||||
if (typeof(bookmarklet) != 'undefined') {
|
||||
Clipperz.PM.Strings.stringsObjectStore.setValue('bookmarklet', Clipperz.PM.Strings.translateBookmarklet(bookmarklet));
|
||||
}
|
||||
|
||||
MochiKit.Signal.signal(Clipperz.PM.Strings.Languages, 'switchLanguage', selectedLanguage);
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
Clipperz.PM.Strings.getValue = function (aKeyPath, someKeyValues) {
|
||||
var result;
|
||||
|
||||
result = Clipperz.PM.Strings.stringsObjectStore.getValue(aKeyPath);
|
||||
|
||||
//try {
|
||||
if (typeof(result) == 'string') {
|
||||
if (typeof (someKeyValues) != 'undefined') {
|
||||
var key;
|
||||
|
||||
for (key in someKeyValues) {
|
||||
result = result.replace( new RegExp(key), someKeyValues[key]);
|
||||
// result.replace(, '');
|
||||
}
|
||||
}
|
||||
|
||||
result = result.replace(new RegExp('\n'), '<br>');
|
||||
}
|
||||
//} catch (exception) {
|
||||
// console.log("####", result, aKeyPath, someKeyValues, exception);
|
||||
//}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
Clipperz.PM.Strings.errorDescriptionForException = function (anException) {
|
||||
var result;
|
||||
|
||||
result = Clipperz.PM.Strings.getValue('exceptionsMessages' + '.' + anException.name);
|
||||
|
||||
if (result == null) {
|
||||
result = anException.message;
|
||||
}
|
||||
|
||||
return result;
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
Clipperz.PM.Strings.Languages.initSetup = function() {
|
||||
var language;
|
||||
var languageParser;
|
||||
|
||||
language = navigator.language || navigator.userLanguage; // en, en-US, .... "de", "nb-no"
|
||||
languageParser = new RegExp("language=([a-z]{2}(?:\-[a-z]{2})?)(\&|$)", "i");
|
||||
if (languageParser.test(window.location.search)) {
|
||||
language = RegExp.$1;
|
||||
}
|
||||
|
||||
Clipperz.PM.Strings.preferredLanguage = language.toLowerCase();
|
||||
Clipperz.PM.Strings.Languages.setSelectedLanguage(Clipperz.PM.Strings.preferredLanguage);
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
@@ -0,0 +1,389 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
|
||||
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
|
||||
if (typeof(Clipperz.PM.Strings) == 'undefined') { Clipperz.PM.Strings = {}; }
|
||||
|
||||
Clipperz.PM.Strings.messagePanelConfigurations = {
|
||||
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
//
|
||||
// Registration - connection
|
||||
//
|
||||
'registration_verify': function() {
|
||||
return {
|
||||
'title': null,
|
||||
'text': Clipperz.PM.Strings['connectionRegistrationSendingRequestMessageText']
|
||||
}
|
||||
},
|
||||
|
||||
'registration_sendingCredentials': function() {
|
||||
return {
|
||||
'title': null,
|
||||
'text': Clipperz.PM.Strings['connectionRegistrationSendingCredentialsMessageText']
|
||||
}
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
//
|
||||
// One Time Password login message panel
|
||||
//
|
||||
|
||||
'OTP_login_start': function() {
|
||||
return {
|
||||
'title': Clipperz.PM.Strings['OTPloginMessagePanelInitialTitle'],
|
||||
'text': Clipperz.PM.Strings['OTPloginMessagePanelInitialText'],
|
||||
'steps': '+3',
|
||||
'buttons': {}
|
||||
}
|
||||
},
|
||||
|
||||
'OTP_login_loadingOTP': function() {
|
||||
return {
|
||||
'title': Clipperz.PM.Strings['OTPloginMessagePanelLoadingTitle'],
|
||||
'text': Clipperz.PM.Strings['OTPloginMessagePanelLoadingText']
|
||||
}
|
||||
},
|
||||
|
||||
'OTP_login_extractingPassphrase': function() {
|
||||
return {
|
||||
'title': Clipperz.PM.Strings['OTPloginMessagePanelProcessingTitle'],
|
||||
'text': Clipperz.PM.Strings['OTPloginMessagePanelProcessingText']
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
//
|
||||
// Login message panel
|
||||
//
|
||||
'login_start': function() {
|
||||
return {
|
||||
'title': Clipperz.PM.Strings['loginMessagePanelInitialTitle'],
|
||||
'text': Clipperz.PM.Strings['loginMessagePanelInitialText'],
|
||||
'steps': '+7',
|
||||
'buttons': {
|
||||
'ok': Clipperz.PM.Strings['loginMessagePanelInitialButtonLabel']
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
'login_connected': function() {
|
||||
return {
|
||||
'title': Clipperz.PM.Strings['loginMessagePanelConnectedTitle'],
|
||||
'text': Clipperz.PM.Strings['loginMessagePanelConnectedText'],
|
||||
'buttons': {}
|
||||
}
|
||||
},
|
||||
|
||||
'login_failed': function() {
|
||||
return {
|
||||
'title': Clipperz.PM.Strings['loginMessagePanelFailureTitle'],
|
||||
'text': Clipperz.PM.Strings['loginMessagePanelFailureText'],
|
||||
'button': Clipperz.PM.Strings['loginMessagePanelFailureButtonLabel']
|
||||
}
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
//
|
||||
// Login message panel - connection
|
||||
//
|
||||
'connection_sendingCredentials': function() {
|
||||
return {
|
||||
'title': Clipperz.PM.Strings['connectionLoginSendingCredentialsMessageTitle'],
|
||||
'text': Clipperz.PM.Strings['connectionLoginSendingCredentialsMessageText']
|
||||
}
|
||||
},
|
||||
|
||||
'connection_credentialVerification': function() {
|
||||
return {
|
||||
'title': Clipperz.PM.Strings['connectionLoginCredentialsVerificationMessageTitle'],
|
||||
'text': Clipperz.PM.Strings['connectionLoginCredentialsVerificationMessageText']
|
||||
}
|
||||
},
|
||||
|
||||
'connection_loggedIn': function() {
|
||||
return {
|
||||
'title': Clipperz.PM.Strings['connectionLoginDoneMessageTitle'],
|
||||
'text': Clipperz.PM.Strings['connectionLoginDoneMessageText']
|
||||
}
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
//
|
||||
// Login message panel - user
|
||||
//
|
||||
'connection_upgrading': function() {
|
||||
return {
|
||||
'title': Clipperz.PM.Strings['userLoginPanelUpgradingUserCredentialsMessageTitle'],
|
||||
'text': Clipperz.PM.Strings['userLoginPanelUpgradingUserCredentialsMessageText'],
|
||||
'steps': '+1'
|
||||
}
|
||||
},
|
||||
|
||||
'connection_done': function() {
|
||||
return {
|
||||
'title': Clipperz.PM.Strings['userLoginPanelConnectedMessageTitle'],
|
||||
'text': Clipperz.PM.Strings['userLoginPanelConnectedMessageText']
|
||||
}
|
||||
},
|
||||
|
||||
'connection_tryOlderSchema': function() {
|
||||
return {
|
||||
'title': Clipperz.PM.Strings['userLoginPanelTryingAnOlderConnectionSchemaMessageTitle'],
|
||||
'text': Clipperz.PM.Strings['userLoginPanelTryingAnOlderConnectionSchemaMessageText'],
|
||||
'steps': '+4'
|
||||
}
|
||||
},
|
||||
|
||||
'connection_loadingUserData': function() {
|
||||
return {
|
||||
'title': Clipperz.PM.Strings['userLoginPanelLoadingUserDataMessageTitle'],
|
||||
'text': Clipperz.PM.Strings['userLoginPanelLoadingUserDataMessageText']
|
||||
}
|
||||
},
|
||||
|
||||
'connection_decryptingUserData': function() {
|
||||
return {
|
||||
'title': Clipperz.PM.Strings['userLoginPanelDecryptingUserDataMessageTitle'],
|
||||
'text': Clipperz.PM.Strings['userLoginPanelDecryptingUserDataMessageText'],
|
||||
'steps': '+1'
|
||||
}
|
||||
},
|
||||
|
||||
'connection_decryptingUserStatistics': function() {
|
||||
return {
|
||||
'title': Clipperz.PM.Strings['userLoginPanelDecryptingUserStatisticsMessageTitle'],
|
||||
'text': Clipperz.PM.Strings['userLoginPanelDecryptingUserStatisticsMessageText']
|
||||
}
|
||||
},
|
||||
|
||||
'collectingEntropy': function() {
|
||||
return {
|
||||
'text': Clipperz.PM.Strings['panelCollectingEntryopyMessageText'],
|
||||
'steps': '+1'
|
||||
}
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
//
|
||||
// Cards block - delete card panel
|
||||
//
|
||||
'deleteRecord_collectData': function() {
|
||||
return {
|
||||
'title': Clipperz.PM.Strings['deleteRecordPanelCollectRecordDataMessageTitle'],
|
||||
'text': Clipperz.PM.Strings['deleteRecordPanelCollectRecordDataMessageText']
|
||||
}
|
||||
},
|
||||
|
||||
'deleteRecord_encryptData': function() {
|
||||
return {
|
||||
'title': Clipperz.PM.Strings['deleteRecordPanelEncryptUserDataMessageTitle'],
|
||||
'text': Clipperz.PM.Strings['deleteRecordPanelEncryptUserDataMessageText']
|
||||
}
|
||||
},
|
||||
|
||||
'deleteRecord_sendingData': function() {
|
||||
return {
|
||||
'title': Clipperz.PM.Strings['deleteRecordPanelSendingDataToTheServerMessageTitle'],
|
||||
'text': Clipperz.PM.Strings['deleteRecordPanelSendingDataToTheServerMessageText']
|
||||
}
|
||||
},
|
||||
|
||||
'deleteRecord_updatingInterface': function() {
|
||||
return {
|
||||
'title': Clipperz.PM.Strings['deleteRecordPanelUpdatingTheInterfaceMessageTitle'],
|
||||
'text': Clipperz.PM.Strings['deleteRecordPanelUpdatingTheInterfaceMessageText']
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
//
|
||||
// Cards block - save card panel
|
||||
//
|
||||
'saveCard_collectRecordInfo': function() {
|
||||
return {
|
||||
'title': Clipperz.PM.Strings['recordSaveChangesPanelCollectRecordInfoMessageTitle'],
|
||||
'text': Clipperz.PM.Strings['recordSaveChangesPanelCollectRecordInfoMessageText']
|
||||
}
|
||||
},
|
||||
|
||||
'saveCard_encryptUserData': function() {
|
||||
return {
|
||||
'title': Clipperz.PM.Strings['recordSaveChangesPanelEncryptUserDataMessageTitle'],
|
||||
'text': Clipperz.PM.Strings['recordSaveChangesPanelEncryptUserDataMessageText']
|
||||
}
|
||||
},
|
||||
|
||||
'saveCard_encryptRecordData': function() {
|
||||
return {
|
||||
'title': Clipperz.PM.Strings['recordSaveChangesPanelEncryptRecordDataMessageTitle'],
|
||||
'text': Clipperz.PM.Strings['recordSaveChangesPanelEncryptRecordDataMessageText']
|
||||
}
|
||||
},
|
||||
|
||||
'saveCard_encryptRecordVersions': function() {
|
||||
return {
|
||||
'title': Clipperz.PM.Strings['recordSaveChangesPanelEncryptRecordVersionDataMessageTitle'],
|
||||
'text': Clipperz.PM.Strings['recordSaveChangesPanelEncryptRecordVersionDataMessageText']
|
||||
}
|
||||
},
|
||||
|
||||
'saveCard_sendingData': function() {
|
||||
return {
|
||||
'title': Clipperz.PM.Strings['recordSaveChangesPanelSendingDataToTheServerMessageTitle'],
|
||||
'text': Clipperz.PM.Strings['recordSaveChangesPanelSendingDataToTheServerMessageText']
|
||||
}
|
||||
},
|
||||
|
||||
'saveCard_updatingInterface': function() {
|
||||
return {
|
||||
'title': Clipperz.PM.Strings['recordSaveChangesPanelUpdatingTheInterfaceMessageTitle'],
|
||||
'text': Clipperz.PM.Strings['recordSaveChangesPanelUpdatingTheInterfaceMessageText']
|
||||
}
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
//
|
||||
// Account panel - user preferences
|
||||
//
|
||||
'account_savingPreferences_1': function() {
|
||||
return {
|
||||
'title': Clipperz.PM.Strings['accountPreferencesSavingPanelTitle_Step1'],
|
||||
'text': Clipperz.PM.Strings['accountPreferencesSavingPanelText_Step1'],
|
||||
'steps': '+3'
|
||||
}
|
||||
},
|
||||
|
||||
'account_savingPreferences_2': function() {
|
||||
return {
|
||||
'title': Clipperz.PM.Strings['accountPreferencesSavingPanelTitle_Step2'],
|
||||
'text': Clipperz.PM.Strings['accountPreferencesSavingPanelText_Step2']
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
//
|
||||
// Account panel - change credentials
|
||||
//
|
||||
'changeCredentials_encryptingData': function() {
|
||||
return {
|
||||
'title': Clipperz.PM.Strings['changeCredentialsPanelEncryptingDataMessageTitle'],
|
||||
'text': Clipperz.PM.Strings['changeCredentialsPanelEncryptingDataMessageText']
|
||||
}
|
||||
},
|
||||
|
||||
'changeCredentials_creatingNewCredentials': function() {
|
||||
return {
|
||||
'title': Clipperz.PM.Strings['changeCredentialsPanelCreatingNewCredentialsMessageTitle'],
|
||||
'text': Clipperz.PM.Strings['changeCredentialsPanelCreatingNewCredentialsMessageText']
|
||||
}
|
||||
},
|
||||
|
||||
'changeCredentials_sendingCredentials': function() {
|
||||
return {
|
||||
'title': Clipperz.PM.Strings['changeCredentialsPanelSendingNewCredentialsToTheServerMessageTitle'],
|
||||
'text': Clipperz.PM.Strings['changeCredentialsPanelSendingNewCredentialsToTheServerMessageText']
|
||||
}
|
||||
},
|
||||
|
||||
'changeCredentials_done': function() {
|
||||
return {
|
||||
'title': Clipperz.PM.Strings['changeCredentialsPanelDoneMessageTitle'],
|
||||
'text': Clipperz.PM.Strings['changeCredentialsPanelDoneMessageText']
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
//
|
||||
// Account panel - change credentials
|
||||
//
|
||||
'saveOTP_encryptUserData': function() {
|
||||
return {
|
||||
'title': Clipperz.PM.Strings['saveOTP_encryptUserDataTitle'],
|
||||
'text': Clipperz.PM.Strings['saveOTP_encryptUserDataText'],
|
||||
'steps': '+4'
|
||||
}
|
||||
},
|
||||
|
||||
'saveOTP_encryptOTPData': function() {
|
||||
return {
|
||||
'title': Clipperz.PM.Strings['saveOTP_encryptOTPDataTitle'],
|
||||
'text': Clipperz.PM.Strings['saveOTP_encryptOTPDataText']
|
||||
}
|
||||
},
|
||||
|
||||
'saveOTP_sendingData': function() {
|
||||
return {
|
||||
'title': Clipperz.PM.Strings['saveOTP_sendingDataTitle'],
|
||||
'text': Clipperz.PM.Strings['saveOTP_sendingDataText']
|
||||
}
|
||||
},
|
||||
|
||||
'saveOTP_updatingInterface': function() {
|
||||
return {
|
||||
'title': Clipperz.PM.Strings['saveOTP_updatingInterfaceTitle'],
|
||||
'text': Clipperz.PM.Strings['saveOTP_updatingInterfaceText']
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
//
|
||||
// Data panel - processingImportData
|
||||
//
|
||||
'parseImportData': function() {
|
||||
return {
|
||||
'title': Clipperz.PM.Strings['importData_parsingDataTitle'],
|
||||
'text': Clipperz.PM.Strings['importData_parsingDataText']
|
||||
}
|
||||
},
|
||||
|
||||
'previewImportData': function() {
|
||||
return {
|
||||
'title': Clipperz.PM.Strings['importData_previewingDataTitle'],
|
||||
'text': Clipperz.PM.Strings['importData_previewingDataText']
|
||||
}
|
||||
},
|
||||
|
||||
'processingImportData': function() {
|
||||
return {
|
||||
'title': Clipperz.PM.Strings['importData_processingDataTitle'],
|
||||
'text': Clipperz.PM.Strings['importData_processingDataText']
|
||||
}
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
__syntaxFix__: "syntax fix"
|
||||
|
||||
}
|
||||
390
frontend/gamma/js/Clipperz/PM/Strings/Strings_defaults.js
Normal file
390
frontend/gamma/js/Clipperz/PM/Strings/Strings_defaults.js
Normal file
@@ -0,0 +1,390 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
|
||||
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
|
||||
if (typeof(Clipperz.PM.Strings) == 'undefined') { Clipperz.PM.Strings = {}; }
|
||||
if (typeof(Clipperz.PM.Strings.Languages) == 'undefined') { Clipperz.PM.Strings.Languages = {}; }
|
||||
|
||||
//=============================================================================
|
||||
//
|
||||
// D E F A U L T S ( defaults )
|
||||
//
|
||||
//=============================================================================
|
||||
|
||||
Clipperz.PM.Strings.Languages['defaults'] = {
|
||||
|
||||
'elapsedTimeDescriptions': {
|
||||
'MORE_THAN_A_MONTH_AGO': "more than a month ago",
|
||||
'MORE_THAN_A_WEEK_AGO': "more than a week ago",
|
||||
'MORE_THAN_*_WEEKS_AGO': "more than __elapsed__ weeks ago",
|
||||
'YESTERDAY': "yesterday",
|
||||
'*_DAYS_AGO': "__elapsed__ days ago",
|
||||
'ABOUT_AN_HOUR_AGO': "about an hour ago",
|
||||
'*_HOURS_AGO': "__elapsed__ hours ago",
|
||||
'JUST_A_FEW_MINUTES_AGO': "just a few minutes ago",
|
||||
'ABOUT_*_MINUTES_AGO': "about __elapsed__ minutes ago"
|
||||
},
|
||||
/*
|
||||
'unknown_ip': "unknown",
|
||||
|
||||
'countries': {
|
||||
'--': "unknown",
|
||||
'AD': "Andorra",
|
||||
'AE': "United Arab Emirates",
|
||||
'AF': "Afghanistan",
|
||||
'AG': "Antigua and Barbuda",
|
||||
'AI': "Anguilla",
|
||||
'AL': "Albania",
|
||||
'AM': "Armenia",
|
||||
'AN': "Netherlands Antilles",
|
||||
'AO': "Angola",
|
||||
'AP': "Non-Spec Asia Pas Location",
|
||||
'AR': "Argentina",
|
||||
'AS': "American Samoa",
|
||||
'AT': "Austria",
|
||||
'AU': "Australia",
|
||||
'AW': "Aruba",
|
||||
'AX': "Aland Islands",
|
||||
'AZ': "Azerbaijan",
|
||||
'BA': "Bosnia and Herzegowina",
|
||||
'BB': "Barbados",
|
||||
'BD': "Bangladesh",
|
||||
'BE': "Belgium",
|
||||
'BF': "Burkina Faso",
|
||||
'BG': "Bulgaria",
|
||||
'BH': "Bahrain",
|
||||
'BI': "Burundi",
|
||||
'BJ': "Benin",
|
||||
'BM': "Bermuda",
|
||||
'BN': "Brunei Darussalam",
|
||||
'BO': "Bolivia",
|
||||
'BR': "Brazil",
|
||||
'BS': "Bahamas",
|
||||
'BT': "Bhutan",
|
||||
'BW': "Botswana",
|
||||
'BY': "Belarus",
|
||||
'BZ': "Belize",
|
||||
'CA': "Canada",
|
||||
'CD': "Congo the Democratic Republic of the",
|
||||
'CF': "Central African Republic",
|
||||
'CH': "Switzerland",
|
||||
'CI': "Cote D'ivoire",
|
||||
'CK': "Cook Islands",
|
||||
'CL': "Chile",
|
||||
'CM': "Cameroon",
|
||||
'CN': "China",
|
||||
'CO': "Colombia",
|
||||
'CR': "Costa Rica",
|
||||
'CS': "Serbia and Montenegro",
|
||||
'CU': "Cuba",
|
||||
'CY': "Cyprus",
|
||||
'CZ': "Czech Republic",
|
||||
'DE': "Germany",
|
||||
'DJ': "Djibouti",
|
||||
'DK': "Denmark",
|
||||
'DO': "Dominican Republic",
|
||||
'DZ': "Algeria",
|
||||
'EC': "Ecuador",
|
||||
'EE': "Estonia",
|
||||
'EG': "Egypt",
|
||||
'ER': "Eritrea",
|
||||
'ES': "Spain",
|
||||
'ET': "Ethiopia",
|
||||
'EU': "European Union",
|
||||
'FI': "Finland",
|
||||
'FJ': "Fiji",
|
||||
'FM': "Micronesia Federated States of",
|
||||
'FO': "Faroe Islands",
|
||||
'FR': "France",
|
||||
'GA': "Gabon",
|
||||
'GB': "United Kingdom",
|
||||
'GD': "Grenada",
|
||||
'GE': "Georgia",
|
||||
'GF': "French Guiana",
|
||||
'GG': "Guernsey",
|
||||
'GH': "Ghana",
|
||||
'GI': "Gibraltar",
|
||||
'GL': "Greenland",
|
||||
'GM': "Gambia",
|
||||
'GP': "Guadeloupe",
|
||||
'GR': "Greece",
|
||||
'GT': "Guatemala",
|
||||
'GU': "Guam",
|
||||
'GW': "Guinea-Bissau",
|
||||
'GY': "Guyana",
|
||||
'HK': "Hong Kong",
|
||||
'HN': "Honduras",
|
||||
'HR': "Croatia (Local Name: Hrvatska)",
|
||||
'HT': "Haiti",
|
||||
'HU': "Hungary",
|
||||
'ID': "Indonesia",
|
||||
'IE': "Ireland",
|
||||
'IL': "Israel",
|
||||
'IM': "Isle of Man",
|
||||
'IN': "India",
|
||||
'IO': "British Indian Ocean Territory",
|
||||
'IQ': "Iraq",
|
||||
'IR': "Iran (Islamic Republic of)",
|
||||
'IS': "Iceland",
|
||||
'IT': "Italy",
|
||||
'JE': "Jersey",
|
||||
'JM': "Jamaica",
|
||||
'JO': "Jordan",
|
||||
'JP': "Japan",
|
||||
'KE': "Kenya",
|
||||
'KG': "Kyrgyzstan",
|
||||
'KH': "Cambodia",
|
||||
'KI': "Kiribati",
|
||||
'KN': "Saint Kitts and Nevis",
|
||||
'KR': "Korea Republic of",
|
||||
'KW': "Kuwait",
|
||||
'KY': "Cayman Islands",
|
||||
'KZ': "Kazakhstan",
|
||||
'LA': "Lao People's Democratic Republic",
|
||||
'LB': "Lebanon",
|
||||
'LC': "Saint Lucia",
|
||||
'LI': "Liechtenstein",
|
||||
'LK': "Sri Lanka",
|
||||
'LR': "Liberia",
|
||||
'LS': "Lesotho",
|
||||
'LT': "Lithuania",
|
||||
'LU': "Luxembourg",
|
||||
'LV': "Latvia",
|
||||
'LY': "Libyan Arab Jamahiriya",
|
||||
'MA': "Morocco",
|
||||
'MC': "Monaco",
|
||||
'MD': "Moldova Republic of",
|
||||
'MG': "Madagascar",
|
||||
'MH': "Marshall Islands",
|
||||
'MK': "Macedonia the Former Yugoslav Republic of",
|
||||
'ML': "Mali",
|
||||
'MM': "Myanmar",
|
||||
'MN': "Mongolia",
|
||||
'MO': "Macau",
|
||||
'MP': "Northern Mariana Islands",
|
||||
'MR': "Mauritania",
|
||||
'MS': "Montserrat",
|
||||
'MT': "Malta",
|
||||
'MU': "Mauritius",
|
||||
'MV': "Maldives",
|
||||
'MW': "Malawi",
|
||||
'MX': "Mexico",
|
||||
'MY': "Malaysia",
|
||||
'MZ': "Mozambique",
|
||||
'NA': "Namibia",
|
||||
'NC': "New Caledonia",
|
||||
'NF': "Norfolk Island",
|
||||
'NG': "Nigeria",
|
||||
'NI': "Nicaragua",
|
||||
'NL': "Netherlands",
|
||||
'NO': "Norway",
|
||||
'NP': "Nepal",
|
||||
'NR': "Nauru",
|
||||
'NU': "Niue",
|
||||
'NZ': "New Zealand",
|
||||
'OM': "Oman",
|
||||
'PA': "Panama",
|
||||
'PE': "Peru",
|
||||
'PF': "French Polynesia",
|
||||
'PG': "Papua New Guinea",
|
||||
'PH': "Philippines",
|
||||
'PK': "Pakistan",
|
||||
'PL': "Poland",
|
||||
'PR': "Puerto Rico",
|
||||
'PS': "Palestinian Territory Occupied",
|
||||
'PT': "Portugal",
|
||||
'PW': "Palau",
|
||||
'PY': "Paraguay",
|
||||
'QA': "Qatar",
|
||||
'RO': "Romania",
|
||||
'RS': "Serbia",
|
||||
'RU': "Russian Federation",
|
||||
'RW': "Rwanda",
|
||||
'SA': "Saudi Arabia",
|
||||
'SB': "Solomon Islands",
|
||||
'SC': "Seychelles",
|
||||
'SD': "Sudan",
|
||||
'SE': "Sweden",
|
||||
'SG': "Singapore",
|
||||
'SI': "Slovenia",
|
||||
'SK': "Slovakia (Slovak Republic)",
|
||||
'SL': "Sierra Leone",
|
||||
'SM': "San Marino",
|
||||
'SN': "Senegal",
|
||||
'SR': "Suriname",
|
||||
'SV': "El Salvador",
|
||||
'SY': "Syrian Arab Republic",
|
||||
'SZ': "Swaziland",
|
||||
'TC': "Turks and Caicos Islands",
|
||||
'TG': "Togo",
|
||||
'TH': "Thailand",
|
||||
'TJ': "Tajikistan",
|
||||
'TM': "Turkmenistan",
|
||||
'TN': "Tunisia",
|
||||
'TO': "Tonga",
|
||||
'TR': "Turkey",
|
||||
'TT': "Trinidad and Tobago",
|
||||
'TV': "Tuvalu",
|
||||
'TW': "Taiwan Province of China",
|
||||
'TZ': "Tanzania United Republic of",
|
||||
'UA': "Ukraine",
|
||||
'UG': "Uganda",
|
||||
'US': "United States",
|
||||
'UY': "Uruguay",
|
||||
'UZ': "Uzbekistan",
|
||||
'VA': "Holy See (Vatican City State)",
|
||||
'VE': "Venezuela",
|
||||
'VG': "Virgin Islands (British)",
|
||||
'VI': "Virgin Islands (U.S.)",
|
||||
'VN': "Viet Nam",
|
||||
'VU': "Vanuatu",
|
||||
'WF': "Wallis and Futuna Islands",
|
||||
'WS': "Samoa",
|
||||
'YE': "Yemen",
|
||||
'ZA': "South Africa",
|
||||
'ZM': "Zambia",
|
||||
'ZW': "Zimbabwe",
|
||||
'ZZ': "Reserved"
|
||||
},
|
||||
|
||||
'browsers': {
|
||||
'UNKNOWN': "Unknown",
|
||||
'MSIE': "Internet Explorer",
|
||||
'FIREFOX': "Firefox",
|
||||
'OPERA': "Opera",
|
||||
'SAFARI': "Safari",
|
||||
'OMNIWEB': "OmniWeb",
|
||||
'CAMINO': "Camino",
|
||||
'CHROME': "Chrome"
|
||||
},
|
||||
|
||||
'operatingSystems': {
|
||||
'UNKNOWN': "Unknown",
|
||||
'WINDOWS': "Windows",
|
||||
'MAC': "Mac",
|
||||
'LINUX': "Linux",
|
||||
'IPHONE': "iPhone",
|
||||
'MOBILE': "Mobile",
|
||||
'OPENBSD': "OpenBSD",
|
||||
'FREEBSD': "FreeBSD",
|
||||
'NETBSD': "NetBSD"
|
||||
},
|
||||
*/
|
||||
|
||||
// Calendar texts
|
||||
'calendarStrings': {
|
||||
'months': {
|
||||
'0': "January",
|
||||
'1': "February",
|
||||
'2': "March",
|
||||
'3': "April",
|
||||
'4': "May",
|
||||
'5': "June",
|
||||
'6': "July",
|
||||
'7': "August",
|
||||
'8': "September",
|
||||
'9': "October",
|
||||
'10': "November",
|
||||
'11': "December"
|
||||
},
|
||||
'shortMonths': {
|
||||
'0': "Jan",
|
||||
'1': "Feb",
|
||||
'2': "Mar",
|
||||
'3': "Apr",
|
||||
'4': "May",
|
||||
'5': "Jun",
|
||||
'6': "Jul",
|
||||
'7': "Aug",
|
||||
'8': "Sep",
|
||||
'9': "Oct",
|
||||
'10': "Nov",
|
||||
'11': "Dec"
|
||||
},
|
||||
|
||||
'days': {
|
||||
'0': "Sunday",
|
||||
'1': "Monday",
|
||||
'2': "Tuesday",
|
||||
'3': "Wednesday",
|
||||
'4': "Thursday",
|
||||
'5': "Friday",
|
||||
'6': "Saturday"
|
||||
},
|
||||
|
||||
'shortDays': {
|
||||
'0': "Sun",
|
||||
'1': "Mon",
|
||||
'2': "Tue",
|
||||
'3': "Wed",
|
||||
'4': "Thu",
|
||||
'5': "Fri",
|
||||
'6': "Sat"
|
||||
},
|
||||
|
||||
'veryShortDays': {
|
||||
'0': "Su",
|
||||
'1': "Mo",
|
||||
'2': "Tu",
|
||||
'3': "We",
|
||||
'4': "Th",
|
||||
'5': "Fr",
|
||||
'6': "Sa"
|
||||
},
|
||||
|
||||
'amDesignation': "am",
|
||||
'pmDesignation': "pm"
|
||||
|
||||
},
|
||||
|
||||
// Date format
|
||||
'fullDate_format': "l, F d, Y H:i:s",
|
||||
|
||||
//################################################################################
|
||||
|
||||
'pageHeader': {
|
||||
'donation': "donate",
|
||||
'forum': "forum",
|
||||
'credits': "credits",
|
||||
'feedback': "feedback",
|
||||
'help': "help"
|
||||
},
|
||||
|
||||
'bookmarkletCopy': {
|
||||
'noExceptionMessage': "The direct login configuration has been collected.",
|
||||
'exceptionMessage': "Sorry! There was an error while processing the page.",
|
||||
'copy': "copy",
|
||||
'successfulMessage': "DONE!",
|
||||
'failMessage': "Failed! :("
|
||||
},
|
||||
|
||||
//################################################################################
|
||||
|
||||
__syntaxFix__: "syntax fix"
|
||||
}
|
||||
1341
frontend/gamma/js/Clipperz/PM/Strings/Strings_en-US.js
Normal file
1341
frontend/gamma/js/Clipperz/PM/Strings/Strings_en-US.js
Normal file
File diff suppressed because it is too large
Load Diff
194
frontend/gamma/js/Clipperz/PM/Toll.js
Normal file
194
frontend/gamma/js/Clipperz/PM/Toll.js
Normal file
@@ -0,0 +1,194 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
|
||||
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
|
||||
|
||||
//=============================================================================
|
||||
|
||||
Clipperz.PM.Toll = function(args) {
|
||||
args = args || {};
|
||||
|
||||
this._requestType = args.requestType;
|
||||
this._targetValue = args.targetValue;
|
||||
this._cost = args.cost;
|
||||
this._toll = null;
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
Clipperz.PM.Toll.prototype = MochiKit.Base.update(null, {
|
||||
|
||||
'toString': function() {
|
||||
return "Clipperz.PM.Toll (" + this.requestType() + ": " + this.cost() + " - " + ((this.toll() == null)? 'UNPAID' : 'PAID') + ")";
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'requestType': function() {
|
||||
return this._requestType;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'targetValue': function() {
|
||||
return this._targetValue;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'cost': function() {
|
||||
return this._cost;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'toll': function() {
|
||||
return this._toll;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
/*
|
||||
'__pay': function() {
|
||||
var result;
|
||||
var targetData;
|
||||
var targetMatchSize;
|
||||
var prefixMatchingBits;
|
||||
var payment;
|
||||
var i;
|
||||
|
||||
if (this.toll() == null) {
|
||||
i = 0;
|
||||
targetData = new Clipperz.ByteArray("0x" + this.targetValue());
|
||||
targetMatchSize = this.cost();
|
||||
|
||||
payment = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32);
|
||||
|
||||
do {
|
||||
var paymentData;
|
||||
|
||||
//payment = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32);
|
||||
payment.increment();
|
||||
paymentData = Clipperz.Crypto.SHA.sha256(payment);
|
||||
// prefixMatchingBits = this.prefixMatchingBits(targetData, paymentData);
|
||||
prefixMatchingBits = Clipperz.ByteArray.prefixMatchingBits(targetData, paymentData);
|
||||
i++;
|
||||
} while (prefixMatchingBits < targetMatchSize);
|
||||
|
||||
this._toll = payment.toHexString().substring(2)
|
||||
}
|
||||
|
||||
return this;
|
||||
},
|
||||
*/
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'innerDeferredPay': function (aTargetValue, aCost, aPayment) {
|
||||
var deferredResult;
|
||||
var result;
|
||||
var payment;
|
||||
var i;
|
||||
|
||||
result = null;
|
||||
payment = aPayment;
|
||||
i = 0;
|
||||
|
||||
while ((result == null) && (i < Clipperz.PM.Toll.numberOfCloseLoopIterations)) {
|
||||
if (Clipperz.ByteArray.prefixMatchingBits(aTargetValue, Clipperz.Crypto.SHA.sha256(payment)) > aCost) {
|
||||
result = payment;
|
||||
} else {
|
||||
payment.increment();
|
||||
}
|
||||
|
||||
i ++;
|
||||
}
|
||||
|
||||
if (result == null) {
|
||||
deferredResult = MochiKit.Async.callLater(Clipperz.PM.Toll.pauseBetweenEachCloseLoop, MochiKit.Base.method(this, 'innerDeferredPay', aTargetValue, aCost, aPayment));
|
||||
} else {
|
||||
deferredResult = MochiKit.Async.succeed(result);
|
||||
}
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
'deferredPay': function () {
|
||||
var deferredResult;
|
||||
var toll;
|
||||
|
||||
toll = this;
|
||||
deferredResult = new Clipperz.Async.Deferred("Toll.deferredPay");
|
||||
//deferredResult.addLog("--->>> deferredPay - " + this.cost());
|
||||
deferredResult.addMethod(Clipperz.Crypto.PRNG.defaultRandomGenerator(), 'getRandomBytes', 32);
|
||||
deferredResult.addMethod(toll, 'innerDeferredPay', new Clipperz.ByteArray("0x" + this.targetValue()), this.cost());
|
||||
deferredResult.addCallback(MochiKit.Base.bind(function(aPayment) {
|
||||
var result;
|
||||
|
||||
result = {
|
||||
targetValue: this.targetValue(),
|
||||
toll: aPayment.toHexString().substr(2)
|
||||
};
|
||||
|
||||
return result;
|
||||
}, this));
|
||||
//deferredResult.addLog("<<<--- deferredPay - " + this.cost());
|
||||
deferredResult.callback();
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
__syntaxFix__: "syntax fix"
|
||||
|
||||
});
|
||||
|
||||
|
||||
Clipperz.PM.Toll.validate = function(aTargetValue, aToll, aCost) {
|
||||
var result;
|
||||
var tollValue;
|
||||
var targetValue;
|
||||
var hashedTollValue;
|
||||
var payedToll;
|
||||
|
||||
tollValue = new Clipperz.ByteArray("0x" + aToll);
|
||||
targetValue = new Clipperz.ByteArray("0x" + aTargetValue);
|
||||
hashedTollValue = Clipperz.Crypto.SHA.sha256(tollValue);
|
||||
|
||||
payedToll = Clipperz.ByteArray.prefixMatchingBits(targetValue, hashedTollValue);
|
||||
|
||||
if (payedToll < aCost) {
|
||||
result = false;
|
||||
} else {
|
||||
result = true;
|
||||
}
|
||||
|
||||
return result;
|
||||
};
|
||||
|
||||
Clipperz.PM.Toll.numberOfCloseLoopIterations = 50;
|
||||
Clipperz.PM.Toll.pauseBetweenEachCloseLoop = 0.5;
|
||||
120
frontend/gamma/js/Clipperz/PM/UI/Canvas/CoverActions/download.js
Normal file
120
frontend/gamma/js/Clipperz/PM/UI/Canvas/CoverActions/download.js
Normal file
@@ -0,0 +1,120 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
//
|
||||
// download.js
|
||||
// Download
|
||||
//
|
||||
// Created by Giulio Cesare Solaroli on 3/15/10
|
||||
// Copyright 2010 Clipperz
|
||||
// This code was generated by Opacity. You may use or modify it in any way.
|
||||
//
|
||||
|
||||
var kClipperz_PM_UI_Canvas_CoverActions_downloadWidth = 46.0;
|
||||
var kClipperz_PM_UI_Canvas_CoverActions_downloadHeight = 46.0;
|
||||
|
||||
function Clipperz_PM_UI_Canvas_CoverActions_download(canvas, aColor, aFillColor, aThickness)
|
||||
{
|
||||
var context = canvas.getContext("2d");
|
||||
var alignStroke;
|
||||
var resolution;
|
||||
var stroke;
|
||||
var path;
|
||||
var pointX;
|
||||
var pointY;
|
||||
if (window.devicePixelRatio)
|
||||
resolution = window.devicePixelRatio;
|
||||
else
|
||||
resolution = 1.0;
|
||||
resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_CoverActions_downloadWidth + canvas.height / kClipperz_PM_UI_Canvas_CoverActions_downloadHeight);
|
||||
|
||||
context.save();
|
||||
context.scale(canvas.width / kClipperz_PM_UI_Canvas_CoverActions_downloadWidth, canvas.height / kClipperz_PM_UI_Canvas_CoverActions_downloadHeight);
|
||||
context.clearRect(0.0, 0.0, kClipperz_PM_UI_Canvas_CoverActions_downloadWidth, kClipperz_PM_UI_Canvas_CoverActions_downloadHeight);
|
||||
|
||||
// arrow
|
||||
|
||||
stroke = aThickness;
|
||||
stroke *= resolution;
|
||||
if (stroke < 1.0)
|
||||
stroke = Math.ceil(stroke);
|
||||
else
|
||||
stroke = Math.round(stroke);
|
||||
stroke /= resolution;
|
||||
alignStroke = (0.5 * stroke * resolution) % 1.0;
|
||||
context.beginPath();
|
||||
pointX = 16.5;
|
||||
pointY = 22.5;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.moveTo(pointX, pointY);
|
||||
pointX = 19.5;
|
||||
pointY = 8.5;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 30.038;
|
||||
pointY = 10.605;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 27.354;
|
||||
pointY = 24.354;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 33.28;
|
||||
pointY = 25.293;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 19.81;
|
||||
pointY = 36.828;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 10.07;
|
||||
pointY = 21.617;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 16.5;
|
||||
pointY = 22.5;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
context.closePath();
|
||||
context.fillStyle = aFillColor;
|
||||
context.fill();
|
||||
context.strokeStyle = aColor;
|
||||
context.lineWidth = stroke;
|
||||
context.lineCap = "square";
|
||||
context.stroke();
|
||||
|
||||
context.restore();
|
||||
}
|
||||
208
frontend/gamma/js/Clipperz/PM/UI/Canvas/CoverActions/look.js
Normal file
208
frontend/gamma/js/Clipperz/PM/UI/Canvas/CoverActions/look.js
Normal file
@@ -0,0 +1,208 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
//
|
||||
// look.js
|
||||
// Look
|
||||
//
|
||||
// Created by Giulio Cesare Solaroli on 3/15/10
|
||||
// Copyright 2010 Clipperz
|
||||
// This code was generated by Opacity. You may use or modify it in any way.
|
||||
//
|
||||
|
||||
var kClipperz_PM_UI_Canvas_CoverActions_lookWidth = 46.0;
|
||||
var kClipperz_PM_UI_Canvas_CoverActions_lookHeight = 46.0;
|
||||
|
||||
function Clipperz_PM_UI_Canvas_CoverActions_look(canvas, aColor, aFillColor, aThickness)
|
||||
{
|
||||
var context = canvas.getContext("2d");
|
||||
var alignStroke;
|
||||
var resolution;
|
||||
var stroke;
|
||||
var path;
|
||||
var pointX;
|
||||
var pointY;
|
||||
if (window.devicePixelRatio)
|
||||
resolution = window.devicePixelRatio;
|
||||
else
|
||||
resolution = 1.0;
|
||||
resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_CoverActions_lookWidth + canvas.height / kClipperz_PM_UI_Canvas_CoverActions_lookHeight);
|
||||
|
||||
context.save();
|
||||
context.scale(canvas.width / kClipperz_PM_UI_Canvas_CoverActions_lookWidth, canvas.height / kClipperz_PM_UI_Canvas_CoverActions_lookHeight);
|
||||
context.clearRect(0.0, 0.0, kClipperz_PM_UI_Canvas_CoverActions_lookWidth, kClipperz_PM_UI_Canvas_CoverActions_lookHeight);
|
||||
|
||||
// Layer 6
|
||||
|
||||
stroke = aThickness;
|
||||
stroke *= resolution;
|
||||
if (stroke < 1.0)
|
||||
stroke = Math.ceil(stroke);
|
||||
else
|
||||
stroke = Math.round(stroke);
|
||||
stroke /= resolution;
|
||||
alignStroke = (0.5 * stroke * resolution) % 1.0;
|
||||
context.save();
|
||||
context.translate(17.5, 23.0);
|
||||
context.rotate(-0.503);
|
||||
context.translate(-17.5, -23.0);
|
||||
context.beginPath();
|
||||
pointX = 28.5;
|
||||
pointY = 31.5;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.moveTo(pointX, pointY);
|
||||
pointX = 28.5;
|
||||
pointY = 14.5;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 6.5;
|
||||
pointY = 14.5;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 6.5;
|
||||
pointY = 31.5;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 28.5;
|
||||
pointY = 31.5;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
context.closePath();
|
||||
context.fillStyle = aFillColor;
|
||||
context.fill();
|
||||
context.strokeStyle = aColor;
|
||||
context.lineWidth = stroke;
|
||||
context.lineCap = "square";
|
||||
context.stroke();
|
||||
context.restore();
|
||||
|
||||
// Layer 3
|
||||
|
||||
stroke = aThickness;
|
||||
stroke *= resolution;
|
||||
if (stroke < 1.0)
|
||||
stroke = Math.ceil(stroke);
|
||||
else
|
||||
stroke = Math.round(stroke);
|
||||
stroke /= resolution;
|
||||
alignStroke = (0.5 * stroke * resolution) % 1.0;
|
||||
context.save();
|
||||
context.translate(22.5, 20.0);
|
||||
context.rotate(-0.071);
|
||||
context.translate(-22.5, -20.0);
|
||||
context.beginPath();
|
||||
pointX = 33.5;
|
||||
pointY = 28.5;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.moveTo(pointX, pointY);
|
||||
pointX = 33.5;
|
||||
pointY = 11.5;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 11.5;
|
||||
pointY = 11.5;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 11.5;
|
||||
pointY = 28.5;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 33.5;
|
||||
pointY = 28.5;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
context.closePath();
|
||||
context.fillStyle = aFillColor;
|
||||
context.fill();
|
||||
context.strokeStyle = aColor;
|
||||
context.lineWidth = stroke;
|
||||
context.lineCap = "square";
|
||||
context.stroke();
|
||||
context.restore();
|
||||
|
||||
// Layer 4
|
||||
|
||||
stroke = aThickness;
|
||||
stroke *= resolution;
|
||||
if (stroke < 1.0)
|
||||
stroke = Math.ceil(stroke);
|
||||
else
|
||||
stroke = Math.round(stroke);
|
||||
stroke /= resolution;
|
||||
alignStroke = (0.5 * stroke * resolution) % 1.0;
|
||||
context.save();
|
||||
context.translate(27.5, 18.0);
|
||||
context.rotate(0.232);
|
||||
context.translate(-27.5, -18.0);
|
||||
context.beginPath();
|
||||
pointX = 38.5;
|
||||
pointY = 26.5;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.moveTo(pointX, pointY);
|
||||
pointX = 38.5;
|
||||
pointY = 9.5;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 16.5;
|
||||
pointY = 9.5;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 16.5;
|
||||
pointY = 26.5;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 38.5;
|
||||
pointY = 26.5;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
context.closePath();
|
||||
context.fillStyle = aFillColor;
|
||||
context.fill();
|
||||
context.strokeStyle = aColor;
|
||||
context.lineWidth = stroke;
|
||||
context.lineCap = "square";
|
||||
context.stroke();
|
||||
context.restore();
|
||||
|
||||
context.restore();
|
||||
}
|
||||
209
frontend/gamma/js/Clipperz/PM/UI/Canvas/Features/directLogin.js
Normal file
209
frontend/gamma/js/Clipperz/PM/UI/Canvas/Features/directLogin.js
Normal file
@@ -0,0 +1,209 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
//
|
||||
// directLogin.js
|
||||
// directLogin
|
||||
//
|
||||
// Created by Giulio Cesare Solaroli on 3/7/10
|
||||
// Copyright 2010 Clipperz
|
||||
// This code was generated by Opacity. You may use or modify it in any way.
|
||||
//
|
||||
|
||||
var kClipperz_PM_UI_Canvas_Features_directLoginWidth = 76.0;
|
||||
var kClipperz_PM_UI_Canvas_Features_directLoginHeight = 76.0;
|
||||
|
||||
function Clipperz_PM_UI_Canvas_Features_directLogin(canvas, aColor, aBannerColor, aBannerBackgroundColor)
|
||||
{
|
||||
var context = canvas.getContext("2d");
|
||||
var alignStroke;
|
||||
var resolution;
|
||||
var stroke;
|
||||
var path;
|
||||
var pointX;
|
||||
var pointY;
|
||||
if (window.devicePixelRatio)
|
||||
resolution = window.devicePixelRatio;
|
||||
else
|
||||
resolution = 1.0;
|
||||
resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_Features_directLoginWidth + canvas.height / kClipperz_PM_UI_Canvas_Features_directLoginHeight);
|
||||
|
||||
context.save();
|
||||
context.scale(canvas.width / kClipperz_PM_UI_Canvas_Features_directLoginWidth, canvas.height / kClipperz_PM_UI_Canvas_Features_directLoginHeight);
|
||||
context.clearRect(0.0, 0.0, kClipperz_PM_UI_Canvas_Features_directLoginWidth, kClipperz_PM_UI_Canvas_Features_directLoginHeight);
|
||||
|
||||
// Layer 2
|
||||
|
||||
stroke = 6.0;
|
||||
stroke *= resolution;
|
||||
if (stroke < 1.0)
|
||||
stroke = Math.ceil(stroke);
|
||||
else
|
||||
stroke = Math.round(stroke);
|
||||
stroke /= resolution;
|
||||
alignStroke = (0.5 * stroke * resolution) % 1.0;
|
||||
context.beginPath();
|
||||
pointX = 30.0;
|
||||
pointY = 41.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.moveTo(pointX, pointY);
|
||||
pointX = 45.579;
|
||||
pointY = 25.451;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
context.strokeStyle = aColor;
|
||||
context.lineWidth = stroke;
|
||||
context.lineCap = "square";
|
||||
context.stroke();
|
||||
|
||||
alignStroke = 0.0;
|
||||
context.beginPath();
|
||||
pointX = 34.207;
|
||||
pointY = 45.697;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.moveTo(pointX, pointY);
|
||||
pointX = 24.101;
|
||||
pointY = 37.52;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 24.122;
|
||||
pointY = 47.828;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 34.207;
|
||||
pointY = 45.697;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
context.closePath();
|
||||
context.fillStyle = aColor;
|
||||
context.fill();
|
||||
|
||||
stroke = 6.0;
|
||||
stroke *= resolution;
|
||||
if (stroke < 1.0)
|
||||
stroke = Math.ceil(stroke);
|
||||
else
|
||||
stroke = Math.round(stroke);
|
||||
stroke /= resolution;
|
||||
alignStroke = (0.5 * stroke * resolution) % 1.0;
|
||||
context.beginPath();
|
||||
pointX = 24.631;
|
||||
pointY = 28.971;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.moveTo(pointX, pointY);
|
||||
pointX = 46.497;
|
||||
pointY = 26.451;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
context.strokeStyle = aColor;
|
||||
context.stroke();
|
||||
|
||||
alignStroke = 0.0;
|
||||
context.beginPath();
|
||||
pointX = 25.014;
|
||||
pointY = 35.265;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.moveTo(pointX, pointY);
|
||||
pointX = 22.166;
|
||||
pointY = 22.58;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 15.784;
|
||||
pointY = 30.675;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 25.014;
|
||||
pointY = 35.265;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
context.closePath();
|
||||
context.fillStyle = aColor;
|
||||
context.fill();
|
||||
|
||||
stroke = 6.0;
|
||||
stroke *= resolution;
|
||||
if (stroke < 1.0)
|
||||
stroke = Math.ceil(stroke);
|
||||
else
|
||||
stroke = Math.round(stroke);
|
||||
stroke /= resolution;
|
||||
alignStroke = (0.5 * stroke * resolution) % 1.0;
|
||||
context.beginPath();
|
||||
pointX = 42.282;
|
||||
pointY = 47.03;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.moveTo(pointX, pointY);
|
||||
pointX = 47.771;
|
||||
pointY = 25.714;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
context.strokeStyle = aColor;
|
||||
context.stroke();
|
||||
|
||||
alignStroke = 0.0;
|
||||
context.beginPath();
|
||||
pointX = 48.294;
|
||||
pointY = 48.929;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.moveTo(pointX, pointY);
|
||||
pointX = 35.432;
|
||||
pointY = 47.039;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 40.7;
|
||||
pointY = 55.899;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 48.294;
|
||||
pointY = 48.929;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
context.closePath();
|
||||
context.fillStyle = aColor;
|
||||
context.fill();
|
||||
|
||||
context.restore();
|
||||
}
|
||||
237
frontend/gamma/js/Clipperz/PM/UI/Canvas/Features/protect.js
Normal file
237
frontend/gamma/js/Clipperz/PM/UI/Canvas/Features/protect.js
Normal file
@@ -0,0 +1,237 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
//
|
||||
// protect.js
|
||||
// protect
|
||||
//
|
||||
// Created by Giulio Cesare Solaroli on 3/7/10
|
||||
// Copyright 2010 Clipperz
|
||||
// This code was generated by Opacity. You may use or modify it in any way.
|
||||
//
|
||||
|
||||
var kClipperz_PM_UI_Canvas_Features_protectWidth = 76.0;
|
||||
var kClipperz_PM_UI_Canvas_Features_protectHeight = 76.0;
|
||||
|
||||
function Clipperz_PM_UI_Canvas_Features_protect(canvas, aColor, aBannerColor, aBannerBackgroundColor)
|
||||
{
|
||||
var context = canvas.getContext("2d");
|
||||
var alignStroke;
|
||||
var resolution;
|
||||
var path;
|
||||
var pointX;
|
||||
var pointY;
|
||||
var controlPoint1X;
|
||||
var controlPoint1Y;
|
||||
var controlPoint2X;
|
||||
var controlPoint2Y;
|
||||
var stroke;
|
||||
if (window.devicePixelRatio)
|
||||
resolution = window.devicePixelRatio;
|
||||
else
|
||||
resolution = 1.0;
|
||||
resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_Features_protectWidth + canvas.height / kClipperz_PM_UI_Canvas_Features_protectHeight);
|
||||
|
||||
context.save();
|
||||
context.scale(canvas.width / kClipperz_PM_UI_Canvas_Features_protectWidth, canvas.height / kClipperz_PM_UI_Canvas_Features_protectHeight);
|
||||
context.clearRect(0.0, 0.0, kClipperz_PM_UI_Canvas_Features_protectWidth, kClipperz_PM_UI_Canvas_Features_protectHeight);
|
||||
|
||||
// Layer 1
|
||||
|
||||
alignStroke = 0.0;
|
||||
context.beginPath();
|
||||
pointX = 38.5;
|
||||
pointY = 36.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.moveTo(pointX, pointY);
|
||||
pointX = 37.068;
|
||||
pointY = 38.816;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 37.41;
|
||||
controlPoint1Y = 36.234;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 37.175;
|
||||
controlPoint2Y = 37.907;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 37.031;
|
||||
pointY = 40.802;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 36.991;
|
||||
controlPoint1Y = 39.474;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 36.98;
|
||||
controlPoint2Y = 40.141;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 37.258;
|
||||
pointY = 42.23;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 37.068;
|
||||
controlPoint1Y = 41.283;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 37.139;
|
||||
controlPoint2Y = 41.762;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 38.348;
|
||||
pointY = 43.979;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 37.402;
|
||||
controlPoint1Y = 42.799;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 37.682;
|
||||
controlPoint2Y = 43.798;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 38.5;
|
||||
pointY = 36.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 40.249;
|
||||
controlPoint1Y = 44.497;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 40.723;
|
||||
controlPoint2Y = 36.303;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 38.5;
|
||||
pointY = 36.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
context.closePath();
|
||||
pointX = 50.0;
|
||||
pointY = 52.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.moveTo(pointX, pointY);
|
||||
pointX = 26.0;
|
||||
pointY = 52.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 26.0;
|
||||
pointY = 33.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 50.0;
|
||||
pointY = 33.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 50.0;
|
||||
pointY = 52.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
context.closePath();
|
||||
context.fillStyle = aColor;
|
||||
context.fill();
|
||||
|
||||
alignStroke = 0.0;
|
||||
context.beginPath();
|
||||
pointX = 47.0;
|
||||
pointY = 32.463;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.moveTo(pointX, pointY);
|
||||
pointX = 38.0;
|
||||
pointY = 52.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 47.0;
|
||||
controlPoint1Y = 52.925;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 38.0;
|
||||
controlPoint2Y = 52.0;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 29.0;
|
||||
pointY = 32.463;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 38.0;
|
||||
controlPoint1Y = 52.0;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 29.0;
|
||||
controlPoint2Y = 52.925;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 47.0;
|
||||
pointY = 32.463;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 29.0;
|
||||
controlPoint1Y = 12.0;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 47.0;
|
||||
controlPoint2Y = 12.0;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
context.closePath();
|
||||
context.strokeStyle = aColor;
|
||||
stroke = 4.0;
|
||||
stroke *= resolution;
|
||||
if (stroke < 1.0)
|
||||
stroke = Math.ceil(stroke);
|
||||
else
|
||||
stroke = Math.round(stroke);
|
||||
stroke /= resolution;
|
||||
stroke *= 2.0;
|
||||
context.lineWidth = stroke;
|
||||
context.lineCap = "square";
|
||||
context.save();
|
||||
context.clip();
|
||||
context.stroke();
|
||||
context.restore();
|
||||
|
||||
context.restore();
|
||||
}
|
||||
1719
frontend/gamma/js/Clipperz/PM/UI/Canvas/Features/share.js
Normal file
1719
frontend/gamma/js/Clipperz/PM/UI/Canvas/Features/share.js
Normal file
File diff suppressed because it is too large
Load Diff
310
frontend/gamma/js/Clipperz/PM/UI/Canvas/Features/store.js
Normal file
310
frontend/gamma/js/Clipperz/PM/UI/Canvas/Features/store.js
Normal file
@@ -0,0 +1,310 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
//
|
||||
// store.js
|
||||
// store
|
||||
//
|
||||
// Created by Giulio Cesare Solaroli on 3/7/10
|
||||
// Copyright 2010 Clipperz
|
||||
// This code was generated by Opacity. You may use or modify it in any way.
|
||||
//
|
||||
|
||||
var kClipperz_PM_UI_Canvas_Features_storeWidth = 76.0;
|
||||
var kClipperz_PM_UI_Canvas_Features_storeHeight = 76.0;
|
||||
|
||||
function Clipperz_PM_UI_Canvas_Features_store(canvas, aColor, aBannerColor, aBannerBackgroundColor)
|
||||
{
|
||||
var context = canvas.getContext("2d");
|
||||
var alignStroke;
|
||||
var resolution;
|
||||
var path;
|
||||
var pointX;
|
||||
var pointY;
|
||||
if (window.devicePixelRatio)
|
||||
resolution = window.devicePixelRatio;
|
||||
else
|
||||
resolution = 1.0;
|
||||
resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_Features_storeWidth + canvas.height / kClipperz_PM_UI_Canvas_Features_storeHeight);
|
||||
|
||||
context.save();
|
||||
context.scale(canvas.width / kClipperz_PM_UI_Canvas_Features_storeWidth, canvas.height / kClipperz_PM_UI_Canvas_Features_storeHeight);
|
||||
context.clearRect(0.0, 0.0, kClipperz_PM_UI_Canvas_Features_storeWidth, kClipperz_PM_UI_Canvas_Features_storeHeight);
|
||||
|
||||
// Layer 1
|
||||
|
||||
alignStroke = 0.0;
|
||||
context.beginPath();
|
||||
pointX = 27.0;
|
||||
pointY = 29.5;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.moveTo(pointX, pointY);
|
||||
pointX = 27.0;
|
||||
pointY = 24.5;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 22.0;
|
||||
pointY = 24.5;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 22.0;
|
||||
pointY = 29.5;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 27.0;
|
||||
pointY = 29.5;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
context.closePath();
|
||||
context.fillStyle = aColor;
|
||||
context.fill();
|
||||
|
||||
alignStroke = 0.0;
|
||||
context.beginPath();
|
||||
pointX = 54.0;
|
||||
pointY = 29.5;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.moveTo(pointX, pointY);
|
||||
pointX = 54.0;
|
||||
pointY = 24.5;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 29.0;
|
||||
pointY = 24.5;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 29.0;
|
||||
pointY = 29.5;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 54.0;
|
||||
pointY = 29.5;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
context.closePath();
|
||||
context.fillStyle = aColor;
|
||||
context.fill();
|
||||
|
||||
alignStroke = 0.0;
|
||||
context.beginPath();
|
||||
pointX = 43.0;
|
||||
pointY = 37.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.moveTo(pointX, pointY);
|
||||
pointX = 43.0;
|
||||
pointY = 32.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 29.0;
|
||||
pointY = 32.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 29.0;
|
||||
pointY = 37.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 43.0;
|
||||
pointY = 37.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
context.closePath();
|
||||
context.fillStyle = aColor;
|
||||
context.fill();
|
||||
|
||||
alignStroke = 0.0;
|
||||
context.beginPath();
|
||||
pointX = 27.0;
|
||||
pointY = 37.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.moveTo(pointX, pointY);
|
||||
pointX = 27.0;
|
||||
pointY = 32.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 22.0;
|
||||
pointY = 32.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 22.0;
|
||||
pointY = 37.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 27.0;
|
||||
pointY = 37.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
context.closePath();
|
||||
context.fillStyle = aColor;
|
||||
context.fill();
|
||||
|
||||
alignStroke = 0.0;
|
||||
context.beginPath();
|
||||
pointX = 27.0;
|
||||
pointY = 44.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.moveTo(pointX, pointY);
|
||||
pointX = 27.0;
|
||||
pointY = 39.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 22.0;
|
||||
pointY = 39.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 22.0;
|
||||
pointY = 44.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 27.0;
|
||||
pointY = 44.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
context.closePath();
|
||||
context.fillStyle = aColor;
|
||||
context.fill();
|
||||
|
||||
alignStroke = 0.0;
|
||||
context.beginPath();
|
||||
pointX = 46.0;
|
||||
pointY = 44.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.moveTo(pointX, pointY);
|
||||
pointX = 46.0;
|
||||
pointY = 39.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 29.0;
|
||||
pointY = 39.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 29.0;
|
||||
pointY = 44.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 46.0;
|
||||
pointY = 44.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
context.closePath();
|
||||
context.fillStyle = aColor;
|
||||
context.fill();
|
||||
|
||||
alignStroke = 0.0;
|
||||
context.beginPath();
|
||||
pointX = 40.0;
|
||||
pointY = 51.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.moveTo(pointX, pointY);
|
||||
pointX = 40.0;
|
||||
pointY = 46.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 29.0;
|
||||
pointY = 46.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 29.0;
|
||||
pointY = 51.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 40.0;
|
||||
pointY = 51.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
context.closePath();
|
||||
context.fillStyle = aColor;
|
||||
context.fill();
|
||||
|
||||
alignStroke = 0.0;
|
||||
context.beginPath();
|
||||
pointX = 27.0;
|
||||
pointY = 51.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.moveTo(pointX, pointY);
|
||||
pointX = 27.0;
|
||||
pointY = 46.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 22.0;
|
||||
pointY = 46.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 22.0;
|
||||
pointY = 51.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 27.0;
|
||||
pointY = 51.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
context.closePath();
|
||||
context.fillStyle = aColor;
|
||||
context.fill();
|
||||
|
||||
context.restore();
|
||||
}
|
||||
68
frontend/gamma/js/Clipperz/PM/UI/Canvas/GraphicFunctions.js
Normal file
68
frontend/gamma/js/Clipperz/PM/UI/Canvas/GraphicFunctions.js
Normal file
@@ -0,0 +1,68 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
Clipperz.Base.module('Clipperz.PM.UI.Canvas');
|
||||
|
||||
MochiKit.Base.update(Clipperz.PM.UI.Canvas , {
|
||||
'marks': {
|
||||
'!': Clipperz_PM_UI_Canvas_Marks_exclamationMark,
|
||||
'?': Clipperz_PM_UI_Canvas_Marks_questionMark,
|
||||
'i': Clipperz_PM_UI_Canvas_Marks_info
|
||||
},
|
||||
|
||||
'features': {
|
||||
'store': Clipperz_PM_UI_Canvas_Features_store,
|
||||
'protect': Clipperz_PM_UI_Canvas_Features_protect,
|
||||
'directLogin': Clipperz_PM_UI_Canvas_Features_directLogin,
|
||||
'share': Clipperz_PM_UI_Canvas_Features_share
|
||||
},
|
||||
|
||||
'tips': {
|
||||
'open': Clipperz_PM_UI_Canvas_Tips_open,
|
||||
'close': Clipperz_PM_UI_Canvas_Tips_close
|
||||
},
|
||||
|
||||
'star': {
|
||||
'normal': Clipperz_PM_UI_Canvas_Star_normal
|
||||
},
|
||||
|
||||
'coverActions': {
|
||||
'look': Clipperz_PM_UI_Canvas_CoverActions_look,
|
||||
'download': Clipperz_PM_UI_Canvas_CoverActions_download
|
||||
},
|
||||
|
||||
'registerButton': {
|
||||
'normal': Clipperz_PM_UI_Canvas_RegisterButton_normal
|
||||
},
|
||||
|
||||
'logo': {
|
||||
'normal': Clipperz_PM_UI_Canvas_Logo_normal
|
||||
},
|
||||
|
||||
__syntaxFix__: "syntax fix"
|
||||
});
|
||||
65
frontend/gamma/js/Clipperz/PM/UI/Canvas/Logo/normal.js
Normal file
65
frontend/gamma/js/Clipperz/PM/UI/Canvas/Logo/normal.js
Normal file
@@ -0,0 +1,65 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
//
|
||||
// normal.js
|
||||
// normal
|
||||
//
|
||||
// Created by Giulio Cesare Solaroli on 3/25/10
|
||||
// Copyright 2010 Clipperz
|
||||
// This code was generated by Opacity. You may use or modify it in any way.
|
||||
//
|
||||
|
||||
var kClipperz_PM_UI_Canvas_Logo_normalWidth = 150.0;
|
||||
var kClipperz_PM_UI_Canvas_Logo_normalHeight = 39.0;
|
||||
|
||||
function Clipperz_PM_UI_Canvas_Logo_normal(canvas, aMainColor, aSecondaryColor)
|
||||
{
|
||||
var context = canvas.getContext("2d");
|
||||
var string;
|
||||
|
||||
context.save();
|
||||
context.scale(canvas.width / kClipperz_PM_UI_Canvas_Logo_normalWidth, canvas.height / kClipperz_PM_UI_Canvas_Logo_normalHeight);
|
||||
context.clearRect(0.0, 0.0, kClipperz_PM_UI_Canvas_Logo_normalWidth, kClipperz_PM_UI_Canvas_Logo_normalHeight);
|
||||
|
||||
// clipper…
|
||||
|
||||
string = "clipper";
|
||||
context.font = "38.0pt Helvetica-Bold";
|
||||
context.fillStyle = aMainColor;
|
||||
context.fillText(string, -9.0, -9.0);
|
||||
|
||||
// …z
|
||||
|
||||
string = "z";
|
||||
context.font = "38.0pt Helvetica-Bold";
|
||||
context.fillStyle = aSecondaryColor;
|
||||
context.fillText(string, 125.0, -9.0);
|
||||
|
||||
context.restore();
|
||||
}
|
||||
280
frontend/gamma/js/Clipperz/PM/UI/Canvas/Marks/exclamationMark.js
Normal file
280
frontend/gamma/js/Clipperz/PM/UI/Canvas/Marks/exclamationMark.js
Normal file
@@ -0,0 +1,280 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
//
|
||||
// exclamationMark.js
|
||||
// !
|
||||
//
|
||||
// Created by Giulio Cesare Solaroli on 3/7/10
|
||||
// Copyright 2010 Clipperz
|
||||
// This code was generated by Opacity. You may use or modify it in any way.
|
||||
//
|
||||
|
||||
var kClipperz_PM_UI_Canvas_Marks_exclamationMarkWidth = 50.0;
|
||||
var kClipperz_PM_UI_Canvas_Marks_exclamationMarkHeight = 50.0;
|
||||
|
||||
function Clipperz_PM_UI_Canvas_Marks_exclamationMark(canvas, aColor)
|
||||
{
|
||||
var context = canvas.getContext("2d");
|
||||
var alignStroke;
|
||||
var resolution;
|
||||
var path;
|
||||
var pointX;
|
||||
var pointY;
|
||||
var controlPoint1X;
|
||||
var controlPoint1Y;
|
||||
var controlPoint2X;
|
||||
var controlPoint2Y;
|
||||
if (window.devicePixelRatio)
|
||||
resolution = window.devicePixelRatio;
|
||||
else
|
||||
resolution = 1.0;
|
||||
resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_Marks_exclamationMarkWidth + canvas.height / kClipperz_PM_UI_Canvas_Marks_exclamationMarkHeight);
|
||||
|
||||
context.save();
|
||||
context.scale(canvas.width / kClipperz_PM_UI_Canvas_Marks_exclamationMarkWidth, canvas.height / kClipperz_PM_UI_Canvas_Marks_exclamationMarkHeight);
|
||||
context.clearRect(0.0, 0.0, kClipperz_PM_UI_Canvas_Marks_exclamationMarkWidth, kClipperz_PM_UI_Canvas_Marks_exclamationMarkHeight);
|
||||
|
||||
// Layer 1
|
||||
|
||||
alignStroke = 0.0;
|
||||
context.beginPath();
|
||||
pointX = 26.499;
|
||||
pointY = 10.848;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.moveTo(pointX, pointY);
|
||||
pointX = 20.887;
|
||||
pointY = 11.584;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 25.395;
|
||||
controlPoint1Y = 10.802;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 22.175;
|
||||
controlPoint2Y = 11.078;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 20.013;
|
||||
pointY = 13.194;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 20.335;
|
||||
controlPoint1Y = 11.814;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 19.921;
|
||||
controlPoint2Y = 12.826;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 23.049;
|
||||
pointY = 28.788;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 20.243;
|
||||
controlPoint1Y = 15.448;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 22.589;
|
||||
controlPoint2Y = 26.35;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 25.027;
|
||||
pointY = 29.156;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 23.279;
|
||||
controlPoint1Y = 29.018;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 24.705;
|
||||
controlPoint2Y = 29.202;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 27.971;
|
||||
pointY = 11.354;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 25.809;
|
||||
controlPoint1Y = 25.384;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 27.971;
|
||||
controlPoint2Y = 12.826;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 26.499;
|
||||
pointY = 10.848;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 27.557;
|
||||
controlPoint1Y = 11.032;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 26.913;
|
||||
controlPoint2Y = 10.848;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 26.499;
|
||||
pointY = 10.848;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
context.closePath();
|
||||
pointX = 24.337;
|
||||
pointY = 31.962;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.moveTo(pointX, pointY);
|
||||
pointX = 21.899;
|
||||
pointY = 32.882;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 23.463;
|
||||
controlPoint1Y = 31.962;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 22.589;
|
||||
controlPoint2Y = 32.284;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 20.703;
|
||||
pointY = 35.458;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 21.163;
|
||||
controlPoint1Y = 33.572;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 20.703;
|
||||
controlPoint2Y = 34.538;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 21.669;
|
||||
pointY = 38.08;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 20.703;
|
||||
controlPoint1Y = 36.47;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 20.979;
|
||||
controlPoint2Y = 37.344;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 24.015;
|
||||
pointY = 39.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 22.405;
|
||||
controlPoint1Y = 38.77;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 23.325;
|
||||
controlPoint2Y = 39.0;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 26.821;
|
||||
pointY = 38.034;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 25.073;
|
||||
controlPoint1Y = 39.0;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 26.131;
|
||||
controlPoint2Y = 38.724;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 27.833;
|
||||
pointY = 35.55;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 27.465;
|
||||
controlPoint1Y = 37.344;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 27.833;
|
||||
controlPoint2Y = 36.194;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 26.683;
|
||||
pointY = 32.744;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 27.833;
|
||||
controlPoint1Y = 34.676;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 27.557;
|
||||
controlPoint2Y = 33.572;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 24.337;
|
||||
pointY = 31.962;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 26.085;
|
||||
controlPoint1Y = 32.238;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 25.211;
|
||||
controlPoint2Y = 31.962;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 24.337;
|
||||
pointY = 31.962;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
context.closePath();
|
||||
pointX = 30.639;
|
||||
pointY = 38.402;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.moveTo(pointX, pointY);
|
||||
context.fillStyle = aColor;
|
||||
context.fill();
|
||||
|
||||
context.restore();
|
||||
}
|
||||
391
frontend/gamma/js/Clipperz/PM/UI/Canvas/Marks/info.js
Normal file
391
frontend/gamma/js/Clipperz/PM/UI/Canvas/Marks/info.js
Normal file
@@ -0,0 +1,391 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
//
|
||||
// info.js
|
||||
// i
|
||||
//
|
||||
// Created by Giulio Cesare Solaroli on 3/7/10
|
||||
// Copyright 2010 Clipperz
|
||||
// This code was generated by Opacity. You may use or modify it in any way.
|
||||
//
|
||||
|
||||
var kClipperz_PM_UI_Canvas_Marks_infoWidth = 50.0;
|
||||
var kClipperz_PM_UI_Canvas_Marks_infoHeight = 50.0;
|
||||
|
||||
function Clipperz_PM_UI_Canvas_Marks_info(canvas, aColor)
|
||||
{
|
||||
var context = canvas.getContext("2d");
|
||||
var alignStroke;
|
||||
var resolution;
|
||||
var path;
|
||||
var pointX;
|
||||
var pointY;
|
||||
var controlPoint1X;
|
||||
var controlPoint1Y;
|
||||
var controlPoint2X;
|
||||
var controlPoint2Y;
|
||||
var color;
|
||||
if (window.devicePixelRatio)
|
||||
resolution = window.devicePixelRatio;
|
||||
else
|
||||
resolution = 1.0;
|
||||
resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_Marks_infoWidth + canvas.height / kClipperz_PM_UI_Canvas_Marks_infoHeight);
|
||||
|
||||
context.save();
|
||||
context.scale(canvas.width / kClipperz_PM_UI_Canvas_Marks_infoWidth, canvas.height / kClipperz_PM_UI_Canvas_Marks_infoHeight);
|
||||
context.clearRect(0.0, 0.0, kClipperz_PM_UI_Canvas_Marks_infoWidth, kClipperz_PM_UI_Canvas_Marks_infoHeight);
|
||||
|
||||
// Layer 1
|
||||
|
||||
alignStroke = 0.0;
|
||||
context.beginPath();
|
||||
pointX = 30.253;
|
||||
pointY = 37.436;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.moveTo(pointX, pointY);
|
||||
pointX = 28.505;
|
||||
pointY = 37.022;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 27.677;
|
||||
pointY = 35.09;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 27.953;
|
||||
controlPoint1Y = 36.792;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 27.677;
|
||||
controlPoint2Y = 36.47;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 27.631;
|
||||
pointY = 27.546;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 27.631;
|
||||
controlPoint1Y = 32.974;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 27.631;
|
||||
controlPoint2Y = 29.892;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 27.677;
|
||||
pointY = 19.726;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 27.631;
|
||||
controlPoint1Y = 24.97;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 27.677;
|
||||
controlPoint2Y = 21.612;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 19.535;
|
||||
pointY = 21.336;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 25.331;
|
||||
controlPoint1Y = 20.692;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 20.593;
|
||||
controlPoint2Y = 21.336;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 19.443;
|
||||
pointY = 22.762;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 19.397;
|
||||
controlPoint1Y = 21.52;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 19.305;
|
||||
controlPoint2Y = 22.532;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 21.283;
|
||||
pointY = 23.82;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 20.639;
|
||||
controlPoint1Y = 23.222;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 20.961;
|
||||
controlPoint2Y = 23.452;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 21.605;
|
||||
pointY = 24.97;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 21.513;
|
||||
controlPoint1Y = 24.05;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 21.605;
|
||||
controlPoint2Y = 24.602;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 21.651;
|
||||
pointY = 29.156;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 21.651;
|
||||
controlPoint1Y = 25.752;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 21.651;
|
||||
controlPoint2Y = 27.592;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 21.605;
|
||||
pointY = 35.228;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 21.651;
|
||||
controlPoint1Y = 31.364;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 21.651;
|
||||
controlPoint2Y = 34.216;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 20.823;
|
||||
pointY = 37.022;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 21.559;
|
||||
controlPoint1Y = 36.332;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 21.467;
|
||||
controlPoint2Y = 36.838;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 19.121;
|
||||
pointY = 37.436;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 20.363;
|
||||
controlPoint1Y = 37.206;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 19.857;
|
||||
controlPoint2Y = 37.298;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 19.121;
|
||||
pointY = 39.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 18.937;
|
||||
controlPoint1Y = 37.62;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 18.983;
|
||||
controlPoint2Y = 38.77;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 24.503;
|
||||
pointY = 38.862;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 20.271;
|
||||
controlPoint1Y = 39.0;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 21.927;
|
||||
controlPoint2Y = 38.862;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 30.023;
|
||||
pointY = 39.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 27.401;
|
||||
controlPoint1Y = 38.862;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 29.149;
|
||||
controlPoint2Y = 39.0;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 30.253;
|
||||
pointY = 37.436;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 30.299;
|
||||
controlPoint1Y = 38.77;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 30.391;
|
||||
controlPoint2Y = 37.62;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 30.253;
|
||||
pointY = 37.436;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
context.closePath();
|
||||
pointX = 27.493;
|
||||
pointY = 13.976;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.moveTo(pointX, pointY);
|
||||
pointX = 27.125;
|
||||
pointY = 12.228;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 27.493;
|
||||
controlPoint1Y = 13.608;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 27.401;
|
||||
controlPoint2Y = 12.688;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 24.963;
|
||||
pointY = 11.63;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 26.849;
|
||||
controlPoint1Y = 11.998;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 26.113;
|
||||
controlPoint2Y = 11.63;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 21.513;
|
||||
pointY = 12.688;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 23.767;
|
||||
controlPoint1Y = 11.63;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 22.203;
|
||||
controlPoint2Y = 12.09;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 21.283;
|
||||
pointY = 14.942;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 21.145;
|
||||
controlPoint1Y = 13.148;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 21.145;
|
||||
controlPoint2Y = 14.436;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 22.801;
|
||||
pointY = 17.012;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 21.513;
|
||||
controlPoint1Y = 15.908;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 21.973;
|
||||
controlPoint2Y = 16.69;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 26.205;
|
||||
pointY = 16.69;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 23.399;
|
||||
controlPoint1Y = 17.288;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 25.791;
|
||||
controlPoint2Y = 17.058;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 27.493;
|
||||
pointY = 13.976;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 26.941;
|
||||
controlPoint1Y = 16.046;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 27.493;
|
||||
controlPoint2Y = 14.896;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 27.493;
|
||||
pointY = 13.976;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
context.closePath();
|
||||
pointX = 30.851;
|
||||
pointY = 38.862;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.moveTo(pointX, pointY);
|
||||
color = "#FFFFFF";
|
||||
context.fillStyle = color;
|
||||
context.fill();
|
||||
|
||||
context.restore();
|
||||
}
|
||||
438
frontend/gamma/js/Clipperz/PM/UI/Canvas/Marks/questionMark.js
Normal file
438
frontend/gamma/js/Clipperz/PM/UI/Canvas/Marks/questionMark.js
Normal file
@@ -0,0 +1,438 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
//
|
||||
// questionMark.js
|
||||
// ?
|
||||
//
|
||||
// Created by Giulio Cesare Solaroli on 3/7/10
|
||||
// Copyright 2010 Clipperz
|
||||
// This code was generated by Opacity. You may use or modify it in any way.
|
||||
//
|
||||
|
||||
var kClipperz_PM_UI_Canvas_Marks_questionMarkWidth = 50.0;
|
||||
var kClipperz_PM_UI_Canvas_Marks_questionMarkHeight = 50.0;
|
||||
|
||||
function Clipperz_PM_UI_Canvas_Marks_questionMark(canvas, aColor)
|
||||
{
|
||||
var context = canvas.getContext("2d");
|
||||
var alignStroke;
|
||||
var resolution;
|
||||
var path;
|
||||
var pointX;
|
||||
var pointY;
|
||||
var controlPoint1X;
|
||||
var controlPoint1Y;
|
||||
var controlPoint2X;
|
||||
var controlPoint2Y;
|
||||
var color;
|
||||
if (window.devicePixelRatio)
|
||||
resolution = window.devicePixelRatio;
|
||||
else
|
||||
resolution = 1.0;
|
||||
resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_Marks_questionMarkWidth + canvas.height / kClipperz_PM_UI_Canvas_Marks_questionMarkHeight);
|
||||
|
||||
context.save();
|
||||
context.scale(canvas.width / kClipperz_PM_UI_Canvas_Marks_questionMarkWidth, canvas.height / kClipperz_PM_UI_Canvas_Marks_questionMarkHeight);
|
||||
context.clearRect(0.0, 0.0, kClipperz_PM_UI_Canvas_Marks_questionMarkWidth, kClipperz_PM_UI_Canvas_Marks_questionMarkHeight);
|
||||
|
||||
// Layer 1
|
||||
|
||||
alignStroke = 0.0;
|
||||
context.beginPath();
|
||||
pointX = 24.118;
|
||||
pointY = 24.464;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.moveTo(pointX, pointY);
|
||||
pointX = 24.854;
|
||||
pointY = 23.406;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 24.118;
|
||||
controlPoint1Y = 24.05;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 24.44;
|
||||
controlPoint2Y = 23.636;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 29.454;
|
||||
pointY = 20.6;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 26.418;
|
||||
controlPoint1Y = 22.532;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 28.534;
|
||||
controlPoint2Y = 21.566;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 30.282;
|
||||
pointY = 17.794;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 29.868;
|
||||
controlPoint1Y = 20.232;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 30.282;
|
||||
controlPoint2Y = 19.082;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 27.2;
|
||||
pointY = 12.688;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 30.282;
|
||||
controlPoint1Y = 16.322;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 29.454;
|
||||
controlPoint2Y = 14.344;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 21.312;
|
||||
pointY = 10.664;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 25.636;
|
||||
controlPoint1Y = 11.492;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 23.382;
|
||||
controlPoint2Y = 10.664;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 19.886;
|
||||
pointY = 11.124;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 20.898;
|
||||
controlPoint1Y = 10.664;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 20.162;
|
||||
controlPoint2Y = 10.894;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 18.0;
|
||||
pointY = 14.666;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 19.104;
|
||||
controlPoint1Y = 11.676;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 18.0;
|
||||
controlPoint2Y = 14.068;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 18.598;
|
||||
pointY = 15.586;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 18.0;
|
||||
controlPoint1Y = 14.896;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 18.138;
|
||||
controlPoint2Y = 15.494;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 19.794;
|
||||
pointY = 15.908;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 19.012;
|
||||
controlPoint1Y = 15.678;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 19.426;
|
||||
controlPoint2Y = 15.77;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 25.36;
|
||||
pointY = 20.002;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 22.508;
|
||||
controlPoint1Y = 16.644;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 25.36;
|
||||
controlPoint2Y = 17.886;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 24.21;
|
||||
pointY = 21.704;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 25.36;
|
||||
controlPoint1Y = 20.738;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 25.084;
|
||||
controlPoint2Y = 21.198;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 19.058;
|
||||
pointY = 24.326;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 23.106;
|
||||
controlPoint1Y = 22.348;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 19.886;
|
||||
controlPoint2Y = 23.774;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 18.506;
|
||||
pointY = 25.936;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 18.736;
|
||||
controlPoint1Y = 24.556;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 18.506;
|
||||
controlPoint2Y = 25.338;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 20.898;
|
||||
pointY = 29.064;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 18.506;
|
||||
controlPoint1Y = 26.948;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 19.334;
|
||||
controlPoint2Y = 28.42;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 22.048;
|
||||
pointY = 29.156;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 21.22;
|
||||
controlPoint1Y = 29.156;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 21.726;
|
||||
controlPoint2Y = 29.202;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 25.268;
|
||||
pointY = 27.592;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 22.508;
|
||||
controlPoint1Y = 29.064;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 24.9;
|
||||
controlPoint2Y = 27.96;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 25.406;
|
||||
pointY = 26.856;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 25.406;
|
||||
controlPoint1Y = 27.454;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 25.544;
|
||||
controlPoint2Y = 26.994;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 24.118;
|
||||
pointY = 24.464;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 24.578;
|
||||
controlPoint1Y = 25.936;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 24.118;
|
||||
controlPoint2Y = 24.786;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 24.118;
|
||||
pointY = 24.464;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
context.closePath();
|
||||
pointX = 23.06;
|
||||
pointY = 31.962;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.moveTo(pointX, pointY);
|
||||
pointX = 20.53;
|
||||
pointY = 32.928;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 22.186;
|
||||
controlPoint1Y = 31.962;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 21.22;
|
||||
controlPoint2Y = 32.33;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 19.426;
|
||||
pointY = 35.458;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 19.794;
|
||||
controlPoint1Y = 33.618;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 19.426;
|
||||
controlPoint2Y = 34.538;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 20.392;
|
||||
pointY = 38.08;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 19.426;
|
||||
controlPoint1Y = 36.47;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 19.702;
|
||||
controlPoint2Y = 37.344;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 22.738;
|
||||
pointY = 39.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 21.128;
|
||||
controlPoint1Y = 38.77;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 22.048;
|
||||
controlPoint2Y = 39.0;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 25.544;
|
||||
pointY = 38.034;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 23.796;
|
||||
controlPoint1Y = 39.0;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 24.854;
|
||||
controlPoint2Y = 38.724;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 26.556;
|
||||
pointY = 35.55;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 26.188;
|
||||
controlPoint1Y = 37.344;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 26.556;
|
||||
controlPoint2Y = 36.194;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 25.452;
|
||||
pointY = 32.744;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 26.556;
|
||||
controlPoint1Y = 34.676;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 26.326;
|
||||
controlPoint2Y = 33.618;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 23.06;
|
||||
pointY = 31.962;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 24.854;
|
||||
controlPoint1Y = 32.284;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 23.934;
|
||||
controlPoint2Y = 31.962;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 23.06;
|
||||
pointY = 31.962;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
context.closePath();
|
||||
pointX = 32.214;
|
||||
pointY = 38.402;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.moveTo(pointX, pointY);
|
||||
color = "#FFFFFF";
|
||||
context.fillStyle = color;
|
||||
context.fill();
|
||||
|
||||
context.restore();
|
||||
}
|
||||
403
frontend/gamma/js/Clipperz/PM/UI/Canvas/RegisterButton/normal.js
Normal file
403
frontend/gamma/js/Clipperz/PM/UI/Canvas/RegisterButton/normal.js
Normal file
@@ -0,0 +1,403 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
//
|
||||
// normal.js
|
||||
// normal
|
||||
//
|
||||
// Created by Giulio Cesare Solaroli on 3/24/10
|
||||
// Copyright 2010 Clipperz
|
||||
// This code was generated by Opacity. You may use or modify it in any way.
|
||||
//
|
||||
|
||||
var kClipperz_PM_UI_Canvas_RegisterButton_normalWidth = 282.0;
|
||||
var kClipperz_PM_UI_Canvas_RegisterButton_normalHeight = 93.0;
|
||||
|
||||
function Clipperz_PM_UI_Canvas_RegisterButton_normal(canvas, aBackgroundColor, aDarkBackgroundColor, aLightColor, aDarkColor, aStarColor)
|
||||
{
|
||||
var context = canvas.getContext("2d");
|
||||
var alignStroke;
|
||||
var resolution;
|
||||
var path;
|
||||
var pointX;
|
||||
var pointY;
|
||||
var controlPoint1X;
|
||||
var controlPoint1Y;
|
||||
var controlPoint2X;
|
||||
var controlPoint2Y;
|
||||
var gradient;
|
||||
var color;
|
||||
if (window.devicePixelRatio)
|
||||
resolution = window.devicePixelRatio;
|
||||
else
|
||||
resolution = 1.0;
|
||||
resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_RegisterButton_normalWidth + canvas.height / kClipperz_PM_UI_Canvas_RegisterButton_normalHeight);
|
||||
|
||||
context.save();
|
||||
context.scale(canvas.width / kClipperz_PM_UI_Canvas_RegisterButton_normalWidth, canvas.height / kClipperz_PM_UI_Canvas_RegisterButton_normalHeight);
|
||||
context.clearRect(0.0, 0.0, kClipperz_PM_UI_Canvas_RegisterButton_normalWidth, kClipperz_PM_UI_Canvas_RegisterButton_normalHeight);
|
||||
|
||||
// background
|
||||
|
||||
alignStroke = 0.0;
|
||||
context.beginPath();
|
||||
pointX = 241.0;
|
||||
pointY = 80.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.moveTo(pointX, pointY);
|
||||
pointX = 274.0;
|
||||
pointY = 47.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 259.103;
|
||||
controlPoint1Y = 80.0;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 274.0;
|
||||
controlPoint2Y = 65.103;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 274.0;
|
||||
pointY = 45.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 241.0;
|
||||
pointY = 12.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 274.0;
|
||||
controlPoint1Y = 26.897;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 259.103;
|
||||
controlPoint2Y = 12.0;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 60.0;
|
||||
pointY = 12.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 27.0;
|
||||
pointY = 45.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 41.897;
|
||||
controlPoint1Y = 12.0;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 27.0;
|
||||
controlPoint2Y = 26.897;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 27.0;
|
||||
pointY = 47.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 60.0;
|
||||
pointY = 80.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 27.0;
|
||||
controlPoint1Y = 65.103;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 41.897;
|
||||
controlPoint2Y = 80.0;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 241.0;
|
||||
pointY = 80.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
context.closePath();
|
||||
gradient = context.createLinearGradient(150.5, 12.0, 150.5, 80.0);
|
||||
gradient.addColorStop(0.0, aBackgroundColor);
|
||||
gradient.addColorStop(1.0, aDarkBackgroundColor);
|
||||
context.fillStyle = gradient;
|
||||
context.fill();
|
||||
|
||||
// round
|
||||
|
||||
alignStroke = 0.0;
|
||||
context.beginPath();
|
||||
pointX = 44.103;
|
||||
pointY = 4.014;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.moveTo(pointX, pointY);
|
||||
pointX = 65.629;
|
||||
pointY = 10.515;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 51.706;
|
||||
controlPoint1Y = 4.217;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 59.185;
|
||||
controlPoint2Y = 6.475;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 78.65;
|
||||
pointY = 70.918;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 43.0;
|
||||
pointY = 90.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 70.676;
|
||||
controlPoint1Y = 82.788;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 57.23;
|
||||
controlPoint2Y = 89.817;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 0.056;
|
||||
pointY = 44.801;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 18.834;
|
||||
controlPoint1Y = 90.07;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = -1.18;
|
||||
controlPoint2Y = 68.879;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 44.103;
|
||||
pointY = 4.014;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 1.242;
|
||||
controlPoint1Y = 21.708;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 21.202;
|
||||
controlPoint2Y = 3.72;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 44.103;
|
||||
pointY = 4.014;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
context.closePath();
|
||||
gradient = context.createLinearGradient(39.326, 90, 39.326, 4.011);
|
||||
gradient.addColorStop(0.0, aDarkColor);
|
||||
gradient.addColorStop(1.0, aLightColor);
|
||||
context.fillStyle = gradient;
|
||||
context.fill();
|
||||
|
||||
// *
|
||||
|
||||
alignStroke = 0.0;
|
||||
context.beginPath();
|
||||
pointX = 23.983;
|
||||
pointY = 35.944;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.moveTo(pointX, pointY);
|
||||
pointX = 37.25;
|
||||
pointY = 40.261;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 37.25;
|
||||
pointY = 24.963;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 48.231;
|
||||
pointY = 24.963;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 48.231;
|
||||
pointY = 40.261;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 61.498;
|
||||
pointY = 35.944;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 64.481;
|
||||
pointY = 45.402;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 50.961;
|
||||
pointY = 49.592;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 59.784;
|
||||
pointY = 62.224;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 51.659;
|
||||
pointY = 68.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 42.836;
|
||||
pointY = 56.066;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 33.759;
|
||||
pointY = 68.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 25.634;
|
||||
pointY = 62.224;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 34.521;
|
||||
pointY = 49.592;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 21.0;
|
||||
pointY = 45.402;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 23.983;
|
||||
pointY = 35.944;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
context.closePath();
|
||||
pointX = 68.607;
|
||||
pointY = 119.099;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.moveTo(pointX, pointY);
|
||||
context.fillStyle = aStarColor;
|
||||
context.fill();
|
||||
|
||||
alignStroke = 0.0;
|
||||
context.beginPath();
|
||||
pointX = 212.0;
|
||||
pointY = 125.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.moveTo(pointX, pointY);
|
||||
pointX = 213.0;
|
||||
pointY = 125.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 212.5;
|
||||
pointY = 124.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 212.0;
|
||||
pointY = 125.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
context.closePath();
|
||||
gradient = context.createLinearGradient(212.5, 125.0, 212.5, 124.0);
|
||||
color = "#FFFFFF";
|
||||
gradient.addColorStop(0.0, color);
|
||||
color = "#A9A9A9";
|
||||
gradient.addColorStop(1.0, color);
|
||||
context.fillStyle = gradient;
|
||||
context.fill();
|
||||
|
||||
// flip
|
||||
|
||||
// Setup for Shadow Effect
|
||||
color = "rgba(0.0%, 0.0%, 0.0%, 0.5)";
|
||||
context.save();
|
||||
context.shadowColor = color;
|
||||
context.shadowBlur = 0.0;
|
||||
context.shadowOffsetX = 2.0 * Math.cos(8.377) * resolution;
|
||||
context.shadowOffsetY = 2.0 * Math.sin(8.377) * resolution;
|
||||
|
||||
// round
|
||||
|
||||
alignStroke = 0.0;
|
||||
context.beginPath();
|
||||
pointX = 78.506;
|
||||
pointY = 70.251;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.moveTo(pointX, pointY);
|
||||
pointX = 66.155;
|
||||
pointY = 12.954;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 59.899;
|
||||
controlPoint1Y = 57.427;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 54.678;
|
||||
controlPoint2Y = 32.277;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 78.506;
|
||||
pointY = 70.251;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
context.closePath();
|
||||
gradient = context.createLinearGradient(69.301, 70.251, 69.301, 12.954);
|
||||
gradient.addColorStop(0.0, aDarkColor);
|
||||
gradient.addColorStop(1.0, aLightColor);
|
||||
context.fillStyle = gradient;
|
||||
context.fill();
|
||||
|
||||
// Shadow Effect
|
||||
context.restore();
|
||||
|
||||
context.restore();
|
||||
}
|
||||
153
frontend/gamma/js/Clipperz/PM/UI/Canvas/Star/normal.js
Normal file
153
frontend/gamma/js/Clipperz/PM/UI/Canvas/Star/normal.js
Normal file
@@ -0,0 +1,153 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
//
|
||||
// normal.js
|
||||
// normal
|
||||
//
|
||||
// Created by Giulio Cesare Solaroli on 3/15/10
|
||||
// Copyright 2010 Clipperz
|
||||
// This code was generated by Opacity. You may use or modify it in any way.
|
||||
//
|
||||
|
||||
var kClipperz_PM_UI_Canvas_Star_normalWidth = 46.0;
|
||||
var kClipperz_PM_UI_Canvas_Star_normalHeight = 46.0;
|
||||
|
||||
function Clipperz_PM_UI_Canvas_Star_normal(canvas, aColor)
|
||||
{
|
||||
var context = canvas.getContext("2d");
|
||||
var alignStroke;
|
||||
var resolution;
|
||||
var path;
|
||||
var pointX;
|
||||
var pointY;
|
||||
if (window.devicePixelRatio)
|
||||
resolution = window.devicePixelRatio;
|
||||
else
|
||||
resolution = 1.0;
|
||||
resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_Star_normalWidth + canvas.height / kClipperz_PM_UI_Canvas_Star_normalHeight);
|
||||
|
||||
context.save();
|
||||
context.scale(canvas.width / kClipperz_PM_UI_Canvas_Star_normalWidth, canvas.height / kClipperz_PM_UI_Canvas_Star_normalHeight);
|
||||
context.clearRect(0.0, 0.0, kClipperz_PM_UI_Canvas_Star_normalWidth, kClipperz_PM_UI_Canvas_Star_normalHeight);
|
||||
|
||||
// *
|
||||
|
||||
alignStroke = 0.0;
|
||||
context.beginPath();
|
||||
pointX = 8.613;
|
||||
pointY = 15.583;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.moveTo(pointX, pointY);
|
||||
pointX = 18.563;
|
||||
pointY = 18.821;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 18.563;
|
||||
pointY = 7.347;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 26.799;
|
||||
pointY = 7.347;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 26.799;
|
||||
pointY = 18.821;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 36.749;
|
||||
pointY = 15.583;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 38.986;
|
||||
pointY = 22.677;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 28.846;
|
||||
pointY = 25.819;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 35.463;
|
||||
pointY = 35.293;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 29.369;
|
||||
pointY = 39.625;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 22.752;
|
||||
pointY = 30.675;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 15.944;
|
||||
pointY = 39.625;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 9.85;
|
||||
pointY = 35.293;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 16.515;
|
||||
pointY = 25.819;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 6.375;
|
||||
pointY = 22.677;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 8.613;
|
||||
pointY = 15.583;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
context.closePath();
|
||||
pointX = 42.081;
|
||||
pointY = 77.949;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.moveTo(pointX, pointY);
|
||||
context.fillStyle = aColor;
|
||||
context.fill();
|
||||
|
||||
context.restore();
|
||||
}
|
||||
156
frontend/gamma/js/Clipperz/PM/UI/Canvas/Tips/close.js
Normal file
156
frontend/gamma/js/Clipperz/PM/UI/Canvas/Tips/close.js
Normal file
@@ -0,0 +1,156 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
//
|
||||
// close.js
|
||||
// close
|
||||
//
|
||||
// Created by Giulio Cesare Solaroli on 3/14/10
|
||||
// Copyright 2010 Clipperz
|
||||
// This code was generated by Opacity. You may use or modify it in any way.
|
||||
//
|
||||
|
||||
var kClipperz_PM_UI_Canvas_Tips_closeWidth = 310.0;
|
||||
var kClipperz_PM_UI_Canvas_Tips_closeHeight = 6.0;
|
||||
|
||||
function Clipperz_PM_UI_Canvas_Tips_close(canvas, aColor, aBackgroundColor)
|
||||
{
|
||||
var context = canvas.getContext("2d");
|
||||
var alignStroke;
|
||||
var resolution;
|
||||
var path;
|
||||
var pointX;
|
||||
var pointY;
|
||||
if (window.devicePixelRatio)
|
||||
resolution = window.devicePixelRatio;
|
||||
else
|
||||
resolution = 1.0;
|
||||
resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_Tips_closeWidth + canvas.height / kClipperz_PM_UI_Canvas_Tips_closeHeight);
|
||||
|
||||
context.save();
|
||||
context.scale(canvas.width / kClipperz_PM_UI_Canvas_Tips_closeWidth, canvas.height / kClipperz_PM_UI_Canvas_Tips_closeHeight);
|
||||
context.clearRect(0.0, 0.0, kClipperz_PM_UI_Canvas_Tips_closeWidth, kClipperz_PM_UI_Canvas_Tips_closeHeight);
|
||||
|
||||
// background
|
||||
|
||||
alignStroke = 0.0;
|
||||
context.beginPath();
|
||||
pointX = 310.0;
|
||||
pointY = 6.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.moveTo(pointX, pointY);
|
||||
pointX = 310.0;
|
||||
pointY = 0.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 0.0;
|
||||
pointY = 0.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 0.0;
|
||||
pointY = 6.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 310.0;
|
||||
pointY = 6.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
context.closePath();
|
||||
context.fillStyle = aBackgroundColor;
|
||||
context.fill();
|
||||
|
||||
// grid
|
||||
|
||||
// background
|
||||
|
||||
alignStroke = 0.0;
|
||||
context.beginPath();
|
||||
pointX = 310.0;
|
||||
pointY = 6.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.moveTo(pointX, pointY);
|
||||
pointX = 310.0;
|
||||
pointY = 0.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 0.0;
|
||||
pointY = 0.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 0.0;
|
||||
pointY = 6.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 310.0;
|
||||
pointY = 6.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
context.closePath();
|
||||
context.fillStyle = aBackgroundColor;
|
||||
context.fill();
|
||||
|
||||
// toggle
|
||||
|
||||
alignStroke = 0.0;
|
||||
context.beginPath();
|
||||
pointX = 149.0;
|
||||
pointY = 6.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.moveTo(pointX, pointY);
|
||||
pointX = 161.0;
|
||||
pointY = 6.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 155.0;
|
||||
pointY = 0.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 149.0;
|
||||
pointY = 6.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
context.closePath();
|
||||
context.fillStyle = aColor;
|
||||
context.fill();
|
||||
|
||||
context.restore();
|
||||
}
|
||||
163
frontend/gamma/js/Clipperz/PM/UI/Canvas/Tips/open.js
Normal file
163
frontend/gamma/js/Clipperz/PM/UI/Canvas/Tips/open.js
Normal file
@@ -0,0 +1,163 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
//
|
||||
// open.js
|
||||
// open
|
||||
//
|
||||
// Created by Giulio Cesare Solaroli on 3/14/10
|
||||
// Copyright 2010 Clipperz
|
||||
// This code was generated by Opacity. You may use or modify it in any way.
|
||||
//
|
||||
|
||||
var kClipperz_PM_UI_Canvas_Tips_openWidth = 310.0;
|
||||
var kClipperz_PM_UI_Canvas_Tips_openHeight = 6.0;
|
||||
|
||||
function Clipperz_PM_UI_Canvas_Tips_open(canvas, aColor, aBackgroundColor)
|
||||
{
|
||||
var context = canvas.getContext("2d");
|
||||
var alignStroke;
|
||||
var resolution;
|
||||
var path;
|
||||
var pointX;
|
||||
var pointY;
|
||||
var color;
|
||||
if (window.devicePixelRatio)
|
||||
resolution = window.devicePixelRatio;
|
||||
else
|
||||
resolution = 1.0;
|
||||
resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_Tips_openWidth + canvas.height / kClipperz_PM_UI_Canvas_Tips_openHeight);
|
||||
|
||||
context.save();
|
||||
context.scale(canvas.width / kClipperz_PM_UI_Canvas_Tips_openWidth, canvas.height / kClipperz_PM_UI_Canvas_Tips_openHeight);
|
||||
context.clearRect(0.0, 0.0, kClipperz_PM_UI_Canvas_Tips_openWidth, kClipperz_PM_UI_Canvas_Tips_openHeight);
|
||||
|
||||
// background
|
||||
|
||||
alignStroke = 0.0;
|
||||
context.beginPath();
|
||||
pointX = 310.0;
|
||||
pointY = 6.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.moveTo(pointX, pointY);
|
||||
pointX = 310.0;
|
||||
pointY = 0.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 0.0;
|
||||
pointY = 0.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 0.0;
|
||||
pointY = 6.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 310.0;
|
||||
pointY = 6.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
context.closePath();
|
||||
context.fillStyle = aBackgroundColor;
|
||||
context.fill();
|
||||
|
||||
// grid
|
||||
|
||||
// background
|
||||
|
||||
alignStroke = 0.0;
|
||||
context.beginPath();
|
||||
pointX = 310.0;
|
||||
pointY = 6.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.moveTo(pointX, pointY);
|
||||
pointX = 310.0;
|
||||
pointY = 0.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 0.0;
|
||||
pointY = 0.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 0.0;
|
||||
pointY = 6.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 310.0;
|
||||
pointY = 6.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
context.closePath();
|
||||
context.fillStyle = aBackgroundColor;
|
||||
context.fill();
|
||||
|
||||
// Layer 1
|
||||
|
||||
alignStroke = 0.0;
|
||||
context.save();
|
||||
context.translate(155.0, 3.0);
|
||||
context.rotate(-3.142);
|
||||
context.translate(-155.0, -3.0);
|
||||
context.beginPath();
|
||||
pointX = 149.0;
|
||||
pointY = 6.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.moveTo(pointX, pointY);
|
||||
pointX = 161.0;
|
||||
pointY = 6.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 155.0;
|
||||
pointY = 0.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 149.0;
|
||||
pointY = 6.0;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
context.closePath();
|
||||
color = "#FFFFFF";
|
||||
context.fillStyle = color;
|
||||
context.fill();
|
||||
context.restore();
|
||||
|
||||
context.restore();
|
||||
}
|
||||
@@ -0,0 +1,611 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
Clipperz.Base.module('Clipperz.PM.UI.Common.Components');
|
||||
|
||||
//#############################################################################
|
||||
|
||||
var _Clipperz_PM_Components_base_id_ = 0;
|
||||
|
||||
//#############################################################################
|
||||
|
||||
Clipperz.PM.UI.Common.Components.BaseComponent = function(args) {
|
||||
args = args || {};
|
||||
Clipperz.PM.UI.Common.Components.BaseComponent.superclass.constructor.call(this, args);
|
||||
|
||||
this._element = args.element || null;
|
||||
this._ids = {};
|
||||
|
||||
this._slots = {};
|
||||
this._slotComponents = {};
|
||||
|
||||
this._components = {};
|
||||
|
||||
this._cachedSlots = {};
|
||||
|
||||
this._isModal = false;
|
||||
|
||||
this._isActive = false;
|
||||
this._elementUsedToEnterModalState;
|
||||
|
||||
this._isFullyRendered = false;
|
||||
this._renderingWaitingQueue = [];
|
||||
|
||||
// this._slots = {
|
||||
// 'header': 'header',
|
||||
// 'body': 'body',
|
||||
// 'footer': 'footer'
|
||||
// };
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
|
||||
//TODO get back to MochiKit.Base.update as we are not extending anything
|
||||
//MochiKit.Base.update(Clipperz.PM.UI.Common.Components.BaseComponent.prototype, {
|
||||
Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.BaseComponent, /*Ext.Component*/ Object, {
|
||||
|
||||
'isClipperzPMComponent': true,
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'toString': function () {
|
||||
return "Clipperz.PM.UI.Common.Components.BaseComponent component";
|
||||
},
|
||||
|
||||
'componentId': function () {
|
||||
return this.getId('_id_');
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
/*
|
||||
'slots': function() {
|
||||
return this._slots;
|
||||
},
|
||||
*/
|
||||
'slotComponents': function() {
|
||||
return this._slotComponents;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'components': function () {
|
||||
return this._components;
|
||||
},
|
||||
|
||||
'addComponent': function (aComponent) {
|
||||
this.components()[aComponent.componentId()] = aComponent;
|
||||
},
|
||||
|
||||
'removeComponent': function (aComponent) {
|
||||
var componentId;
|
||||
|
||||
componentId = aComponent.componentId();
|
||||
this.components()[componentId].remove();
|
||||
delete this.components()[componentId];
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
/*
|
||||
'domHelper': function() {
|
||||
return Clipperz.YUI.DomHelper;
|
||||
},
|
||||
*/
|
||||
//-------------------------------------------------------------------------
|
||||
/*
|
||||
'domHelperAppend': function(aValue) {
|
||||
Clipperz.YUI.DomHelper.append(this.element().dom, aValue);
|
||||
},
|
||||
*/
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'element': function() {
|
||||
//MochiKit.Logging.logDebug(">>> BaseComponent.element");
|
||||
return MochiKit.DOM.getElement(this._element);
|
||||
},
|
||||
|
||||
'setElement': function(aNode) {
|
||||
this._element = aNode;
|
||||
},
|
||||
|
||||
//-----------------------------------------------------
|
||||
|
||||
'displayElement': function() {
|
||||
return this.element();
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'renderInNode': function(aDomNode) {
|
||||
this.setElement(aDomNode);
|
||||
this.render();
|
||||
},
|
||||
|
||||
'render': function() {
|
||||
this.clear();
|
||||
this.renderSelf();
|
||||
this.renderComponents();
|
||||
if (this.shouldShowTranslationHints()) {
|
||||
this.renderTranslationHints();
|
||||
}
|
||||
if (this.shouldShowElementWhileRendering()) {
|
||||
MochiKit.Style.showElement(this.displayElement());
|
||||
};
|
||||
|
||||
this._isFullyRendered = true;
|
||||
|
||||
MochiKit.Iter.forEach(this.renderingWaitingQueue(), MochiKit.Base.methodcaller('callback'));
|
||||
this.resetRenderingWaitingQueue();
|
||||
},
|
||||
|
||||
'renderSelf': function() {
|
||||
throw Clipperz.Base.exception.AbstractMethod;
|
||||
},
|
||||
|
||||
'renderComponents': function() {
|
||||
var slotName;
|
||||
|
||||
for (slotName in this.slotComponents()) {
|
||||
this.slotComponents()[slotName].renderInNode(this.elementForSlotNamed(slotName));
|
||||
}
|
||||
},
|
||||
|
||||
//.........................................................................
|
||||
|
||||
'isFullyRendered': function () {
|
||||
return this._isFullyRendered;
|
||||
},
|
||||
|
||||
//.........................................................................
|
||||
|
||||
'renderingWaitingQueue': function () {
|
||||
return this._renderingWaitingQueue;
|
||||
},
|
||||
|
||||
'resetRenderingWaitingQueue': function () {
|
||||
this._renderingWaitingQueue = [];
|
||||
},
|
||||
|
||||
//.........................................................................
|
||||
|
||||
'waitUntilFullyRendered': function () {
|
||||
var deferredResult;
|
||||
|
||||
if (this.isFullyRendered() == true) {
|
||||
deferredResult = MochiKit.Async.succeed
|
||||
} else {
|
||||
deferredResult = new Clipperz.Async.Deferred("BaseComponent.waitUntilFullyRendered", {trace:false});
|
||||
this.renderingWaitingQueue().push(deferredResult);
|
||||
}
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//-----------------------------------------------------
|
||||
|
||||
'renderTranslationHints': function () {
|
||||
var translatableItems;
|
||||
|
||||
translatableItems = MochiKit.Selector.findChildElements(this.displayElement(), ['[stringID]']);
|
||||
MochiKit.Iter.forEach(translatableItems, MochiKit.Base.method(this, 'enhanceTranslatableElement'))
|
||||
},
|
||||
|
||||
'enhanceTranslatableElement': function (anElement) {
|
||||
//Clipperz.log(">>> enhanceTranslatableElement", anElement);
|
||||
// new Clipperz.PM.UI.Common.Components.TranslatorWidget({
|
||||
// 'element': anElement
|
||||
// });
|
||||
|
||||
MochiKit.Signal.connect(anElement, 'onmouseenter', MochiKit.Base.partial(Clipperz.PM.UI.Common.Components.TranslatorWidget.show, anElement, MochiKit.DOM.getNodeAttribute(anElement, 'stringID')));
|
||||
MochiKit.Signal.connect(anElement, 'onmouseleave', Clipperz.PM.UI.Common.Components.TranslatorWidget.hide);
|
||||
//Clipperz.log("<<< enhanceTranslatableElement");
|
||||
},
|
||||
|
||||
//-----------------------------------------------------
|
||||
|
||||
'update': function(args) {
|
||||
throw Clipperz.Base.exception.AbstractMethod;
|
||||
},
|
||||
|
||||
'updateSelf': function(args) {
|
||||
throw Clipperz.Base.exception.AbstractMethod;
|
||||
},
|
||||
|
||||
'updateComponents': function(args) {
|
||||
throw Clipperz.Base.exception.AbstractMethod;
|
||||
},
|
||||
|
||||
//-----------------------------------------------------
|
||||
|
||||
'refresh': function() {
|
||||
throw Clipperz.Base.exception.AbstractMethod;
|
||||
},
|
||||
|
||||
'refreshSelf': function() {
|
||||
throw Clipperz.Base.exception.AbstractMethod;
|
||||
},
|
||||
|
||||
'refreshComponents': function(args) {
|
||||
throw Clipperz.Base.exception.AbstractMethod;
|
||||
},
|
||||
|
||||
//-----------------------------------------------------
|
||||
|
||||
'checkSlotNamed': function(aSlotName) {
|
||||
if (typeof(this._slots[aSlotName]) == 'undefined') {
|
||||
throw new Error("undefined slot");
|
||||
};
|
||||
},
|
||||
|
||||
//-----------------------------------------------------
|
||||
|
||||
'cachedSlots': function() {
|
||||
return this._cachedSlots;
|
||||
},
|
||||
|
||||
'slotNamed': function(aSlotName) {
|
||||
var result;
|
||||
|
||||
this.checkSlotNamed(aSlotName);
|
||||
if (typeof(this.cachedSlots()[aSlotName]) == 'undefined') {
|
||||
this.cachedSlots()[aSlotName] = new Clipperz.PM.UI.Common.Components.ComponentSlot(this,aSlotName);
|
||||
}
|
||||
|
||||
result = this.cachedSlots()[aSlotName];
|
||||
|
||||
return result;
|
||||
},
|
||||
|
||||
//-----------------------------------------------------
|
||||
|
||||
'elementForSlotNamed': function(aSlotName) {
|
||||
return MochiKit.DOM.getElement(this._slots[aSlotName]);
|
||||
},
|
||||
|
||||
//-----------------------------------------------------
|
||||
|
||||
'componentForSlotNamed': function(aSlotName) {
|
||||
return this.slotComponents()[aSlotName];
|
||||
},
|
||||
|
||||
'setComponentForSlotNamed': function(aComponent, aSlotName) {
|
||||
var domNode;
|
||||
|
||||
this.checkSlotNamed(aSlotName);
|
||||
|
||||
if (this.slotComponents()[aSlotName] != null) {
|
||||
this.slotComponents()[aSlotName].remove();
|
||||
}
|
||||
|
||||
this.slotComponents()[aSlotName] = aComponent;
|
||||
|
||||
// domNode = MochiKit.DOM.getElement(this.slotNamed(aSlotName));
|
||||
domNode = this.elementForSlotNamed(aSlotName);
|
||||
|
||||
if (domNode != null) {
|
||||
aComponent.renderInNode(domNode);
|
||||
}
|
||||
},
|
||||
|
||||
//-----------------------------------------------------
|
||||
/*
|
||||
'purgeListeners': function() {
|
||||
//MochiKit.Logging.logDebug(">>> Clipperz.PM.UI.Common.Components.BaseComponent.purgeListeners [" + this + "]");
|
||||
//MochiKit.Logging.logDebug("--- " + this + ".purgeListeners");
|
||||
Clipperz.NotificationCenter.unregister(this);
|
||||
MochiKit.Signal.disconnectAllTo(this);
|
||||
//MochiKit.Logging.logDebug("<<< Clipperz.PM.UI.Common.Components.BaseComponent.purgeListeners");
|
||||
},
|
||||
*/
|
||||
//-----------------------------------------------------
|
||||
|
||||
'clear': function() {
|
||||
var slotName;
|
||||
var componentId;
|
||||
|
||||
MochiKit.Signal.disconnectAllTo(this);
|
||||
|
||||
for (slotName in this.slotComponents()) {
|
||||
this.slotComponents()[slotName].clear();
|
||||
}
|
||||
|
||||
for (componentId in this.components()) {
|
||||
this.components()[componentId].clear();
|
||||
}
|
||||
|
||||
// if (this.element() != null) {
|
||||
// this.element().innerHTML = "";
|
||||
// }
|
||||
|
||||
if (this.displayElement() != null) {
|
||||
if (this.element() != this.displayElement()) {
|
||||
MochiKit.DOM.removeElement(this.displayElement());
|
||||
} else {
|
||||
this.displayElement().innerHTML = "";
|
||||
}
|
||||
}
|
||||
|
||||
if (this.isModal()) {
|
||||
// TODO: cleanup when the closed element was shown modally.
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
'remove': function() {
|
||||
var slotName;
|
||||
var componentId;
|
||||
|
||||
for (slotName in this.slotComponents()) {
|
||||
this.slotComponents()[slotName].remove();
|
||||
delete this.slotComponents()[slotName];
|
||||
}
|
||||
|
||||
for (componentId in this.components()) {
|
||||
this.components()[componentId].remove();
|
||||
delete this.components()[componentId];
|
||||
}
|
||||
|
||||
this.clear();
|
||||
MochiKit.Signal.disconnectAll(this);
|
||||
},
|
||||
|
||||
'append': function(aNode, aValue) {
|
||||
return Clipperz.DOM.Helper.append(aNode, aValue);
|
||||
},
|
||||
|
||||
'insertBefore': function (aNode, aValue) {
|
||||
return Clipperz.DOM.Helper.insertBefore(aNode, aValue);
|
||||
},
|
||||
|
||||
'insertAfter': function (aNode, aValue) {
|
||||
return Clipperz.DOM.Helper.insertAfter(aNode, aValue);
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'getId': function(aValue) {
|
||||
var result;
|
||||
|
||||
if (typeof(aValue) != 'undefined') {
|
||||
result = this._ids[aValue];
|
||||
|
||||
if (typeof(result) == 'undefined') {
|
||||
_Clipperz_PM_Components_base_id_ ++;
|
||||
|
||||
result = "Clipperz_PM_Components_" + aValue + "_" + _Clipperz_PM_Components_base_id_;
|
||||
this._ids[aValue] = result;
|
||||
}
|
||||
} else {
|
||||
// result = Clipperz.PM.UI.Common.Components.BaseComponent.superclass.getId.call(this);
|
||||
throw "call to BaseComponent.getId with an undefined value";
|
||||
}
|
||||
|
||||
return result;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'getElement': function(aValue) {
|
||||
return Clipperz.DOM.get(this.getId(aValue));
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'hideElement': function(anElementName) {
|
||||
MochiKit.Style.hideElement(this.getElement(anElementName));
|
||||
},
|
||||
|
||||
'showElement': function(anElementName) {
|
||||
MochiKit.Style.showElement(this.getElement(anElementName));
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'activate': function () {
|
||||
this._isActive = true;
|
||||
},
|
||||
|
||||
'deactivate': function () {
|
||||
this._isActive = false;
|
||||
},
|
||||
|
||||
'isActive': function () {
|
||||
return this._isActive;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'hideSlot': function(aSlotName) {
|
||||
if (this.componentForSlotNamed(aSlotName)) {
|
||||
this.componentForSlotNamed(aSlotName).deactivate();
|
||||
}
|
||||
MochiKit.Style.hideElement(this.elementForSlotNamed(aSlotName));
|
||||
},
|
||||
|
||||
'showSlot': function(aSlotName) {
|
||||
if (this.componentForSlotNamed(aSlotName)) {
|
||||
this.componentForSlotNamed(aSlotName).activate();
|
||||
}
|
||||
MochiKit.Style.showElement(this.elementForSlotNamed(aSlotName));
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'shouldShowTranslationHints': function () {
|
||||
return false;
|
||||
},
|
||||
|
||||
'shouldShowElementWhileRendering': function() {
|
||||
return true;
|
||||
},
|
||||
|
||||
// 'shouldRemoveElementWhenClearningUp': function () {
|
||||
// return true;
|
||||
// },
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'isModal': function() {
|
||||
return this._isModal;
|
||||
},
|
||||
|
||||
'setIsModal': function(aValue) {
|
||||
this._isModal = aValue;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'elementUsedToEnterModalState': function () {
|
||||
return this._elementUsedToEnterModalState;
|
||||
},
|
||||
|
||||
'setElementUsedToEnterModalState': function (aValue) {
|
||||
this._elementUsedToEnterModalState = aValue;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'modalDialogMask': function () {
|
||||
return 'modalDialogMask';
|
||||
},
|
||||
|
||||
'modalDialog': function () {
|
||||
return 'modalDialog';
|
||||
},
|
||||
|
||||
'modalDialogFrame': function() {
|
||||
return 'modalDialogFrame'
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'deferredShowModal': function(args) {
|
||||
var deferredResult;
|
||||
|
||||
deferredResult = new Clipperz.Async.Deferred("BaseComponent.deferredShowModal", {trace:false});
|
||||
|
||||
deferredResult.addMethod(this, 'setIsModal', true);
|
||||
deferredResult.addCallback(MochiKit.Style.showElement, this.modalDialogMask());
|
||||
deferredResult.addCallback(MochiKit.Base.bind(function(someArgs) {
|
||||
var result;
|
||||
var duration;
|
||||
var from;
|
||||
var to;
|
||||
|
||||
duration = someArgs.duration || 0.4;
|
||||
|
||||
this.setElementUsedToEnterModalState(someArgs.openFromElement);
|
||||
from = Clipperz.Style.getSizeAndPosition(someArgs.openFromElement);
|
||||
this.renderInNode(this.modalDialog());
|
||||
MochiKit.DOM.addElementClass(this.modalDialog(), 'fixed');
|
||||
to = Clipperz.Style.getSizeAndPosition(this.displayElement());
|
||||
Clipperz.PM.UI.Common.Components.BaseComponent.targetModalDimensionsAndPosition = Clipperz.Base.deepClone(to);
|
||||
|
||||
MochiKit.Style.hideElement(this.displayElement());
|
||||
MochiKit.Style.showElement(this.modalDialogFrame());
|
||||
|
||||
result = {from:from, to:to, duration:duration};
|
||||
return result;
|
||||
}, this, args));
|
||||
deferredResult.addCallback(Clipperz.Visual.deferredResize, this.modalDialogFrame());
|
||||
deferredResult.addCallback(MochiKit.Base.bind(function(someArgs) {
|
||||
MochiKit.Style.hideElement(this.modalDialogFrame());
|
||||
MochiKit.Style.showElement(this.displayElement());
|
||||
}, this));
|
||||
deferredResult.addCallback(MochiKit.Async.succeed, arguments[arguments.length - 1]);
|
||||
deferredResult.callback();
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'deferredHideModal': function(args) {
|
||||
var deferredResult;
|
||||
|
||||
args = args || {};
|
||||
|
||||
deferredResult = new Clipperz.Async.Deferred("BaseComponent.deferredHideModal", {trace:false});
|
||||
deferredResult.addCallback(MochiKit.Base.bind(function(someArgs) {
|
||||
var result;
|
||||
var from;
|
||||
var toElement;
|
||||
var to;
|
||||
var duration;
|
||||
|
||||
toElement = args.closeToElement || this.elementUsedToEnterModalState();
|
||||
duration = someArgs.duration || 0.4;
|
||||
from = Clipperz.Style.getSizeAndPosition(this.displayElement());
|
||||
to = Clipperz.Style.getSizeAndPosition(toElement);
|
||||
|
||||
MochiKit.Style.hideElement(this.displayElement());
|
||||
MochiKit.Style.showElement(this.modalDialogFrame());
|
||||
|
||||
result = {from:from, to:to, duration:duration};
|
||||
return result;
|
||||
}, this, args));
|
||||
deferredResult.addCallback(Clipperz.Visual.deferredResize, this.modalDialogFrame());
|
||||
deferredResult.addCallback(MochiKit.Base.bind(function() {
|
||||
MochiKit.Style.hideElement(this.modalDialogFrame());
|
||||
MochiKit.Style.hideElement(this.modalDialogMask());
|
||||
}, this));
|
||||
deferredResult.addMethod(this, 'setIsModal', false);
|
||||
deferredResult.addMethod(this, 'clear'); // ##############
|
||||
deferredResult.addCallback(MochiKit.Async.succeed, arguments[arguments.length - 1]);
|
||||
deferredResult.callback();
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
__syntaxFix__: "syntax fix"
|
||||
|
||||
});
|
||||
|
||||
Clipperz.PM.UI.Common.Components.BaseComponent_modalDialog = function() {
|
||||
Clipperz.DOM.Helper.append(MochiKit.DOM.currentDocument().body,
|
||||
{tag:'div', id:'modalDialogWrapper', cls:'modalDialogWrapper', children:[
|
||||
{tag:'div', id:'modalDialogMask', cls:'modalDialogMask'},
|
||||
{tag:'div', id:'modalDialogFrame', cls:'modalDialogFrame' /*, html:"modal dialog frame"*/},
|
||||
{tag:'div', id:'modalDialog', cls:'modalDialog'}
|
||||
// {tag:'div', id:'modalDialog', cls:'modalDialog', children:[{tag:'div'}]}
|
||||
]}
|
||||
);
|
||||
|
||||
// MochiKit.Style.hideElement('modalDialogWrapper');
|
||||
MochiKit.Style.hideElement('modalDialogMask');
|
||||
MochiKit.Style.hideElement('modalDialogFrame');
|
||||
// MochiKit.Style.hideElement('modalDialog');
|
||||
|
||||
};
|
||||
|
||||
//Clipperz.PM.UI.Common.Components.BaseComponent.targetModalDimensionsAndPosition = {'x':'X', 'y':'Y'};
|
||||
|
||||
MochiKit.DOM.addLoadEvent(Clipperz.PM.UI.Common.Components.BaseComponent_modalDialog);
|
||||
108
frontend/gamma/js/Clipperz/PM/UI/Common/Components/Button.js
Normal file
108
frontend/gamma/js/Clipperz/PM/UI/Common/Components/Button.js
Normal file
@@ -0,0 +1,108 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
Clipperz.Base.module('Clipperz.PM.UI.Common.Components');
|
||||
|
||||
Clipperz.PM.UI.Common.Components.Button = function(args) {
|
||||
args = args || {};
|
||||
|
||||
Clipperz.PM.UI.Common.Components.Button.superclass.constructor.apply(this, arguments);
|
||||
|
||||
this._element = args.element || Clipperz.Base.exception.raise('MandatoryParameter');
|
||||
this._text = args.text || Clipperz.Base.exception.raise('MandatoryParameter');
|
||||
this._isDefault = args.isDefault || false;
|
||||
|
||||
this.render();
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
|
||||
Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.Button, Clipperz.PM.UI.Common.Components.BaseComponent, {
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'toString': function () {
|
||||
return "Clipperz.PM.UI.Common.Components.Button component";
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'text': function () {
|
||||
return this._text;
|
||||
},
|
||||
|
||||
'isDefault': function () {
|
||||
return this._isDefault;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'renderSelf': function () {
|
||||
this.append(this.element(), {tag:'div', id:this.getId('wrapper'), cls:'button_wrapper', children:[
|
||||
{tag:'div', id:this.getId('bodyWrapper'), cls:'button_bodyWrapper', children:[
|
||||
{tag:'div', id:this.getId('body'), cls:'button_body', children:[
|
||||
{tag:'span', html:this.text()}
|
||||
]},
|
||||
{tag:'div', id:this.getId('footer'), cls:'button_footer'}
|
||||
]}
|
||||
]});
|
||||
|
||||
if (this.isDefault()) {
|
||||
MochiKit.DOM.addElementClass(this.getId('wrapper'), 'default');
|
||||
}
|
||||
|
||||
MochiKit.Signal.connect(this.getId('wrapper'), 'onmouseenter', this, 'handleOnMouseEnter');
|
||||
MochiKit.Signal.connect(this.getId('wrapper'), 'onmouseleave', this, 'handleOnMouseLeave');
|
||||
MochiKit.Signal.connect(this.getId('wrapper'), 'onmousedown', this, 'handleOnMouseDown');
|
||||
MochiKit.Signal.connect(this.getId('wrapper'), 'onclick', this, 'handleOnClick');
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'handleOnMouseEnter': function (anEvent) {
|
||||
MochiKit.DOM.addElementClass(this.getId('wrapper'), 'hover');
|
||||
},
|
||||
|
||||
'handleOnMouseLeave': function (anEvent) {
|
||||
MochiKit.DOM.removeElementClass(this.getId('wrapper'), 'hover');
|
||||
MochiKit.DOM.removeElementClass(this.getId('wrapper'), 'clicked');
|
||||
},
|
||||
|
||||
'handleOnMouseDown': function (anEvent) {
|
||||
MochiKit.DOM.addElementClass(this.getId('wrapper'), 'clicked');
|
||||
},
|
||||
|
||||
'handleOnClick': function (anEvent) {
|
||||
MochiKit.Signal.signal(this, 'onclick', anEvent);
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
__syntaxFix__: "syntax fix"
|
||||
});
|
||||
@@ -0,0 +1,64 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
Clipperz.Base.module('Clipperz.PM.UI.Common.Components');
|
||||
|
||||
//#############################################################################
|
||||
|
||||
|
||||
Clipperz.PM.UI.Common.Components.ComponentSlot = function(aComponent, aSlotName) {
|
||||
this._component = aComponent;
|
||||
this._slotName = aSlotName;
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
|
||||
Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.ComponentSlot, Object, {
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'slotName': function() {
|
||||
return this._slotName;
|
||||
},
|
||||
|
||||
'component': function() {
|
||||
return this._component;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'setContent': function(aComponent) {
|
||||
this.component().setComponentForSlotNamed(aComponent, this.slotName());
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
__syntaxFix__: "syntax fix"
|
||||
|
||||
});
|
||||
@@ -0,0 +1,91 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
Clipperz.Base.module('Clipperz.PM.UI.Common.Components');
|
||||
|
||||
Clipperz.PM.UI.Common.Components.FaviconComponent = function(args) {
|
||||
args = args || {};
|
||||
|
||||
Clipperz.PM.UI.Common.Components.FaviconComponent.superclass.constructor.apply(this, arguments);
|
||||
|
||||
this.render();
|
||||
this.setSrc(args.src);
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
|
||||
Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.FaviconComponent, Clipperz.PM.UI.Common.Components.BaseComponent, {
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'toString': function () {
|
||||
return "Clipperz.PM.UI.Common.Components.FaviconComponent component";
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'src': function () {
|
||||
return this.element().src;
|
||||
},
|
||||
|
||||
'setSrc': function (aValue) {
|
||||
this.element().src = (aValue || Clipperz.PM.Strings.getValue('defaultFaviconUrl'));
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'clear': function () {},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'renderSelf': function () {
|
||||
MochiKit.Signal.connect(this.element(), 'onerror', this, 'setDefaultFavicon');
|
||||
MochiKit.Signal.connect(this.element(), 'onabort', this, 'setDefaultFavicon');
|
||||
MochiKit.Signal.connect(this.element(), 'onload', this, 'handleOnLoad');
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'setDefaultFavicon': function (anEvent) {
|
||||
MochiKit.Signal.disconnectAll(anEvent.src());
|
||||
this.setSrc(null);
|
||||
},
|
||||
|
||||
'handleOnLoad': function (anEvent) {
|
||||
MochiKit.Signal.disconnectAll(anEvent.src());
|
||||
//console.log("HANDLE ON LOAD", anEvent, anEvent.src().src);
|
||||
if (anEvent.src().complete == false) {
|
||||
this.setSrc(null);
|
||||
}
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
__syntaxFix__: "syntax fix"
|
||||
});
|
||||
@@ -0,0 +1,164 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
Clipperz.Base.module('Clipperz.PM.UI.Common.Components');
|
||||
|
||||
Clipperz.PM.UI.Common.Components.MessagePanelWithProgressBar = function(args) {
|
||||
args = args || {};
|
||||
|
||||
Clipperz.PM.UI.Common.Components.MessagePanelWithProgressBar.superclass.constructor.apply(this, arguments);
|
||||
|
||||
// this._openFromElement = args.openFromElement || null;
|
||||
this._onOkCloseToElement = args.onOkCloseToElement || null;
|
||||
this._onCancelCloseToElement = args.onCancelCloseToElement || null;
|
||||
|
||||
this._canCancelWhileProcessing = ((typeof(args.canCancelWhileProcessing) == 'undefined') ? true : args.canCancelWhileProcessing);
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
|
||||
Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.MessagePanelWithProgressBar, Clipperz.PM.UI.Common.Components.SimpleMessagePanel, {
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'toString': function () {
|
||||
return "Clipperz.PM.UI.Common.Components.MessagePanelWithProgressBar component";
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
/*
|
||||
'openFromElement': function () {
|
||||
return this._openFromElement;
|
||||
},
|
||||
*/
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'onOkCloseToElement': function () {
|
||||
return this._onOkCloseToElement;
|
||||
},
|
||||
|
||||
'setOnOkCloseToElement': function (anElement) {
|
||||
this._onOkCloseToElement = anElement;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'onCancelCloseToElement': function () {
|
||||
return this._onCancelCloseToElement;
|
||||
},
|
||||
|
||||
'setOnCancelCloseToElement': function (anElement) {
|
||||
this._onCancelCloseToElement = anElement;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'canCancelWhileProcessing': function () {
|
||||
return this._canCancelWhileProcessing;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'deferredShowModal': function (someArgs, aResult) {
|
||||
if (someArgs['onOkCloseToElement'] != null) {
|
||||
this.setOnOkCloseToElement(someArgs['onOkCloseToElement']);
|
||||
}
|
||||
|
||||
if (someArgs['onCancelCloseToElement'] != null) {
|
||||
this.setOnCancelCloseToElement(someArgs['onCancelCloseToElement']);
|
||||
}
|
||||
|
||||
Clipperz.PM.UI.Common.Components.MessagePanelWithProgressBar.superclass.deferredShowModal.apply(this, arguments);
|
||||
return this.deferred();
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'showProgressBar': function () {
|
||||
var progressBarElement;
|
||||
|
||||
this.getElement('container').innerHTML = '';
|
||||
|
||||
progressBarElement = this.append(this.getElement('container'), {tag:'div', cls:'progressBarWrapper'});
|
||||
this.addComponent(new Clipperz.PM.UI.Common.Components.ProgressBar({'element':progressBarElement}));
|
||||
|
||||
if (this.canCancelWhileProcessing() == true) {
|
||||
this.setButtons([{text:"Cancel", result:'CANCEL'}]);
|
||||
} else {
|
||||
this.setButtons([]);
|
||||
}
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'showFailure': function (someParameters) {
|
||||
// this.setType('ALERT');
|
||||
this.setType(someParameters['type']);
|
||||
// this.setTitle("Login failed");
|
||||
this.setTitle(someParameters['title']);
|
||||
// this.setText("Wrong passphrase; the unlock has failed.");
|
||||
this.setText(someParameters['text']);
|
||||
// this.getElement('container').innerHTML = '';
|
||||
this.getElement('container').innerHTML = '';
|
||||
// this.setButtons([{text:"Close", result:'CANCEL', isDefault:true}]);
|
||||
this.setButtons(someParameters['buttons']);
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'closeOk': function () {
|
||||
//console.log("=== closeOk");
|
||||
this.showProgressBar();
|
||||
MochiKit.Async.callLater(0.5, MochiKit.Base.method(this.deferred(), 'callback'));
|
||||
this._deferred = null;
|
||||
},
|
||||
|
||||
'closeCancel': function () {
|
||||
//console.log("=== closeCancel");
|
||||
this.deferredHideModal({closeToElement:this.onCancelCloseToElement()});
|
||||
this.deferred().cancel();
|
||||
this._deferred = null;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'deferredDone': function () {
|
||||
//console.log("=== deferredDone");
|
||||
return this.deferredHideModal({closeToElement:this.onOkCloseToElement()});
|
||||
},
|
||||
|
||||
'deferredError': function (someParameters) {
|
||||
//console.log("=== deferredError");
|
||||
this.showFailure(someParameters);
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
__syntaxFix__: "syntax fix"
|
||||
});
|
||||
@@ -0,0 +1,140 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
Clipperz.Base.module('Clipperz.PM.UI.Common.Components');
|
||||
|
||||
Clipperz.PM.UI.Common.Components.PasswordEntropyDisplay = function(anElement, args) {
|
||||
args = args || {};
|
||||
|
||||
//MochiKit.Logging.logDebug(">>> new TextFormField");
|
||||
Clipperz.PM.UI.Common.Components.PasswordEntropyDisplay.superclass.constructor.call(this, anElement, args);
|
||||
|
||||
this._wrapperElement = null;
|
||||
this._entropyElement = null;
|
||||
|
||||
this.render();
|
||||
//MochiKit.Logging.logDebug("<<< new TextFormField");
|
||||
|
||||
return this;
|
||||
};
|
||||
|
||||
Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.PasswordEntropyDisplay, Clipperz.PM.UI.Common.Components.BaseComponent, {
|
||||
|
||||
'toString': function() {
|
||||
return "Clipperz.PM.UI.Common.Components.PasswordEntropyDisplay";
|
||||
},
|
||||
|
||||
//-----------------------------------------------------
|
||||
|
||||
'wrapperElement': function() {
|
||||
return this._wrapperElement;
|
||||
},
|
||||
|
||||
'setWrapperElement': function(aValue) {
|
||||
this._wrapperElement = aValue;
|
||||
},
|
||||
|
||||
//-----------------------------------------------------
|
||||
|
||||
'passwordElement': function() {
|
||||
return this.element();
|
||||
},
|
||||
|
||||
//-----------------------------------------------------
|
||||
|
||||
'entropyElement': function() {
|
||||
return this._entropyElement;
|
||||
},
|
||||
|
||||
'setEntropyElement': function(aValue) {
|
||||
this._entropyElement = aValue;
|
||||
},
|
||||
|
||||
//-----------------------------------------------------
|
||||
|
||||
'render': function() {
|
||||
/*
|
||||
MochiKit.Signal.disconnectAllTo(this);
|
||||
|
||||
this.setWrapperElement(this.element().wrap({tag:'div'}));
|
||||
this.setEntropyElement(Clipperz.DOM.Helper.append(this.wrapperElement().dom, {tag:'div', cls:'passwordEntropy', html:" "}, true));
|
||||
// this.setEntropyElement(Clipperz.DOM.Helper.insertBefore(this.element(), {tag:'div', cls:'passwordEntropy', html:" "}, true));
|
||||
this.entropyElement().wrap({tag:'div', cls:'passwordEntropyWrapper'});
|
||||
|
||||
this.updateEntropyElement();
|
||||
|
||||
this.connect('onkeyup', 'updateEntropyElement');
|
||||
this.connect('onchange', 'updateEntropyElement');
|
||||
this.connect('onblur', 'updateEntropyElement');
|
||||
*/
|
||||
MochiKit.Signal.disconnectAllTo(this);
|
||||
|
||||
this.setEntropyElement(this.element());
|
||||
this.entropyElement().addClass("entropyLevelIndicator");
|
||||
|
||||
this.updateEntropyElement();
|
||||
|
||||
this.connect('onkeyup', 'updateEntropyElement');
|
||||
this.connect('onchange', 'updateEntropyElement');
|
||||
this.connect('onblur', 'updateEntropyElement');
|
||||
},
|
||||
|
||||
//-----------------------------------------------------
|
||||
|
||||
'computeEntropyForString': function(aValue) {
|
||||
return Clipperz.PM.Crypto.passwordEntropy(aValue);
|
||||
},
|
||||
|
||||
//-----------------------------------------------------
|
||||
|
||||
'updateEntropyElement': function(anEvent) {
|
||||
/*
|
||||
//MochiKit.Logging.logDebug(">>> PasswordEntropyDisplay.updateEntropyElement");
|
||||
var maxExtent;
|
||||
var entropy;
|
||||
|
||||
entropy = Math.min(128, this.computeEntropyForString(this.passwordElement().dom.value));
|
||||
//MochiKit.Logging.logDebug("--- PasswordEntropyDisplay.updateEntropyElement - entropy: " + entropy);
|
||||
this.entropyElement().setStyle('background-position', "0px " + -entropy + "px");
|
||||
this.entropyElement().setWidth(this.passwordElement().getWidth() * (entropy/128));
|
||||
//MochiKit.Logging.logDebug("<<< PasswordEntropyDisplay.updateEntropyElement");
|
||||
*/
|
||||
var entropy;
|
||||
|
||||
entropy = Math.min(128, this.computeEntropyForString(this.passwordElement().dom.value));
|
||||
|
||||
if (entropy == 0) {
|
||||
this.entropyElement().setStyle('background-position', "0px 26px");
|
||||
} else {
|
||||
this.entropyElement().setStyle('background-position', "0px -" + (128-entropy)*26 + "px");
|
||||
}
|
||||
},
|
||||
|
||||
//-----------------------------------------------------
|
||||
__syntaxFix__: '__syntaxFix__'
|
||||
});
|
||||
@@ -0,0 +1,73 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
Clipperz.Base.module('Clipperz.PM.UI.Common.Components');
|
||||
|
||||
Clipperz.PM.UI.Common.Components.ProgressBar = function(args) {
|
||||
args = args || {};
|
||||
|
||||
Clipperz.PM.UI.Common.Components.ProgressBar.superclass.constructor.apply(this, arguments);
|
||||
|
||||
this._element = args.element || Clipperz.Base.exception.raise('MandatoryParameter');
|
||||
|
||||
this.renderSelf();
|
||||
|
||||
MochiKit.Signal.connect(Clipperz.PM.UI.Common.Controllers.ProgressBarController.defaultController, 'updateProgress', this, 'updateProgressHandler')
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
|
||||
Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.ProgressBar, Clipperz.PM.UI.Common.Components.BaseComponent, {
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'toString': function () {
|
||||
return "Clipperz.PM.UI.Common.Components.ProgressBar component";
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'renderSelf': function() {
|
||||
this.append(this.element(), {tag:'div', cls:'loadingBar', children:[
|
||||
{tag:'div', cls:'loadingBarProgressBox', children:[
|
||||
{tag:'div', id:this.getId('loadingBarProgress'), cls:'loadingBarProgress'}
|
||||
]}
|
||||
]});
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'updateProgressHandler': function (anEvent) {
|
||||
MochiKit.Style.setElementDimensions(this.getId('loadingBarProgress'), {w:anEvent}, '%');
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
__syntaxFix__: "syntax fix"
|
||||
});
|
||||
@@ -0,0 +1,282 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
|
||||
|
||||
Clipperz.PM.UI.Common.Components.SimpleMessagePanel = function(args) {
|
||||
args = args || {};
|
||||
|
||||
Clipperz.PM.UI.Common.Components.SimpleMessagePanel.superclass.constructor.apply(this, arguments);
|
||||
|
||||
this._title = args.title || Clipperz.Base.exception.raise('MandatoryParameter');
|
||||
this._text = args.text || Clipperz.Base.exception.raise('MandatoryParameter');
|
||||
this._type = args.type || Clipperz.Base.exception.raise('MandatoryParameter'); // ALERT, INFO, ERROR
|
||||
this._buttons = args.buttons || Clipperz.Base.exception.raise('MandatoryParameter');
|
||||
|
||||
this._buttonComponents = [];
|
||||
this._deferred = null;
|
||||
|
||||
this.renderModalMask();
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
|
||||
Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.SimpleMessagePanel, Clipperz.PM.UI.Common.Components.BaseComponent, {
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'toString': function () {
|
||||
return "Clipperz.PM.UI.Common.Components.SimpleMessagePanel component";
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'deferred': function() {
|
||||
if (this._deferred == null) {
|
||||
this._deferred = new Clipperz.Async.Deferred("SimpleMessagePanel.deferred", {trace:false});
|
||||
}
|
||||
|
||||
return this._deferred;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'title': function () {
|
||||
return this._title;
|
||||
},
|
||||
|
||||
'setTitle': function (aValue) {
|
||||
this._title = aValue;
|
||||
|
||||
if (this.getElement('title') != null) {
|
||||
this.getElement('title').innerHTML = aValue;
|
||||
}
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'text': function () {
|
||||
return this._text;
|
||||
},
|
||||
|
||||
'setText': function (aValue) {
|
||||
this._text = aValue;
|
||||
|
||||
if (this.getElement('text') != null) {
|
||||
this.getElement('text').innerHTML = aValue;
|
||||
}
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'type': function () {
|
||||
return this._type;
|
||||
},
|
||||
|
||||
'setType': function (aValue) {
|
||||
if (this.getElement('icon') != null) {
|
||||
MochiKit.DOM.removeElementClass(this.getId('icon'), this._type);
|
||||
MochiKit.DOM.addElementClass(this.getId('icon'), aValue);
|
||||
}
|
||||
|
||||
this._type = aValue;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'buttons': function () {
|
||||
return this._buttons;
|
||||
},
|
||||
|
||||
'setButtons': function (someValues) {
|
||||
MochiKit.Iter.forEach(this.buttonComponents(), MochiKit.Base.methodcaller('clear'));
|
||||
|
||||
this._buttons = someValues;
|
||||
|
||||
if (this.getElement('buttonArea') != null) {
|
||||
this.renderButtons();
|
||||
}
|
||||
},
|
||||
|
||||
//.........................................................................
|
||||
|
||||
'buttonComponents': function () {
|
||||
return this._buttonComponents;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'renderSelf': function() {
|
||||
this.append(this.element(), {tag:'div', cls:'SimpleMessagePanel', id:this.getId('panel'), children: [
|
||||
{tag:'div', cls:'header', children:[]},
|
||||
{tag:'div', cls:'body', children:[
|
||||
{tag:'div', id:this.getId('icon'), cls:'img ' + this.type(), children:[{tag:'div'}]},
|
||||
{tag:'h3', id:this.getId('title'), html:this.title()},
|
||||
{tag:'p', id:this.getId('text'), html:this.text()},
|
||||
{tag:'div', id:this.getId('container')},
|
||||
{tag:'div', id:this.getId('buttonArea'), cls:'buttonArea', children:[]}
|
||||
]},
|
||||
{tag:'div', cls:'footer', children:[]}
|
||||
]});
|
||||
|
||||
MochiKit.Signal.connect(this.getId('panel'), 'onkeydown', this, 'keyDownHandler');
|
||||
|
||||
this.renderButtons();
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'renderButtons': function () {
|
||||
this.getElement('buttonArea').innerHTML = '';
|
||||
|
||||
MochiKit.Base.map(MochiKit.Base.bind(function (aButton) {
|
||||
var buttonElement;
|
||||
var buttonComponent;
|
||||
|
||||
// element = this.append(this.getElement('buttonArea'), {tag:'div', cls:'button' + (aButton['isDefault'] === true ? ' default' : ''), children:[
|
||||
// {tag:'a', href:'#'/*, id:this.getId('buttonLink')*/, html:aButton['text']}
|
||||
// ]});
|
||||
|
||||
buttonElement = this.append(this.getElement('buttonArea'), {tag:'div'});
|
||||
buttonComponent = new Clipperz.PM.UI.Common.Components.Button({'element':buttonElement, 'text':aButton['text'], 'isDefault':aButton['isDefault']});
|
||||
this.buttonComponents().push(buttonComponent);
|
||||
|
||||
MochiKit.Signal.connect(buttonComponent, 'onclick', MochiKit.Base.method(this, 'buttonEventHandler', aButton));
|
||||
}, this), MochiKit.Iter.reversed(this.buttons()));
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'displayElement': function() {
|
||||
return this.getElement('panel');
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'closeOk': function () {
|
||||
this.deferred().callback();
|
||||
this._deferred = null;
|
||||
},
|
||||
|
||||
'closeCancel': function () {
|
||||
this.deferred().cancel();
|
||||
this._deferred = null;
|
||||
},
|
||||
|
||||
'closeError': function () {
|
||||
this.deferred().errback();
|
||||
this._deferred = null;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'buttonEventHandler': function(aButton, anEvent) {
|
||||
anEvent.preventDefault();
|
||||
|
||||
// MochiKit.Signal.signal(this, 'cancelEvent');
|
||||
switch (aButton['result']) {
|
||||
case 'OK':
|
||||
//console.log("==> OK");
|
||||
this.closeOk();
|
||||
break;
|
||||
case 'CANCEL':
|
||||
//console.log("==> CANCEL");
|
||||
this.closeCancel();
|
||||
break;
|
||||
default:
|
||||
//console.log("==> ????");
|
||||
this.closeError();
|
||||
break;
|
||||
}
|
||||
//console.log("<==");
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'deferredShow': function (someArgs, aResult) {
|
||||
this.deferredShowModal(someArgs);
|
||||
|
||||
this.deferred().addMethod(this, 'deferredHideModal', {closeToElement:someArgs.onOkCloseToElement });
|
||||
this.deferred().addErrback (MochiKit.Base.method(this, 'deferredHideModal', {closeToElement:someArgs.onCancelCloseToElement }));
|
||||
this.deferred().addCallback(MochiKit.Async.succeed, aResult);
|
||||
|
||||
return this.deferred();
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'modalDialogMask': function () {
|
||||
return this.getId('modalDialogMask');
|
||||
},
|
||||
|
||||
'modalDialog': function () {
|
||||
return this.getId('modalDialog');
|
||||
},
|
||||
|
||||
'modalDialogFrame': function() {
|
||||
return this.getId('modalDialogFrame');
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'renderModalMask': function () {
|
||||
Clipperz.DOM.Helper.append(MochiKit.DOM.currentDocument().body,
|
||||
{tag:'div', id:this.getId('modalDialogWrapper'), cls:'modalDialogWrapper simpleMessagePanelMask', children:[
|
||||
{tag:'div', id:this.getId('modalDialogMask'), cls:'modalDialogMask simpleMessagePanelMask'},
|
||||
{tag:'div', id:this.getId('modalDialogFrame'), cls:'modalDialogFrame simpleMessagePanelMask'},
|
||||
{tag:'div', id:this.getId('modalDialog'), cls:'modalDialog simpleMessagePanelMask'}
|
||||
]}
|
||||
);
|
||||
|
||||
MochiKit.Style.hideElement(this.getId('modalDialogMask'));
|
||||
MochiKit.Style.hideElement(this.getId('modalDialogFrame'));
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'keyDownHandler': function (anEvent) {
|
||||
if (anEvent.key().string == 'KEY_ENTER') {
|
||||
anEvent.preventDefault();
|
||||
//console.log("13 - RETURN ?", this);
|
||||
this.closeOk();
|
||||
//console.log('<<< 13')
|
||||
}
|
||||
|
||||
if (anEvent.key().string == 'KEY_ESCAPE') {
|
||||
anEvent.preventDefault();
|
||||
//console.log("27 - ESC ?", this);
|
||||
this.closeCancel();
|
||||
//console.log("<<< 27");
|
||||
}
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
__syntaxFix__: "syntax fix"
|
||||
});
|
||||
@@ -0,0 +1,69 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
Clipperz.Base.module('Clipperz.PM.UI.Common.Components');
|
||||
|
||||
Clipperz.PM.UI.Common.Components.TabPanelComponent = function(args) {
|
||||
args = args || {};
|
||||
Clipperz.PM.UI.Common.Components.TabPanelComponent.superclass.constructor.call(this, args);
|
||||
|
||||
this._tabPanelController = null;
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
|
||||
Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.TabPanelComponent, Clipperz.PM.UI.Common.Components.BaseComponent, {
|
||||
|
||||
'toString': function () {
|
||||
return "Clipperz.PM.UI.Common.Components.TabPanelComponent component";
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'tabPanelControllerConfiguration': function() {
|
||||
return this._tabPanelControllerConfiguration;
|
||||
},
|
||||
|
||||
'tabPanelController': function() {
|
||||
if (this._tabPanelController == null) {
|
||||
this._tabPanelController = new Clipperz.PM.UI.Common.Controllers.TabPanelController({component:this, configuration:this.tabPanelControllerConfiguration()});
|
||||
}
|
||||
|
||||
return this._tabPanelController;
|
||||
},
|
||||
|
||||
'initiallySelectedTab': function() {
|
||||
return this._initiallySelectedTab;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
__syntaxFix__: "syntax fix"
|
||||
|
||||
});
|
||||
216
frontend/gamma/js/Clipperz/PM/UI/Common/Components/Tooltip.js
Normal file
216
frontend/gamma/js/Clipperz/PM/UI/Common/Components/Tooltip.js
Normal file
@@ -0,0 +1,216 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
Clipperz.Base.module('Clipperz.PM.UI.Common.Components');
|
||||
|
||||
Clipperz.PM.UI.Common.Components.Tooltip = function(args) {
|
||||
args = args || {};
|
||||
|
||||
Clipperz.PM.UI.Common.Components.Tooltip.superclass.constructor.apply(this, arguments);
|
||||
|
||||
this._element = args.element || Clipperz.Base.exception.raise('MandatoryParameter');
|
||||
this._text = args.text || Clipperz.Base.exception.raise('MandatoryParameter');
|
||||
this._position = args.position || 'BELOW'; // 'BELOW', 'ABOVE', 'LEFT', 'RIGHT'
|
||||
|
||||
this._boxDimensions = null;
|
||||
this._enabled = (typeof(args.enabled) == 'undefined' ? true : args.enabled);
|
||||
this._isVisible = false;
|
||||
|
||||
this.renderSelf();
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
|
||||
Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.Tooltip, Clipperz.PM.UI.Common.Components.BaseComponent, {
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'toString': function () {
|
||||
return "Clipperz.PM.UI.Common.Components.Tooltip component";
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'text': function () {
|
||||
return this._text;
|
||||
},
|
||||
|
||||
'setText': function (aValue) {
|
||||
this._text = aValue;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'position': function () {
|
||||
return this._position;
|
||||
},
|
||||
|
||||
'setPosition': function (aValue) {
|
||||
this._position = aValue;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'enabled': function () {
|
||||
return this._enabled;
|
||||
},
|
||||
|
||||
'setIsEnabled': function (aValue) {
|
||||
this._enabled = aValue;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'isVisible': function () {
|
||||
return this._isVisible;
|
||||
},
|
||||
|
||||
'setIsVisible': function (aValue) {
|
||||
this._isVisible = aValue;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'renderSelf': function() {
|
||||
// this.append(this.element(), {tag:'div', id:this.getId('tooltip'), cls:'tooltip ' + this.position(), children:[
|
||||
// this.append(MochiKit.DOM.currentDocument().body, {tag:'div', id:this.getId('tooltip'), cls:'tooltip ' + this.position(), children:[
|
||||
this.append(MochiKit.DOM.getElement('Clipperz_PM_UI_Common_Components_Tooltip_wrapperNode'), {tag:'div', id:this.getId('tooltip'), cls:'tooltip ' + this.position(), children:[
|
||||
{tag:'div', id:this.getId('body'), cls:'tooltip_body', children:[
|
||||
{tag:'div', cls:'tooltip_text', children:[
|
||||
{tag:'span', html:this.text()}
|
||||
]},
|
||||
{tag:'div', id:this.getId('footer'), cls:'tooltip_footer'}
|
||||
]},
|
||||
{tag:'div', id:this.getId('arrow'), cls:'tooltip_arrow'}
|
||||
]});
|
||||
|
||||
this._boxDimensions = MochiKit.Style.getElementDimensions(this.getId('body'));
|
||||
// this._boxDimensions.h += MochiKit.Style.getElementDimensions(this.getId('footer')).h;
|
||||
|
||||
MochiKit.Style.hideElement(this.displayElement());
|
||||
MochiKit.Signal.connect(this.element(), 'onmouseenter', this, 'show');
|
||||
MochiKit.Signal.connect(this.element(), 'onmouseleave', this, 'hide');
|
||||
},
|
||||
|
||||
//-----------------------------------------------------
|
||||
|
||||
'displayElement': function() {
|
||||
return this.getElement('tooltip');
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'boxDimensions': function () {
|
||||
return this._boxDimensions;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'show': function () {
|
||||
var elementSizeAndPosition;
|
||||
var arrowPosition;
|
||||
var bodyPosition;
|
||||
|
||||
if (this.isVisible() == false) {
|
||||
arrowPosition = {};
|
||||
bodyPosition = {};
|
||||
|
||||
this.setIsVisible(true);
|
||||
elementSizeAndPosition = Clipperz.Style.getSizeAndPosition(this.element());
|
||||
//console.log("ELEMENT SIZE AND POSITION", Clipperz.Base.serializeJSON(elementSizeAndPosition));
|
||||
//console.log("BOX DIMENSIONS", Clipperz.Base.serializeJSON(this.boxDimensions()));
|
||||
switch (this.position()) {
|
||||
case 'ABOVE':
|
||||
//console.log("ABOVE");
|
||||
MochiKit.Style.setElementDimensions(this.getId('arrow'), {w:36, h:13}, 'px');
|
||||
bodyPosition.x = elementSizeAndPosition.position.x + (elementSizeAndPosition.dimensions.w/2 - this.boxDimensions().w/2);
|
||||
bodyPosition.y = elementSizeAndPosition.position.y - this.boxDimensions().h - 13;
|
||||
|
||||
arrowPosition.x = elementSizeAndPosition.position.x + (elementSizeAndPosition.dimensions.w/2 - 36/2);
|
||||
arrowPosition.y = elementSizeAndPosition.position.y - 13;
|
||||
break;
|
||||
case 'BELOW':
|
||||
//console.log("BELOW");
|
||||
MochiKit.Style.setElementDimensions(this.getId('arrow'), {w:36, h:13}, 'px');
|
||||
bodyPosition.x = elementSizeAndPosition.position.x + (elementSizeAndPosition.dimensions.w/2 - this.boxDimensions().w/2);
|
||||
bodyPosition.y = elementSizeAndPosition.position.y + elementSizeAndPosition.dimensions.h + 13;
|
||||
|
||||
arrowPosition.x = elementSizeAndPosition.position.x + (elementSizeAndPosition.dimensions.w/2 - 36/2);
|
||||
arrowPosition.y = elementSizeAndPosition.position.y + elementSizeAndPosition.dimensions.h;
|
||||
break;
|
||||
case 'LEFT':
|
||||
//console.log("LEFT");
|
||||
MochiKit.Style.setElementDimensions(this.getId('arrow'), {w:13, h:36}, 'px');
|
||||
bodyPosition.x = elementSizeAndPosition.position.x - this.boxDimensions().w - 13;
|
||||
bodyPosition.y = elementSizeAndPosition.position.y + (elementSizeAndPosition.dimensions.h/2 - this.boxDimensions().h/2);
|
||||
|
||||
arrowPosition.x = elementSizeAndPosition.position.x -13;
|
||||
arrowPosition.y = elementSizeAndPosition.position.y + (elementSizeAndPosition.dimensions.h/2 - 36/2);
|
||||
break;
|
||||
case 'RIGHT':
|
||||
//console.log("RIGHT");
|
||||
MochiKit.Style.setElementDimensions(this.getId('arrow'), {w:13, h:36}, 'px');
|
||||
bodyPosition.x = elementSizeAndPosition.position.x + elementSizeAndPosition.dimensions.w + 13;
|
||||
bodyPosition.y = elementSizeAndPosition.position.y + (elementSizeAndPosition.dimensions.h/2 - this.boxDimensions().h/2);
|
||||
|
||||
arrowPosition.x = elementSizeAndPosition.position.x + elementSizeAndPosition.dimensions.w;
|
||||
arrowPosition.y = elementSizeAndPosition.position.y + (elementSizeAndPosition.dimensions.h/2 - 36/2);
|
||||
break;
|
||||
}
|
||||
//console.log("X: " + bodyPosition.x + ", Y: " + bodyPosition.y);
|
||||
|
||||
MochiKit.Style.setElementPosition(this.getId('body'), bodyPosition);
|
||||
MochiKit.Style.setElementPosition(this.getId('arrow'), arrowPosition);
|
||||
MochiKit.Visual.appear(this.displayElement(), {duration:0.4});
|
||||
}
|
||||
},
|
||||
|
||||
'hide': function () {
|
||||
if (this.isVisible() == true) {
|
||||
MochiKit.Visual.fade(this.displayElement(), {duration:0.4});
|
||||
this.setIsVisible(false);
|
||||
}
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
/*
|
||||
'shouldRemoveElementWhenClearningUp': function () {
|
||||
return false;
|
||||
},
|
||||
*/
|
||||
//-------------------------------------------------------------------------
|
||||
__syntaxFix__: "syntax fix"
|
||||
});
|
||||
|
||||
Clipperz.PM.UI.Common.Components.Tooltip.initTooltips = function () {
|
||||
Clipperz.DOM.Helper.insertBefore(MochiKit.DOM.currentDocument().body.childNodes[0], {tag:'div', id:'Clipperz_PM_UI_Common_Components_Tooltip_wrapperNode'});
|
||||
}
|
||||
|
||||
MochiKit.DOM.addLoadEvent(Clipperz.PM.UI.Common.Components.Tooltip.initTooltips);
|
||||
@@ -0,0 +1,170 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
Clipperz.Base.module('Clipperz.PM.UI.Common.Components');
|
||||
|
||||
Clipperz.PM.UI.Common.Components.TranslatorWidget = function(args) {
|
||||
Clipperz.log(">>> TranslatorWidget.new");
|
||||
args = args || {};
|
||||
|
||||
Clipperz.PM.UI.Common.Components.TranslatorWidget.superclass.constructor.apply(this, arguments);
|
||||
|
||||
// this._element = args.element || Clipperz.Base.exception.raise('MandatoryParameter');
|
||||
// this._stringID = args.stringID || MochiKit.DOM.getNodeAttribute(this.element(), 'stringID') || Clipperz.Base.exception.raise('MandatoryParameter');
|
||||
|
||||
// MochiKit.Signal.connect(this.element(), 'onmouseenter', this, 'show');
|
||||
// MochiKit.Signal.connect(this.element(), 'onmouseleave', this, 'hide');
|
||||
|
||||
Clipperz.log("<<< TranslatorWidget.new");
|
||||
return this;
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
|
||||
Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.TranslatorWidget, Clipperz.PM.UI.Common.Components.BaseComponent, {
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'toString': function () {
|
||||
return "Clipperz.PM.UI.Common.Components.TranslatorWidget component";
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
/*
|
||||
'renderSelf': function() {
|
||||
this.append(this.element(), {tag:'div', id:this.getId('tooltip'), cls:'tooltip ' + this.position(), children:[
|
||||
{tag:'div', id:this.getId('body'), cls:'tooltip_body', children:[
|
||||
{tag:'div', cls:'tooltip_text', children:[
|
||||
{tag:'span', html:this.text()}
|
||||
]},
|
||||
{tag:'div', id:this.getId('footer'), cls:'tooltip_footer'}
|
||||
]},
|
||||
{tag:'div', id:this.getId('arrow'), cls:'tooltip_arrow'}
|
||||
]});
|
||||
|
||||
this._boxDimensions = MochiKit.Style.getElementDimensions(this.getId('body'));
|
||||
// this._boxDimensions.h += MochiKit.Style.getElementDimensions(this.getId('footer')).h;
|
||||
|
||||
MochiKit.Style.hideElement(this.displayElement());
|
||||
MochiKit.Signal.connect(this.element(), 'onmouseenter', this, 'show');
|
||||
MochiKit.Signal.connect(this.element(), 'onmouseleave', this, 'hide');
|
||||
},
|
||||
*/
|
||||
//-----------------------------------------------------
|
||||
/*
|
||||
'displayElement': function() {
|
||||
return this.getElement('tooltip');
|
||||
},
|
||||
*/
|
||||
//-------------------------------------------------------------------------
|
||||
/*
|
||||
'boxDimensions': function () {
|
||||
return this._boxDimensions;
|
||||
},
|
||||
*/
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'show': function (anElement, aStringID) {
|
||||
Clipperz.log(">>> Clipperz.PM.UI.Common.Components.TranslatorWidget.show: " + aStringID);
|
||||
/*
|
||||
var elementSizeAndPosition;
|
||||
var arrowPosition;
|
||||
var bodyPosition;
|
||||
|
||||
arrowPosition = {};
|
||||
bodyPosition = {};
|
||||
|
||||
elementSizeAndPosition = Clipperz.Style.getSizeAndPosition(this.element());
|
||||
switch (this.position()) {
|
||||
case 'ABOVE':
|
||||
MochiKit.Style.setElementDimensions(this.getId('arrow'), {w:36, h:13}, 'px');
|
||||
bodyPosition.x = elementSizeAndPosition.position.x + (elementSizeAndPosition.dimensions.w/2 - this.boxDimensions().w/2);
|
||||
bodyPosition.y = elementSizeAndPosition.position.y - this.boxDimensions().h - 13;
|
||||
|
||||
arrowPosition.x = elementSizeAndPosition.position.x + (elementSizeAndPosition.dimensions.w/2 - 36/2);
|
||||
arrowPosition.y = elementSizeAndPosition.position.y - 13;
|
||||
break;
|
||||
case 'BELOW':
|
||||
MochiKit.Style.setElementDimensions(this.getId('arrow'), {w:36, h:13}, 'px');
|
||||
bodyPosition.x = elementSizeAndPosition.position.x + (elementSizeAndPosition.dimensions.w/2 - this.boxDimensions().w/2);
|
||||
bodyPosition.y = elementSizeAndPosition.position.y + elementSizeAndPosition.dimensions.h + 13;
|
||||
|
||||
arrowPosition.x = elementSizeAndPosition.position.x + (elementSizeAndPosition.dimensions.w/2 - 36/2);
|
||||
arrowPosition.y = elementSizeAndPosition.position.y + elementSizeAndPosition.dimensions.h;
|
||||
break;
|
||||
case 'LEFT':
|
||||
MochiKit.Style.setElementDimensions(this.getId('arrow'), {w:13, h:36}, 'px');
|
||||
bodyPosition.x = elementSizeAndPosition.position.x - this.boxDimensions().w - 13;
|
||||
bodyPosition.y = elementSizeAndPosition.position.y + (elementSizeAndPosition.dimensions.h/2 - this.boxDimensions().h/2);
|
||||
|
||||
arrowPosition.x = elementSizeAndPosition.position.x -13;
|
||||
arrowPosition.y = elementSizeAndPosition.position.y + (elementSizeAndPosition.dimensions.h/2 - 36/2);
|
||||
break;
|
||||
case 'RIGHT':
|
||||
MochiKit.Style.setElementDimensions(this.getId('arrow'), {w:13, h:36}, 'px');
|
||||
break;
|
||||
}
|
||||
|
||||
// MochiKit.Style.setElementPosition(this.getId('body'), bodyPosition);
|
||||
MochiKit.Style.setElementPosition(this.getId('body'), bodyPosition);
|
||||
MochiKit.Style.setElementPosition(this.getId('arrow'), arrowPosition);
|
||||
MochiKit.Visual.appear(this.displayElement(), {duration:0.4});
|
||||
*/
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'hide': function () {
|
||||
Clipperz.log("<<< Clipperz.PM.UI.Common.Components.TranslatorWidget.hide");
|
||||
// MochiKit.Visual.fade(this.displayElement(), {duration:0.4});
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
__syntaxFix__: "syntax fix"
|
||||
});
|
||||
|
||||
//#############################################################################
|
||||
|
||||
Clipperz.PM.UI.Common.Components.TranslatorWidget._widget = null;
|
||||
|
||||
Clipperz.PM.UI.Common.Components.TranslatorWidget.widget = function () {
|
||||
if (Clipperz.PM.UI.Common.Components.TranslatorWidget._widget == null) {
|
||||
Clipperz.PM.UI.Common.Components.TranslatorWidget._widget = new Clipperz.PM.UI.Common.Components.TranslatorWidget();
|
||||
}
|
||||
|
||||
return Clipperz.PM.UI.Common.Components.TranslatorWidget._widget;
|
||||
}
|
||||
Clipperz.PM.UI.Common.Components.TranslatorWidget.show = function (anElement, aStringID) {
|
||||
Clipperz.PM.UI.Common.Components.TranslatorWidget.widget().show(anElement, aStringID);
|
||||
}
|
||||
|
||||
Clipperz.PM.UI.Common.Components.TranslatorWidget.hide = function () {
|
||||
Clipperz.PM.UI.Common.Components.TranslatorWidget.widget().hide();
|
||||
}
|
||||
|
||||
//#############################################################################
|
||||
@@ -0,0 +1,267 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
Clipperz.Base.module('Clipperz.PM.UI.Common.Controllers');
|
||||
|
||||
Clipperz.PM.UI.Common.Controllers.DirectLoginRunner = function(args) {
|
||||
this._directLogin = args['directLogin'] || Clipperz.Base.exception.raise('MandatoryParameter');
|
||||
this._target = Clipperz.PM.Crypto.randomKey();
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
MochiKit.Base.update(Clipperz.PM.UI.Common.Controllers.DirectLoginRunner.prototype, {
|
||||
|
||||
'toString': function() {
|
||||
return "Clipperz.PM.UI.Common.Controllers.DirectLoginRunner";
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
'directLogin': function () {
|
||||
return this._directLogin;
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
'target': function () {
|
||||
return this._target;
|
||||
},
|
||||
|
||||
//=============================================================================
|
||||
|
||||
'setWindowTitle': function (aWindow, aTitle) {
|
||||
aWindow.document.title = aTitle;
|
||||
},
|
||||
|
||||
'setWindowBody': function (aWindow, anHTML) {
|
||||
aWindow.document.body.innerHTML = anHTML;
|
||||
},
|
||||
|
||||
//=============================================================================
|
||||
|
||||
'initialWindowSetup': function (aWindow) {
|
||||
this.setWindowTitle(aWindow, "Loading Clipperz Direct Login");
|
||||
this.setWindowBody (aWindow, MochiKit.DOM.toHTML(MochiKit.DOM.H3("Loading Clipperz Direct Login ...")));
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
'updateWindowWithDirectLoginLabel': function (aWindow, aLabel) {
|
||||
var titleText;
|
||||
var bodyText;
|
||||
|
||||
titleText = "Loading '__label__' Direct Login".replace(/__label__/, aLabel)
|
||||
bodyText = "Loading '__label__' Direct Login... ".replace(/__label__/, aLabel)
|
||||
|
||||
this.setWindowTitle(aWindow, titleText);
|
||||
this.setWindowBody (aWindow, MochiKit.DOM.toHTML(MochiKit.DOM.H3(bodyText)));
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
'updateWindowWithHTMLContent': function (aWindow, anHtml) {
|
||||
this.setWindowBody(aWindow, anHtml);
|
||||
},
|
||||
|
||||
//=============================================================================
|
||||
|
||||
'submitLoginForm': function(aWindow, aSubmitFunction) {
|
||||
MochiKit.DOM.withWindow(aWindow, MochiKit.Base.bind(function () {
|
||||
var formElement;
|
||||
var submitButtons;
|
||||
|
||||
formElement = MochiKit.DOM.getElement('directLoginForm');
|
||||
|
||||
submitButtons = MochiKit.Base.filter(function(anInputElement) {
|
||||
return ((anInputElement.tagName.toLowerCase() == 'input') && (anInputElement.getAttribute('type').toLowerCase() == 'submit'));
|
||||
}, formElement.elements);
|
||||
|
||||
if (submitButtons.length == 0) {
|
||||
if (typeof(formElement.submit) == 'function') {
|
||||
formElement.submit();
|
||||
} else {
|
||||
aSubmitFunction.apply(formElement);
|
||||
}
|
||||
/*
|
||||
var formSubmitFunction;
|
||||
|
||||
formSubmitFunction = MochiKit.Base.method(formElement, 'submit');
|
||||
if (Clipperz_IEisBroken == true) {
|
||||
formElement.submit();
|
||||
} else {
|
||||
formSubmitFunction();
|
||||
}
|
||||
*/
|
||||
} else {
|
||||
submitButtons[0].click();
|
||||
}
|
||||
}, this));
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'runSubmitFormDirectLogin': function (aWindow, someAttributes) {
|
||||
var html;
|
||||
var formElement;
|
||||
var submitFunction;
|
||||
|
||||
formElement = MochiKit.DOM.FORM({
|
||||
'id':'directLoginForm',
|
||||
'method':someAttributes['formAttributes']['method'],
|
||||
'action':someAttributes['formAttributes']['action']
|
||||
});
|
||||
|
||||
submitFunction = formElement.submit;
|
||||
|
||||
MochiKit.DOM.appendChildNodes(formElement, MochiKit.Base.map(function (anInputAttributes) {
|
||||
return MochiKit.DOM.INPUT({'type':'hidden', 'name':anInputAttributes[0], 'value':anInputAttributes[1]});
|
||||
}, MochiKit.Base.items(someAttributes['inputValues'])));
|
||||
|
||||
html = '';
|
||||
html += '<h3>Loading ' + someAttributes['label'] + ' ...</h3>';
|
||||
html += MochiKit.DOM.appendChildNodes(MochiKit.DOM.DIV(), MochiKit.DOM.appendChildNodes(MochiKit.DOM.DIV({style:'display:none; visibility:hidden;'}), formElement)).innerHTML;
|
||||
|
||||
this.updateWindowWithHTMLContent(aWindow, html);
|
||||
this.submitLoginForm(aWindow, submitFunction);
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'runHttpAuthDirectLogin': function(aWindow, someAttributes) {
|
||||
var completeUrl;
|
||||
var url;
|
||||
|
||||
//console.log("runHttpAuthDirectLogin", someAttributes);
|
||||
url = someAttributes['inputValues']['url'];
|
||||
|
||||
if (/^https?\:\/\//.test(url) == false) {
|
||||
url = 'http://' + url;
|
||||
}
|
||||
|
||||
if (Clipperz_IEisBroken === true) {
|
||||
completeUrl = url;
|
||||
} else {
|
||||
var username;
|
||||
var password;
|
||||
|
||||
username = someAttributes['inputValues']['username'];
|
||||
password = someAttributes['inputValues']['password'];
|
||||
/(^https?\:\/\/)?(.*)/.test(url);
|
||||
|
||||
completeUrl = RegExp.$1 + username + ':' + password + '@' + RegExp.$2;
|
||||
}
|
||||
|
||||
window.open(completeUrl, this.target());
|
||||
},
|
||||
|
||||
//=============================================================================
|
||||
|
||||
'runDirectLogin': function (aWindow) {
|
||||
var deferredResult;
|
||||
|
||||
//console.log(">>> runDirectLogin");
|
||||
deferredResult = new Clipperz.Async.Deferred("DirectLoginRunner.openDirectLogin", {trace:false});
|
||||
deferredResult.addMethod(this, 'initialWindowSetup', aWindow);
|
||||
deferredResult.addMethod(this.directLogin(), 'label');
|
||||
deferredResult.addMethod(this, 'updateWindowWithDirectLoginLabel', aWindow);
|
||||
deferredResult.collectResults({
|
||||
'type': MochiKit.Base.method(this.directLogin(), 'type'),
|
||||
'label': MochiKit.Base.method(this.directLogin(), 'label'),
|
||||
'formAttributes': MochiKit.Base.method(this.directLogin(), 'formAttributes'),
|
||||
'inputValues': MochiKit.Base.method(this.directLogin(), 'inputValues')
|
||||
});
|
||||
//deferredResult.addCallback(function (aValue) { console.log("SOME ATTRIBUTES", aValue); return aValue; });
|
||||
deferredResult.addCallback(MochiKit.Base.bind(function (someAttributes) {
|
||||
//console.log("SOME ATTRIBUTES", someAttributes);
|
||||
switch (someAttributes['type']) {
|
||||
case 'http_auth':
|
||||
this.runHttpAuthDirectLogin(aWindow, someAttributes);
|
||||
break;
|
||||
case 'simple_url':
|
||||
this.runSimpleUrlDirectLogin(aWindow, someAttributes);
|
||||
break;
|
||||
default:
|
||||
this.runSubmitFormDirectLogin(aWindow, someAttributes);
|
||||
break;
|
||||
}
|
||||
}, this));
|
||||
deferredResult.callback();
|
||||
//console.log("<<< runDirectLogin");
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//=============================================================================
|
||||
|
||||
'run': function () {
|
||||
var newWindow;
|
||||
|
||||
newWindow = window.open(Clipperz.PM.Strings.getValue('directLoginJumpPageUrl'), this.target());
|
||||
|
||||
return this.runDirectLogin(newWindow);
|
||||
},
|
||||
|
||||
//=============================================================================
|
||||
|
||||
'test': function () {
|
||||
var iFrame;
|
||||
var newWindow;
|
||||
|
||||
iFrame = MochiKit.DOM.createDOM('iframe');
|
||||
MochiKit.DOM.appendChildNodes(MochiKit.DOM.currentDocument().body, iFrame);
|
||||
|
||||
newWindow = iFrame.contentWindow;
|
||||
|
||||
return this.runDirectLogin(newWindow);
|
||||
},
|
||||
|
||||
//=============================================================================
|
||||
__syntaxFix__: "syntax fix"
|
||||
});
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
Clipperz.PM.UI.Common.Controllers.DirectLoginRunner.openDirectLogin = function (aDirectLogin) {
|
||||
var runner;
|
||||
|
||||
runner = new Clipperz.PM.UI.Common.Controllers.DirectLoginRunner({directLogin:aDirectLogin});
|
||||
return runner.run();
|
||||
};
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
Clipperz.PM.UI.Common.Controllers.DirectLoginRunner.testDirectLogin = function (aDirectLogin) {
|
||||
var runner;
|
||||
|
||||
//console.log(">>>>>> TESTING DIRECT LOGIN");
|
||||
runner = new Clipperz.PM.UI.Common.Controllers.DirectLoginRunner({directLogin:aDirectLogin});
|
||||
return runner.test();
|
||||
};
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
@@ -0,0 +1,143 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
Clipperz.Base.module('Clipperz.PM.UI.Common.Controllers');
|
||||
|
||||
Clipperz.PM.UI.Common.Controllers.ProgressBarController = function(args) {
|
||||
args = args || {};
|
||||
|
||||
this._numberOfSteps = 0;
|
||||
this._currentStep = 0;
|
||||
|
||||
MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'initProgress', this, 'initProgressHandle');
|
||||
MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'updateProgress', this, 'updateProgressHandle');
|
||||
MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'advanceProgress', this, 'advanceProgressHandle');
|
||||
MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'progressDone', this, 'progressDoneHandle');
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
MochiKit.Base.update(Clipperz.PM.UI.Common.Controllers.ProgressBarController.prototype, {
|
||||
|
||||
'toString': function() {
|
||||
return "Clipperz.PM.UI.Common.Controllers.ProgressBarController";
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
'numberOfSteps': function() {
|
||||
return this._numberOfSteps;
|
||||
},
|
||||
|
||||
'setNumberOfSteps': function (aValue) {
|
||||
this._numberOfSteps = aValue;
|
||||
},
|
||||
|
||||
'updateNumberOfSteps': function (aValue) {
|
||||
this._numberOfSteps += aValue;
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
'currentStep': function() {
|
||||
return this._currentStep;
|
||||
},
|
||||
|
||||
'advanceCurrentStep': function () {
|
||||
this._currentStep ++;
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
'completedPercentage': function () {
|
||||
var result;
|
||||
//Clipperz.log(">>> completedPercentage" + this.currentStep() + "/" + this.numberOfSteps(), this.currentStep() / this.numberOfSteps());
|
||||
if (this.numberOfSteps() == 0) {
|
||||
result = 0;
|
||||
} else {
|
||||
result = (Math.min(100, 100 * (this.currentStep() / this.numberOfSteps())));
|
||||
}
|
||||
//Clipperz.log("<<< completedPercentage", result);
|
||||
return result;
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
'resetStatus': function () {
|
||||
this._numberOfSteps = 0;
|
||||
this._currentStep = 0;
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
'updateProgress': function () {
|
||||
//Clipperz.log(">>> updateProgress: " + this.completedPercentage() + "%");
|
||||
MochiKit.Signal.signal(this, 'updateProgress', this.completedPercentage());
|
||||
},
|
||||
|
||||
//=============================================================================
|
||||
|
||||
'initProgressHandle': function (anEvent) {
|
||||
//Clipperz.log(">>> initProgressHandle - steps: " + (anEvent != null ? anEvent['steps'] : 0));
|
||||
this.resetStatus();
|
||||
if (anEvent != null) {
|
||||
this.setNumberOfSteps(anEvent['steps']);
|
||||
}
|
||||
MochiKit.Signal.signal(this, 'initProgress');
|
||||
this.updateProgress();
|
||||
},
|
||||
|
||||
//.............................................................................
|
||||
|
||||
'updateProgressHandle': function (anEvent) {
|
||||
this.updateNumberOfSteps(anEvent['extraSteps']);
|
||||
//Clipperz.log("=== updateProgressHandle - steps: " + this.numberOfSteps() + " (extra " + anEvent['extraSteps'] + ")");
|
||||
this.updateProgress();
|
||||
},
|
||||
|
||||
//.............................................................................
|
||||
|
||||
'advanceProgressHandle': function (anEvent) {
|
||||
this.advanceCurrentStep();
|
||||
//Clipperz.log("--- advanceProgressHandle: " + this.currentStep() + "/" + this.numberOfSteps());
|
||||
this.updateProgress();
|
||||
},
|
||||
|
||||
//.............................................................................
|
||||
|
||||
'progressDoneHandle': function (anEvent) {
|
||||
//Clipperz.log("<<< progressDoneHandle: " + this.currentStep() + "/" + this.numberOfSteps());
|
||||
this.resetStatus();
|
||||
MochiKit.Signal.signal(this, 'progressDone');
|
||||
},
|
||||
|
||||
//=============================================================================
|
||||
__syntaxFix__: "syntax fix"
|
||||
});
|
||||
|
||||
Clipperz.PM.UI.Common.Controllers.ProgressBarController.defaultController = new Clipperz.PM.UI.Common.Controllers.ProgressBarController();
|
||||
@@ -0,0 +1,188 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
Clipperz.Base.module('Clipperz.PM.UI.Common.Controllers');
|
||||
|
||||
Clipperz.PM.UI.Common.Controllers.TabPanelController = function(args) {
|
||||
args = args || {};
|
||||
|
||||
this._component = args.component;
|
||||
this._configuration = args.configuration;
|
||||
this._isEnabled = args.enabled || true;
|
||||
|
||||
this._selectedTab = null;
|
||||
return this;
|
||||
}
|
||||
|
||||
MochiKit.Base.update(Clipperz.PM.UI.Common.Controllers.TabPanelController.prototype, {
|
||||
|
||||
'toString': function() {
|
||||
return "Clipperz.PM.UI.Common.Controllers.TabPanelController";
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
'component': function() {
|
||||
return this._component;
|
||||
},
|
||||
|
||||
'configuration': function() {
|
||||
return this._configuration;
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
'getElement': function(anElementID) {
|
||||
return this.component().getElement(anElementID);
|
||||
},
|
||||
|
||||
'tabForTabElement': function(anElement) {
|
||||
var result;
|
||||
|
||||
for (result in this.configuration()) {
|
||||
if (this.getElement(this.configuration()[result]['tab']) == anElement) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
'setupTab': function(aConfiguration) {
|
||||
var tabElement;
|
||||
|
||||
tabElement = this.getElement(aConfiguration['tab']);
|
||||
|
||||
MochiKit.DOM.removeElementClass(tabElement, 'selected');
|
||||
MochiKit.Signal.connect(tabElement, 'onclick', this, 'handleTabClick')
|
||||
},
|
||||
|
||||
'setupPanel': function(aConfiguration) {
|
||||
this.hidePanel(aConfiguration['panel']);
|
||||
},
|
||||
|
||||
'setup': function(args) {
|
||||
args = args || {};
|
||||
|
||||
MochiKit.Base.map(MochiKit.Base.method(this, 'setupTab'), MochiKit.Base.values(this.configuration()));
|
||||
MochiKit.Base.map(MochiKit.Base.method(this, 'setupPanel'), MochiKit.Base.values(this.configuration()));
|
||||
this.selectTab(args.selected);
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
'hidePanel': function(aPanel) {
|
||||
MochiKit.DOM.removeElementClass(this.getElement(aPanel), 'selected');
|
||||
},
|
||||
|
||||
'selectTab': function(aTab) {
|
||||
if ((aTab != this.selectedTab()) && (this.isEnabled())) {
|
||||
if (this.selectedTab() != null) {
|
||||
MochiKit.DOM.removeElementClass(this.getElement(this.configuration()[this.selectedTab()]['tab']), 'selected');
|
||||
MochiKit.DOM.removeElementClass(this.getElement(this.configuration()[this.selectedTab()]['panel']), 'selected');
|
||||
}
|
||||
|
||||
if (aTab != null) {
|
||||
MochiKit.DOM.addElementClass(this.getElement(this.configuration()[aTab]['tab']), 'selected');
|
||||
MochiKit.DOM.addElementClass(this.getElement(this.configuration()[aTab]['panel']), 'selected');
|
||||
}
|
||||
|
||||
this.setSelectedTab(aTab);
|
||||
MochiKit.Signal.signal(this, 'tabSelected', aTab);
|
||||
}
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
'selectedTab': function() {
|
||||
return this._selectedTab;
|
||||
},
|
||||
|
||||
'setSelectedTab': function(aTab) {
|
||||
this._selectedTab = aTab;
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
'selectedTabElement': function() {
|
||||
var result;
|
||||
|
||||
if (this.selectedTab() != null) {
|
||||
result = this.getElement(this.configuration()[this.selectedTab()]['tab']);
|
||||
} else {
|
||||
result = null;
|
||||
}
|
||||
|
||||
return null;
|
||||
},
|
||||
|
||||
'selectedTabPanelElement': function() {
|
||||
var result;
|
||||
|
||||
if (this.selectedTab() != null) {
|
||||
result = this.getElement(this.configuration()[this.selectedTab()]['panel']);
|
||||
} else {
|
||||
result = null;
|
||||
}
|
||||
|
||||
return result;
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
'handleTabClick': function(anEvent) {
|
||||
this.selectTab(this.tabForTabElement(anEvent.src()));
|
||||
anEvent.preventDefault();
|
||||
},
|
||||
|
||||
//=============================================================================
|
||||
|
||||
'isEnabled': function () {
|
||||
return this._isEnabled;
|
||||
},
|
||||
|
||||
'enable': function () {
|
||||
this._isEnabled = true;
|
||||
MochiKit.Base.map(MochiKit.Base.bind(function (aTabComponentID) {
|
||||
MochiKit.DOM.removeElementClass(this.getElement(this.configuration()[aTabComponentID]['tab']), 'disabled');
|
||||
}, this), MochiKit.Base.keys(this.configuration()));
|
||||
},
|
||||
|
||||
'disable': function () {
|
||||
this._isEnabled = false;
|
||||
MochiKit.Base.map(MochiKit.Base.bind(function (aTabComponentID) {
|
||||
MochiKit.DOM.addElementClass(this.getElement(this.configuration()[aTabComponentID]['tab']), 'disabled');
|
||||
}, this), MochiKit.Base.keys(this.configuration()));
|
||||
},
|
||||
|
||||
//=============================================================================
|
||||
|
||||
__syntaxFix__: "syntax fix"
|
||||
});
|
||||
@@ -0,0 +1,31 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
// Still empty, but here it should be reasonable to factor in code duplicated between
|
||||
// - DirectLoginWizardController
|
||||
// - NewUserWizardController
|
||||
59
frontend/gamma/js/Clipperz/PM/UI/Compact/MainController.js
Normal file
59
frontend/gamma/js/Clipperz/PM/UI/Compact/MainController.js
Normal file
@@ -0,0 +1,59 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
Clipperz.Base.module('Clipperz.PM.UI.Compact');
|
||||
|
||||
Clipperz.PM.UI.Compact.MainController = function() {
|
||||
// this._loginPanel = null;
|
||||
// this._user = null;
|
||||
//
|
||||
// this._isRunningCompact = false;
|
||||
//
|
||||
// Clipperz.NotificationCenter.register(null, 'userConnected', this, 'userConnectedCallback');
|
||||
// Clipperz.NotificationCenter.register(null, 'switchLanguage', this, 'switchLanguageHandler');
|
||||
//
|
||||
// Clipperz.NotificationCenter.register(null, 'EXCEPTION', this, 'reportException');
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
MochiKit.Base.update(Clipperz.PM.UI.Compact.MainController.prototype, {
|
||||
|
||||
'toString': function() {
|
||||
return "Clipperz.PM.UI.Compact.MainController";
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
'run': function(shouldShowRegistrationForm) {
|
||||
MochiKit.Logging.logDebug("running " + this.toString());
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
__syntaxFix__: "syntax fix"
|
||||
});
|
||||
148
frontend/gamma/js/Clipperz/PM/UI/Web/Components/AccountPanel.js
Normal file
148
frontend/gamma/js/Clipperz/PM/UI/Web/Components/AccountPanel.js
Normal file
@@ -0,0 +1,148 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
|
||||
|
||||
Clipperz.PM.UI.Web.Components.AccountPanel = function(args) {
|
||||
args = args || {};
|
||||
|
||||
Clipperz.PM.UI.Web.Components.AccountPanel.superclass.constructor.apply(this, arguments);
|
||||
|
||||
// this._initiallySelectedTab = args.selected || 'ACCOUNT';
|
||||
this._initiallySelectedTab = args.selected || 'PASSPHRASE';
|
||||
this._tabPanelControllerConfiguration = {
|
||||
// 'ACCOUNT': {
|
||||
// tab: 'accountTab',
|
||||
// panel: 'accountPanel'
|
||||
// },
|
||||
'PASSPHRASE': {
|
||||
tab: 'passphraseTab',
|
||||
panel: 'passphrasePanel'
|
||||
},
|
||||
'PREFERENCES': {
|
||||
tab: 'preferencesTab',
|
||||
panel: 'preferencesPanel'
|
||||
},
|
||||
'LOGIN_HISTORY': {
|
||||
tab: 'loginHistoryTab',
|
||||
panel: 'loginHistoryPanel'
|
||||
}
|
||||
};
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
|
||||
Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.AccountPanel, Clipperz.PM.UI.Common.Components.TabPanelComponent, {
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'toString': function () {
|
||||
return "Clipperz.PM.UI.Web.Components.AccountPanel component";
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'renderSelf': function(/*aContainer, aPosition*/) {
|
||||
//Clipperz.log("AccountPanel.renderSelf element", this.element());
|
||||
this.append(this.element(), [
|
||||
{tag:'div', cls:'header', children:[
|
||||
{tag:'div', cls:'subPanelTabs', children:[
|
||||
{tag:'ul', children:[
|
||||
// {tag:'li', id:this.getId('accountTab'), children:[{tag:'a', href:'#', html:'Account'}], cls:'first'},
|
||||
{tag:'li', id:this.getId('passphraseTab'), children:[{tag:'a', href:'#', html:'Passphrase'}], cls:'first'},
|
||||
{tag:'li', id:this.getId('preferencesTab'), children:[{tag:'a', href:'#', html:'Preferences'}]},
|
||||
{tag:'li', id:this.getId('loginHistoryTab'), children:[{tag:'a', href:'#', html:'Login history'}]}
|
||||
]}
|
||||
]}
|
||||
]},
|
||||
{tag:'div', cls:'body', children:[
|
||||
{tag:'div', cls:'accountPanel', children:[
|
||||
{tag:'div', cls:'subPanelContent', children:[
|
||||
{tag:'ul', children:[
|
||||
// {tag:'li', id:this.getId('accountPanel'), children:[
|
||||
// {tag:'h3', html:"-- Account --"}
|
||||
// ]},
|
||||
{tag:'li', id:this.getId('passphrasePanel'), children:[
|
||||
{tag:'h3', cls:'changePassphrase', html:"Change passphrase"},
|
||||
{tag:'form', id:this.getId('changePassphrase'), cls:'changePassphrase', children:[
|
||||
{tag:'div', cls:'currentCredentials', children:[
|
||||
{tag:'div', cls:'field username', children:[
|
||||
{tag:'label', html:"username", 'for':this.getId('currentUsername')},
|
||||
{tag:'input', id:this.getId('currentUsername')}
|
||||
]},
|
||||
{tag:'div', cls:'field passphrase', children:[
|
||||
{tag:'label', html:"passphrase", 'for':this.getId('currentPassphrase')},
|
||||
{tag:'input', id:this.getId('currentPassphrase')}
|
||||
]}
|
||||
]},
|
||||
{tag:'div', cls:'newPassphrase', children:[
|
||||
{tag:'div', cls:'field', children:[
|
||||
{tag:'label', html:"new passphrase", 'for':this.getId('newPassphrase')},
|
||||
{tag:'input', id:this.getId('newPassphrase')}
|
||||
]},
|
||||
{tag:'div', cls:'field', children:[
|
||||
{tag:'label', html:"re-new passphrase", 'for':this.getId('reNewPassphrase')},
|
||||
{tag:'input', id:this.getId('reNewPassphrase')}
|
||||
]}
|
||||
]},
|
||||
{tag:'div', cls:'confirm', children:[
|
||||
{tag:'input', type:'checkbox', id:this.getId('confirm')},
|
||||
{tag:'label', html:"I understand that Clipperz will not be able to recover a lost passphrase", 'for':this.getId('confirm')}
|
||||
]}
|
||||
]},
|
||||
{tag:'div', cls:'clear'},
|
||||
{tag:'div', cls:'confirmButton', id:this.getId('confirmationButton'), children:[
|
||||
{tag:'span', html:"change passphrase"}
|
||||
]},
|
||||
|
||||
{tag:'h3', cls:'manageOTP', html:"Manage One-Time Passphrases"},
|
||||
{}
|
||||
]},
|
||||
{tag:'li', id:this.getId('preferencesPanel'), children:[
|
||||
{tag:'h3', html:"-- Preferences --"}
|
||||
]},
|
||||
{tag:'li', id:this.getId('loginHistoryPanel'), children:[
|
||||
{tag:'h3', html:"-- Login History --"}
|
||||
]}
|
||||
]}
|
||||
]}
|
||||
]}
|
||||
]},
|
||||
{tag:'div', cls:'footer'}
|
||||
]);
|
||||
|
||||
this.tabPanelController().setup({selected:this.initiallySelectedTab()});
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
|
||||
__syntaxFix__: "syntax fix"
|
||||
});
|
||||
78
frontend/gamma/js/Clipperz/PM/UI/Web/Components/AppPage.js
Normal file
78
frontend/gamma/js/Clipperz/PM/UI/Web/Components/AppPage.js
Normal file
@@ -0,0 +1,78 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
|
||||
|
||||
Clipperz.PM.UI.Web.Components.AppPage = function(args) {
|
||||
args = args || {};
|
||||
Clipperz.PM.UI.Web.Components.AppPage.superclass.constructor.call(this, args);
|
||||
|
||||
this._element = args.element || null;
|
||||
|
||||
this._slots = {
|
||||
'cardGrid' : this.getId('cardGrid'),
|
||||
// 'directLoginGrid' : this.getId('directLoginGrid'),
|
||||
'accountPanel': this.getId('accountPanel'),
|
||||
'dataPanel': this.getId('dataPanel'),
|
||||
'toolsPanel': this.getId('toolsPanel'),
|
||||
'userInfoBox': this.getId('userInfoBox'),
|
||||
'tabSidePanel': this.getId('tabSidePanel')
|
||||
};
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
|
||||
Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.AppPage, Clipperz.PM.UI.Common.Components.BaseComponent, {
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'toString': function () {
|
||||
return "Clipperz.PM.UI.Web.Components.AppPage component";
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'renderSelf': function(/*aContainer, aPosition*/) {
|
||||
this.append(this.element(), {tag:'div', id:this.getId('userInfoBox'), cls:'userInfoBox'});
|
||||
this.append(this.element(), {tag:'div', id:this.getId('sidePanels'), cls:'sidePanels'});
|
||||
this.append(this.getId('sidePanels'), {tag:'div', id:this.getId('tabSidePanel'), cls:'tabSidePanel', children:[]});
|
||||
|
||||
this.append(this.element(), {tag:'div', id:this.getId('mainPanels'), cls:'mainPanels'});
|
||||
this.append(this.getId('mainPanels'), {tag:'div', id:this.getId('cardGrid'), cls:'gridComponent cardGrid'});
|
||||
// this.append(this.getId('mainPanels'), {tag:'div', id:this.getId('directLoginGrid'), cls:'gridComponent directLoginGrid'});
|
||||
this.append(this.getId('mainPanels'), {tag:'div', id:this.getId('accountPanel'), cls:'otherPanel'});
|
||||
this.append(this.getId('mainPanels'), {tag:'div', id:this.getId('dataPanel'), cls:'otherPanel'});
|
||||
this.append(this.getId('mainPanels'), {tag:'div', id:this.getId('toolsPanel'), cls:'otherPanel'});
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
__syntaxFix__: "syntax fix"
|
||||
});
|
||||
@@ -0,0 +1,109 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
|
||||
|
||||
Clipperz.PM.UI.Web.Components.BookmarkletComponent = function(args) {
|
||||
args = args || {};
|
||||
|
||||
Clipperz.PM.UI.Web.Components.BookmarkletComponent.superclass.constructor.apply(this, arguments);
|
||||
MochiKit.Signal.connect(Clipperz.PM.Strings.Languages, 'switchLanguage', this, 'updateBookmarkletURLs');
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
|
||||
Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.BookmarkletComponent, Clipperz.PM.UI.Common.Components.BaseComponent, {
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'toString': function () {
|
||||
return "Clipperz.PM.UI.Web.Components.BookmarkletComponent component";
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'renderSelf': function() {
|
||||
// var bookmarkletUrl;
|
||||
//
|
||||
// if (Clipperz_IEisBroken == true) {
|
||||
// bookmarkletUrl = bookmarklet_ie;
|
||||
// } else {
|
||||
/// bookmarkletUrl = bookmarklet;
|
||||
// bookmarkletUrl = Clipperz.PM.Strings['bookmarklet'];
|
||||
// }
|
||||
|
||||
this.append(this.element(), {tag:'div', cls:'bookmarklet', children: [
|
||||
{tag:'div', id:this.getId('linkBlock'), cls:'bookmarklet_link', children:[
|
||||
// {tag:'a', id:this.getId('link'), href:bookmarkletUrl, children:[
|
||||
{tag:'a', id:this.getId('link'), href:'#', children:[
|
||||
{tag:'div', cls:'icon'},
|
||||
{tag:'div', cls:'text', children:[
|
||||
{tag:'span', html:"add to Clipperz"}
|
||||
]}
|
||||
]}
|
||||
]}
|
||||
]});
|
||||
|
||||
new Clipperz.PM.UI.Common.Components.Tooltip({
|
||||
element: this.getElement('linkBlock'),
|
||||
text: "Drag and drop the \"add to Clipperz\" link above to the bookmark bar.",
|
||||
position: 'BELOW'
|
||||
});
|
||||
|
||||
MochiKit.Signal.connect(this.getId('link'), 'onclick', this, 'handleOnclick');
|
||||
this.updateBookmarkletURLs();
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'handleOnclick': function (anEvent) {
|
||||
anEvent.preventDefault();
|
||||
|
||||
Clipperz.log("BOOKMARKLET CLICK");
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'updateBookmarkletURLs': function () {
|
||||
var bookmarkletUrl;
|
||||
|
||||
if (Clipperz_IEisBroken == true) {
|
||||
bookmarkletUrl = bookmarklet_ie;
|
||||
} else {
|
||||
// bookmarkletUrl = bookmarklet;
|
||||
bookmarkletUrl = Clipperz.PM.Strings.getValue('bookmarklet');
|
||||
}
|
||||
|
||||
this.getElement('link').href = bookmarkletUrl;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
__syntaxFix__: "syntax fix"
|
||||
});
|
||||
@@ -0,0 +1,881 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
|
||||
|
||||
Clipperz.PM.UI.Web.Components.CardDialogComponent = function(args) {
|
||||
args = args || {};
|
||||
|
||||
Clipperz.PM.UI.Web.Components.CardDialogComponent.superclass.constructor.apply(this, arguments);
|
||||
|
||||
this._tabPanelController = null;
|
||||
|
||||
this._tabPanelControllerConfiguration = {
|
||||
'DETAILS': {
|
||||
tab: 'detailTab',
|
||||
panel: 'detailTabpanel'
|
||||
},
|
||||
'DIRECT_LOGINS': {
|
||||
tab: 'directLoginTab',
|
||||
panel: 'directLoginTabpanel'
|
||||
},
|
||||
'SHARING': {
|
||||
tab: 'sharingTab',
|
||||
panel: 'sharingTabpanel'
|
||||
}
|
||||
};
|
||||
|
||||
this._tooltips = null;
|
||||
|
||||
this._isSavingEnabled = false;
|
||||
this._hintMode = 'OFF'; // 'ON'
|
||||
|
||||
this._fieldComponents = {};
|
||||
this._directLoginComponents = {};
|
||||
|
||||
this._displayMode = 'fixed'; // 'scrollable';
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
|
||||
Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.CardDialogComponent, Clipperz.PM.UI.Common.Components.BaseComponent, {
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'toString': function () {
|
||||
return "Clipperz.PM.UI.Web.Components.CardDialogComponent component";
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'tabPanelController': function () {
|
||||
if (this._tabPanelController == null) {
|
||||
this._tabPanelController = new Clipperz.PM.UI.Common.Controllers.TabPanelController({
|
||||
component:this,
|
||||
configuration:this._tabPanelControllerConfiguration
|
||||
});
|
||||
|
||||
MochiKit.Signal.connect(this._tabPanelController, 'tabSelected', this, 'handleTabSelected')
|
||||
}
|
||||
|
||||
return this._tabPanelController;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'renderSelf': function() {
|
||||
this.append(this.element(), {tag:'div', cls:'CardDialog mainDialog loading', id:this.getId('panel'), children: [
|
||||
{tag:'form', id:this.getId('form'), children:[
|
||||
// {tag:'input', type:'text', id:this.getId('hidden'), cls:'hidden'},
|
||||
{tag:'div', cls:'header', children:[
|
||||
{tag:'div', cls:'title', children:[
|
||||
{tag:'input', type:'text', id:this.getId('title')}
|
||||
]}
|
||||
]},
|
||||
{tag:'div', id:this.getId('body'), cls:'body', children:[
|
||||
{tag:'div', cls:'tabs', children:[
|
||||
{tag:'ul', cls:'tabs', children:[
|
||||
{tag:'li', id:this.getId('detailTab'), children:[{tag:'span', html:"details"}]},
|
||||
{tag:'li', id:this.getId('directLoginTab'), children:[
|
||||
{tag:'span', html:"direct logins"}//,
|
||||
// {tag:'div', id:this.getId('addDirectLoginButton'), cls:'addDirectLoginButton', children:[
|
||||
// {tag:'span', html:"+"}
|
||||
// ]}
|
||||
]},
|
||||
{tag:'li', id:this.getId('sharingTab'), children:[{tag:'span', html:"sharing"}]}
|
||||
]}
|
||||
]},
|
||||
{tag:'div', cls:'tabPanels', children:[
|
||||
{tag:'ul', cls:'tabPanels', children:[
|
||||
{tag:'li', id:this.getId('detailTabpanel'), cls:'tabPanel', children:[
|
||||
{tag:'div', id:this.getId('recordFields'), children:[
|
||||
{tag:'table', cls:'fields', cellpadding:'0', id:this.getId('fieldTable'), cellspacing:'0', children:[
|
||||
{tag:'thead', children:[
|
||||
{tag:'tr', children:[
|
||||
{tag:'th', cls:'fieldStateTH', html:""},
|
||||
{tag:'th', cls:'fieldLabelTH', html:"label"},
|
||||
{tag:'th', cls:'fieldLockTH', html:""},
|
||||
{tag:'th', cls:'fieldValueTH', html:"value"},
|
||||
{tag:'th', cls:'fieldActionTH', html:""},
|
||||
{tag:'th', cls:'fieldDeleteTH', html:""}
|
||||
]}
|
||||
]},
|
||||
{tag:'tfoot'},
|
||||
{tag:'tbody', id:this.getId('tableBody'), children:[
|
||||
{tag:'tr', id:this.getId('newFieldTR'), cls:'newFieldTR', children:[
|
||||
{tag:'td', cls:'fieldState'},
|
||||
{tag:'td', cls:'fieldLabel', children:[
|
||||
{tag:'input', cls:'label', id:this.getId('newFieldLabel')}
|
||||
]},
|
||||
{tag:'td', cls:'fieldLock', children:[
|
||||
{tag:'div', cls:'unlocked', id:this.getId('newFieldIsLocked')}
|
||||
]},
|
||||
{tag:'td', cls:'fieldValue', children:[
|
||||
{tag:'div', cls:'unlocked', id:this.getId('newFieldValueWrapper'), children:[
|
||||
{tag:'input', type:'text', cls:'value', id:this.getId('newFieldValue')}
|
||||
]}
|
||||
]},
|
||||
{tag:'td', cls:'fieldAction', children:[
|
||||
{tag:'div', html:' '}
|
||||
]},
|
||||
{tag:'td', cls:'fieldAddDelete', children:[
|
||||
{tag:'div', cls:'new', children:[
|
||||
{tag:'span', children:[
|
||||
{tag:'a', href:'#', id:this.getId('newFieldAddButton'), html:"add"}
|
||||
]}
|
||||
]}
|
||||
]}
|
||||
]}
|
||||
]}
|
||||
]}
|
||||
]},
|
||||
{tag:'div', cls:'notes', children:[
|
||||
{tag:'div', children:[
|
||||
{tag:'textarea', id:this.getId('recordNote'), value:""}
|
||||
]}
|
||||
]}
|
||||
]},
|
||||
{tag:'li', id:this.getId('directLoginTabpanel'), cls:'tabPanel', children:[
|
||||
{tag:'div', id:this.getId('directLoginsComponentContainer'), cls:'directLoginsComponentContainer', children:[
|
||||
{tag:'div', id:this.getId('directLogins'), cls:'directLogins', children:[
|
||||
{tag:'div', id:this.getId('addNewDirectLoginSplash'), cls:'addNewDirectLoginSplash', children:[
|
||||
{tag:'h3', html:"Here you can add a Direct Login for this card: instant access to your favorit website!"},
|
||||
{tag:'a', href:'#', id:this.getId('addNewDirectLoginSplashButton'), children:[{tag:'span', html:"Add Direct Login"}]}
|
||||
]},
|
||||
{tag:'div', id:this.getId('directLoginsList')},
|
||||
{tag:'div', cls:'addDirectLoginListItem', id:this.getId('addDirectLoginListItem'), children:[{tag:'a', href:'#', id:this.getId('addNewDirectLoginListItemButton'), children:[{tag:'span', html:"Add Direct Login"}]}]}
|
||||
]},
|
||||
{tag:'div', id:this.getId('directLoginEditDetail'), cls:'directLoginEditDetail'}
|
||||
]}
|
||||
]},
|
||||
{tag:'li', id:this.getId('sharingTabpanel'), cls:'tabPanel', children:[
|
||||
{tag:'h2', html:"Coming soon!"}
|
||||
]}
|
||||
]}
|
||||
]},
|
||||
{tag:'div', cls:'mask', children:[
|
||||
{tag:'div', id:this.getId('progress'), children:[
|
||||
{tag:'h3', id:this.getId('progressDescription'), cls:'progressDescription', html:"Loading"},
|
||||
{tag:'div', id:this.getId('progressBar')}
|
||||
]},
|
||||
{tag:'div', id:this.getId('error'), cls:'error', children:[
|
||||
{tag:'div', cls:'img'},
|
||||
{tag:'p', id:this.getId('errorMessage')}
|
||||
]}
|
||||
]}
|
||||
]},
|
||||
{tag:'div', cls:'footer', children:[
|
||||
{tag:'div', cls:'buttonArea', children:[
|
||||
{tag:'div', cls:'cancel', id:this.getId('cancelButton'), html:"cancel"},
|
||||
{tag:'div', cls:'save disabled', id:this.getId('saveButton'), html:"save"}
|
||||
]}
|
||||
]}
|
||||
]}
|
||||
]});
|
||||
|
||||
|
||||
this.insertAllTooltips();
|
||||
|
||||
this.addComponent(new Clipperz.PM.UI.Common.Components.ProgressBar({'element':this.getElement('progressBar')}));
|
||||
|
||||
this.tabPanelController().setup({selected:'DETAILS'});
|
||||
// this.tabPanelController().setup({selected:'DIRECT_LOGINS'});
|
||||
|
||||
MochiKit.Style.hideElement(this.getId('error'));
|
||||
MochiKit.Style.hideElement(this.getElement('directLoginEditDetail'));
|
||||
MochiKit.Style.hideElement(this.getElement('addDirectLoginListItem'));
|
||||
this.plumbDetailsPanel();
|
||||
|
||||
MochiKit.Signal.connect(this.getId('cancelButton'), 'onclick', this, 'handleCancelEvent');
|
||||
MochiKit.Signal.connect(this.getId('saveButton'), 'onclick', this, 'handleSaveEvent');
|
||||
|
||||
MochiKit.Signal.connect(this.getId('addNewDirectLoginSplashButton'), 'onclick', this, 'handleAddDirectLogin');
|
||||
MochiKit.Signal.connect(this.getId('addNewDirectLoginListItemButton'), 'onclick', this, 'handleAddDirectLogin');
|
||||
|
||||
MochiKit.Signal.connect(MochiKit.DOM.currentDocument().body, 'onkeydown', this, 'handleKeyEvent');
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'displayMode': function () {
|
||||
return this._displayMode;
|
||||
},
|
||||
|
||||
'setDisplayMode': function (aValue) {
|
||||
this._displayMode = aValue;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'plumbDetailsPanel': function () {
|
||||
MochiKit.Signal.connect(this.getId('title'), 'onfocus', MochiKit.Base.method(this, 'handleOnFocusEvent', this.getElement('title').parentNode));
|
||||
MochiKit.Signal.connect(this.getId('title'), 'onblur', MochiKit.Base.method(this, 'handleLooseFocusEvent', this.getElement('title').parentNode));
|
||||
MochiKit.Signal.connect(this.getId('title'), 'onchange', MochiKit.Base.partial(MochiKit.Signal.signal, this, 'changedValue'));
|
||||
MochiKit.Signal.connect(this.getId('title'), 'onkeyup', MochiKit.Base.partial(MochiKit.Signal.signal, this, 'changedValue'));
|
||||
|
||||
MochiKit.Signal.connect(this.getId('recordNote'), 'onfocus', MochiKit.Base.method(this, 'handleOnFocusEvent', MochiKit.Selector.findChildElements(this.element(), ['div.notes'])[0]));
|
||||
MochiKit.Signal.connect(this.getId('recordNote'), 'onblur', MochiKit.Base.method(this, 'handleLooseFocusEvent', MochiKit.Selector.findChildElements(this.element(), ['div.notes'])[0]));
|
||||
MochiKit.Signal.connect(this.getId('recordNote'), 'onchange', MochiKit.Base.partial(MochiKit.Signal.signal, this, 'changedValue'));
|
||||
MochiKit.Signal.connect(this.getId('recordNote'), 'onkeyup', MochiKit.Base.partial(MochiKit.Signal.signal, this, 'changedValue'));
|
||||
|
||||
MochiKit.Signal.connect(this.getId('newFieldValue'), 'onkeydown', this, 'handleKeyDownOnNewFieldValue');
|
||||
|
||||
MochiKit.Signal.connect(this.getId('newFieldLabel'), 'onkeyup', MochiKit.Base.partial(MochiKit.Signal.signal, this, 'changedValue'));
|
||||
MochiKit.Signal.connect(this.getId('newFieldIsLocked'), 'onclick', this, 'toggleNewFieldIsHidden');
|
||||
MochiKit.Signal.connect(this.getId('newFieldValue'), 'onkeyup', MochiKit.Base.partial(MochiKit.Signal.signal, this, 'changedValue'));
|
||||
|
||||
MochiKit.Signal.connect(this.getId('newFieldAddButton'), 'onclick', this, 'handleAddClick');
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'insertAllTooltips': function () {
|
||||
var tooltips;
|
||||
var tooltipEnabled;
|
||||
|
||||
tooltips = {};
|
||||
tooltipEnabled = (this.hintMode() == 'ON');
|
||||
|
||||
tooltips['title'] = new Clipperz.PM.UI.Common.Components.Tooltip({
|
||||
'element': this.getElement('title'),
|
||||
'text': "Insert here the title of the card",
|
||||
'position': 'RIGHT'
|
||||
});
|
||||
this.addComponent(tooltips['title']);
|
||||
MochiKit.Signal.connect(this.getId('title'), 'onfocus', MochiKit.Base.method(this, 'showTooltipOnFocus', 'title'));
|
||||
MochiKit.Signal.connect(this.getId('title'), 'onblur', MochiKit.Base.method(this, 'hideTooltipOnBlur', 'title'));
|
||||
|
||||
tooltips['newFieldTR'] = new Clipperz.PM.UI.Common.Components.Tooltip({
|
||||
'element': this.getElement('newFieldTR'),
|
||||
'text': "Insert your card new values here",
|
||||
'position': 'RIGHT'
|
||||
});
|
||||
this.addComponent(tooltips['newFieldTR']);
|
||||
MochiKit.Signal.connect(this.getId('newFieldLabel'), 'onfocus', MochiKit.Base.method(this, 'showTooltipOnFocus', 'newFieldTR'));
|
||||
MochiKit.Signal.connect(this.getId('newFieldValue'), 'onblur', MochiKit.Base.method(this, 'hideTooltipOnBlur', 'newFieldTR'));
|
||||
|
||||
tooltips['recordNote'] = new Clipperz.PM.UI.Common.Components.Tooltip({
|
||||
'element': this.getElement('recordNote'),
|
||||
'text': "You can insert some notes here",
|
||||
'position': 'RIGHT'
|
||||
});
|
||||
this.addComponent(tooltips['recordNote']);
|
||||
MochiKit.Signal.connect(this.getId('recordNote'), 'onfocus', MochiKit.Base.method(this, 'showTooltipOnFocus', 'recordNote'));
|
||||
MochiKit.Signal.connect(this.getId('recordNote'), 'onblur', MochiKit.Base.method(this, 'hideTooltipOnBlur', 'recordNote'));
|
||||
|
||||
this._tooltips = tooltips;
|
||||
},
|
||||
|
||||
//.........................................................................
|
||||
|
||||
'updateAllTooltipsEnabledMode': function (aStatus) {
|
||||
var tooltipLabel;
|
||||
var tooltipEnabled;
|
||||
|
||||
tooltipEnabled = (aStatus == 'ON') ? true : false;
|
||||
|
||||
for (tooltipLabel in this.tooltips()) {
|
||||
this.tooltips()[tooltipLabel].setIsEnabled(tooltipEnabled);
|
||||
}
|
||||
},
|
||||
|
||||
//.........................................................................
|
||||
|
||||
'tooltips': function () {
|
||||
return this._tooltips;
|
||||
},
|
||||
|
||||
//.........................................................................
|
||||
|
||||
'showTooltipOnFocus': function (aTooltip, anEvent) {
|
||||
MochiKit.Async.callLater(0.5, MochiKit.Base.method(this.tooltips()[aTooltip], 'show'));
|
||||
},
|
||||
|
||||
//.........................................................................
|
||||
|
||||
'hideTooltipOnBlur': function (aTooltip, anEvent) {
|
||||
this.tooltips()[aTooltip].hide();
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'displayElement': function() {
|
||||
return this.getElement('panel');
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'fieldComponents': function () {
|
||||
return this._fieldComponents;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'directLoginComponents': function () {
|
||||
return this._directLoginComponents;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'hintMode': function () {
|
||||
return this._hintMode;
|
||||
},
|
||||
|
||||
'setHintMode': function (aValue) {
|
||||
if (this._hintMode != aValue) {
|
||||
this._hintMode = aValue;
|
||||
|
||||
this.updateAllTooltipsEnabledMode(this._hintMode);
|
||||
// if (this._hintMode == 'ON') {
|
||||
// this.enableHints();
|
||||
// }
|
||||
}
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'focusOnNewFieldLabel': function () {
|
||||
this.getElement('newFieldLabel').focus();
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'isSavingEnabled': function () {
|
||||
return this._isSavingEnabled;
|
||||
},
|
||||
|
||||
'setShouldEnableSaving': function (aValue) {
|
||||
this._isSavingEnabled = aValue || this.newFieldHasPendingChanges();
|
||||
|
||||
if (this._isSavingEnabled == true) {
|
||||
MochiKit.DOM.addElementClass(this.getElement('panel'), 'hasPendingChanges');
|
||||
MochiKit.DOM.removeElementClass(this.getId('saveButton'), 'disabled');
|
||||
} else {
|
||||
MochiKit.DOM.removeElementClass(this.getElement('panel'), 'hasPendingChanges');
|
||||
MochiKit.DOM.addElementClass(this.getId('saveButton'), 'disabled');
|
||||
}
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'title': function () {
|
||||
return this.getElement('title').value;
|
||||
},
|
||||
|
||||
'setTitle': function (aValue) {
|
||||
this.renderTitle(aValue);
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'renderTitle': function (aValue) {
|
||||
this.getElement('title').value = Clipperz.Base.sanitizeString(aValue);
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'setFocusOnTitleField': function () {
|
||||
this.getElement('title').focus();
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'disableCardTitleEditing': function () {
|
||||
this.getElement('title').disabled = true;
|
||||
MochiKit.DOM.addElementClass(this.getElement('title').parentNode, 'disabled');
|
||||
},
|
||||
|
||||
|
||||
'enableCardTitleEditing': function () {
|
||||
this.getElement('title').disabled = false;
|
||||
MochiKit.DOM.removeElementClass(this.getElement('title').parentNode, 'disabled');
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'notes': function () {
|
||||
return this.getElement('recordNote').value;
|
||||
},
|
||||
|
||||
'setNotes': function (aValue) {
|
||||
this.renderNotes(aValue);
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'renderNotes': function (aValue) {
|
||||
var noteElement;
|
||||
|
||||
noteElement = this.getElement('recordNote');
|
||||
|
||||
if ((aValue != null) && (typeof(aValue) != 'undefined')) {
|
||||
noteElement.value = aValue;
|
||||
} else {
|
||||
noteElement.value = "";
|
||||
}
|
||||
|
||||
this.fixNotesHeight();
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'addFieldRowComponent': function (aFieldComponent) {
|
||||
var fieldTR;
|
||||
|
||||
fieldTR = this.insertBefore(this.getElement('newFieldTR'), {tag:'tr', id:'recordFieldReferece_'+aFieldComponent.reference()});
|
||||
aFieldComponent.renderInNode(fieldTR);
|
||||
this.fieldComponents()[aFieldComponent.reference()] = aFieldComponent;
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'addDirectLoginComponent': function (aDirectLoginComponent) {
|
||||
var directLoginDIV;
|
||||
|
||||
if (MochiKit.Base.keys(this.directLoginComponents()).length == 0) {
|
||||
this.hideNewDirectLoginSplash();
|
||||
}
|
||||
|
||||
directLoginDIV = this.append(this.getElement('directLoginsList'), {tag:'div', cls:'directLoginItem'});
|
||||
aDirectLoginComponent.renderInNode(directLoginDIV);
|
||||
this.directLoginComponents()[aDirectLoginComponent.reference()] = aDirectLoginComponent;
|
||||
},
|
||||
|
||||
'removeDirectLoginComponent': function (aDirectLoginComponent) {
|
||||
delete this.directLoginComponents()[aDirectLoginComponent.reference()];
|
||||
aDirectLoginComponent.remove();
|
||||
|
||||
if (MochiKit.Base.keys(this.directLoginComponents()).length == 0) {
|
||||
this.showNewDirectLoginSplash();
|
||||
}
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'showNewDirectLoginSplash': function () {
|
||||
MochiKit.Style.showElement(this.getElement('addNewDirectLoginSplash'));
|
||||
MochiKit.Style.hideElement(this.getElement('addDirectLoginListItem'));
|
||||
},
|
||||
|
||||
'hideNewDirectLoginSplash': function () {
|
||||
MochiKit.Style.hideElement(this.getElement('addNewDirectLoginSplash'));
|
||||
MochiKit.Style.showElement(this.getElement('addDirectLoginListItem'));
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'renderDirectLoginEditingComponent': function (aDirectLoginEditingComponent) {
|
||||
aDirectLoginEditingComponent.renderInNode(this.getElement('directLoginEditDetail'));
|
||||
},
|
||||
|
||||
'placeDirectLoginEditingComponent': function () {
|
||||
var width;
|
||||
|
||||
width = MochiKit.Style.getElementDimensions(this.getElement('directLoginsComponentContainer'))['w'];
|
||||
|
||||
return Clipperz.Async.callbacks("CardDialogComponent.renderDirectLoginEditingComponent", [
|
||||
MochiKit.Base.bind(function () {
|
||||
MochiKit.Style.setElementPosition (this.getElement('directLoginEditDetail'), {x:width, y:-MochiKit.Style.getElementDimensions(this.getElement('directLogins'))['h']});
|
||||
MochiKit.Style.setElementDimensions(this.getElement('directLoginEditDetail'), {w:width});
|
||||
}, this),
|
||||
|
||||
MochiKit.Base.noop
|
||||
], {trace:false});
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'newFieldLabel': function () {
|
||||
return this.getElement('newFieldLabel').value;
|
||||
},
|
||||
|
||||
'setNewFieldLabel': function (aValue) {
|
||||
this.getElement('newFieldLabel').value = aValue;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'newFieldValue': function () {
|
||||
return this.getElement('newFieldValue').value;
|
||||
},
|
||||
|
||||
'setNewFieldValue': function (aValue) {
|
||||
this.getElement('newFieldValue').value = aValue;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'newFieldIsHidden': function () {
|
||||
return MochiKit.DOM.hasElementClass(this.getElement('newFieldIsLocked'), 'locked');
|
||||
},
|
||||
|
||||
'setNewFieldIsHidden': function (aValue) {
|
||||
MochiKit.DOM.setElementClass(this.getElement('newFieldIsLocked'), (aValue ? 'locked': 'unlocked'));
|
||||
MochiKit.DOM.setElementClass(this.getElement('newFieldValueWrapper'), (aValue ? 'locked': 'unlocked'));
|
||||
},
|
||||
|
||||
'toggleNewFieldIsHidden': function (anEvent) {
|
||||
anEvent.preventDefault();
|
||||
|
||||
this.setNewFieldIsHidden(! this.newFieldIsHidden());
|
||||
MochiKit.Signal.signal(this, 'changedValue');
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'newFieldHasPendingChanges': function () {
|
||||
return ((this.newFieldLabel() != '') || (this.newFieldValue() != '') || (this.newFieldIsHidden() == true));
|
||||
},
|
||||
|
||||
'resetNewFieldInputs': function () {
|
||||
this.setNewFieldLabel('');
|
||||
this.setNewFieldValue('');
|
||||
this.setNewFieldIsHidden(false);
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'handleKeyDownOnNewFieldValue': function (anEvent) {
|
||||
MochiKit.Signal.signal(this, 'keyPressed', anEvent);
|
||||
/*
|
||||
if ((anEvent.key().string == 'KEY_TAB') && this.newFieldHasPendingChanges()) {
|
||||
anEvent.preventDefault();
|
||||
|
||||
MochiKit.Signal.signal(this, 'addField');
|
||||
this.getElement('newFieldLabel').focus();
|
||||
}
|
||||
*/
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'handleAddClick': function (anEvent) {
|
||||
anEvent.preventDefault();
|
||||
MochiKit.Signal.signal(this, 'addField');
|
||||
this.getElement('newFieldLabel').focus();
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'handleDeleteClick': function (aFieldKey, anEvent) {
|
||||
anEvent.preventDefault();
|
||||
MochiKit.Signal.signal(this, 'deleteField', aFieldKey);
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'toggleLock': function (aFieldKey, anEvent) {
|
||||
var shouldRedrawAsLocked;
|
||||
var currentTRElement;
|
||||
|
||||
anEvent.preventDefault();
|
||||
|
||||
currentTRElement = Clipperz.DOM.get(aFieldKey);
|
||||
shouldRedrawAsLocked = (MochiKit.DOM.hasElementClass(currentTRElement, 'locked') ? false : true);
|
||||
|
||||
this.renderFieldTR(currentTRElement, {
|
||||
label:MochiKit.Selector.findChildElements(currentTRElement, ['td.fieldLabel input'])[0].value,
|
||||
value:MochiKit.Selector.findChildElements(currentTRElement, ['td.fieldValue input'])[0].value
|
||||
}, shouldRedrawAsLocked, MochiKit.DOM.hasElementClass(currentTRElement, 'new'));
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'fixNotesHeight': function () {
|
||||
var element;
|
||||
|
||||
element = this.getElement('recordNote');
|
||||
|
||||
if (element.scrollHeight == 0) {
|
||||
MochiKit.Async.callLater(0.1, MochiKit.Base.method(this, 'fixNotesHeight'));
|
||||
} else {
|
||||
var textareaHeight;
|
||||
|
||||
textareaHeight = Math.min(Math.max(50, element.scrollHeight), 500);
|
||||
|
||||
MochiKit.Style.setElementDimensions(element, {h:textareaHeight}, 'px');
|
||||
MochiKit.Async.callLater(0.1, MochiKit.Base.method(this, 'fixRendering'));
|
||||
}
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'fixRendering': function () {
|
||||
// var height;
|
||||
var y;
|
||||
var scrollHeight;
|
||||
var viewportHeight;
|
||||
var viewportY;
|
||||
var footerElement;
|
||||
var footerElementPosition;
|
||||
var footerElementDimensions;
|
||||
var footerComputedHeight;
|
||||
|
||||
// height = MochiKit.Style.getElementDimensions(this.displayElement())['h'];
|
||||
y = MochiKit.Style.getElementPosition(this.displayElement())['y'];
|
||||
|
||||
footerElement = MochiKit.Selector.findChildElements(this.displayElement(), ['div.footer'])[0];
|
||||
footerElementPosition = MochiKit.Style.getElementPosition(footerElement);
|
||||
footerElementDimensions = MochiKit.Style.getElementDimensions(footerElement);
|
||||
footerComputedHeight = footerElementPosition['y'] + footerElementDimensions['h'] - y;
|
||||
|
||||
// scrollHeight = this.displayElement().scrollHeight;
|
||||
scrollHeight = footerComputedHeight;
|
||||
|
||||
viewportHeight = MochiKit.Style.getViewportDimensions()['h'];
|
||||
viewportY = MochiKit.Style.getViewportPosition()['y'];
|
||||
|
||||
if ((y + scrollHeight) > (viewportY + viewportHeight)) {
|
||||
this.setDisplayMode('scrollable');
|
||||
MochiKit.DOM.addElementClass(this.element(), 'scrollable');
|
||||
MochiKit.DOM.removeElementClass(this.element(), 'fixed');
|
||||
MochiKit.Style.setElementPosition(this.displayElement(), {y:Math.max(0, Math.min(y, (viewportY + viewportHeight) - scrollHeight))}, 'px');
|
||||
MochiKit.Visual.ScrollTo(this.displayElement(), {duration:0.5});
|
||||
} else {
|
||||
this.setDisplayMode('fixed');
|
||||
MochiKit.DOM.removeElementClass(this.element(), 'scrollable');
|
||||
MochiKit.DOM.addElementClass(this.element(), 'fixed');
|
||||
}
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'unselectCurrentSelectedItems': function () {
|
||||
MochiKit.Iter.forEach(MochiKit.Selector.findChildElements(this.displayElement(), ['.selectedField']), function (anElement) {
|
||||
MochiKit.DOM.removeElementClass(anElement, 'selectedField');
|
||||
});
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'hideProgressMask': function () {
|
||||
MochiKit.DOM.removeElementClass(this.getId('panel'), 'loading');
|
||||
},
|
||||
|
||||
'showProgressMask': function () {
|
||||
this.getElement('progressDescription').innerHTML = "Saving";
|
||||
MochiKit.DOM.addElementClass(this.getId('panel'), 'loading');
|
||||
},
|
||||
|
||||
'showError': function (anError) {
|
||||
//console.log(">>> showError", anError);
|
||||
MochiKit.Style.hideElement(this.getId('progress'));
|
||||
this.getElement('errorMessage').innerHTML = Clipperz.PM.Strings.errorDescriptionForException(anError['message']);
|
||||
MochiKit.Style.showElement(this.getId('error'));
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'cancel': function () {
|
||||
/*
|
||||
var deferredResult;
|
||||
|
||||
deferredResult = new Clipperz.Async.Deferred("CardDialogComponent.cancel", {trace:false});
|
||||
deferredResult.addCallback(MochiKit.Base.method(this, 'isSavingEnabled'));
|
||||
deferredResult.addIf([
|
||||
MochiKit.Base.method(this, 'askConfirmationForLoosingPendingChanges')
|
||||
], []);
|
||||
deferredResult.addCallback(MochiKit.Base.partial(MochiKit.Signal.signal, this, 'cancel'));
|
||||
deferredResult.callback();
|
||||
|
||||
return deferredResult;
|
||||
*/
|
||||
MochiKit.Signal.signal(this, 'cancel');
|
||||
},
|
||||
|
||||
'handleCancelEvent': function (anEvent) {
|
||||
anEvent.preventDefault();
|
||||
this.cancel();
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'handleSaveEvent': function (anEvent) {
|
||||
anEvent.preventDefault();
|
||||
|
||||
if (! MochiKit.DOM.hasElementClass(anEvent.src(), 'disabled')) {
|
||||
MochiKit.Signal.signal(this, 'save');
|
||||
}
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'handleAddDirectLogin': function (anEvent) {
|
||||
anEvent.preventDefault();
|
||||
|
||||
MochiKit.Signal.signal(this, 'addDirectLogin');
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'handleOnFocusEvent': function (anElement, anEvent) {
|
||||
this.unselectCurrentSelectedItems();
|
||||
MochiKit.DOM.addElementClass(anElement, 'selectedField');
|
||||
},
|
||||
|
||||
'handleLooseFocusEvent': function (anElement, anEvent) {
|
||||
this.unselectCurrentSelectedItems();
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'handleTabSelected': function (aSelectedTab) {
|
||||
this.unselectCurrentSelectedItems();
|
||||
|
||||
switch (aSelectedTab) {
|
||||
case 'DETAILS':
|
||||
// MochiKit.Style.hideElement(this.getElement('addDirectLoginButton'));
|
||||
break;
|
||||
case 'DIRECT_LOGINS':
|
||||
// MochiKit.Style.showElement(this.getElement('addDirectLoginButton'));
|
||||
break;
|
||||
case 'SHARING':
|
||||
// MochiKit.Style.hideElement(this.getElement('addDirectLoginButton'));
|
||||
break;
|
||||
}
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'handleKeyEvent': function (anEvent) {
|
||||
//console.log("####", anEvent.key().string);
|
||||
if (anEvent.key().string == 'KEY_ESCAPE') {
|
||||
MochiKit.Signal.signal(this, 'changedValue');
|
||||
this.cancel();
|
||||
} else if (anEvent.key().string == 'KEY_ENTER') {
|
||||
if (anEvent.target().nodeName == 'TEXTAREA') {
|
||||
|
||||
} else {
|
||||
anEvent.preventDefault();
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'askConfirmationForLoosingPendingChanges': function () {
|
||||
var deferredResult;
|
||||
var confirmationDialog;
|
||||
|
||||
confirmationDialog = new Clipperz.PM.UI.Common.Components.SimpleMessagePanel({
|
||||
title: "Alert",
|
||||
text: "Should lost pending changes?",
|
||||
type: 'ALERT',
|
||||
buttons: [
|
||||
{text:"Cancel", result:'CANCEL', isDefault:true},
|
||||
{text:"Ok", result:'OK'}
|
||||
]
|
||||
});
|
||||
|
||||
deferredResult = new Clipperz.Async.Deferred("CardDialogComponent.askConfirmationForLoosingPendingChanges", {trace:false});
|
||||
// deferredResult = confirmationDialog.deferredShow({openFromElement:anEvent.src(), onOkCloseToElement:MochiKit.DOM.currentDocument().body, onCancelCloseToElement:anEvent.src()});
|
||||
deferredResult.addMethod(confirmationDialog, 'deferredShow', {
|
||||
'openFromElement': this.getElement('cancelButton'),
|
||||
'onOkCloseToElement': null, // this.getElement('cancelButton'),
|
||||
'onCancelCloseToElement': this.getElement('cancelButton')
|
||||
});
|
||||
// deferredResult.addCallback(function () { console.log("DELETE: " + anObject.toString(), anObject); });
|
||||
// deferredResult.addErrbackPass(function () { console.log("skip deletion: " + anObject.toString(), anObject); });
|
||||
deferredResult.callback();
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'showDirectLoginEditingComponent': function () {
|
||||
var width;
|
||||
var transition;
|
||||
var duration;
|
||||
|
||||
width = MochiKit.Style.getElementDimensions(this.getElement('directLoginsComponentContainer'))['w'];
|
||||
transition = MochiKit.Visual.Transitions.sinoidal;
|
||||
duration = 1;
|
||||
|
||||
return Clipperz.Async.callbacks("CardDialogComponent.showDirectLoginEditingComponent", [
|
||||
MochiKit.Base.method(this, 'disableCardTitleEditing'),
|
||||
MochiKit.Base.method(this.tabPanelController(), 'disable'),
|
||||
|
||||
MochiKit.Base.bind(function () {
|
||||
MochiKit.Style.setElementPosition (this.getElement('directLoginEditDetail'), {x:width, y:-MochiKit.Style.getElementDimensions(this.getElement('directLogins'))['h']});
|
||||
MochiKit.Style.setElementDimensions(this.getElement('directLoginEditDetail'), {w:width});
|
||||
MochiKit.Style.showElement(this.getElement('directLoginEditDetail'));
|
||||
MochiKit.Style.setOpacity(this.getElement('directLoginEditDetail'), 0);
|
||||
MochiKit.Style.setElementDimensions(this.getElement('directLoginsComponentContainer'), {
|
||||
h:Math.max(
|
||||
MochiKit.Style.getElementDimensions(this.getElement('directLogins'))['h'],
|
||||
MochiKit.Style.getElementDimensions(this.getElement('directLoginEditDetail'))['h']
|
||||
)
|
||||
});
|
||||
// MochiKit.Style.setElementDimensions(this.getElement('directLoginsComponentContainer'), {h:MochiKit.Style.getElementDimensions(this.getElement('directLogins'))['h']});
|
||||
}, this),
|
||||
MochiKit.Base.partial(Clipperz.Visual.deferredAnimations, MochiKit.Visual.Parallel, [
|
||||
new MochiKit.Visual.Move(this.getElement('directLogins'), {x:-width, y:0, mode:'relative', transition:transition, sync:true}),
|
||||
new MochiKit.Visual.Opacity(this.getElement('directLogins'), {from:1.0, to:0.0, transition:transition, sync:true}),
|
||||
new MochiKit.Visual.Move(this.getElement('directLoginEditDetail'), {x:-width, y:0, mode:'relative', transition:transition, sync:true}),
|
||||
new MochiKit.Visual.Opacity(this.getElement('directLoginEditDetail'), {from:0.0, to:1.0, transition:transition, sync:true})
|
||||
], {duration:duration}),
|
||||
|
||||
MochiKit.Base.noop
|
||||
], {trace:false});
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'hideDirectLoginEditingComponent': function () {
|
||||
var width;
|
||||
var transition;
|
||||
var duration;
|
||||
|
||||
width = MochiKit.Style.getElementDimensions(this.getElement('directLoginsComponentContainer'))['w'];
|
||||
transition = MochiKit.Visual.Transitions.sinoidal;
|
||||
duration = 1;
|
||||
|
||||
return Clipperz.Async.callbacks("CardDialogComponent.hideDirectLoginEditingComponent", [
|
||||
MochiKit.Base.partial(Clipperz.Visual.deferredAnimations, MochiKit.Visual.Parallel, [
|
||||
new MochiKit.Visual.Move(this.getElement('directLogins'), {x:width, y:0, mode:'relative', transition:transition, sync:true}),
|
||||
new MochiKit.Visual.Opacity(this.getElement('directLogins'), {from:0.0, to:1.0, transition:transition, sync:true}),
|
||||
new MochiKit.Visual.Move(this.getElement('directLoginEditDetail'), {x:width, y:0, mode:'relative', transition:transition, sync:true}),
|
||||
new MochiKit.Visual.Opacity(this.getElement('directLoginEditDetail'), {from:1.0, to:0.0, transition:transition, sync:true})
|
||||
], {duration:duration}),
|
||||
// MochiKit.Base.partial(MochiKit.Visual.appear, this.getElement('addDirectLoginButton'), {duration:0.3}),
|
||||
Clipperz.Async.clearResult,
|
||||
MochiKit.Base.partial(MochiKit.Style.hideElement, this.getElement('directLoginEditDetail')),
|
||||
// MochiKit.Base.partial(MochiKit.Style.showElement, this.getElement('directLogins')),
|
||||
MochiKit.Base.partial(MochiKit.Style.setElementDimensions, this.getElement('directLoginsComponentContainer'), {h:MochiKit.Style.getElementDimensions(this.getElement('directLogins'))['h']}),
|
||||
|
||||
MochiKit.Base.method(this, 'enableCardTitleEditing'),
|
||||
MochiKit.Base.method(this.tabPanelController(), 'enable')
|
||||
], {trace:false});
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
__syntaxFix__: "syntax fix"
|
||||
});
|
||||
@@ -0,0 +1,182 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
|
||||
|
||||
Clipperz.PM.UI.Web.Components.CardDialogRecordDirectLoginComponent = function(args) {
|
||||
args = args || {};
|
||||
|
||||
Clipperz.PM.UI.Web.Components.CardDialogRecordDirectLoginComponent.superclass.constructor.apply(this, arguments);
|
||||
|
||||
this._reference = args.reference || Clipperz.Base.exception.raise('MandatoryParameter');
|
||||
this._faviconComponent = null;
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
|
||||
Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.CardDialogRecordDirectLoginComponent, Clipperz.PM.UI.Common.Components.BaseComponent, {
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'toString': function () {
|
||||
return "Clipperz.PM.UI.Web.Components.CardDialogRecordDirectLoginComponent component";
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'reference': function () {
|
||||
return this._reference;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'renderSelf': function() {
|
||||
//console.log(">>> CardDialogRecordDirectLoginComponent.renderSelf");
|
||||
this.append(this.element(), [
|
||||
{tag:'div', cls:'cardDialogRecordDirectLoginComponent_favicon', children:[
|
||||
{tag:'img', cls:'favicon', id:this.getId('favicon')}
|
||||
]},
|
||||
{tag:'div', cls:'cardDialogRecordDirectLoginComponent_label', children:[
|
||||
{tag:'input', id:this.getId('label'), type:'text'}
|
||||
]},
|
||||
{tag:'div', cls:'open', children:[
|
||||
{tag:'span', children:[
|
||||
{tag:'a', href:'open', id:this.getId('open'), html:' '}
|
||||
]}
|
||||
]},
|
||||
{tag:'div', cls:'edit', children:[
|
||||
{tag:'span', children:[
|
||||
{tag:'a', href:'edit', id:this.getId('edit'), html:"edit"}
|
||||
]}
|
||||
]},
|
||||
{tag:'div', cls:'delete', children:[
|
||||
{tag:'span', children:[
|
||||
{tag:'a', href:'delete', id:this.getId('delete'), html:"delete"}
|
||||
]}
|
||||
]}
|
||||
/*
|
||||
{tag:'td', cls:'fieldState'},
|
||||
{tag:'td', cls:'fieldLabel', children:[
|
||||
{tag:'input', cls:'label', id:this.getId('label')}
|
||||
]},
|
||||
{tag:'td', cls:'fieldLock', children:[
|
||||
{tag:'div', cls:'unlocked', id:this.getId('isHidden')}
|
||||
]},
|
||||
{tag:'td', cls:'fieldValue', children:[
|
||||
{tag:'div', cls:'unlocked', id:this.getId('valueWrapper'), children:[
|
||||
{tag:'input', type:'text', cls:'value', id:this.getId('value')}
|
||||
]}
|
||||
]},
|
||||
{tag:'td', cls:'fieldAddDelete', children:[
|
||||
{tag:'div', cls:'delete', children:[
|
||||
{tag:'span', children:[
|
||||
{tag:'a', href:'#', id:this.getId('delete'), html:"delete"}
|
||||
]}
|
||||
]}
|
||||
]}
|
||||
*/
|
||||
]);
|
||||
|
||||
MochiKit.Signal.connect(this.getId('label'), 'onkeyup', MochiKit.Base.partial(MochiKit.Signal.signal, this, 'changedValue'));
|
||||
MochiKit.Signal.connect(this.getId('open'), 'onclick', this, 'openDirectLogin');
|
||||
MochiKit.Signal.connect(this.getId('edit'), 'onclick', this, 'editDirectLogin');
|
||||
MochiKit.Signal.connect(this.getId('delete'), 'onclick', this, 'deleteDirectLogin');
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'shouldShowElementWhileRendering': function () {
|
||||
return false;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'faviconComponent': function () {
|
||||
if (this._faviconComponent == null) {
|
||||
//console.log("created the FAVICON component");
|
||||
this._faviconComponent = new Clipperz.PM.UI.Common.Components.FaviconComponent({element:this.getId('favicon')});
|
||||
}
|
||||
|
||||
return this._faviconComponent;
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'label': function () {
|
||||
return this.getElement('label').value;
|
||||
},
|
||||
|
||||
'setLabel': function (aValue) {
|
||||
this.getElement('label').value = Clipperz.Base.sanitizeString(aValue);
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'favicon': function () {
|
||||
// return this.getElement('favicon').src;
|
||||
return this.faviconComponent().src();
|
||||
},
|
||||
|
||||
'setFavicon': function (aValue) {
|
||||
// this.getElement('favicon').src = Clipperz.Base.sanitizeString(aValue);
|
||||
this.faviconComponent().setSrc(Clipperz.Base.sanitizeString(aValue));
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'openDirectLogin': function (anEvent) {
|
||||
anEvent.preventDefault();
|
||||
|
||||
MochiKit.Signal.signal(this, 'openDirectLogin', this.reference());
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'editDirectLogin': function (anEvent) {
|
||||
anEvent.preventDefault();
|
||||
|
||||
MochiKit.Signal.signal(this, 'editDirectLogin', this.reference());
|
||||
//console.log("EDIT DIRECT LOGIN");
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'deleteDirectLogin': function (anEvent) {
|
||||
anEvent.preventDefault();
|
||||
|
||||
MochiKit.Signal.signal(this, 'deleteDirectLogin', this.reference());
|
||||
//console.log("DELETE DIRECT LOGIN");
|
||||
},
|
||||
|
||||
|
||||
|
||||
//=========================================================================
|
||||
__syntaxFix__: "syntax fix"
|
||||
});
|
||||
@@ -0,0 +1,190 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
|
||||
|
||||
Clipperz.PM.UI.Web.Components.CardDialogRecordFieldComponent = function(args) {
|
||||
args = args || {};
|
||||
|
||||
Clipperz.PM.UI.Web.Components.CardDialogRecordFieldComponent.superclass.constructor.apply(this, arguments);
|
||||
|
||||
this._reference = args.reference || Clipperz.Base.exception.raise('MandatoryParameter');
|
||||
this._actionType = null;
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
|
||||
Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.CardDialogRecordFieldComponent, Clipperz.PM.UI.Common.Components.BaseComponent, {
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'toString': function () {
|
||||
return "Clipperz.PM.UI.Web.Components.CardDialogRecordFieldComponent component";
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'renderSelf': function() {
|
||||
this.append(this.element(), [
|
||||
{tag:'td', cls:'fieldState'},
|
||||
{tag:'td', cls:'fieldLabel', children:[
|
||||
{tag:'input', cls:'label', id:this.getId('label')}
|
||||
]},
|
||||
{tag:'td', cls:'fieldLock', children:[
|
||||
{tag:'div', cls:'unlocked', id:this.getId('isHidden')}
|
||||
]},
|
||||
{tag:'td', cls:'fieldValue', children:[
|
||||
{tag:'div', cls:'unlocked', id:this.getId('valueWrapper'), children:[
|
||||
{tag:'input', type:'text', cls:'value', id:this.getId('value')}
|
||||
]}
|
||||
]},
|
||||
{tag:'td', cls:'fieldAction', children:[
|
||||
{tag:'a', href:'#', id:this.getId('actionLink'), html:' '}
|
||||
]},
|
||||
{tag:'td', cls:'fieldAddDelete', children:[
|
||||
{tag:'div', cls:'delete', children:[
|
||||
{tag:'span', children:[
|
||||
{tag:'a', href:'#', id:this.getId('delete'), html:"delete"}
|
||||
]}
|
||||
]}
|
||||
]}
|
||||
]);
|
||||
|
||||
MochiKit.Signal.connect(this.getId('label'), 'onkeyup', MochiKit.Base.partial(MochiKit.Signal.signal, this, 'changedValue'));
|
||||
MochiKit.Signal.connect(this.getId('isHidden'), 'onclick', this, 'toggleIsHidden');
|
||||
MochiKit.Signal.connect(this.getId('value'), 'onkeyup', MochiKit.Base.partial(MochiKit.Signal.signal, this, 'changedValue'));
|
||||
MochiKit.Signal.connect(this.getId('actionLink'), 'onclick', this, 'handleActionLink');
|
||||
MochiKit.Signal.connect(this.getId('delete'), 'onclick', this, 'deleteField');
|
||||
// MochiKit.Signal.connect(this.getId('delete'), 'onclick', MochiKit.Base.partial(MochiKit.Signal.signal, this, 'deleteField', this.reference()));
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'shouldShowElementWhileRendering': function () {
|
||||
return false;
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'reference': function () {
|
||||
return this._reference;
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'label': function () {
|
||||
return this.getElement('label').value;
|
||||
},
|
||||
|
||||
'setLabel': function (aValue) {
|
||||
// this.getElement('label').value = Clipperz.Base.sanitizeString(aValue);
|
||||
this.getElement('label').value = aValue;
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'value': function () {
|
||||
return this.getElement('value').value;
|
||||
},
|
||||
|
||||
'setValue': function (aValue) {
|
||||
// this.getElement('value').value = Clipperz.Base.sanitizeString(aValue);
|
||||
this.getElement('value').value = aValue;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'actionType': function () {
|
||||
return this._actionType;
|
||||
},
|
||||
|
||||
'setActionType': function (anActionType) {
|
||||
this._actionType = anActionType;
|
||||
|
||||
switch (this._actionType) {
|
||||
case 'NONE':
|
||||
MochiKit.Style.hideElement(this.getId('actionLink'));
|
||||
MochiKit.DOM.setElementClass(this.getId('actionLink'), '');
|
||||
break;
|
||||
case 'URL':
|
||||
MochiKit.Style.showElement(this.getId('actionLink'));
|
||||
MochiKit.DOM.setElementClass(this.getId('actionLink'), 'url');
|
||||
break;
|
||||
case 'EMAIL':
|
||||
MochiKit.Style.showElement(this.getId('actionLink'));
|
||||
MochiKit.DOM.setElementClass(this.getId('actionLink'), 'email');
|
||||
break;
|
||||
case 'PASSWORD':
|
||||
MochiKit.Style.showElement(this.getId('actionLink'));
|
||||
MochiKit.DOM.setElementClass(this.getId('actionLink'), 'password');
|
||||
break;
|
||||
}
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'isHidden': function () {
|
||||
// return this.getElement('value').value;
|
||||
return MochiKit.DOM.hasElementClass(this.getElement('isHidden'), 'locked');
|
||||
},
|
||||
|
||||
'setIsHidden': function (aValue) {
|
||||
// this.getElement('value').value = Clipperz.Base.sanitizeString(aValue);
|
||||
MochiKit.DOM.setElementClass(this.getElement('isHidden'), (aValue ? 'locked': 'unlocked'));
|
||||
MochiKit.DOM.setElementClass(this.getElement('valueWrapper'), (aValue ? 'locked': 'unlocked'));
|
||||
},
|
||||
|
||||
'toggleIsHidden': function (anEvent) {
|
||||
anEvent.preventDefault();
|
||||
|
||||
this.setIsHidden(! this.isHidden());
|
||||
MochiKit.Signal.signal(this, 'changedValue');
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'handleActionLink': function (anEvent) {
|
||||
anEvent.preventDefault();
|
||||
|
||||
//console.log("ACTION LINK - " + this.actionType());
|
||||
MochiKit.Signal.signal(this, 'performAction', this.reference(), anEvent.target());
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'deleteField': function (anEvent) {
|
||||
anEvent.preventDefault();
|
||||
|
||||
MochiKit.Signal.signal(this, 'deleteField', this.reference());
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
__syntaxFix__: "syntax fix"
|
||||
});
|
||||
203
frontend/gamma/js/Clipperz/PM/UI/Web/Components/ColumnManager.js
Normal file
203
frontend/gamma/js/Clipperz/PM/UI/Web/Components/ColumnManager.js
Normal file
@@ -0,0 +1,203 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
|
||||
|
||||
//#############################################################################
|
||||
|
||||
Clipperz.PM.UI.Web.Components.ColumnManager = function(args) {
|
||||
args = args || {};
|
||||
Clipperz.PM.UI.Web.Components.ColumnManager.superclass.constructor.call(this, args);
|
||||
|
||||
this._name = args.name || Clipperz.Base.exception.raise('MandatoryParameter');
|
||||
this._selector = args.selector || Clipperz.Base.exception.raise('MandatoryParameter');;
|
||||
this._label = args.label || null;
|
||||
this._isSortable = args.sortable || false;
|
||||
this._comparator = args.comparator || null;
|
||||
this._sorted = args.sorted || 'UNSORTED'; // 'ASCENDING' | 'DESCENDING' | 'UNSORTED'
|
||||
this._cssClass = args.cssClass || '';
|
||||
|
||||
this._signalIdentifiers = [];
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
|
||||
Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.ColumnManager, Clipperz.PM.UI.Common.Components.BaseComponent, {
|
||||
|
||||
'toString': function () {
|
||||
return "Clipperz.PM.UI.Web.Components.ColumnManager - " + this._name;
|
||||
},
|
||||
|
||||
'name': function () {
|
||||
return this._name;
|
||||
},
|
||||
|
||||
'label': function () {
|
||||
return this._label;
|
||||
},
|
||||
|
||||
'selector': function () {
|
||||
return this._selector;
|
||||
},
|
||||
|
||||
'comparator': function() {
|
||||
return this._comparator;
|
||||
},
|
||||
|
||||
'cssClass': function() {
|
||||
return this._cssClass;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'isSortable': function () {
|
||||
return this._isSortable;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'sorted': function () {
|
||||
return this._sorted;
|
||||
},
|
||||
|
||||
'isSorted': function () {
|
||||
return (this.sorted() != 'UNSORTED');
|
||||
},
|
||||
|
||||
'setSorted': function(aValue) {
|
||||
this._sorted = aValue;
|
||||
this.updateSortIcon();
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'signalIdentifiers': function () {
|
||||
return this._signalIdentifiers;
|
||||
},
|
||||
|
||||
'resetSignalIdentifiers': function () {
|
||||
this._signalIdentifiers = [];
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'disconnectRowsSignals': function () {
|
||||
MochiKit.Base.map(MochiKit.Signal.disconnect, this.signalIdentifiers());
|
||||
this.resetSignalIdentifiers();
|
||||
},
|
||||
|
||||
'connectEvent': function () {
|
||||
var ident;
|
||||
|
||||
ident = MochiKit.Signal.connect.apply(null, arguments);
|
||||
this.signalIdentifiers().push(ident);
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'renderHeader': function(aTRElement) {
|
||||
var thElement;
|
||||
|
||||
thElement = Clipperz.DOM.Helper.append(aTRElement, {tag:'th', cls:(this.cssClass() + 'TH'), id:this.getId('sortLink'), children:[
|
||||
{tag:'span', html:this.label() ? this.label() : ' '}
|
||||
]});
|
||||
|
||||
if (this.isSortable()) {
|
||||
Clipperz.DOM.Helper.append(thElement, {tag:'span', cls:'sortable', children:[
|
||||
{tag:'a', href:'#'/*, id:this.getId('sortLink')*/, html:' '}
|
||||
]});
|
||||
|
||||
MochiKit.DOM.addElementClass(thElement, 'sortable');
|
||||
MochiKit.Signal.connect(thElement, 'onclick', this, 'handleClickOnSortingCriteria');
|
||||
};
|
||||
|
||||
this.updateSortIcon();
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'toggleSorting': function () {
|
||||
var result;
|
||||
switch (this.sorted()) {
|
||||
case 'UNSORTED':
|
||||
result = 'ASCENDING';
|
||||
break;
|
||||
case 'ASCENDING':
|
||||
result = 'DESCENDING';
|
||||
break;
|
||||
case 'DESCENDING':
|
||||
result = 'ASCENDING';
|
||||
break;
|
||||
default:
|
||||
result = 'UNSORTED';
|
||||
break;
|
||||
}
|
||||
|
||||
this.setSorted(result);
|
||||
|
||||
return result;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'sortElementClass': function () {
|
||||
return this.sorted().toLowerCase();
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'updateSortIcon': function () {
|
||||
if (this.isSortable()) {
|
||||
MochiKit.DOM.removeElementClass(this.getId('sortLink'), 'ascending');
|
||||
MochiKit.DOM.removeElementClass(this.getId('sortLink'), 'descending');
|
||||
MochiKit.DOM.removeElementClass(this.getId('sortLink'), 'unsorted');
|
||||
|
||||
MochiKit.DOM.addElementClass(this.getId('sortLink'), this.sortElementClass());
|
||||
}
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'renderCell': function(aRowElement, anObject) {
|
||||
Clipperz.DOM.Helper.append(aRowElement, {tag:'td', cls:this.cssClass(), children:[{tag:'span', html:anObject[this.name()]}]});
|
||||
},
|
||||
|
||||
//-----------------------------------------------------
|
||||
|
||||
'handleClickOnSortingCriteria': function (anEvent) {
|
||||
anEvent.preventDefault();
|
||||
MochiKit.Signal.signal(this, 'sort', this);
|
||||
},
|
||||
|
||||
//-----------------------------------------------------
|
||||
'__syntax_fix__' : 'syntax fix'
|
||||
|
||||
});
|
||||
|
||||
@@ -0,0 +1,71 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
|
||||
|
||||
Clipperz.PM.UI.Web.Components.CreateNewCardSplashComponent = function(args) {
|
||||
args = args || {};
|
||||
|
||||
Clipperz.PM.UI.Web.Components.CreateNewCardSplashComponent.superclass.constructor.apply(this, arguments);
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
|
||||
Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.CreateNewCardSplashComponent, Clipperz.PM.UI.Common.Components.BaseComponent, {
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'toString': function () {
|
||||
return "Clipperz.PM.UI.Web.Components.CreateNewCardSplashComponent component";
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'renderSelf': function() {
|
||||
this.append(this.element(), [
|
||||
{tag:'div', cls:'createNewCardSplash', id:this.getId('button'), children:[
|
||||
{tag:'span', html:"Create New Card"}
|
||||
]}
|
||||
]);
|
||||
|
||||
MochiKit.Signal.connect(this.getElement('button'), 'onclick', this, 'handleClick');
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'handleClick': function (anEvent) {
|
||||
anEvent.preventDefault();
|
||||
MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'addCard', this.element());
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
__syntaxFix__: "syntax fix"
|
||||
});
|
||||
111
frontend/gamma/js/Clipperz/PM/UI/Web/Components/DataPanel.js
Normal file
111
frontend/gamma/js/Clipperz/PM/UI/Web/Components/DataPanel.js
Normal file
@@ -0,0 +1,111 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
|
||||
|
||||
Clipperz.PM.UI.Web.Components.DataPanel = function(args) {
|
||||
args = args || {};
|
||||
|
||||
Clipperz.PM.UI.Web.Components.DataPanel.superclass.constructor.apply(this, arguments);
|
||||
|
||||
this._initiallySelectedTab = args.selected || 'OFFLINE_COPY';
|
||||
this._tabPanelControllerConfiguration = {
|
||||
'OFFLINE_COPY': {
|
||||
tab: 'offlineCopyTab',
|
||||
panel: 'offlineCopyPanel'
|
||||
},
|
||||
'SHARING': {
|
||||
tab: 'sharingTab',
|
||||
panel: 'sharingPanel'
|
||||
},
|
||||
'IMPORT': {
|
||||
tab: 'importTab',
|
||||
panel: 'importPanel'
|
||||
},
|
||||
'EXPORT': {
|
||||
tab: 'exportTab',
|
||||
panel: 'exportPanel'
|
||||
}
|
||||
};
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
|
||||
Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DataPanel, Clipperz.PM.UI.Common.Components.TabPanelComponent, {
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'toString': function () {
|
||||
return "Clipperz.PM.UI.Web.Components.DataPanel component";
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'renderSelf': function(/*aContainer, aPosition*/) {
|
||||
this.append(this.element(), [
|
||||
{tag:'div', cls:'header', children:[
|
||||
{tag:'div', cls:'subPanelTabs', children:[
|
||||
{tag:'ul', children:[
|
||||
{tag:'li', id:this.getId('offlineCopyTab'), children:[{tag:'a', href:'#', html:'Offline copy'}], cls:'first'},
|
||||
{tag:'li', id:this.getId('sharingTab'), children:[{tag:'a', href:'#', html:'Sharing'}]},
|
||||
{tag:'li', id:this.getId('importTab'), children:[{tag:'a', href:'#', html:'Import'}]},
|
||||
{tag:'li', id:this.getId('exportTab'), children:[{tag:'a', href:'#', html:'Export'}]}
|
||||
]}
|
||||
]}
|
||||
]},
|
||||
{tag:'div', cls:'body', children:[
|
||||
{tag:'div', cls:'accountPanel', children:[
|
||||
{tag:'div', cls:'subPanelContent', children:[
|
||||
{tag:'ul', children:[
|
||||
{tag:'li', id:this.getId('offlineCopyPanel'), children:[
|
||||
{tag:'h3', html:"Offline copy"}
|
||||
]},
|
||||
{tag:'li', id:this.getId('sharingPanel'), children:[
|
||||
{tag:'h3', html:"Sharing"}
|
||||
]},
|
||||
{tag:'li', id:this.getId('importPanel'), children:[
|
||||
{tag:'h3', html:"Import"}
|
||||
]},
|
||||
{tag:'li', id:this.getId('exportPanel'), children:[
|
||||
{tag:'h3', html:"Export"}
|
||||
]}
|
||||
]}
|
||||
]}
|
||||
]}
|
||||
]},
|
||||
{tag:'div', cls:'footer'}
|
||||
]);
|
||||
|
||||
this.tabPanelController().setup({selected:this.initiallySelectedTab()});
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
__syntaxFix__: "syntax fix"
|
||||
});
|
||||
@@ -0,0 +1,72 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
|
||||
|
||||
//#############################################################################
|
||||
|
||||
Clipperz.PM.UI.Web.Components.DateColumnManager = function(args) {
|
||||
args = args || {};
|
||||
Clipperz.PM.UI.Web.Components.DateColumnManager.superclass.constructor.call(this, args);
|
||||
|
||||
this._format = args.format || Clipperz.Base.exception.raise('MandatoryParameter');
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
|
||||
Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DateColumnManager, Clipperz.PM.UI.Web.Components.ColumnManager, {
|
||||
|
||||
'toString': function () {
|
||||
return "Clipperz.PM.UI.Web.Components.DateColumnManager component";
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'format': function () {
|
||||
return this._format;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'renderCell': function(aRowElement, anObject) {
|
||||
Clipperz.DOM.Helper.append(aRowElement, {tag:'td', cls:this.cssClass(), children:[
|
||||
{
|
||||
tag:'span',
|
||||
title:Clipperz.PM.Date.formatDateWithTemplate(anObject[this.name()], "D, d M Y H:i:s"),
|
||||
html:Clipperz.PM.Date.formatDateWithTemplate(anObject[this.name()], this.format())
|
||||
}
|
||||
]});
|
||||
},
|
||||
|
||||
//-----------------------------------------------------
|
||||
|
||||
'__syntax_fix__' : 'syntax fix'
|
||||
});
|
||||
|
||||
@@ -0,0 +1,70 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
|
||||
|
||||
//#############################################################################
|
||||
|
||||
Clipperz.PM.UI.Web.Components.DeleteObjectColumnManager = function(args) {
|
||||
args = args || {};
|
||||
Clipperz.PM.UI.Web.Components.DeleteObjectColumnManager.superclass.constructor.call(this, args);
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
|
||||
Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DeleteObjectColumnManager, Clipperz.PM.UI.Web.Components.LinkColumnManager, {
|
||||
|
||||
'toString': function () {
|
||||
return "Clipperz.PM.UI.Web.Components.DeleteObjectColumnManager component";
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'renderCell': function(aRowElement, anObject) {
|
||||
var tdElement;
|
||||
var linkElement;
|
||||
|
||||
tdElement = Clipperz.DOM.Helper.append(aRowElement, {tag:'td', cls:this.cssClass(), children:[
|
||||
{tag:'div', cls:'delete', children:[
|
||||
{tag:'span', children:[
|
||||
{tag:'a', href:'delete', html:"delete"}
|
||||
]}
|
||||
]}
|
||||
]});
|
||||
|
||||
linkElement = MochiKit.DOM.getFirstElementByTagAndClassName('a', null, tdElement);
|
||||
// MochiKit.Signal.connect(linkElement, 'onclick', MochiKit.Base.method(this, 'handleLinkClick', anObject['_rowObject']));
|
||||
this.connectEvent(linkElement, 'onclick', MochiKit.Base.method(this, 'handleLinkClick', anObject['_rowObject']));
|
||||
},
|
||||
|
||||
//-----------------------------------------------------
|
||||
'__syntax_fix__' : 'syntax fix'
|
||||
});
|
||||
|
||||
@@ -0,0 +1,90 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
/*
|
||||
Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
|
||||
|
||||
//#############################################################################
|
||||
|
||||
Clipperz.PM.UI.Web.Components.DirectLoginColumnManager = function(args) {
|
||||
args = args || {};
|
||||
Clipperz.PM.UI.Web.Components.DirectLoginColumnManager.superclass.constructor.call(this, args);
|
||||
|
||||
this._actionMethod = args.actionMethod || null;
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
|
||||
Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DirectLoginColumnManager, Clipperz.PM.UI.Web.Components.ColumnManager, {
|
||||
|
||||
'toString': function () {
|
||||
return "Clipperz.PM.UI.Web.Components.DateColumnManager component";
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'actionMethod': function () {
|
||||
return this._actionMethod;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'renderCell': function(aRowElement, anObject) {
|
||||
var tdElement;
|
||||
var linkElement;
|
||||
|
||||
tdElement = Clipperz.DOM.Helper.append(aRowElement, {tag:'td', cls:this.cssClass(), children:[
|
||||
{tag:'div', cls:'directLogin_directLogin', children:[
|
||||
{tag:'div', cls:'directLogin_directLogin_body', children:[
|
||||
{tag:'a', href:'#', html:anObject[this.name()]}
|
||||
]}
|
||||
]}
|
||||
]});
|
||||
|
||||
linkElement = MochiKit.DOM.getFirstElementByTagAndClassName('a', null, tdElement);
|
||||
// MochiKit.Signal.connect(linkElement, 'onclick', MochiKit.Base.method(this, 'handleLinkClick', anObject['_rowObject']));
|
||||
this.connectEvent(linkElement, 'onclick', MochiKit.Base.method(this, 'handleLinkClick', anObject['_rowObject']));
|
||||
},
|
||||
|
||||
//-----------------------------------------------------
|
||||
|
||||
'handleLinkClick': function (anObject, anEvent) {
|
||||
anEvent.preventDefault();
|
||||
|
||||
if (this.actionMethod() != null) {
|
||||
this.actionMethod()(anObject, anEvent);
|
||||
}
|
||||
},
|
||||
|
||||
//-----------------------------------------------------
|
||||
'__syntax_fix__' : 'syntax fix'
|
||||
});
|
||||
|
||||
*/
|
||||
@@ -0,0 +1,168 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
|
||||
|
||||
Clipperz.PM.UI.Web.Components.DirectLoginEditingBindingComponent = function(args) {
|
||||
args = args || {};
|
||||
|
||||
Clipperz.PM.UI.Web.Components.DirectLoginEditingBindingComponent.superclass.constructor.apply(this, arguments);
|
||||
|
||||
this._formFieldName = args.formFieldName || Clipperz.Base.exception.raise('MandatoryParameter');
|
||||
this._fields = args.fields || Clipperz.Base.exception.raise('MandatoryParameter');
|
||||
this._initiallySelectedFieldKey = args.selectedFieldKey || null;
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
|
||||
Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DirectLoginEditingBindingComponent, Clipperz.PM.UI.Common.Components.BaseComponent, {
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'toString': function () {
|
||||
return "Clipperz.PM.UI.Web.Components.DirectLoginEditingBindingComponent component";
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'formFieldName': function () {
|
||||
return this._formFieldName;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'fields': function () {
|
||||
return this._fields;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'selectedValue': function () {
|
||||
var result;
|
||||
|
||||
result = this.getElement('select').value;
|
||||
|
||||
if (result == '---') {
|
||||
result = null;
|
||||
}
|
||||
|
||||
return result;
|
||||
},
|
||||
|
||||
'initiallySelectedFieldKey': function () {
|
||||
return this._initiallySelectedFieldKey;
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'renderSelf': function() {
|
||||
var initiallySelectedOptions;
|
||||
|
||||
this.append(this.element(), {tag:'div', id:this.getId('div'), cls:'binding', children:[
|
||||
{tag:'span', cls:'formFieldName', html:this.formFieldName()},
|
||||
{tag:'span', cls:'fieldLock', id:this.getId('isHidden'), children:[
|
||||
{tag:'a', href:'#', id:this.getId('showHide'), html:' '}
|
||||
]},
|
||||
{tag:'input', id:this.getId('input'), cls:'formFieldExampleValue', disabled:true, value:''},
|
||||
{tag:'select', name:this.formFieldName(), id:this.getId('select'), cls:'formFieldMatchinCardField', children:
|
||||
MochiKit.Base.flattenArguments(
|
||||
{tag:'option', value:'---', html:"---"},
|
||||
MochiKit.Base.map(
|
||||
MochiKit.Base.bind(function (aField) { return {tag:'option', value:aField['reference'], html:aField['label']}; }, this),
|
||||
this.fields()
|
||||
)
|
||||
)
|
||||
}
|
||||
]});
|
||||
|
||||
MochiKit.Signal.connect(this.getElement('select'), 'onchange', this, 'handleSelectChange');
|
||||
MochiKit.Signal.connect(this.getElement('showHide'), 'onclick', this, 'handleShowHide');
|
||||
|
||||
if (! MochiKit.Base.isUndefinedOrNull(this.initiallySelectedFieldKey())) {
|
||||
initiallySelectedOptions = MochiKit.Selector.findChildElements(this.element(), ['option[value=' + this.initiallySelectedFieldKey() + ']']);
|
||||
if (initiallySelectedOptions.length == 1) {
|
||||
MochiKit.DOM.updateNodeAttributes(initiallySelectedOptions[0], {selected:true});
|
||||
this.handleSelectChange();
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'setFieldValue': function (aValue) {
|
||||
this.getElement('input').value = aValue;
|
||||
},
|
||||
|
||||
'isHidden': function () {
|
||||
return MochiKit.DOM.hasElementClass(this.getElement('div'), 'locked');
|
||||
},
|
||||
|
||||
'setIsHidden': function (aValue) {
|
||||
if (aValue == true) {
|
||||
MochiKit.DOM.addElementClass(this.getElement('div'), 'locked');
|
||||
MochiKit.DOM.addElementClass(this.getElement('div'), 'showLocked');
|
||||
} else {
|
||||
MochiKit.DOM.removeElementClass(this.getElement('div'), 'locked');
|
||||
MochiKit.DOM.removeElementClass(this.getElement('div'), 'showLocked');
|
||||
}
|
||||
},
|
||||
|
||||
'isShowLocked': function () {
|
||||
return MochiKit.DOM.hasElementClass(this.getElement('div'), 'showLocked');
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'handleSelectChange': function (anEvent) {
|
||||
// this.getElement('input').value = this.valueOfField(anEvent.src().value);
|
||||
MochiKit.Signal.signal(this, 'bindChange', this);
|
||||
},
|
||||
|
||||
'handleShowHide': function (anEvent) {
|
||||
anEvent.preventDefault();
|
||||
|
||||
if (this.isShowLocked()) {
|
||||
MochiKit.DOM.removeElementClass(this.getElement('div'), 'showLocked');
|
||||
} else {
|
||||
MochiKit.DOM.addElementClass(this.getElement('div'), 'showLocked');
|
||||
}
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
__syntaxFix__: "syntax fix"
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,481 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
|
||||
|
||||
Clipperz.PM.UI.Web.Components.DirectLoginEditingComponent = function(args) {
|
||||
args = args || {};
|
||||
|
||||
Clipperz.PM.UI.Web.Components.DirectLoginEditingComponent.superclass.constructor.apply(this, arguments);
|
||||
|
||||
this._tabPanelController = null;
|
||||
|
||||
this._initiallySelectedTab = args.selected || 'TYPE';
|
||||
this._tabPanelControllerConfiguration = {
|
||||
'LABEL': {
|
||||
tab: 'labelTab',
|
||||
panel: 'labelTabpanel'
|
||||
},
|
||||
'TYPE': {
|
||||
tab: 'typeTab',
|
||||
panel: 'typeTabpanel'
|
||||
},
|
||||
'CONFIGURATION': {
|
||||
tab: 'configurationTab',
|
||||
panel: 'configurationTabpanel'
|
||||
},
|
||||
'BINDINGS': {
|
||||
tab: 'bindingsTab',
|
||||
panel: 'bindingsTabpanel'
|
||||
},
|
||||
'FAVICON': {
|
||||
tab: 'faviconTab',
|
||||
panel: 'faviconTabpanel'
|
||||
},
|
||||
'DONE': {
|
||||
tab: 'doneTab',
|
||||
panel: 'doneTabpanel'
|
||||
}
|
||||
};
|
||||
|
||||
this._directLoginReference = null;
|
||||
|
||||
this._directLoginFavicon = null;
|
||||
|
||||
this._updateFaviconCounter = 0;
|
||||
this._faviconComponent = null;
|
||||
|
||||
this._bindingComponents = [];
|
||||
this._formValueComponents = [];
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
|
||||
//Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DirectLoginEditingComponent, Clipperz.PM.UI.Common.Components.BaseComponent, {
|
||||
Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DirectLoginEditingComponent, Clipperz.PM.UI.Common.Components.TabPanelComponent, {
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'toString': function () {
|
||||
return "Clipperz.PM.UI.Web.Components.DirectLoginEditingComponent component";
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'directLoginReference': function () {
|
||||
return this._directLoginReference;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'setDirectLoginReference': function (aDirectLoginReference) {
|
||||
this._directLoginReference = aDirectLoginReference;
|
||||
|
||||
return this._directLoginReference;
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'label': function () {
|
||||
return this.getElement('label').value
|
||||
},
|
||||
|
||||
'setLabel': function (aValue) {
|
||||
//console.log("##> LABEL: " + aValue);
|
||||
this.getElement('label').value = (aValue ? aValue : '');
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'favicon': function () {
|
||||
return this.getElement('faviconURL').value;
|
||||
},
|
||||
|
||||
'setFavicon': function (aValue) {
|
||||
var regexp;
|
||||
var displayValue;
|
||||
|
||||
regexp = new RegExp('^data\:\/\/.*', 'i');
|
||||
if (regexp.test(aValue)) {
|
||||
displayValue = ''
|
||||
} else {
|
||||
displayValue = (aValue ? aValue : '');
|
||||
}
|
||||
|
||||
this.getElement('faviconURL').value = displayValue;
|
||||
this.faviconComponent().setSrc(aValue);
|
||||
},
|
||||
|
||||
// 'setFaviconData': function (aValue) {
|
||||
// this.getElement('faviconIcon').src = aValue;
|
||||
// },
|
||||
|
||||
'directLoginFavicon': function () {
|
||||
return this._directLoginFavicon;
|
||||
},
|
||||
|
||||
'setDirectLoginFavicon': function (aValue) {
|
||||
this._directLoginFavicon = aValue;
|
||||
this.setFavicon(aValue);
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'bookmarkletConfiguration': function () {
|
||||
return this.getElement('bookmarkletConfiguration').value
|
||||
},
|
||||
|
||||
'setBookmarkletConfiguration': function (aValue) {
|
||||
this.getElement('bookmarkletConfiguration').value = aValue;
|
||||
},
|
||||
|
||||
'highlightConfigurationSyntaxError': function () {
|
||||
MochiKit.DOM.addElementClass(this.getElement('bookmarkletConfiguration'), 'error');
|
||||
},
|
||||
|
||||
'removeHighlightConfigurationSyntaxError': function () {
|
||||
MochiKit.DOM.removeElementClass(this.getElement('bookmarkletConfiguration'), 'error');
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'disableAllPanels': function () {
|
||||
this.getElement('label').disabled = true;
|
||||
MochiKit.DOM.addElementClass(this.getElement('label').parentNode, 'disabled');
|
||||
|
||||
this.tabPanelController().selectTab(null);
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
// 'disableLabelField': function () {
|
||||
// this.getElement('label').disabled = true;
|
||||
// MochiKit.DOM.addElementClass(this.getElement('label').parentNode, 'disabled');
|
||||
// },
|
||||
|
||||
'enableLabelField': function () {
|
||||
this.getElement('label').disabled = false;
|
||||
MochiKit.DOM.removeElementClass(this.getElement('label').parentNode, 'disabled');
|
||||
this.tabPanelController().selectTab('LABEL');
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
// 'disableTypeField': function () {
|
||||
// this.tabPanelController().selectTab(null);
|
||||
// },
|
||||
|
||||
'enableTypeField': function () {
|
||||
this.tabPanelController().selectTab('TYPE');
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
// 'disableConfigurationField': function () {
|
||||
// this.tabPanelController().selectTab(null);
|
||||
// },
|
||||
|
||||
'enableConfigurationField': function () {
|
||||
this.tabPanelController().selectTab('CONFIGURATION');
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
// 'disableBindingFields': function () {
|
||||
// this.tabPanelController().selectTab(null);
|
||||
// },
|
||||
|
||||
'enableBindingFields': function () {
|
||||
this.tabPanelController().selectTab('BINDINGS');
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
// 'disableFaviconField': function () {
|
||||
// this.tabPanelController().selectTab(null);
|
||||
// },
|
||||
|
||||
'enableFaviconField': function () {
|
||||
this.tabPanelController().selectTab('FAVICON');
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'enableDonePanel': function () {
|
||||
this.tabPanelController().selectTab('DONE');
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'shouldShowElementWhileRendering': function() {
|
||||
return false;
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'faviconComponent': function () {
|
||||
if (this._faviconComponent == null) {
|
||||
this._faviconComponent = new Clipperz.PM.UI.Common.Components.FaviconComponent({element:this.getId('favicon')});
|
||||
}
|
||||
|
||||
return this._faviconComponent;
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'tabPanelController': function () {
|
||||
if (this._tabPanelController == null) {
|
||||
this._tabPanelController = new Clipperz.PM.UI.Common.Controllers.TabPanelController({
|
||||
component:this,
|
||||
configuration:this._tabPanelControllerConfiguration
|
||||
});
|
||||
|
||||
MochiKit.Signal.connect(this._tabPanelController, 'tabSelected', this, 'handleTabSelected')
|
||||
}
|
||||
|
||||
return this._tabPanelController;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'renderSelf': function() {
|
||||
var bookmarkletComponent;
|
||||
|
||||
this.append(this.element(), {tag:'div', cls:'directLoginEditing', id:this.getId('panel'), children: [
|
||||
// {tag:'div', cls:'back', children:[
|
||||
// {tag:'a', href:'#', id:this.getId('back'), html:" "}
|
||||
// ]},
|
||||
{tag:'form', id:this.getId('form'), cls:'directLoginEditingForm', children:[
|
||||
{tag:'div', cls:'title', children:[
|
||||
{tag:'img', id:this.getId('favicon'), cls:'favicon'},
|
||||
{tag:'input', type:'text', id:this.getId('label')} //,
|
||||
// {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.DirectLoginWizard.LABEL.description')}]},
|
||||
]},
|
||||
{tag:'div', cls:'tabContainer', children:[
|
||||
{tag:'ul', cls:'tabs', children:[
|
||||
{tag:'li', id:this.getId('labelTab'), children:[{tag:'span', html:"label"}]},
|
||||
{tag:'li', id:this.getId('typeTab'), children:[{tag:'span', html:"type"}]},
|
||||
{tag:'li', id:this.getId('configurationTab'), children:[{tag:'span', html:"configuration"}]},
|
||||
{tag:'li', id:this.getId('bindingsTab'), children:[{tag:'span', html:"bindings"}]},
|
||||
{tag:'li', id:this.getId('faviconTab'), children:[{tag:'span', html:"favicon"}]},
|
||||
{tag:'li', id:this.getId('doneTab'), children:[{tag:'span', html:"done"}]}
|
||||
]},
|
||||
{tag:'ul', cls:'tabPanels', children:[
|
||||
{tag:'li', id:this.getId('labelTabpanel'), cls:'tabPanel label', children:[
|
||||
{tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.DirectLoginWizard.LABEL.description')}]}
|
||||
]},
|
||||
{tag:'li', id:this.getId('typeTabpanel'), cls:'tabPanel type', children:[
|
||||
{tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.DirectLoginWizard.TYPE.description')}]},
|
||||
{tag:'h2', html:"type"}
|
||||
]},
|
||||
{tag:'li', id:this.getId('configurationTabpanel'), cls:'tabPanel configuration', children:[
|
||||
{tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.DirectLoginWizard.CONFIGURATION.description')}]},
|
||||
{tag:'div', cls:'bookmarkletConfigurationWrapper', children:[
|
||||
{tag:'textarea', id:this.getId('bookmarkletConfiguration'), value:""},
|
||||
// {tag:'div', cls:'bookmarkletComponentWrapper', children:[{tag:'div', id:this.getId('bookmarkletComponent'), cls:'bookmarkletComponent'}]}
|
||||
{tag:'div', id:this.getId('bookmarkletComponent'), cls:'bookmarkletComponent'}
|
||||
]}
|
||||
]},
|
||||
{tag:'li', id:this.getId('bindingsTabpanel'), cls:'tabPanel bindings', children:[
|
||||
{tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.DirectLoginWizard.BINDINGS.description')}]},
|
||||
{tag:'div', cls:'bindings', id:this.getId('bindings'), children:[]},
|
||||
{tag:'div', cls:'formValues', id:this.getId('formValues'), children:[]}
|
||||
]},
|
||||
{tag:'li', id:this.getId('faviconTabpanel'), cls:'tabPanel favicon', children:[
|
||||
{tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.DirectLoginWizard.FAVICON.description')}]},
|
||||
{tag:'div', cls:'favicon', children:[
|
||||
{tag:'input', type:'text', id:this.getId('faviconURL')}
|
||||
]}
|
||||
]},
|
||||
{tag:'li', id:this.getId('doneTabpanel'), cls:'tabPanel done', children:[
|
||||
{tag:'div', cls:'wizardStepDescription', children:[{tag:'span', id:this.getId('doneDescription')/*, html:Clipperz.PM.Strings.getValue('Wizards.DirectLoginWizard.DONE.description')*/}]}
|
||||
]}
|
||||
]}
|
||||
]}
|
||||
]},
|
||||
{tag:'div', cls:'clear'}
|
||||
]});
|
||||
|
||||
bookmarkletComponent = new Clipperz.PM.UI.Web.Components.BookmarkletComponent({element:this.getElement('bookmarkletComponent')});
|
||||
bookmarkletComponent.render();
|
||||
|
||||
this.tabPanelController().setup(/*{selected:this.initiallySelectedTab()}*/);
|
||||
|
||||
MochiKit.Signal.connect(this.getId('label'), 'onchange', this, 'changedValue');
|
||||
MochiKit.Signal.connect(this.getId('label'), 'onkeyup', this, 'changedValue');
|
||||
|
||||
MochiKit.Signal.connect(this.getId('bookmarkletConfiguration'), 'onchange', this, 'changedValue');
|
||||
MochiKit.Signal.connect(this.getId('bookmarkletConfiguration'), 'onkeyup', this, 'changedValue');
|
||||
|
||||
MochiKit.Signal.connect(this.getId('faviconURL'), 'onchange', this, 'changedValue');
|
||||
MochiKit.Signal.connect(this.getId('faviconURL'), 'onkeyup', this, 'changedValue');
|
||||
|
||||
MochiKit.Signal.connect(this.getId('panel'), 'onkeydown',this, 'handleKeyEvent');
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'handleTabSelected': function (aSelectedTab) {
|
||||
switch (aSelectedTab) {
|
||||
case 'DETAILS':
|
||||
break;
|
||||
case 'DIRECT_LOGINS':
|
||||
MochiKit.Style.hideElement(this.getElement('backToDirectLoginList'));
|
||||
break;
|
||||
case 'SHARING':
|
||||
break;
|
||||
}
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'incrementUpdateFaviconCounter': function () {
|
||||
this._updateFaviconCounter ++;
|
||||
},
|
||||
|
||||
'decrementUpdateFaviconCounter': function () {
|
||||
this._updateFaviconCounter --;
|
||||
},
|
||||
|
||||
'updateFaviconCounter': function () {
|
||||
return this._updateFaviconCounter;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'updateFavicon': function () {
|
||||
this.decrementUpdateFaviconCounter();
|
||||
|
||||
if (this.updateFaviconCounter() == 0) {
|
||||
this.setFavicon(this.favicon());
|
||||
}
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'bindingComponents': function () {
|
||||
return this._bindingComponents;
|
||||
},
|
||||
|
||||
'clearAllBindingsComponents': function () {
|
||||
MochiKit.Iter.forEach(this.bindingComponents(), MochiKit.Base.methodcaller('remove'));
|
||||
this._bindingComponents = [];
|
||||
this.getElement('bindings').innerHTML = '';
|
||||
},
|
||||
|
||||
'addBindingComponent': function (aBindingComponent) {
|
||||
this.bindingComponents().push(aBindingComponent);
|
||||
aBindingComponent.renderInNode(this.append(this.getElement('bindings'), {tag:'div'}));
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'formValueComponents': function () {
|
||||
return this._formValueComponents;
|
||||
},
|
||||
|
||||
'clearAllFormValueComponents': function () {
|
||||
MochiKit.Iter.forEach(this.formValueComponents(), MochiKit.Base.methodcaller('remove'));
|
||||
this._formValueComponents = [];
|
||||
this.getElement('formValues').innerHTML = '';
|
||||
},
|
||||
|
||||
'addFormValueComponent': function (aFormValueComponent) {
|
||||
this.formValueComponents().push(aFormValueComponent);
|
||||
aFormValueComponent.renderInNode(this.append(this.getElement('formValues'), {tag:'div'}));
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'changedValue': function (anEvent) {
|
||||
MochiKit.Signal.signal(this, 'changedValue', anEvent);
|
||||
|
||||
this.incrementUpdateFaviconCounter();
|
||||
MochiKit.Async.callLater(1, MochiKit.Base.method(this, 'updateFavicon'));
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'handleBackClick': function (anEvent) {
|
||||
anEvent.preventDefault();
|
||||
|
||||
MochiKit.Signal.signal(this, 'back');
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'bottomMargin': function () {
|
||||
return MochiKit.Style.getElementPosition(this.element().parentNode)['y'] +
|
||||
MochiKit.Style.getElementDimensions(this.element())['h'];
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'focusOnLabelElement': function () {
|
||||
this.getElement('label').focus();
|
||||
},
|
||||
|
||||
'focusOnBookmarkletConfigurationElement': function () {
|
||||
this.getElement('bookmarkletConfiguration').focus();
|
||||
},
|
||||
|
||||
'focusOnFaviconElement': function () {
|
||||
this.getElement('faviconURL').focus();
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'setDoneDescriptionWithKeys': function (someKeys) {
|
||||
// {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', id:this.getId('doneDescription')/*, html:Clipperz.PM.Strings.getValue('Wizards.DirectLoginWizard.DONE.description')*/}]}
|
||||
this.getElement('doneDescription').innerHTML = Clipperz.PM.Strings.getValue('Wizards.DirectLoginWizard.DONE.description', someKeys);
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'handleKeyEvent': function (anEvent) {
|
||||
MochiKit.Signal.signal(this, 'keyPressed', anEvent);
|
||||
/*
|
||||
if (anEvent.key().string == 'KEY_ENTER') {
|
||||
if (anEvent.target().nodeName != 'TEXTAREA') {
|
||||
MochiKit.Signal.signal(this, 'moveForward');
|
||||
anEvent.preventDefault();
|
||||
}
|
||||
} else if (anEvent.key().string == 'KEY_TAB') {
|
||||
if ((anEvent.target().nodeName == 'INPUT') || (anEvent.target().nodeName == 'TEXTAREA')) {
|
||||
MochiKit.Signal.signal(this, 'moveForward');
|
||||
anEvent.preventDefault();
|
||||
}
|
||||
}
|
||||
*/
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
__syntaxFix__: "syntax fix"
|
||||
});
|
||||
@@ -0,0 +1,179 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
|
||||
|
||||
Clipperz.PM.UI.Web.Components.DirectLoginEditingFormValueComponent = function(args) {
|
||||
args = args || {};
|
||||
|
||||
Clipperz.PM.UI.Web.Components.DirectLoginEditingFormValueComponent.superclass.constructor.apply(this, arguments);
|
||||
|
||||
this._formFieldName = args.formFieldName || Clipperz.Base.exception.raise('MandatoryParameter');
|
||||
this._fieldOptions = args.fieldOptions || Clipperz.Base.exception.raise('MandatoryParameter');
|
||||
this._initialValue = args.initialValue || null;
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
|
||||
Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DirectLoginEditingFormValueComponent, Clipperz.PM.UI.Common.Components.BaseComponent, {
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'toString': function () {
|
||||
return "Clipperz.PM.UI.Web.Components.DirectLoginEditingFormValueComponent component";
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'formFieldName': function () {
|
||||
return this._formFieldName;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'fieldOptions': function () {
|
||||
return this._fieldOptions;
|
||||
},
|
||||
|
||||
'fieldType': function () {
|
||||
return this.fieldOptions()['type'];
|
||||
},
|
||||
|
||||
'optionValues': function () {
|
||||
return MochiKit.Base.map(function (anOptionValue) {
|
||||
return {
|
||||
'label': anOptionValue['label'] || anOptionValue['value'],
|
||||
'value': anOptionValue['value']
|
||||
}
|
||||
}, this.fieldOptions()['options']);
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'selectedValue': function () {
|
||||
var result;
|
||||
|
||||
result = this.getElement('select').value;
|
||||
|
||||
if (result == '---') {
|
||||
result = null;
|
||||
}
|
||||
|
||||
return result;
|
||||
},
|
||||
|
||||
'initialValue': function () {
|
||||
return this._initialValue;
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'renderSelf': function() {
|
||||
//console.log(">>> DirectLoginEditingFormValueComponent.renderSelf");
|
||||
//console.log("FIELD OPTIONS", this.fieldOptions());
|
||||
//console.log("OPTION VALUES", this.optionValues());
|
||||
this.append(this.element(), {tag:'div', id:this.getId('div'), cls:'formValue', children:[
|
||||
{tag:'span', cls:'formFieldName', html:this.formFieldName()},
|
||||
{tag:'div', id:this.getId('values')}
|
||||
]});
|
||||
|
||||
if ((this.fieldType() == 'radio') || (this.fieldType() == 'select')) {
|
||||
this.append(this.getElement('values'),
|
||||
{tag:'select', name:this.formFieldName(), id:this.getId('select'), cls:'formFieldMatchinCardField', children:
|
||||
MochiKit.Base.flattenArguments(
|
||||
// {tag:'option', value:'---', html:"---"},
|
||||
MochiKit.Base.map(
|
||||
MochiKit.Base.bind(function (aValue) { return {tag:'option', value:aValue['value'], html:aValue['label']}; }, this),
|
||||
this.optionValues()
|
||||
)
|
||||
)
|
||||
}
|
||||
);
|
||||
|
||||
MochiKit.Signal.connect(this.getElement('select'), 'onchange', this, 'handleSelectChange');
|
||||
|
||||
if (! MochiKit.Base.isUndefinedOrNull(this.initialValue())) {
|
||||
var initiallySelectedOptions;
|
||||
initiallySelectedOptions = MochiKit.Selector.findChildElements(this.element(), ['option[value=' + this.initialValue() + ']']);
|
||||
if (initiallySelectedOptions.length == 1) {
|
||||
MochiKit.DOM.updateNodeAttributes(initiallySelectedOptions[0], {selected:true});
|
||||
this.handleSelectChange();
|
||||
} else {
|
||||
Clipperz.DOM.Helper.insertBefore(this.getElement('select').childNodes[0], {tag:'option', value:'---', html:"", selected:true});
|
||||
}
|
||||
} else {
|
||||
Clipperz.DOM.Helper.insertBefore(this.getElement('select').childNodes[0], {tag:'option', value:'---', html:"", selected:true});
|
||||
}
|
||||
} else if (this.fieldType() == 'checkbox') {
|
||||
this.append(this.getElement('values'),
|
||||
{tag:'input', type:'checkbox', name:this.formFieldName(), id:this.getId('checkbox'), cls:'formFieldMatchinCardField'}
|
||||
);
|
||||
|
||||
MochiKit.Signal.connect(this.getElement('checkbox'), 'onchange', this, 'handleSelectChange');
|
||||
|
||||
if (this.initialValue()) {
|
||||
MochiKit.DOM.updateNodeAttributes(this.getElement('checkbox'), {checked:true});
|
||||
}
|
||||
} else {
|
||||
WTF = TODO;
|
||||
}
|
||||
//console.log("<<< DirectLoginEditingFormValueComponent.renderSelf");
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'handleSelectChange': function (anEvent) {
|
||||
//console.log("handleSelectChange", anEvent, anEvent.src(), anEvent.src().value);
|
||||
var options;
|
||||
|
||||
options = {};
|
||||
|
||||
options['fieldName'] = this.formFieldName();
|
||||
|
||||
if (this.fieldType() == 'checkbox') {
|
||||
options['selectedValue'] = (this.getElement('checkbox').checked ? 1 : null);
|
||||
} else {
|
||||
options['selectedValue'] = this.selectedValue();
|
||||
}
|
||||
|
||||
MochiKit.Signal.signal(this, 'formValueChange', options);
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
__syntaxFix__: "syntax fix"
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,271 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
|
||||
|
||||
//#############################################################################
|
||||
|
||||
Clipperz.PM.UI.Web.Components.DirectLoginsColumnManager = function(args) {
|
||||
args = args || {};
|
||||
Clipperz.PM.UI.Web.Components.DirectLoginsColumnManager.superclass.constructor.call(this, args);
|
||||
|
||||
this._enterLeaveCounter = 0;
|
||||
this._selectedRowObject = null;
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
|
||||
Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DirectLoginsColumnManager, Clipperz.PM.UI.Web.Components.ColumnManager, {
|
||||
|
||||
'toString': function () {
|
||||
return "Clipperz.PM.UI.Web.Components.DirectLoginsColumnManager component";
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'renderHeader': function(aTRElement) {
|
||||
Clipperz.PM.UI.Web.Components.DirectLoginsColumnManager.superclass.renderHeader.call(this, aTRElement);
|
||||
|
||||
Clipperz.DOM.Helper.append(MochiKit.DOM.currentDocument().body, {tag:'div', cls:'DirectLoginListPopup', id:this.getId('DirectLoginListPopup'), children:[
|
||||
{tag:'div', cls:'DirectLoginListPopup_body', children:[
|
||||
{tag:'ul', id:this.getId('DirectLoginListPopup_list'), children:[
|
||||
// {tag:'li', children:[
|
||||
// {tag:'img', cls:'favicon', src:'http://www.microsoft.com/favicon.ico'},
|
||||
// {tag:'a', href:'#', html:"Google Mail"}
|
||||
// ]},
|
||||
// ...
|
||||
]}
|
||||
]},
|
||||
{tag:'div', cls:'DirectLoginListPopup_footer'}
|
||||
]});
|
||||
|
||||
MochiKit.Style.hideElement(this.getId('DirectLoginListPopup'));
|
||||
|
||||
// BEWARE: use MochiKit.Signal.connect instead of this.connectEvent, as the HEADER is NOT redrawn after each refresh
|
||||
MochiKit.Signal.connect(this.getId('DirectLoginListPopup'), 'onmouseenter', this, 'handleDirectLoginListPopupEnter');
|
||||
MochiKit.Signal.connect(this.getId('DirectLoginListPopup'), 'onmouseleave', this, 'handleDirectLoginListPopupLeave');
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'renderCell': function(aRowElement, anObject) {
|
||||
var i,c;
|
||||
var directLoginsInfo;
|
||||
|
||||
directLoginsInfo = anObject[this.name()];
|
||||
|
||||
TDElement = Clipperz.DOM.Helper.append(aRowElement, {tag:'td', cls:'card_directLogins'});
|
||||
|
||||
c = Math.min(2, directLoginsInfo.length);
|
||||
for (i=0; i<c; i++) {
|
||||
var elementID;
|
||||
|
||||
elementID = 'directLogin_' + directLoginsInfo[i]['_reference'];
|
||||
|
||||
Clipperz.DOM.Helper.append(TDElement, {tag:'div', cls:'card_directLogin', children:[
|
||||
{tag:'div', cls:'card_directLogin_body', children:[
|
||||
{tag:'a', href:'#', id:elementID, html:directLoginsInfo[i]['label']}
|
||||
]}
|
||||
]});
|
||||
// MochiKit.Signal.connect(elementID, 'onclick', MochiKit.Base.method(this, 'handleDirectLoginClick', directLoginsInfo[i]['_rowObject']));
|
||||
this.connectEvent(elementID, 'onclick', MochiKit.Base.method(this, 'handleDirectLoginClick', directLoginsInfo[i]['_rowObject']));
|
||||
}
|
||||
|
||||
if (directLoginsInfo.length > 2) {
|
||||
var ellipsesElement;
|
||||
|
||||
ellipsesElement = Clipperz.DOM.Helper.append(TDElement, {tag:'div', cls:'card_directLogin_ellipses', children:[
|
||||
{tag:'div', cls:'card_directLogin_ellipses_body', children:[
|
||||
{tag:'span', html:'…'}
|
||||
]}
|
||||
]});
|
||||
|
||||
/// MochiKit.Signal.connect(ellipsesElement, 'onmouseenter', MochiKit.Base.method(this, 'handleEllipsesEnter', anObject));
|
||||
/// MochiKit.Signal.connect(ellipsesElement, 'onmouseleave', MochiKit.Base.method(this, 'handleEllipsesLeave'));
|
||||
// MochiKit.Signal.connect(TDElement, 'onmouseleave', MochiKit.Base.method(this, 'handleTDLeave'));
|
||||
this.connectEvent(TDElement, 'onmouseleave', MochiKit.Base.method(this, 'handleTDLeave'));
|
||||
}
|
||||
// MochiKit.Signal.connect(TDElement, 'onmouseenter', MochiKit.Base.method(this, 'handleTDEnter', anObject));
|
||||
this.connectEvent(TDElement, 'onmouseenter', MochiKit.Base.method(this, 'handleTDEnter', anObject));
|
||||
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
/*
|
||||
'handleEllipsesEnter': function (aRecordInfo, anEvent) {
|
||||
this._enterLeaveCounter ++;
|
||||
if (this._enterLeaveCounter > 2) {
|
||||
this._enterLeaveCounter = 2;
|
||||
}
|
||||
|
||||
if (this._enterLeaveCounter == 1) {
|
||||
this.showDirectLoginListPopup(aRecordInfo, anEvent.src());
|
||||
}
|
||||
},
|
||||
|
||||
'handleEllipsesLeave': function (anEvent) {
|
||||
this._enterLeaveCounter --;
|
||||
|
||||
MochiKit.Async.callLater(0.3, MochiKit.Base.bind(function () {
|
||||
if (this._enterLeaveCounter == 0) {
|
||||
this.hideDirectLoginListPopup();
|
||||
}
|
||||
}, this))
|
||||
},
|
||||
*/
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'handleTDEnter': function (aRecordInfo, anEvent) {
|
||||
if (MochiKit.Selector.findChildElements(anEvent.src(), ['div.card_directLogin_ellipses']).length > 0) {
|
||||
this._enterLeaveCounter ++;
|
||||
if (this._enterLeaveCounter > 2) {
|
||||
this._enterLeaveCounter = 2;
|
||||
}
|
||||
|
||||
if (this._enterLeaveCounter == 1) {
|
||||
this.showDirectLoginListPopup(aRecordInfo, anEvent.src());
|
||||
}
|
||||
} else {
|
||||
if (this._selectedRowObject != null) {
|
||||
this.hideDirectLoginListPopup();
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
'handleTDLeave': function (anEvent) {
|
||||
this._enterLeaveCounter --;
|
||||
if (this._enterLeaveCounter < 0) {
|
||||
this._enterLeaveCounter = 0;
|
||||
}
|
||||
|
||||
MochiKit.Async.callLater(0.3, MochiKit.Base.bind(function () {
|
||||
if (this._enterLeaveCounter == 0) {
|
||||
this.hideDirectLoginListPopup();
|
||||
}
|
||||
}, this))
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'handleDirectLoginListPopupEnter': function (anEvent) {
|
||||
this._enterLeaveCounter ++;
|
||||
if (this._enterLeaveCounter > 2) {
|
||||
this._enterLeaveCounter = 2;
|
||||
}
|
||||
},
|
||||
|
||||
'handleDirectLoginListPopupLeave': function (anEvent) {
|
||||
this._enterLeaveCounter --;
|
||||
if (this._enterLeaveCounter < 0) {
|
||||
this._enterLeaveCounter = 0;
|
||||
}
|
||||
|
||||
MochiKit.Async.callLater(0.3, MochiKit.Base.bind(function () {
|
||||
if (this._enterLeaveCounter == 0) {
|
||||
this.hideDirectLoginListPopup();
|
||||
}
|
||||
}, this))
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'showDirectLoginListPopup': function (aRecordInfo, anElement) {
|
||||
var position;
|
||||
var directLoginsInfo;
|
||||
var directLoginsListElement;
|
||||
var ellipsesElement;
|
||||
|
||||
|
||||
ellipsesElement = MochiKit.Selector.findChildElements(anElement, ['div.card_directLogin_ellipses'])[0];
|
||||
position = MochiKit.Style.getElementPosition(ellipsesElement);
|
||||
// position = MochiKit.Style.getElementPosition(anElement);
|
||||
position.x += 14;
|
||||
position.y -= 26;
|
||||
|
||||
MochiKit.Style.setElementPosition(this.getId('DirectLoginListPopup'), position /*[, units='px'] */);
|
||||
|
||||
directLoginsListElement = this.getElement('DirectLoginListPopup_list');
|
||||
directLoginsListElement.innerHTML = '';
|
||||
|
||||
directLoginsInfo = aRecordInfo[this.name()];
|
||||
c = directLoginsInfo.length;
|
||||
for (i=0; i<c; i++) {
|
||||
var elementID;
|
||||
var label;
|
||||
var trunkedLabel;
|
||||
|
||||
label = directLoginsInfo[i]['label'];
|
||||
trunkedLabel = (label.length > 20 ? label.slice(0,20) + '…' : label);
|
||||
|
||||
elementID = this.getId('directLoginList_' + directLoginsInfo[i]['_reference']);
|
||||
|
||||
Clipperz.DOM.Helper.append(directLoginsListElement, {tag:'li', children:[
|
||||
{tag:'div', children:[
|
||||
{tag:'img', cls:'favicon', src:directLoginsInfo[i]['favicon']},
|
||||
(label == trunkedLabel ? {tag:'a', href:'#', id:elementID, html:trunkedLabel} : {tag:'a', href:'#', id:elementID, title:label, html:trunkedLabel})
|
||||
]}
|
||||
]});
|
||||
|
||||
// MochiKit.Signal.connect(elementID, 'onclick', MochiKit.Base.method(this, 'handleDirectLoginClick', directLoginsInfo[i]['_rowObject']));
|
||||
this.connectEvent(elementID, 'onclick', MochiKit.Base.method(this, 'handleDirectLoginClick', directLoginsInfo[i]['_rowObject']));
|
||||
}
|
||||
|
||||
// MochiKit.Style.showElement(this.getId('DirectLoginListPopup'));
|
||||
MochiKit.Visual.appear(this.getId('DirectLoginListPopup'), {duration:0.5});
|
||||
MochiKit.Signal.signal(this, 'selectRow', aRecordInfo);
|
||||
|
||||
this._selectedRowObject = aRecordInfo;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'hideDirectLoginListPopup': function () {
|
||||
if (this._selectedRowObject != null) {
|
||||
MochiKit.Signal.signal(this, 'unselectRow', this._selectedRowObject);
|
||||
MochiKit.Visual.fade(this.getId('DirectLoginListPopup'), {duration:0.5});
|
||||
this._selectedRowObject = null;
|
||||
this._enterLeaveCounter = 0;
|
||||
}
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'handleDirectLoginClick': function (aDirectLogin, anEvent) {
|
||||
anEvent.preventDefault();
|
||||
// aDirectLogin.runDirectLogin();
|
||||
Clipperz.PM.UI.Common.Controllers.DirectLoginRunner.openDirectLogin(aDirectLogin);
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'__syntax_fix__' : 'syntax fix'
|
||||
|
||||
});
|
||||
|
||||
@@ -0,0 +1,89 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
|
||||
|
||||
//#############################################################################
|
||||
|
||||
Clipperz.PM.UI.Web.Components.FaviconColumnManager = function(args) {
|
||||
args = args || {};
|
||||
Clipperz.PM.UI.Web.Components.FaviconColumnManager.superclass.constructor.call(this, args);
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
|
||||
Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.FaviconColumnManager, Clipperz.PM.UI.Web.Components.ColumnManager, {
|
||||
|
||||
'toString': function () {
|
||||
return "Clipperz.PM.UI.Web.Components.FaviconColumnManager component";
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'renderCell': function(aRowElement, anObject) {
|
||||
var faviconImageElement;
|
||||
var faviconUrl;
|
||||
|
||||
faviconImageElement = this.getId('favicon');
|
||||
faviconUrl = anObject[this.name()];
|
||||
|
||||
if (faviconUrl == null) {
|
||||
faviconUrl = Clipperz.PM.Strings.getValue('defaultFaviconUrl');
|
||||
}
|
||||
|
||||
Clipperz.DOM.Helper.append(aRowElement, {tag:'td', cls:this.cssClass(), children:[
|
||||
{tag:'img', id:faviconImageElement, src:faviconUrl}
|
||||
]});
|
||||
|
||||
MochiKit.Signal.connect(faviconImageElement, 'onload', this, 'handleLoadedFaviconImage');
|
||||
MochiKit.Signal.connect(faviconImageElement, 'onerror', this, 'handleMissingFaviconImage');
|
||||
MochiKit.Signal.connect(faviconImageElement, 'onabort', this, 'handleMissingFaviconImage');
|
||||
},
|
||||
|
||||
//-----------------------------------------------------
|
||||
|
||||
'handleLoadedFaviconImage': function(anEvent) {
|
||||
MochiKit.Signal.disconnectAllTo(anEvent.src());
|
||||
if (anEvent.src().complete == false) {
|
||||
anEvent.src().src = Clipperz.PM.Strings.getValue('defaultFaviconUrl');
|
||||
}
|
||||
},
|
||||
|
||||
//-----------------------------------------------------
|
||||
|
||||
'handleMissingFaviconImage': function(anEvent) {
|
||||
MochiKit.Signal.disconnectAllTo(anEvent.src());
|
||||
anEvent.src().src = Clipperz.PM.Strings.getValue('defaultFaviconUrl');
|
||||
},
|
||||
|
||||
//-----------------------------------------------------
|
||||
'__syntax_fix__' : 'syntax fix'
|
||||
});
|
||||
|
||||
262
frontend/gamma/js/Clipperz/PM/UI/Web/Components/GridComponent.js
Normal file
262
frontend/gamma/js/Clipperz/PM/UI/Web/Components/GridComponent.js
Normal file
@@ -0,0 +1,262 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
|
||||
|
||||
Clipperz.PM.UI.Web.Components.GridComponent = function(args) {
|
||||
args = args || {};
|
||||
|
||||
Clipperz.PM.UI.Web.Components.GridComponent.superclass.constructor.apply(this, arguments);
|
||||
|
||||
this._columnsManagers = args.columnsManagers;
|
||||
|
||||
this._rowsObjects = [];
|
||||
this._noRowsGridComponent = null;
|
||||
|
||||
this._slots = {
|
||||
'headerSlot': this.getId('headerSlot')
|
||||
};
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
|
||||
Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.GridComponent, Clipperz.PM.UI.Common.Components.BaseComponent, {
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'toString': function () {
|
||||
return "Clipperz.PM.UI.Web.Components.GridComponent component";
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'rows': function () {
|
||||
throw Clipperz.Base.exception.AbstractMethod;
|
||||
// return this._rows;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'columnsManagers': function () {
|
||||
return this._columnsManagers;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'renderSelf': function(/*aContainer, aPosition*/) {
|
||||
this.append(this.element(), [
|
||||
{tag:'div', cls:'header', children:[
|
||||
{tag:'form', id:this.getId('searchForm'), cls:'search', children:[
|
||||
{tag:'div', cls:'search', children:[
|
||||
{tag:'input', type:'text', id:this.getId('search'), cls:'search', placeholder:"search", name:'textToSearch'/*, value:"clipperz"*/}
|
||||
]},
|
||||
{tag:'div', cls:'clearSearchButton', id:this.getId('clearSearch')},
|
||||
// {tag:'input', type:'button', cls:'searchButton', name:'searchButton', value:"search"},
|
||||
{tag:'div', cls:'headerSlot', id:this.getId('headerSlot')}
|
||||
]}
|
||||
]},
|
||||
{tag:'div', cls:'body', children:[
|
||||
{tag:'div', cls:'rows', id:this.getId('rows'), children:[
|
||||
{tag:'table', cellpadding:'0', cellspacing:'0', cls:'rows', children:[
|
||||
{tag:'thead', children:[
|
||||
{tag:'tr', id:this.getId('thead_tr'), children:[]}
|
||||
]},
|
||||
{tag:'tbody', id:this.getId('gridRows'), children:[]}
|
||||
]}
|
||||
]},
|
||||
{tag:'div', cls:'noRowsBlock', id:this.getId('noRowsBlock'), children:[]}
|
||||
]},
|
||||
{tag:'div', cls:'footer'}
|
||||
]);
|
||||
|
||||
this.renderHeader();
|
||||
MochiKit.Signal.connect(this.getId('clearSearch'), 'onclick', this, 'clearSearchHandler');
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'renderHeader': function () {
|
||||
var headerElement;
|
||||
|
||||
headerElement = this.getElement('thead_tr');
|
||||
headerElement.innerHTML = "";
|
||||
|
||||
MochiKit.Iter.forEach(this.columnsManagers(), function (aColumnManager) {
|
||||
aColumnManager.renderHeader(headerElement);
|
||||
});
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'update': function (someObjects) {
|
||||
this._rowsObjects = someObjects
|
||||
this.refresh();
|
||||
this.focus();
|
||||
},
|
||||
|
||||
'focus': function () {
|
||||
this.getElement('search').focus();
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'startSearch': function () {
|
||||
//console.log("--> startSearch");
|
||||
MochiKit.DOM.addElementClass(this.getElement('search'), 'running');
|
||||
},
|
||||
|
||||
'endSearch': function () {
|
||||
MochiKit.DOM.removeElementClass(this.getElement('search'), 'running');
|
||||
//console.log("<-- startSearch");
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'disconnectColumnManagersRowsSignals': function () {
|
||||
MochiKit.Iter.forEach(this.columnsManagers(), function (aColumnManager) {
|
||||
aColumnManager.disconnectRowsSignals();
|
||||
});
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'refresh': function () {
|
||||
var gridRowsElement;
|
||||
var rowClass;
|
||||
|
||||
this.disconnectColumnManagersRowsSignals();
|
||||
|
||||
{
|
||||
MochiKit.DOM.removeElementClass(this.getElement('search'), 'disabled');
|
||||
// MochiKit.DOM.setNodeAttribute(this.getElement('search'), 'disabled', null);
|
||||
MochiKit.DOM.removeElementClass(this.element(), 'empty');
|
||||
MochiKit.DOM.removeElementClass(this.element(), 'noRows');
|
||||
}
|
||||
|
||||
|
||||
gridRowsElement = this.getElement('gridRows');
|
||||
gridRowsElement.innerHTML = "";
|
||||
|
||||
MochiKit.DOM.removeElementClass(this.element(), 'empty');
|
||||
|
||||
rowClass = 'odd';
|
||||
MochiKit.Iter.forEach(this._rowsObjects, MochiKit.Base.bind(function (aRowObject) {
|
||||
var cardRowElement;
|
||||
|
||||
cardRowElement = this.append(gridRowsElement, {tag:'tr', id:this.getId(aRowObject['_reference']), cls:rowClass});
|
||||
MochiKit.Iter.forEach(this.columnsManagers(), function (aColumnManager) {
|
||||
aColumnManager.renderCell(cardRowElement, aRowObject);
|
||||
});
|
||||
|
||||
rowClass = (rowClass == 'odd') ? 'even' : 'odd';
|
||||
}, this));
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
'filterElement': function () {
|
||||
return this.getElement('search');
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'shouldShowElementWhileRendering': function () {
|
||||
return false;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'selectRow': function (aRowObject) {
|
||||
MochiKit.DOM.addElementClass(this.getId(aRowObject['_reference']), 'selected');
|
||||
},
|
||||
|
||||
'unselectRow': function (aRowObject) {
|
||||
MochiKit.DOM.removeElementClass(this.getId(aRowObject['_reference']), 'selected');
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
/*
|
||||
'passOpenDirectLogin': function(aDirectLoginReferenceId) {
|
||||
MochiKit.Signal.signal(this, 'openDirectLogin', aDirectLoginReferenceId);
|
||||
},
|
||||
*/
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'clearSearchHandler': function (anEvent) {
|
||||
var searchElement;
|
||||
|
||||
anEvent.preventDefault();
|
||||
|
||||
searchElement = this.getElement('search');
|
||||
searchElement.value = "";
|
||||
searchElement.focus();
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'drawEmpty': function () {
|
||||
this.disconnectColumnManagersRowsSignals();
|
||||
MochiKit.DOM.addElementClass(this.getElement('search'), 'disabled');
|
||||
// MochiKit.DOM.setNodeAttribute(this.getElement('search'), 'disabled', 'disabled');
|
||||
|
||||
gridRowsElement = this.getElement('gridRows');
|
||||
gridRowsElement.innerHTML = "";
|
||||
MochiKit.DOM.addElementClass(this.element(), 'empty');
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'setNoRowsGridComponent': function (aComponent) {
|
||||
this.removeNoRowsGridComponent();
|
||||
this._noRowsGridComponent = aComponent;
|
||||
|
||||
this.disconnectColumnManagersRowsSignals();
|
||||
MochiKit.DOM.addElementClass(this.getElement('search'), 'disabled');
|
||||
// MochiKit.DOM.setNodeAttribute(this.getElement('search'), 'disabled', 'disabled');
|
||||
|
||||
gridRowsElement = this.getElement('gridRows');
|
||||
gridRowsElement.innerHTML = "";
|
||||
MochiKit.DOM.addElementClass(this.element(), 'noRows');
|
||||
|
||||
if (aComponent != null) {
|
||||
aComponent.renderInNode(this.getElement('noRowsBlock'));
|
||||
}
|
||||
},
|
||||
|
||||
'removeNoRowsGridComponent': function () {
|
||||
if (this._noRowsGridComponent != null) {
|
||||
this._noRowsGridComponent.remove();
|
||||
this._noRowsGridComponent = null;
|
||||
}
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
__syntaxFix__: "syntax fix"
|
||||
});
|
||||
@@ -0,0 +1,68 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
|
||||
|
||||
//#############################################################################
|
||||
|
||||
Clipperz.PM.UI.Web.Components.ImageColumnManager = function(args) {
|
||||
args = args || {};
|
||||
Clipperz.PM.UI.Web.Components.ImageColumnManager.superclass.constructor.call(this, args);
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
|
||||
Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.ImageColumnManager, Clipperz.PM.UI.Web.Components.ColumnManager, {
|
||||
|
||||
'toString': function () {
|
||||
return "Clipperz.PM.UI.Web.Components.ImageColumnManager component";
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'renderCell': function(aRowElement, anObject) {
|
||||
Clipperz.DOM.Helper.append(aRowElement, {tag:'td', cls:this.cssClass(), children:[
|
||||
{tag:'img', src:anObject[this.name()]}
|
||||
]});
|
||||
|
||||
// return Clipperz.Async.callbacks("ImageColumnManager.renderCell", [
|
||||
// this.selector(),
|
||||
// MochiKit.Base.bind(function (aValue) {
|
||||
// Clipperz.DOM.Helper.append(aRowElement, {tag:'td', cls:this.cssClass(), children:[
|
||||
// {tag:'img', src:aValue}
|
||||
// ]});
|
||||
// }, this)
|
||||
// ], {trace:false}, anObject);
|
||||
},
|
||||
|
||||
//-----------------------------------------------------
|
||||
'__syntax_fix__' : 'syntax fix'
|
||||
});
|
||||
|
||||
@@ -0,0 +1,92 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
|
||||
|
||||
//#############################################################################
|
||||
|
||||
Clipperz.PM.UI.Web.Components.LinkColumnManager = function(args) {
|
||||
args = args || {};
|
||||
Clipperz.PM.UI.Web.Components.LinkColumnManager.superclass.constructor.call(this, args);
|
||||
|
||||
this._actionMethod = args.actionMethod || null;
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
|
||||
Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.LinkColumnManager, Clipperz.PM.UI.Web.Components.ColumnManager, {
|
||||
|
||||
'toString': function () {
|
||||
return "Clipperz.PM.UI.Web.Components.DateColumnManager component";
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'actionMethod': function () {
|
||||
return this._actionMethod;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'renderCell': function(aRowElement, anObject) {
|
||||
var tdElement;
|
||||
var linkElement;
|
||||
|
||||
tdElement = Clipperz.DOM.Helper.append(aRowElement, {tag:'td', cls:this.cssClass(), children:[
|
||||
{tag:'span', children:[
|
||||
{tag:'a', href:'#', html:anObject[this.name()]}
|
||||
]}
|
||||
]});
|
||||
|
||||
linkElement = MochiKit.DOM.getFirstElementByTagAndClassName('a', null, tdElement);
|
||||
// MochiKit.Signal.connect(linkElement, 'onclick', MochiKit.Base.method(this, 'handleLinkClick', anObject['_rowObject']));
|
||||
this.connectEvent(linkElement, 'onclick', MochiKit.Base.method(this, 'handleLinkClick', anObject['_rowObject']));
|
||||
},
|
||||
|
||||
//-----------------------------------------------------
|
||||
|
||||
'handleLinkClick': function (anObject, anEvent) {
|
||||
anEvent.preventDefault();
|
||||
|
||||
if (this.actionMethod() != null) {
|
||||
var deferredResult;
|
||||
|
||||
deferredResult = new Clipperz.Async.Deferred("LinkColumnManager.handleLinkClick", {trace:false});
|
||||
// deferredResult.addCallbackPass(MochiKit.Signal.signal, this, 'selectRow', anObject);
|
||||
deferredResult.addCallback(this.actionMethod(), anObject, anEvent);
|
||||
// deferredResult.addBothPass(MochiKit.Signal.signal, this, 'unselectRow', anObject);
|
||||
deferredResult.callback();
|
||||
}
|
||||
},
|
||||
|
||||
//-----------------------------------------------------
|
||||
'__syntax_fix__' : 'syntax fix'
|
||||
});
|
||||
|
||||
203
frontend/gamma/js/Clipperz/PM/UI/Web/Components/LoginForm.js
Normal file
203
frontend/gamma/js/Clipperz/PM/UI/Web/Components/LoginForm.js
Normal file
@@ -0,0 +1,203 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
|
||||
|
||||
Clipperz.PM.UI.Web.Components.LoginForm = function(args) {
|
||||
args = args || {};
|
||||
|
||||
this._autocomplete = args.autocomplete || 'off';
|
||||
|
||||
Clipperz.PM.UI.Web.Components.LoginForm.superclass.constructor.apply(this, arguments);
|
||||
|
||||
this._slots = {
|
||||
'passphraseEntropy': this.getId('passphraseEntropy')
|
||||
};
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
|
||||
Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.LoginForm, Clipperz.PM.UI.Common.Components.BaseComponent, {
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'toString': function () {
|
||||
return "Clipperz.PM.UI.Web.Components.LoginForm component";
|
||||
},
|
||||
|
||||
'autocomplete': function () {
|
||||
return this._autocomplete;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'renderSelf': function() {
|
||||
this.append(this.element(), {tag:'div', id:'loginBox', children:[
|
||||
{tag:'div', cls:'header'},
|
||||
{tag:'div', cls:'body', id:this.getId('body'), children:[
|
||||
{tag:'div', id:this.getId('loginForm'), children:[
|
||||
{tag:'div', children:[
|
||||
{tag:'h4', html:'Login'},
|
||||
// {tag:'form', cls:'loginForm', autocomplete:this.autocomplete(), children:[
|
||||
{tag:'form', id:this.getId('form'), cls:'loginForm', children:[
|
||||
{tag:'label', html:'username', 'for':this.getId('usernameField')},
|
||||
{tag:'input', id:this.getId('usernameField'), type:'text', cls:'username'/*, value:'joe'*/},
|
||||
{tag:'ul', id:this.getId('passwordOptions'), children:[
|
||||
{tag:'li', id:this.getId('passphraseOption'), children:[
|
||||
{tag:'label', html:'passphrase / OTP', 'for':this.getId('passphraseField')},
|
||||
{tag:'input', id:this.getId('passphraseField'), type:'password', cls:'password'/*, value:'clipperz'*/}
|
||||
]} // ,
|
||||
/*
|
||||
{tag:'li', id:this.getId('otpOption'), children:[
|
||||
{tag:'label', html:'one-time password', 'for':this.getId('otpField_1')},
|
||||
{tag:'input', id:this.getId('otpField_1'), type:'text', cls:'otp', value:'abcd-efgh'},
|
||||
{tag:'input', id:this.getId('otpField_2'), type:'text', cls:'otp', value:'abcd-efgh'},
|
||||
{tag:'input', id:this.getId('otpField_3'), type:'text', cls:'otp', value:'abcd-efgh'},
|
||||
{tag:'input', id:this.getId('otpField_4'), type:'text', cls:'otp', value:'abcd-efgh'}
|
||||
]}
|
||||
*/
|
||||
]},
|
||||
// {tag:'input', id:this.getId('otpCheckbox'), type:'checkbox', cls:'checkbox'},
|
||||
// {tag:'label', html:'use a one-time passphrase', 'for':this.getId('otpCheckbox'), cls:'checkbox'},
|
||||
|
||||
{tag:'div', cls:'translations', children:[
|
||||
{tag:'h4', html:'choose your language'},
|
||||
{tag:'ul', children:[
|
||||
{tag:'li', cls:'selected', html:'english'},
|
||||
{tag:'li', html:'italiano'},
|
||||
{tag:'li', html:'dutch'},
|
||||
{tag:'li', html:'french'},
|
||||
{tag:'li', html:'spanish'},
|
||||
{tag:'li', html:'chinese'},
|
||||
{tag:'li', html:'japanese'},
|
||||
{tag:'li', html:'portugal'},
|
||||
{tag:'li', html:'arabic'}
|
||||
]}
|
||||
]},
|
||||
|
||||
{tag:'input', id:this.getId('submitButton'), type:'submit', value:'login', cls:'submit'}
|
||||
]}
|
||||
]}
|
||||
]}
|
||||
]},
|
||||
{tag:'div', cls:'footer'}
|
||||
]});
|
||||
|
||||
if (this.autocomplete() == 'off') {
|
||||
MochiKit.DOM.updateNodeAttributes(this.getElement('form'), {autocomplete:'off'});
|
||||
}
|
||||
|
||||
// Clipperz.Style.setBackgroundGradient(this.getElement('body'), {from:"#ff9955", to:"#ff6622"})
|
||||
|
||||
// this.setEntropyDisplay(new Clipperz.PM.UI.Common.Components.PasswordEntropyDisplay(this.getElement('passphraseField')));
|
||||
|
||||
// MochiKit.Signal.connect(this.getId('otpCheckbox'), 'onclick', this, 'togglePasswordFields');
|
||||
// this.showPassphraseField();
|
||||
|
||||
this.getElement('usernameField').focus();
|
||||
|
||||
MochiKit.Signal.connect(this.getElement('loginForm'), 'onsubmit', this, 'loginEventHandler');
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
/*
|
||||
'togglePasswordFields': function(anEvent) {
|
||||
var shouldUseOTP;
|
||||
|
||||
shouldUseOTP = this.getElement('otpCheckbox').checked;
|
||||
|
||||
if (shouldUseOTP == false) {
|
||||
this.showPassphraseField();
|
||||
} else {
|
||||
this.showOTPFields();
|
||||
}
|
||||
},
|
||||
*/
|
||||
//-----------------------------------------------------------------------------
|
||||
/*
|
||||
'showPassphraseField': function() {
|
||||
this.showElement('passphraseOption');
|
||||
this.hideElement('otpOption');
|
||||
},
|
||||
*/
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
'focusOnPassphraseField': function () {
|
||||
this.getElement('passphraseField').focus();
|
||||
this.getElement('passphraseField').select();
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
/*
|
||||
'showOTPFields': function() {
|
||||
this.hideElement('passphraseOption');
|
||||
this.showElement('otpOption');
|
||||
},
|
||||
*/
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'loginEventHandler': function(anEvent) {
|
||||
var username;
|
||||
var passphrase;
|
||||
// var shouldUseOTP;
|
||||
// var otp;
|
||||
var signalArguments;
|
||||
|
||||
anEvent.preventDefault();
|
||||
|
||||
username = this.getElement('usernameField').value;
|
||||
passphrase = this.getElement('passphraseField').value;
|
||||
// otp = this.getElement('otpField_1').value +
|
||||
// this.getElement('otpField_2').value +
|
||||
// this.getElement('otpField_3').value +
|
||||
// this.getElement('otpField_4').value;
|
||||
// shouldUseOTP = this.getElement('otpCheckbox').checked;
|
||||
|
||||
signalArguments = {username:username};
|
||||
|
||||
// if (shouldUseOTP) {
|
||||
// signalArguments.otp = otp;
|
||||
// } else {
|
||||
signalArguments.passphrase = passphrase;
|
||||
// }
|
||||
|
||||
MochiKit.Signal.signal(this, 'doLogin', signalArguments);
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'submitButtonElement': function() {
|
||||
return this.getElement('submitButton');
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
__syntaxFix__: "syntax fix"
|
||||
});
|
||||
206
frontend/gamma/js/Clipperz/PM/UI/Web/Components/LoginPage.js
Normal file
206
frontend/gamma/js/Clipperz/PM/UI/Web/Components/LoginPage.js
Normal file
@@ -0,0 +1,206 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
|
||||
|
||||
Clipperz.PM.UI.Web.Components.LoginPage = function(args) {
|
||||
args = args || {};
|
||||
|
||||
Clipperz.PM.UI.Web.Components.LoginPage.superclass.constructor.apply(this, arguments);
|
||||
|
||||
this._slots = {
|
||||
'loginForm': this.getId('loginBoxSlot')
|
||||
};
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
|
||||
Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.LoginPage, Clipperz.PM.UI.Common.Components.BaseComponent, {
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'toString': function () {
|
||||
return "Clipperz.PM.UI.Web.Components.LoginPage component";
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'renderSelf': function(/*aContainer, aPosition*/) {
|
||||
this.append(this.element(), [
|
||||
{tag:'div', id:this.getId('loginBoxSlot')},
|
||||
{tag:'div', id:'main', children:[
|
||||
{tag:'div', id:'featurePoints', children:[
|
||||
{tag:'table', children:[
|
||||
{tag:'tr', children:[
|
||||
{tag:'td', children:[
|
||||
{tag:'div', cls:'block', children:[
|
||||
{tag:'h3', html:'Clipperz is:'},
|
||||
{tag:'ul', children:[
|
||||
{tag:'li', html:'a secure and simple password manager'},
|
||||
{tag:'li', html:'an effective single sign-on solution'},
|
||||
{tag:'li', html:'a digital vault for your personal data'}
|
||||
]}
|
||||
]},
|
||||
{tag:'div', cls:'block', children:[
|
||||
{tag:'h3', html:'Clipperz benefits:'},
|
||||
{tag:'ul', children:[
|
||||
{tag:'li', html:'free and completely anonymous'},
|
||||
{tag:'li', html:'access it any time from any computer'},
|
||||
{tag:'li', html:'no software to download and nothing to install'},
|
||||
{tag:'li', html:'avoid keeping secrets on your PC or on paper'}
|
||||
]}
|
||||
]}
|
||||
]}, {tag:'td', children:[
|
||||
{tag:'div', cls:'block', children:[
|
||||
{tag:'h3', html:'Clipperz security:'},
|
||||
{tag:'ul', children:[
|
||||
{tag:'li', html:'your secretes are locally encrypted by your browser before being uploaded to Clipperz'},
|
||||
{tag:'li', html:'the encryption key is a passphrase known only to you'},
|
||||
{tag:'li', html:'Clipperz hosts your sensitive data in an encrypted form and could never access the data in its plain form'},
|
||||
{tag:'li', html:'Clipperz is built upon standard encryption schemes, nothing fancies of homemade'},
|
||||
{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!'}
|
||||
]}
|
||||
]}
|
||||
]}
|
||||
]}
|
||||
]}
|
||||
]},
|
||||
{tag:'div', cls:'activeFeatures', children:[
|
||||
{tag:'div', id:this.getId('registerButton'), cls:'createAccountLink', children:[
|
||||
{tag:'canvas', id:this.getId('registerButtonIcon')},
|
||||
{tag:'a', href:'#', id:this.getId('createAccountLink'), cls:'createAccountLink', children:[
|
||||
{tag:'span', cls:'payoff', html:"Free sign up!"},
|
||||
{tag:'span', cls:'link', html:"Create account >>"}
|
||||
]}
|
||||
]},
|
||||
{tag:'div', cls:'keepTogether', children:[
|
||||
{tag:'div', id:this.getId('screenshotLink'), cls:'screenshotLink', children:[
|
||||
{tag:'canvas', id:this.getId('lookIcon')},
|
||||
{tag:'a', href:'#', cls:'screenshotLink', children:[
|
||||
{tag:'span', cls:'payoff', html:"Look Clipperz!"},
|
||||
{tag:'span', cls:'link', html:"screenshot tour >>"}
|
||||
]}
|
||||
]},
|
||||
{tag:'div', id:this.getId('offlineLink'), cls:'offlineLink', children:[
|
||||
{tag:'canvas', id:this.getId('downloadIcon')},
|
||||
{tag:'a', href:'#', cls:'offlineLink', children:[
|
||||
{tag:'span', cls:'payoff', html:"Download!"},
|
||||
{tag:'span', cls:'link', html:"Offline version >>"}
|
||||
]}
|
||||
]}
|
||||
]}
|
||||
]}
|
||||
]}
|
||||
]);
|
||||
|
||||
this.setRegistrationButtonIconDefaultColors();
|
||||
this.setLookIconDefaultColors();
|
||||
this.setDownloadIconDefaultColors();
|
||||
|
||||
// MochiKit.Signal.connect(this.getElement('createAccountLink'), 'onclick', this, 'handleCreateAccountLink')
|
||||
|
||||
MochiKit.Signal.connect(this.getElement('registerButton'), 'onmouseenter', this, 'handleMouseEnterOnRegisterButtonIcon');
|
||||
MochiKit.Signal.connect(this.getElement('registerButton'), 'onmouseleave', this, 'handleMouseLeaveOnRegisterButtonIcon');
|
||||
|
||||
MochiKit.Signal.connect(this.getElement('screenshotLink'), 'onmouseenter', this, 'handleMouseEnterOnLookIcon');
|
||||
MochiKit.Signal.connect(this.getElement('screenshotLink'), 'onmouseleave', this, 'handleMouseLeaveOnLookIcon');
|
||||
|
||||
MochiKit.Signal.connect(this.getElement('offlineLink'), 'onmouseenter', this, 'handleMouseEnterOnDownloadIcon');
|
||||
MochiKit.Signal.connect(this.getElement('offlineLink'), 'onmouseleave', this, 'handleMouseLeaveOnDownloadIcon');
|
||||
|
||||
MochiKit.Signal.connect(this.getElement('createAccountLink'), 'onclick', this, 'handleCreateAccountLink')
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'setRegistrationButtonIconDefaultColors': function () {
|
||||
Clipperz.PM.UI.Canvas.registerButton.normal(this.getElement('registerButtonIcon'), "#eeeeee", "#eeeeee", "#ecab12", "#e14624", "#ffffff");
|
||||
},
|
||||
|
||||
'setRegistrationButtonIconHoverColors': function () {
|
||||
Clipperz.PM.UI.Canvas.registerButton.normal(this.getElement('registerButtonIcon'), "#cccccc", "#999999", "#ffb710", "#ff4d27", "#ffffff");
|
||||
},
|
||||
|
||||
'handleMouseEnterOnRegisterButtonIcon': function (anEvent) {
|
||||
this.setRegistrationButtonIconHoverColors();
|
||||
},
|
||||
|
||||
'handleMouseLeaveOnRegisterButtonIcon': function (anEvent) {
|
||||
this.setRegistrationButtonIconDefaultColors();
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'setLookIconDefaultColors': function () {
|
||||
Clipperz.PM.UI.Canvas.coverActions.look(this.getElement('lookIcon'), "#7e7e7e", "#ffffff", 1);
|
||||
},
|
||||
|
||||
'setLookIconHoverColors': function () {
|
||||
Clipperz.PM.UI.Canvas.coverActions.look(this.getElement('lookIcon'), "#666666", "#ffffff", 2);
|
||||
},
|
||||
|
||||
'handleMouseEnterOnLookIcon': function (anEvent) {
|
||||
this.setLookIconHoverColors();
|
||||
},
|
||||
|
||||
'handleMouseLeaveOnLookIcon': function (anEvent) {
|
||||
this.setLookIconDefaultColors();
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'setDownloadIconDefaultColors': function () {
|
||||
Clipperz.PM.UI.Canvas.coverActions.download(this.getElement('downloadIcon'), "#7e7e7e", "#ffffff", 1);
|
||||
},
|
||||
|
||||
'setDownloadIconHoverColors': function () {
|
||||
Clipperz.PM.UI.Canvas.coverActions.download(this.getElement('downloadIcon'), "#666666", "#ffffff", 2);
|
||||
},
|
||||
|
||||
'handleMouseEnterOnDownloadIcon': function (anEvent) {
|
||||
this.setDownloadIconHoverColors();
|
||||
},
|
||||
|
||||
'handleMouseLeaveOnDownloadIcon': function (anEvent) {
|
||||
this.setDownloadIconDefaultColors();
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'handleCreateAccountLink': function (anEvent) {
|
||||
anEvent.preventDefault();
|
||||
|
||||
MochiKit.Signal.signal(this, 'createNewAccountClick', anEvent.src());
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
__syntaxFix__: "syntax fix"
|
||||
});
|
||||
155
frontend/gamma/js/Clipperz/PM/UI/Web/Components/LoginProgress.js
Normal file
155
frontend/gamma/js/Clipperz/PM/UI/Web/Components/LoginProgress.js
Normal file
@@ -0,0 +1,155 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
|
||||
|
||||
Clipperz.PM.UI.Web.Components.LoginProgress = function(args) {
|
||||
args = args || {};
|
||||
|
||||
Clipperz.PM.UI.Web.Components.LoginProgress.superclass.constructor.apply(this, arguments);
|
||||
|
||||
this._deferred = null;
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
|
||||
Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.LoginProgress, Clipperz.PM.UI.Common.Components.BaseComponent, {
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'toString': function () {
|
||||
return "Clipperz.PM.UI.Web.Components.LoginProgress component";
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'deferred': function() {
|
||||
return this._deferred;
|
||||
},
|
||||
|
||||
'setDeferred': function(aValue) {
|
||||
this._deferred = aValue;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'renderSelf': function() {
|
||||
// var loginProgressElement;
|
||||
//
|
||||
// loginProgressElement = MochiKit.DOM.getElement('loginProgress');
|
||||
//
|
||||
// if (loginProgressElement == null) {
|
||||
// loginProgressElement = this.append(this.element(), {tag:'div', id:'loginProgress', cls:'LoginProgress'}, true);
|
||||
// }
|
||||
|
||||
//console.log(">> LoginProgress.renderSelf", this.element());
|
||||
this.append(this.element(), {tag:'div', id:'loginProgress', cls:'LoginProgress', children: [
|
||||
// this.append(loginProgressElement, [
|
||||
{tag:'div', cls:'header', children:[
|
||||
{tag:'h3', id:this.getId('title'), html:"login progress"}
|
||||
]},
|
||||
{tag:'div', cls:'body', children:[
|
||||
{tag:'div', id:this.getId('progressBar')},
|
||||
{tag:'div', id:this.getId('errorBox'), cls:'errorBox', children:[
|
||||
// {tag:'div', cls:'img ALERT', children:[{tag:'div'}]},
|
||||
{tag:'div', cls:'img ALERT', children:[{tag:'canvas', id:this.getId('canvas')}]},
|
||||
{tag:'p', html:"Login failed"}
|
||||
]}
|
||||
]},
|
||||
{tag:'div', cls:'footer', children:[
|
||||
{tag:'div', cls:'buttonArea', id:this.getId('buttonArea'), children:[
|
||||
{tag:'div', cls:'button', id:this.getId('button'), children:[
|
||||
{tag:'a', href:'#', id:this.getId('buttonLink'), html:"cancel"}
|
||||
]}
|
||||
]}
|
||||
]}
|
||||
]});
|
||||
// ]);
|
||||
|
||||
Clipperz.PM.UI.Canvas.marks['!'](this.getElement('canvas'), "#ffffff");
|
||||
|
||||
this.addComponent(new Clipperz.PM.UI.Common.Components.ProgressBar({'element':this.getElement('progressBar')}));
|
||||
MochiKit.Style.hideElement(this.getElement('errorBox'));
|
||||
|
||||
MochiKit.Signal.connect(this.getId('buttonLink'), 'onclick', this, 'cancelEventHandler');
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'displayElement': function() {
|
||||
return MochiKit.DOM.getElement('loginProgress');
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'cancelEventHandler': function(anEvent) {
|
||||
anEvent.preventDefault();
|
||||
|
||||
MochiKit.Signal.signal(this, 'cancelEvent');
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'disableCancel': function() {
|
||||
MochiKit.Style.hideElement(this.getElement('buttonArea'));
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'showErrorMessage': function() {
|
||||
this.getElement('buttonLink').innerHTML = "close";
|
||||
|
||||
MochiKit.Style.hideElement(this.getElement('progressBar'));
|
||||
|
||||
this.getElement('title').innerHTML = "Error";
|
||||
MochiKit.Style.showElement(this.getElement('errorBox'));
|
||||
MochiKit.Style.showElement(this.getElement('buttonArea'));
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'deferredHideModalAndRemove': function(someParameters, aResult) {
|
||||
var deferredResult;
|
||||
|
||||
deferredResult = new Clipperz.Async.Deferred("LoginProgress.deferredHideModalAndRemove", {trace:false});
|
||||
deferredResult.addMethod(this, 'deferredHideModal');
|
||||
deferredResult.addMethod(this, 'remove');
|
||||
deferredResult.addCallback(function () {
|
||||
return aResult;
|
||||
});
|
||||
deferredResult.callback(someParameters);
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
__syntaxFix__: "syntax fix"
|
||||
});
|
||||
@@ -0,0 +1,430 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
|
||||
|
||||
Clipperz.PM.UI.Web.Components.NewUserCreationComponent = function(args) {
|
||||
args = args || {};
|
||||
|
||||
Clipperz.PM.UI.Web.Components.NewUserCreationComponent.superclass.constructor.apply(this, arguments);
|
||||
|
||||
this._tabPanelController = null;
|
||||
|
||||
this._initiallySelectedTab = args.selected || 'CREDENTIALS';
|
||||
this._tabPanelControllerConfiguration = {
|
||||
'CREDENTIALS': {
|
||||
tab: 'credentialsTab',
|
||||
panel: 'credentialsTabpanel'
|
||||
},
|
||||
'CHECK_CREDENTIALS': {
|
||||
tab: 'checkCredentialsTab',
|
||||
panel: 'checkCredentialsTabpanel'
|
||||
},
|
||||
'TERMS_OF_SERVICE': {
|
||||
tab: 'termsOfServiceTab',
|
||||
panel: 'termsOfServiceTabpanel'
|
||||
},
|
||||
'CREATE_USER': {
|
||||
tab: 'createUserTab',
|
||||
panel: 'createUserTabpanel'
|
||||
} //,
|
||||
/*
|
||||
'LOGIN': {
|
||||
tab: 'loginTab',
|
||||
panel: 'loginTabpanel'
|
||||
}
|
||||
*/
|
||||
};
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
|
||||
Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.NewUserCreationComponent, Clipperz.PM.UI.Common.Components.TabPanelComponent, {
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'toString': function () {
|
||||
return "Clipperz.PM.UI.Web.Components.NewUserCreationComponent component";
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'disableAllPanels': function () {
|
||||
this.tabPanelController().selectTab(null);
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'enableCredentialsPanel': function () {
|
||||
this.tabPanelController().selectTab('CREDENTIALS');
|
||||
},
|
||||
|
||||
'enableCheckCredentialsPanel': function () {
|
||||
this.tabPanelController().selectTab('CHECK_CREDENTIALS');
|
||||
},
|
||||
|
||||
'enableTermsOfServicePanel': function () {
|
||||
this.tabPanelController().selectTab('TERMS_OF_SERVICE');
|
||||
},
|
||||
|
||||
'enableCreateUserPanel': function () {
|
||||
this.tabPanelController().selectTab('CREATE_USER');
|
||||
},
|
||||
|
||||
// 'enableLoginPanel': function () {
|
||||
// this.tabPanelController().selectTab('LOGIN');
|
||||
// },
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'shouldShowElementWhileRendering': function() {
|
||||
return false;
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'tabPanelController': function () {
|
||||
if (this._tabPanelController == null) {
|
||||
this._tabPanelController = new Clipperz.PM.UI.Common.Controllers.TabPanelController({
|
||||
component:this,
|
||||
configuration:this._tabPanelControllerConfiguration
|
||||
});
|
||||
|
||||
MochiKit.Signal.connect(this._tabPanelController, 'tabSelected', this, 'handleTabSelected')
|
||||
}
|
||||
|
||||
return this._tabPanelController;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'renderSelf': function() {
|
||||
//console.log('** Clipperz.targetModalDimensionsAndPosition', Clipperz.Base.serializeJSON(Clipperz.PM.UI.Common.Components.BaseComponent.targetModalDimensionsAndPosition));
|
||||
|
||||
this.append(this.element(), {tag:'div', cls:'NewUserCreation mainDialog', id:this.getId('panel'), children: [
|
||||
{tag:'form', id:this.getId('form'), cls:'newUserCreationForm', children:[
|
||||
{tag:'div', cls:'header', children:[
|
||||
{tag:'div', cls:'title', children:[
|
||||
{tag:'h3', id:this.getId('title'), html:"Create new user"}
|
||||
]}
|
||||
]},
|
||||
{tag:'div', id:this.getId('body'), cls:'body', children:[
|
||||
{tag:'div', cls:'tabContainer', children:[
|
||||
{tag:'ul', cls:'tabs', children:[
|
||||
{tag:'li', id:this.getId('credentialsTab'), children:[{tag:'span', html:"credentials"}]},
|
||||
{tag:'li', id:this.getId('checkCredentialsTab'), children:[{tag:'span', html:"credentials check"}]},
|
||||
{tag:'li', id:this.getId('termsOfServiceTab'), children:[{tag:'span', html:"terms of service"}]},
|
||||
{tag:'li', id:this.getId('createUserTab'), children:[{tag:'span', html:"create user"}]} //,
|
||||
// {tag:'li', id:this.getId('loginTab'), children:[{tag:'span', html:"login"}]},
|
||||
]},
|
||||
{tag:'ul', cls:'tabPanels', children:[
|
||||
{tag:'li', id:this.getId('credentialsTabpanel'), cls:'tabPanel credentials', children:[
|
||||
{tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.NewUserWizard.CREDENTIALS.description')}]},
|
||||
{tag:'ul', cls:'credentials', children:[
|
||||
{tag:'li', children:[{tag:'span', cls:'label', html:"username"}, {tag:'input', type:'text', id:this.getId('username')/*, value:'test'*/}]},
|
||||
{tag:'li', children:[{tag:'span', cls:'label', html:"passphrase"}, {tag:'input', type:'password', id:this.getId('passphrase')/*, value:'test'*/}]}
|
||||
]}
|
||||
]},
|
||||
{tag:'li', id:this.getId('checkCredentialsTabpanel'), cls:'tabPanel checkCredentials', children:[
|
||||
{tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.NewUserWizard.CHECK_CREDENTIALS.description')}]},
|
||||
{tag:'ul', cls:'credentials', children:[
|
||||
{tag:'li', children:[{tag:'span', cls:'label', html:"re-passphrase"}, {tag:'input', type:'password', id:this.getId('re-passphrase')/*, value:'test'*/}]}
|
||||
]}
|
||||
]},
|
||||
{tag:'li', id:this.getId('termsOfServiceTabpanel'), cls:'tabPanel termsOfService', children:[
|
||||
{tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.NewUserWizard.TERMS_OF_SERVICE.description')}]},
|
||||
{tag:'ul', cls:'termsOfService', children:[
|
||||
{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."}]},
|
||||
{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>."}]}
|
||||
]}
|
||||
]},
|
||||
{tag:'li', id:this.getId('createUserTabpanel'), cls:'tabPanel createUser', children:[
|
||||
{tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.NewUserWizard.CREATE_USER.description')}]},
|
||||
{tag:'ul', cls:'createUserStates', children:[
|
||||
{tag:'li', cls:'creating', id:this.getId('creatingRegistering'), children:[{tag:'span', html:"registering user"}]},
|
||||
{tag:'li', cls:'done', id:this.getId('creatingDone'), children:[{tag:'span', html:"done"}]},
|
||||
{tag:'li', cls:'fail', id:this.getId('creatingFailed'), children:[{tag:'span', html:"fail"}]}
|
||||
]}
|
||||
]} //,
|
||||
// {tag:'li', id:this.getId('loginTabpanel'), cls:'tabPanel login', children:[
|
||||
// {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.NewUserWizard.LOGIN.description')}]},
|
||||
// ]}
|
||||
]}
|
||||
]}
|
||||
]},
|
||||
{tag:'div', id:this.getId('footer'), cls:'footer', children:[
|
||||
{tag:'div', cls:'buttonArea', children:[
|
||||
// {tag:'div', cls:'cancel', id:this.getId('cancelButton'), html:"cancel"},
|
||||
// {tag:'div', cls:'save disabled', id:this.getId('saveButton'), html:"save"}
|
||||
]}
|
||||
]}
|
||||
]},
|
||||
{tag:'div', cls:'clear'}
|
||||
]});
|
||||
|
||||
this.tabPanelController().setup();
|
||||
// MochiKit.Signal.connect(this.getId('panel'), 'onkeydown', this, 'handleKeyEvent');
|
||||
MochiKit.Signal.connect(MochiKit.DOM.currentDocument().body, 'onkeydown', this, 'handleKeyEvent');
|
||||
MochiKit.Signal.connect(this.getId('awareOfUnrecoverablePassphrase'), 'onchange', this, 'handleTermsOfServiceCheckboxChange');
|
||||
MochiKit.Signal.connect(this.getId('readTermsOfService'), 'onchange', this, 'handleTermsOfServiceCheckboxChange');
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
/*
|
||||
'resetContent': function () {
|
||||
this.getElement('username').value = '';
|
||||
this.getElement('passphrase').value = '';
|
||||
},
|
||||
*/
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'displayElement': function() {
|
||||
return this.getElement('panel');
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'handleTabSelected': function (aSelectedTab) {
|
||||
/*
|
||||
switch (aSelectedTab) {
|
||||
case 'DETAILS':
|
||||
break;
|
||||
case 'DIRECT_LOGINS':
|
||||
MochiKit.Style.hideElement(this.getElement('backToDirectLoginList'));
|
||||
break;
|
||||
case 'SHARING':
|
||||
break;
|
||||
}
|
||||
*/
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'username': function () {
|
||||
return this.getElement('username').value;
|
||||
},
|
||||
|
||||
'usernameElement': function () {
|
||||
return this.getElement('username');
|
||||
},
|
||||
|
||||
'passphrase': function () {
|
||||
return this.getElement('passphrase').value;
|
||||
},
|
||||
|
||||
'rePassphrase': function () {
|
||||
return this.getElement('re-passphrase').value;
|
||||
},
|
||||
|
||||
'awareOfUnrecoverablePassphrase': function () {
|
||||
return this.getElement('awareOfUnrecoverablePassphrase').value;
|
||||
},
|
||||
|
||||
'readTermsOfService': function () {
|
||||
return this.getElement('readTermsOfService').value;
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
/*
|
||||
'incrementUpdateFaviconCounter': function () {
|
||||
this._updateFaviconCounter ++;
|
||||
},
|
||||
|
||||
'decrementUpdateFaviconCounter': function () {
|
||||
this._updateFaviconCounter --;
|
||||
},
|
||||
|
||||
'updateFaviconCounter': function () {
|
||||
return this._updateFaviconCounter;
|
||||
},
|
||||
*/
|
||||
//-------------------------------------------------------------------------
|
||||
/*
|
||||
'updateFavicon': function () {
|
||||
this.decrementUpdateFaviconCounter();
|
||||
|
||||
if (this.updateFaviconCounter() == 0) {
|
||||
this.setFavicon(this.favicon());
|
||||
}
|
||||
},
|
||||
*/
|
||||
//=========================================================================
|
||||
/*
|
||||
'bindingComponents': function () {
|
||||
return this._bindingComponents;
|
||||
},
|
||||
|
||||
'clearAllBindingsComponents': function () {
|
||||
MochiKit.Iter.forEach(this.bindingComponents(), MochiKit.Base.methodcaller('remove'));
|
||||
this._bindingComponents = [];
|
||||
this.getElement('bindings').innerHTML = '';
|
||||
},
|
||||
|
||||
'addBindingComponent': function (aBindingComponent) {
|
||||
this.bindingComponents().push(aBindingComponent);
|
||||
aBindingComponent.renderInNode(this.append(this.getElement('bindings'), {tag:'div'}));
|
||||
},
|
||||
*/
|
||||
//=========================================================================
|
||||
/*
|
||||
'formValueComponents': function () {
|
||||
return this._formValueComponents;
|
||||
},
|
||||
|
||||
'clearAllFormValueComponents': function () {
|
||||
MochiKit.Iter.forEach(this.formValueComponents(), MochiKit.Base.methodcaller('remove'));
|
||||
this._formValueComponents = [];
|
||||
this.getElement('formValues').innerHTML = '';
|
||||
},
|
||||
|
||||
'addFormValueComponent': function (aFormValueComponent) {
|
||||
this.formValueComponents().push(aFormValueComponent);
|
||||
aFormValueComponent.renderInNode(this.append(this.getElement('formValues'), {tag:'div'}));
|
||||
},
|
||||
*/
|
||||
//=========================================================================
|
||||
|
||||
'changedValue': function (anEvent) {
|
||||
MochiKit.Signal.signal(this, 'changedValue', anEvent);
|
||||
|
||||
this.incrementUpdateFaviconCounter();
|
||||
MochiKit.Async.callLater(1, MochiKit.Base.method(this, 'updateFavicon'));
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'handleBackClick': function (anEvent) {
|
||||
anEvent.preventDefault();
|
||||
|
||||
MochiKit.Signal.signal(this, 'back');
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'bottomMargin': function () {
|
||||
var result;
|
||||
|
||||
// TODO: WTF!!!
|
||||
// result = MochiKit.Style.getElementPosition(this.element())['y'] +
|
||||
// MochiKit.Style.getElementDimensions(this.element())['h'];
|
||||
|
||||
// result = MochiKit.Style.getElementPosition(this.getElement('footer'))['y'];
|
||||
//console.log("### bottomMargin");
|
||||
//console.log('displayElement', this.displayElement());
|
||||
//console.log('-- Clipperz.targetModalDimensionsAndPosition', Clipperz.Base.serializeJSON(Clipperz.PM.UI.Common.Components.BaseComponent.targetModalDimensionsAndPosition));
|
||||
//console.log('element', MochiKit.Style.getElementPosition('modalDialog') ['y'], MochiKit.Style.getElementDimensions('modalDialog')['h']);
|
||||
// result = 450;
|
||||
|
||||
result = Clipperz.PM.UI.Common.Components.BaseComponent.targetModalDimensionsAndPosition['position']['y'] +
|
||||
Clipperz.PM.UI.Common.Components.BaseComponent.targetModalDimensionsAndPosition['dimensions']['h'] -
|
||||
60;
|
||||
|
||||
return result;
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'focusOnUsernameElement': function () {
|
||||
MochiKit.Async.callLater(0.1, MochiKit.Base.method(this.getElement('username'), 'focus'));
|
||||
},
|
||||
|
||||
'focusOnRePassphraseElement': function () {
|
||||
this.getElement('re-passphrase').focus();
|
||||
},
|
||||
/*
|
||||
'focusOnBookmarkletConfigurationElement': function () {
|
||||
this.getElement('bookmarkletConfiguration').focus();
|
||||
},
|
||||
|
||||
'focusOnFaviconElement': function () {
|
||||
this.getElement('faviconURL').focus();
|
||||
},
|
||||
*/
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'hideAllProgeressStates': function () {
|
||||
MochiKit.Style.hideElement(this.getElement('creatingRegistering'));
|
||||
MochiKit.Style.hideElement(this.getElement('creatingDone'));
|
||||
MochiKit.Style.hideElement(this.getElement('creatingFailed'));
|
||||
},
|
||||
|
||||
'showProgressOnUserCreation': function () {
|
||||
//Clipperz.log(">>> NewUserCreationComponent.showProgressOnUserCreation");
|
||||
this.hideAllProgeressStates();
|
||||
MochiKit.Style.showElement(this.getElement('creatingRegistering'));
|
||||
},
|
||||
|
||||
'showUserCreationDone': function () {
|
||||
//Clipperz.log(">>> NewUserCreationComponent.showUserCreationDone");
|
||||
this.hideAllProgeressStates();
|
||||
MochiKit.Style.showElement(this.getElement('creatingDone'));
|
||||
//Clipperz.log("<<< NewUserCreationComponent.showUserCreationDone");
|
||||
},
|
||||
|
||||
'showUserCreationFailed': function () {
|
||||
//Clipperz.log(">>> NewUserCreationComponent.showUserCreationFailed");
|
||||
this.hideAllProgeressStates();
|
||||
MochiKit.Style.showElement(this.getElement('creatingFailed'));
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'handleKeyEvent': function (anEvent) {
|
||||
MochiKit.Signal.signal(this, 'keyPressed', anEvent);
|
||||
/*
|
||||
if (anEvent.key().string == 'KEY_ENTER') {
|
||||
if (anEvent.target().nodeName != 'TEXTAREA') {
|
||||
MochiKit.Signal.signal(this, 'moveForward');
|
||||
anEvent.preventDefault();
|
||||
}
|
||||
} else if (anEvent.key().string == 'KEY_TAB') {
|
||||
if ((anEvent.target().nodeName == 'INPUT') || (anEvent.target().nodeName == 'TEXTAREA')) {
|
||||
MochiKit.Signal.signal(this, 'moveForward');
|
||||
anEvent.preventDefault();
|
||||
}
|
||||
}
|
||||
*/
|
||||
},
|
||||
|
||||
'handleTermsOfServiceCheckboxChange': function (anEvent) {
|
||||
MochiKit.Signal.signal(this, 'changedValue');
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'clear': function () {
|
||||
this.tabPanelController().selectTab(null);
|
||||
Clipperz.PM.UI.Web.Components.NewUserCreationComponent.superclass.clear.apply(this, arguments);
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
__syntaxFix__: "syntax fix"
|
||||
});
|
||||
71
frontend/gamma/js/Clipperz/PM/UI/Web/Components/Page.js
Normal file
71
frontend/gamma/js/Clipperz/PM/UI/Web/Components/Page.js
Normal file
@@ -0,0 +1,71 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
|
||||
|
||||
Clipperz.PM.UI.Web.Components.Page = function(args) {
|
||||
args = args || {};
|
||||
|
||||
Clipperz.PM.UI.Web.Components.Page.superclass.constructor.apply(this, arguments);
|
||||
|
||||
this._slots = {
|
||||
'header': 'pageHeader',
|
||||
'body': 'pageBody',
|
||||
'footer': 'pageFooter'
|
||||
};
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
|
||||
Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.Page, Clipperz.PM.UI.Common.Components.BaseComponent, {
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'toString': function () {
|
||||
return "Clipperz.PM.UI.Web.Components.Page component";
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'renderSelf': function(/*aContainer, aPosition*/) {
|
||||
this.append(this.element(), [
|
||||
{tag:'div', id:'pageHeaderAndBody', cls:'pageHeaderAndBody', children:[
|
||||
{tag:'div', id:'pageHeader', cls:'pageHeader'},
|
||||
{tag:'div', id:'pageBody', cls:'pageBody'}
|
||||
]},
|
||||
{tag:'div', id:'pageFooter', cls:'pageFooter'}
|
||||
]);
|
||||
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
__syntaxFix__: "syntax fix"
|
||||
});
|
||||
@@ -0,0 +1,71 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
|
||||
|
||||
Clipperz.PM.UI.Web.Components.PageFooter = function(args) {
|
||||
args = args || {};
|
||||
|
||||
Clipperz.PM.UI.Web.Components.PageFooter.superclass.constructor.apply(this, arguments);
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
|
||||
Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.PageFooter, Clipperz.PM.UI.Common.Components.BaseComponent, {
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'toString': function () {
|
||||
return "Clipperz.PM.UI.Web.Components.PageFooter component";
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'renderSelf': function(/*aContainer, aPosition*/) {
|
||||
this.append(this.element(), [
|
||||
{tag:'div', cls:'footerWrapper', children:[
|
||||
{tag:'div', cls:'footerContent', children:[
|
||||
// {tag:'div', cls:'footerStarIcon'},
|
||||
{tag:'canvas', id:this.getId('footerStarIcon'), cls:'footerStarIcon'},
|
||||
{tag:'span', cls:'copyright', html:'Copyright © 2009 Clipperz Srl'},
|
||||
{tag:'a', href:'http://www.clipperz.com/terms_of_service', target:'_blank', html:'terms of service'},
|
||||
{tag:'a', href:'http://www.clipperz.com/privacy_policy', target:'_blank', html:'privacy policy'},
|
||||
{tag:'span', cls:'applicationVersion', html:'application version: [1992]'}
|
||||
]}
|
||||
]}
|
||||
]);
|
||||
|
||||
Clipperz.PM.UI.Canvas.star.normal(this.getElement('footerStarIcon'), "#7e7e7e");
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
__syntaxFix__: "syntax fix"
|
||||
});
|
||||
184
frontend/gamma/js/Clipperz/PM/UI/Web/Components/PageHeader.js
Normal file
184
frontend/gamma/js/Clipperz/PM/UI/Web/Components/PageHeader.js
Normal file
@@ -0,0 +1,184 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
|
||||
|
||||
Clipperz.PM.UI.Web.Components.PageHeader = function(args) {
|
||||
args = args || {};
|
||||
|
||||
Clipperz.PM.UI.Web.Components.PageHeader.superclass.constructor.apply(this, arguments);
|
||||
this._newsIsOpen = args.newsIsOpen || false;
|
||||
this._animationDuration = args.animationDuration || 0.5;
|
||||
|
||||
this._offset = 82;
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
|
||||
Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.PageHeader, Clipperz.PM.UI.Common.Components.BaseComponent, {
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'toString': function () {
|
||||
return "Clipperz.PM.UI.Web.Components.PageHeader component";
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'iframeURL': function () {
|
||||
// return './rss_view.html';
|
||||
return 'http://www.clipperz.com/files/clipperz.com/appTips/index.html';
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'renderSelf': function(/*aContainer, aPosition*/) {
|
||||
this.append(this.element(), [
|
||||
{tag:'div', id:'miscLinks', children:[
|
||||
{tag:'ul', children:[
|
||||
{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')}]},
|
||||
{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')}]},
|
||||
{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')}]},
|
||||
{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')}]},
|
||||
{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')}]}
|
||||
]}
|
||||
]},
|
||||
{tag:'div', id:'logoFrame', children:[
|
||||
{tag:'a', href:'http://www.clipperz.com', target:'_blank', children:[{tag:'div', id:'logo'}]},
|
||||
{tag:'h5', cls:'clipperzPayoff', html:'keep it to yourself!'}
|
||||
]},
|
||||
{tag:'div', id:'news', cls:'hidden', children:[
|
||||
// {tag:'div', cls:'close', children:[
|
||||
// {tag:'a', href:'#', id:this.getId('closeTips'), html:'x'}
|
||||
// ]},
|
||||
{tag:'div', id:'newsframe', children:[
|
||||
{tag:'iframe', id:this.getId('iframe'), src:this.iframeURL()}
|
||||
]},
|
||||
{tag:'div', id:this.getId('newsGrip'), cls:'grip', children:[]}
|
||||
]},
|
||||
{tag:'div', id:'featureTabs', children:[
|
||||
{tag:'table', children:[{tag:'tr', children:[
|
||||
{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"}]}]},
|
||||
{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"}]}]},
|
||||
{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"}]}]},
|
||||
{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"}]}]}
|
||||
]}]}
|
||||
]}
|
||||
]);
|
||||
|
||||
Clipperz.PM.UI.Canvas.features.store(this.getElement('storeIcon'), "#ffffff");
|
||||
Clipperz.PM.UI.Canvas.features.protect(this.getElement('protectIcon'), "#ffffff");
|
||||
Clipperz.PM.UI.Canvas.features.directLogin(this.getElement('directLoginIcon'), "#ffffff");
|
||||
Clipperz.PM.UI.Canvas.features.share(this.getElement('shareIcon'), "#ffffff", "#ffffff", "#ff0000");
|
||||
|
||||
MochiKit.Signal.connect(this.getElement('newsGrip'), 'onclick', this, 'toggleTips');
|
||||
MochiKit.Signal.connect(this.getElement('iframe'), 'onload', this, 'handleIframeDidLoad');
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'switchToLoggedMode': function() {
|
||||
// MochiKit.Style.addElementClass(this.element(), 'logged');
|
||||
MochiKit.Style.hideElement('featureTabs');
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'animationDuration': function () {
|
||||
return this._animationDuration;
|
||||
},
|
||||
|
||||
'offset': function () {
|
||||
return this._offset;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'isNewsOpen': function () {
|
||||
return this._newsIsOpen;
|
||||
},
|
||||
|
||||
'toggleNewsIsOpen': function () {
|
||||
this._newsIsOpen = !this._newsIsOpen;
|
||||
},
|
||||
|
||||
'toggleTips': function(anEvent) {
|
||||
anEvent.preventDefault();
|
||||
|
||||
if (this.isNewsOpen() == true) {
|
||||
MochiKit.Visual.Move(Clipperz.DOM.get('news'), {
|
||||
x: 0,
|
||||
y: -this.offset(),
|
||||
mode: 'relative',
|
||||
duration: this.animationDuration(),
|
||||
beforeStart: function () {
|
||||
MochiKit.DOM.setElementClass(Clipperz.DOM.get('news'), 'hiding');
|
||||
},
|
||||
afterFinish: function () {
|
||||
Clipperz.DOM.get('newsframe').innerHTML = "";
|
||||
MochiKit.DOM.setElementClass(Clipperz.DOM.get('news'), 'hidden');
|
||||
}
|
||||
})
|
||||
this.toggleNewsIsOpen();
|
||||
} else {
|
||||
MochiKit.DOM.addElementClass('newsframe', 'loading');
|
||||
MochiKit.Visual.Move(Clipperz.DOM.get('news'), {
|
||||
x: 0,
|
||||
y: this.offset(),
|
||||
mode: 'relative',
|
||||
duration: this.animationDuration(),
|
||||
beforeStart: MochiKit.Base.bind(function () {
|
||||
this.append(Clipperz.DOM.get('newsframe'), {tag:'iframe', id:this.getId('iframe'), src:this.iframeURL()});
|
||||
|
||||
MochiKit.Signal.connect(this.getElement('iframe'), 'onload', this, 'handleIframeDidLoad');
|
||||
MochiKit.DOM.setElementClass(Clipperz.DOM.get('news'), 'opening');
|
||||
}, this),
|
||||
afterFinish: function () {
|
||||
MochiKit.DOM.setElementClass(Clipperz.DOM.get('news'), 'open');
|
||||
}
|
||||
})
|
||||
this.toggleNewsIsOpen();
|
||||
}
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'handleIframeDidLoad': function (anEvent) {
|
||||
if (this.isNewsOpen() == false) {
|
||||
this.toggleTips(anEvent);
|
||||
}
|
||||
|
||||
MochiKit.DOM.removeElementClass('newsframe', 'loading');
|
||||
MochiKit.Signal.disconnectAllTo(this.getElement('iframe'));
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
__syntaxFix__: "syntax fix"
|
||||
});
|
||||
@@ -0,0 +1,164 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
Clipperz.Base.module('Clipperz.PM.UI.Common.Components');
|
||||
|
||||
Clipperz.PM.UI.Web.Components.PasswordTooltip = function(args) {
|
||||
args = args || {};
|
||||
|
||||
Clipperz.PM.UI.Web.Components.PasswordTooltip.superclass.constructor.apply(this, arguments);
|
||||
|
||||
this._referenceElement = args.referenceElement || Clipperz.Base.exception.raise('MandatoryParameter');
|
||||
this._text = args.text || Clipperz.Base.exception.raise('MandatoryParameter');
|
||||
|
||||
this._boxDimensions = null;
|
||||
this._isVisible = false;
|
||||
|
||||
this.renderSelf();
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
|
||||
Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.PasswordTooltip, Clipperz.PM.UI.Common.Components.BaseComponent, {
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'toString': function () {
|
||||
return "Clipperz.PM.UI.Web.Components.PasswordTooltip component";
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'referenceElement': function () {
|
||||
return this._referenceElement;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'text': function () {
|
||||
return this._text;
|
||||
},
|
||||
|
||||
'setText': function (aValue) {
|
||||
this._text = aValue;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'isVisible': function () {
|
||||
return this._isVisible;
|
||||
},
|
||||
|
||||
'setIsVisible': function (aValue) {
|
||||
this._isVisible = aValue;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'renderSelf': function() {
|
||||
this.append(MochiKit.DOM.getElement('Clipperz_PM_UI_Common_Components_Tooltip_wrapperNode'), {tag:'div', id:this.getId('tooltip'), cls:'passwordTooltip', children:[
|
||||
{tag:'div', id:this.getId('body'), cls:'passwordTooltip_body', children:[
|
||||
{tag:'div', cls:'passwordTooltip_text', children:[
|
||||
{tag:'span', html:this.text()}
|
||||
]},
|
||||
{tag:'div', id:this.getId('footer'), cls:'passwordTooltip_footer'}
|
||||
]},
|
||||
{tag:'div', id:this.getId('arrow'), cls:'passwordTooltip_arrow'}
|
||||
]});
|
||||
|
||||
this._boxDimensions = MochiKit.Style.getElementDimensions(this.getId('body'));
|
||||
// this._boxDimensions.h += MochiKit.Style.getElementDimensions(this.getId('footer')).h;
|
||||
|
||||
MochiKit.Style.hideElement(this.displayElement());
|
||||
MochiKit.Signal.connect(this.element(), 'onmouseenter', this, 'show');
|
||||
MochiKit.Signal.connect(this.element(), 'onmouseleave', this, 'hide');
|
||||
},
|
||||
|
||||
//-----------------------------------------------------
|
||||
|
||||
'displayElement': function() {
|
||||
return this.getElement('tooltip');
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'boxDimensions': function () {
|
||||
return this._boxDimensions;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'show': function () {
|
||||
var elementSizeAndPosition;
|
||||
var arrowPosition;
|
||||
var bodyPosition;
|
||||
|
||||
if (this.isVisible() == false) {
|
||||
arrowPosition = {};
|
||||
bodyPosition = {};
|
||||
|
||||
this.setIsVisible(true);
|
||||
elementSizeAndPosition = Clipperz.Style.getSizeAndPosition(this.element());
|
||||
|
||||
MochiKit.Style.setElementDimensions(this.getId('arrow'), {w:36, h:13}, 'px');
|
||||
bodyPosition.x = elementSizeAndPosition.position.x + (elementSizeAndPosition.dimensions.w/2 - this.boxDimensions().w/2);
|
||||
bodyPosition.y = elementSizeAndPosition.position.y - this.boxDimensions().h - 13;
|
||||
|
||||
arrowPosition.x = elementSizeAndPosition.position.x + (elementSizeAndPosition.dimensions.w/2 - 36/2);
|
||||
arrowPosition.y = elementSizeAndPosition.position.y - 13;
|
||||
|
||||
MochiKit.Style.setElementPosition(this.getId('body'), bodyPosition);
|
||||
MochiKit.Style.setElementPosition(this.getId('arrow'), arrowPosition);
|
||||
MochiKit.Visual.appear(this.displayElement(), {duration:0.4});
|
||||
}
|
||||
},
|
||||
|
||||
'hide': function () {
|
||||
if (this.isVisible() == true) {
|
||||
MochiKit.Visual.fade(this.displayElement(), {duration:0.4});
|
||||
this.setIsVisible(false);
|
||||
}
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
/*
|
||||
'shouldRemoveElementWhenClearningUp': function () {
|
||||
return false;
|
||||
},
|
||||
*/
|
||||
//-------------------------------------------------------------------------
|
||||
__syntaxFix__: "syntax fix"
|
||||
});
|
||||
|
||||
Clipperz.PM.UI.Web.Components.PasswordTooltip.initTooltips = function () {
|
||||
Clipperz.DOM.Helper.insertBefore(MochiKit.DOM.currentDocument().body.childNodes[0], {tag:'div', id:'Clipperz_PM_UI_Web_Components_PasswordTooltip_wrapperNode'});
|
||||
}
|
||||
|
||||
MochiKit.DOM.addLoadEvent(Clipperz.PM.UI.Web.Components.PasswordTooltip.initTooltips);
|
||||
@@ -0,0 +1,324 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
|
||||
|
||||
Clipperz.PM.UI.Web.Components.RulerComponent = function(args) {
|
||||
args = args || {};
|
||||
Clipperz.PM.UI.Web.Components.RulerComponent.superclass.constructor.apply(this, arguments);
|
||||
|
||||
this._translationContext = args.translationContext || Clipperz.Base.exception.raise('MandatoryParameter');
|
||||
// this._steps = args.steps || Clipperz.Base.exception.raise('MandatoryParameter');
|
||||
this._steps = args.steps;
|
||||
|
||||
this._currentStep = -1;
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
|
||||
Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.RulerComponent, Clipperz.PM.UI.Common.Components.BaseComponent, {
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'toString': function () {
|
||||
return "Clipperz.PM.UI.Web.Components.RulerComponent component";
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'resetStatus': function (args) {
|
||||
args = args || {};
|
||||
|
||||
if (this.currentStep() != 0) {
|
||||
var shouldAnimateTransition;
|
||||
|
||||
shouldAnimateTransition = args.animateTransition || false;
|
||||
|
||||
if (shouldAnimateTransition) {
|
||||
this.moveToFirstStep(MochiKit.Base.method(this, 'cursorMoved'));
|
||||
} else {
|
||||
this._currentStep = 0;
|
||||
this.cursorMoved();
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'translationContext': function () {
|
||||
return this._translationContext;
|
||||
},
|
||||
|
||||
'steps': function () {
|
||||
return this._steps;
|
||||
},
|
||||
|
||||
'setSteps': function (aValue) {
|
||||
this._steps = aValue;
|
||||
this.renderStepsComponents();
|
||||
this.resetStatus();
|
||||
},
|
||||
|
||||
'translatedStepDescription': function (aStep) {
|
||||
return Clipperz.PM.Strings.getValue(this.translationContext() + '.' + aStep + '.' + 'name');
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'renderSelf': function(/*aContainer, aPosition*/) {
|
||||
this.setElement(this.append(MochiKit.DOM.currentDocument().body, [
|
||||
{tag:'div', id:this.getId('rulerWrapper'), cls:'rulerWrapper fixed', children:[
|
||||
{tag:'div', cls:'ruler', children:[
|
||||
{tag:'a', href:'#', id:this.getId('exit'), cls:'exit', html:' '},
|
||||
{tag:'a', href:'#', id:this.getId('smallPreviousButton'), cls:'smallButton previous', html:' '},
|
||||
{tag:'a', href:'#', id:this.getId('smallNextButton'), cls:'smallButton next', html:' '},
|
||||
{tag:'div', cls:'marker', id:this.getId('marker'), children:[
|
||||
{tag:'div', cls:'previous', id:this.getId('previousButton')},
|
||||
{tag:'div', cls:'markerBody'},
|
||||
{tag:'div', cls:'next', id:this.getId('nextButton')}
|
||||
]},
|
||||
{tag:'div', cls:'steps', id:this.getId('stepsFrame')},
|
||||
// {tag:'div', cls:'steps' + ' ' + 'steps_' + this.steps().length, children:[
|
||||
// {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())}
|
||||
// ]},
|
||||
{tag:'div', cls:'dots', id:this.getId('dotsFrame')}
|
||||
// {tag:'div', cls:'dots' + ' ' + 'steps_' + this.steps().length, children:[
|
||||
// {tag:'ul', id:this.getId('dots'), children:MochiKit.Base.map(function (aStep) { return {tag:'li', children:[{tag:'span', html:'*'}]}}, this.steps())}
|
||||
// ]}
|
||||
]}
|
||||
]}
|
||||
]));
|
||||
//console.log("ELEMENT", this.element());
|
||||
|
||||
MochiKit.Signal.connect(this.getElement('exit'), 'onclick', this, 'handleExit');
|
||||
|
||||
MochiKit.Signal.connect(this.getElement('previousButton'), 'onclick', this, 'handlePrevious');
|
||||
MochiKit.Signal.connect(this.getElement('smallPreviousButton'), 'onclick', this, 'handlePrevious');
|
||||
|
||||
MochiKit.Signal.connect(this.getElement('nextButton'), 'onclick', this, 'handleNext');
|
||||
MochiKit.Signal.connect(this.getElement('smallNextButton'), 'onclick', this, 'handleNext');
|
||||
|
||||
this.enablePrevious(false);
|
||||
this.enableNext(false);
|
||||
|
||||
// this.cursorMoved();
|
||||
},
|
||||
|
||||
//.........................................................................
|
||||
|
||||
'renderStepsComponents': function () {
|
||||
var stepsFrame;
|
||||
var dotsFrame;
|
||||
|
||||
stepsFrames = this.getElement('stepsFrame');
|
||||
MochiKit.DOM.setElementClass(stepsFrames, 'steps');
|
||||
MochiKit.DOM.addElementClass(stepsFrames, 'steps_' + this.steps().length);
|
||||
|
||||
stepsFrames.innerHTML = "";
|
||||
this.append(stepsFrames, {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())}
|
||||
);
|
||||
|
||||
dotsFrames = this.getElement('dotsFrame');
|
||||
MochiKit.DOM.setElementClass(dotsFrames, 'dots');
|
||||
MochiKit.DOM.addElementClass(dotsFrames, 'steps_' + this.steps().length);
|
||||
|
||||
dotsFrames.innerHTML = "";
|
||||
this.append(dotsFrames, {tag:'ul', id:this.getId('dots'), children:MochiKit.Base.map(
|
||||
function (aStep) { return {tag:'li', children:[{tag:'span', html:'*'}]}; },
|
||||
this.steps())}
|
||||
);
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'handleExit': function (anEvent) {
|
||||
anEvent.preventDefault();
|
||||
|
||||
MochiKit.Signal.signal(this, 'exit');
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'handlePrevious': function (anEvent) {
|
||||
anEvent.preventDefault();
|
||||
|
||||
// if (!MochiKit.DOM.hasElementClass(this.getElement('previousButton'), 'disabled')) {
|
||||
// this.moveBackward();
|
||||
// }
|
||||
|
||||
MochiKit.Signal.signal(this, 'moveBackward');
|
||||
},
|
||||
|
||||
'handleNext': function (anEvent) {
|
||||
anEvent.preventDefault();
|
||||
|
||||
// if (!MochiKit.DOM.hasElementClass(this.getElement('nextButton'), 'disabled')) {
|
||||
// this.moveForward();
|
||||
// }
|
||||
|
||||
MochiKit.Signal.signal(this, 'moveForward');
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'currentStep': function () {
|
||||
return this._currentStep;
|
||||
},
|
||||
|
||||
'markerInitialOffset': function () {
|
||||
return -246;
|
||||
},
|
||||
|
||||
'markerStepOffset': function () {
|
||||
return 410 / (this.steps().length - 1);
|
||||
// return 100;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'moveToFirstStep': function (aCallback) {
|
||||
var stepsToMove;
|
||||
|
||||
stepsToMove = this._currentStep;
|
||||
this._currentStep = 0;
|
||||
|
||||
this.enablePrevious(false);
|
||||
this.enableNext(false);
|
||||
// MochiKit.Signal.signal(this, 'moveBackward');
|
||||
MochiKit.Base.map(
|
||||
function (anElement) { MochiKit.DOM.removeElementClass(anElement, 'selected'); },
|
||||
MochiKit.Selector.findChildElements(this.element(), ['li.selected'])
|
||||
);
|
||||
new MochiKit.Visual.Move(this.getElement('marker'), {
|
||||
x:-(this.markerStepOffset() * stepsToMove),
|
||||
mode:'relative',
|
||||
duration:(0.5 * (stepsToMove/2)),
|
||||
// afterFinish:MochiKit.Base.method(this, 'cursorMoved')
|
||||
afterFinish:MochiKit.Base.compose(MochiKit.Base.method(this, 'cursorMoved'), aCallback)
|
||||
});
|
||||
},
|
||||
|
||||
'moveBackward': function (aCallback) {
|
||||
this._currentStep --;
|
||||
|
||||
this.enablePrevious(false);
|
||||
this.enableNext(false);
|
||||
// MochiKit.Signal.signal(this, 'moveBackward');
|
||||
MochiKit.Base.map(
|
||||
function (anElement) { MochiKit.DOM.removeElementClass(anElement, 'selected'); },
|
||||
MochiKit.Selector.findChildElements(this.element(), ['li.selected'])
|
||||
);
|
||||
new MochiKit.Visual.Move(this.getElement('marker'), {
|
||||
x:-this.markerStepOffset(),
|
||||
mode:'relative',
|
||||
duration:0.5,
|
||||
// afterFinish:MochiKit.Base.method(this, 'cursorMoved')
|
||||
afterFinish:MochiKit.Base.compose(MochiKit.Base.method(this, 'cursorMoved'), aCallback)
|
||||
});
|
||||
},
|
||||
|
||||
'moveForward': function (aCallback) {
|
||||
this._currentStep ++;
|
||||
|
||||
if (this._currentStep < this.steps().length) {
|
||||
this.enablePrevious(false);
|
||||
this.enableNext(false);
|
||||
// MochiKit.Signal.signal(this, 'moveForward');
|
||||
MochiKit.Base.map(
|
||||
function (anElement) { MochiKit.DOM.removeElementClass(anElement, 'selected'); },
|
||||
MochiKit.Selector.findChildElements(this.element(), ['li.selected'])
|
||||
);
|
||||
new MochiKit.Visual.Move(this.getElement('marker'), {
|
||||
x:this.markerStepOffset(),
|
||||
mode:'relative',
|
||||
duration:0.5,
|
||||
// afterFinish:MochiKit.Base.method(this, 'cursorMoved')
|
||||
afterFinish:MochiKit.Base.compose(MochiKit.Base.method(this, 'cursorMoved'), aCallback)
|
||||
});
|
||||
} else {
|
||||
MochiKit.Signal.signal(this, 'done');
|
||||
}
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'enablePrevious': function (aValue) {
|
||||
if (aValue == true) {
|
||||
MochiKit.DOM.removeElementClass(this.getElement('previousButton'), 'disabled');
|
||||
MochiKit.DOM.removeElementClass(this.getElement('smallPreviousButton'), 'disabled');
|
||||
} else {
|
||||
MochiKit.DOM.addElementClass(this.getElement('previousButton'), 'disabled');
|
||||
MochiKit.DOM.addElementClass(this.getElement('smallPreviousButton'), 'disabled');
|
||||
}
|
||||
},
|
||||
|
||||
// 'disablePrevious': function () {
|
||||
// MochiKit.DOM.addElementClass(this.getElement('previousButton'), 'disabled');
|
||||
// },
|
||||
|
||||
//.........................................................................
|
||||
|
||||
'enableNext': function (aValue) {
|
||||
if (aValue == true) {
|
||||
MochiKit.DOM.removeElementClass(this.getElement('nextButton'), 'disabled');
|
||||
MochiKit.DOM.removeElementClass(this.getElement('smallNextButton'), 'disabled');
|
||||
} else {
|
||||
MochiKit.DOM.addElementClass(this.getElement('nextButton'), 'disabled');
|
||||
MochiKit.DOM.addElementClass(this.getElement('smallNextButton'), 'disabled');
|
||||
}
|
||||
},
|
||||
|
||||
// 'disableNext': function () {
|
||||
// MochiKit.DOM.addElementClass(this.getElement('nextButton'), 'disabled');
|
||||
// },
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'cursorMoved': function () {
|
||||
MochiKit.Style.setElementPosition(this.getElement('marker'), {x:this.markerStepOffset() * this.currentStep() + this.markerInitialOffset()})
|
||||
MochiKit.Signal.signal(this, 'cursorMoved');
|
||||
|
||||
MochiKit.DOM.addElementClass(this.getElement('steps').childNodes[this.currentStep()], 'selected');
|
||||
MochiKit.DOM.addElementClass(this.getElement('dots').childNodes[this.currentStep()], 'selected');
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'setDisplayMode': function (aValue) {
|
||||
MochiKit.DOM.removeElementClass(this.getElement('rulerWrapper'), 'fixed');
|
||||
MochiKit.DOM.removeElementClass(this.getElement('rulerWrapper'), 'scrollable');
|
||||
MochiKit.DOM.addElementClass(this.getElement('rulerWrapper'), aValue);
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
__syntaxFix__: "syntax fix"
|
||||
});
|
||||
193
frontend/gamma/js/Clipperz/PM/UI/Web/Components/TabSidePanel.js
Normal file
193
frontend/gamma/js/Clipperz/PM/UI/Web/Components/TabSidePanel.js
Normal file
@@ -0,0 +1,193 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
|
||||
|
||||
Clipperz.PM.UI.Web.Components.TabSidePanel = function(args) {
|
||||
args = args || {};
|
||||
Clipperz.PM.UI.Web.Components.TabSidePanel.superclass.constructor.call(this, args);
|
||||
|
||||
this._element = args.element || null;
|
||||
|
||||
this._slots = {
|
||||
};
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
|
||||
Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.TabSidePanel, Clipperz.PM.UI.Common.Components.BaseComponent, {
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'toString': function () {
|
||||
return "Clipperz.PM.UI.Web.Components.TabSidePanel component";
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'deselectAllTabs': function() {
|
||||
var tabListItems;
|
||||
|
||||
tabListItems = [
|
||||
'cardsLI',
|
||||
// 'directLoginLI',
|
||||
'accountLI',
|
||||
'dataLI',
|
||||
'toolsLI'
|
||||
];
|
||||
|
||||
//Clipperz.log("=== TabSidePanel.tabSelected anEvent.src().id", anEvent.src().id);
|
||||
for (var i in tabListItems) {
|
||||
//Clipperz.log("=== TabSidePanel.tabSelected aTabListItem", tabListItems[i]);
|
||||
MochiKit.DOM.removeElementClass(this.getId(tabListItems[i]), 'selected');
|
||||
}
|
||||
},
|
||||
|
||||
'selectTab': function(aTabName) {
|
||||
this.deselectAllTabs();
|
||||
MochiKit.DOM.addElementClass(this.getId(this.listItemIdForTabNamed(aTabName)), 'selected');
|
||||
MochiKit.Signal.signal(this, 'tabSelected', aTabName);
|
||||
},
|
||||
|
||||
'tabNameForAnchorId': function(anId) {
|
||||
var result;
|
||||
|
||||
switch(anId) {
|
||||
case 'cards_tabSidePanel':
|
||||
result = 'cards';
|
||||
break;
|
||||
// case 'directLogins_tabSidePanel':
|
||||
// result = 'directLogins';
|
||||
// break;
|
||||
case 'account_tabSidePanel':
|
||||
result = 'account';
|
||||
break;
|
||||
case 'data_tabSidePanel':
|
||||
result = 'data';
|
||||
break;
|
||||
case 'tools_tabSidePanel':
|
||||
result = 'tools';
|
||||
break;
|
||||
}
|
||||
|
||||
return result;
|
||||
},
|
||||
|
||||
'listItemIdForTabNamed': function(aTabName) {
|
||||
var result;
|
||||
|
||||
switch (aTabName) {
|
||||
case 'cards':
|
||||
result = 'cardsLI';
|
||||
break;
|
||||
// case 'directLogins':
|
||||
// result = 'directLoginLI';
|
||||
// break;
|
||||
case 'account':
|
||||
result = 'accountLI';
|
||||
break;
|
||||
case 'data':
|
||||
result = 'dataLI';
|
||||
break;
|
||||
case 'tools':
|
||||
result = 'toolsLI';
|
||||
break;
|
||||
}
|
||||
|
||||
return result;
|
||||
},
|
||||
|
||||
'tabSelected': function (anEvent) {
|
||||
this.selectTab(this.tabNameForAnchorId(anEvent.src().id));
|
||||
// anEvent.stop();
|
||||
anEvent.preventDefault();
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'addCard': function (anEvent) {
|
||||
anEvent.stop();
|
||||
MochiKit.Signal.signal(this, 'addCard', anEvent.src());
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'renderSelf': function(/*aContainer, aPosition*/) {
|
||||
this.append(this.element(), [
|
||||
{tag:'div', cls:'header'},
|
||||
{tag:'div', cls:'body', children:[
|
||||
{tag:'ul', cls:'mainTabs', children:[
|
||||
{tag:'li', id:this.getId('cardsLI'), cls:'cards', children:[
|
||||
{tag:'a', id:'cards_tabSidePanel', href:'#', html:"cards"},
|
||||
{tag:'div', cls:'selectionHighlighter', children:[
|
||||
{tag:'img', src:'./images/old/main/tabs/selectionHighligher.png'},
|
||||
{tag:'a', id:this.getId('addCardA'), cls:'add', href:'#', children:[
|
||||
{tag:'span', html:"add"},
|
||||
{tag:'h3', html:"+"}
|
||||
]}
|
||||
]}
|
||||
]}
|
||||
]},
|
||||
{tag:'ul', cls:'otherTabs', children:[
|
||||
{tag:'li', id:this.getId('accountLI'), children:[
|
||||
{tag:'a', id:'account_tabSidePanel', href:'#', html:"account"},
|
||||
{tag:'div', cls:'selectionHighlighter', children:[
|
||||
{tag:'img', src:'./images/old/main/tabs/selectionHighligherGray.png'}
|
||||
]}
|
||||
]},
|
||||
{tag:'li', id:this.getId('dataLI'), children:[
|
||||
{tag:'a', id:'data_tabSidePanel', href:'#', html:"data"},
|
||||
{tag:'div', cls:'selectionHighlighter', children:[
|
||||
{tag:'img', src:'./images/old/main/tabs/selectionHighligherGray.png'}
|
||||
]}
|
||||
]},
|
||||
{tag:'li', id:this.getId('toolsLI'), children:[
|
||||
{tag:'a', id:'tools_tabSidePanel', href:'#', html:"tools"},
|
||||
{tag:'div', cls:'selectionHighlighter', children:[
|
||||
{tag:'img', src:'./images/old/main/tabs/selectionHighligherGray.png'}
|
||||
]}
|
||||
]}
|
||||
]}
|
||||
]},
|
||||
{tag:'div', cls:'footer'}
|
||||
]);
|
||||
|
||||
MochiKit.Signal.connect('cards_tabSidePanel', 'onclick', this, 'tabSelected');
|
||||
// MochiKit.Signal.connect('directLogins_tabSidePanel', 'onclick', this, 'tabSelected');
|
||||
MochiKit.Signal.connect('account_tabSidePanel', 'onclick', this, 'tabSelected');
|
||||
MochiKit.Signal.connect('data_tabSidePanel', 'onclick', this, 'tabSelected');
|
||||
MochiKit.Signal.connect('tools_tabSidePanel', 'onclick', this, 'tabSelected');
|
||||
MochiKit.Signal.connect(this.getId('addCardA'), 'onclick', this, 'addCard');
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
__syntaxFix__: "syntax fix"
|
||||
});
|
||||
@@ -0,0 +1,53 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
|
||||
|
||||
//#############################################################################
|
||||
|
||||
Clipperz.PM.UI.Web.Components.TextColumnManager = function(args) {
|
||||
args = args || {};
|
||||
Clipperz.PM.UI.Web.Components.TextColumnManager.superclass.constructor.call(this, args);
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
|
||||
Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.TextColumnManager, Clipperz.PM.UI.Web.Components.ColumnManager, {
|
||||
|
||||
'toString': function () {
|
||||
return "Clipperz.PM.UI.Web.Components.TextColumnManager component";
|
||||
},
|
||||
|
||||
//-----------------------------------------------------
|
||||
|
||||
'__syntax_fix__' : 'syntax fix'
|
||||
|
||||
});
|
||||
|
||||
113
frontend/gamma/js/Clipperz/PM/UI/Web/Components/ToolsPanel.js
Normal file
113
frontend/gamma/js/Clipperz/PM/UI/Web/Components/ToolsPanel.js
Normal file
@@ -0,0 +1,113 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
|
||||
|
||||
Clipperz.PM.UI.Web.Components.ToolsPanel = function(args) {
|
||||
args = args || {};
|
||||
|
||||
Clipperz.PM.UI.Web.Components.ToolsPanel.superclass.constructor.apply(this, arguments);
|
||||
|
||||
this._initiallySelectedTab = args.selected || 'PASSWORD_GENERATOR';
|
||||
this._tabPanelControllerConfiguration = {
|
||||
'PASSWORD_GENERATOR': {
|
||||
tab: 'passwordGeneratorTab',
|
||||
panel: 'passwordGeneratorPanel'
|
||||
},
|
||||
'BOOKMARKLET': {
|
||||
tab: 'bookmarkletTab',
|
||||
panel: 'bookmarkletPanel'
|
||||
},
|
||||
'COMPACT_EDITION': {
|
||||
tab: 'compactEditionTab',
|
||||
panel: 'compactEditionPanel'
|
||||
},
|
||||
'HTTP_AUTH': {
|
||||
tab: 'httpAuthTab',
|
||||
panel: 'httpAuthPanel'
|
||||
}
|
||||
};
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
|
||||
Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.ToolsPanel, Clipperz.PM.UI.Common.Components.TabPanelComponent, {
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'toString': function () {
|
||||
return "Clipperz.PM.UI.Web.Components.ToolsPanel component";
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'renderSelf': function(/*aContainer, aPosition*/) {
|
||||
this.append(this.element(), [
|
||||
{tag:'div', cls:'header', children:[
|
||||
{tag:'div', cls:'subPanelTabs', children:[
|
||||
{tag:'ul', children:[
|
||||
{tag:'li', id:this.getId('passwordGeneratorTab'), children:[{tag:'a', href:'#', html:'Password generator'}], cls:'first'},
|
||||
{tag:'li', id:this.getId('bookmarkletTab'), children:[{tag:'a', href:'#', html:'Bookmarklet'}]},
|
||||
{tag:'li', id:this.getId('compactEditionTab'), children:[{tag:'a', href:'#', html:'Compact edition'}]},
|
||||
{tag:'li', id:this.getId('httpAuthTab'), children:[{tag:'a', href:'#', html:'HTTP Auth'}]}
|
||||
]}
|
||||
]}
|
||||
]},
|
||||
{tag:'div', cls:'body', children:[
|
||||
{tag:'div', cls:'accountPanel', children:[
|
||||
{tag:'div', cls:'subPanelContent', children:[
|
||||
{tag:'ul', children:[
|
||||
{tag:'li', id:this.getId('passwordGeneratorPanel'), children:[
|
||||
{tag:'h3', html:"Password generator"}
|
||||
]},
|
||||
{tag:'li', id:this.getId('bookmarkletPanel'), children:[
|
||||
{tag:'h3', html:"Bookmarklet"}
|
||||
]},
|
||||
{tag:'li', id:this.getId('compactEditionPanel'), children:[
|
||||
{tag:'h3', html:"Compact edition"}
|
||||
]},
|
||||
{tag:'li', id:this.getId('httpAuthPanel'), children:[
|
||||
{tag:'h3', html:"HTTP Auth"}
|
||||
]}
|
||||
]}
|
||||
]}
|
||||
]}
|
||||
]},
|
||||
{tag:'div', cls:'footer'}
|
||||
]);
|
||||
|
||||
this.tabPanelController().setup({selected:this.initiallySelectedTab()});
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
|
||||
__syntaxFix__: "syntax fix"
|
||||
});
|
||||
@@ -0,0 +1,184 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
|
||||
|
||||
Clipperz.PM.UI.Web.Components.UnlockPasswordComponent = function(args) {
|
||||
args = args || {};
|
||||
|
||||
Clipperz.PM.UI.Web.Components.UnlockPasswordComponent.superclass.constructor.apply(this, arguments);
|
||||
|
||||
this._openFromElement = args.openFromElement || null;
|
||||
this._onOkCloseToElement = args.onOkCloseToElement || null;
|
||||
this._onCancelCloseToElement = args.onCancelCloseToElement || null;
|
||||
|
||||
this._progressBarComponent = null;
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
|
||||
Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.UnlockPasswordComponent, Clipperz.PM.UI.Common.Components.SimpleMessagePanel, {
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'toString': function () {
|
||||
return "Clipperz.PM.UI.Web.Components.UnlockPasswordComponent component";
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'getPassphrase': function () {
|
||||
/* var deferredResult;
|
||||
|
||||
if (this.passphrase() == null) {
|
||||
this.deferredShowModal({'openFromElement': this.openFromElement()});
|
||||
deferredResult = this.deferred();
|
||||
} else {
|
||||
deferredResult = MochiKit.Async.succeed(this.passphrase());
|
||||
}
|
||||
|
||||
return deferredResult;
|
||||
*/
|
||||
|
||||
this.deferredShowModal({'openFromElement': this.openFromElement()});
|
||||
|
||||
return this.deferred();
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'deferredShowModal': function (someParameters) {
|
||||
return Clipperz.Async.callbacks("UnlockPasswordComponent.deferredShowModal", [
|
||||
MochiKit.Base.bind(Clipperz.PM.UI.Web.Components.UnlockPasswordComponent.superclass.deferredShowModal, this, someParameters),
|
||||
MochiKit.Base.method(this, 'getElement', 'passphrase'),
|
||||
MochiKit.Base.methodcaller('focus')
|
||||
], {trace:false})
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'openFromElement': function () {
|
||||
return this._openFromElement;
|
||||
},
|
||||
|
||||
'onOkCloseToElement': function () {
|
||||
return this._onOkCloseToElement;
|
||||
},
|
||||
|
||||
'onCancelCloseToElement': function () {
|
||||
return this._onCancelCloseToElement;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'renderSelf': function() {
|
||||
Clipperz.PM.UI.Web.Components.UnlockPasswordComponent.superclass.renderSelf.apply(this, arguments);
|
||||
|
||||
this.append(this.getElement('container'), {tag:'div', cls:'passphrase', children: [
|
||||
// {tag:'form', id:this.getId('passphraseForm'), children:[
|
||||
{tag:'input', id:this.getId('passphrase'), type:'password', name:'passphrase', value:''}
|
||||
// ]}
|
||||
]});
|
||||
|
||||
MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'userSuccessfullyLoggedIn', this, 'userSuccessfullyLoggedInHandler');
|
||||
MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'userLoginFailed', this, 'userLoginFailedHandler');
|
||||
|
||||
|
||||
// MochiKit.Async.callLater(0.1, MochiKit.Base.method(this.getElement('passphrase'), 'focus'));
|
||||
// this.getElement('passphrase').select();
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'showProgressBar': function () {
|
||||
var progressBarElement;
|
||||
|
||||
this.getElement('container').innerHTML = '';
|
||||
|
||||
progressBarElement = this.append(this.getElement('container'), {tag:'div', cls:'progressBarWrapper'});
|
||||
this.addComponent(new Clipperz.PM.UI.Common.Components.ProgressBar({'element':progressBarElement}));
|
||||
|
||||
this.setButtons([{text:"Cancel", result:'CANCEL'}]);
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'showFailure': function () {
|
||||
this.setType('ALERT');
|
||||
this.setTitle("Login failed");
|
||||
this.setText("Wrong passphrase; the unlock has failed.");
|
||||
this.getElement('container').innerHTML = '';
|
||||
this.setButtons([{text:"Close", result:'CANCEL', isDefault:true}]);
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'closeOk': function () {
|
||||
var passphrase;
|
||||
|
||||
passphrase = this.getElement('passphrase').value;
|
||||
this.showProgressBar();
|
||||
// this.deferred().callback(passphrase);
|
||||
MochiKit.Async.callLater(0.5, MochiKit.Base.method(this.deferred(), 'callback', passphrase));
|
||||
this._deferred = null;
|
||||
},
|
||||
|
||||
'closeCancel': function () {
|
||||
this.deferredHideModal({closeToElement:this.onCancelCloseToElement()});
|
||||
this.deferred().cancel();
|
||||
this._deferred = null;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'userSuccessfullyLoggedInHandler': function (anEvent) {
|
||||
this.deferredHideModal({closeToElement:this.onOkCloseToElement()});
|
||||
},
|
||||
|
||||
'userLoginFailedHandler': function (anEvent) {
|
||||
//console.log("############### FAILED LOGIN ################");
|
||||
this.showFailure();
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
/*
|
||||
'deferredShow': function (someArgs, aResult) {
|
||||
this.deferredShowModal(someArgs);
|
||||
|
||||
// this.deferred().addMethod(this, 'deferredHideModal', {closeToElement:someArgs.onOkCloseToElement });
|
||||
// this.deferred().addErrback (MochiKit.Base.method(this, 'deferredHideModal', {closeToElement:someArgs.onCancelCloseToElement }));
|
||||
// this.deferred().addCallback(MochiKit.Async.succeed, aResult);
|
||||
|
||||
return this.deferred();
|
||||
},
|
||||
*/
|
||||
//-------------------------------------------------------------------------
|
||||
__syntaxFix__: "syntax fix"
|
||||
});
|
||||
346
frontend/gamma/js/Clipperz/PM/UI/Web/Components/UserInfoBox.js
Normal file
346
frontend/gamma/js/Clipperz/PM/UI/Web/Components/UserInfoBox.js
Normal file
@@ -0,0 +1,346 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
|
||||
|
||||
Clipperz.PM.UI.Web.Components.UserInfoBox = function(args) {
|
||||
args = args || {};
|
||||
|
||||
Clipperz.PM.UI.Web.Components.UserInfoBox.superclass.constructor.apply(this, arguments);
|
||||
|
||||
this._slots = { };
|
||||
this._isLocked = false;
|
||||
this._lockTooltip = null;
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
|
||||
Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.UserInfoBox, Clipperz.PM.UI.Common.Components.BaseComponent, {
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'toString': function () {
|
||||
return "Clipperz.PM.UI.Web.Components.UserInfoBox component";
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'handleLogout': function(anEvent) {
|
||||
//Clipperz.log(">>> UserInfoBox.handleLogout");
|
||||
anEvent.preventDefault();
|
||||
MochiKit.Signal.signal(this, 'logout');
|
||||
//Clipperz.log("<<< UserInfoBox.handleLogout");
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'lockTooltip': function () {
|
||||
return this._lockTooltip;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'isLocked': function () {
|
||||
return this._isLocked;
|
||||
},
|
||||
|
||||
'setIsLocked': function (aValue) {
|
||||
this._isLocked = aValue;
|
||||
},
|
||||
|
||||
'toggleLock': function(anEvent) {
|
||||
var deferredResult;
|
||||
var shouldLock;
|
||||
|
||||
//console.log(">>> UserInfoBox.toggleLock [locked: " + this.isLocked() + "]");
|
||||
anEvent.preventDefault();
|
||||
this.lockTooltip().hide();
|
||||
|
||||
shouldLock = (this.isLocked() == false);
|
||||
|
||||
if (shouldLock) {
|
||||
var maskElement;
|
||||
|
||||
this.setIsLocked(true);
|
||||
maskElement = this.getId('modalDialogMask');
|
||||
deferredResult = Clipperz.Async.callbacks("UserInfoBox.toggleLock [lock]", [
|
||||
MochiKit.Base.partial(MochiKit.DOM.addElementClass, this.element(), 'locked'),
|
||||
MochiKit.Base.partial(Clipperz.Visual.deferredAnimation, MochiKit.Visual.appear, maskElement, {from:0.0, to:0.75, duration:0.5}),
|
||||
MochiKit.Base.method(Clipperz.PM.RunTime.mainController, 'setPassphraseDelegate', MochiKit.Base.method(this, 'askForPassphrase')),
|
||||
MochiKit.Base.partial(MochiKit.Signal.signal, this, 'lock')
|
||||
], {trace:false});
|
||||
} else {
|
||||
deferredResult = Clipperz.Async.callbacks("UserInfoBox.toggleLock [unlock]", [
|
||||
MochiKit.Base.partial(MochiKit.Signal.signal, this, 'unlock')
|
||||
], {trace:false});
|
||||
}
|
||||
//console.log("<<< UserInfoBox.toggleLock");
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'unlock': function () {
|
||||
var deferredResult;
|
||||
var maskElement;
|
||||
|
||||
this.setIsLocked(false);
|
||||
maskElement = this.getId('modalDialogMask');
|
||||
|
||||
deferredResult = Clipperz.Async.callbacks("UserInfoBox.unlock", [
|
||||
MochiKit.Base.partial(Clipperz.Visual.deferredAnimation, MochiKit.Visual.fade, maskElement, {from:0.75, to:0.0, duration:0.5}),
|
||||
// Clipperz.Visual.deferredAnimation(MochiKit.Visual.fade, maskElement, {from:0.75, to:0.0, duration:0.5}),
|
||||
MochiKit.Base.partial(MochiKit.DOM.removeElementClass, this.element(), 'locked')
|
||||
], {trace:false});
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'askForPassphrase': function () {
|
||||
var unlockPasswordComponent;
|
||||
/*
|
||||
var deferredResult;
|
||||
|
||||
deferredResult = new Clipperz.Async.Deferred("UserInfoBox.askForPassphrase", {trace:false});
|
||||
deferredResult.addCallback(MochiKit.Async.succeed, 'test');
|
||||
|
||||
deferredResult.callback();
|
||||
|
||||
return deferredResult;
|
||||
*/
|
||||
//console.log(">>> UserInfoBox.askForPassphrase");
|
||||
unlockPasswordComponent = new Clipperz.PM.UI.Web.Components.UnlockPasswordComponent({
|
||||
'title': "Unlock account",
|
||||
'text': "Insert the passprase to unlock the account",
|
||||
'type': 'INFO',
|
||||
'buttons': [
|
||||
{text:"Cancel", result:'CANCEL'},
|
||||
{text:"Unlock", result:'OK', isDefault:true}
|
||||
],
|
||||
'openFromElement': this.getElement('lock'),
|
||||
'onOkCloseToElement': null,
|
||||
'onCancelCloseToElement': this.getId('lock')
|
||||
});
|
||||
//console.log("<<< UserInfoBox.askForPassphrase");
|
||||
|
||||
return unlockPasswordComponent.getPassphrase();
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'renderSelf': function(/*aContainer, aPosition*/) {
|
||||
this.append(this.element(), [
|
||||
// {tag:'canvas', id:this.getId('canvas'), cls:'canvas', width:'188', height:'154'},
|
||||
{tag:'div', cls:'header', children:[
|
||||
{tag:'h1', html:"Welcome"},
|
||||
{tag:'a', cls:'lockButton', href:'#', id:this.getId('lock'), html:' '}
|
||||
]},
|
||||
{tag:'div', cls:'body', children:[
|
||||
{tag:'h3', id:this.getId('username'), html:""},
|
||||
{tag:'ul', children:[
|
||||
{tag:'li', id:this.getId('cards'), children:[
|
||||
{tag:'span', id:this.getId('cardsNumber'), cls:'number', html:"-"},
|
||||
{tag:'span', id:this.getId('cardsLabel'), html:"cards"}
|
||||
]},
|
||||
{tag:'li', id:this.getId('directLogins'), children:[
|
||||
{tag:'span', id:this.getId('directLoginsNumber'), cls:'number', html:"-"},
|
||||
{tag:'span', id:this.getId('directLoginsLabel'), html:"direct logins"}
|
||||
]}
|
||||
]},
|
||||
{tag:'a', href:'#', id:this.getId('logout'), html:"logout >"}
|
||||
]},
|
||||
{tag:'div', cls:'footer'}
|
||||
]);
|
||||
|
||||
MochiKit.Signal.connect(this.getElement('logout'), 'onclick', this, 'handleLogout');
|
||||
MochiKit.Signal.connect(this.getElement('lock'), 'onclick', this, 'toggleLock');
|
||||
|
||||
this._lockTooltip = new Clipperz.PM.UI.Common.Components.Tooltip({
|
||||
element: this.getElement('lock'),
|
||||
text: "Click here to lock/unlock your account.",
|
||||
position: 'RIGHT'
|
||||
});
|
||||
|
||||
Clipperz.DOM.Helper.append(MochiKit.DOM.currentDocument().body,
|
||||
{tag:'div', id:this.getId('modalDialogWrapper'), cls:'modalDialogWrapper', children:[
|
||||
{tag:'div', id:this.getId('modalDialogMask'), cls:'modalDialogMask userInfoBoxMask'}
|
||||
]}
|
||||
);
|
||||
MochiKit.Style.hideElement(this.getId('modalDialogMask'));
|
||||
|
||||
// this.drawUserInfoBackground(this.getElement('canvas'));
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
/*
|
||||
'drawUserInfoBackground': function (canvas) {
|
||||
var kMyDrawingFunctionWidth = 188.0;
|
||||
var kMyDrawingFunctionHeight = 154.0;
|
||||
|
||||
var context = canvas.getContext("2d");
|
||||
var color;
|
||||
var resolution;
|
||||
var alignStroke;
|
||||
var path;
|
||||
var pointX;
|
||||
var pointY;
|
||||
var controlPoint1X;
|
||||
var controlPoint1Y;
|
||||
var controlPoint2X;
|
||||
var controlPoint2Y;
|
||||
var gradient;
|
||||
if (window.devicePixelRatio)
|
||||
resolution = window.devicePixelRatio;
|
||||
else
|
||||
resolution = 1.0;
|
||||
resolution *= 0.5 * (canvas.width / kMyDrawingFunctionWidth + canvas.height / kMyDrawingFunctionHeight);
|
||||
|
||||
context.save();
|
||||
context.scale(canvas.width / kMyDrawingFunctionWidth, canvas.height / kMyDrawingFunctionHeight);
|
||||
context.clearRect(0.0, 0.0, kMyDrawingFunctionWidth, kMyDrawingFunctionHeight);
|
||||
|
||||
// Setup for Shadow Effect
|
||||
color = "rgba(0.0%, 0.0%, 0.0%, 0.667)";
|
||||
context.save();
|
||||
context.shadowColor = color;
|
||||
context.shadowBlur = 3.0;
|
||||
context.shadowOffsetX = 5.729 * Math.cos(7.592) * resolution;
|
||||
context.shadowOffsetY = 5.729 * Math.sin(7.592) * resolution;
|
||||
|
||||
// Layer 1
|
||||
|
||||
alignStroke = 0.0;
|
||||
context.beginPath();
|
||||
pointX = 169.5;
|
||||
pointY = 141.5;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.moveTo(pointX, pointY);
|
||||
pointX = 177.5;
|
||||
pointY = 133.5;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 173.889;
|
||||
controlPoint1Y = 141.5;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 177.5;
|
||||
controlPoint2Y = 137.889;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 177.5;
|
||||
pointY = 19.5;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 169.5;
|
||||
pointY = 11.5;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 177.5;
|
||||
controlPoint1Y = 15.111;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 173.889;
|
||||
controlPoint2Y = 11.5;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 18.5;
|
||||
pointY = 11.5;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 10.5;
|
||||
pointY = 19.5;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 14.111;
|
||||
controlPoint1Y = 11.5;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 10.5;
|
||||
controlPoint2Y = 15.111;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 10.5;
|
||||
pointY = 133.5;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
pointX = 18.5;
|
||||
pointY = 141.5;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1X = 10.5;
|
||||
controlPoint1Y = 137.889;
|
||||
controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2X = 14.111;
|
||||
controlPoint2Y = 141.5;
|
||||
controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
|
||||
controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
|
||||
context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
|
||||
pointX = 169.5;
|
||||
pointY = 141.5;
|
||||
pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
|
||||
pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
|
||||
context.lineTo(pointX, pointY);
|
||||
context.closePath();
|
||||
gradient = context.createLinearGradient(94.0, 11.5, 94.0, 141.5);
|
||||
color = "#EE9B69";
|
||||
gradient.addColorStop(0.0, color);
|
||||
color = "#E38D62";
|
||||
gradient.addColorStop(1.0, color);
|
||||
context.fillStyle = gradient;
|
||||
context.fill();
|
||||
|
||||
// Shadow Effect
|
||||
context.restore();
|
||||
|
||||
context.restore();
|
||||
},
|
||||
*/
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'updateUserDetails': function (someUserInfo) {
|
||||
var elementName;
|
||||
|
||||
for (elementName in someUserInfo) {
|
||||
this.getElement(elementName).innerHTML = someUserInfo[elementName];
|
||||
}
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
__syntaxFix__: "syntax fix"
|
||||
});
|
||||
@@ -0,0 +1,329 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers');
|
||||
|
||||
Clipperz.PM.UI.Web.Controllers.AppController = function(args) {
|
||||
|
||||
this._user = null;
|
||||
this._tabSlotNames = {
|
||||
//tabName: slotName
|
||||
'cards': 'cardGrid',
|
||||
// 'directLogins': 'directLoginGrid',
|
||||
'account': 'accountPanel',
|
||||
'data': 'dataPanel',
|
||||
'tools': 'toolsPanel'
|
||||
};
|
||||
|
||||
//controllers
|
||||
this._cardsController = null;
|
||||
// this._directLoginsController = null;
|
||||
this._filterController = null; // new Clipperz.PM.UI.Web.Controllers.FilterController();
|
||||
|
||||
//components
|
||||
this._appPage = null;
|
||||
this._userInfoBox = null;
|
||||
this._tabSidePanel = null;
|
||||
|
||||
// MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'editCard', this, 'handleEditCard');
|
||||
// MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'deleteCard', this, 'handleDeleteCard');
|
||||
|
||||
MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'userDataSuccessfullySaved', this, 'userDataSuccessfullySavedHandler');
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
MochiKit.Base.update(Clipperz.PM.UI.Web.Controllers.AppController.prototype, {
|
||||
|
||||
'toString': function() {
|
||||
return "Clipperz.PM.UI.Web.Controllers.AppController";
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
'setUser': function(anUser) {
|
||||
this._user = anUser;
|
||||
},
|
||||
|
||||
'user': function() {
|
||||
return this._user;
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
/*
|
||||
'tabSlotNames': function() {
|
||||
return this._tabSlotNames;
|
||||
},
|
||||
*/
|
||||
'slotNameForTab': function(aTabName) {
|
||||
return this._tabSlotNames[aTabName];
|
||||
},
|
||||
|
||||
'hideAllAppPageTabSlots': function() {
|
||||
var aTabName;
|
||||
|
||||
for (aTabName in this._tabSlotNames) {
|
||||
this.appPage().hideSlot(this.slotNameForTab(aTabName));
|
||||
}
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
'appPage': function() {
|
||||
if (this._appPage == null) {
|
||||
this._appPage = new Clipperz.PM.UI.Web.Components.AppPage();
|
||||
}
|
||||
|
||||
return this._appPage;
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
'tabSidePanel': function() {
|
||||
if (this._tabSidePanel == null) {
|
||||
this._tabSidePanel = new Clipperz.PM.UI.Web.Components.TabSidePanel();
|
||||
}
|
||||
|
||||
return this._tabSidePanel;
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
'userInfoBox': function() {
|
||||
if (this._userInfoBox == null) {
|
||||
this._userInfoBox = new Clipperz.PM.UI.Web.Components.UserInfoBox();
|
||||
|
||||
MochiKit.Signal.connect(this._userInfoBox, 'logout', this, 'handleLogout');
|
||||
MochiKit.Signal.connect(this._userInfoBox, 'lock', this, 'handleLock');
|
||||
MochiKit.Signal.connect(this._userInfoBox, 'unlock', this, 'handleUnlock');
|
||||
}
|
||||
|
||||
return this._userInfoBox;
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
'accountPanel': function () {
|
||||
if (this._accountPanel == null) {
|
||||
this._accountPanel = new Clipperz.PM.UI.Web.Components.AccountPanel(/*{selected:'Preferences'}*/);
|
||||
}
|
||||
|
||||
return this._accountPanel;
|
||||
},
|
||||
|
||||
//.........................................................................
|
||||
|
||||
'dataPanel': function () {
|
||||
if (this._dataPanel == null) {
|
||||
this._dataPanel = new Clipperz.PM.UI.Web.Components.DataPanel();
|
||||
}
|
||||
|
||||
return this._dataPanel;
|
||||
},
|
||||
|
||||
//.........................................................................
|
||||
|
||||
'toolsPanel': function () {
|
||||
if (this._toolsPanel == null) {
|
||||
this._toolsPanel = new Clipperz.PM.UI.Web.Components.ToolsPanel();
|
||||
}
|
||||
|
||||
return this._toolsPanel;
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
'filterController': function () {
|
||||
if (this._filterController == null) {
|
||||
this._filterController = new Clipperz.PM.UI.Web.Controllers.FilterController();
|
||||
}
|
||||
|
||||
return this._filterController;
|
||||
},
|
||||
|
||||
'cardsController': function() {
|
||||
if (this._cardsController == null) {
|
||||
this._cardsController = new Clipperz.PM.UI.Web.Controllers.CardsController({'filterController':this._filterController});
|
||||
}
|
||||
|
||||
return this._cardsController;
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
/*
|
||||
'directLoginsController': function() {
|
||||
//Clipperz.log(">>> AppController.directLoginsController");
|
||||
if (this._directLoginsController == null) {
|
||||
this._directLoginsController = new Clipperz.PM.UI.Web.Controllers.DirectLoginsController({'filterController':this._filterController});
|
||||
}
|
||||
//Clipperz.log("<<< AppController.directLoginsController");
|
||||
|
||||
return this._directLoginsController;
|
||||
},
|
||||
*/
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
'populateUserInfo': function() {
|
||||
var deferredResult;
|
||||
|
||||
deferredResult = new Clipperz.Async.Deferred("AppController.populateUserInfo", {trace:false});
|
||||
deferredResult.collectResults({
|
||||
'username': MochiKit.Base.methodcaller('displayName'),
|
||||
'cardsNumber': [
|
||||
MochiKit.Base.methodcaller('getRecords'),
|
||||
function (someResults) { return someResults.length; }
|
||||
],
|
||||
'directLoginsNumber': [
|
||||
MochiKit.Base.methodcaller('getDirectLogins'),
|
||||
function (someResults) { return someResults.length; }
|
||||
]
|
||||
})
|
||||
deferredResult.addMethod(this.userInfoBox(), 'updateUserDetails');
|
||||
deferredResult.callback(this.user());
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
'run': function(args) {
|
||||
var deferredResult;
|
||||
var slot;
|
||||
var page;
|
||||
var user;
|
||||
|
||||
slot = args.slot;
|
||||
user = args.user;
|
||||
|
||||
this.setUser(user);
|
||||
|
||||
slot.setContent(this.appPage());
|
||||
|
||||
this.appPage().slotNamed('userInfoBox').setContent(this.userInfoBox());
|
||||
this.appPage().slotNamed('tabSidePanel').setContent(this.tabSidePanel());
|
||||
|
||||
this.appPage().slotNamed('accountPanel').setContent(this.accountPanel());
|
||||
this.appPage().slotNamed('dataPanel').setContent(this.dataPanel());
|
||||
this.appPage().slotNamed('toolsPanel').setContent(this.toolsPanel());
|
||||
|
||||
this.hideAllAppPageTabSlots();
|
||||
this.appPage().showSlot(this.slotNameForTab('cards'));
|
||||
|
||||
MochiKit.Signal.connect(this.tabSidePanel(), 'tabSelected', this, 'handleTabSelected');
|
||||
MochiKit.Signal.connect(this.tabSidePanel(), 'addCard', this, 'handleAddCard');
|
||||
MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'addCard', this, 'handleAddCard');
|
||||
|
||||
deferredResult = new Clipperz.Async.Deferred("AppController.run", {trace:false});
|
||||
|
||||
deferredResult.addMethod(this.cardsController(), 'run', {slot:this.appPage().slotNamed('cardGrid'), user:user});
|
||||
// deferredResult.addMethod(this.directLoginsController(), 'run', {slot:this.appPage().slotNamed('directLoginGrid'), user:user});
|
||||
deferredResult.addMethod(this, 'populateUserInfo');
|
||||
|
||||
deferredResult.addCallback(MochiKit.Visual.ScrollTo, 'miscLinks', {duration:0});
|
||||
deferredResult.addCallback(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'CARDS_CONTROLLER_DID_RUN');
|
||||
deferredResult.addMethod(this.tabSidePanel(), 'selectTab', 'cards');
|
||||
deferredResult.callback();
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
'handleTabSelected': function (selectedTabName) {
|
||||
var aTabName;
|
||||
var aSlotName;
|
||||
|
||||
//Clipperz.log(">>> AppController.handleTabSelected", selectedTabName);
|
||||
this.hideAllAppPageTabSlots();
|
||||
this.appPage().showSlot(this.slotNameForTab(selectedTabName));
|
||||
|
||||
switch (selectedTabName) {
|
||||
case 'cards':
|
||||
this.cardsController().focus();
|
||||
break;
|
||||
// case 'directLogins':
|
||||
// this.directLoginsController().focus();
|
||||
// break;
|
||||
case 'data':
|
||||
break;
|
||||
case 'account':
|
||||
break;
|
||||
case 'tools':
|
||||
break;
|
||||
}
|
||||
//Clipperz.log("<-- AppController.handleTabSelected", aTabName);
|
||||
},
|
||||
|
||||
//=============================================================================
|
||||
|
||||
'handleAddCard': function (aSourceElement) {
|
||||
//Clipperz.log("=== AppController.addCard", aSourceElement);
|
||||
this.cardsController().addCard(aSourceElement);
|
||||
},
|
||||
|
||||
//=============================================================================
|
||||
|
||||
'userDataSuccessfullySavedHandler': function (anEvent) {
|
||||
this.populateUserInfo();
|
||||
},
|
||||
|
||||
//=============================================================================
|
||||
|
||||
'handleLogout': function(anEvent) {
|
||||
var deferredResult;
|
||||
|
||||
deferredResult = new Clipperz.Async.Deferred("AppController.handleLogout", {trace:false});
|
||||
deferredResult.addMethod(this.user(), 'logout');
|
||||
deferredResult.addCallback(MochiKit.Signal.signal, this, 'logout');
|
||||
deferredResult.callback();
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
'handleLock': function (anEvent) {
|
||||
return Clipperz.Async.callbacks("AppController.handleLock", [
|
||||
MochiKit.Base.method(this.cardsController(), 'deleteAllCleanTextData'),
|
||||
MochiKit.Base.method(this.user(), 'lock')
|
||||
], {trace:false});
|
||||
},
|
||||
|
||||
//.............................................................................
|
||||
|
||||
'handleUnlock': function (anEvent) {
|
||||
return Clipperz.Async.callbacks("AppController.handleUnock", [
|
||||
MochiKit.Base.partial(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'initProgress'),
|
||||
MochiKit.Base.method(this.user(), 'login'),
|
||||
MochiKit.Base.method(this.cardsController(), 'focus'),
|
||||
MochiKit.Base.partial(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'progressDone'),
|
||||
MochiKit.Base.method(this.userInfoBox(), 'unlock')
|
||||
], {trace:false});
|
||||
},
|
||||
|
||||
//=============================================================================
|
||||
__syntaxFix__: "syntax fix"
|
||||
});
|
||||
@@ -0,0 +1,652 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers');
|
||||
|
||||
Clipperz.PM.UI.Web.Controllers.CardDialogController = function(args) {
|
||||
args = args || {};
|
||||
|
||||
Clipperz.PM.UI.Web.Controllers.CardDialogController.superclass.constructor.call(this, args);
|
||||
|
||||
this._record = args.record || Clipperz.Base.exception.raise('MandatoryParameter');
|
||||
this._delegate = args.delegate || Clipperz.Base.exception.raise('MandatoryParameter');
|
||||
|
||||
this._referenceElement = null;
|
||||
this._cardDialogComponent = null;
|
||||
|
||||
this._fieldsReferences = {};
|
||||
this._directLoginReferences = {};
|
||||
|
||||
this._directLoginWizardController = null;
|
||||
this._directLoginEditingComponent = null;
|
||||
this._isDirectLoginEditingComponentVisible = false;
|
||||
|
||||
return this;
|
||||
};
|
||||
|
||||
Clipperz.Base.extend(Clipperz.PM.UI.Web.Controllers.CardDialogController, Object, {
|
||||
|
||||
'toString': function() {
|
||||
return "Clipperz.PM.UI.Web.Controllers.CardDialogController";
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'record': function () {
|
||||
return this._record;
|
||||
},
|
||||
|
||||
'delegate': function () {
|
||||
return this._delegate;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'fieldsReferences': function () {
|
||||
return this._fieldsReferences;
|
||||
},
|
||||
|
||||
'directLoginReferences': function () {
|
||||
return this._directLoginReferences;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'referenceElement': function () {
|
||||
return this._referenceElement;
|
||||
},
|
||||
|
||||
'setReferenceElement': function (anElement) {
|
||||
this._referenceElement = anElement;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'cardDialogComponent': function () {
|
||||
if (this._cardDialogComponent == null) {
|
||||
this._cardDialogComponent = new Clipperz.PM.UI.Web.Components.CardDialogComponent();
|
||||
|
||||
MochiKit.Signal.connect(this._cardDialogComponent, 'cancel', this, 'handleCancel');
|
||||
MochiKit.Signal.connect(this._cardDialogComponent, 'save', this, 'handleSave');
|
||||
|
||||
MochiKit.Signal.connect(this._cardDialogComponent, 'addField', this, 'handleAddField');
|
||||
MochiKit.Signal.connect(this._cardDialogComponent, 'changedValue', this, 'handleChangedValue');
|
||||
|
||||
MochiKit.Signal.connect(this._cardDialogComponent, 'addDirectLogin',this, 'handleAddDirectLogin');
|
||||
MochiKit.Signal.connect(this._cardDialogComponent, 'keyPressed', this, 'handleCardDialogComponentKeyPressed');
|
||||
}
|
||||
|
||||
return this._cardDialogComponent;
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'directLoginWizardController': function () {
|
||||
if (this._directLoginWizardController == null) {
|
||||
this._directLoginWizardController = new Clipperz.PM.UI.Web.Controllers.DirectLoginWizardController({
|
||||
'cardLabel': this.cardDialogComponent().title(),
|
||||
'directLoginEditingComponent': this.directLoginEditingComponent()
|
||||
})
|
||||
|
||||
MochiKit.Signal.connect(this._directLoginWizardController, 'exit', this, 'handleHideDirectLoginEditingComponent');
|
||||
MochiKit.Signal.connect(this._directLoginWizardController, 'done', this, 'handleCompleteDirectLoginEditingComponent');
|
||||
}
|
||||
|
||||
return this._directLoginWizardController;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'directLoginEditingComponent': function () {
|
||||
if (this._directLoginEditingComponent == null) {
|
||||
this._directLoginEditingComponent = new Clipperz.PM.UI.Web.Components.DirectLoginEditingComponent();
|
||||
|
||||
this.cardDialogComponent().renderDirectLoginEditingComponent(this._directLoginEditingComponent);
|
||||
|
||||
// MochiKit.Signal.connect(this._directLoginEditingComponent, 'back', this, 'handleHideDirectLoginEditingComponent')
|
||||
// MochiKit.Signal.connect(this._directLoginEditingComponent, 'changedValue', this, 'handleChangedValue');
|
||||
// MochiKit.Signal.connect(this.__directLoginEditingComponent, 'keyPressed', this, 'handleDirectLoginEditingComponentKeyPressed');
|
||||
}
|
||||
|
||||
return this._directLoginEditingComponent;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'isDirectLoginEditingComponentVisible': function () {
|
||||
return this._isDirectLoginEditingComponentVisible;
|
||||
},
|
||||
|
||||
'setIsDirectLoginEditingComponentVisible': function (aValue) {
|
||||
this._isDirectLoginEditingComponentVisible = aValue;
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'run': function (anElement) {
|
||||
var deferredResult;
|
||||
|
||||
this.setReferenceElement(anElement);
|
||||
|
||||
deferredResult = new Clipperz.Async.Deferred("CardDialogController.run", {trace:false});
|
||||
deferredResult.addCallback(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'initProgress', {'steps':11});
|
||||
|
||||
deferredResult.addMethod(this.cardDialogComponent(), 'deferredShowModal', {openFromElement:this.referenceElement()});
|
||||
deferredResult.addCallback(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
|
||||
|
||||
deferredResult.addMethod(this.record(), 'label');
|
||||
deferredResult.addMethod(this.cardDialogComponent(), 'setTitle');
|
||||
deferredResult.addCallback(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
|
||||
|
||||
deferredResult.addMethod(this, 'updateComponentState');
|
||||
deferredResult.addCallback(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
|
||||
deferredResult.addCallback(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'progressDone');
|
||||
|
||||
deferredResult.addMethod(this.cardDialogComponent(), 'fixRendering');
|
||||
deferredResult.addMethod(this.cardDialogComponent(), 'hideProgressMask');
|
||||
|
||||
if (this.record().isBrandNew()) {
|
||||
deferredResult.addMethod(this.cardDialogComponent(), 'setHintMode', 'ON');
|
||||
deferredResult.addMethod(this.cardDialogComponent(), 'setFocusOnTitleField');
|
||||
}
|
||||
|
||||
deferredResult.addErrback(MochiKit.Base.method(this.cardDialogComponent(), 'showError'));
|
||||
deferredResult.callback();
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'updateComponentState': function () {
|
||||
return Clipperz.Async.callbacks("CardDialogController.updateComponentState", [
|
||||
MochiKit.Base.method(this.record(), 'hasPendingChanges'),
|
||||
MochiKit.Base.method(this.cardDialogComponent(), 'setShouldEnableSaving'),
|
||||
|
||||
MochiKit.Base.method(this.record(), 'label'),
|
||||
MochiKit.Base.method(this.cardDialogComponent(), 'setTitle'),
|
||||
MochiKit.Base.method(this.record(), 'notes'),
|
||||
MochiKit.Base.method(this.cardDialogComponent(), 'setNotes'),
|
||||
|
||||
MochiKit.Base.method(this.record(), 'fields'),
|
||||
MochiKit.Base.values,
|
||||
MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.method(this, 'addCardDialogComponentWithField')),
|
||||
|
||||
MochiKit.Base.method(this.record(), 'directLogins'),
|
||||
MochiKit.Base.values,
|
||||
MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.method(this, 'addCardDialogComponentWithDirectLogin')),
|
||||
|
||||
MochiKit.Base.method(this.cardDialogComponent(), 'resetNewFieldInputs'),
|
||||
MochiKit.Base.noop
|
||||
], {trace:false});
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'addCardDialogComponentWithField': function (aField) {
|
||||
var fieldComponent;
|
||||
|
||||
fieldComponent = new Clipperz.PM.UI.Web.Components.CardDialogRecordFieldComponent({reference: aField.reference()});
|
||||
MochiKit.Signal.connect(fieldComponent, 'changedValue', this, 'handleChangedValue');
|
||||
MochiKit.Signal.connect(fieldComponent, 'performAction',this, 'handlePerformFieldAction');
|
||||
MochiKit.Signal.connect(fieldComponent, 'deleteField', this, 'handleDeleteField');
|
||||
|
||||
// this.fieldsReferences().push({'field':aField, 'component':fieldComponent});
|
||||
this.fieldsReferences()[aField.reference()] = {'field':aField, 'component':fieldComponent};
|
||||
|
||||
return Clipperz.Async.callbacks("CardDialogController.addCardDialogComponentWithField", [
|
||||
MochiKit.Base.method(this.cardDialogComponent(), 'addFieldRowComponent', fieldComponent),
|
||||
|
||||
MochiKit.Base.method(aField, 'label'),
|
||||
MochiKit.Base.method(fieldComponent, 'setLabel'),
|
||||
MochiKit.Base.method(aField, 'value'),
|
||||
MochiKit.Base.method(fieldComponent, 'setValue'),
|
||||
MochiKit.Base.method(aField, 'actionType'),
|
||||
MochiKit.Base.method(fieldComponent, 'setActionType'),
|
||||
MochiKit.Base.method(aField, 'isHidden'),
|
||||
MochiKit.Base.method(fieldComponent, 'setIsHidden')
|
||||
], {trace:false});
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'addCardDialogComponentWithDirectLogin': function (aDirectLogin) {
|
||||
var directLoginComponent;
|
||||
|
||||
directLoginComponent = new Clipperz.PM.UI.Web.Components.CardDialogRecordDirectLoginComponent({reference: aDirectLogin.reference()});
|
||||
MochiKit.Signal.connect(directLoginComponent, 'changedValue', this, 'handleChangedValue');
|
||||
MochiKit.Signal.connect(directLoginComponent, 'deleteDirectLogin', this, 'handleDeleteDirectLogin');
|
||||
MochiKit.Signal.connect(directLoginComponent, 'editDirectLogin', this, 'handleEditDirectLogin');
|
||||
MochiKit.Signal.connect(directLoginComponent, 'openDirectLogin', this, 'handleOpenDirectLogin');
|
||||
|
||||
this.directLoginReferences()[aDirectLogin.reference()] = {'directLogin':aDirectLogin, 'component':directLoginComponent};
|
||||
|
||||
return Clipperz.Async.callbacks("CardDialogController.addCardDialogComponentWithDirectLogin", [
|
||||
MochiKit.Base.method(this.cardDialogComponent(), 'addDirectLoginComponent', directLoginComponent),
|
||||
MochiKit.Base.method(this, 'refreshDirectLoginComponent', this.directLoginReferences()[aDirectLogin.reference()])
|
||||
], {trace:false});
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'refreshDirectLoginComponent': function (aDirectLoginReference) {
|
||||
return Clipperz.Async.callbacks("CardDialogController.refreshDirectLoginComponent", [
|
||||
MochiKit.Base.method(aDirectLoginReference['directLogin'], 'favicon'),
|
||||
// MochiKit.Base.method(aDirectLoginReference['directLogin'], 'faviconData'),
|
||||
MochiKit.Base.method(aDirectLoginReference['component'], 'setFavicon'),
|
||||
MochiKit.Base.method(aDirectLoginReference['directLogin'], 'label'),
|
||||
MochiKit.Base.method(aDirectLoginReference['component'], 'setLabel')
|
||||
], {trace:false});
|
||||
},
|
||||
|
||||
'refreshDirectLoginComponents': function () {
|
||||
return Clipperz.Async.callbacks("CardDialogController.refreshDirectLoginComponents", [
|
||||
MochiKit.Base.method(this, 'directLoginReferences'),
|
||||
MochiKit.Base.values,
|
||||
MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.method(this, 'refreshDirectLoginComponent')),
|
||||
Clipperz.Async.collectAll
|
||||
])
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'updateRecordValues': function () {
|
||||
return Clipperz.Async.callbacks('CardDialogController.updateRecordValues', [
|
||||
MochiKit.Base.method(this.cardDialogComponent(), 'title'),
|
||||
MochiKit.Base.method(this.record(), 'setLabel'),
|
||||
MochiKit.Base.method(this.cardDialogComponent(), 'notes'),
|
||||
MochiKit.Base.method(this.record(), 'setNotes'),
|
||||
|
||||
MochiKit.Base.method(this, 'fieldsReferences'),
|
||||
MochiKit.Base.values,
|
||||
MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.method(this, 'updateRecordFieldValues')),
|
||||
|
||||
MochiKit.Base.method(this, 'directLoginReferences'),
|
||||
MochiKit.Base.values,
|
||||
MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.method(this, 'updateRecordDirectLoginValues')),
|
||||
|
||||
MochiKit.Base.method(this.directLoginEditingComponent(), 'directLoginReference'),
|
||||
MochiKit.Base.method(this.record(), 'directLoginWithReference'),
|
||||
MochiKit.Base.method(this, 'updateRecordDirectLoginDetails'),
|
||||
|
||||
MochiKit.Base.noop
|
||||
], {trace:false});
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'updateRecordFieldValues': function (aFieldReference) {
|
||||
var deferredResult;
|
||||
|
||||
deferredResult = Clipperz.Async.callbacks('CardDialogController.updateRecordFieldValues', [
|
||||
MochiKit.Base.method(aFieldReference['component'], 'label'),
|
||||
MochiKit.Base.method(aFieldReference['field'], 'setLabel'),
|
||||
|
||||
MochiKit.Base.method(aFieldReference['component'], 'value'),
|
||||
MochiKit.Base.method(aFieldReference['field'], 'setValue'),
|
||||
|
||||
MochiKit.Base.method(aFieldReference['component'], 'isHidden'),
|
||||
MochiKit.Base.method(aFieldReference['field'], 'setIsHidden'),
|
||||
|
||||
MochiKit.Base.method(aFieldReference['field'], 'actionType'),
|
||||
MochiKit.Base.method(aFieldReference['component'], 'setActionType')
|
||||
], {trace:false});
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'updateRecordDirectLoginValues': function (aDirectLoginReference) {
|
||||
var deferredResult;
|
||||
|
||||
deferredResult = Clipperz.Async.callbacks('CardDialogController.updateRecordDirectLoginValues', [
|
||||
MochiKit.Base.method(aDirectLoginReference['component'], 'label'),
|
||||
MochiKit.Base.method(aDirectLoginReference['directLogin'], 'setLabel')
|
||||
], {trace:false});
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'updateRecordDirectLoginDetails': function (aDirectLogin) {
|
||||
var result;
|
||||
|
||||
if (MochiKit.Base.isUndefinedOrNull(aDirectLogin)) {
|
||||
result = MochiKit.Async.succeed();
|
||||
} else {
|
||||
result = Clipperz.Async.callbacks("CardDialogController.updateRecordDirectLoginDetails", [
|
||||
MochiKit.Base.method(this.directLoginEditingComponent(), 'label'),
|
||||
MochiKit.Base.method(aDirectLogin, 'setLabel'),
|
||||
MochiKit.Base.method(this.directLoginEditingComponent(), 'favicon'),
|
||||
MochiKit.Base.method(aDirectLogin, 'setFavicon')
|
||||
], {trace:false});
|
||||
}
|
||||
|
||||
return result;
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'addField': function () {
|
||||
return this.record().addField({
|
||||
'label':this.cardDialogComponent().newFieldLabel(),
|
||||
'value':this.cardDialogComponent().newFieldValue(),
|
||||
'isHidden':this.cardDialogComponent().newFieldIsHidden()
|
||||
});
|
||||
},
|
||||
|
||||
'handleAddField': function () {
|
||||
return Clipperz.Async.callbacks("CardDialogController.handleAddField", [
|
||||
MochiKit.Base.method(this, 'addField'),
|
||||
|
||||
MochiKit.Base.method(this, 'addCardDialogComponentWithField'),
|
||||
MochiKit.Base.method(this.cardDialogComponent(), 'resetNewFieldInputs'),
|
||||
|
||||
MochiKit.Base.method(this.cardDialogComponent(), 'fixRendering'),
|
||||
MochiKit.Base.method(this, 'handleChangedValue')
|
||||
], {trace:false})
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'handlePerformFieldAction': function (aFieldID, aTargetElement) {
|
||||
//console.log("### targetElement", aTargetElement);
|
||||
return Clipperz.Async.callbacks("CardDialogController.handleDeleteField", [
|
||||
MochiKit.Base.method(this.record(), 'fields'),
|
||||
MochiKit.Base.itemgetter(aFieldID),
|
||||
Clipperz.Async.collectResults("CardDialogController.handleDeleteField <collect results>", {
|
||||
'value': MochiKit.Base.methodcaller('value'),
|
||||
'type': MochiKit.Base.methodcaller('actionType')
|
||||
}, {trace:false}),
|
||||
MochiKit.Base.bind(function (someValues) {
|
||||
switch (someValues['type']) {
|
||||
case 'NONE':
|
||||
throw "this event handler should not be triggered for fields with type 'NONE'";
|
||||
break;
|
||||
case 'URL':
|
||||
var url;
|
||||
|
||||
url = someValues['value'];
|
||||
if (/^https?\:\/\//.test(url) == false) {
|
||||
url = 'http://' + url;
|
||||
}
|
||||
|
||||
window.open(url);
|
||||
break;
|
||||
case 'EMAIL':
|
||||
var url;
|
||||
|
||||
url = 'mailto:' + someValues['value'];
|
||||
|
||||
MochiKit.DOM.currentWindow().location = url;
|
||||
break;
|
||||
case 'PASSWORD':
|
||||
//Clipperz.log("SHOW PASSWORD " + someValues['value']);
|
||||
this.showPasswordTooltip(someValues['value'], aTargetElement);
|
||||
break;
|
||||
}
|
||||
}, this)
|
||||
], {trace:false});
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'handleDeleteField': function (aFieldID) {
|
||||
return Clipperz.Async.callbacks("CardDialogController.handleDeleteField", [
|
||||
MochiKit.Base.method(this.record(), 'fields'),
|
||||
MochiKit.Base.itemgetter(aFieldID),
|
||||
MochiKit.Base.method(this.record(), 'removeField'),
|
||||
|
||||
MochiKit.Base.method(this, 'fieldsReferences'),
|
||||
MochiKit.Base.itemgetter(aFieldID),
|
||||
MochiKit.Base.itemgetter('component'),
|
||||
|
||||
function (aComponent) {
|
||||
return Clipperz.Async.callbacks("CardDialogController.handleDeleteField [fade and remove]", [
|
||||
MochiKit.Base.partial(Clipperz.Visual.deferredAnimation, MochiKit.Visual.fade, aComponent.element(), {from:1.0, to:0.0, duration:0.5}),
|
||||
// Clipperz.Visual.deferredAnimation(MochiKit.Visual.fade, aComponent.element(), {from:1.0, to:0.0, duration:0.5}),
|
||||
MochiKit.Base.method(aComponent, 'remove')
|
||||
], {trace:false});
|
||||
},
|
||||
|
||||
MochiKit.Base.bind(function () {
|
||||
delete this.fieldsReferences()[aFieldID];
|
||||
}, this),
|
||||
|
||||
MochiKit.Base.method(this.cardDialogComponent(), 'fixRendering'),
|
||||
MochiKit.Base.method(this, 'handleChangedValue')
|
||||
], {trace:false});
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'handleDeleteDirectLogin': function(aDirectLoginReference) {
|
||||
var cardDialogComponent;
|
||||
|
||||
cardDialogComponent = this.cardDialogComponent();
|
||||
|
||||
return Clipperz.Async.callbacks("CardDialogController.handleDeleteDirectLogin", [
|
||||
MochiKit.Base.method(this.record(), 'directLogins'),
|
||||
MochiKit.Base.itemgetter(aDirectLoginReference),
|
||||
MochiKit.Base.methodcaller('remove'),
|
||||
|
||||
MochiKit.Base.method(this, 'directLoginReferences'),
|
||||
MochiKit.Base.itemgetter(aDirectLoginReference),
|
||||
MochiKit.Base.itemgetter('component'),
|
||||
|
||||
function (aComponent) {
|
||||
return Clipperz.Async.callbacks("CardDialogController.handleDeleteDirectLogin [fade and remove]", [
|
||||
MochiKit.Base.partial(Clipperz.Visual.deferredAnimation, MochiKit.Visual.fade, aComponent.element(), {from:1.0, to:0.0, duration:0.5}),// Clipperz.Visual.deferredAnimation(MochiKit.Visual.fade, aComponent.element(), {from:1.0, to:0.0, duration:0.5}),
|
||||
/// MochiKit.Base.method(aComponent, 'remove')
|
||||
MochiKit.Base.method(cardDialogComponent, 'removeDirectLoginComponent', aComponent)
|
||||
], {trace:false});
|
||||
},
|
||||
|
||||
MochiKit.Base.bind(function () {
|
||||
delete this.directLoginReferences()[aDirectLoginReference];
|
||||
}, this),
|
||||
|
||||
MochiKit.Base.method(this.cardDialogComponent(), 'fixRendering'),
|
||||
MochiKit.Base.method(this, 'handleChangedValue')
|
||||
], {trace:false});
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'handleOpenDirectLogin': function (aDirectLoginReference) {
|
||||
return Clipperz.Async.callbacks("CardDialogController.handleOpenDirectLogin", [
|
||||
MochiKit.Base.method(this.record(), 'directLoginWithReference', aDirectLoginReference),
|
||||
Clipperz.PM.UI.Common.Controllers.DirectLoginRunner.openDirectLogin
|
||||
], {trace:false});
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'handleEditDirectLogin': function (aDirectLoginReference) {
|
||||
return Clipperz.Async.callbacks("CardDialogController.handleEditDirectLogin", [
|
||||
MochiKit.Base.method(this, 'setIsDirectLoginEditingComponentVisible', true),
|
||||
MochiKit.Base.method(this.directLoginEditingComponent(), 'setDirectLoginReference', aDirectLoginReference),
|
||||
MochiKit.Base.method(this.cardDialogComponent(), 'placeDirectLoginEditingComponent'),
|
||||
MochiKit.Base.method(this.record(), 'directLoginWithReference', aDirectLoginReference),
|
||||
MochiKit.Base.method(this.directLoginWizardController(), 'runWithDirectLogin'),
|
||||
MochiKit.Base.method(this.directLoginWizardController(), 'fixRulerRendering', this.cardDialogComponent().displayMode()),
|
||||
MochiKit.Base.method(this.cardDialogComponent(), 'showDirectLoginEditingComponent')
|
||||
], {trace:false});
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'handleHideDirectLoginEditingComponent': function () {
|
||||
return Clipperz.Async.callbacks("CardDialogController.handleHideDirectLoginEditingComponent", [
|
||||
MochiKit.Base.method(this, 'setIsDirectLoginEditingComponentVisible', false),
|
||||
MochiKit.Base.method(this.directLoginWizardController(), 'hideRuler'),
|
||||
MochiKit.Base.method(this.directLoginEditingComponent(), 'setDirectLoginReference', null),
|
||||
MochiKit.Base.method(this, 'refreshDirectLoginComponents'),
|
||||
MochiKit.Base.method(this.cardDialogComponent(), 'hideDirectLoginEditingComponent')
|
||||
], {trace:false})
|
||||
},
|
||||
|
||||
'handleCompleteDirectLoginEditingComponent': function (someParameters) {
|
||||
return Clipperz.Async.callbacks("CardDialogController.handleCompleteDirectLoginEditingComponent", [
|
||||
MochiKit.Base.method(this, 'setIsDirectLoginEditingComponentVisible', false),
|
||||
MochiKit.Base.method(this.directLoginEditingComponent(), 'setDirectLoginReference', null),
|
||||
MochiKit.Base.partial(MochiKit.Async.succeed, someParameters['hasJustBeenAdded']),
|
||||
Clipperz.Async.deferredIf("CardDialogController.handleCompleteDirectLoginEditingComponent - should addTheEditedDirectLogin", [
|
||||
MochiKit.Base.method(this, 'addCardDialogComponentWithDirectLogin', someParameters['directLogin'])
|
||||
], []),
|
||||
MochiKit.Base.method(this, 'refreshDirectLoginComponents'),
|
||||
MochiKit.Base.method(this, 'handleChangedValue'),
|
||||
MochiKit.Base.method(this.cardDialogComponent(), 'hideDirectLoginEditingComponent')
|
||||
], {trace:false})
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'handleChangedValue': function () {
|
||||
return Clipperz.Async.callbacks("CardDialogController.handleChangedValue", [
|
||||
MochiKit.Base.method(this, 'updateRecordValues'),
|
||||
MochiKit.Base.method(this.record(), 'hasPendingChanges'),
|
||||
MochiKit.Base.method(this.cardDialogComponent(), 'setShouldEnableSaving')
|
||||
], {trace:false});
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'handleSave': function () {
|
||||
var deferredResult;
|
||||
|
||||
deferredResult = new Clipperz.Async.Deferred("CardDialogController.handleSave", {trace:false});
|
||||
deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'initProgress', {'steps':8});
|
||||
deferredResult.addMethod(this.cardDialogComponent(), 'showProgressMask');
|
||||
deferredResult.addMethod(this.cardDialogComponent(), 'newFieldHasPendingChanges');
|
||||
deferredResult.addIf([
|
||||
MochiKit.Base.method(this, 'addField')
|
||||
], [])
|
||||
deferredResult.addMethod(this, 'saveChanges');
|
||||
deferredResult.addMethod(this.cardDialogComponent(), 'deferredHideModal', {closeToElement:null});
|
||||
deferredResult.addMethod(this.cardDialogComponent(), 'remove');
|
||||
deferredResult.addCallback(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'cardDialogComponentClosed');
|
||||
|
||||
deferredResult.callback();
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//.........................................................................
|
||||
|
||||
'saveChanges': function () {
|
||||
var deferredResult;
|
||||
|
||||
deferredResult = new Clipperz.Async.Deferred("CardDialogController.handleSave", {trace:false});
|
||||
deferredResult.addMethod(this.delegate(), 'saveChanges');
|
||||
deferredResult.addErrback(function (aValue) { Clipperz.log("SHIT HAPPENS!!"); return aValue; });
|
||||
|
||||
deferredResult.callback();
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'handleCancel': function () {
|
||||
var deferredResult;
|
||||
|
||||
if (this.isDirectLoginEditingComponentVisible()) {
|
||||
deferredResult = this.handleHideDirectLoginEditingComponent();
|
||||
} else {
|
||||
deferredResult = new Clipperz.Async.Deferred("CardDialogController.handleCancel", {trace:false});
|
||||
// deferredResult.addMethod(this.record(), 'hasPendingChanges'),
|
||||
deferredResult.addMethod(this.delegate(), 'hasPendingChanges'),
|
||||
deferredResult.addIf([
|
||||
MochiKit.Base.method(this.cardDialogComponent(), 'askConfirmationForLoosingPendingChanges')
|
||||
], [])
|
||||
deferredResult.addMethod(this.delegate(), 'revertChanges');
|
||||
deferredResult.addMethod(this.cardDialogComponent(), 'deferredHideModal', {closeToElement:this.referenceElement()});
|
||||
deferredResult.addMethod(this.cardDialogComponent(), 'remove');
|
||||
deferredResult.addCallback(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'cardDialogComponentClosed');
|
||||
|
||||
deferredResult.callback();
|
||||
}
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'handleAddDirectLogin': function () {
|
||||
return Clipperz.Async.callbacks("CardDialogController.handleAddDirectLogin", [
|
||||
MochiKit.Base.method(this.record(), 'createNewDirectLogin'),
|
||||
MochiKit.Base.bind(function (aDirectLogin) {
|
||||
return Clipperz.Async.callbacks("CardDialogController.handleAddDirectLogin - directLogin", [
|
||||
MochiKit.Base.method(this.cardDialogComponent(), 'newFieldHasPendingChanges'),
|
||||
Clipperz.Async.deferredIf("cardDialogComponent.newFieldHasPendingChanges", [
|
||||
MochiKit.Base.method(this, 'handleAddField')
|
||||
], []),
|
||||
|
||||
MochiKit.Base.method(this.directLoginEditingComponent(), 'setDirectLoginReference', aDirectLogin.reference()),
|
||||
MochiKit.Base.method(this.cardDialogComponent(), 'placeDirectLoginEditingComponent'),
|
||||
MochiKit.Base.method(this.directLoginWizardController(), 'runWithDirectLogin', aDirectLogin, true),
|
||||
MochiKit.Base.method(this.directLoginWizardController(), 'fixRulerRendering', this.cardDialogComponent().displayMode()),
|
||||
MochiKit.Base.method(this.cardDialogComponent(), 'showDirectLoginEditingComponent')
|
||||
], {trace:false});
|
||||
}, this)
|
||||
], {trace:false});
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'handleCardDialogComponentKeyPressed': function (anEvent) {
|
||||
if ((anEvent.key().string == 'KEY_TAB') && this.cardDialogComponent().newFieldHasPendingChanges()) {
|
||||
anEvent.preventDefault();
|
||||
|
||||
// MochiKit.Signal.signal(this.cardDialogComponent(), 'addField');
|
||||
this.handleAddField()
|
||||
this.cardDialogComponent().focusOnNewFieldLabel();
|
||||
}
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
|
||||
'showPasswordTooltip': function (aValue, anElement) {
|
||||
var passwordTooltip;
|
||||
|
||||
passwordTooltip = new Clipperz.PM.UI.Web.Components.PasswordTooltip({
|
||||
'referebceElement': anElement,
|
||||
'text': aValue
|
||||
});
|
||||
|
||||
passwordTooltip.show();
|
||||
|
||||
|
||||
},
|
||||
|
||||
//=========================================================================
|
||||
__syntaxFix__: "syntax fix"
|
||||
});
|
||||
@@ -0,0 +1,207 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers');
|
||||
|
||||
Clipperz.PM.UI.Web.Controllers.CardsController = function() {
|
||||
Clipperz.PM.UI.Web.Controllers.CardsController.superclass.constructor.apply(this, arguments);
|
||||
|
||||
MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'cardDialogComponentClosed', this, 'handleHideCard');
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
Clipperz.Base.extend(Clipperz.PM.UI.Web.Controllers.CardsController, Clipperz.PM.UI.Web.Controllers.GridController, {
|
||||
|
||||
'toString': function() {
|
||||
return "Clipperz.PM.UI.Web.Controllers.CardsController";
|
||||
},
|
||||
|
||||
'createGrid': function () {
|
||||
var grid;
|
||||
|
||||
grid = new Clipperz.PM.UI.Web.Components.GridComponent({columnsManagers: [
|
||||
new Clipperz.PM.UI.Web.Components.FaviconColumnManager({
|
||||
'name': 'Cards.favicon',
|
||||
'selector': MochiKit.Base.methodcaller('favicon'),
|
||||
'cssClass': 'favicon'
|
||||
}),
|
||||
new Clipperz.PM.UI.Web.Components.LinkColumnManager({
|
||||
'name': 'Cards.title',
|
||||
'selector': MochiKit.Base.methodcaller('label'),
|
||||
'label': 'title',
|
||||
'cssClass': 'title',
|
||||
'comparator': Clipperz.Base.caseInsensitiveCompare,
|
||||
'sortable': true,
|
||||
'sorted': 'ASCENDING',
|
||||
// 'actionMethod': function(anObject, anEvent) { MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'editCard', {objectData:anObject, element:anEvent.src()})}
|
||||
'actionMethod': MochiKit.Base.method(this, 'handleShowCard')
|
||||
}),
|
||||
new Clipperz.PM.UI.Web.Components.DirectLoginsColumnManager({
|
||||
'name': 'Cards.directLogins',
|
||||
'selector': MochiKit.Base.methodcaller('directLoginReferences'),
|
||||
'label': 'direct logins',
|
||||
'cssClass': 'directLogin'
|
||||
}),
|
||||
new Clipperz.PM.UI.Web.Components.DateColumnManager({
|
||||
'name': 'Cards.latestUpdate',
|
||||
'selector': MochiKit.Base.methodcaller('updateDate'),
|
||||
'label': 'latest update',
|
||||
'cssClass': 'latestUpdate',
|
||||
'format': 'd-m-Y',
|
||||
'comparator': MochiKit.Base.compare,
|
||||
'sortable': true,
|
||||
'sorted': 'UNSORTED'
|
||||
}),
|
||||
new Clipperz.PM.UI.Web.Components.DeleteObjectColumnManager({
|
||||
'name': 'Cards.delete',
|
||||
'selector': MochiKit.Base.noop,
|
||||
'cssClass': 'delete',
|
||||
// 'actionMethod': function(anObject, anEvent) { MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'deleteCard', {objectData:anObject, element:anEvent.src()})}
|
||||
'actionMethod': MochiKit.Base.method(this, 'handleDeleteCard')
|
||||
})
|
||||
]});
|
||||
|
||||
grid.setComponentForSlotNamed(new Clipperz.PM.UI.Web.Components.BookmarkletComponent(), 'headerSlot');
|
||||
|
||||
return grid;
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
'getRows': function () {
|
||||
//TODO relying on user() in GridController, bad code smell :|
|
||||
return this.user().getRecords();
|
||||
},
|
||||
|
||||
//=============================================================================
|
||||
|
||||
'displayEmptyContent': function () {
|
||||
var emptyGridComponent;
|
||||
|
||||
emptyGridComponent = new Clipperz.PM.UI.Web.Components.CreateNewCardSplashComponent();
|
||||
|
||||
return Clipperz.Async.callbacks("CardsController.displayEmptyContent", [
|
||||
MochiKit.Base.method(this.grid(), 'setNoRowsGridComponent', emptyGridComponent),
|
||||
MochiKit.Base.bind(Clipperz.PM.UI.Web.Controllers.CardsController.superclass.displayEmptyContent, this)
|
||||
], {trace:false});
|
||||
},
|
||||
|
||||
'displaySelectedRows': function (aFilter) {
|
||||
this.columnManagerWithName('Cards.directLogins').hideDirectLoginListPopup();
|
||||
|
||||
return Clipperz.PM.UI.Web.Controllers.CardsController.superclass.displaySelectedRows.apply(this, arguments);
|
||||
},
|
||||
|
||||
//=============================================================================
|
||||
|
||||
'handleShowCard': function (anObject, anEvent) {
|
||||
var cardDialogController;
|
||||
|
||||
cardDialogController = new Clipperz.PM.UI.Web.Controllers.CardDialogController({record:anObject, delegate:this});
|
||||
this.grid().selectRow(anObject);
|
||||
|
||||
cardDialogController.run(anEvent.src());
|
||||
},
|
||||
|
||||
//.........................................................................
|
||||
|
||||
'handleHideCard': function () {
|
||||
this.focus();
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
'addCard': function (aSourceElement) {
|
||||
return Clipperz.Async.callbacks("CardsController.addCard", [
|
||||
Clipperz.Async.collectResults("CardsController.addCard <inner results>", {
|
||||
'record': MochiKit.Base.method(this.user(), 'createNewRecord'),
|
||||
'delegate': MochiKit.Base.partial(MochiKit.Async.succeed, this)
|
||||
}, {trace:false}),
|
||||
function (someParameters) {
|
||||
return new Clipperz.PM.UI.Web.Controllers.CardDialogController(someParameters);
|
||||
},
|
||||
MochiKit.Base.methodcaller('run', aSourceElement)
|
||||
], {trace:false});
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
'handleDeleteCard': function (anObject, anEvent) {
|
||||
var deferredResult;
|
||||
var confirmationDialog;
|
||||
|
||||
// confirmationDialog = new Clipperz.PM.UI.Common.Components.SimpleMessagePanel({
|
||||
confirmationDialog = new Clipperz.PM.UI.Common.Components.MessagePanelWithProgressBar({
|
||||
'title': "Delete Card",
|
||||
'text': "Do you want to delete …",
|
||||
'type': 'ALERT',
|
||||
'buttons': [
|
||||
{text:"Cancel", result:'CANCEL'},
|
||||
{text:"Delete", result:'OK', isDefault:true}
|
||||
],
|
||||
'canCancelWhileProcessing': false
|
||||
});
|
||||
|
||||
deferredResult = new Clipperz.Async.Deferred("AppController.handleDeleteCard", {trace:false});
|
||||
deferredResult.addCallback(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'initProgress', {'steps':5}),
|
||||
deferredResult.addMethod(this.grid(), 'selectRow', anObject);
|
||||
deferredResult.addMethod(confirmationDialog, 'deferredShowModal', {
|
||||
'openFromElement': anEvent.src(),
|
||||
'onOkCloseToElement': null, // MochiKit.DOM.currentDocument().body,
|
||||
'onCancelCloseToElement': anEvent.src()
|
||||
});
|
||||
// deferredResult.addCallback(function () { Clipperz.log("DELETE: " + anObject.toString(), anObject); });
|
||||
deferredResult.addMethod(this.user(), 'deleteRecord', anObject);
|
||||
deferredResult.addBothPass(MochiKit.Base.method(this.grid(), 'unselectRow', anObject));
|
||||
deferredResult.addMethod(this, 'saveChanges');
|
||||
deferredResult.addMethod(confirmationDialog, 'deferredDone');
|
||||
deferredResult.addErrbackPass(function (anError) {
|
||||
var result;
|
||||
|
||||
if (! (anError instanceof MochiKit.Async.CancelledError)) {
|
||||
result = confirmationDialog.deferredError({
|
||||
'type': 'ALERT',
|
||||
'title': "Error",
|
||||
'text': Clipperz.PM.Strings.errorDescriptionForException(anError),
|
||||
'buttons': [{text:"Close", result:'CANCEL', isDefault:true}]
|
||||
})
|
||||
} else {
|
||||
result = anError;
|
||||
}
|
||||
|
||||
return result;
|
||||
});
|
||||
deferredResult.callback();
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//=============================================================================
|
||||
__syntaxFix__: "syntax fix"
|
||||
});
|
||||
@@ -0,0 +1,611 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers');
|
||||
|
||||
Clipperz.PM.UI.Web.Controllers.DirectLoginWizardController = function(args) {
|
||||
this._directLoginEditingComponent = args.directLoginEditingComponent || Clipperz.Base.exception.raise('MandatoryParameter');
|
||||
this._cardLabel = args.cardLabel || Clipperz.Base.exception.raise('MandatoryParameter');
|
||||
|
||||
MochiKit.Signal.connect(this._directLoginEditingComponent, 'changedValue', this, 'handleChangedValue');
|
||||
MochiKit.Signal.connect(this._directLoginEditingComponent, 'moveForward', this, 'handleMoveForward');
|
||||
MochiKit.Signal.connect(this._directLoginEditingComponent, 'keyPressed', this, 'handleDirectLoginEditingComponentKeyPressed');
|
||||
|
||||
this._directLogin = null;
|
||||
this._directLoginHasJustBeenAdded = false;
|
||||
|
||||
this._rulerComponent = null;
|
||||
|
||||
this._steps = null;
|
||||
this._currentStepIndex = 0;
|
||||
this._isNextEnabled = false;
|
||||
|
||||
this._recordFields = null;
|
||||
this._originalBindings = null;
|
||||
|
||||
this._bindingComponents = [];
|
||||
this._formValueComponents = [];
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
MochiKit.Base.update(Clipperz.PM.UI.Web.Controllers.DirectLoginWizardController.prototype, {
|
||||
|
||||
'toString': function() {
|
||||
return "Clipperz.PM.UI.Web.Controllers.DirectLoginWizardController";
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'directLogin': function () {
|
||||
return this._directLogin;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'directLoginHasJustBeenAdded': function () {
|
||||
return this._directLoginHasJustBeenAdded;
|
||||
},
|
||||
|
||||
'setDirectLoginHasJustBeenAdded': function (aValue) {
|
||||
this._directLoginHasJustBeenAdded = aValue;
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'directLoginEditingComponent': function () {
|
||||
return this._directLoginEditingComponent;
|
||||
},
|
||||
|
||||
//=============================================================================
|
||||
|
||||
'cardLabel': function () {
|
||||
return this._cardLabel;
|
||||
},
|
||||
|
||||
//=============================================================================
|
||||
|
||||
'resetCurrentStepIndex': function () {
|
||||
this._currentStepIndex = 0;
|
||||
this.rulerComponent().resetStatus();
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
'enableNext': function (aValue) {
|
||||
this.rulerComponent().enableNext(aValue);
|
||||
this._isNextEnabled = aValue;
|
||||
},
|
||||
|
||||
'isNextEnabled': function () {
|
||||
return this._isNextEnabled;
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
'enablePrevious': function (aValue) {
|
||||
this.rulerComponent().enablePrevious(aValue);
|
||||
},
|
||||
|
||||
//=============================================================================
|
||||
|
||||
'bindingComponents': function () {
|
||||
return this._bindingComponents;
|
||||
},
|
||||
|
||||
'resetBindingComponents': function () {
|
||||
this.directLoginEditingComponent().clearAllBindingsComponents();
|
||||
this._bindingComponents = [];
|
||||
},
|
||||
|
||||
//=============================================================================
|
||||
|
||||
'formValueComponents': function () {
|
||||
return this._formValueComponents;
|
||||
},
|
||||
|
||||
'resetFormValueComponents': function () {
|
||||
this.directLoginEditingComponent().clearAllFormValueComponents();
|
||||
this._formValueComponents = [];
|
||||
},
|
||||
|
||||
//=============================================================================
|
||||
|
||||
'recordFields': function () {
|
||||
return this._recordFields;
|
||||
},
|
||||
|
||||
'setRecordFields': function (aValue) {
|
||||
this._recordFields = aValue;
|
||||
},
|
||||
|
||||
'recordFieldWithReference': function (aReference) {
|
||||
var matchingValues;
|
||||
var result;
|
||||
|
||||
matchingValues = MochiKit.Base.filter(function (aField) { return aField['reference'] == aReference; }, this.recordFields());
|
||||
|
||||
if (matchingValues.length == 0) {
|
||||
result = null;
|
||||
} else {
|
||||
result = matchingValues[0];
|
||||
}
|
||||
|
||||
return result;
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
'originalBindings': function () {
|
||||
return this._originalBindings;
|
||||
},
|
||||
|
||||
'setOriginalBindings': function (aValue) {
|
||||
//console.log("BINDINGS", aValue);
|
||||
this._originalBindings = aValue;
|
||||
},
|
||||
|
||||
//=============================================================================
|
||||
|
||||
'rulerComponent': function () {
|
||||
if (this._rulerComponent == null) {
|
||||
this._rulerComponent = new Clipperz.PM.UI.Web.Components.RulerComponent({
|
||||
translationContext:'Wizards.DirectLoginWizard'
|
||||
});
|
||||
this._rulerComponent.render();
|
||||
|
||||
MochiKit.Signal.connect(this._rulerComponent, 'exit', this, 'handleExit');
|
||||
MochiKit.Signal.connect(this._rulerComponent, 'done', this, 'done');
|
||||
MochiKit.Signal.connect(this._rulerComponent, 'moveForward', this, 'handleMoveForward');
|
||||
MochiKit.Signal.connect(this._rulerComponent, 'moveBackward', this, 'handleMoveBackward');
|
||||
MochiKit.Signal.connect(this._rulerComponent, 'cursorMoved', this, 'handleCursorMoved');
|
||||
}
|
||||
|
||||
return this._rulerComponent;
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
'showRuler': function (someSteps) {
|
||||
var rulerElement;
|
||||
|
||||
this.setSteps(someSteps);
|
||||
|
||||
rulerElement = this.rulerComponent().element();
|
||||
this.directLoginEditingComponent().disableAllPanels();
|
||||
|
||||
MochiKit.Style.showElement(rulerElement);
|
||||
MochiKit.Style.setElementPosition(rulerElement, {x:-1000, y:this.directLoginEditingComponent().bottomMargin()});
|
||||
new MochiKit.Visual.Move(rulerElement, {
|
||||
x:0, y:this.directLoginEditingComponent().bottomMargin(),
|
||||
mode:'absolute',
|
||||
duration:1,
|
||||
afterFinish:MochiKit.Base.method(this, 'handleCursorMoved')
|
||||
});
|
||||
},
|
||||
|
||||
'fixRulerRendering': function (aValue) {
|
||||
this.rulerComponent().setDisplayMode(aValue);
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
'hideRuler': function () {
|
||||
new MochiKit.Visual.Move(this.rulerComponent().element(), {x:-1000, mode:'relative', duration:1});
|
||||
},
|
||||
|
||||
'doneWithRuler': function () {
|
||||
var rulerComponentElement;
|
||||
|
||||
rulerComponentElement = this.rulerComponent().element();
|
||||
new MochiKit.Visual.Move(this.rulerComponent().element(), {
|
||||
x:1000,
|
||||
mode:'relative',
|
||||
duration:1,
|
||||
// afterFinish:MochiKit.Base.partial(MochiKit.Style.hideElement, rulerComponentElement)
|
||||
afterFinish:function () { MochiKit.Style.hideElement(rulerComponentElement); }
|
||||
});
|
||||
},
|
||||
|
||||
//=============================================================================
|
||||
|
||||
'addNewDirectLoginRulerSteps': function () {
|
||||
return MochiKit.Base.concat([ 'LABEL'], this.editDirectLoginRulerSteps());
|
||||
|
||||
},
|
||||
|
||||
'editDirectLoginRulerSteps': function () {
|
||||
return [ /*'TYPE',*/ 'CONFIGURATION', 'BINDINGS','FAVICON', 'DONE'];
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'runWithDirectLogin': function (aDirectLogin, hasJustBeenAdded) {
|
||||
this._directLogin = aDirectLogin;
|
||||
this.setDirectLoginHasJustBeenAdded(hasJustBeenAdded);
|
||||
|
||||
return Clipperz.Async.callbacks("DirectLoginWizardController.runWithDirectLogin", [
|
||||
MochiKit.Base.method(aDirectLogin, 'label'),
|
||||
MochiKit.Base.method(this.directLoginEditingComponent(), 'setLabel'),
|
||||
|
||||
MochiKit.Base.method(aDirectLogin, 'favicon'),
|
||||
MochiKit.Base.method(this.directLoginEditingComponent(), 'setDirectLoginFavicon'),
|
||||
|
||||
MochiKit.Base.method(aDirectLogin, 'bookmarkletConfiguration'),
|
||||
MochiKit.Base.method(this.directLoginEditingComponent(), 'setBookmarkletConfiguration'),
|
||||
|
||||
MochiKit.Base.method(aDirectLogin, 'bindings'),
|
||||
MochiKit.Base.method(this, 'setOriginalBindings'),
|
||||
|
||||
MochiKit.Base.method(aDirectLogin, 'record'),
|
||||
MochiKit.Base.methodcaller('fields'),
|
||||
MochiKit.Base.values,
|
||||
MochiKit.Base.partial(MochiKit.Base.map, Clipperz.Async.collectResults("Record.directLoginReferences - collectResults", {
|
||||
'reference': MochiKit.Base.methodcaller('reference'),
|
||||
'label': MochiKit.Base.methodcaller('label'),
|
||||
'isHidden': MochiKit.Base.methodcaller('isHidden'),
|
||||
'value': MochiKit.Base.methodcaller('value')
|
||||
}, {trace:false})),
|
||||
Clipperz.Async.collectAll,
|
||||
|
||||
MochiKit.Base.method(this, 'setRecordFields'),
|
||||
|
||||
MochiKit.Base.partial(MochiKit.Async.succeed, hasJustBeenAdded),
|
||||
Clipperz.Async.deferredIf("Direct login has just been added", [
|
||||
MochiKit.Base.method(this, 'addNewDirectLoginRulerSteps')
|
||||
], [
|
||||
MochiKit.Base.method(this, 'editDirectLoginRulerSteps')
|
||||
]),
|
||||
MochiKit.Base.method(this, 'showRuler')
|
||||
], {trace:false});
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
'checkState': function () {
|
||||
var enablePrevious;
|
||||
var enableNext;
|
||||
|
||||
enablePrevious = true;
|
||||
enableNext = false;
|
||||
|
||||
this.directLoginEditingComponent().disableAllPanels();
|
||||
|
||||
switch(this.currentStep()) {
|
||||
case 'LABEL':
|
||||
this.directLoginEditingComponent().enableLabelField();
|
||||
|
||||
enableNext = (this.directLoginEditingComponent().label() != '');
|
||||
enablePrevious = false;
|
||||
break;
|
||||
case 'TYPE':
|
||||
this.directLoginEditingComponent().enableTypeField();
|
||||
|
||||
enableNext = true;
|
||||
enablePrevious = true;
|
||||
break
|
||||
case 'CONFIGURATION':
|
||||
this.directLoginEditingComponent().enableConfigurationField();
|
||||
|
||||
enableNext = (this.directLoginEditingComponent().bookmarkletConfiguration() != '');
|
||||
|
||||
if (enableNext == true) {
|
||||
try {
|
||||
Clipperz.PM.DataModel.DirectLogin.checkBookmarkletConfiguration(this.directLoginEditingComponent().bookmarkletConfiguration());
|
||||
this.directLoginEditingComponent().removeHighlightConfigurationSyntaxError();
|
||||
} catch (e) {
|
||||
this.directLoginEditingComponent().highlightConfigurationSyntaxError();
|
||||
enableNext = false;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 'BINDINGS':
|
||||
enableNext = MochiKit.Iter.every(this.bindingComponents(), function (aBindingComponent) { return aBindingComponent.selectedValue() != null; })
|
||||
this.directLoginEditingComponent().enableBindingFields();
|
||||
break;
|
||||
case 'FAVICON':
|
||||
enableNext = true;
|
||||
this.directLoginEditingComponent().enableFaviconField();
|
||||
break;
|
||||
case 'DONE':
|
||||
enableNext = true;
|
||||
this.directLoginEditingComponent().enableDonePanel();
|
||||
break;
|
||||
}
|
||||
|
||||
if (this.currentStepIndex() > 0) {
|
||||
this.enablePrevious(enablePrevious);
|
||||
} else {
|
||||
this.enablePrevious(false);
|
||||
}
|
||||
this.enableNext(enableNext);
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
'setFocus': function () {
|
||||
switch(this.currentStep()) {
|
||||
case 'LABEL':
|
||||
this.directLoginEditingComponent().focusOnLabelElement();
|
||||
break;
|
||||
case 'TYPE':
|
||||
break;
|
||||
case 'CONFIGURATION':
|
||||
this.directLoginEditingComponent().focusOnBookmarkletConfigurationElement();
|
||||
break;
|
||||
case 'BINDINGS':
|
||||
// this.directLoginEditingComponent().getElement('???').focus();
|
||||
break;
|
||||
case 'FAVICON':
|
||||
this.directLoginEditingComponent().focusOnFaviconElement();
|
||||
break;
|
||||
case 'DONE':
|
||||
break;
|
||||
}
|
||||
},
|
||||
|
||||
//=============================================================================
|
||||
|
||||
'steps': function () {
|
||||
return this._steps;
|
||||
},
|
||||
|
||||
'setSteps': function (aValue) {
|
||||
this._steps = aValue;
|
||||
|
||||
this.rulerComponent().setSteps(aValue);
|
||||
this.resetCurrentStepIndex();
|
||||
},
|
||||
|
||||
'currentStepIndex': function () {
|
||||
return this._currentStepIndex;
|
||||
},
|
||||
|
||||
'currentStep': function () {
|
||||
return this.steps()[this.currentStepIndex()];
|
||||
},
|
||||
|
||||
//=============================================================================
|
||||
|
||||
'handleExit': function () {
|
||||
MochiKit.Signal.signal(this, 'exit');
|
||||
},
|
||||
|
||||
'done': function () {
|
||||
this.doneWithRuler();
|
||||
|
||||
Clipperz.Async.callbacks("DirectLoginWizardController.done", [
|
||||
MochiKit.Base.method(this.directLoginEditingComponent(), 'label'),
|
||||
MochiKit.Base.method(this.directLogin(), 'setLabel'),
|
||||
|
||||
MochiKit.Base.method(this.directLoginEditingComponent(), 'bookmarkletConfiguration'),
|
||||
MochiKit.Base.method(this.directLogin(), 'setBookmarkletConfiguration'),
|
||||
|
||||
// Bindings
|
||||
MochiKit.Base.method(this.directLoginEditingComponent(), 'bindingComponents'),
|
||||
// MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.bind(function (aBindingComponent) {
|
||||
Clipperz.Async.forEach(MochiKit.Base.bind(function (aBindingComponent) {
|
||||
//console.log("aBindingComponent", aBindingComponent);
|
||||
// this.directLogin().
|
||||
return Clipperz.Async.callbacks("DirectLoginWizardController.done - update directLogin bindings", [
|
||||
MochiKit.Base.method(this.directLogin(), 'bindings'),
|
||||
MochiKit.Base.itemgetter(aBindingComponent.formFieldName()),
|
||||
MochiKit.Base.methodcaller('setFieldKey', aBindingComponent.selectedValue())
|
||||
], {trace:false});
|
||||
}, this)),
|
||||
|
||||
MochiKit.Base.method(this.directLoginEditingComponent(), 'favicon'),
|
||||
MochiKit.Base.method(this.directLogin(), 'setFavicon'),
|
||||
|
||||
MochiKit.Base.partial(MochiKit.Signal.signal, this, 'done', {
|
||||
'directLogin': this.directLogin(),
|
||||
'hasJustBeenAdded': this.directLoginHasJustBeenAdded()
|
||||
})
|
||||
], {trace:false});
|
||||
},
|
||||
|
||||
//=============================================================================
|
||||
|
||||
'handleMoveBackward': function () {
|
||||
if (this._currentStepIndex > 0) {
|
||||
var afterMoveAction;
|
||||
|
||||
this._currentStepIndex --;
|
||||
afterMoveAction = MochiKit.Base.noop;
|
||||
|
||||
switch(this.currentStep()) {
|
||||
case 'LABEL':
|
||||
break;
|
||||
case 'TYPE':
|
||||
break;
|
||||
case 'CONFIGURATION':
|
||||
break;
|
||||
case 'BINDINGS':
|
||||
break;
|
||||
case 'FAVICON':
|
||||
break;
|
||||
case 'DONE':
|
||||
break;
|
||||
};
|
||||
|
||||
this.rulerComponent().moveBackward(afterMoveAction);
|
||||
}
|
||||
|
||||
if (this._currentStepIndex == 0) {
|
||||
this.enablePrevious(false);
|
||||
}
|
||||
},
|
||||
|
||||
'handleMoveForward': function () {
|
||||
if (this.isNextEnabled()) {
|
||||
var afterMoveAction;
|
||||
|
||||
this._currentStepIndex ++;
|
||||
afterMoveAction = MochiKit.Base.noop;
|
||||
|
||||
switch(this.currentStep()) {
|
||||
case 'LABEL':
|
||||
break;
|
||||
case 'TYPE':
|
||||
break;
|
||||
case 'CONFIGURATION':
|
||||
break;
|
||||
case 'BINDINGS':
|
||||
this.resetBindingComponents();
|
||||
this.resetFormValueComponents();
|
||||
|
||||
afterMoveAction = MochiKit.Base.partial(Clipperz.Async.callbacks, "DirectLoginWizardController.handleMoveForward - BINDINGS", [
|
||||
MochiKit.Base.method(this.directLogin(), 'setBookmarkletConfiguration', this.directLoginEditingComponent().bookmarkletConfiguration()),
|
||||
|
||||
MochiKit.Base.method(this.directLogin(), 'favicon'),
|
||||
MochiKit.Base.method(this.directLoginEditingComponent(), 'setDirectLoginFavicon'),
|
||||
|
||||
MochiKit.Base.method(this.directLogin(), 'bindings'),
|
||||
MochiKit.Base.values,
|
||||
Clipperz.Async.forEach(MochiKit.Base.bind(function (aBinding) {
|
||||
var bindingComponent;
|
||||
|
||||
bindingComponent = new Clipperz.PM.UI.Web.Components.DirectLoginEditingBindingComponent({
|
||||
formFieldName: aBinding.key(),
|
||||
fields: this.recordFields(),
|
||||
selectedFieldKey: aBinding.fieldKey()
|
||||
});
|
||||
|
||||
this.bindingComponents().push(bindingComponent);
|
||||
|
||||
MochiKit.Signal.connect(bindingComponent, 'bindChange', this, 'handleBindChange', bindingComponent);
|
||||
this.directLoginEditingComponent().addBindingComponent(bindingComponent);
|
||||
|
||||
}, this)),
|
||||
|
||||
MochiKit.Base.method(this.directLogin(), 'formValues'),
|
||||
MochiKit.Base.values,
|
||||
Clipperz.Async.forEach(MochiKit.Base.bind(function (aFormValue) {
|
||||
var formValueComponent;
|
||||
|
||||
formValueComponent = new Clipperz.PM.UI.Web.Components.DirectLoginEditingFormValueComponent({
|
||||
'formFieldName': aFormValue.key(),
|
||||
'fieldOptions': aFormValue.fieldOptions(),
|
||||
'initialValue': aFormValue.value()
|
||||
});
|
||||
|
||||
this.formValueComponents().push(formValueComponent);
|
||||
|
||||
MochiKit.Signal.connect(formValueComponent, 'formValueChange', this, 'handleFormValueChange', formValueComponent);
|
||||
this.directLoginEditingComponent().addFormValueComponent(formValueComponent);
|
||||
}, this))
|
||||
|
||||
], {trace:false});
|
||||
|
||||
break;
|
||||
case 'FAVICON':
|
||||
break;
|
||||
case 'DONE':
|
||||
this.directLoginEditingComponent().setDoneDescriptionWithKeys({
|
||||
'__cardName__': this.cardLabel(),
|
||||
'__directLoginName__': this.directLoginEditingComponent().label()
|
||||
});
|
||||
break;
|
||||
};
|
||||
|
||||
this.rulerComponent().moveForward(afterMoveAction);
|
||||
};
|
||||
},
|
||||
|
||||
'handleCursorMoved': function () {
|
||||
this.checkState();
|
||||
this.setFocus();
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'handleChangedValue': function (anEvent) {
|
||||
this.checkState();
|
||||
},
|
||||
|
||||
//.........................................................................
|
||||
|
||||
'handleBindChange': function (aDirectLoginEditingBindingComponent) {
|
||||
var selectedField;
|
||||
|
||||
selectedField = this.recordFieldWithReference(aDirectLoginEditingBindingComponent.selectedValue());
|
||||
|
||||
return Clipperz.Async.callbacks("DirectLoginWizardController.handleBindChange", [
|
||||
MochiKit.Base.method(this.directLogin(), 'bindings'),
|
||||
MochiKit.Base.itemgetter(aDirectLoginEditingBindingComponent.formFieldName()),
|
||||
MochiKit.Base.methodcaller('setFieldKey', selectedField['reference']),
|
||||
function () {
|
||||
if (selectedField != null) {
|
||||
aDirectLoginEditingBindingComponent.setFieldValue(selectedField['value']);
|
||||
aDirectLoginEditingBindingComponent.setIsHidden(selectedField['isHidden']);
|
||||
} else {
|
||||
aDirectLoginEditingBindingComponent.setFieldValue('');
|
||||
aDirectLoginEditingBindingComponent.setIsHidden(false);
|
||||
}
|
||||
},
|
||||
MochiKit.Base.method(this, 'checkState')
|
||||
], {trace:false});
|
||||
},
|
||||
|
||||
//.........................................................................
|
||||
|
||||
'handleFormValueChange': function (someOptions) {
|
||||
return Clipperz.Async.callbacks("DirectLoginWizardController.handleFormValueChange", [
|
||||
MochiKit.Base.method(this.directLogin(), 'formValues'),
|
||||
MochiKit.Base.itemgetter(someOptions['fieldName']),
|
||||
MochiKit.Base.methodcaller('setValue', someOptions['selectedValue']),
|
||||
MochiKit.Base.method(this, 'checkState')
|
||||
], {trace:false});
|
||||
},
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
'handleDirectLoginEditingComponentKeyPressed': function (anEvent) {
|
||||
if (anEvent.key().string == 'KEY_ENTER') {
|
||||
if (anEvent.target().nodeName != 'TEXTAREA') {
|
||||
anEvent.preventDefault();
|
||||
this.handleMoveForward();
|
||||
}
|
||||
} else if (anEvent.key().string == 'KEY_TAB') {
|
||||
this.handleMoveForward();
|
||||
if ((anEvent.target().nodeName == 'INPUT') || (anEvent.target().nodeName == 'TEXTAREA')) {
|
||||
anEvent.preventDefault();
|
||||
}
|
||||
} else if ((anEvent.key().string == 'KEY_ARROW_RIGHT') && (anEvent.modifier().meta == true)) {
|
||||
this.handleMoveForward();
|
||||
} else if ((anEvent.key().string == 'KEY_ARROW_LEFT') && (anEvent.modifier().meta == true)) {
|
||||
this.handleMoveBackward();
|
||||
} else if (anEvent.key().string == 'KEY_ESCAPE') {
|
||||
anEvent.stop();
|
||||
this.handleExit();
|
||||
}
|
||||
},
|
||||
|
||||
//=============================================================================
|
||||
__syntaxFix__: "syntax fix"
|
||||
});
|
||||
@@ -0,0 +1,145 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
/*
|
||||
Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers');
|
||||
|
||||
Clipperz.PM.UI.Web.Controllers.DirectLoginsController = function() {
|
||||
Clipperz.PM.UI.Web.Controllers.DirectLoginsController.superclass.constructor.apply(this, arguments);
|
||||
|
||||
return this;
|
||||
};
|
||||
|
||||
Clipperz.Base.extend(Clipperz.PM.UI.Web.Controllers.DirectLoginsController, Clipperz.PM.UI.Web.Controllers.GridController, {
|
||||
|
||||
'createGrid': function () {
|
||||
return new Clipperz.PM.UI.Web.Components.GridComponent({columnsManagers: [
|
||||
new Clipperz.PM.UI.Web.Components.FaviconColumnManager({
|
||||
'name': 'DirectLogins.favicon',
|
||||
'selector': MochiKit.Base.methodcaller('favicon'),
|
||||
'cssClass': 'favicon'
|
||||
}),
|
||||
// new Clipperz.PM.UI.Web.Components.LinkColumnManager({
|
||||
new Clipperz.PM.UI.Web.Components.DirectLoginColumnManager({
|
||||
'name': 'DirectLogins.title',
|
||||
'selector': MochiKit.Base.methodcaller('label'),
|
||||
'label': 'title',
|
||||
'cssClass': 'title',
|
||||
'comparator': Clipperz.Base.caseInsensitiveCompare,
|
||||
'sortable': true,
|
||||
'sorted': 'ASCENDING',
|
||||
'actionMethod': MochiKit.Base.methodcaller('runDirectLogin')
|
||||
}),
|
||||
// new Clipperz.PM.UI.Web.Components.TextColumnManager({ //should be StrengthColumnManager
|
||||
// 'label': 'strength',
|
||||
// 'cssClass': 'title',
|
||||
// 'selector': MochiKit.Base.methodcaller('label') //should be 'strength' or a strenght evaluation function
|
||||
// }),
|
||||
new Clipperz.PM.UI.Web.Components.LinkColumnManager({
|
||||
'name': 'DirectLogins.cardTitle',
|
||||
'selector': MochiKit.Base.compose(MochiKit.Base.methodcaller('label'), MochiKit.Base.methodcaller('record')),
|
||||
'label': 'card',
|
||||
'cssClass': 'cardTitle',
|
||||
'comparator': Clipperz.Base.caseInsensitiveCompare,
|
||||
'sortable': true,
|
||||
'sorted': 'UNSORTED',
|
||||
'actionMethod': MochiKit.Base.method(this, 'handleShowCard')
|
||||
}),
|
||||
// new Clipperz.PM.UI.Web.Components.TextColumnManager({ //should be StrengthColumnManager
|
||||
// 'label': 'last access',
|
||||
// 'cssClass': 'title',
|
||||
// 'selector': MochiKit.Base.methodcaller('label')
|
||||
// // 'sortable': true,
|
||||
// // 'sorted': 'UNSORTED'
|
||||
// }),
|
||||
// new Clipperz.PM.UI.Web.Components.TextColumnManager({
|
||||
// 'label': 'commands',
|
||||
// 'cssClass': 'title',
|
||||
// 'selector': MochiKit.Base.methodcaller('label'), //should be a function for commands display
|
||||
// }),
|
||||
new Clipperz.PM.UI.Web.Components.DeleteObjectColumnManager({
|
||||
'name': 'DirectLogins.delete',
|
||||
'selector': MochiKit.Base.noop,
|
||||
'cssClass': 'delete',
|
||||
// 'actionMethod': function(anObject, anEvent) { MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'deleteDirectLogin', {objectData:anObject, element:anEvent.src()})}
|
||||
'actionMethod': MochiKit.Base.method(this, 'handleDeleteDirectLogin')
|
||||
})
|
||||
]});
|
||||
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
'getRows': function () {
|
||||
// TODO: relying on user() in GridController, bad code smell :|
|
||||
return this.user().getDirectLogins();
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
'handleShowCard': function (anObject, anEvent) {
|
||||
var cardDialogController;
|
||||
|
||||
cardDialogController = new Clipperz.PM.UI.Web.Controllers.CardDialogController({record:anObject.record()})
|
||||
cardDialogController.run(anEvent.src());
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
'handleDeleteDirectLogin': function (anObject, anEvent) {
|
||||
var deferredResult;
|
||||
var confirmationDialog;
|
||||
|
||||
confirmationDialog = new Clipperz.PM.UI.Common.Components.SimpleMessagePanel({
|
||||
title: "Delete DirectLogin",
|
||||
text: "Do you want to delete …",
|
||||
type: 'ALERT',
|
||||
buttons: [
|
||||
{text:"Cancel", result:'CANCEL', isDefault:true},
|
||||
{text:"Delete", result:'OK'}
|
||||
]
|
||||
});
|
||||
|
||||
deferredResult = new Clipperz.Async.Deferred("AppController.handleDeleteCard", {trace:false});
|
||||
// deferredResult = confirmationDialog.deferredShow({openFromElement:anEvent.src(), onOkCloseToElement:MochiKit.DOM.currentDocument().body, onCancelCloseToElement:anEvent.src()});
|
||||
deferredResult.addMethod(confirmationDialog, 'deferredShow', {
|
||||
'openFromElement': anEvent.src(),
|
||||
'onOkCloseToElement': null, // MochiKit.DOM.currentDocument().body,
|
||||
'onCancelCloseToElement': anEvent.src()
|
||||
});
|
||||
deferredResult.addCallback(function () { Clipperz.log("DELETE: " + anObject.toString(), anObject); });
|
||||
deferredResult.addErrbackPass(function () { Clipperz.log("skip deletion: " + anObject.toString(), anObject); });
|
||||
deferredResult.callback();
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
__syntaxFix__: "syntax fix"
|
||||
});
|
||||
*/
|
||||
@@ -0,0 +1,158 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers');
|
||||
|
||||
Clipperz.PM.UI.Web.Controllers.FilterController = function(args) {
|
||||
args = args || {};
|
||||
|
||||
Clipperz.PM.UI.Web.Controllers.FilterController.superclass.constructor.call(this, args);
|
||||
|
||||
this._filterElements = [];
|
||||
this._filter = "";
|
||||
|
||||
this._pendingSearchClicks = 0;
|
||||
|
||||
return this;
|
||||
};
|
||||
|
||||
|
||||
Clipperz.Base.extend(Clipperz.PM.UI.Web.Controllers.FilterController, Object, {
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
'getFilter': function () {
|
||||
return this._filter;
|
||||
},
|
||||
|
||||
'_setFilter': function (aFilterElement, aFilter) {
|
||||
if (aFilter != this._filter) {
|
||||
this._filter = aFilter;
|
||||
MochiKit.Signal.signal(this, 'filterUpdated', aFilter);
|
||||
this.updateFilterElements(aFilterElement, aFilter);
|
||||
}
|
||||
},
|
||||
|
||||
'setFilter': function (aFilter) {
|
||||
this._setFilter(null, aFilter);
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
'filterElements': function () {
|
||||
return this._filterElements;
|
||||
},
|
||||
|
||||
'registerFilterElement': function (aFilterElement) {
|
||||
//Clipperz.log("=== FilterController.registerFilterElement", aFilterElement);
|
||||
this._filterElements.push(aFilterElement);
|
||||
MochiKit.Signal.connect(aFilterElement, 'onkeydown', this, 'searchClickHandler');
|
||||
MochiKit.Signal.connect(aFilterElement, 'onfocus', this, 'searchClickHandler');
|
||||
},
|
||||
|
||||
'removeFilterElement': function (aFilterElement) {
|
||||
var i;
|
||||
var filterElements;
|
||||
for (i=0; i < filterElements; i++) {
|
||||
if (filterElements[i] == aFilterElement);
|
||||
filterElements.splice(i, 1);
|
||||
// TODO unregister/disconnect filterElement ?? MochiKit.Signal.disconnect(this.grid().filterElement(), 'updateFilter', this.filterController(), 'handleUpdateFilter');
|
||||
}
|
||||
},
|
||||
|
||||
'updateFilterElements': function (aSourceElement, aFilterString) {
|
||||
MochiKit.Iter.forEach(this.filterElements(),
|
||||
function (aFilterElement) {
|
||||
if (aFilterElement != aSourceElement) {
|
||||
aFilterElement.value = aFilterString;
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
if (aSourceElement != null) {
|
||||
aSourceElement.focus();
|
||||
}
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
'run': function () {
|
||||
//Clipperz.log("=== FilterController.run");
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
'pendingSearchClicks': function () {
|
||||
return this._pendingSearchClicks;
|
||||
},
|
||||
|
||||
'incrementPendingSearchClicks': function () {
|
||||
this._pendingSearchClicks++;
|
||||
},
|
||||
|
||||
'decrementPendingSearchClicks': function () {
|
||||
this._pendingSearchClicks--;
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
'searchClickHandler': function (anEvent) {
|
||||
if ((typeof(anEvent.key()) != 'undefined') && (anEvent.key().string == 'KEY_ENTER')) {
|
||||
anEvent.preventDefault();
|
||||
} else {
|
||||
var value;
|
||||
|
||||
if ((typeof(anEvent.key()) != 'undefined') && (anEvent.key().string == 'KEY_ESCAPE')) {
|
||||
value = ""
|
||||
} else if ((typeof(anEvent.key()) != 'undefined') && (anEvent.key().string == 'KEY_ARROW_UP')) {
|
||||
} else if ((typeof(anEvent.key()) != 'undefined') && (anEvent.key().string == 'KEY_ARROW_DOWN')) {
|
||||
} else {
|
||||
value = null;
|
||||
}
|
||||
|
||||
this.incrementPendingSearchClicks();
|
||||
MochiKit.Async.callLater(0.1, MochiKit.Base.method(this, "searchClickDeferredHandler", anEvent.src(), value));
|
||||
}
|
||||
},
|
||||
|
||||
//.........................................................................
|
||||
|
||||
'searchClickDeferredHandler': function (aFilterElement, aValue) {
|
||||
if (aValue != null) {
|
||||
aFilterElement.value = aValue;
|
||||
}
|
||||
|
||||
this.decrementPendingSearchClicks();
|
||||
if (this.pendingSearchClicks()==0) {
|
||||
this._setFilter(aFilterElement, aFilterElement.value);
|
||||
}
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
'syntaxFix': 'syntax fix'
|
||||
});
|
||||
@@ -0,0 +1,374 @@
|
||||
/*
|
||||
|
||||
Copyright 2008-2011 Clipperz Srl
|
||||
|
||||
This file is part of Clipperz's Javascript Crypto Library.
|
||||
Javascript Crypto Library provides web developers with an extensive
|
||||
and efficient set of cryptographic functions. The library aims to
|
||||
obtain maximum execution speed while preserving modularity and
|
||||
reusability.
|
||||
For further information about its features and functionalities please
|
||||
refer to http://www.clipperz.com
|
||||
|
||||
* Javascript Crypto Library is free software: you can redistribute
|
||||
it and/or modify it under the terms of the GNU Affero General Public
|
||||
License as published by the Free Software Foundation, either version
|
||||
3 of the License, or (at your option) any later version.
|
||||
|
||||
* Javascript Crypto Library is distributed in the hope that it will
|
||||
be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Affero General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
License along with Javascript Crypto Library. If not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers');
|
||||
|
||||
Clipperz.PM.UI.Web.Controllers.GridController = function(args) {
|
||||
args = args || {};
|
||||
|
||||
Clipperz.PM.UI.Web.Controllers.GridController.superclass.constructor.call(this, args);
|
||||
|
||||
this._grid = null;
|
||||
this._user = null;
|
||||
this._sortedColumnManager = null;
|
||||
this._cachedObjects = null;
|
||||
this._filterController = args.filterController || null;
|
||||
|
||||
this._deferredDisplaySelectedRowsInvocation = null;
|
||||
|
||||
return this;
|
||||
};
|
||||
|
||||
Clipperz.Base.extend(Clipperz.PM.UI.Web.Controllers.GridController, Object, {
|
||||
|
||||
'toString': function() {
|
||||
return "Clipperz.PM.UI.Web.Controllers.GridController";
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
'createGrid': function () {
|
||||
throw Clipperz.Base.exception.AbstractMethod;
|
||||
},
|
||||
|
||||
'setupWithGrid': function (aGrid) {
|
||||
this._grid = aGrid;
|
||||
|
||||
if (this._grid != null) {
|
||||
MochiKit.Iter.forEach(this.columnsManagers(), function (aColumnManager) {
|
||||
if (aColumnManager.isSortable()) {
|
||||
if (aColumnManager.isSorted()) {
|
||||
this.setSortedColumnManager(aColumnManager);
|
||||
}
|
||||
MochiKit.Signal.connect(aColumnManager, 'sort', this, 'handleColumnManagerSort');
|
||||
}
|
||||
MochiKit.Signal.connect(aColumnManager, 'selectRow', this, 'handleColumnManagerSelectRow');
|
||||
MochiKit.Signal.connect(aColumnManager, 'unselectRow', this, 'handleColumnManagerUnselectRow');
|
||||
}, this);
|
||||
}
|
||||
},
|
||||
|
||||
'grid': function() {
|
||||
if (this._grid == null) {
|
||||
this.setupWithGrid(this.createGrid());
|
||||
}
|
||||
|
||||
return this._grid;
|
||||
},
|
||||
|
||||
'filterController': function () {
|
||||
//Clipperz.log('GridController.filterController >>>', this._filterController);
|
||||
if (this._filterController == null) {
|
||||
this._filterController = new Clipperz.PM.UI.Web.Controllers.FilterController();
|
||||
}
|
||||
//Clipperz.log('GridController.filterController <<<', this._filterController);
|
||||
return this._filterController;
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
'columnsManagers': function () {
|
||||
return this.grid().columnsManagers();
|
||||
},
|
||||
|
||||
'columnManagerWithName': function (aName) {
|
||||
var managers;
|
||||
var result;
|
||||
|
||||
managers = MochiKit.Base.filter(function (aManager) { return aManager.name() == aName; } , this.columnsManagers());
|
||||
|
||||
if (managers.length == 1) {
|
||||
result = managers[0];
|
||||
} else if (managers.length == 0) {
|
||||
result = null;
|
||||
} else {
|
||||
throw "WTF!!!";
|
||||
}
|
||||
|
||||
return result;
|
||||
},
|
||||
|
||||
'sortedColumnManager': function () {
|
||||
return this._sortedColumnManager;
|
||||
},
|
||||
|
||||
'setSortedColumnManager': function(aValue) {
|
||||
if (aValue.sorted() != 'UNSORTED') {
|
||||
this._sortedColumnManager = aValue;
|
||||
} else {
|
||||
this._sortedColumnManager = null;
|
||||
}
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
'handleColumnManagerSort': function(aSelectedColumnManager) {
|
||||
MochiKit.Iter.forEach(this.columnsManagers(), function(aColumnManager) {
|
||||
if (aSelectedColumnManager != aColumnManager) {
|
||||
if (aColumnManager.isSortable()) {
|
||||
aColumnManager.setSorted('UNSORTED');
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
aSelectedColumnManager.toggleSorting();
|
||||
this.setSortedColumnManager(aSelectedColumnManager);
|
||||
|
||||
this.displaySelectedRows(this.filterController().getFilter());
|
||||
},
|
||||
|
||||
'handleColumnManagerSelectRow': function (aRowObject) {
|
||||
this.grid().selectRow(aRowObject);
|
||||
},
|
||||
|
||||
'handleColumnManagerUnselectRow': function (aRowObject) {
|
||||
this.grid().unselectRow(aRowObject);
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
'handleFilterUpdated': function (aFilter) {
|
||||
if (this.grid().isActive()) {
|
||||
this.displaySelectedRows(aFilter);
|
||||
}
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// TODO: relying on user() in GridController, bad code smell :|
|
||||
// mhh: a controller should have access to business logic object too. Otherwise it will fail its controller role. [Giulio Cesare]
|
||||
|
||||
'setUser': function(anUser) {
|
||||
this._user = anUser;
|
||||
},
|
||||
|
||||
'user': function() {
|
||||
return this._user;
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
'run': function(args) {
|
||||
//Clipperz.log("=== GridController.run");
|
||||
var deferredResult;
|
||||
|
||||
this.setUser(args.user);
|
||||
args.slot.setContent(this.grid());
|
||||
this.filterController().registerFilterElement(this.grid().filterElement());
|
||||
MochiKit.Signal.connect(this.filterController(), 'filterUpdated', this, 'handleFilterUpdated');
|
||||
|
||||
return this.displaySelectedRows();
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
'handleGenericError': function(anError) {
|
||||
var result;
|
||||
|
||||
if (anError instanceof MochiKit.Async.CancelledError) {
|
||||
result = anError;
|
||||
} else {
|
||||
Clipperz.log("## GridController - GENERIC ERROR" + "\n" + "==>> " + anError + " <<==\n" + anError.stack);
|
||||
result = new MochiKit.Async.CancelledError(anError);
|
||||
}
|
||||
|
||||
return result;
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
'getRows': function () {
|
||||
throw Clipperz.Base.AbstractMethod;
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
'setDeferredDisplaySelectedRowsInvocation': function (aDeferred) {
|
||||
if (this._deferredDisplaySelectedRowsInvocation != null) {
|
||||
this._deferredDisplaySelectedRowsInvocation.cancel();
|
||||
}
|
||||
|
||||
this._deferredDisplaySelectedRowsInvocation = aDeferred;
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
'resetDeferredDisplaySelectedRowsInvocation': function () {
|
||||
if (this._deferredDisplaySelectedRowsInvocation != null) {
|
||||
this._deferredDisplaySelectedRowsInvocation.cancel();
|
||||
}
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
'_displaySelectedRows': function (aFilter, someRows) {
|
||||
var result;
|
||||
var delay;
|
||||
|
||||
if ((aFilter != null) && (aFilter != '')) {
|
||||
var filter;
|
||||
var filterRegExp;
|
||||
|
||||
filter = aFilter.replace(/[^A-Za-z0-9]/g, "\\$&");
|
||||
filterRegExp = new RegExp(filter, "i");
|
||||
result = MochiKit.Base.filter(function (aCachedResult) { return filterRegExp.test(aCachedResult['_searchableContent'])}, someRows);
|
||||
delay = 0.002*result.length;
|
||||
|
||||
this.setDeferredDisplaySelectedRowsInvocation(MochiKit.Async.callLater(delay, MochiKit.Base.method(this, "deferredDisplaySelectedRows", result)));
|
||||
} else {
|
||||
result = someRows;
|
||||
|
||||
this.resetDeferredDisplaySelectedRowsInvocation();
|
||||
this.deferredDisplaySelectedRows(result);
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
'deferredDisplaySelectedRows': function (someRows) {
|
||||
if (this.sortedColumnManager() != null) {
|
||||
var comparator;
|
||||
var fieldName;
|
||||
|
||||
fieldName = this.sortedColumnManager().name();
|
||||
comparator = this.sortedColumnManager().comparator();
|
||||
if (this.sortedColumnManager().sorted() == 'DESCENDING') {
|
||||
comparator = Clipperz.Base.reverseComparator(comparator);
|
||||
}
|
||||
|
||||
someRows.sort(MochiKit.Base.partial(function(aKey, aComparator, aObject, bObject){
|
||||
return comparator(aObject[aKey], bObject[aKey]);
|
||||
}, this.sortedColumnManager().name(), comparator));
|
||||
}
|
||||
|
||||
this.grid().update(someRows);
|
||||
this.grid().endSearch();
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
'getCachedValues': function () {
|
||||
var deferredResult;
|
||||
|
||||
if (this._cachedObjects != null) {
|
||||
deferredResult = MochiKit.Async.succeed(this._cachedObjects);
|
||||
} else {
|
||||
var objectCollectResultsConfiguration;
|
||||
|
||||
objectCollectResultsConfiguration = {
|
||||
'_rowObject': MochiKit.Async.succeed,
|
||||
'_reference': MochiKit.Base.methodcaller('reference'),
|
||||
'_searchableContent': MochiKit.Base.methodcaller('searchableContent')
|
||||
};
|
||||
|
||||
MochiKit.Base.map(function (aColumnManager) {
|
||||
objectCollectResultsConfiguration[aColumnManager.name()] = aColumnManager.selector();
|
||||
}, this.columnsManagers());
|
||||
|
||||
deferredResult = new Clipperz.Async.Deferred("GridController.getCachedValues", {trace:false});
|
||||
deferredResult.addMethod(this, 'getRows');
|
||||
deferredResult.addCallback(MochiKit.Base.map, Clipperz.Async.collectResults("GridController.getCachedValues - collectResults", objectCollectResultsConfiguration, {trace:false}));
|
||||
deferredResult.addCallback(Clipperz.Async.collectAll);
|
||||
deferredResult.addCallback(MochiKit.Base.bind(function (someRows) {
|
||||
this._cachedObjects = someRows;
|
||||
return this._cachedObjects;
|
||||
}, this));
|
||||
deferredResult.callback();
|
||||
}
|
||||
|
||||
return deferredResult;
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
'hasPendingChanges': function () {
|
||||
return this.user().hasPendingChanges();
|
||||
},
|
||||
|
||||
'saveChanges': function () {
|
||||
this._cachedObjects = null;
|
||||
|
||||
return Clipperz.Async.callbacks("GridController.saveChanges", [
|
||||
MochiKit.Base.method(this.user(), 'saveChanges'),
|
||||
MochiKit.Base.method(this, 'focus')
|
||||
], {trace:false});
|
||||
},
|
||||
|
||||
'revertChanges': function () {
|
||||
return this.user().revertChanges();
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
'displayEmptyContent': function () {
|
||||
},
|
||||
|
||||
'hideEmptyContent': function () {
|
||||
this.grid().removeNoRowsGridComponent();
|
||||
},
|
||||
|
||||
'displaySelectedRows': function (aFilter) {
|
||||
if ((aFilter != null) && (aFilter != '')){
|
||||
this.grid().startSearch();
|
||||
}
|
||||
|
||||
return Clipperz.Async.callbacks("GridController.displaySelectedrows", [
|
||||
MochiKit.Base.method(this, 'getCachedValues'),
|
||||
MochiKit.Base.itemgetter('length'),
|
||||
Clipperz.Async.deferredIf("There are some items to show in the grid", [
|
||||
MochiKit.Base.method(this, 'hideEmptyContent'),
|
||||
MochiKit.Base.method(this, 'getCachedValues'),
|
||||
MochiKit.Base.method(this, '_displaySelectedRows', aFilter)
|
||||
], [
|
||||
MochiKit.Base.method(this, 'displayEmptyContent'),
|
||||
MochiKit.Base.method(this.grid(), 'endSearch')
|
||||
])
|
||||
], {trace:false});
|
||||
},
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
'focus': function () {
|
||||
return Clipperz.Async.callbacks("GridController.focus", [
|
||||
MochiKit.Base.method(this, 'displaySelectedRows', this.filterController().getFilter()),
|
||||
MochiKit.Base.method(this.grid(), 'focus')
|
||||
], {trace:false})
|
||||
//*##*/ this.displaySelectedRows(this.filterController().getFilter());
|
||||
// this.grid().focus();
|
||||
},
|
||||
|
||||
//=============================================================================
|
||||
|
||||
'deleteAllCleanTextData': function () {
|
||||
this._cachedObjects = null;
|
||||
this.grid().drawEmpty();
|
||||
},
|
||||
|
||||
//=============================================================================
|
||||
__syntaxFix__: "syntax fix"
|
||||
});
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user