blob: ff38a9329069c247e68deb9149ec893ed80bacb6 [file] [log] [blame]
function getxmlrequest()
{
if (typeof(XMLHttpRequest) != "undefined")
{
return new XMLHttpRequest();
}
else
{
return false;
}
}
/* try to grab the query result using ajax, otherwise let the form submit normally */
function checkprepend(form)
{
values = new Array();
for (i in form.childNodes)
{
if (form.childNodes[i].name != "")
{
if (form.childNodes[i].nodeName == "INPUT" && form.childNodes[i].type == "checkbox")
{
values.push(form.childNodes[i].name + "=" + form.childNodes[i].checked);
}
else if (form.childNodes[i].nodeName == "INPUT")
{
values.push(form.childNodes[i].name + "=" + form.childNodes[i].value);
}
else if (form.childNodes[i].nodeName == "SELECT")
{
values.push(form.childNodes[i].name + "=" + form.childNodes[i].options[form.childNodes[i].selectedIndex].value);
}
}
}
return !snagdata(values.join("&"), false);
}
/* for the "Link to this view" functionality */
/* the queries we have on the page currently, sans &b=true:
* actual query => encodeURIComponent(actual query).replace(/%/g, ":")
*/
var items = new Array();
/* the queries we currently have minimized, sans &b=true:
* actual query => encodeURIComponent(actual query).replace(/%/g, ":")
*/
var hide = new Array();
/* ask for the cooresponding query if we don't already have it (query must have the &b=true) */
function snagdata(query, initial)
{
var iquery = query.replace(/&b=.+$/, "");
if (typeof(items[iquery]) == "undefined")
{
if (request = getxmlrequest())
{
var m = /(^[^?#]+)/.exec(parent.location);
var u = m[1] + "?" + query;
setprogress(0);
/* initial requests need to be serialized, otherwise we trample over our request variable */
request.open("GET", u, !initial);
if (initial)
{
request.send(null);
handledata(request);
}
else
{
request.onreadystatechange = function () { handledata(request); };
request.send(null);
}
item_push(query);
return true;
}
else
{
return false;
}
}
else
{
if (!initial)
{
var m = /^([^#]+)/.exec(parent.location);
var id = items[query.replace(/&b=.+$/, "")];
document.getElementById(id).className = view + " open";
parent.location = m[1] + "#" + id;
}
return true;
}
}
/* callback for our ajax request */
function handledata(request)
{
if (request.readyState == 4)
{
var e = first_result();
/* IE doesn't know about importNode, but it has lots of other problems with prepend mode anyways,
* in particular, it won't let us set the class for the new content at all, so we won't let IE get here
*/
var doc = document.importNode(request.responseXML.getElementsByTagName("data")[0], true);
for (i in doc.childNodes)
{
if (doc.childNodes[i].nodeName == "div")
{
var m = /^(homeitem3col|homeitem) (open|closed)$/.exec(doc.childNodes[i].className);
if (m)
{
doc.childNodes[i].className = view + " " + m[2];
}
e.parentNode.insertBefore(doc.childNodes[i], e);
m = /^([^#]+)(.+)??$/.exec(parent.location);
/* clear the outline, if there's one */
if (m[2] != "" && m[2] != "#")
{
parent.location = m[1] + "#";
}
break;
}
}
}
setprogress(request.readyState);
}
var progressclose = null;
/* the readyState of our ajax request (1-4), or 0 for not started yet */
function setprogress(prog)
{
var progress = new Array();
progress[0] = "Loading";
progress[1] = "Loading.";
progress[2] = "Loading..";
progress[3] = "Loading...";
progress[4] = "Done.";
document.getElementById("progress").textContent = progress[prog];
if (prog == 4)
{
progressclose = setTimeout("document.getElementById('progressbox').style.display = 'none'", 2000);
}
else
{
if (progressclose != null)
{
clearTimeout(progressclose);
progressclose = null;
}
document.getElementById("progressbox").style.display = "block";
}
}
function item_push(query)
{
query = query.replace(/&b=.+$/, "");
items[query] = encodeURIComponent(query).replace(/%/g, ":");
set_link();
}
function item_rm(query)
{
query = query.replace(/&b=.+$/, "");
delete items[query];
if (typeof(hide[query]) != "undefined")
{
delete hide[query];
}
set_link();
}
/* expand or collapse a query result */
function toggle(elem, direct)
{
/* call came from the link, so find the correct div */
if (!direct)
{
elem = elem.parentNode.parentNode;
}
var id = elem.id;
var qid = decodeURIComponent(id.replace(/:/g, "%"));
if (elem.className == view + " open")
{
hide[qid] = id;
elem.className = view + " closed";
}
else
{
delete hide[qid];
elem.className = view + " open";
}
set_link();
}
function rm(elem)
{
elem = elem.parentNode.parentNode;
item_rm(decodeURIComponent(elem.id.replace(/:/g, "%")));
elem.parentNode.removeChild(elem);
}
var view = "homeitem3col";
function init()
{
if (getxmlrequest())
{
document.body.className = "ajax";
var e = first_result();
item_push(decodeURIComponent(e.id.replace(/:/g, "%")));
/* set the view */
var m = /v=([^#&]+)/.exec(parent.location);
if (m)
{
set_view(m[1]);
}
/* populate the queries */
m = /&items=([^#&]+)/.exec(parent.location);
if (m)
{
var q = decodeURIComponent(m[1]).split("|");
for (i in q)
{
snagdata(q[i] + "&b=true", true);
}
}
/* hide the appropriate queries */
m = /&hide=([^#&]+)/.exec(parent.location);
if (m)
{
var h = decodeURIComponent(m[1]).split("|");
for (i in h)
{
toggle(document.getElementById(h[i]), true);
}
}
document.getElementById("brief").value = "true";
}
else
{
document.body.className = "noajax";
}
}
/* returns the item we should prepend new results before, which is usually the topmost result */
function first_result()
{
var e = document.getElementById("querybox").parentNode.nextSibling;
while (!(e.className && e.className.match(/^(?:homeitem3col|homeitem)/)))
{
e = e.nextSibling;
if (e == null)
{
return document.getElementById("placeholder");
}
}
return e;
}
/* updates the "Link to this view" link */
function set_link()
{
var pagelink = document.getElementById("pagelink");
var m = /^([^?#]+)/.exec(parent.location);
/* iteration order isn't guarenteed to be insertion order, but it is in Konqueror, Firefox and (apparently) IE...
* besides, if it isn't, it'll just mean the linked page has the queries in a different order, which is far from fatal
*/
var q = new Array();
var gotfirst = false;
var qs = "";
for (i in items)
{
if (!gotfirst)
{
qs = i;
gotfirst = true;
}
else
{
q.push(i);
}
}
/* hashes are objects, not arrays, so we can't .join() them */
var h = new Array();
for (i in hide)
{
h.push(hide[i]);
}
pagelink.href = m[1] + "?" + qs + "&v=" + view + "&hide=" + h.join(encodeURIComponent("|")) + "&items=" + encodeURIComponent(q.join("|"));
}
/* sets the view to 3 or 4 columns */
function set_view(v)
{
if (view == v)
{
return;
}
var e = first_result();
while (e != null)
{
var m;
if (m = /^(homeitem3col|homeitem) (open|closed)$/.exec(e.className))
{
if (m[1] != v)
{
e.className = v + " " + m[2];
}
}
e = e.nextSibling;
}
var ve = document.getElementById("view");
if (ve.value != v)
{
ve.value = v;
}
view = v;
set_link();
}