﻿// 拖拽
// 黄起程
// 2008-10-15

var dragFn = {
    "obj": null,
    "init": function(handle, dragBody, e) {
        if (e == null) {
            handle.onmousedown = dragFn.start;
        }
        handle.root = dragBody;
        handle.mouseover(function() {
            this.style.cursor = "move";
            this.onmouseout = function() {
                this.style.cursor = "default";
            }
        });

        //确保后来能够取得left,top值
        if (isNaN(parseInt(handle.root[0].style.left)))
            handle.root.css("left", "0px");
        if (isNaN(parseInt(handle.root[0].style.top)))
            handle.root.css("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[0].style.top);
            var left = parseInt(handle.root[0].style.left);

            handle.root.onDragStart(left, top, e.pageX, e.pageY);

            handle.lastMouseX = e.pageX;
            handle.lastMouseY = e.pageY;

            $(document).bind("mousemove", dragFn.drag).bind("mouseup", 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[0].style.top);
        var left = parseInt(handle.root[0].style.left);

        handle.root.onDragStart(left, top, e.pageX, e.pageY);

        handle.lastMouseX = e.pageX;
        handle.lastMouseY = e.pageY;
        $(document).bind("mousemove", dragFn.drag).bind("mouseup", 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[0].style.top);
        var left = parseInt(handle.root[0].style.left);

        var currentLeft, currentTop;
        currentLeft = left + mouseX - handle.lastMouseX;
        currentTop = top + (mouseY - handle.lastMouseY);

        //上一瞬间的上边距加上鼠标在两个瞬间移动的距离 得到现在的上边距
        handle.root[0].style.left = currentLeft + "px";
        handle.root[0].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).unbind("mousemove").unbind("mouseup");
        dragFn.obj.root.onDragEnd(
		    parseInt(dragFn.obj.root[0].style.left),
		    parseInt(dragFn.obj.root[0].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.attr("tp", el[0].offsetTop).attr("lf", el[0].offsetLeft);
    },
    "cover": function() {
    }
};
jQuery.extend(dragFn);
//Object.extendFn( $,dragFn );
