﻿// 拖拽
// 黄起程
// 2008-10-15

var dragFn={
    "obj":null,
	"init":function(handle, dragBody, e){
		if (e == null) {
			handle.onmousedown = dragFn.start;
		}
		handle.root = dragBody;
		handle.onmouseover = function(){
		    this.style.cursor = "move";
		    this.onmouseout = function(){
		        this.style.cursor = "default";
		    }
		}
		//确保后来能够取得left,top值
		if(isNaN(parseInt(handle.root.style.left)))
		    handle.root.style.left = "0px";
		if(isNaN(parseInt(handle.root.style.top)))
		    handle.root.style.top  = "0px";
		    
		handle.root.onDragStart = new Function();
		handle.root.onDragEnd   = new Function();
		handle.root.onDrag      = new Function();
		
		if (e != null) 
		{
			var handle = dragFn.obj = handle;
			e = dragFn.fixe(e);
			var top  = parseInt(handle.root.style.top);
			var left = parseInt(handle.root.style.left);
			
			handle.root.onDragStart(left,top,e.pageX,e.pageY);
			
			handle.lastMouseX = e.pageX;
			handle.lastMouseY = e.pageY;
			document.onmousemove = dragFn.drag;
			document.onmouseup   = dragFn.end;
		}
		
		dragFn.record(handle.root);
	},
	"start":function(e){
		var handle = dragFn.obj = this;
		e = dragFn.fixEvent(e);
		
		//一般情况下 left top 在初始的时候都为0
		var top  = parseInt(handle.root.style.top);
		var left = parseInt(handle.root.style.left);
		
		handle.root.onDragStart(left,top,e.pageX,e.pageY);
		
		handle.lastMouseX = e.pageX;
		handle.lastMouseY = e.pageY;
		document.onmousemove = dragFn.drag;
		document.onmouseup   = dragFn.end;
		dragFn.record(handle.root);
		return false;
	},	
	"drag":function(e){
	    //这里的this为document 所以拖动对象只能保存在dragFn.obj里
		e = dragFn.fixEvent(e);
		
		var handle = dragFn.obj;
		var mouseY = e.pageY;
		var mouseX = e.pageX;
		
		//这里的top和left是handle.root距离浏览器边框的上边距和左边距
		var top  = parseInt(handle.root.style.top);
		var left = parseInt(handle.root.style.left);
		
		var currentLeft,currentTop;
		currentLeft = left + mouseX-handle.lastMouseX;
		currentTop  = top  +(mouseY-handle.lastMouseY);
		
		//上一瞬间的上边距加上鼠标在两个瞬间移动的距离 得到现在的上边距
		handle.root.style.left = currentLeft + "px";
		handle.root.style.top  = currentTop  + "px";
		
		//更新当前的位置
		handle.lastMouseX = mouseX;
		handle.lastMouseY = mouseY;
		
		//保存这一瞬间的鼠标值 用于下一次计算位移
		handle.root.onDrag(currentLeft,currentTop,e.pageX,e.pageY);//调用外面对应的函数
		dragFn.record(handle.root);
		return false;
	},
	"end":function(){
		document.onmousemove = null;
		document.onmouseup   = null;
		
		dragFn.obj.root.onDragEnd(
		    parseInt(dragFn.obj.root.style.left),
		    parseInt(dragFn.obj.root.style.top));
		dragFn.record(dragFn.obj.root);
		dragFn.obj = null;
	},
	"fixEvent":function(e){//格式化事件参数对象
		if(typeof e == "undefined")
		    e = window.event;
		if(typeof e.layerX=="undefined")
		    e.layerX = e.offsetX;
		if(typeof e.layerY=="undefined")
		    e.layerY = e.offsetY;
		if(typeof e.pageX == "undefined")
		    e.pageX = e.clientX + document.body.scrollLeft - document.body.clientLeft;
		if(typeof e.pageY == "undefined")
		    e.pageY = e.clientY + document.body.scrollTop - document.body.clientTop;
		return e;
	},
	"record":function( el ){
	    el.setAttribute("tp",el.offsetTop);
	    el.setAttribute("lf",el.offsetLeft);
	},
	"cover" : function(){
	    
	}
};

Object.extendFn( $$,dragFn );
