Project

General

Profile

1
// Copyright 2006 Stepan Riha
2
// www.nonplus.net
3
// $Id: dragdrop.js 2 2006-04-18 03:04:39Z stepan $
4
/**
5
* -----------------------------------------------------------------------------------------
6
*  MODIFICATON FOR THE JSADMIN MODULE
7
* -----------------------------------------------------------------------------------------
8
*	MODIFICATION HISTORY:
9
*   Swen Uth; 01/24/2008
10
*   +INCLUDE VARIABLE buttonCell FOR ADAPTATION TO LATER LAYOUTS
11
*
12
**/
13
JsAdmin.DD = {};
14
JsAdmin.movable_rows = {};
15

    
16
JsAdmin.init_drag_drop = function() {
17

    
18
	// There seems to be many different ways the ordering is set up
19
	//		pages/index.php has UL/LI containing tables with single row
20
	//		pages/sections.php has a TABLE with many rows
21
	//		pages/modify.php for manuals is completely weird...
22
	// So we only want to deal with pages & sections...
23

    
24
	var page_type = '';
25
	var is_tree = false;
26

    
27
	if(document.URL.indexOf(JsAdmin.ADMIN_URL + "/pages/index.php") > -1) {
28
		page_type = 'pages';
29
		is_tree = true;
30

    
31
		// This page uses duplicate IDs and incorrectly nested lists:
32
		// <ul id="p1">
33
		//		<li id="p1"><table /></li>
34
		//		<ul>... sub items ...</ul>
35
		// </ul>
36
		//
37
		// We need to fix that to the following:
38
		// <ul id="p1">
39
		//		<li id="uniqueID"><table />
40
		//		<ul>... sub items ...</ul>
41
		//		</li>
42
		// </ul>
43

    
44
		// Stash all UL ids
45
		var ids = {};
46
		var lists = document.getElementsByTagName('ul');
47
		for(var i = 0; i < lists.length; i++) {
48
			if(lists[i].id) {
49
				ids[lists[i].id] = true;
50
			}
51
		}
52

    
53
		// Now fix all LIs
54
		var items = document.getElementsByTagName('li');
55
 		for(var i = 0; i < items.length; i++) {
56
			var item = items[i];
57

    
58
			// Fix duplicate ID
59
			if(ids[item.id]) {
60
				item.id =  JsAdmin.util.getUniqueId();
61
			}
62

    
63
			// Fix UL parented by UL
64
			var ul = JsAdmin.util.getNextSiblingNode(item, 'ul');
65
			if(ul) {
66
				var lis = ul.getElementsByTagName('li');
67
 				if(!lis || lis.length == 0) {
68
					// Remove list without items
69
					ul.parentNode.removeChild(ul);
70
				} else {
71
					// Make list child of list item
72
					item.appendChild(ul);
73
				}
74
			}
75
		}
76

    
77
	} else if(document.URL.indexOf("/admin/pages/sections.php") > 0) {
78
		page_type = 'sections';
79
	} else if(document.URL.indexOf("/admin/pages/modify.php") > 0) {
80
		page_type = 'modules';
81
		is_tree = true;
82
		// Stash all UL ids
83
		var ids = {};
84
		var lists = document.getElementsByTagName('ul');
85
		for(var i = 0; i < lists.length; i++) {
86
			if(lists[i].id) {
87
				ids[lists[i].id] = true;
88
			}
89
		}
90

    
91
		// Now fix all LIs
92
		var items = document.getElementsByTagName('li');
93
 		for(var i = 0; i < items.length; i++) {
94
			var item = items[i];
95

    
96
			// Fix duplicate ID
97
			if(ids[item.id]) {
98
				item.id =  JsAdmin.util.getUniqueId();
99
			}
100

    
101
			// Fix UL parented by UL
102
			var ul = JsAdmin.util.getNextSiblingNode(item, 'ul');
103
			if(ul) {
104
				var lis = ul.getElementsByTagName('li');
105
 				if(!lis || lis.length == 0) {
106
					// Remove list without items
107
					ul.parentNode.removeChild(ul);
108
				} else {
109
					// Make list child of list item
110
					item.appendChild(ul);
111
				}
112
			}
113
		}
114

    
115
	} else {
116
		// We don't do any other pages
117
		return;
118
		// page_type = 'modules';
119
	}
120

    
121
	var links = document.getElementsByTagName('a');
122
	var reImg = /(.*)move_(down|up)\.php(.*)/;
123

    
124
	for(var i = 0; i < links.length; i++) {
125
		var link = links[i];
126
		var href = link.href || '';
127
		var match = href.match(reImg);
128
		if(!match) {
129
			continue;
130
		}
131
		var url = match[1];
132
		var op = match[2];
133
		var params = match[3];
134
		var tr = JsAdmin.util.getAncestorNode(link, 'tr');
135
		var item = is_tree ? JsAdmin.util.getAncestorNode(tr, 'li') : tr;
136
		if(!item) {
137
			continue;
138
		}
139

    
140
		// Make sure we have a unique id
141
		if(!item.id || YAHOO.util.Dom.get(item.id) != item) {
142
			item.id = JsAdmin.util.getUniqueId();
143
		}
144

    
145
		if(is_tree) {
146
			var parent = JsAdmin.util.getAncestorNode(item, 'ul');
147
			new JsAdmin.DD.liDDSwap(item.id, (parent && parent.id) ? parent.id : 'top');
148
		} else {
149
			new JsAdmin.DD.trDDSwap(item.id);
150
		}
151
		item.className += " jsadmin_drag";
152

    
153
		this.movable_rows[item.id] = { item: item, tr : tr, url : url, params : params };
154
	}
155
};
156

    
157
//==========================================================================
158
// Drag-drop utils
159
//==========================================================================
160

    
161
JsAdmin.DD.dragee = null;
162

    
163
JsAdmin.DD.addMoveButton = function(tr, cell, op) {
164
	if(op == 'down') {
165
		cell++;
166
	}
167
	var item = JsAdmin.movable_rows[tr.id];
168
	if(!JsAdmin.util.isNodeType(tr, 'tr')) {
169
		var rows = tr.getElementsByTagName('tr');
170
		tr = rows[0];
171
	}
172

    
173
	var html = '<a href="' + item.url + 'move_' + op + '.php' + item.params
174
				+ '"><img src="' + JsAdminTheme.THEME_URL + '/images/' + op
175
				+ '_16.png" border="0" alt="' + op + '" /></a>';
176
	tr.cells[cell].innerHTML = html;
177
};
178

    
179
JsAdmin.DD.deleteMoveButton = function(tr, cell, op) {
180
	if(op == 'down') {
181
		cell++;
182
	}
183
	if(!JsAdmin.util.isNodeType(tr, 'tr')) {
184
		var rows = tr.getElementsByTagName('tr');
185
		tr = rows[0];
186
	}
187
	
188
	tr.cells[cell].innerHTML = "";
189
};
190

    
191
//==========================================================================
192
// Drag-drop handling for table rows
193
//==========================================================================
194

    
195
JsAdmin.DD.trDDSwap = function(id, sGroup) {
196
    this.init(id, sGroup);
197
	this.addInvalidHandleType('a');
198
	this.addInvalidHandleType('input');
199
	this.addInvalidHandleType('select');
200
    this.initFrame();
201
	this.buttonCell = buttonCell;//, by Swen Uth
202
	
203
	// For Connection
204
	this.scope = this;
205
};
206

    
207
JsAdmin.DD.trDDSwap.prototype = new YAHOO.util.DDProxy();
208

    
209
JsAdmin.DD.trDDSwap.prototype.startDrag = function(x, y) {
210
	if (JsAdmin.DD.dragee != this) {
211
		this.rowIndex = this.getEl().rowIndex;
212
		this.numRows = this.getEl().parentNode.rows.length;
213
		this.opacity = YAHOO.util.Dom.getStyle(this.getEl(), "opacity");
214
		this.background = YAHOO.util.Dom.getStyle(this.getEl(), "background");
215
		YAHOO.util.Dom.setStyle(this.getEl(), "opacity", 0.5);
216
		YAHOO.util.Dom.setStyle(this.getEl(), "background", "transparent");
217
	}
218
	JsAdmin.DD.dragee = this;
219
};
220

    
221
JsAdmin.DD.trDDSwap.prototype.onDragEnter = function(e, id) {
222
  var elt = id ? YAHOO.util.Dom.get(id) : null;
223
	var item = JsAdmin.movable_rows[this.getEl().id];
224
	var rows = item.tr.parentNode.rows;
225
	var wasFirst = item.tr.rowIndex == 1;
226
	var wasLast = item.tr.rowIndex == this.numRows - 2;
227
	if(elt.rowIndex < item.tr.rowIndex) {
228
		elt.parentNode.insertBefore(item.tr, elt);
229
	} else {
230
		elt.parentNode.insertBefore(elt, item.tr);
231
	}
232
	// Fixup buttons
233
	var isFirst = item.tr.rowIndex == 1;
234
	var isLast = item.tr.rowIndex == this.numRows - 2;
235

    
236
	if(wasFirst != isFirst) {
237
		if(isFirst) {
238
			JsAdmin.DD.deleteMoveButton(item.tr, this.buttonCell, 'up');
239
			JsAdmin.DD.addMoveButton(JsAdmin.util.getNextSiblingNode(item.tr), this.buttonCell, 'up');
240
		} else {
241
			JsAdmin.DD.addMoveButton(item.tr, this.buttonCell, 'up');
242
			JsAdmin.DD.deleteMoveButton(rows[1], this.buttonCell, 'up');
243
		}
244
	}
245
	if(wasLast != isLast) {
246
		if(isLast) {
247
			JsAdmin.DD.deleteMoveButton(item.tr, this.buttonCell, 'down');
248
			JsAdmin.DD.addMoveButton(JsAdmin.util.getPreviousSiblingNode(item.tr), this.buttonCell, 'down');
249
		} else {
250
			JsAdmin.DD.addMoveButton(item.tr, this.buttonCell, 'down');
251
			JsAdmin.DD.deleteMoveButton(rows[rows.length-2], this.buttonCell, 'down');
252
		}
253
	}
254

    
255
	this.DDM.refreshCache(this.groups);
256
};
257

    
258
JsAdmin.DD.trDDSwap.prototype.endDrag = function(e) {
259
	YAHOO.util.Dom.setStyle(this.getEl(), "opacity", this.opacity);
260
	YAHOO.util.Dom.setStyle(this.getEl(), "background", "#f0f0f0");
261
	
262
	JsAdmin.DD.dragee = null;
263

    
264
	var newIndex = this.getEl().rowIndex;
265
	if(newIndex != this.rowIndex) {
266
		var url = JsAdmin.WB_URL + "/modules/jsadmin/move_to.php";
267
		url += JsAdmin.movable_rows[this.getEl().id].params + "&position=" + newIndex;
268
		document.body.className = String(document.body.className).replace(/(\s*)jsadmin_([a-z]+)/g, "$1") + " jsadmin_busy";
269
		YAHOO.util.Connect.asyncRequest('GET', url, this, null);
270
	}
271
};
272

    
273
JsAdmin.DD.trDDSwap.prototype.success = function(o) {
274
	document.body.className = String(document.body.className).replace(/(\s*)jsadmin_([a-z]+)/g, "$1") + " jsadmin_success";
275
};
276

    
277
JsAdmin.DD.trDDSwap.prototype.failure = function(o) {
278
	document.body.className = String(document.body.className).replace(/(\s*)jsadmin_([a-z]+)/, "$1") + " jsadmin_failure";
279
};
280

    
281
//==========================================================================
282
// Drag-drop handling for list items
283
//==========================================================================
284

    
285
JsAdmin.DD.liDDSwap = function(id, sGroup) {
286
    this.init(id, sGroup);
287
	this.addInvalidHandleType('a');
288
	this.addInvalidHandleType('input');
289
	this.addInvalidHandleType('select');
290
    this.initFrame();
291
 this.buttonCell = buttonCell;//, by Swen Uth
292
	this.counter = 0;
293
};
294

    
295
JsAdmin.DD.liDDSwap.prototype = new YAHOO.util.DDProxy();
296

    
297
JsAdmin.DD.liDDSwap.prototype.startDrag = function(x, y) {
298
	// On IE, startDrag is sometimes called twice
299
	if(JsAdmin.DD.dragee && JsAdmin.DD.dragee != this) {
300
		JsAdmin.DD.dragee.endDrag(null);
301
	}
302
	if(JsAdmin.DD.dragee != this) {
303
		this.rowIndex = JsAdmin.util.getItemIndex(this.getEl());
304
		this.opacity = YAHOO.util.Dom.getStyle(this.getEl(), "opacity");
305
		this.background = YAHOO.util.Dom.getStyle(this.getEl(), "background");
306
		YAHOO.util.Dom.setStyle(this.getEl(), "opacity", 0.5);
307

    
308
		this.list = JsAdmin.util.getAncestorNode(this.getEl(), "ul");
309
		this.list.className += " jsadmin_drag_area";
310
	}
311
	JsAdmin.DD.dragee = this;
312
};
313

    
314
JsAdmin.DD.liDDSwap.prototype.onDragEnter = function(e, id) {
315
	// Swap with other element
316
	var elt = id ? YAHOO.util.Dom.get(id) : null;
317
	var item = JsAdmin.movable_rows[this.getEl().id];
318
	var eltRowIndex = JsAdmin.util.getItemIndex(elt);
319
	var rowIndex = JsAdmin.util.getItemIndex(this.getEl());
320
	var wasFirst = !JsAdmin.util.getPreviousSiblingNode(this.getEl());
321
	var wasLast = !JsAdmin.util.getNextSiblingNode(this.getEl());
322

    
323
	if(eltRowIndex < rowIndex) {
324
		elt.parentNode.insertBefore(this.getEl(), elt);
325
	} else {
326
		elt.parentNode.insertBefore(elt, this.getEl());
327
	}
328
	// Fixup buttons
329
	var isFirst = !JsAdmin.util.getPreviousSiblingNode(this.getEl());
330
	var isLast = !JsAdmin.util.getNextSiblingNode(this.getEl());
331

    
332
	if(wasFirst != isFirst) {
333
		if(isFirst) {
334
			JsAdmin.DD.deleteMoveButton(item.tr, this.buttonCell, 'up');
335
			JsAdmin.DD.addMoveButton(JsAdmin.util.getNextSiblingNode(item.item), this.buttonCell, 'up');
336
		} else {
337
			JsAdmin.DD.addMoveButton(item.item, this.buttonCell, 'up');
338
			var first, prev = JsAdmin.util.getPreviousSiblingNode(item.item);
339
			while(prev) {
340
				first = prev;
341
				prev = JsAdmin.util.getPreviousSiblingNode(prev);
342
			}
343
			JsAdmin.DD.deleteMoveButton(JsAdmin.movable_rows[first.id].tr, this.buttonCell, 'up');
344
		}
345
	}
346
	if(wasLast != isLast) {
347
		if(isLast) {
348
			JsAdmin.DD.deleteMoveButton(item.tr, this.buttonCell, 'down');
349
			JsAdmin.DD.addMoveButton(JsAdmin.util.getPreviousSiblingNode(item.item), this.buttonCell, 'down');
350
		} else {
351
			JsAdmin.DD.addMoveButton(item.item, this.buttonCell, 'down');
352
			var last, next = JsAdmin.util.getNextSiblingNode(item.item);
353
			while(next) {
354
				last = next;
355
				next = JsAdmin.util.getNextSiblingNode(next);
356
			}
357
			JsAdmin.DD.deleteMoveButton(JsAdmin.movable_rows[last.id].tr, this.buttonCell, 'down');
358
		}
359
	}
360

    
361
	this.DDM.refreshCache(this.groups);
362
};
363

    
364
JsAdmin.DD.liDDSwap.prototype.endDrag = function(e) {
365
	YAHOO.util.Dom.setStyle(this.getEl(), "opacity", this.opacity);
366
	this.list.className = String(this.list.className).replace(/(\s*)jsadmin_([a-z]+)/g, "$1");
367
	JsAdmin.DD.dragee = null;
368
	var newIndex = JsAdmin.util.getItemIndex(this.getEl());
369
	if(newIndex != this.rowIndex) {
370
		var url = JsAdmin.WB_URL + "/modules/jsadmin/move_to.php";
371
		url += JsAdmin.movable_rows[this.getEl().id].params + "&position=" + (newIndex+1);
372
		document.body.className = String(document.body.className).replace(/(\s*)jsadmin_([a-z]+)/g, "$1") + " jsadmin_busy";
373
		YAHOO.util.Connect.asyncRequest('GET', url, this, null);
374
	}
375
};
376

    
377
JsAdmin.DD.liDDSwap.prototype.success = function(o) {
378
	document.body.className = String(document.body.className).replace(/(\s*)jsadmin_([a-z]+)/g, "$1") + " jsadmin_success";
379
};
380

    
381
JsAdmin.DD.liDDSwap.prototype.failure = function(o) {
382
	document.body.className = String(document.body.className).replace(/(\s*)jsadmin_([a-z]+)/, "$1") + " jsadmin_failure";
383
};
(1-1/5)