// 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); } }