Test Failed
Push — master ( 357bf5...71cdad )
by Russell
03:53
created

external-content/javascript/ExternalContent.js   C

Complexity

Total Complexity 54
Complexity/F 2.57

Size

Lines of Code 287
Function Count 21

Duplication

Duplicated Lines 287
Ratio 100 %

Importance

Changes 0
Metric Value
wmc 54
eloc 165
c 0
b 0
f 0
dl 287
loc 287
rs 6.4799
mnd 33
bc 33
fnc 21
bpm 1.5713
cpm 2.5714
noi 45

How to fix   Duplicated Code    Complexity   

Duplicated Code

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:

Complexity

 Tip:   Before tackling complexity, make sure that you eliminate any duplication first. This often can reduce the size of classes significantly.

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
/**
2
 * Configuration for the left hand tree
3
 */
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