/**
 * @author Szymon
 * 
 * http://www.quirksmode.org/sitemap.html
 */


var dragCore = {
	keyHTML: '<a href="#" class="keyLink">#</a>',
	keySpeed: 10, // pixels per keypress event
	initialMouseX: undefined,
	initialMouseY: undefined,
	startX: undefined,
	startY: undefined,
	dXKeys: undefined,
	dYKeys: undefined,
	draggedObject: undefined,
	
	init: function (el,parentEl) {
		var element = codexd.$cc(el);
		this.prnt = (codexd.defined(parentEl))?parentEl:element.parentNode
		element.style.cursor = 'move';
			
		this.prnt.style.left = this.prnt.offsetLeft + 'px';
		this.prnt.style.top = this.prnt.offsetTop + 'px';
		element.onmousedown = dragCore.dragByMouse;
		
		/*element.innerHTML += dragCore.keyHTML;
		var links = element.getElementsByTagName('a');
		var lastLink = links[links.length-1];
		lastLink.relatedElement = element;
		lastLink.onclick = dragCore.dragByKey;*/
	},
	
	dragByMouse: function (e) {
		dragCore.startDrag(dragCore.prnt); // zmienic na this jesli dla elementu
		var evt = e || window.event;
		dragCore.initialMouseX = evt.clientX;
		dragCore.initialMouseY = evt.clientY;
		codexd.addEvent(document,'mousemove',dragCore.dragMouse);
		codexd.addEvent(document,'mouseup',dragCore.releaseElement);
		return false;
	},
	
	dragByKey: function () {
		dragCore.startDrag(this.relatedElement);
		dragCore.dXKeys = dragCore.dYKeys = 0;
		codexd.addEvent(document,'keydown',dragCore.dragKeys);
		codexd.addEvent(document,'keypress',dragCore.switchKeyEvents);
		this.blur();
		return false;
	},
	startDrag: function (obj) {
		if (dragCore.draggedObject)
			dragCore.releaseElement();
		dragCore.startX = obj.offsetLeft;
		dragCore.startY = obj.offsetTop;
		dragCore.draggedObject = obj;
		obj.className += ' dragged';
	},
	
	dragMouse: function (e) {
		dragCore.draggedObject.style.position = 'absolute';
		var evt = e || window.event;
		var dX = evt.clientX - dragCore.initialMouseX;
		var dY = evt.clientY - dragCore.initialMouseY;
			dragCore.setPosition(dX,dY);
		return false;
	},
	
	dragKeys: function(e) {
		var evt = e || window.event;
		var key = evt.keyCode;
		switch (key) {
			case 37:	// left
			case 63234:
				dragCore.dXKeys -= dragCore.keySpeed;
				break;
			case 38:	// up
			case 63232:
				dragCore.dYKeys -= dragCore.keySpeed;
				break;
			case 39:	// right
			case 63235:
				dragCore.dXKeys += dragCore.keySpeed;
				break;
			case 40:	// down
			case 63233:
				dragCore.dYKeys += dragCore.keySpeed;
				break;
			case 13: 	// enter
			case 27: 	// escape
				dragCore.releaseElement();
				return false;
			default:
				return true;
		}
		dragCore.setPosition(dragCore.dXKeys,dragCore.dYKeys);
		if (evt.preventDefault) evt.preventDefault();
		return false;
	},
	setPosition: function (dx,dy) {
		dragCore.draggedObject.style.left = dragCore.startX + dx + 'px';
		dragCore.draggedObject.style.top = dragCore.startY + dy + 'px';
	},
	switchKeyEvents: function () {
		// for Opera and Safari 1.3
		codexd.rmEvent(document,'keydown',dragCore.dragKeys);
		codexd.rmEvent(document,'keypress',dragCore.switchKeyEvents);
		codexd.addEvent(document,'keypress',dragCore.dragKeys);
	},
	releaseElement: function() {		
		codexd.rmEvent(document,'mousemove',dragCore.dragMouse);
		codexd.rmEvent(document,'mouseup',dragCore.releaseElement);
		codexd.rmEvent(document,'keypress',dragCore.dragKeys);
		codexd.rmEvent(document,'keypress',dragCore.switchKeyEvents);
		codexd.rmEvent(document,'keydown',dragCore.dragKeys);
		dragCore.draggedObject.className = dragCore.draggedObject.className.replace(/dragged/g,'');
		dragCore.draggedObject.style.position = '';
		dragCore.draggedObject = null;
	}
}
/*
var dropCore ={
	init:function(){
        if(activeCont){ 
218	            // beforeNode will hold the first node AFTER where our div belongs 
219	            var beforeNode = null; 
220	 
221	            // loop through each child node (skipping text nodes). 
222	            for(var i=activeCont.childNodes.length-1; i>=0; i--){ 
223	                with(activeCont.childNodes[i]){ 
224	                    if(nodeName=='#text') continue; 
225	 
226	                    // if the current item is "After" the item being dragged 
227	                    if( 
228	                        curTarget != activeCont.childNodes[i]                              && 
229	                        ((getAttribute('startLeft') + getAttribute('startWidth'))  > xPos) && 
230	                        ((getAttribute('startTop')  + getAttribute('startHeight')) > yPos)){ 
231	                            beforeNode = activeCont.childNodes[i]; 
232	                    } 
233	                } 
234	            } 
235	 
236	            // the item being dragged belongs before another item 
237	            if(beforeNode){ 
238	                if(beforeNode!=curTarget.nextSibling){ 
239	                    activeCont.insertBefore(curTarget, beforeNode); 
240	                } 
241	 
242	            // the item being dragged belongs at the end of the current container 
243	            } else { 
244	                if((curTarget.nextSibling) || (curTarget.parentNode!=activeCont)){ 
245	                    activeCont.appendChild(curTarget); 
246	                } 
247	            } 
248	 
249	            // make our drag item visible 
250	            if(curTarget.style.display!=''){ 
251	                curTarget.style.display  = ''; 
252	            } 
253	        } else { 
254	 
255	            // our drag item is not in a container, so hide it. 
256	            if(curTarget.style.display!='none'){ 
257	                curTarget.style.display  = 'none'; 
258	            } 
259	        } 		
	}
	
}*/
