comparison media/django/js/admin/ordering.js @ 1:0dcfcdf50c62

Initial import of Madeira project from the private repository.
author Brian Neal <bgneal@gmail.com>
date Mon, 06 Apr 2009 03:10:59 +0000
parents
children
comparison
equal deleted inserted replaced
0:df0370bfe3f0 1:0dcfcdf50c62
1 addEvent(window, 'load', reorder_init);
2
3 var lis;
4 var top = 0;
5 var left = 0;
6 var height = 30;
7
8 function reorder_init() {
9 lis = document.getElementsBySelector('ul#orderthese li');
10 var input = document.getElementsBySelector('input[name=order_]')[0];
11 setOrder(input.value.split(','));
12 input.disabled = true;
13 draw();
14 // Now initialise the dragging behaviour
15 var limit = (lis.length - 1) * height;
16 for (var i = 0; i < lis.length; i++) {
17 var li = lis[i];
18 var img = document.getElementById('handle'+li.id);
19 li.style.zIndex = 1;
20 Drag.init(img, li, left + 10, left + 10, top + 10, top + 10 + limit);
21 li.onDragStart = startDrag;
22 li.onDragEnd = endDrag;
23 img.style.cursor = 'move';
24 }
25 }
26
27 function submitOrderForm() {
28 var inputOrder = document.getElementsBySelector('input[name=order_]')[0];
29 inputOrder.value = getOrder();
30 inputOrder.disabled=false;
31 }
32
33 function startDrag() {
34 this.style.zIndex = '10';
35 this.className = 'dragging';
36 }
37
38 function endDrag(x, y) {
39 this.style.zIndex = '1';
40 this.className = '';
41 // Work out how far along it has been dropped, using x co-ordinate
42 var oldIndex = this.index;
43 var newIndex = Math.round((y - 10 - top) / height);
44 // 'Snap' to the correct position
45 this.style.top = (10 + top + newIndex * height) + 'px';
46 this.index = newIndex;
47 moveItem(oldIndex, newIndex);
48 }
49
50 function moveItem(oldIndex, newIndex) {
51 // Swaps two items, adjusts the index and left co-ord for all others
52 if (oldIndex == newIndex) {
53 return; // Nothing to swap;
54 }
55 var direction, lo, hi;
56 if (newIndex > oldIndex) {
57 lo = oldIndex;
58 hi = newIndex;
59 direction = -1;
60 } else {
61 direction = 1;
62 hi = oldIndex;
63 lo = newIndex;
64 }
65 var lis2 = new Array(); // We will build the new order in this array
66 for (var i = 0; i < lis.length; i++) {
67 if (i < lo || i > hi) {
68 // Position of items not between the indexes is unaffected
69 lis2[i] = lis[i];
70 continue;
71 } else if (i == newIndex) {
72 lis2[i] = lis[oldIndex];
73 continue;
74 } else {
75 // Item is between the two indexes - move it along 1
76 lis2[i] = lis[i - direction];
77 }
78 }
79 // Re-index everything
80 reIndex(lis2);
81 lis = lis2;
82 draw();
83 // document.getElementById('hiddenOrder').value = getOrder();
84 document.getElementsBySelector('input[name=order_]')[0].value = getOrder();
85 }
86
87 function reIndex(lis) {
88 for (var i = 0; i < lis.length; i++) {
89 lis[i].index = i;
90 }
91 }
92
93 function draw() {
94 for (var i = 0; i < lis.length; i++) {
95 var li = lis[i];
96 li.index = i;
97 li.style.position = 'absolute';
98 li.style.left = (10 + left) + 'px';
99 li.style.top = (10 + top + (i * height)) + 'px';
100 }
101 }
102
103 function getOrder() {
104 var order = new Array(lis.length);
105 for (var i = 0; i < lis.length; i++) {
106 order[i] = lis[i].id.substring(1, 100);
107 }
108 return order.join(',');
109 }
110
111 function setOrder(id_list) {
112 /* Set the current order to match the lsit of IDs */
113 var temp_lis = new Array();
114 for (var i = 0; i < id_list.length; i++) {
115 var id = 'p' + id_list[i];
116 temp_lis[temp_lis.length] = document.getElementById(id);
117 }
118 reIndex(temp_lis);
119 lis = temp_lis;
120 draw();
121 }
122
123 function addEvent(elm, evType, fn, useCapture)
124 // addEvent and removeEvent
125 // cross-browser event handling for IE5+, NS6 and Mozilla
126 // By Scott Andrew
127 {
128 if (elm.addEventListener){
129 elm.addEventListener(evType, fn, useCapture);
130 return true;
131 } else if (elm.attachEvent){
132 var r = elm.attachEvent("on"+evType, fn);
133 return r;
134 } else {
135 elm['on'+evType] = fn;
136 }
137 }