var g_aDragables = new Array(); var g_CurrentState = new Object(); var g_iSlideSteps = 10; var g_iSlideInterval = 5; DraggablesPreInitialize(); function DraggablesPreInitialize() { g_CurrentState.m_bAllowDrag = false; g_CurrentState.m_objDragging = null; if(!g_iSlideSteps) g_iSlideSteps = 20; g_CurrentState.m_zIndex = 600; } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// function Position(objValue) { if(objValue) { this.Copy(objValue); } else { this.m_iLeft = 0; this.m_iTop = 0; } return this; } Position.prototype.Copy = function(objValue) { this.m_iLeft = objValue.m_iLeft; this.m_iTop = objValue.m_iTop; } Position.prototype.AddScroll = function() { if(window.opera) { this.m_iLeft += document.documentElement.scrollLeft; this.m_iTop += document.documentElement.scrollTop; } else if (window.event) { this.m_iLeft += document.documentElement.scrollLeft + document.body.scrollLeft; this.m_iTop += document.documentElement.scrollTop + document.body.scrollTop; } else { this.m_iLeft += window.scrollX; this.m_iTop += window.scrollY; } } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// function CRect() { this.m_iLeft = 0; this.m_iTop = 0; this.m_iWidth = 0; this.m_iHeight = 0; } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// function Size() { this.m_iWidth = 0; this.m_iHeight = 0; return this; } function CurrentPosition(objElement) { var objPosition = new Position(); var objCurrent = objElement; while(objCurrent) { // alert(objCurrent.offsetLeft); objPosition.m_iLeft += objCurrent.offsetLeft; objPosition.m_iTop += objCurrent.offsetTop; objCurrent = objCurrent.offsetParent || null; } return objPosition; } function CurrentSize(objElement) { var objSize = new Size(); objSize.m_iWidth = objElement.offsetWidth; objSize.m_iHeight = objElement.offsetHeight; return objSize; } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// function CDraggable(elementID,sIDDragFor) { this.m_objDrag = document.getElementById(elementID); if(!this.m_objDrag) return null; if(!sIDDragFor) sIDDragFor = ''; this.m_sDragID = elementID; this.m_elementID = elementID + '_Absolute'; this.m_sIDDragFor = sIDDragFor; this.m_objFrame = null; this.Initialize(); g_aDragables[g_aDragables.length] = this; RegisterDraggableEvents(); mainDiv = document.getElementById('mainContainer'); if(mainDiv!=null) { this.m_rcBound = new CRect(); this.m_rcBound.m_iLeft = mainDiv.offsetLeft; this.m_rcBound.m_iTop = mainDiv.offsetTop; this.m_rcBound.m_iWidth = mainDiv.offsetWidth+mainDiv.offsetLeft; this.m_rcBound.m_iHeight = 10000; } else { this.m_rcBound = new CRect(); this.m_rcBound.m_iLeft = 0; this.m_rcBound.m_iTop = 0; this.m_rcBound.m_iWidth = 900; this.m_rcBound.m_iHeight = 10000; } return this; } CDraggable.prototype.SetRectBound = function(iLeft,iTop,iWidth,iHeight) { this.m_rcBound.m_iTop = iTop; this.m_rcBound.m_iLeft = iLeft; this.m_rcBound.m_iWidth = iWidth; this.m_rcBound.m_iHeight = iHeight; } CDraggable.prototype.Initialize = function() { this.UpdatePosSize(); this.m_slideBack = false; this.m_moveBack = false; this.m_macMode = false; this.m_fnAfterDrop = null; this.m_InterProcess = false; this.m_PostProcess = null; this.m_bDragging = false; this.m_sInnerHTML = this.m_objDrag.innerHTML; this.RewriteAbsolute(); } CDraggable.prototype.UpdatePosSize = function() { this.m_objDrag.startPositon = CurrentPosition(this.m_objDrag); this.m_objDrag.currentPosition = new Position(); this.m_objDrag.currentPosition.Copy(this.m_objDrag.startPositon); this.m_objDrag.size = CurrentSize(this.m_objDrag); } CDraggable.prototype.RewriteAbsolute = function() { /* if(!this.m_macMode) this.m_objDrag.style.visibility = 'hidden'; document.write ( '
' + this.m_sInnerHTML + '
' );*/ // this.m_Element = document.getElementById(this.m_elementID); this.m_Element = document.getElementById(this.m_sDragID); this.m_Element.currentPosition = new Position(this.m_objDrag.startPositon); this.m_Element.startPosition = new Position(this.m_objDrag.currentPosition); // this.m_Element.size = new Size(); // this.m_Element.size.m_iWidth = this.m_objDrag.size.m_iWidth; // this.m_Element.size.m_iHeight = this.m_objDrag.size.m_iHeight; } CDraggable.prototype.MacMode = function(Value) { this.m_macMode = Value; this.m_objDrag.style.visibility = !this.m_macMode ? 'hidden' : 'visible'; } CDraggable.prototype.MoveTo = function(objPosition) { if(g_CurrentState.m_objDragging==null) return; rcBound = g_CurrentState.m_objDragging.m_rcBound; szSize = this.m_Element.size; if(objPosition.m_iTop < rcBound.m_iTop) objPosition.m_iTop = rcBound.m_iTop; if(objPosition.m_iLeft < rcBound.m_iLeft) objPosition.m_iLeft = rcBound.m_iLeft; if(objPosition.m_iTop+szSize.m_iHeight > rcBound.m_iHeight) objPosition.m_iTop = rcBound.m_iHeight-szSize.m_iHeight; if(objPosition.m_iLeft+szSize.m_iWidth > rcBound.m_iWidth) objPosition.m_iLeft = rcBound.m_iWidth-szSize.m_iWidth; this.m_Element.style.top = objPosition.m_iTop + 'px'; this.m_Element.style.left = objPosition.m_iLeft + 'px'; this.m_Element.currentPosition.m_iTop = objPosition.m_iTop; this.m_Element.currentPosition.m_iLeft = objPosition.m_iLeft; if(g_CurrentState.m_objDragging && g_CurrentState.m_objDragging.InterProcess) g_CurrentState.m_objDragging.InterProcess(g_CurrentState.m_objDragging); } CDraggable.prototype.SlideBack = function() { this.MoveBack(); } CDraggable.prototype.MoveBack = function() { this.MoveTo(this.m_Element.startPosition); g_CurrentState.m_objDragging.m_Element.style.zIndex = g_CurrentState.m_originalZIndex; if(g_CurrentState.m_objDragging.PostProcess) g_CurrentState.m_objDragging.PostProcess(g_CurrentState.m_objDragging); g_CurrentState.m_objDragging = null; } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// function RegisterDraggableEvents() { if(g_aDragables.length != 1) return; RegisterEventHandler(document, 'mousedown', DraggableEventMousedown); RegisterEventHandler(document, 'mousemove', DraggableEventMousemove); RegisterEventHandler(document, 'mouseup', DraggableEventMouseup); RegisterEventHandler(window, 'resize', DraggableEventResize); } function DraggableEventMousedown(objEvent) { if(window.event) objEvent = window.event; CaptureDraggables(objEvent); } function ShowFrame(bShow,objDrag) { if(!window.opera && document.addEventListener) return; objFrame = document.getElementById("screen_frame"); if(objFrame) { if(objDrag && objDrag.m_Element) { objFrame.style.width = objDrag.m_Element.size.m_iWidth-10; objFrame.style.height = objDrag.m_Element.size.m_iHeight; objFrame.style.left = objDrag.m_Element.style.left; objFrame.style.top = objDrag.m_Element.style.top; objFrame.style.zIndex = 0; } if(bShow) { objFrame.style.display = 'block'; objFrame.style.zIndex = 5; } else objFrame.style.display = 'none'; } } function CaptureDraggables(objEvent) { var p = new Position(); p.m_iLeft = objEvent.clientX; p.m_iTop = objEvent.clientY; p.AddScroll(); if(objEvent.srcElement!=undefined) domSrc = objEvent.srcElement; else domSrc = objEvent.target; g_CurrentState.m_objDragging = null; for(var c = 0; c != g_aDragables.length; c++) { var current = g_aDragables[c].m_Element; if(p.m_iLeft >= current.currentPosition.m_iLeft && p.m_iLeft < current.currentPosition.m_iLeft + current.size.m_iWidth && p.m_iTop >= current.currentPosition.m_iTop && p.m_iTop < current.currentPosition.m_iTop + current.size.m_iHeight) { if(domSrc.tagName=="INPUT") return; if(g_aDragables[c].m_Element.style.visibility=="hidden") continue; if(g_aDragables[c].m_sIDDragFor!='' && domSrc.parentNode.id!=g_aDragables[c].m_sIDDragFor) continue; g_CurrentState.m_originalZIndex = current.style.zIndex ? current.style.zIndex + 1 : 600; current.style.zIndex = ++g_CurrentState.m_originalZIndex; // current.style.zIndex = 10; current.startPosition.Copy(current.currentPosition); current.m_bDragging = true; g_CurrentState.m_objDragging = g_aDragables[c]; g_CurrentState.startPosition = new Position; g_CurrentState.startPosition.m_iTop = p.m_iTop; g_CurrentState.startPosition.m_iLeft = p.m_iLeft; g_CurrentState.m_objDragging.m_objDrag.style.zIndex = 610; g_CurrentState.m_bAllowDrag = true; if(document.attachEvent) { window.event.cancelBubble = true; window.event.returnValue = false; } else if(objEvent.preventDefault) objEvent.preventDefault(); objFrame = document.getElementById("screen_frame"); if(objFrame) { ShowFrame(true,g_CurrentState.m_objDragging.m_objDrag); } break; } } } function DraggableEventMousemove(objEvent) { if(window.event) objEvent = window.event; if(g_CurrentState.m_bAllowDrag) { if(document.attachEvent) { window.event.cancelBubble = true; window.event.returnValue = false; } else if(objEvent.preventDefault) objEvent.preventDefault(); MoveDraggables(objEvent); } } function MoveDraggables(objEvent) { if(!g_CurrentState.m_objDragging) return; var p = new Position(); p.m_iLeft = objEvent.clientX; p.m_iTop = objEvent.clientY; p.AddScroll(); var newPosition = new Position(); newPosition.m_iTop = p.m_iTop - g_CurrentState.startPosition.m_iTop + g_CurrentState.m_objDragging.m_Element.startPosition.m_iTop; newPosition.m_iLeft = p.m_iLeft - g_CurrentState.startPosition.m_iLeft + g_CurrentState.m_objDragging.m_Element.startPosition.m_iLeft; g_CurrentState.m_objDragging.MoveTo(newPosition); objFrame = document.getElementById("screen_frame"); if(objFrame) { objFrame.style.left = newPosition.m_iLeft; objFrame.style.top = newPosition.m_iTop; objFrame.style.width = g_CurrentState.m_objDragging.m_Element.size.m_iWidth-10; objFrame.style.height = g_CurrentState.m_objDragging.m_Element.size.m_iHeight; } } function DraggableEventMouseup (objEvent) { if(window.event) objEvent = window.event; if(g_CurrentState.m_bAllowDrag) ReleaseDraggables(objEvent); g_CurrentState.m_bAllowDrag = false; } function ReleaseDraggables (objEvent) { if (g_CurrentState.m_objDragging) { if(g_CurrentState.m_objDragging.PostProcess) g_CurrentState.m_objDragging.PostProcess(g_CurrentState.m_objDragging); if (g_CurrentState.m_objDragging.slideBack) g_CurrentState.m_objDragging.slideBack(); g_CurrentState.m_objDragging = null; } } function DraggableEventResize() { for(var c = 0; c != g_aDragables.length; c++) { var current = g_aDragables[c]; current.m_objDrag.currentPositon = CurrentPosition(current.m_objDrag); current.MoveTo(current.m_objDrag.currentPositon); } } function RegisterEventHandler(object, eventName, handler) { if(object.attachEvent) object.attachEvent ('on' + eventName, handler); else if(object.addEventListener) object.addEventListener(eventName, handler, true); } function UnregisterEventHandler (object, eventName) { if (object.detachEvent) object.detachEvent ("onmousemove", ProceedDrag); else if(object.removeEventListener) object.removeEventListener ("mousemove", ProceedDrag, true); } function show(obj, objName) { var result = ""; var lWin = window.open('',''); lWin.document.open(); for(var i in obj) { result = i + " = " + obj[i] + "
"; lWin.document.write(result); } lWin.document.close(); } document.write('');