Total Complexity | 54 |
Complexity/F | 2.57 |
Lines of Code | 287 |
Function Count | 21 |
Duplicated Lines | 287 |
Ratio | 100 % |
Changes | 0 |
Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.
Common duplication problems, and corresponding solutions are:
Complex classes like external-content/javascript/ExternalContent.js often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.
Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.
1 | /** |
||
4 | if(typeof SiteTreeHandlers == 'undefined') SiteTreeHandlers = {}; |
||
5 | |||
6 | SiteTreeHandlers.controller_url = 'admin/external-content'; |
||
7 | SiteTreeHandlers.loadPage_url = SiteTreeHandlers.controller_url + '/getitem'; |
||
8 | SiteTreeHandlers.loadTree_url = SiteTreeHandlers.controller_url + '/getsubtree'; |
||
9 | SiteTreeHandlers.showRecord_url = SiteTreeHandlers.controller_url + '/show/'; |
||
10 | |||
11 | |||
12 | var _HANDLER_FORMS = { |
||
13 | addpage : 'Form_CreateProviderForm', |
||
14 | deletepage : 'Form_DeleteItemsForm', |
||
15 | sortitems : 'sortitems_options' |
||
16 | }; |
||
17 | |||
18 | /** |
||
19 | * Set up save folder name action |
||
20 | */ |
||
21 | if (CMSRightForm) { |
||
22 | CMSRightForm.prototype.loadURLFromServer = function(url) { |
||
23 | var urlParts = url.match( /ID=(\d+)(|.*)?/ ); |
||
24 | var id = urlParts ? urlParts[1] : null; |
||
25 | |||
26 | if( !url.match( /^https?:\/\/.*/ ) ) |
||
27 | url = document.getElementsByTagName('base')[0].href + url; |
||
28 | |||
29 | new Ajax.Request( url + '&ajax=1', { |
||
30 | asynchronous : true, |
||
31 | onSuccess : function( response ) { |
||
32 | $('Form_EditForm').successfullyReceivedPage(response,id); |
||
33 | return true; |
||
34 | }, |
||
35 | onFailure : function(response) { |
||
36 | alert(response.responseText); |
||
37 | errorMessage('error loading page',response); |
||
38 | } |
||
39 | }); |
||
40 | }; |
||
41 | |||
42 | CMSRightForm.prototype.successfullyReceivedPage = function(response,pageID) { |
||
43 | var loadingNode = $('sitetree').loadingNode; |
||
44 | |||
45 | // must wait until the javascript has finished |
||
46 | document.body.style.cursor = 'wait'; |
||
47 | |||
48 | this.loadNewPage(response.responseText); |
||
49 | |||
50 | var subform; |
||
51 | if(subform = $('Form_MemberForm')) subform.close(); |
||
52 | if(subform = $('Form_SubForm')) subform.close(); |
||
53 | |||
54 | if(this.elements.ID) { |
||
55 | this.notify('PageLoaded', this.elements.ID.value); |
||
56 | } |
||
57 | |||
58 | if(this.receivingID) { |
||
59 | // Treenode might not exist if that part of the tree is closed |
||
60 | var treeNode = loadingNode ? loadingNode : $('sitetree').getTreeNodeByIdx(this.receivingID); |
||
61 | if(treeNode) { |
||
62 | $('sitetree').setCurrentByIdx(treeNode.getIdx()); |
||
63 | treeNode.removeNodeClass('loading'); |
||
64 | } |
||
65 | statusMessage(''); |
||
66 | } |
||
67 | |||
68 | // must wait until the javascript has finished |
||
69 | document.body.style.cursor = 'default'; |
||
70 | |||
71 | }; |
||
72 | |||
73 | CMSRightForm.prototype.getPageFromServer = function(id, treeNode) { |
||
74 | if(id) { |
||
75 | this.receivingID = id; |
||
76 | |||
77 | // Treenode might not exist if that part of the tree is closed |
||
78 | if(!treeNode) treeNode = $('sitetree').getTreeNodeByIdx(id); |
||
79 | |||
80 | if(treeNode) { |
||
81 | $('sitetree').loadingNode = treeNode; |
||
82 | treeNode.addNodeClass('loading'); |
||
83 | url = treeNode.aTag.href + (treeNode.aTag.href.indexOf('?')==-1?'?':'&') + 'ajax=1'; |
||
84 | } |
||
85 | if(SiteTreeHandlers.loadPage_url) { |
||
86 | var sep = (SiteTreeHandlers.loadPage_url.indexOf('?') == -1) ? '?' : '&'; |
||
87 | url = SiteTreeHandlers.loadPage_url + sep + 'ID=' + id; |
||
88 | } |
||
89 | |||
90 | // used to set language in CMSMain->init() |
||
91 | var lang = $('LangSelector') ? $F('LangSelector') : null; |
||
92 | if(lang) { |
||
93 | url += '&locale='+lang; |
||
94 | } |
||
95 | |||
96 | statusMessage("loading..."); |
||
97 | this.loadURLFromServer(url); |
||
98 | } else { |
||
99 | throw("getPageFromServer: Bad page ID: " + id); |
||
100 | } |
||
101 | }; |
||
102 | } |
||
103 | |||
104 | /** |
||
105 | * Add File Action |
||
106 | */ |
||
107 | addfolder = Class.create(); |
||
108 | addfolder.applyTo('#addpage'); |
||
109 | addfolder.prototype = { |
||
110 | initialize: function () { |
||
111 | Observable.applyTo($('Form_CreateProviderForm')); |
||
112 | $('Form_CreateProviderForm').onsubmit = this.form_submit; |
||
113 | }, |
||
114 | |||
115 | onclick : function() { |
||
116 | statusMessage('Creating new connector...'); |
||
117 | this.form_submit(); |
||
118 | return false; |
||
119 | }, |
||
120 | |||
121 | form_submit : function() { |
||
122 | var st = $('sitetree'); |
||
123 | |||
124 | $('Form_CreateProviderForm').elements.ParentID.value = st.getIdxOf(st.firstSelected()); |
||
125 | Ajax.SubmitForm('Form_CreateProviderForm', null, { |
||
126 | onSuccess : this.onSuccess, |
||
127 | onFailure : this.showAddPageError |
||
128 | }); |
||
129 | return false; |
||
130 | }, |
||
131 | onSuccess: function(response) { |
||
132 | Ajax.Evaluator(response); |
||
133 | // Make it possible to drop files into the new folder |
||
134 | if (typeof(DropFileItem) !== "undefined") { |
||
135 | DropFileItem.applyTo('#sitetree li'); |
||
136 | } |
||
137 | }, |
||
138 | |||
139 | showAddPageError: function(response) { |
||
140 | errorMessage('Error adding connector', response); |
||
141 | } |
||
142 | } |
||
143 | |||
144 | |||
145 | /** |
||
146 | * Delete folder action |
||
147 | */ |
||
148 | deletefolder = { |
||
149 | button_onclick : function() { |
||
150 | if(treeactions.toggleSelection(this)) { |
||
151 | deletefolder.o1 = $('sitetree').observeMethod('SelectionChanged', deletefolder.treeSelectionChanged); |
||
152 | deletefolder.o2 = $('Form_DeleteItemsForm').observeMethod('Close', deletefolder.popupClosed); |
||
153 | |||
154 | addClass($('sitetree'),'multiselect'); |
||
155 | |||
156 | deletefolder.selectedNodes = { }; |
||
157 | |||
158 | var sel = $('sitetree').firstSelected() |
||
159 | if(sel) { |
||
160 | var selIdx = $('sitetree').getIdxOf(sel); |
||
161 | deletefolder.selectedNodes[selIdx] = true; |
||
162 | sel.removeNodeClass('current'); |
||
163 | sel.addNodeClass('selected'); |
||
164 | } |
||
165 | } |
||
166 | return false; |
||
167 | }, |
||
168 | |||
169 | treeSelectionChanged : function(selectedNode) { |
||
170 | var idx = $('sitetree').getIdxOf(selectedNode); |
||
171 | |||
172 | if(selectedNode.selected) { |
||
173 | selectedNode.removeNodeClass('selected'); |
||
174 | selectedNode.selected = false; |
||
175 | deletefolder.selectedNodes[idx] = false; |
||
176 | |||
177 | } else { |
||
178 | selectedNode.addNodeClass('selected'); |
||
179 | selectedNode.selected = true; |
||
180 | deletefolder.selectedNodes[idx] = true; |
||
181 | } |
||
182 | |||
183 | return false; |
||
184 | }, |
||
185 | |||
186 | popupClosed : function() { |
||
187 | removeClass($('sitetree'),'multiselect'); |
||
188 | $('sitetree').stopObserving(deletefolder.o1); |
||
189 | $('Form_DeleteItemsForm').stopObserving(deletefolder.o2); |
||
190 | |||
191 | for(var idx in deletefolder.selectedNodes) { |
||
192 | if(deletefolder.selectedNodes[idx]) { |
||
193 | node = $('sitetree').getTreeNodeByIdx(idx); |
||
194 | if(node) { |
||
195 | node.removeNodeClass('selected'); |
||
196 | node.selected = false; |
||
197 | } |
||
198 | } |
||
199 | } |
||
200 | }, |
||
201 | |||
202 | form_submit : function() { |
||
203 | var csvIDs = ""; |
||
204 | for(var idx in deletefolder.selectedNodes) { |
||
205 | var selectedNode = $('sitetree').getTreeNodeByIdx(idx); |
||
206 | var link = selectedNode.getElementsByTagName('a')[0]; |
||
207 | |||
208 | if(deletefolder.selectedNodes[idx] && ( !Element.hasClassName( link, 'contents' ) || confirm( "Are you sure you want to remove '" + link.firstChild.nodeValue + "'" ) ) ) |
||
209 | csvIDs += (csvIDs ? "," : "") + idx; |
||
210 | } |
||
211 | |||
212 | if(csvIDs) { |
||
213 | $('Form_DeleteItemsForm').elements.csvIDs.value = csvIDs; |
||
214 | |||
215 | statusMessage('deleting connectors'); |
||
216 | |||
217 | Ajax.SubmitForm('Form_DeleteItemsForm', null, { |
||
218 | onSuccess : deletefolder.submit_success, |
||
219 | onFailure : function(response) { |
||
220 | errorMessage('Error deleting pages', response); |
||
221 | } |
||
222 | }); |
||
223 | |||
224 | } else { |
||
225 | alert("Please select at least 1 page."); |
||
226 | } |
||
227 | |||
228 | return false; |
||
229 | }, |
||
230 | |||
231 | submit_success: function(response) { |
||
232 | Ajax.Evaluator(response); |
||
233 | treeactions.closeSelection($('deletepage')); |
||
234 | } |
||
235 | } |
||
236 | |||
237 | Behaviour.register({ |
||
238 | '#Form_EditForm' : { |
||
239 | changeDetection_fieldsToIgnore : { |
||
240 | 'MigrationTarget' : true, |
||
241 | 'IncludeSelected' : true, |
||
242 | 'IncludeChildren' : true, |
||
243 | 'DuplicateMethod' : true |
||
244 | } |
||
245 | }, |
||
246 | '#Form_EditForm_Migrate' : { |
||
247 | onclick: function (e) { |
||
248 | Event.stop(e); |
||
249 | return false; |
||
250 | } |
||
251 | } |
||
252 | }); |
||
253 | |||
254 | /** |
||
255 | * We don't want hitting the enter key in the name field |
||
256 | * to submit the form. |
||
257 | */ |
||
258 | Behaviour.register({ |
||
259 | '#Form_EditForm_Name' : { |
||
260 | onkeypress : function(event) { |
||
261 | event = (event) ? event : window.event; |
||
262 | var kc = event.keyCode ? event.keyCode : event.charCode; |
||
263 | if(kc == 13) { |
||
264 | return false; |
||
265 | } |
||
266 | } |
||
267 | } |
||
268 | }); |
||
269 | |||
270 | /** |
||
271 | * Initialisation function to set everything up |
||
272 | */ |
||
273 | appendLoader(function () { |
||
274 | Observable.applyTo($('Form_DeleteItemsForm')); |
||
275 | if($('deletepage')) { |
||
276 | $('deletepage').onclick = deletefolder.button_onclick; |
||
277 | $('deletepage').getElementsByTagName('button')[0].onclick = function() { return false; }; |
||
278 | // Prevent bug #4740, particularly with IE |
||
279 | Behaviour.register({ |
||
280 | '#Form_DeleteItemsForm' : { |
||
281 | onsubmit: function(event) { |
||
282 | deletefolder.form_submit(); |
||
283 | Event.stop(event); |
||
284 | return false; |
||
285 | } |
||
286 | } |
||
287 | }); |
||
288 | Element.hide('Form_DeleteItemsForm'); |
||
289 | } |
||
290 | }); |
||
291 |