 function DragObject(element_id) {
        //メンバ定義
        this.element = document.getElementById(element_id);
        this.overlapCheckElements = new Array();//重なりチェック対象エレメント（他ノード）
        this.myOverlapCheckElements = new Array();//重なりチェック対象エレメント（自ノード）
        //メソッド定義
        //初期化処理
        DragObject.prototype.init = DragObject_init;
        function DragObject_init(){
            var tags = new Array("applet", "iframe", "select");
            for (var i=0; i < tags.length ;i++){
                //重なりチェック対象自ノードのセット
                var check_elements = this.element.getElementsByTagName(tags[i]);        
                for (var j = check_elements.length; j > 0;) {
                    j--;
                    var check_element = check_elements[j];
                    this.myOverlapCheckElements[this.myOverlapCheckElements.length] = check_element;
                }
                //重なりチェック対象他ノードのセット
                check_elements = document.getElementsByTagName(tags[i]);        
                for (var j = check_elements.length; j > 0;) {
                    j--;
                    var check_element = check_elements[j];
                    var addflag = true;
                    for (var k=0; k < this.myOverlapCheckElements.length ; k++){
                        if (this.myOverlapCheckElements[k] == check_element){
                            addflag = false;
                            break;
                        }
                    }
                    if (addflag){
                        this.overlapCheckElements[this.overlapCheckElements.length] = check_element;
                    }
                }
                /*
                var check_elements = document.getElementsByTagName(tags[i]);        
                for (var j = check_elements.length; j > 0;) {
                    j--;
                    var check_element = check_elements[j];
                    if (!checkChildElement(this.element,check_element)){
                        //自分の子ノードではない場合は、重なりチェック対象エレメントとする
                        //if(check_element.style.visibility != "hidden"){
                            this.overlapCheckElements[this.overlapCheckElements.length] = check_element;
                        //}
                    } else {
                        this.myOverlapCheckElements[this.myOverlapCheckElements.length] = check_element;
                    }
                }
                */
            }    
        }
        //重なり制御
        DragObject.prototype.checkOverlap = DragObject_checkOverlap;
        function DragObject_checkOverlap(){
            for (var i=0; i < this.overlapCheckElements.length ; i++){
                if (isOverlapElement(this.element,this.overlapCheckElements[i])){
                    this.overlapCheckElements[i].style.visibility = "hidden";
                } else {
                    this.overlapCheckElements[i].style.visibility = "visible";
                }
            }
        }     
    //window.status = document.body.scrollTop
}

function setDragObject(element_id){
    
    setDocumentOnmouse();
    
    DRAG_FLAG = true;
    DRAG_OBJECT=new DragObject(element_id);
    DRAG_OBJECT.init();

    TMP_OFFSET_X =  MOUSE_X - DRAG_OBJECT.element.offsetLeft;
    TMP_OFFSET_Y = MOUSE_Y - DRAG_OBJECT.element.offsetTop;
    
    MAX_ZINDEX++;
    DRAG_OBJECT.element.style.zIndex = MAX_ZINDEX;	
    
    //自分の子ノードは、すべて表示させる
    for (var i=0; i < DRAG_OBJECT.myOverlapCheckElements.length ; i++){
        DRAG_OBJECT.myOverlapCheckElements[i].style.visibility = "visible";
    }
    DRAG_OBJECT.checkOverlap();
}
TMP_OFFSET_X = 0;
TMP_OFFSET_Y = 0;
var DRAG_OBJECT;
var DRAG_FLAG = false;
var MOUSE_X;
var MOUSE_Y;
var MAX_ZINDEX = 1;

function dragOff() {
    DRAG_FLAG = false;
    freeDocumentOnmouse();
}
function drag() {
    DRAG_OBJECT.element.style.top = MOUSE_Y - TMP_OFFSET_Y;
    DRAG_OBJECT.element.style.left = MOUSE_X - TMP_OFFSET_X;
    DRAG_OBJECT.checkOverlap();
}
function mousecursor(evt){ //関数の定義
	if(document.all){ //ここからIE用
		MOUSE_X = event.x; 
		MOUSE_Y = event.y;
	} else { //ここからNN用
		MOUSE_X = evt.pageX;
		MOUSE_Y = evt.pageY
	}
	//window.status = "M:" + MOUSE_X + "," + MOUSE_Y;
	if (DRAG_FLAG){
		drag()
	} else{
            return null;
        }
	return false;
}
setDocumentOnmouse();
function setDocumentOnmouse(){
    window.document.onmouseup = dragOff;
    if(document.all) {
            document.onmousemove = mousecursor; //IE用
    } else if(document.layers){ //NN4.7用
            window.onmousemove = mousecursor;
            window.captureEvents(Event.MOUSEMOVE);
    } else {
            window.document.onmousemove = mousecursor; //NN6用
    }
}

function freeDocumentOnmouse(){
    //document.onmousemove = null                   //n4,m1,n6,e4,e5,e6,o6用
    document.onmouseup   = null                   //n4,m1,n6,e4,e5,e6,o6用
}


function openWindowLay(elementId){
    var obj=document.getElementById(elementId);
    obj.style.left = MOUSE_X;
    obj.style.top = MOUSE_Y;
}
function closeWindowLay(elementId){
    var obj=document.getElementById(elementId);
    obj.style.top = -1999;
    obj.style.left = -1999;
    setDragObject(elementId)
    dragOff();
}


function checkChildElement(targetEle,cehckEle){
    if (targetEle == cehckEle){
        return true;
    }
    for(var i=0; i< targetEle.childNodes.length; i++){
        if (checkChildElement(targetEle.childNodes[i],cehckEle)){
            return true;
        }
    }
    return false;
}

function isOverlapElement(targetEle,cehckEle){
    //x座標のチェック
    var tp = absolutePos(targetEle);
    var EX1 = tp.x;
    var EX2 = targetEle.offsetWidth + EX1;
    var EY1 = tp.y;
    var EY2 = targetEle.offsetHeight + EY1;
    var cp = getAbsolutePos(cehckEle);
    var CX1 = cp.x;
    var CX2 = cehckEle.offsetWidth + CX1;
    var CY1 = cp.y;
    var CY2 = cehckEle.offsetHeight + CY1;
    if ((CX1 > EX2) || (CX2 < EX1) || (CY1 > EY2) || (CY2 < EY1)) {
        return false;
    } else {
        return true;
    }
}
