
	Element.addMethods({
					   
			__extend: function(element, hash) {
				return Object.extend($(element), hash);
			},
						
			ParentByClass: function(element,className) {
				var parent = element.parentNode;
				if(parent && !parent.hasClassName('body')){
					while(!parent.hasClassName('body') && !parent.hasClassName(className)){ parent = parent.parentNode; }
					return parent;
				} else {
					return false;
				}
			},
			
			liveEdit: function(e,options) {				
				new Rhitmo.UI.LiveEdit(e,options);
			},
			
			
			AddContextMenu: function(element,menuID,menuItems){
				element.observe(Prototype.Browser.Opera ? 'click' : 'contextmenu', function(e){
					if (Prototype.Browser.Opera && !e.shiftKey) {
						return;
					}
					Rhitmo.Objects.ContextMenu[menuID].Show(e,menuItems);
				}.bind(this));	
			},
			
			disableSelection : function(element) {
			    element.onselectstart = function(){ return false; };
			    element.unselectable = "on";
			    element.style.MozUserSelect = "none";
			    element.style.cursor = "default";
			}
			
	});


	function getZindex() {
		var maxIndex = 0;
		$$('div','p','img','span','li','ul','dd','dl','dt','ol').each(function(item){				
			zIndex = Number(item.getStyle('z-index'));
			if(zIndex > maxIndex) maxIndex = zIndex; 											  
		});
		return maxIndex;
	}
	
	
	function AddDND(element, options)
	{
		if(!element.hasClassName('dragable')) element.addClassName('dragable');
		var object = !options.handle ? element : element.getElementsBySelector(options.handle)[0];
		if(object){			
			object.onmousedown = function(){ return false; }
			object.observe('mousedown', function(event){
				new DnD(event, options); 	
				//alert('he');
			});				
		}
	}
			
	DnD = Class.create({						
		
		initialize: function(event,options) {																				
			if(Event.isLeftClick(event)) {		
					
				this.options = Object.extend({
					type: 'normal',	
					onDrag: function(){},
					onDrop: function(){},
					onMove: function(){},						
					realObject: null
				}, options || {});
				this.onDragEnd = function(){};
			
				this.object = Event.element(event);
			
				this.object = Event.element(event);
				this.object = this.object.hasClassName('dragable') ? this.object : this.object.ParentByClass('dragable') ;
				this.options.realObject = this.object;			
				
				this.SetDragType(this.options.type);
				
				/*var maxIndex = getZindex();
				if(this.object.getStyle('z-index') != maxIndex) {						
					this.object.setStyle({ zIndex:(maxIndex+1)});
				};*/
				
				this.object.setStyle({ zIndex: 500 });
				
				this.oX = this.object.offsetLeft;
				this.oY = this.object.offsetTop;
				this.eX = Event.pointerX(event); 
				this.eY = Event.pointerY(event);
				this.tX, this.tY;																	

				this.eventMouseMove = this.Drag.bindAsEventListener(this);					
				document.observe('mousemove', this.eventMouseMove); 
				
				this.eventMouseUp = this.Drop.bindAsEventListener(this);
				document.observe('mouseup', this.eventMouseUp);
				
				document.body.insert('<div id="dnd_layer"><!-- --></div>');
				
				this.options.onDrag(this);
								
			} 
			
			else if(options.onRightClick) {
				options.onRightClick(event,options);	
			}
				
		},
		
		Drag: function(e) {	
			this.object.setStyle({
				top: (this.tX=Event.pointerY(e)+this.oY-this.eY+'px'), 
				left: (this.tY=Event.pointerX(e)+this.oX-this.eX+'px')
			});
			this.options.onMove(this);
		},
		
		Drop: function(e) {				
			Event.stopObserving(document, 'mousemove', this.eventMouseMove); 
			Event.stopObserving(document, 'mouseup', this.eventMouseUp);
			$('dnd_layer').remove();
			this.onDragEnd();
			this.options.onDrop(this);				
		},
		
		SetDragType: function(type){
			switch(type){				
				case 'clone':
					this.object = this.object.Clone(function(n){if(n.id)n.id='clone_'+n.id;return n;});
					this.object.setOpacity(0.5);									
					this.onDragEnd = this.SetRealPosition;
					$(document.body).insert(this.object);	
					break;
					
				case 'transparent':
					this.object = new Element('div').setStyle({ 
						position: 'absolute',
						width: this.options.realObject.getDimensions().width+'px', 
						height: this.options.realObject.getDimensions().height+'px', 	
						top: this.options.realObject.getStyle('top'), 
						left: this.options.realObject.getStyle('left'),
						border: '1px solid #AAA'
					});												
					this.onDragEnd = this.SetRealPosition;	
					$(document.body).insert(this.object);												
					break;
			}
		},
		
		SetRealPosition: function(){
			this.options.realObject.setStyle({ 
				top: this.object.getStyle('top'), 
				left: this.object.getStyle('left'),
				zIndex: this.object.getStyle('z-index')
			});
			this.object.remove();
		}
		
	}); // end of modul