summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorhallgren <hallgren@chalmers.se>2012-02-29 16:36:28 +0000
committerhallgren <hallgren@chalmers.se>2012-02-29 16:36:28 +0000
commit9a6619e8198574568133417b3721be629d6b3b75 (patch)
tree0dcf46fcb4d0edec9052dcf6881bac5a0033f52c /src
parentf573d52b4374efda4ed3f32dac03daf052827733 (diff)
gfse: add missing file sort.js to the repository
Diffstat (limited to 'src')
-rw-r--r--src/www/gfse/sort.js122
1 files changed, 122 insertions, 0 deletions
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(top<mid) {
+ elem.parentNode.insertBefore(elem,prev);
+ adjust_refs(elem,elem.offsetTop-top)
+ }
+ //else jsdebug("not yet, top="+top+", mid="+mid);
+ }
+ //else jsdebug("at top");
+ }
+
+ function move_down(elem) {
+ var next=elem.nextSibling;
+ if(next) {
+ var top=elem.offsetTop;
+ var bot=top+elem.offsetHeight;
+ var mid=next.offsetTop+next.offsetHeight/2;
+ if(bot>mid) {
+ 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