// Emacs settings: -*- mode: Fundamental; tab-width: 4; -*-
////////////////////////////////////////////////////////////////////////////
// //
// Javascript for Andrew's Bookmark Application //
// //
// Copyright (c) 2004-2005, Andrew Birrell //
// //
////////////////////////////////////////////////////////////////////////////
var theTree = new Object();
var theMarks = new Object();
var openUser = null;
var openCategory = null;
var openSubcat = null;
var dest;
var editForm;
var thePwd = "";
function flipSubcat(subcat) {
openSubcat = (openSubcat == subcat ? null : subcat);
setCookie("bookmarkSubcat", openSubcat);
buildPage();
}
function flipCategory(category) {
openCategory = (openCategory == category ? null : category);
setCookie("bookmarkCategory", openCategory);
flipSubcat(null);
}
function flipUser(user) {
openUser = (openUser == user ? null : user);
setCookie("bookmarkUser", openUser);
flipCategory(null);
}
function buildMark(subcatMarks, id) {
var html = "";
var theMark = subcatMarks[id];
html += '
| '+
''+
htmlspecials(theMark.name)+' | ';
html += ''+htmlspecials(theMark.notes)+' | ';
html += 'edit | ';
html += '
';
return html;
}
function buildSubcat(categoryMarks, subcat) {
var html = "";
if (subcat != "") {
html += ''+
' '+
htmlspecials(subcat)+' |
';
}
if (subcat == "" || subcat == openSubcat) {
var subcatMarks = categoryMarks[subcat];
for (var id in subcatMarks) {
html += buildMark(subcatMarks, id);
}
}
return html;
}
function buildCategory(userMarks, category) {
var html = "";
if (category != "") {
html += ''+
' '+
htmlspecials(category)+' |
';
}
if (category == "" || category == openCategory) {
var categoryMarks = userMarks[category];
for (var subcat in categoryMarks) {
html += buildSubcat(categoryMarks, subcat);
}
}
return html;
}
function buildUser(theTree, user) {
var html = "";
if (user != "") {
html += ''+
' '+
htmlspecials(user)+' |
';
}
if (user == "" || user == openUser) {
var userMarks = theTree[user];
for (var category in userMarks) {
html += buildCategory(userMarks, category);
}
}
return html;
}
function buildPage() {
var html = "";
for (var user in theTree) {
html += buildUser(theTree, user);
}
html += '
';
dest.innerHTML = html;
}
function openEdit(id, name, url, notes) {
var prompt = document.getElementById("editIdPrompt");
document.getElementById("editId").value = id;
document.getElementById("pwd").value = thePwd;
if (id == 0) {
prompt.innerHTML = "Create new bookmark";
document.getElementById("user").value =
(openUser ? openUser : "");
document.getElementById("category").value = "";
document.getElementById("subcat").value = "";
document.getElementById("name").value = name;
document.getElementById("url").value = url;
document.getElementById("notes").value = notes;
} else {
prompt.innerHTML = "Edit bookmark #" + id;
var theMark = theMarks[id];
document.getElementById("user").value = theMark.user;
document.getElementById("category").value = theMark.category;
document.getElementById("subcat").value = theMark.subcat;
document.getElementById("name").value = theMark.name;
document.getElementById("url").value = theMark.url;
document.getElementById("notes").value = theMark.notes;
}
dest.style.display = 'none';
editForm.style.display = 'block';
editForm.style.visibility = 'visible';
return false;
}
function closeEdit() {
if (location.search) {
history.back();
} else {
editForm.style.display = 'none';
dest.style.display = 'block';
}
return false;
}
function applyEdit(postData, nowSec, hmac) {
var thisUser = document.getElementById("user").value;
thePwd = document.getElementById("pwd").value;
setCookie("pachyuser", thisUser, null, "/");
setCookie("pachypwd", thePwd, null, "/", null, true);
editForm.style.visibility = 'hidden';
get(new Object(), "bookmarks.php", postData +
"&id=" +
encodeURIComponent(document.getElementById("editId").value) +
"&user=" + encodeURIComponent(thisUser) +
"&time=" + nowSec +
"&hmac=" + encodeURIComponent(hmac));
}
function saveEdit() {
var thisUser = document.getElementById("user").value;
thePwd = document.getElementById("pwd").value;
var url = document.getElementById("url").value;
var category = document.getElementById("category").value;
var subcat = document.getElementById("subcat").value;
var name = document.getElementById("name").value;
var notes = document.getElementById("notes").value;
var now = new Date();
var nowSec = Math.round(now.getTime() / 1000);
var hmac = md5HmacHex(utf8("AndrewBookmarkApp\x00xmlSave\x00" +
thisUser + "\x00" + nowSec + "\x00" + url + "\x00" +
category + "\x00" + subcat + "\x00" + name + "\x00" + notes),
utf8(thePwd));
var postData = "op=xmlSave" +
"&category=" + encodeURIComponent(category) +
"&subcat=" + encodeURIComponent(subcat) +
"&name=" + encodeURIComponent(name) +
"&url=" + encodeURIComponent(url) +
"¬es=" + encodeURIComponent(notes);
applyEdit(postData, nowSec, hmac);
return false;
}
function deleteEdit() {
var thisUser = document.getElementById("user").value;
thePwd = document.getElementById("pwd").value;
var now = new Date();
var nowSec = Math.round(now.getTime() / 1000);
var hmac = md5HmacHex(utf8("AndrewBookmarkApp\x00xmlSave\x00" +
thisUser + "\x00" + nowSec + "\x00\x00\x00\x00\x00"),
utf8(thePwd));
applyEdit("op=xmlDelete", nowSec, hmac);
return false;
}
function handleFailure(thisReq) {
alert("failed");
}
function handleResult(thisReq) {
var responseXML = thisReq.xmlhttp.responseXML;
var doc = responseXML.documentElement;
if (doc.nodeName == "save") {
var status = doc.getAttribute("status");
if (status != "ok") {
editForm.style.visibility = 'visible';
alert(status);
} else {
if (location.search) {
history.back();
} else {
dest.style.display = 'block';
editForm.style.display = 'none';
dest.innerHTML = "Refreshing ...";
get(new Object(), "bookmarks.php?op=xml", null);
}
}
} else if (doc.nodeName == "bookmarks") {
theTree = new Object();
theMarks = new Object();
var curUser = null;
var curCategory = null;
var curSubcat = null;
var marks = doc.getElementsByTagName("bookmark");
for (var i = 0; i < marks.length; i++) {
var sub = marks[i];
var id = sub.getAttribute("id");
var user = decodeURIComponent(
sub.getAttribute("user"));
var category = decodeURIComponent(
sub.getAttribute("category"));
var subcat = decodeURIComponent(
sub.getAttribute("subcat"));
var name = decodeURIComponent(
sub.getAttribute("name"));
var notes = decodeURIComponent(
sub.getAttribute("notes"));
var url = decodeURIComponent(
sub.getAttribute("url"));
if (user != curUser) {
curUser = user;
theTree[curUser] = new Object();
curCategory = null;
}
if (category != curCategory) {
curCategory = category;
theTree[curUser][curCategory] = new Object();
curSubcat = null;
}
if (subcat != curSubcat) {
curSubcat = subcat;
theTree[curUser][curCategory][subcat] = new Object();
}
var theMark = new Object();
theMark.id = id;
theMark.user = user;
theMark.category = category;
theMark.subcat = subcat;
theMark.name = name;
theMark.notes = notes;
theMark.url = url;
theMarks[id] = theMark;
theTree[curUser][curCategory][curSubcat][id] = theMark;
}
dest.innerHTML = "Building...";
buildPage();
} else {
alert('Unknown result, nodeName="' + doc.nodeName + '"');
alert(thisReq.xmlhttp.responseText);
}
}
function init() {
openUser = getCookie("bookmarkUser");
if (!openUser) {
openUser = getCookie("pachyuser");
setCookie("bookmarkUser", openUser);
}
openCategory = getCookie("bookmarkCategory");
openSubcat = getCookie("bookmarkSubcat");
thePwd = getCookie("pachypwd");
if (!thePwd) thePwd = "";
dest = document.getElementById("bookmarks");
editForm = document.getElementById("editForm");
if (location.search) {
openEdit(0, getQueryArg("name"), getQueryArg("url"),
getQueryArg("notes"));
} else {
dest.innerHTML = "Reading...";
get(new Object(), "bookmarks.php?op=xml", null);
}
}