motiro 0.6.9 → 0.6.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README +1 -1
- data/Rakefile +2 -2
- data/app/core/version.rb +1 -1
- data/app/helpers/feed_helper.rb +2 -0
- data/app/reporters/darcs_reporter.rb +2 -3
- data/app/views/events/new.rhtml +14 -0
- data/app/views/feed/subversion.rhtml +26 -0
- data/app/views/report/events_detail.rhtml +12 -0
- data/build/build.rb +29 -0
- data/config/boot.rb +104 -14
- data/config/environment.rb +35 -38
- data/config/environments/development.rb +5 -7
- data/config/environments/production.rb +3 -3
- data/config/environments/test.rb +5 -2
- data/config/initializers/globalize.rb +5 -0
- data/config/initializers/inflections.rb +10 -0
- data/config/initializers/mime_types.rb +5 -0
- data/config/initializers/motiro_core.rb +5 -0
- data/config/motiro.yml +4 -4
- data/config/report/subversion.yml +26 -0
- data/doc/README_FOR_APP +1 -1
- data/lib/login_system.rb +2 -2
- data/lib/tasks/packaging.rake +4 -4
- data/public/404.html +27 -5
- data/public/422.html +30 -0
- data/public/500.html +27 -5
- data/public/dispatch.rb +2 -2
- data/public/javascripts/application.js +2 -0
- data/public/javascripts/controls.js +532 -319
- data/public/javascripts/dragdrop.js +521 -133
- data/public/javascripts/effects.js +708 -442
- data/public/javascripts/prototype.js +3393 -953
- data/public/robots.txt +5 -1
- data/public/selenium/tests/TestMainPage.html +42 -0
- data/public/selenium/tests/TestReportHTML.html +42 -0
- data/public/selenium/tests/TestReportRSS.html +37 -0
- data/public/selenium/tests/TestSubversionOnMain.html +32 -0
- data/public/selenium/tests/TestSuite.html +26 -0
- data/script/about +1 -1
- data/script/console +1 -1
- data/script/destroy +1 -1
- data/script/generate +1 -1
- data/script/performance/request +3 -0
- data/script/plugin +1 -1
- data/script/process/inspector +3 -0
- data/script/runner +1 -1
- data/script/server +1 -1
- data/test/fixtures/headlines.yml +6 -6
- data/test/functional/report_controller_test.rb +18 -18
- data/test/functional/root_controller_test.rb +1 -1
- data/test/test_helper.rb +11 -1
- data/test/unit/chief_editor_test.rb +20 -26
- data/test/unit/darcs_reporter_test.rb +6 -0
- data/test/unit/headline_test.rb +25 -8
- data/vendor/plugins/cache_test-0.2/doc/classes/Cosinux/FragmentCacheTest/Assertions.html +364 -0
- data/vendor/plugins/cache_test-0.2/doc/classes/Cosinux/PageCacheTest/IntegrationTestMethods.html +261 -0
- data/vendor/plugins/cache_test-0.2/doc/created.rid +1 -0
- data/vendor/plugins/cache_test-0.2/doc/files/CHANGELOG.html +128 -0
- data/vendor/plugins/cache_test-0.2/doc/files/MIT-LICENSE.html +129 -0
- data/vendor/plugins/cache_test-0.2/doc/files/README.html +272 -0
- data/vendor/plugins/cache_test-0.2/doc/files/init_rb.html +109 -0
- data/vendor/plugins/cache_test-0.2/doc/files/lib/fragment_cache_test_rb.html +101 -0
- data/vendor/plugins/cache_test-0.2/doc/files/lib/page_cache_test_rb.html +101 -0
- data/vendor/plugins/cache_test-0.2/doc/fr_class_index.html +28 -0
- data/vendor/plugins/cache_test-0.2/doc/fr_file_index.html +32 -0
- data/vendor/plugins/cache_test-0.2/doc/fr_method_index.html +32 -0
- data/vendor/plugins/cache_test-0.2/doc/index.html +24 -0
- data/vendor/plugins/cache_test-0.2/doc/rdoc-style.css +208 -0
- data/vendor/plugins/caching_monkey_patch/init.rb +13 -0
- data/vendor/plugins/rails_cron/CHANGELOG +8 -0
- data/vendor/plugins/rails_cron/LICENSE +7 -0
- data/vendor/plugins/rails_cron/README +77 -0
- data/vendor/plugins/rails_cron/init.rb +16 -0
- data/vendor/plugins/rails_cron/lib/acts_as_background.rb +14 -0
- data/vendor/plugins/rails_cron/lib/rails_cron.rb +128 -0
- data/vendor/plugins/rails_cron/tasks/startup.rake +50 -0
- metadata +466 -406
|
@@ -1,8 +1,11 @@
|
|
|
1
|
-
// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
|
|
1
|
+
// Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
|
|
2
|
+
// (c) 2005-2007 Sammi Williams (http://www.oriontransfer.co.nz, sammi@oriontransfer.co.nz)
|
|
2
3
|
//
|
|
3
|
-
//
|
|
4
|
+
// script.aculo.us is freely distributable under the terms of an MIT-style license.
|
|
5
|
+
// For details, see the script.aculo.us web site: http://script.aculo.us/
|
|
4
6
|
|
|
5
|
-
|
|
7
|
+
if(Object.isUndefined(Effect))
|
|
8
|
+
throw("dragdrop.js requires including script.aculo.us' effects.js library");
|
|
6
9
|
|
|
7
10
|
var Droppables = {
|
|
8
11
|
drops: [],
|
|
@@ -15,15 +18,15 @@ var Droppables = {
|
|
|
15
18
|
element = $(element);
|
|
16
19
|
var options = Object.extend({
|
|
17
20
|
greedy: true,
|
|
18
|
-
hoverclass: null
|
|
19
|
-
|
|
21
|
+
hoverclass: null,
|
|
22
|
+
tree: false
|
|
23
|
+
}, arguments[1] || { });
|
|
20
24
|
|
|
21
25
|
// cache containers
|
|
22
26
|
if(options.containment) {
|
|
23
27
|
options._containers = [];
|
|
24
28
|
var containment = options.containment;
|
|
25
|
-
if((
|
|
26
|
-
(containment.constructor == Array)) {
|
|
29
|
+
if(Object.isArray(containment)) {
|
|
27
30
|
containment.each( function(c) { options._containers.push($(c)) });
|
|
28
31
|
} else {
|
|
29
32
|
options._containers.push($(containment));
|
|
@@ -37,12 +40,27 @@ var Droppables = {
|
|
|
37
40
|
|
|
38
41
|
this.drops.push(options);
|
|
39
42
|
},
|
|
43
|
+
|
|
44
|
+
findDeepestChild: function(drops) {
|
|
45
|
+
deepest = drops[0];
|
|
46
|
+
|
|
47
|
+
for (i = 1; i < drops.length; ++i)
|
|
48
|
+
if (Element.isParent(drops[i].element, deepest.element))
|
|
49
|
+
deepest = drops[i];
|
|
50
|
+
|
|
51
|
+
return deepest;
|
|
52
|
+
},
|
|
40
53
|
|
|
41
54
|
isContained: function(element, drop) {
|
|
42
|
-
var
|
|
43
|
-
|
|
55
|
+
var containmentNode;
|
|
56
|
+
if(drop.tree) {
|
|
57
|
+
containmentNode = element.treeNode;
|
|
58
|
+
} else {
|
|
59
|
+
containmentNode = element.parentNode;
|
|
60
|
+
}
|
|
61
|
+
return drop._containers.detect(function(c) { return containmentNode == c });
|
|
44
62
|
},
|
|
45
|
-
|
|
63
|
+
|
|
46
64
|
isAffected: function(point, element, drop) {
|
|
47
65
|
return (
|
|
48
66
|
(drop.element!=element) &&
|
|
@@ -68,18 +86,24 @@ var Droppables = {
|
|
|
68
86
|
|
|
69
87
|
show: function(point, element) {
|
|
70
88
|
if(!this.drops.length) return;
|
|
89
|
+
var drop, affected = [];
|
|
71
90
|
|
|
72
|
-
if(this.last_active) this.deactivate(this.last_active);
|
|
73
91
|
this.drops.each( function(drop) {
|
|
74
|
-
if(Droppables.isAffected(point, element, drop))
|
|
75
|
-
|
|
76
|
-
drop.onHover(element, drop.element, Position.overlap(drop.overlap, drop.element));
|
|
77
|
-
if(drop.greedy) {
|
|
78
|
-
Droppables.activate(drop);
|
|
79
|
-
throw $break;
|
|
80
|
-
}
|
|
81
|
-
}
|
|
92
|
+
if(Droppables.isAffected(point, element, drop))
|
|
93
|
+
affected.push(drop);
|
|
82
94
|
});
|
|
95
|
+
|
|
96
|
+
if(affected.length>0)
|
|
97
|
+
drop = Droppables.findDeepestChild(affected);
|
|
98
|
+
|
|
99
|
+
if(this.last_active && this.last_active != drop) this.deactivate(this.last_active);
|
|
100
|
+
if (drop) {
|
|
101
|
+
Position.within(drop.element, point[0], point[1]);
|
|
102
|
+
if(drop.onHover)
|
|
103
|
+
drop.onHover(element, drop.element, Position.overlap(drop.overlap, drop.element));
|
|
104
|
+
|
|
105
|
+
if (drop != this.last_active) Droppables.activate(drop);
|
|
106
|
+
}
|
|
83
107
|
},
|
|
84
108
|
|
|
85
109
|
fire: function(event, element) {
|
|
@@ -87,8 +111,10 @@ var Droppables = {
|
|
|
87
111
|
Position.prepare();
|
|
88
112
|
|
|
89
113
|
if (this.isAffected([Event.pointerX(event), Event.pointerY(event)], element, this.last_active))
|
|
90
|
-
if (this.last_active.onDrop)
|
|
91
|
-
this.last_active.onDrop(element, this.last_active.element, event);
|
|
114
|
+
if (this.last_active.onDrop) {
|
|
115
|
+
this.last_active.onDrop(element, this.last_active.element, event);
|
|
116
|
+
return true;
|
|
117
|
+
}
|
|
92
118
|
},
|
|
93
119
|
|
|
94
120
|
reset: function() {
|
|
@@ -124,11 +150,19 @@ var Draggables = {
|
|
|
124
150
|
},
|
|
125
151
|
|
|
126
152
|
activate: function(draggable) {
|
|
127
|
-
|
|
128
|
-
|
|
153
|
+
if(draggable.options.delay) {
|
|
154
|
+
this._timeout = setTimeout(function() {
|
|
155
|
+
Draggables._timeout = null;
|
|
156
|
+
window.focus();
|
|
157
|
+
Draggables.activeDraggable = draggable;
|
|
158
|
+
}.bind(this), draggable.options.delay);
|
|
159
|
+
} else {
|
|
160
|
+
window.focus(); // allows keypress events if window isn't currently focused, fails for Safari
|
|
161
|
+
this.activeDraggable = draggable;
|
|
162
|
+
}
|
|
129
163
|
},
|
|
130
164
|
|
|
131
|
-
deactivate: function(
|
|
165
|
+
deactivate: function() {
|
|
132
166
|
this.activeDraggable = null;
|
|
133
167
|
},
|
|
134
168
|
|
|
@@ -139,13 +173,19 @@ var Draggables = {
|
|
|
139
173
|
// the same coordinates, prevent needless redrawing (moz bug?)
|
|
140
174
|
if(this._lastPointer && (this._lastPointer.inspect() == pointer.inspect())) return;
|
|
141
175
|
this._lastPointer = pointer;
|
|
176
|
+
|
|
142
177
|
this.activeDraggable.updateDrag(event, pointer);
|
|
143
178
|
},
|
|
144
179
|
|
|
145
180
|
endDrag: function(event) {
|
|
181
|
+
if(this._timeout) {
|
|
182
|
+
clearTimeout(this._timeout);
|
|
183
|
+
this._timeout = null;
|
|
184
|
+
}
|
|
146
185
|
if(!this.activeDraggable) return;
|
|
147
186
|
this._lastPointer = null;
|
|
148
187
|
this.activeDraggable.endDrag(event);
|
|
188
|
+
this.activeDraggable = null;
|
|
149
189
|
},
|
|
150
190
|
|
|
151
191
|
keyPress: function(event) {
|
|
@@ -168,6 +208,7 @@ var Draggables = {
|
|
|
168
208
|
this.observers.each( function(o) {
|
|
169
209
|
if(o[eventName]) o[eventName](eventName, draggable, event);
|
|
170
210
|
});
|
|
211
|
+
if(draggable.options[eventName]) draggable.options[eventName](draggable, event);
|
|
171
212
|
},
|
|
172
213
|
|
|
173
214
|
_cacheObserverCallbacks: function() {
|
|
@@ -181,36 +222,61 @@ var Draggables = {
|
|
|
181
222
|
|
|
182
223
|
/*--------------------------------------------------------------------------*/
|
|
183
224
|
|
|
184
|
-
var Draggable = Class.create(
|
|
185
|
-
Draggable.prototype = {
|
|
225
|
+
var Draggable = Class.create({
|
|
186
226
|
initialize: function(element) {
|
|
187
|
-
var
|
|
227
|
+
var defaults = {
|
|
188
228
|
handle: false,
|
|
189
|
-
starteffect: function(element) {
|
|
190
|
-
new Effect.Opacity(element, {duration:0.2, from:1.0, to:0.7});
|
|
191
|
-
},
|
|
192
229
|
reverteffect: function(element, top_offset, left_offset) {
|
|
193
230
|
var dur = Math.sqrt(Math.abs(top_offset^2)+Math.abs(left_offset^2))*0.02;
|
|
194
|
-
|
|
231
|
+
new Effect.Move(element, { x: -left_offset, y: -top_offset, duration: dur,
|
|
232
|
+
queue: {scope:'_draggable', position:'end'}
|
|
233
|
+
});
|
|
195
234
|
},
|
|
196
|
-
endeffect: function(element) {
|
|
197
|
-
|
|
235
|
+
endeffect: function(element) {
|
|
236
|
+
var toOpacity = Object.isNumber(element._opacity) ? element._opacity : 1.0;
|
|
237
|
+
new Effect.Opacity(element, {duration:0.2, from:0.7, to:toOpacity,
|
|
238
|
+
queue: {scope:'_draggable', position:'end'},
|
|
239
|
+
afterFinish: function(){
|
|
240
|
+
Draggable._dragging[element] = false
|
|
241
|
+
}
|
|
242
|
+
});
|
|
198
243
|
},
|
|
199
244
|
zindex: 1000,
|
|
200
245
|
revert: false,
|
|
201
|
-
|
|
202
|
-
|
|
246
|
+
quiet: false,
|
|
247
|
+
scroll: false,
|
|
248
|
+
scrollSensitivity: 20,
|
|
249
|
+
scrollSpeed: 15,
|
|
250
|
+
snap: false, // false, or xy or [x,y] or function(x,y){ return [x,y] }
|
|
251
|
+
delay: 0
|
|
252
|
+
};
|
|
253
|
+
|
|
254
|
+
if(!arguments[1] || Object.isUndefined(arguments[1].endeffect))
|
|
255
|
+
Object.extend(defaults, {
|
|
256
|
+
starteffect: function(element) {
|
|
257
|
+
element._opacity = Element.getOpacity(element);
|
|
258
|
+
Draggable._dragging[element] = true;
|
|
259
|
+
new Effect.Opacity(element, {duration:0.2, from:element._opacity, to:0.7});
|
|
260
|
+
}
|
|
261
|
+
});
|
|
262
|
+
|
|
263
|
+
var options = Object.extend(defaults, arguments[1] || { });
|
|
203
264
|
|
|
204
265
|
this.element = $(element);
|
|
205
266
|
|
|
206
|
-
if(options.handle && (
|
|
207
|
-
this.handle =
|
|
267
|
+
if(options.handle && Object.isString(options.handle))
|
|
268
|
+
this.handle = this.element.down('.'+options.handle, 0);
|
|
269
|
+
|
|
208
270
|
if(!this.handle) this.handle = $(options.handle);
|
|
209
271
|
if(!this.handle) this.handle = this.element;
|
|
272
|
+
|
|
273
|
+
if(options.scroll && !options.scroll.scrollTo && !options.scroll.outerHTML) {
|
|
274
|
+
options.scroll = $(options.scroll);
|
|
275
|
+
this._isScrollChild = Element.childOf(this.element, options.scroll);
|
|
276
|
+
}
|
|
210
277
|
|
|
211
278
|
Element.makePositioned(this.element); // fix IE
|
|
212
279
|
|
|
213
|
-
this.delta = this.currentDelta();
|
|
214
280
|
this.options = options;
|
|
215
281
|
this.dragging = false;
|
|
216
282
|
|
|
@@ -227,25 +293,23 @@ Draggable.prototype = {
|
|
|
227
293
|
|
|
228
294
|
currentDelta: function() {
|
|
229
295
|
return([
|
|
230
|
-
parseInt(this.element
|
|
231
|
-
parseInt(this.element
|
|
296
|
+
parseInt(Element.getStyle(this.element,'left') || '0'),
|
|
297
|
+
parseInt(Element.getStyle(this.element,'top') || '0')]);
|
|
232
298
|
},
|
|
233
299
|
|
|
234
300
|
initDrag: function(event) {
|
|
301
|
+
if(!Object.isUndefined(Draggable._dragging[this.element]) &&
|
|
302
|
+
Draggable._dragging[this.element]) return;
|
|
235
303
|
if(Event.isLeftClick(event)) {
|
|
236
304
|
// abort on form elements, fixes a Firefox issue
|
|
237
305
|
var src = Event.element(event);
|
|
238
|
-
if(src.tagName && (
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
306
|
+
if((tag_name = src.tagName.toUpperCase()) && (
|
|
307
|
+
tag_name=='INPUT' ||
|
|
308
|
+
tag_name=='SELECT' ||
|
|
309
|
+
tag_name=='OPTION' ||
|
|
310
|
+
tag_name=='BUTTON' ||
|
|
311
|
+
tag_name=='TEXTAREA')) return;
|
|
243
312
|
|
|
244
|
-
if(this.element._revert) {
|
|
245
|
-
this.element._revert.cancel();
|
|
246
|
-
this.element._revert = null;
|
|
247
|
-
}
|
|
248
|
-
|
|
249
313
|
var pointer = [Event.pointerX(event), Event.pointerY(event)];
|
|
250
314
|
var pos = Position.cumulativeOffset(this.element);
|
|
251
315
|
this.offset = [0,1].map( function(i) { return (pointer[i] - pos[i]) });
|
|
@@ -257,6 +321,8 @@ Draggable.prototype = {
|
|
|
257
321
|
|
|
258
322
|
startDrag: function(event) {
|
|
259
323
|
this.dragging = true;
|
|
324
|
+
if(!this.delta)
|
|
325
|
+
this.delta = this.currentDelta();
|
|
260
326
|
|
|
261
327
|
if(this.options.zindex) {
|
|
262
328
|
this.originalZ = parseInt(Element.getStyle(this.element,'z-index') || 0);
|
|
@@ -265,46 +331,101 @@ Draggable.prototype = {
|
|
|
265
331
|
|
|
266
332
|
if(this.options.ghosting) {
|
|
267
333
|
this._clone = this.element.cloneNode(true);
|
|
268
|
-
|
|
334
|
+
this.element._originallyAbsolute = (this.element.getStyle('position') == 'absolute');
|
|
335
|
+
if (!this.element._originallyAbsolute)
|
|
336
|
+
Position.absolutize(this.element);
|
|
269
337
|
this.element.parentNode.insertBefore(this._clone, this.element);
|
|
270
338
|
}
|
|
271
339
|
|
|
340
|
+
if(this.options.scroll) {
|
|
341
|
+
if (this.options.scroll == window) {
|
|
342
|
+
var where = this._getWindowScroll(this.options.scroll);
|
|
343
|
+
this.originalScrollLeft = where.left;
|
|
344
|
+
this.originalScrollTop = where.top;
|
|
345
|
+
} else {
|
|
346
|
+
this.originalScrollLeft = this.options.scroll.scrollLeft;
|
|
347
|
+
this.originalScrollTop = this.options.scroll.scrollTop;
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
|
|
272
351
|
Draggables.notify('onStart', this, event);
|
|
352
|
+
|
|
273
353
|
if(this.options.starteffect) this.options.starteffect(this.element);
|
|
274
354
|
},
|
|
275
355
|
|
|
276
356
|
updateDrag: function(event, pointer) {
|
|
277
357
|
if(!this.dragging) this.startDrag(event);
|
|
278
|
-
|
|
279
|
-
|
|
358
|
+
|
|
359
|
+
if(!this.options.quiet){
|
|
360
|
+
Position.prepare();
|
|
361
|
+
Droppables.show(pointer, this.element);
|
|
362
|
+
}
|
|
363
|
+
|
|
280
364
|
Draggables.notify('onDrag', this, event);
|
|
365
|
+
|
|
281
366
|
this.draw(pointer);
|
|
282
367
|
if(this.options.change) this.options.change(this);
|
|
283
368
|
|
|
369
|
+
if(this.options.scroll) {
|
|
370
|
+
this.stopScrolling();
|
|
371
|
+
|
|
372
|
+
var p;
|
|
373
|
+
if (this.options.scroll == window) {
|
|
374
|
+
with(this._getWindowScroll(this.options.scroll)) { p = [ left, top, left+width, top+height ]; }
|
|
375
|
+
} else {
|
|
376
|
+
p = Position.page(this.options.scroll);
|
|
377
|
+
p[0] += this.options.scroll.scrollLeft + Position.deltaX;
|
|
378
|
+
p[1] += this.options.scroll.scrollTop + Position.deltaY;
|
|
379
|
+
p.push(p[0]+this.options.scroll.offsetWidth);
|
|
380
|
+
p.push(p[1]+this.options.scroll.offsetHeight);
|
|
381
|
+
}
|
|
382
|
+
var speed = [0,0];
|
|
383
|
+
if(pointer[0] < (p[0]+this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[0]+this.options.scrollSensitivity);
|
|
384
|
+
if(pointer[1] < (p[1]+this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[1]+this.options.scrollSensitivity);
|
|
385
|
+
if(pointer[0] > (p[2]-this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[2]-this.options.scrollSensitivity);
|
|
386
|
+
if(pointer[1] > (p[3]-this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[3]-this.options.scrollSensitivity);
|
|
387
|
+
this.startScrolling(speed);
|
|
388
|
+
}
|
|
389
|
+
|
|
284
390
|
// fix AppleWebKit rendering
|
|
285
|
-
if(
|
|
391
|
+
if(Prototype.Browser.WebKit) window.scrollBy(0,0);
|
|
392
|
+
|
|
286
393
|
Event.stop(event);
|
|
287
394
|
},
|
|
288
395
|
|
|
289
396
|
finishDrag: function(event, success) {
|
|
290
397
|
this.dragging = false;
|
|
398
|
+
|
|
399
|
+
if(this.options.quiet){
|
|
400
|
+
Position.prepare();
|
|
401
|
+
var pointer = [Event.pointerX(event), Event.pointerY(event)];
|
|
402
|
+
Droppables.show(pointer, this.element);
|
|
403
|
+
}
|
|
291
404
|
|
|
292
405
|
if(this.options.ghosting) {
|
|
293
|
-
|
|
406
|
+
if (!this.element._originallyAbsolute)
|
|
407
|
+
Position.relativize(this.element);
|
|
408
|
+
delete this.element._originallyAbsolute;
|
|
294
409
|
Element.remove(this._clone);
|
|
295
410
|
this._clone = null;
|
|
296
411
|
}
|
|
297
412
|
|
|
298
|
-
|
|
413
|
+
var dropped = false;
|
|
414
|
+
if(success) {
|
|
415
|
+
dropped = Droppables.fire(event, this.element);
|
|
416
|
+
if (!dropped) dropped = false;
|
|
417
|
+
}
|
|
418
|
+
if(dropped && this.options.onDropped) this.options.onDropped(this.element);
|
|
299
419
|
Draggables.notify('onEnd', this, event);
|
|
300
420
|
|
|
301
421
|
var revert = this.options.revert;
|
|
302
|
-
if(revert &&
|
|
422
|
+
if(revert && Object.isFunction(revert)) revert = revert(this.element);
|
|
303
423
|
|
|
304
424
|
var d = this.currentDelta();
|
|
305
425
|
if(revert && this.options.reverteffect) {
|
|
306
|
-
|
|
307
|
-
|
|
426
|
+
if (dropped == 0 || revert != 'failure')
|
|
427
|
+
this.options.reverteffect(this.element,
|
|
428
|
+
d[1]-this.delta[1], d[0]-this.delta[0]);
|
|
308
429
|
} else {
|
|
309
430
|
this.delta = d;
|
|
310
431
|
}
|
|
@@ -314,40 +435,53 @@ Draggable.prototype = {
|
|
|
314
435
|
|
|
315
436
|
if(this.options.endeffect)
|
|
316
437
|
this.options.endeffect(this.element);
|
|
317
|
-
|
|
438
|
+
|
|
318
439
|
Draggables.deactivate(this);
|
|
319
440
|
Droppables.reset();
|
|
320
441
|
},
|
|
321
442
|
|
|
322
443
|
keyPress: function(event) {
|
|
323
|
-
if(
|
|
444
|
+
if(event.keyCode!=Event.KEY_ESC) return;
|
|
324
445
|
this.finishDrag(event, false);
|
|
325
446
|
Event.stop(event);
|
|
326
447
|
},
|
|
327
448
|
|
|
328
449
|
endDrag: function(event) {
|
|
329
450
|
if(!this.dragging) return;
|
|
451
|
+
this.stopScrolling();
|
|
330
452
|
this.finishDrag(event, true);
|
|
331
453
|
Event.stop(event);
|
|
332
454
|
},
|
|
333
455
|
|
|
334
456
|
draw: function(point) {
|
|
335
457
|
var pos = Position.cumulativeOffset(this.element);
|
|
458
|
+
if(this.options.ghosting) {
|
|
459
|
+
var r = Position.realOffset(this.element);
|
|
460
|
+
pos[0] += r[0] - Position.deltaX; pos[1] += r[1] - Position.deltaY;
|
|
461
|
+
}
|
|
462
|
+
|
|
336
463
|
var d = this.currentDelta();
|
|
337
464
|
pos[0] -= d[0]; pos[1] -= d[1];
|
|
338
465
|
|
|
339
|
-
|
|
466
|
+
if(this.options.scroll && (this.options.scroll != window && this._isScrollChild)) {
|
|
467
|
+
pos[0] -= this.options.scroll.scrollLeft-this.originalScrollLeft;
|
|
468
|
+
pos[1] -= this.options.scroll.scrollTop-this.originalScrollTop;
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
var p = [0,1].map(function(i){
|
|
472
|
+
return (point[i]-pos[i]-this.offset[i])
|
|
473
|
+
}.bind(this));
|
|
340
474
|
|
|
341
475
|
if(this.options.snap) {
|
|
342
|
-
if(
|
|
343
|
-
p = this.options.snap(p[0],p[1]);
|
|
476
|
+
if(Object.isFunction(this.options.snap)) {
|
|
477
|
+
p = this.options.snap(p[0],p[1],this);
|
|
344
478
|
} else {
|
|
345
|
-
if(this.options.snap
|
|
479
|
+
if(Object.isArray(this.options.snap)) {
|
|
346
480
|
p = p.map( function(v, i) {
|
|
347
|
-
return
|
|
481
|
+
return (v/this.options.snap[i]).round()*this.options.snap[i] }.bind(this))
|
|
348
482
|
} else {
|
|
349
483
|
p = p.map( function(v) {
|
|
350
|
-
return
|
|
484
|
+
return (v/this.options.snap).round()*this.options.snap }.bind(this))
|
|
351
485
|
}
|
|
352
486
|
}}
|
|
353
487
|
|
|
@@ -356,14 +490,88 @@ Draggable.prototype = {
|
|
|
356
490
|
style.left = p[0] + "px";
|
|
357
491
|
if((!this.options.constraint) || (this.options.constraint=='vertical'))
|
|
358
492
|
style.top = p[1] + "px";
|
|
493
|
+
|
|
359
494
|
if(style.visibility=="hidden") style.visibility = ""; // fix gecko rendering
|
|
495
|
+
},
|
|
496
|
+
|
|
497
|
+
stopScrolling: function() {
|
|
498
|
+
if(this.scrollInterval) {
|
|
499
|
+
clearInterval(this.scrollInterval);
|
|
500
|
+
this.scrollInterval = null;
|
|
501
|
+
Draggables._lastScrollPointer = null;
|
|
502
|
+
}
|
|
503
|
+
},
|
|
504
|
+
|
|
505
|
+
startScrolling: function(speed) {
|
|
506
|
+
if(!(speed[0] || speed[1])) return;
|
|
507
|
+
this.scrollSpeed = [speed[0]*this.options.scrollSpeed,speed[1]*this.options.scrollSpeed];
|
|
508
|
+
this.lastScrolled = new Date();
|
|
509
|
+
this.scrollInterval = setInterval(this.scroll.bind(this), 10);
|
|
510
|
+
},
|
|
511
|
+
|
|
512
|
+
scroll: function() {
|
|
513
|
+
var current = new Date();
|
|
514
|
+
var delta = current - this.lastScrolled;
|
|
515
|
+
this.lastScrolled = current;
|
|
516
|
+
if(this.options.scroll == window) {
|
|
517
|
+
with (this._getWindowScroll(this.options.scroll)) {
|
|
518
|
+
if (this.scrollSpeed[0] || this.scrollSpeed[1]) {
|
|
519
|
+
var d = delta / 1000;
|
|
520
|
+
this.options.scroll.scrollTo( left + d*this.scrollSpeed[0], top + d*this.scrollSpeed[1] );
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
} else {
|
|
524
|
+
this.options.scroll.scrollLeft += this.scrollSpeed[0] * delta / 1000;
|
|
525
|
+
this.options.scroll.scrollTop += this.scrollSpeed[1] * delta / 1000;
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
Position.prepare();
|
|
529
|
+
Droppables.show(Draggables._lastPointer, this.element);
|
|
530
|
+
Draggables.notify('onDrag', this);
|
|
531
|
+
if (this._isScrollChild) {
|
|
532
|
+
Draggables._lastScrollPointer = Draggables._lastScrollPointer || $A(Draggables._lastPointer);
|
|
533
|
+
Draggables._lastScrollPointer[0] += this.scrollSpeed[0] * delta / 1000;
|
|
534
|
+
Draggables._lastScrollPointer[1] += this.scrollSpeed[1] * delta / 1000;
|
|
535
|
+
if (Draggables._lastScrollPointer[0] < 0)
|
|
536
|
+
Draggables._lastScrollPointer[0] = 0;
|
|
537
|
+
if (Draggables._lastScrollPointer[1] < 0)
|
|
538
|
+
Draggables._lastScrollPointer[1] = 0;
|
|
539
|
+
this.draw(Draggables._lastScrollPointer);
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
if(this.options.change) this.options.change(this);
|
|
543
|
+
},
|
|
544
|
+
|
|
545
|
+
_getWindowScroll: function(w) {
|
|
546
|
+
var T, L, W, H;
|
|
547
|
+
with (w.document) {
|
|
548
|
+
if (w.document.documentElement && documentElement.scrollTop) {
|
|
549
|
+
T = documentElement.scrollTop;
|
|
550
|
+
L = documentElement.scrollLeft;
|
|
551
|
+
} else if (w.document.body) {
|
|
552
|
+
T = body.scrollTop;
|
|
553
|
+
L = body.scrollLeft;
|
|
554
|
+
}
|
|
555
|
+
if (w.innerWidth) {
|
|
556
|
+
W = w.innerWidth;
|
|
557
|
+
H = w.innerHeight;
|
|
558
|
+
} else if (w.document.documentElement && documentElement.clientWidth) {
|
|
559
|
+
W = documentElement.clientWidth;
|
|
560
|
+
H = documentElement.clientHeight;
|
|
561
|
+
} else {
|
|
562
|
+
W = body.offsetWidth;
|
|
563
|
+
H = body.offsetHeight
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
return { top: T, left: L, width: W, height: H };
|
|
360
567
|
}
|
|
361
|
-
}
|
|
568
|
+
});
|
|
569
|
+
|
|
570
|
+
Draggable._dragging = { };
|
|
362
571
|
|
|
363
572
|
/*--------------------------------------------------------------------------*/
|
|
364
573
|
|
|
365
|
-
var SortableObserver = Class.create(
|
|
366
|
-
SortableObserver.prototype = {
|
|
574
|
+
var SortableObserver = Class.create({
|
|
367
575
|
initialize: function(element, observer) {
|
|
368
576
|
this.element = $(element);
|
|
369
577
|
this.observer = observer;
|
|
@@ -379,44 +587,68 @@ SortableObserver.prototype = {
|
|
|
379
587
|
if(this.lastValue != Sortable.serialize(this.element))
|
|
380
588
|
this.observer(this.element)
|
|
381
589
|
}
|
|
382
|
-
}
|
|
590
|
+
});
|
|
383
591
|
|
|
384
592
|
var Sortable = {
|
|
385
|
-
|
|
593
|
+
SERIALIZE_RULE: /^[^_\-](?:[A-Za-z0-9\-\_]*)[_](.*)$/,
|
|
386
594
|
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
595
|
+
sortables: { },
|
|
596
|
+
|
|
597
|
+
_findRootElement: function(element) {
|
|
598
|
+
while (element.tagName.toUpperCase() != "BODY") {
|
|
599
|
+
if(element.id && Sortable.sortables[element.id]) return element;
|
|
600
|
+
element = element.parentNode;
|
|
601
|
+
}
|
|
602
|
+
},
|
|
603
|
+
|
|
604
|
+
options: function(element) {
|
|
605
|
+
element = Sortable._findRootElement($(element));
|
|
606
|
+
if(!element) return;
|
|
607
|
+
return Sortable.sortables[element.id];
|
|
390
608
|
},
|
|
391
609
|
|
|
392
610
|
destroy: function(element){
|
|
393
|
-
|
|
394
|
-
|
|
611
|
+
var s = Sortable.options(element);
|
|
612
|
+
|
|
613
|
+
if(s) {
|
|
395
614
|
Draggables.removeObserver(s.element);
|
|
396
615
|
s.droppables.each(function(d){ Droppables.remove(d) });
|
|
397
616
|
s.draggables.invoke('destroy');
|
|
398
|
-
|
|
399
|
-
|
|
617
|
+
|
|
618
|
+
delete Sortable.sortables[s.element.id];
|
|
619
|
+
}
|
|
400
620
|
},
|
|
401
|
-
|
|
621
|
+
|
|
402
622
|
create: function(element) {
|
|
403
623
|
element = $(element);
|
|
404
624
|
var options = Object.extend({
|
|
405
625
|
element: element,
|
|
406
626
|
tag: 'li', // assumes li children, override with tag: 'tagname'
|
|
407
627
|
dropOnEmpty: false,
|
|
408
|
-
tree: false,
|
|
628
|
+
tree: false,
|
|
629
|
+
treeTag: 'ul',
|
|
409
630
|
overlap: 'vertical', // one of 'vertical', 'horizontal'
|
|
410
631
|
constraint: 'vertical', // one of 'vertical', 'horizontal', false
|
|
411
632
|
containment: element, // also takes array of elements (or id's); or false
|
|
412
633
|
handle: false, // or a CSS class
|
|
413
634
|
only: false,
|
|
635
|
+
delay: 0,
|
|
414
636
|
hoverclass: null,
|
|
415
637
|
ghosting: false,
|
|
416
|
-
|
|
638
|
+
quiet: false,
|
|
639
|
+
scroll: false,
|
|
640
|
+
scrollSensitivity: 20,
|
|
641
|
+
scrollSpeed: 15,
|
|
642
|
+
format: this.SERIALIZE_RULE,
|
|
643
|
+
|
|
644
|
+
// these take arrays of elements or ids and can be
|
|
645
|
+
// used for better initialization performance
|
|
646
|
+
elements: false,
|
|
647
|
+
handles: false,
|
|
648
|
+
|
|
417
649
|
onChange: Prototype.emptyFunction,
|
|
418
650
|
onUpdate: Prototype.emptyFunction
|
|
419
|
-
}, arguments[1] || {});
|
|
651
|
+
}, arguments[1] || { });
|
|
420
652
|
|
|
421
653
|
// clear any old sortable with same element
|
|
422
654
|
this.destroy(element);
|
|
@@ -424,6 +656,11 @@ var Sortable = {
|
|
|
424
656
|
// build options for the draggables
|
|
425
657
|
var options_for_draggable = {
|
|
426
658
|
revert: true,
|
|
659
|
+
quiet: options.quiet,
|
|
660
|
+
scroll: options.scroll,
|
|
661
|
+
scrollSpeed: options.scrollSpeed,
|
|
662
|
+
scrollSensitivity: options.scrollSensitivity,
|
|
663
|
+
delay: options.delay,
|
|
427
664
|
ghosting: options.ghosting,
|
|
428
665
|
constraint: options.constraint,
|
|
429
666
|
handle: options.handle };
|
|
@@ -449,9 +686,16 @@ var Sortable = {
|
|
|
449
686
|
var options_for_droppable = {
|
|
450
687
|
overlap: options.overlap,
|
|
451
688
|
containment: options.containment,
|
|
689
|
+
tree: options.tree,
|
|
452
690
|
hoverclass: options.hoverclass,
|
|
453
|
-
onHover: Sortable.onHover
|
|
454
|
-
|
|
691
|
+
onHover: Sortable.onHover
|
|
692
|
+
}
|
|
693
|
+
|
|
694
|
+
var options_for_tree = {
|
|
695
|
+
onHover: Sortable.onEmptyHover,
|
|
696
|
+
overlap: options.overlap,
|
|
697
|
+
containment: options.containment,
|
|
698
|
+
hoverclass: options.hoverclass
|
|
455
699
|
}
|
|
456
700
|
|
|
457
701
|
// fix for gecko engine
|
|
@@ -460,27 +704,32 @@ var Sortable = {
|
|
|
460
704
|
options.draggables = [];
|
|
461
705
|
options.droppables = [];
|
|
462
706
|
|
|
463
|
-
// make it so
|
|
464
|
-
|
|
465
707
|
// drop on empty handling
|
|
466
|
-
if(options.dropOnEmpty) {
|
|
467
|
-
Droppables.add(element,
|
|
468
|
-
{containment: options.containment, onHover: Sortable.onEmptyHover, greedy: false});
|
|
708
|
+
if(options.dropOnEmpty || options.tree) {
|
|
709
|
+
Droppables.add(element, options_for_tree);
|
|
469
710
|
options.droppables.push(element);
|
|
470
711
|
}
|
|
471
712
|
|
|
472
|
-
(this.findElements(element, options) || []).each( function(e) {
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
Element.childrenWithClassName(e, options.handle)[0] : e;
|
|
713
|
+
(options.elements || this.findElements(element, options) || []).each( function(e,i) {
|
|
714
|
+
var handle = options.handles ? $(options.handles[i]) :
|
|
715
|
+
(options.handle ? $(e).select('.' + options.handle)[0] : e);
|
|
476
716
|
options.draggables.push(
|
|
477
717
|
new Draggable(e, Object.extend(options_for_draggable, { handle: handle })));
|
|
478
718
|
Droppables.add(e, options_for_droppable);
|
|
719
|
+
if(options.tree) e.treeNode = element;
|
|
479
720
|
options.droppables.push(e);
|
|
480
721
|
});
|
|
722
|
+
|
|
723
|
+
if(options.tree) {
|
|
724
|
+
(Sortable.findTreeElements(element, options) || []).each( function(e) {
|
|
725
|
+
Droppables.add(e, options_for_tree);
|
|
726
|
+
e.treeNode = element;
|
|
727
|
+
options.droppables.push(e);
|
|
728
|
+
});
|
|
729
|
+
}
|
|
481
730
|
|
|
482
731
|
// keep reference
|
|
483
|
-
this.sortables.
|
|
732
|
+
this.sortables[element.id] = options;
|
|
484
733
|
|
|
485
734
|
// for onupdate
|
|
486
735
|
Draggables.addObserver(new SortableObserver(element, options.onUpdate));
|
|
@@ -489,23 +738,21 @@ var Sortable = {
|
|
|
489
738
|
|
|
490
739
|
// return all suitable-for-sortable elements in a guaranteed order
|
|
491
740
|
findElements: function(element, options) {
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
var grandchildren = this.findElements(e, options);
|
|
500
|
-
if(grandchildren) elements.push(grandchildren);
|
|
501
|
-
}
|
|
502
|
-
});
|
|
503
|
-
|
|
504
|
-
return (elements.length>0 ? elements.flatten() : null);
|
|
741
|
+
return Element.findChildren(
|
|
742
|
+
element, options.only, options.tree ? true : false, options.tag);
|
|
743
|
+
},
|
|
744
|
+
|
|
745
|
+
findTreeElements: function(element, options) {
|
|
746
|
+
return Element.findChildren(
|
|
747
|
+
element, options.only, options.tree ? true : false, options.treeTag);
|
|
505
748
|
},
|
|
506
749
|
|
|
507
750
|
onHover: function(element, dropon, overlap) {
|
|
508
|
-
if(
|
|
751
|
+
if(Element.isParent(dropon, element)) return;
|
|
752
|
+
|
|
753
|
+
if(overlap > .33 && overlap < .66 && Sortable.options(dropon).tree) {
|
|
754
|
+
return;
|
|
755
|
+
} else if(overlap>0.5) {
|
|
509
756
|
Sortable.mark(dropon, 'before');
|
|
510
757
|
if(dropon.previousSibling != element) {
|
|
511
758
|
var oldParentNode = element.parentNode;
|
|
@@ -528,18 +775,42 @@ var Sortable = {
|
|
|
528
775
|
}
|
|
529
776
|
}
|
|
530
777
|
},
|
|
531
|
-
|
|
532
|
-
onEmptyHover: function(element, dropon) {
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
778
|
+
|
|
779
|
+
onEmptyHover: function(element, dropon, overlap) {
|
|
780
|
+
var oldParentNode = element.parentNode;
|
|
781
|
+
var droponOptions = Sortable.options(dropon);
|
|
782
|
+
|
|
783
|
+
if(!Element.isParent(dropon, element)) {
|
|
784
|
+
var index;
|
|
785
|
+
|
|
786
|
+
var children = Sortable.findElements(dropon, {tag: droponOptions.tag, only: droponOptions.only});
|
|
787
|
+
var child = null;
|
|
788
|
+
|
|
789
|
+
if(children) {
|
|
790
|
+
var offset = Element.offsetSize(dropon, droponOptions.overlap) * (1.0 - overlap);
|
|
791
|
+
|
|
792
|
+
for (index = 0; index < children.length; index += 1) {
|
|
793
|
+
if (offset - Element.offsetSize (children[index], droponOptions.overlap) >= 0) {
|
|
794
|
+
offset -= Element.offsetSize (children[index], droponOptions.overlap);
|
|
795
|
+
} else if (offset - (Element.offsetSize (children[index], droponOptions.overlap) / 2) >= 0) {
|
|
796
|
+
child = index + 1 < children.length ? children[index + 1] : null;
|
|
797
|
+
break;
|
|
798
|
+
} else {
|
|
799
|
+
child = children[index];
|
|
800
|
+
break;
|
|
801
|
+
}
|
|
802
|
+
}
|
|
803
|
+
}
|
|
804
|
+
|
|
805
|
+
dropon.insertBefore(element, child);
|
|
806
|
+
|
|
536
807
|
Sortable.options(oldParentNode).onChange(element);
|
|
537
|
-
|
|
808
|
+
droponOptions.onChange(element);
|
|
538
809
|
}
|
|
539
810
|
},
|
|
540
811
|
|
|
541
812
|
unmark: function() {
|
|
542
|
-
if(Sortable._marker)
|
|
813
|
+
if(Sortable._marker) Sortable._marker.hide();
|
|
543
814
|
},
|
|
544
815
|
|
|
545
816
|
mark: function(dropon, position) {
|
|
@@ -548,37 +819,154 @@ var Sortable = {
|
|
|
548
819
|
if(sortable && !sortable.ghosting) return;
|
|
549
820
|
|
|
550
821
|
if(!Sortable._marker) {
|
|
551
|
-
Sortable._marker =
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
Sortable._marker.style.position = 'absolute';
|
|
822
|
+
Sortable._marker =
|
|
823
|
+
($('dropmarker') || Element.extend(document.createElement('DIV'))).
|
|
824
|
+
hide().addClassName('dropmarker').setStyle({position:'absolute'});
|
|
555
825
|
document.getElementsByTagName("body").item(0).appendChild(Sortable._marker);
|
|
556
826
|
}
|
|
557
827
|
var offsets = Position.cumulativeOffset(dropon);
|
|
558
|
-
Sortable._marker.
|
|
559
|
-
Sortable._marker.style.top = offsets[1] + 'px';
|
|
828
|
+
Sortable._marker.setStyle({left: offsets[0]+'px', top: offsets[1] + 'px'});
|
|
560
829
|
|
|
561
830
|
if(position=='after')
|
|
562
831
|
if(sortable.overlap == 'horizontal')
|
|
563
|
-
Sortable._marker.
|
|
832
|
+
Sortable._marker.setStyle({left: (offsets[0]+dropon.clientWidth) + 'px'});
|
|
564
833
|
else
|
|
565
|
-
Sortable._marker.
|
|
834
|
+
Sortable._marker.setStyle({top: (offsets[1]+dropon.clientHeight) + 'px'});
|
|
566
835
|
|
|
567
|
-
|
|
836
|
+
Sortable._marker.show();
|
|
568
837
|
},
|
|
838
|
+
|
|
839
|
+
_tree: function(element, options, parent) {
|
|
840
|
+
var children = Sortable.findElements(element, options) || [];
|
|
841
|
+
|
|
842
|
+
for (var i = 0; i < children.length; ++i) {
|
|
843
|
+
var match = children[i].id.match(options.format);
|
|
569
844
|
|
|
570
|
-
|
|
845
|
+
if (!match) continue;
|
|
846
|
+
|
|
847
|
+
var child = {
|
|
848
|
+
id: encodeURIComponent(match ? match[1] : null),
|
|
849
|
+
element: element,
|
|
850
|
+
parent: parent,
|
|
851
|
+
children: [],
|
|
852
|
+
position: parent.children.length,
|
|
853
|
+
container: $(children[i]).down(options.treeTag)
|
|
854
|
+
}
|
|
855
|
+
|
|
856
|
+
/* Get the element containing the children and recurse over it */
|
|
857
|
+
if (child.container)
|
|
858
|
+
this._tree(child.container, options, child)
|
|
859
|
+
|
|
860
|
+
parent.children.push (child);
|
|
861
|
+
}
|
|
862
|
+
|
|
863
|
+
return parent;
|
|
864
|
+
},
|
|
865
|
+
|
|
866
|
+
tree: function(element) {
|
|
571
867
|
element = $(element);
|
|
572
868
|
var sortableOptions = this.options(element);
|
|
573
869
|
var options = Object.extend({
|
|
574
|
-
tag:
|
|
870
|
+
tag: sortableOptions.tag,
|
|
871
|
+
treeTag: sortableOptions.treeTag,
|
|
575
872
|
only: sortableOptions.only,
|
|
576
873
|
name: element.id,
|
|
577
|
-
format: sortableOptions.format
|
|
578
|
-
}, arguments[1] || {});
|
|
874
|
+
format: sortableOptions.format
|
|
875
|
+
}, arguments[1] || { });
|
|
876
|
+
|
|
877
|
+
var root = {
|
|
878
|
+
id: null,
|
|
879
|
+
parent: null,
|
|
880
|
+
children: [],
|
|
881
|
+
container: element,
|
|
882
|
+
position: 0
|
|
883
|
+
}
|
|
884
|
+
|
|
885
|
+
return Sortable._tree(element, options, root);
|
|
886
|
+
},
|
|
887
|
+
|
|
888
|
+
/* Construct a [i] index for a particular node */
|
|
889
|
+
_constructIndex: function(node) {
|
|
890
|
+
var index = '';
|
|
891
|
+
do {
|
|
892
|
+
if (node.id) index = '[' + node.position + ']' + index;
|
|
893
|
+
} while ((node = node.parent) != null);
|
|
894
|
+
return index;
|
|
895
|
+
},
|
|
896
|
+
|
|
897
|
+
sequence: function(element) {
|
|
898
|
+
element = $(element);
|
|
899
|
+
var options = Object.extend(this.options(element), arguments[1] || { });
|
|
900
|
+
|
|
579
901
|
return $(this.findElements(element, options) || []).map( function(item) {
|
|
580
|
-
return (
|
|
581
|
-
|
|
582
|
-
|
|
902
|
+
return item.id.match(options.format) ? item.id.match(options.format)[1] : '';
|
|
903
|
+
});
|
|
904
|
+
},
|
|
905
|
+
|
|
906
|
+
setSequence: function(element, new_sequence) {
|
|
907
|
+
element = $(element);
|
|
908
|
+
var options = Object.extend(this.options(element), arguments[2] || { });
|
|
909
|
+
|
|
910
|
+
var nodeMap = { };
|
|
911
|
+
this.findElements(element, options).each( function(n) {
|
|
912
|
+
if (n.id.match(options.format))
|
|
913
|
+
nodeMap[n.id.match(options.format)[1]] = [n, n.parentNode];
|
|
914
|
+
n.parentNode.removeChild(n);
|
|
915
|
+
});
|
|
916
|
+
|
|
917
|
+
new_sequence.each(function(ident) {
|
|
918
|
+
var n = nodeMap[ident];
|
|
919
|
+
if (n) {
|
|
920
|
+
n[1].appendChild(n[0]);
|
|
921
|
+
delete nodeMap[ident];
|
|
922
|
+
}
|
|
923
|
+
});
|
|
924
|
+
},
|
|
925
|
+
|
|
926
|
+
serialize: function(element) {
|
|
927
|
+
element = $(element);
|
|
928
|
+
var options = Object.extend(Sortable.options(element), arguments[1] || { });
|
|
929
|
+
var name = encodeURIComponent(
|
|
930
|
+
(arguments[1] && arguments[1].name) ? arguments[1].name : element.id);
|
|
931
|
+
|
|
932
|
+
if (options.tree) {
|
|
933
|
+
return Sortable.tree(element, arguments[1]).children.map( function (item) {
|
|
934
|
+
return [name + Sortable._constructIndex(item) + "[id]=" +
|
|
935
|
+
encodeURIComponent(item.id)].concat(item.children.map(arguments.callee));
|
|
936
|
+
}).flatten().join('&');
|
|
937
|
+
} else {
|
|
938
|
+
return Sortable.sequence(element, arguments[1]).map( function(item) {
|
|
939
|
+
return name + "[]=" + encodeURIComponent(item);
|
|
940
|
+
}).join('&');
|
|
941
|
+
}
|
|
583
942
|
}
|
|
584
|
-
}
|
|
943
|
+
}
|
|
944
|
+
|
|
945
|
+
// Returns true if child is contained within element
|
|
946
|
+
Element.isParent = function(child, element) {
|
|
947
|
+
if (!child.parentNode || child == element) return false;
|
|
948
|
+
if (child.parentNode == element) return true;
|
|
949
|
+
return Element.isParent(child.parentNode, element);
|
|
950
|
+
}
|
|
951
|
+
|
|
952
|
+
Element.findChildren = function(element, only, recursive, tagName) {
|
|
953
|
+
if(!element.hasChildNodes()) return null;
|
|
954
|
+
tagName = tagName.toUpperCase();
|
|
955
|
+
if(only) only = [only].flatten();
|
|
956
|
+
var elements = [];
|
|
957
|
+
$A(element.childNodes).each( function(e) {
|
|
958
|
+
if(e.tagName && e.tagName.toUpperCase()==tagName &&
|
|
959
|
+
(!only || (Element.classNames(e).detect(function(v) { return only.include(v) }))))
|
|
960
|
+
elements.push(e);
|
|
961
|
+
if(recursive) {
|
|
962
|
+
var grandchildren = Element.findChildren(e, only, recursive, tagName);
|
|
963
|
+
if(grandchildren) elements.push(grandchildren);
|
|
964
|
+
}
|
|
965
|
+
});
|
|
966
|
+
|
|
967
|
+
return (elements.length>0 ? elements.flatten() : []);
|
|
968
|
+
}
|
|
969
|
+
|
|
970
|
+
Element.offsetSize = function (element, type) {
|
|
971
|
+
return element['offset' + ((type=='vertical' || type=='height') ? 'Height' : 'Width')];
|
|
972
|
+
}
|