Diffstat (limited to 'frontend/beta/js/Clipperz/PM/Components/RecordDetail/FieldValueComponent.js') (more/less context) (ignore whitespace changes)
-rw-r--r-- | frontend/beta/js/Clipperz/PM/Components/RecordDetail/FieldValueComponent.js | 22 |
1 files changed, 10 insertions, 12 deletions
diff --git a/frontend/beta/js/Clipperz/PM/Components/RecordDetail/FieldValueComponent.js b/frontend/beta/js/Clipperz/PM/Components/RecordDetail/FieldValueComponent.js index 8621397..f2c70aa 100644 --- a/frontend/beta/js/Clipperz/PM/Components/RecordDetail/FieldValueComponent.js +++ b/frontend/beta/js/Clipperz/PM/Components/RecordDetail/FieldValueComponent.js | |||
@@ -1,214 +1,212 @@ | |||
1 | /* | 1 | /* |
2 | 2 | ||
3 | Copyright 2008-2011 Clipperz Srl | 3 | Copyright 2008-2013 Clipperz Srl |
4 | 4 | ||
5 | This file is part of Clipperz Community Edition. | 5 | This file is part of Clipperz, the online password manager. |
6 | Clipperz Community Edition is an online password manager. | ||
7 | For further information about its features and functionalities please | 6 | For further information about its features and functionalities please |
8 | refer to http://www.clipperz.com. | 7 | refer to http://www.clipperz.com. |
9 | 8 | ||
10 | * Clipperz Community Edition is free software: you can redistribute | 9 | * Clipperz is free software: you can redistribute it and/or modify it |
11 | it and/or modify it under the terms of the GNU Affero General Public | 10 | under the terms of the GNU Affero General Public License as published |
12 | License as published by the Free Software Foundation, either version | 11 | by the Free Software Foundation, either version 3 of the License, or |
13 | 3 of the License, or (at your option) any later version. | 12 | (at your option) any later version. |
14 | 13 | ||
15 | * Clipperz Community Edition is distributed in the hope that it will | 14 | * Clipperz is distributed in the hope that it will be useful, but |
16 | be useful, but WITHOUT ANY WARRANTY; without even the implied | 15 | WITHOUT ANY WARRANTY; without even the implied warranty of |
17 | warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | 16 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
18 | See the GNU Affero General Public License for more details. | 17 | See the GNU Affero General Public License for more details. |
19 | 18 | ||
20 | * You should have received a copy of the GNU Affero General Public | 19 | * You should have received a copy of the GNU Affero General Public |
21 | License along with Clipperz Community Edition. If not, see | 20 | License along with Clipperz. If not, see http://www.gnu.org/licenses/. |
22 | <http://www.gnu.org/licenses/>. | ||
23 | 21 | ||
24 | */ | 22 | */ |
25 | 23 | ||
26 | if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } | 24 | if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } |
27 | if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } | 25 | if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } |
28 | if (typeof(Clipperz.PM.Components) == 'undefined') { Clipperz.PM.Components = {}; } | 26 | if (typeof(Clipperz.PM.Components) == 'undefined') { Clipperz.PM.Components = {}; } |
29 | if (typeof(Clipperz.PM.Components.RecordDetail) == 'undefined') { Clipperz.PM.Components.RecordDetail = {}; } | 27 | if (typeof(Clipperz.PM.Components.RecordDetail) == 'undefined') { Clipperz.PM.Components.RecordDetail = {}; } |
30 | 28 | ||
31 | //############################################################################# | 29 | //############################################################################# |
32 | 30 | ||
33 | Clipperz.PM.Components.RecordDetail.FieldValueComponent = function(anElement, args) { | 31 | Clipperz.PM.Components.RecordDetail.FieldValueComponent = function(anElement, args) { |
34 | args = args || {}; | 32 | args = args || {}; |
35 | 33 | ||
36 | Clipperz.PM.Components.RecordDetail.FieldValueComponent.superclass.constructor.call(this, anElement, args); | 34 | Clipperz.PM.Components.RecordDetail.FieldValueComponent.superclass.constructor.call(this, anElement, args); |
37 | 35 | ||
38 | this._inputElement = null; | 36 | this._inputElement = null; |
39 | this._scrambledStatus = 'SCRAMBLED'; //'UNSCRAMBLED' | 37 | this._scrambledStatus = 'SCRAMBLED'; //'UNSCRAMBLED' |
40 | 38 | ||
41 | this.render(); | 39 | this.render(); |
42 | 40 | ||
43 | return this; | 41 | return this; |
44 | } | 42 | } |
45 | 43 | ||
46 | //============================================================================= | 44 | //============================================================================= |
47 | 45 | ||
48 | YAHOO.extendX(Clipperz.PM.Components.RecordDetail.FieldValueComponent, Clipperz.PM.Components.RecordDetail.AbstractFieldSubComponent, { | 46 | YAHOO.extendX(Clipperz.PM.Components.RecordDetail.FieldValueComponent, Clipperz.PM.Components.RecordDetail.AbstractFieldSubComponent, { |
49 | 47 | ||
50 | 'toString': function() { | 48 | 'toString': function() { |
51 | return "Clipperz.PM.Components.RecordDetail.FieldValueComponent component"; | 49 | return "Clipperz.PM.Components.RecordDetail.FieldValueComponent component"; |
52 | }, | 50 | }, |
53 | 51 | ||
54 | //------------------------------------------------------------------------- | 52 | //------------------------------------------------------------------------- |
55 | 53 | ||
56 | 'value': function() { | 54 | 'value': function() { |
57 | return this.recordField().value(); | 55 | return this.recordField().value(); |
58 | }, | 56 | }, |
59 | 57 | ||
60 | 'setValue': function(aValue) { | 58 | 'setValue': function(aValue) { |
61 | this.recordField().setValue(aValue); | 59 | this.recordField().setValue(aValue); |
62 | }, | 60 | }, |
63 | 61 | ||
64 | //------------------------------------------------------------------------- | 62 | //------------------------------------------------------------------------- |
65 | 63 | ||
66 | 'inputElement': function() { | 64 | 'inputElement': function() { |
67 | return this._inputElement; | 65 | return this._inputElement; |
68 | }, | 66 | }, |
69 | 67 | ||
70 | 'setInputElement': function(aValue) { | 68 | 'setInputElement': function(aValue) { |
71 | this._inputElement = aValue; | 69 | this._inputElement = aValue; |
72 | }, | 70 | }, |
73 | 71 | ||
74 | //------------------------------------------------------------------------- | 72 | //------------------------------------------------------------------------- |
75 | 73 | ||
76 | 'scrambledStatus': function() { | 74 | 'scrambledStatus': function() { |
77 | return this._scrambledStatus; | 75 | return this._scrambledStatus; |
78 | }, | 76 | }, |
79 | 77 | ||
80 | 'setScrambledStatus': function(aValue) { | 78 | 'setScrambledStatus': function(aValue) { |
81 | this._scrambledStatus = aValue; | 79 | this._scrambledStatus = aValue; |
82 | }, | 80 | }, |
83 | 81 | ||
84 | //------------------------------------------------------------------------- | 82 | //------------------------------------------------------------------------- |
85 | 83 | ||
86 | 'handleTypeChange': function() { | 84 | 'handleTypeChange': function() { |
87 | //MochiKit.Logging.logDebug(">>> handling type change - " + this.recordField().type()); | 85 | //MochiKit.Logging.logDebug(">>> handling type change - " + this.recordField().type()); |
88 | this.synchronizeComponentValues(); | 86 | this.synchronizeComponentValues(); |
89 | this.update(); | 87 | this.update(); |
90 | }, | 88 | }, |
91 | 89 | ||
92 | //------------------------------------------------------------------------- | 90 | //------------------------------------------------------------------------- |
93 | 91 | ||
94 | 'addrUrl': function() { | 92 | 'addrUrl': function() { |
95 | var result; | 93 | var result; |
96 | 94 | ||
97 | result = "http://maps.google.com/maps?q=" + this.value().split(' ').join('+'); | 95 | result = "http://maps.google.com/maps?q=" + this.value().split(' ').join('+'); |
98 | 96 | ||
99 | return result; | 97 | return result; |
100 | }, | 98 | }, |
101 | 99 | ||
102 | //------------------------------------------------------------------------- | 100 | //------------------------------------------------------------------------- |
103 | 101 | ||
104 | 'updateViewMode': function() { | 102 | 'updateViewMode': function() { |
105 | var scarmbledStatus; | 103 | var scarmbledStatus; |
106 | 104 | ||
107 | scrambledStatus = this.scrambledStatus() || 'SCRAMBLED'; | 105 | scrambledStatus = this.scrambledStatus() || 'SCRAMBLED'; |
108 | 106 | ||
109 | this.element().update(""); | 107 | this.element().update(""); |
110 | if (this.recordField().hidden() == false) { | 108 | if (this.recordField().hidden() == false) { |
111 | switch(this.recordField().type()) { | 109 | switch(this.recordField().type()) { |
112 | case 'TXT': | 110 | case 'TXT': |
113 | case 'PWD': | 111 | case 'PWD': |
114 | Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'span', html:this.value()}); | 112 | Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'span', html:this.value()}); |
115 | break; | 113 | break; |
116 | case 'URL': | 114 | case 'URL': |
117 | varurlLocation; | 115 | varurlLocation; |
118 | 116 | ||
119 | urlLocation = Clipperz.Base.sanitizeString(this.value()); | 117 | urlLocation = Clipperz.Base.sanitizeString(this.value()); |
120 | if (! (/^(https?|ftp|svn):\/\//.test(urlLocation))) { | 118 | if (! (/^(https?|ftp|svn):\/\//.test(urlLocation))) { |
121 | urlLocation = 'http://' + urlLocation; | 119 | urlLocation = 'http://' + urlLocation; |
122 | } | 120 | } |
123 | Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'a', href:urlLocation, html:this.value(), target:'_blank'}); | 121 | Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'a', href:urlLocation, html:this.value(), target:'_blank'}); |
124 | break; | 122 | break; |
125 | case 'DATE': | 123 | case 'DATE': |
126 | Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'span', html:this.value()}); | 124 | Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'span', html:this.value()}); |
127 | break; | 125 | break; |
128 | case 'ADDR': | 126 | case 'ADDR': |
129 | Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'a', href:this.addrUrl(), html:this.value(), target:'_blank'}); | 127 | Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'a', href:this.addrUrl(), html:this.value(), target:'_blank'}); |
130 | break; | 128 | break; |
131 | } | 129 | } |
132 | } else { | 130 | } else { |
133 | var tableElement; | 131 | var tableElement; |
134 | var tdElement; | 132 | var tdElement; |
135 | var inputElement; | 133 | var inputElement; |
136 | var passwordElementConfiguration; | 134 | var passwordElementConfiguration; |
137 | 135 | ||
138 | if (scrambledStatus == 'SCRAMBLED') { | 136 | if (scrambledStatus == 'SCRAMBLED') { |
139 | varscrambledInputElement; | 137 | varscrambledInputElement; |
140 | 138 | ||
141 | if ((Clipperz_IEisBroken === true) && (Clipperz.PM.Proxy.defaultProxy.isReadOnly())) { | 139 | if ((Clipperz_IEisBroken === true) && (Clipperz.PM.Proxy.defaultProxy.isReadOnly())) { |
142 | scrambledInputElement = {tag:'input', type:'password', value:"this.value()"}; | 140 | scrambledInputElement = {tag:'input', type:'password', value:"this.value()"}; |
143 | } else { | 141 | } else { |
144 | scrambledInputElement = {tag:'input', type:'text', cls:'scrambledField', title:Clipperz.PM.Strings['recordDetailPasswordFieldTooltipLabel'], value:"this.value()"}; | 142 | scrambledInputElement = {tag:'input', type:'text', cls:'scrambledField', title:Clipperz.PM.Strings['recordDetailPasswordFieldTooltipLabel'], value:"this.value()"}; |
145 | } | 143 | } |
146 | 144 | ||
147 | passwordElementConfiguration = | 145 | passwordElementConfiguration = |
148 | {tag:'table', border:'0', cellspacing:'2', cellpadding:'0', children:[ | 146 | {tag:'table', border:'0', cellspacing:'2', cellpadding:'0', children:[ |
149 | {tag:'tbody', children:[ | 147 | {tag:'tbody', children:[ |
150 | {tag:'tr', children:[ | 148 | {tag:'tr', children:[ |
151 | {tag:'td', valign:'top', children:[ | 149 | {tag:'td', valign:'top', children:[ |
152 | scrambledInputElement, | 150 | scrambledInputElement, |
153 | {tag:'a', cls:'scrambleLink', id:this.getId('scrambleLink'), href:'#', htmlString:Clipperz.PM.Strings['recordDetailPasswordFieldUnscrambleLabel']} | 151 | {tag:'a', cls:'scrambleLink', id:this.getId('scrambleLink'), href:'#', htmlString:Clipperz.PM.Strings['recordDetailPasswordFieldUnscrambleLabel']} |
154 | ]}, | 152 | ]}, |
155 | {tag:'td', valign:'top', children:[ | 153 | {tag:'td', valign:'top', children:[ |
156 | {tag:'span', cls:'scrambledFieldLabel', htmlString:Clipperz.PM.Strings['recordDetailPasswordFieldHelpLabel']} | 154 | {tag:'span', cls:'scrambledFieldLabel', htmlString:Clipperz.PM.Strings['recordDetailPasswordFieldHelpLabel']} |
157 | ]} | 155 | ]} |
158 | ]} | 156 | ]} |
159 | ]} | 157 | ]} |
160 | ]}; | 158 | ]}; |
161 | } else { | 159 | } else { |
162 | passwordElementConfiguration = | 160 | passwordElementConfiguration = |
163 | {tag:'div', children:[ | 161 | {tag:'div', children:[ |
164 | {tag:'input', type:'text', cls:'unscrambledField', value:"this.value()"}, | 162 | {tag:'input', type:'text', cls:'unscrambledField', value:"this.value()"}, |
165 | {tag:'a', cls:'scrambleLink', id:this.getId('scrambleLink'), href:'#', htmlString:Clipperz.PM.Strings['recordDetailPasswordFieldScrambleLabel']} | 163 | {tag:'a', cls:'scrambleLink', id:this.getId('scrambleLink'), href:'#', htmlString:Clipperz.PM.Strings['recordDetailPasswordFieldScrambleLabel']} |
166 | ]}; | 164 | ]}; |
167 | } | 165 | } |
168 | 166 | ||
169 | tableElement = Clipperz.YUI.DomHelper.append(this.element().dom, passwordElementConfiguration, true); | 167 | tableElement = Clipperz.YUI.DomHelper.append(this.element().dom, passwordElementConfiguration, true); |
170 | 168 | ||
171 | inputElement = tableElement.getChildrenByTagName('input')[0]; | 169 | inputElement = tableElement.getChildrenByTagName('input')[0]; |
172 | inputElement.dom.value = this.value(); | 170 | inputElement.dom.value = this.value(); |
173 | inputElement.wrap({tag:'div', cls:'passwordBackground'}).setStyle('background-position', "0px -" + Math.min(128, Clipperz.PM.Crypto.passwordEntropy(this.value())) + "px"); | 171 | inputElement.wrap({tag:'div', cls:'passwordBackground'}).setStyle('background-position', "0px -" + Math.min(128, Clipperz.PM.Crypto.passwordEntropy(this.value())) + "px"); |
174 | 172 | ||
175 | MochiKit.Signal.connect(inputElement.dom, 'onfocus', this, 'selectHiddenFieldOnFocus'); | 173 | MochiKit.Signal.connect(inputElement.dom, 'onfocus', this, 'selectHiddenFieldOnFocus'); |
176 | MochiKit.Signal.connect(this.getDom('scrambleLink'), 'onclick', this, 'toggleScramble'); | 174 | MochiKit.Signal.connect(this.getDom('scrambleLink'), 'onclick', this, 'toggleScramble'); |
177 | } | 175 | } |
178 | }, | 176 | }, |
179 | 177 | ||
180 | //------------------------------------------------------------------------- | 178 | //------------------------------------------------------------------------- |
181 | 179 | ||
182 | 'updateEditMode': function() { | 180 | 'updateEditMode': function() { |
183 | var inputElement; | 181 | var inputElement; |
184 | var scarmbledStatus; | 182 | var scarmbledStatus; |
185 | 183 | ||
186 | scrambledStatus = this.scrambledStatus() || 'SCRAMBLED'; | 184 | scrambledStatus = this.scrambledStatus() || 'SCRAMBLED'; |
187 | 185 | ||
188 | this.element().update(""); | 186 | this.element().update(""); |
189 | switch(this.recordField().type()) { | 187 | switch(this.recordField().type()) { |
190 | case 'TXT': | 188 | case 'TXT': |
191 | case 'URL': | 189 | case 'URL': |
192 | case 'ADDR': | 190 | case 'ADDR': |
193 | inputElement = Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'input', type:'text', value:"this.value()"}, true); | 191 | inputElement = Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'input', type:'text', value:"this.value()"}, true); |
194 | inputElement.dom.value = this.value(); | 192 | inputElement.dom.value = this.value(); |
195 | break; | 193 | break; |
196 | case 'PWD': | 194 | case 'PWD': |
197 | Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'table', width:'100%', cellpadding:'0', cellspacing:'0', children:[ | 195 | Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'table', width:'100%', cellpadding:'0', cellspacing:'0', children:[ |
198 | {tag:'tbody', children:[ | 196 | {tag:'tbody', children:[ |
199 | {tag:'tr', children:[ | 197 | {tag:'tr', children:[ |
200 | {tag:'td', valign:'top', children:[ | 198 | {tag:'td', valign:'top', children:[ |
201 | {tag:'input', type:((scrambledStatus == 'SCRAMBLED') ? 'password' : 'text'), id:this.getId('passwordInputElement'), value:"this.value()"}, | 199 | {tag:'input', type:((scrambledStatus == 'SCRAMBLED') ? 'password' : 'text'), id:this.getId('passwordInputElement'), value:"this.value()"}, |
202 | {tag:'a', cls:'scrambleLink', id:this.getId('scrambleLink'), href:'#', html:(scrambledStatus == 'SCRAMBLED' ? Clipperz.PM.Strings['recordDetailPasswordFieldUnscrambleLabel'] : Clipperz.PM.Strings['recordDetailPasswordFieldScrambleLabel'])} | 200 | {tag:'a', cls:'scrambleLink', id:this.getId('scrambleLink'), href:'#', html:(scrambledStatus == 'SCRAMBLED' ? Clipperz.PM.Strings['recordDetailPasswordFieldUnscrambleLabel'] : Clipperz.PM.Strings['recordDetailPasswordFieldScrambleLabel'])} |
203 | ]}, | 201 | ]}, |
204 | {tag:'td', valign:'top', children:[ | 202 | {tag:'td', valign:'top', children:[ |
205 | {tag:'div', id:this.getId('passwordGenerator'), cls:'Clipperz_PasswordGenerator_button', html:' '} | 203 | {tag:'div', id:this.getId('passwordGenerator'), cls:'Clipperz_PasswordGenerator_button', html:' '} |
206 | ]} | 204 | ]} |
207 | ]} | 205 | ]} |
208 | ]} | 206 | ]} |
209 | ]}) | 207 | ]}) |
210 | inputElement = this.getElement('passwordInputElement'); | 208 | inputElement = this.getElement('passwordInputElement'); |
211 | inputElement.dom.value = this.value(); | 209 | inputElement.dom.value = this.value(); |
212 | new Clipperz.PM.Components.PasswordEntropyDisplay(this.getElement('passwordInputElement')); | 210 | new Clipperz.PM.Components.PasswordEntropyDisplay(this.getElement('passwordInputElement')); |
213 | new Clipperz.PM.Components.PasswordGenerator(this.getElement('passwordGenerator'), this); | 211 | new Clipperz.PM.Components.PasswordGenerator(this.getElement('passwordGenerator'), this); |
214 | MochiKit.Signal.connect(this.getDom('scrambleLink'), 'onclick', this, 'toggleScramble'); | 212 | MochiKit.Signal.connect(this.getDom('scrambleLink'), 'onclick', this, 'toggleScramble'); |