From 74b643bfc3577446e8c003ce1bf771fdd84cd9f6 Mon Sep 17 00:00:00 2001 From: hallgren Date: Wed, 29 Feb 2012 16:36:28 +0000 Subject: [PATCH] gfse: add missing file sort.js to the repository --- src/www/gfse/sort.js | 122 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 src/www/gfse/sort.js diff --git a/src/www/gfse/sort.js b/src/www/gfse/sort.js new file mode 100644 index 000000000..cbf4183cb --- /dev/null +++ b/src/www/gfse/sort.js @@ -0,0 +1,122 @@ + +function initialize_sorting() { + + function sortable(elem) { + switch(elem.tagName) { + case "DIV": + switch(elem.className) { + case "fun": + case "lin": + case "lincat": + case "oper": + return elem; + default: + return null; + } + default: + return sortable(elem.parentNode) + } + } + + function move_element(elem,x,y) { + elem.style.left=x+"px"; + elem.style.top=y+"px"; + elem.delta={x:x,y:y}; + } + + function adjust_refs(elem,dy) { + //jsdebug("dy="+dy); + move_element(elem,elem.delta.x,elem.delta.y-dy); + elem.downAt.y+=dy; + elem.range.lo-=dy; + elem.range.hi-=dy; + } + + function move_up(elem) { + var prev=elem.previousSibling; + if(prev) { + var top=elem.offsetTop; + var mid=prev.offsetTop+prev.offsetHeight/2; + if(topmid) { + next.parentNode.insertBefore(next,elem); + adjust_refs(elem,elem.offsetTop-top) + } + //else jsdebug("not yet, top="+top+", bot="+bot+", mid="+mid); + } + //else jsdebug("at bottom"); + } + + function swap(elem,dy) { + if(dy>0) move_down(elem); + else if(dy<0) move_up(elem); + } + + function restrictTo(range,y) { + return Math.min(range.hi,Math.max(range.lo,y)); + } + +function startDrag(event,elem) { + //jsdebug("Start dragging"); + elem.style.position="relative"; + elem.delta || (elem.delta={x:0,y:0}); + elem.downAt={x:event.screenX-elem.delta.x,y:event.screenY-elem.delta.y}; + var list=elem.parentNode; + var top=list.offsetTop-elem.offsetTop+elem.delta.y; + elem.range={lo:top,hi:top+list.offsetHeight-elem.offsetHeight}; + elem.style.zIndex=1; + document.onmousemove=function(event) { + var dx=0/*event.screenX-elem.downAt.x*/; + var dy=restrictTo(elem.range,event.screenY-elem.downAt.y); + //jsdebug("dragging to "+dx+" "+dy+" "+show_props(elem.range,"range")); + move_element(elem,dx,dy); + //jsdebug("dragging to "+elem.offsetLeft+" "+elem.offsetTop); + swap(elem,dy) + return false; + } + document.onmouseup=function() { + //jsdebug("dropped"); + elem.style.zIndex=0; + move_element(elem,0,0); + document.onmousemove=null; + document.onmouseup=null; + if(list.onsort) list.onsort(); + else jsdebug("no list.onsort "+list.className+" "+list.firstChild.ident); + return false; + } + return false; +} + +function mousedown(event) { + var elem=sortable(event.target); + if(elem) return startDrag(event,elem); + //else jsdebug("Clicked outside"/*+taglist(event.target)/*+show_props(event,"event")*/); +} + + var jsdebug=debug; + +function init() { + document.onmousedown=mousedown; + //var d=element("javascriptdebug"); + //if(d) jsdebug=function(msg) { d.innerHTML=msg; } +} + init(); +} + +initialize_sorting(); + +//Inspired by http://tool-man.org/examples/sorting.html