var DraggableToy = Class.create(Draggable,{
	element_width: 0,
	element_height: 0,
	initialize: function($super, element){
		$super(element);
		Object.extend(this.options, arguments[2] || { });
		this.element_height = this.element.getHeight();
		this.element_width = this.element.getWidth();
		var qickly_reverteffect = {
				reverteffect: function(element, top_offset, left_offset) {
					new Effect.Move(element, { x: -left_offset, y: -top_offset, duration: 0.3, queue: {scope:'_draggable', position:'end'}});
					if (element.hasClassName('user_toy')){
						toys_left_in_conteiner++;
						if ($('edit_tree_more_toys').visible()) new Effect.Fade('edit_tree_more_toys');
					}
					if (element.hasClassName('user_gift')){
						gifts_left_in_conteiner++;
						if ($('edit_tree_more_gifts').visible()) new Effect.Fade('edit_tree_more_gifts');
					}
				}
			}
		Object.extend(this.options, qickly_reverteffect);
	},
	isInWorkspace: function() {
		var current_element_position = this.element.positionedOffset();
		if (current_element_position.top<this.options.workspace_y1||current_element_position.left<this.options.workspace_x1||
			(current_element_position.top+this.element_height)>this.options.workspace_y2||
			(current_element_position.left+this.element_width)>this.options.workspace_x2) return false
		else return true;
	},
	getToyPosition: function(){
		var current_element_position = this.element.positionedOffset();
		var x = current_element_position.left-this.options.workspace_x1;
		var y = current_element_position.top-this.options.workspace_y1;
		var result = [x,y];
		result.x = x;
		result.y = y;
		return result;
	},
	finishDrag: function(event, success) {
	    this.dragging = false;
	
	    if(this.options.quiet){
	      Position.prepare();
	      var pointer = [Event.pointerX(event), Event.pointerY(event)];
	      Droppables.show(pointer, this.element);
	    }
	
	    if(this.options.ghosting) {
	      if (!this._originallyAbsolute)
	        Position.relativize(this.element);
	      delete this._originallyAbsolute;
	      Element.remove(this._clone);
	      this._clone = null;
	    }
	
	    var dropped = false;
	    if(success) {
	      dropped = Droppables.fire(event, this.element);
	      if (!dropped) dropped = false;
	    }
	    if(dropped && this.options.onDropped) this.options.onDropped(this.element);
	    Draggables.notify('onEnd', this, event);
	
	    var revert = this.options.revert;
	    if(revert && Object.isFunction(revert)) revert = revert(this.element);
	    
	    var current_element_position = this.element.positionedOffset();
	    if (current_element_position.top<this.options.workspace_y1||current_element_position.left<this.options.workspace_x1||
	    	(current_element_position.top+this.element_height)>this.options.workspace_y2||
	    	(current_element_position.left+this.element_width)>this.options.workspace_x2){
	    	this.element.relativize();
	    	this.options.reverteffect(this.element, parseInt(this.element.getStyle('top')), parseInt(this.element.getStyle('left')));
	    }else{
	    	if (this.element.hasClassName('user_toy')){
				toys_left_in_conteiner--;
				if (toys_left_in_conteiner==0) new Effect.Appear('edit_tree_more_toys');
			}
			if (this.element.hasClassName('user_gift')){
				gifts_left_in_conteiner--;
				if (gifts_left_in_conteiner==0) new Effect.Appear('edit_tree_more_gifts');
			}
	    	this.element.absolutize();
	    }
	
	    var d = this.currentDelta();
	    if(revert && this.options.reverteffect) {
	      if (dropped == 0 || revert != 'failure')
	        this.options.reverteffect(this.element,
	          d[1]-this.delta[1], d[0]-this.delta[0]);
	    } else {
	      this.delta = d;
	    }
	
	    if(this.options.zindex)
	      this.element.style.zIndex = this.originalZ;
	
	    if(this.options.endeffect)
	      this.options.endeffect(this.element);
	
	    Draggables.deactivate(this);
	    Droppables.reset();
  	}
})