var dw_slidebar = { obj: null, slideDur: 500, // duration of glide onclick of track init: function (bar, track, axis, x, y) { x = x || 0; y = y || 0; bar.style.left = x + "px"; bar.style.top = y + "px"; bar.axis = axis; track.bar = bar; if (axis == "h") { bar.trkWd = track.offsetWidth; // hold for setBarSize bar.maxX = bar.trkWd - bar.offsetWidth - x; bar.minX = x; bar.maxY = y; bar.minY = y; } else { bar.trkHt = track.offsetHeight; bar.maxY = bar.trkHt - bar.offsetHeight - y; bar.maxX = x; bar.minX = x; bar.minY = y; } bar.on_drag_start = bar.on_drag = bar.on_drag_end = bar.on_slide_start = bar.on_slide = bar.on_slide_end = function() {} bar.onmousedown = this.startDrag; track.onmousedown = this.startSlide; }, startSlide: function(e) { // called onmousedown of track if ( dw_slidebar.aniTimer ) clearInterval(dw_slidebar.aniTimer); e = e? e: window.event; var bar = dw_slidebar.obj = this.bar; // i.e., track's bar e.offX = (typeof e.layerX != "undefined")? e.layerX: e.offsetX; e.offY = (typeof e.layerY != "undefined")? e.layerY: e.offsetY; bar.startX = parseInt(bar.style.left); bar.startY = parseInt(bar.style.top); if (bar.axis == "v") { bar.destX = bar.startX; bar.destY = (e.offY < bar.startY)? e.offY: e.offY - bar.offsetHeight; bar.destY = Math.min( Math.max(bar.destY, bar.minY), bar.maxY ); } else { bar.destX = (e.offX < bar.startX)? e.offX: e.offX - bar.offsetWidth; bar.destX = Math.min( Math.max(bar.destX, bar.minX), bar.maxX ); bar.destY = bar.startY; } bar.distX = bar.destX - bar.startX; bar.distY = bar.destY - bar.startY; dw_slidebar.per = Math.PI/(2 * dw_slidebar.slideDur); dw_slidebar.slideStart = (new Date()).getTime(); bar.on_slide_start(bar.startX, bar.startY); dw_slidebar.aniTimer = setInterval("dw_slidebar.doSlide()",10); }, doSlide: function() { if ( !dw_slidebar.obj ) { clearInterval(dw_slidebar.aniTimer); return; } var bar = dw_slidebar.obj; var elapsed = (new Date()).getTime() - this.slideStart; if (elapsed < this.slideDur) { var x = bar.startX + bar.distX * Math.sin(this.per*elapsed); var y = bar.startY + bar.distY * Math.sin(this.per*elapsed); bar.style.left = x + "px"; bar.style.top = y + "px"; bar.on_slide(x, y); } else { // if time's up clearInterval(this.aniTimer); bar.style.left = bar.destX + "px"; bar.style.top = bar.destY + "px"; bar.on_slide_end(bar.destX, bar.destY); this.obj = null; } }, startDrag: function (e) { // called onmousedown of bar e = dw_event.DOMit(e); if ( dw_slidebar.aniTimer ) clearInterval(dw_slidebar.aniTimer); var bar = dw_slidebar.obj = this; bar.downX = e.clientX; bar.downY = e.clientY; bar.startX = parseInt(bar.style.left); bar.startY = parseInt(bar.style.top); bar.on_drag_start(bar.startX, bar.startY); dw_event.add( document, "mousemove", dw_slidebar.doDrag, true ); dw_event.add( document, "mouseup", dw_slidebar.endDrag, true ); e.stopPropagation(); }, doDrag: function (e) { e = e? e: window.event; if (!dw_slidebar.obj) return; var bar = dw_slidebar.obj; var nx = bar.startX + e.clientX - bar.downX; var ny = bar.startY + e.clientY - bar.downY; nx = Math.min( Math.max( bar.minX, nx ), bar.maxX); ny = Math.min( Math.max( bar.minY, ny ), bar.maxY); bar.style.left = nx + "px"; bar.style.top = ny + "px"; bar.on_drag(nx,ny); return false; }, endDrag: function () { dw_event.remove( document, "mousemove", dw_slidebar.doDrag, true ); dw_event.remove( document, "mouseup", dw_slidebar.endDrag, true ); if ( !dw_slidebar.obj ) return; // avoid errors in ie if inappropriate selections dw_slidebar.obj.on_drag_end( parseInt(dw_slidebar.obj.style.left), parseInt(dw_slidebar.obj.style.top) ); dw_slidebar.obj = null; } }