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; } }