
/* ----- jsorder.js ----- */

function jsorder_findObjectID(obj) {
    var a = jsorder_findElement(obj, "a");
    var req = decodeURI(a.href).split("?");
    var args = req[1].split("&");
    for (var n = 0; n < args.length; n++) {
        if (args[n].slice(0, 3) == "id=") {
	    return args[n].slice(3);
	}
    }
    throw "no id found";
}

function jsorder_findElement(obj, tagName) {
    tagName = tagName.toUpperCase();
    while (obj != null && obj.tagName != tagName) {
         obj = obj.parentNode;
    }
    return obj;
}

function jsorder_stopEvent(event) {
    if (document.all) {
        event.cancelBubble = true;
        event.returnValue = false;
    } else {
        event.preventDefault();
        event.stopPropagation();
    }
    return false;
}

function jsorder_switchClasses(a, b) {
    var tmp = a.className;
    a.className = b.className;
    b.className = tmp;
}

function jsorder_baseuri(uri) {
    var url = decodeURI(uri).split("/");
    if (url[url.length - 1] != "") {
        url.length = url.length - 1;
    }
    return url.join("/");
}

function jsorder_rpc(func, args) {
    var uri = jsorder_baseuri(document.URL);
    var srv = XMLRPC.getService(uri);
    var res = srv.call(func, args);
    return res;
}

function jsorder_moveUp(event) {
    var ev = event ? event : window.event;
    var target = ev.target ? ev.target : ev.srcElement;
    var obj = jsorder_findElement(target, "tr");
    var prev = obj.previousSibling;
    while (prev && obj.nodeName != prev.nodeName) {
        prev = prev.previousSibling;
    }
    if (prev) {
        prev.parentNode.insertBefore(obj, prev);
        jsorder_switchClasses(obj, prev);
        var id = jsorder_findObjectID(target);
	var args = new Array(id, "up");
        jsorder_rpc("jsorder_move", args);
    }
    return jsorder_stopEvent(event);
}

function jsorder_moveDown(event) {
    var ev = event ? event : window.event;
    var target = ev.target ? ev.target : ev.srcElement;
    var obj = jsorder_findElement(target, "tr");
    var next = obj.nextSibling;
    while (next && obj.nodeName != next.nodeName) {
        next = next.nextSibling;
    }
    if (next) {
        next.parentNode.insertBefore(next, obj);
        jsorder_switchClasses(next, obj);
        var id = jsorder_findObjectID(target);
	var args = new Array(id, "down");
        jsorder_rpc("jsorder_move", args);
    }
    return jsorder_stopEvent(event);
}

function jsorder_addActions(obj) {
    var links = obj.getElementsByTagName("a");
    for (var n = 0; n < links.length; n++) {
        var a = links[n]; 
        if (a.className == "up" || a.href.search(/\/folder_position\?position=up/) >= 0) {
	    registerEventListener(a, "click", jsorder_moveUp);
        }
        if (a.className == "down" || a.href.search(/\/folder_position\?position=down/) >= 0) {
	    registerEventListener(a, "click", jsorder_moveDown);
        }
    }
}

function jsorder_init() {
    var tables = document.getElementsByTagName("table");
    for (var n = 0; n < tables.length; n++) {
        if (tables[n].className == "listing") {
            jsorder_addActions(tables[n]);
        }
    }
}

registerPloneFunction(jsorder_init);



