Ok, finally, I think I got it know.
For thoses who are interested, I use the "SubsDraggable" code found in
the ticket 5771, with some modifications (adapted to Prototype 1.6,
and :
// extentions for scriptaculous dragdrop.js
function getDragElement(element)
{
var el = element.cloneNode(true);
el.id = 'sub'+
element.id;
el.style.position = 'relative';
document.body.appendChild(el);
return el;
}
var SubsDraggable = Class.create(Draggable, {
initialize: function($super, element) {
var options = arguments[2] || {};
$super(element,options);
if( typeof(this.options.dragelement) == 'undefined' )
this.options.dragelement = false;
},
initDrag: function(event) {
if(!Object.isUndefined(Draggable._dragging[this.element]) &&
Draggable._dragging[this.element]) return;
if(Event.isLeftClick(event)) {
// abort on form elements, fixes a Firefox issue
var src = Event.element(event);
if((tag_name = src.tagName.toUpperCase()) && (
tag_name=='INPUT' ||
tag_name=='SELECT' ||
tag_name=='OPTION' ||
tag_name=='BUTTON' ||
tag_name=='TEXTAREA')) return;
var pointer = [Event.pointerX(event), Event.pointerY(event)];
// HERE are my modifications to calculate the
new clone position. I'm not sure if there is an easier method, but
this one seems to work.
var pos = this.element.cumulativeOffset();
var scroll = this.element.cumulativeScrollOffset();
var vpscroll= document.viewport.getScrollOffsets();
this.offset = [0,1].map( function(i) { return (pointer[i] - pos[i]
+ scroll[i] - vpscroll[i] ) });
Draggables.activate(this);
Event.stop(event);
}
},
startDrag: function($super, event) {
if( this.options.dragelement ){
this._originalElement = this.element;
this.element = this.options.dragelement(this.element);
Position.absolutize(this.element);
Position.clone(this._originalElement, this.element);
}
$super(event);
},
finishDrag: function($super, event, success) {
$super(event, success);
if(this.options.dragelement){
Element.remove(this.element);
this.element = this._originalElement;
this._originalElement = null;
}
}
})
My draggables are now initialized like this :
new SubsDraggable('elementid', { dragElement: getDragElement, ...});
Regards,
Tof.