(function() { var _element = null; function _config(pObj, pEvent, pHandler) { if ( typeof pObj == 'object' ) { if ( pEvent.substring(0, 2) == 'on' ) pEvent = pEvent.substring(2, pEvent.length); if ( arguments.length == 3 ) { if ( pObj.addEventListener ) pObj.addEventListener(pEvent, pHandler, false); else if ( pObj.attachEvent ) pObj.attachEvent('on' + pEvent, pHandler); } else if ( arguments.length == 4 ) { if ( pObj.removeEventListener ) pObj.removeEventListener(pEvent, pHandler, false); else if ( pObj.detachEvent ) pObj.detachEvent('on' + pEvent, pHandler); } } } function _getMouseOffset(e, el) { var docPos = _getPosition(el); var mousePos = _mouseCoords(e); return { 'x' : mousePos.x - docPos.x, 'y' : mousePos.y - docPos.y }; } function _getPosition(_pObject) { var left = 0; var top = 0; while ( _pObject.offsetParent ) { left += _pObject.offsetLeft; top += _pObject.offsetTop; _pObject = _pObject.offsetParent; } left += _pObject.offsetLeft; top += _pObject.offsetTop; return { 'x' : left, 'y' : top }; } function _mouseCoords(ev) { var CoordX = ""; var CoordY = ""; if ( ev.pageX || ev.pageY ) return { 'x' : ev.pageX, 'y' : ev.pageY }; CoordX = ev.clientX + document.body.scrollLeft - document.body.clientLeft; CoordY = ev.clientY + document.body.scrollTop - document.body.clientTop; return { 'x' : CoordX, 'y' : CoordY }; } function _mouseMove(e) { if ( _element ) { if ( _element.mouseOffset == null ) _element.mouseOffset = _getMouseOffset(e, _element); var mousePos = _mouseCoords(e); var x = mousePos.x - _element.mouseOffset.x; var y = mousePos.y - _element.mouseOffset.y; _element.style.left = (( x < 0 ) ? 0 : x) + 'px'; _element.style.top = (( y < 0 ) ? 0 : y) + 'px'; } } function _mouseUp() { if ( _element ) { _config(_element, 'onmousemove', _mouseMove, 'remove'); _config(top.document, 'onmousemove', _mouseMove, 'remove'); _config(_element, 'onmouseup', _mouseUp, 'remove'); _config(top.document, 'onmouseup', _mouseUp, 'remove'); _element.mouseOffset = null; _element = null; } } function _toDrag(el) { if ( el.getAttribute('dragdrop_parent') == null ) { if ( el.getAttribute('dragdrop_child') != null ) { var children = 0; while ( (++children < 5) && (el.getAttribute('dragdrop_parent') == null) ) el = el.parentNode; } if ( el.getAttribute('dragdrop_parent') == null ) el = false; } return el; } function _drag(e) { if (typeof e.preventDefault != 'undefined') e.preventDefault(); else e.onselectstart = new Function("return false;"); var el = ( e.target ) ? e.target : e.srcElement; el = _toDrag(el); if ( el ) { _element = el; _config(el, 'onmousemove', _mouseMove); _config(top.document, 'onmousemove', _mouseMove); _config(el, 'onmouseup', _mouseUp); _config(top.document, 'onmouseup', _mouseUp); } } function _set(_pObject) { if ( typeof _pObject != 'object' ) return false; _pObject.setAttribute('dragdrop_parent', 'true'); _config(_pObject, 'onmousedown', _drag); } function DragDrop() { } DragDrop.prototype.drag = _set; window.DragDrop = DragDrop; } )();