Total Complexity | 54 |
Complexity/F | 2.57 |
Lines of Code | 297 |
Function Count | 21 |
Duplicated Lines | 297 |
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/ExternalContentUpdate.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 | // SiteTreeHandlers.parentChanged_url = 'admin/assets/ajaxupdateparent'; |
||
6 | // SiteTreeHandlers.orderChanged_url = 'admin/assets/ajaxupdatesort'; |
||
7 | SiteTreeHandlers.controller_url = 'admin/external-content'; |
||
8 | SiteTreeHandlers.loadPage_url = SiteTreeHandlers.controller_url + '/getitem'; |
||
9 | SiteTreeHandlers.loadTree_url = SiteTreeHandlers.controller_url + '/getsubtree'; |
||
10 | SiteTreeHandlers.showRecord_url = SiteTreeHandlers.controller_url + '/show/'; |
||
11 | |||
12 | |||
13 | var _HANDLER_FORMS = { |
||
14 | addpage : 'addpage_options', |
||
15 | deletepage : 'Form_DeleteItemsForm', |
||
16 | sortitems : 'sortitems_options' |
||
17 | }; |
||
18 | |||
19 | /** |
||
20 | * Set up save folder name action |
||
21 | */ |
||
22 | if (CMSRightForm) { |
||
23 | CMSRightForm.prototype.loadURLFromServer = function(url) { |
||
24 | var urlParts = url.match( /ID=(\d+)(|.*)?/ ); |
||
25 | var id = urlParts ? urlParts[1] : null; |
||
26 | |||
27 | if( !url.match( /^https?:\/\/.*/ ) ) |
||
28 | url = document.getElementsByTagName('base')[0].href + url; |
||
29 | |||
30 | new Ajax.Request( url + '&ajax=1', { |
||
31 | asynchronous : true, |
||
32 | onSuccess : function( response ) { |
||
33 | $('Form_EditForm').successfullyReceivedPage(response,id); |
||
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 | // not needed with compound IDs |
||
46 | //if( loadingNode && pageID && parseInt( $('sitetree').getIdxOf( loadingNode ) ) != pageID ) { |
||
47 | // return; |
||
48 | // } |
||
49 | |||
50 | // must wait until the javascript has finished |
||
51 | document.body.style.cursor = 'wait'; |
||
52 | |||
53 | this.loadNewPage(response.responseText); |
||
54 | |||
55 | var subform; |
||
56 | if(subform = $('Form_MemberForm')) subform.close(); |
||
57 | if(subform = $('Form_SubForm')) subform.close(); |
||
58 | |||
59 | if(this.elements.ID) { |
||
60 | this.notify('PageLoaded', this.elements.ID.value); |
||
61 | } |
||
62 | |||
63 | if(this.receivingID) { |
||
64 | // Treenode might not exist if that part of the tree is closed |
||
65 | var treeNode = loadingNode ? loadingNode : $('sitetree').getTreeNodeByIdx(this.receivingID); |
||
66 | if(treeNode) { |
||
67 | $('sitetree').setCurrentByIdx(treeNode.getIdx()); |
||
68 | treeNode.removeNodeClass('loading'); |
||
69 | } |
||
70 | statusMessage(''); |
||
71 | } |
||
72 | |||
73 | // must wait until the javascript has finished |
||
74 | document.body.style.cursor = 'default'; |
||
75 | |||
76 | }; |
||
77 | |||
78 | CMSRightForm.prototype.getPageFromServer = function(id, treeNode) { |
||
79 | if(id) { |
||
80 | this.receivingID = id; |
||
81 | |||
82 | // Treenode might not exist if that part of the tree is closed |
||
83 | if(!treeNode) treeNode = $('sitetree').getTreeNodeByIdx(id); |
||
84 | |||
85 | if(treeNode) { |
||
86 | $('sitetree').loadingNode = treeNode; |
||
87 | treeNode.addNodeClass('loading'); |
||
88 | url = treeNode.aTag.href + (treeNode.aTag.href.indexOf('?')==-1?'?':'&') + 'ajax=1'; |
||
89 | } |
||
90 | if(SiteTreeHandlers.loadPage_url) { |
||
91 | var sep = (SiteTreeHandlers.loadPage_url.indexOf('?') == -1) ? '?' : '&'; |
||
92 | url = SiteTreeHandlers.loadPage_url + sep + 'ID=' + id; |
||
93 | } |
||
94 | |||
95 | // used to set language in CMSMain->init() |
||
96 | var lang = $('LangSelector') ? $F('LangSelector') : null; |
||
97 | if(lang) { |
||
98 | url += '&locale='+lang; |
||
99 | } |
||
100 | |||
101 | statusMessage("loading..."); |
||
102 | this.loadURLFromServer(url); |
||
103 | } else { |
||
104 | throw("getPageFromServer: Bad page ID: " + id); |
||
105 | } |
||
106 | }; |
||
107 | } |
||
108 | |||
109 | // CMSRightForm.applyTo('#Form_EditForm', 'right'); |
||
110 | |||
111 | /** |
||
112 | * Add File Action |
||
113 | */ |
||
114 | addfolder = Class.create(); |
||
115 | addfolder.applyTo('#addpage'); |
||
116 | addfolder.prototype = { |
||
117 | initialize: function () { |
||
118 | Observable.applyTo($('Form_CreateProviderForm')); |
||
119 | $('Form_CreateProviderForm').onsubmit = this.form_submit; |
||
120 | }, |
||
121 | |||
122 | onclick : function() { |
||
123 | statusMessage('Creating new provider...'); |
||
124 | this.form_submit(); |
||
125 | return false; |
||
126 | }, |
||
127 | |||
128 | form_submit : function() { |
||
129 | var st = $('sitetree'); |
||
130 | |||
131 | $('Form_CreateProviderForm').elements.ParentID.value = st.getIdxOf(st.firstSelected()); |
||
132 | Ajax.SubmitForm('Form_CreateProviderForm', null, { |
||
133 | onSuccess : this.onSuccess, |
||
134 | onFailure : this.showAddPageError |
||
135 | }); |
||
136 | return false; |
||
137 | }, |
||
138 | onSuccess: function(response) { |
||
139 | Ajax.Evaluator(response); |
||
140 | // Make it possible to drop files into the new folder |
||
141 | DropFileItem.applyTo('#sitetree li'); |
||
142 | }, |
||
143 | showAddPageError: function(response) { |
||
144 | errorMessage('Error adding provider', response); |
||
145 | } |
||
146 | } |
||
147 | |||
148 | |||
149 | /** |
||
150 | * Delete folder action |
||
151 | */ |
||
152 | deletefolder = { |
||
153 | button_onclick : function() { |
||
154 | if(treeactions.toggleSelection(this)) { |
||
155 | deletefolder.o1 = $('sitetree').observeMethod('SelectionChanged', deletefolder.treeSelectionChanged); |
||
156 | deletefolder.o2 = $('Form_DeleteItemsForm').observeMethod('Close', deletefolder.popupClosed); |
||
157 | |||
158 | addClass($('sitetree'),'multiselect'); |
||
159 | |||
160 | deletefolder.selectedNodes = { }; |
||
161 | |||
162 | var sel = $('sitetree').firstSelected() |
||
163 | if(sel) { |
||
164 | var selIdx = $('sitetree').getIdxOf(sel); |
||
165 | deletefolder.selectedNodes[selIdx] = true; |
||
166 | sel.removeNodeClass('current'); |
||
167 | sel.addNodeClass('selected'); |
||
168 | } |
||
169 | } |
||
170 | return false; |
||
171 | }, |
||
172 | |||
173 | treeSelectionChanged : function(selectedNode) { |
||
174 | var idx = $('sitetree').getIdxOf(selectedNode); |
||
175 | |||
176 | if(selectedNode.selected) { |
||
177 | selectedNode.removeNodeClass('selected'); |
||
178 | selectedNode.selected = false; |
||
179 | deletefolder.selectedNodes[idx] = false; |
||
180 | |||
181 | } else { |
||
182 | selectedNode.addNodeClass('selected'); |
||
183 | selectedNode.selected = true; |
||
184 | deletefolder.selectedNodes[idx] = true; |
||
185 | } |
||
186 | |||
187 | return false; |
||
188 | }, |
||
189 | |||
190 | popupClosed : function() { |
||
191 | removeClass($('sitetree'),'multiselect'); |
||
192 | $('sitetree').stopObserving(deletefolder.o1); |
||
193 | $('Form_DeleteItemsForm').stopObserving(deletefolder.o2); |
||
194 | |||
195 | for(var idx in deletefolder.selectedNodes) { |
||
196 | if(deletefolder.selectedNodes[idx]) { |
||
197 | node = $('sitetree').getTreeNodeByIdx(idx); |
||
198 | if(node) { |
||
199 | node.removeNodeClass('selected'); |
||
200 | node.selected = false; |
||
201 | } |
||
202 | } |
||
203 | } |
||
204 | }, |
||
205 | |||
206 | form_submit : function() { |
||
207 | var csvIDs = ""; |
||
208 | for(var idx in deletefolder.selectedNodes) { |
||
209 | var selectedNode = $('sitetree').getTreeNodeByIdx(idx); |
||
210 | var link = selectedNode.getElementsByTagName('a')[0]; |
||
211 | |||
212 | if(deletefolder.selectedNodes[idx] && ( !Element.hasClassName( link, 'contents' ) || confirm( "Are you sure you want to remove '" + link.firstChild.nodeValue + "'" ) ) ) |
||
213 | csvIDs += (csvIDs ? "," : "") + idx; |
||
214 | } |
||
215 | |||
216 | if(csvIDs) { |
||
217 | $('Form_DeleteItemsForm').elements.csvIDs.value = csvIDs; |
||
218 | |||
219 | statusMessage('deleting providers'); |
||
220 | |||
221 | Ajax.SubmitForm('Form_DeleteItemsForm', null, { |
||
222 | onSuccess : deletefolder.submit_success, |
||
223 | onFailure : function(response) { |
||
224 | errorMessage('Error deleting pages', response); |
||
225 | } |
||
226 | }); |
||
227 | |||
228 | } else { |
||
229 | alert("Please select at least 1 page."); |
||
230 | } |
||
231 | |||
232 | return false; |
||
233 | }, |
||
234 | |||
235 | submit_success: function(response) { |
||
236 | Ajax.Evaluator(response); |
||
237 | treeactions.closeSelection($('deletepage')); |
||
238 | } |
||
239 | } |
||
240 | |||
241 | Behaviour.register({ |
||
242 | '#Form_EditForm_Files': { |
||
243 | removeFile : function(fileID) { |
||
244 | var record; |
||
245 | if(record = $('record-' + fileID)) { |
||
246 | record.parentNode.removeChild(record); |
||
247 | } |
||
248 | } |
||
249 | }, |
||
250 | |||
251 | '#Form_EditForm_Files a.deletelink' : { |
||
252 | onclick : function(event) { |
||
253 | ajaxLink(this.href); |
||
254 | Event.stop(event); |
||
255 | return false; |
||
256 | } |
||
257 | }, |
||
258 | |||
259 | '#Form_EditForm' : { |
||
260 | changeDetection_fieldsToIgnore : { |
||
261 | 'Files[]' : true |
||
262 | } |
||
263 | } |
||
264 | }); |
||
265 | |||
266 | /** |
||
267 | * We don't want hitting the enter key in the name field |
||
268 | * to submit the form. |
||
269 | */ |
||
270 | Behaviour.register({ |
||
271 | '#Form_EditForm_Name' : { |
||
272 | onkeypress : function(event) { |
||
273 | event = (event) ? event : window.event; |
||
274 | var kc = event.keyCode ? event.keyCode : event.charCode; |
||
275 | if(kc == 13) { |
||
276 | return false; |
||
277 | } |
||
278 | } |
||
279 | } |
||
280 | }); |
||
281 | |||
282 | /** |
||
283 | * Initialisation function to set everything up |
||
284 | */ |
||
285 | appendLoader(function () { |
||
286 | // Set up delete page |
||
287 | Observable.applyTo($('Form_DeleteItemsForm')); |
||
288 | if($('deletepage')) { |
||
289 | $('deletepage').onclick = deletefolder.button_onclick; |
||
290 | // $('deletepage').onclick = function() { Element.show('Form_DeleteItemsForm'); return false; }; |
||
291 | $('Form_DeleteItemsForm').onsubmit = deletefolder.form_submit; |
||
292 | Element.hide('Form_DeleteItemsForm'); |
||
293 | } |
||
294 | |||
295 | }); |
||
296 | |||
297 | function refreshAsset() { |
||
298 | frames[0].location.reload(0); |
||
299 | frames[1].location.reload(1); |
||
300 | } |
||
301 | |||
302 |