/[drupal]/contributions/modules/nodequeue/nodequeue.js
ViewVC logotype

Contents of /contributions/modules/nodequeue/nodequeue.js

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.5 - (show annotations) (download) (as text)
Sun Jan 11 16:18:31 2009 UTC (10 months, 2 weeks ago) by ezrag
Branch: MAIN
CVS Tags: DRUPAL-6--2-5, DRUPAL-6--2-4, DRUPAL-6--2-3, DRUPAL-6--2-2, DRUPAL-6--2-1, DRUPAL-6--2-0, HEAD
Changes since 1.4: +9 -1 lines
File MIME type: text/javascript
feature #318207 by prof1337, ezra-g and jmburnz: add toggle classes to nodequeue links
1 // $Id: nodequeue.js,v 1.4 2008/05/28 06:50:20 merlinofchaos Exp $
2
3 /**
4 * Nodequeue object
5 *
6 * Settings:
7 *
8 * container
9 * up
10 * down
11 * top
12 * bottom:
13 * delete: input image
14 * order: input hidden
15 * add: input to add items
16 * path: path to add items
17 * tr: the base id of the tr
18 */
19 Drupal.nodequeue = function(base, settings) {
20 // Set the properties for this object.
21 if (settings.container == null) {
22 settings.container = settings.row_class;
23 }
24
25 var max = function(array) {
26 return Math.max.apply(Math, array);
27 };
28
29 var array_rand = function(array) {
30 var i = array.length;
31 if (i == 0) return false;
32 while (--i) {
33 var j = Math.floor(Math.random() * ( i + 1 ));
34 var tempi = array[i];
35 var tempj = array[j];
36 array[i] = tempj;
37 array[j] = tempi;
38 }
39 }
40
41 var maxPosition = max($(settings.order).val().split(','));
42
43 this.settings = settings;
44 this.base = '#' + base;
45
46 // helper function to swap items in an array
47 var swap = function(array, a, b) {
48 var temp = array[a];
49 array[a] = array[b];
50 array[b] = temp;
51 }
52
53 var saveOrder = function(order) {
54 var new_order = '';
55 for (i in order) {
56 if (new_order) {
57 new_order += ',';
58 }
59 new_order += order[i];
60 }
61
62 $(settings.order).val(new_order);
63 $(settings.hidden).show();
64 }
65
66 var changeOrder = function(item, how) {
67 var order = $(settings.order).val().split(',');
68
69 if (how != 'add' && how != 'insert') {
70 var tr = $(item).parents('tr').get(0);
71 var id = $(tr).attr('id').replace(settings.tr, '');
72 var index = -1;
73
74 for (var i in order) {
75 if (order[i] == id) {
76 index = parseInt(i);
77 break;
78 }
79 }
80 }
81
82 switch (how) {
83 case 'add':
84 order.push(item);
85 break;
86 case 'insert':
87 order.unshift(item);
88 break;
89 case 'delete':
90 order.splice(index, 1);
91 break;
92 case 'top':
93 var temp = order[index];
94 order.splice(index, 1);
95 order.unshift(temp);
96 break;
97 case 'up':
98 swap(order, index, index - 1);
99 break;
100 case 'down':
101 swap(order, index, index + 1);
102 break;
103 case 'bottom':
104 var temp = order[index];
105 order.splice(index, 1);
106 order.push(temp);
107 break;
108 }
109
110 saveOrder(order);
111 }
112
113 var makeOrder = function(order) {
114 // Go through the new order and move each item to the bottom.
115 // Then everything will be where it was meant to be.
116 var last = $(settings.row_class + ':last');
117 for (var i in order) {
118 var item = $('#' + settings.tr + order[i]);
119 last.after(item);
120 changed($(item));
121 last = item;
122 }
123 restripeTable('#' + base);
124 }
125
126 this.changeOrder = changeOrder;
127
128 var restripeTable = function(table) {
129 // :even and :odd are reversed because jquery counts from 0 and
130 // we count from 1, so we're out of sync.
131 $('tbody tr:not(:hidden)', $(table))
132 .removeClass('even')
133 .removeClass('odd')
134 .filter(':even')
135 .addClass('odd')
136 .end()
137 .filter(':odd')
138 .addClass('even');
139 }
140
141 var changed = function(item) {
142 if (!item.is('.changed')) {
143 item.addClass('changed').css('color', 'red');
144 item.children('td:first').prepend(' <b>*</b> ');
145 $('p.nodequeue-warning').css('color', 'red');
146 }
147 }
148
149 this.restripeTable = restripeTable;
150
151 // Set as a function so we can be both a closure and called later
152 // when more items get added.
153 var bindButtons = function() {
154 if (settings.remove) {
155 $(settings.remove + ':not(.nodequeue-processed)')
156 .addClass('nodequeue-processed')
157 .click(function() { return false; })
158 .click(function(e) {
159 var item = $(this).parents(settings.container);
160 changeOrder(this, 'delete');
161
162 item.remove();
163 restripeTable('#' + base);
164
165 return false;
166 });
167 }
168
169 if (settings.clear_list) {
170 $(settings.clear_list + ':not(.nodequeue-processed)')
171 .addClass('nodequeue-processed')
172 .click(function() { return false; })
173 .click(function(e) {
174 $(settings.row_class).each(function() { $(this).remove() });
175 saveOrder([]);
176 });
177 }
178
179 if (settings.shuffle) {
180 $(settings.shuffle + ':not(.nodequeue-processed)')
181 .addClass('nodequeue-processed')
182 .click(function() { return false; })
183 .click(function(e) {
184 // randomize the order
185 var order = $(settings.order).val().split(',');
186 array_rand(order);
187 saveOrder(order);
188 makeOrder(order);
189 });
190 }
191
192 if (settings.reverse) {
193 $(settings.reverse + ':not(.nodequeue-processed)')
194 .addClass('nodequeue-processed')
195 .click(function() { return false; })
196 .click(function(e) {
197 // reverse the order
198 var order = $(settings.order).val().split(',');
199 order.reverse();
200 saveOrder(order);
201 makeOrder(order);
202 });
203 }
204
205 if (settings.up) {
206 $(settings.up + ':not(.nodequeue-processed)')
207 .addClass('nodequeue-processed')
208 .click(function() { return false; })
209 .click(function(e) {
210 var item = $(this).parents(settings.container);
211 var prev = $(item).prev();
212
213 if (prev.html() != null && item != prev) {
214 // move item
215 prev.before(item);
216 restripeTable('#' + base);
217 changed(item);
218 changeOrder(this, 'up');
219 }
220
221 return false;
222 });
223 }
224
225 if (settings.top) {
226 $(settings.top + ':not(.nodequeue-processed)')
227 .addClass('nodequeue-processed')
228 .click(function() { return false; })
229 .click(function(e) {
230 var item = $(this).parents(settings.container);
231 var first = $(item).siblings(':first');
232
233 first.before(item);
234 restripeTable('#' + base);
235 changeOrder(this, 'top');
236 changed(item);
237
238 return false;
239 });
240 }
241
242 if (settings.down) {
243 $(settings.down + ':not(.nodequeue-processed)')
244 .addClass('nodequeue-processed')
245 .click(function() { return false; })
246 .click(function(e) {
247 var item = $(this).parents(settings.container);
248 var next = $(item).next();
249
250 if (next.html() != null && item != next) {
251 // move item
252 next.after(item);
253 restripeTable('#' + base);
254 changeOrder(this, 'down');
255 changed(item);
256 }
257
258 return false;
259 });
260 }
261
262 if (settings.bottom) {
263 $(settings.bottom + ':not(.nodequeue-processed)')
264 .addClass('nodequeue-processed')
265 .click(function() { return false; })
266 .click(function(e) {
267 var item = $(this).parents(settings.container);
268 var last = $(item).siblings(':last');
269
270 // move item
271 last.after(item);
272 restripeTable('#' + base);
273 changeOrder(this, 'bottom');
274 changed(item);
275
276 return false;
277 });
278 }
279
280 if (settings.add) {
281 $(settings.add + ':not(.nodequeue-processed)')
282 .addClass('nodequeue-processed')
283 .click(function() { return false; })
284 .click(function(e) {
285 var input = this;
286 $(input).attr('disabled', true);
287 $(input).parent().addClass('throbbing');
288 var data = { position: maxPosition + 1 };
289 for (i in settings.post) {
290 data[$(settings.post[i]).attr('name')] = $(settings.post[i]).val();
291 }
292
293 $.ajax({
294 type: 'POST',
295 data: data,
296 url: settings.path,
297 global: true,
298 success: function (data) {
299 // Parse response
300 $(input).parent().removeClass('throbbing');
301 $(input).attr('disabled', false);
302 data = Drupal.parseJson(data);
303 if (data.status) {
304 // add new data
305 var new_content = $(data.data);
306
307 Drupal.freezeHeight();
308 // Hide the new content before adding to page.
309
310 maxPosition++;
311 // Add the form and re-attach behavior.
312 if (settings.add_location != 'top') {
313 $('#' + base + ' tbody').append(new_content);
314 changeOrder(maxPosition, 'add');
315 }
316 else {
317 $('#' + base + ' tbody').prepend(new_content);
318 changeOrder(maxPosition, 'insert');
319 }
320
321 changed(new_content);
322
323 bindButtons();
324
325 Drupal.unfreezeHeight();
326
327 // Add the extra data, if necessary
328 if (data.extra && settings.extra) {
329 var val = $(settings.extra).val();
330 if (val) {
331 val += ',';
332 }
333 val += data.extra;
334 $(settings.extra).val(val);
335 }
336
337 if (settings.clear) {
338 for (i in settings.clear) {
339 $(settings.clear[i]).val('');
340 }
341 }
342 return;
343 }
344 else {
345 // report the error
346 alert(data.error, 'Error');
347 }
348 },
349 error: function(data) {
350 alert('An error occurred');
351 $(input).parent().removeClass('throbbing');
352 $(input).attr('disabled', false);
353 }
354 });
355 return false;
356 });
357
358 }
359 }
360
361 // Focus if we're told to.
362 if (settings.focus) {
363 $(settings.focus).get(0).focus();
364 }
365 this.bindButtons = bindButtons();
366 }
367
368
369 Drupal.nodequeue.autoAttach = function() {
370 if (Drupal.settings && Drupal.settings.nodequeue) {
371 for (var base in Drupal.settings.nodequeue) {
372 if (!$('#'+ base + '.nodequeue-processed').size()) {
373 var settings = Drupal.settings.nodequeue[base];
374 var list = new Drupal.nodequeue(base, settings);
375 $('#'+ base).addClass('nodequeue-processed');
376 }
377 }
378 }
379
380 $('a.nodequeue-ajax-toggle').click(function() {
381 var a = this;
382 href = $(this).attr('href');
383 $(a).addClass('throbbing');
384 $.ajax({
385 type: 'POST',
386 data: { js: 1 },
387 url: href,
388 global: true,
389 success: function (data) {
390 // Parse response
391 $(a).removeClass('throbbing');
392 data = Drupal.parseJson(data);
393 // Change text on success
394 if (data.status) {
395 // Change label back
396 $(a).attr('href', data.href);
397 $(a).html(data.label);
398 if (data.sqid) {
399 $('#nodequeue-count-' + data.sqid).html(data.count);
400 }
401 if (data.href.search('remove-node') > -1) {
402 $(a).removeClass('toggle-add');
403 $(a).addClass('toggle-remove');
404 }
405 else {
406 $(a).removeClass('toggle-remove');
407 $(a).addClass('toggle-add');
408 }
409 return;
410 }
411 },
412 error: function(data) {
413 $(a).removeClass('throbbing');
414 }
415 });
416 return false;
417 });
418
419 }
420
421 if (Drupal.jsEnabled) {
422 $(document).ready(Drupal.nodequeue.autoAttach);
423 }
424
425
426

  ViewVC Help
Powered by ViewVC 1.1.2