var selected = 0; // selected håller den folder eller det bokmärke som för tillfället är markerat var deleted = 0; // deleted håller den folder eller det bokmärke som senast raderats var bigId = 0; // bigId håller det största idvärdet för samtliga bokmärken/foldrar i bokmärkesträdet ///////////////////////////////////////////////////// // händelsehanterare som aktiveras när användaren klickar på en folder function selectLibrary(evt) { var node; if(dom) { node = this; } else if(ie) { node = evt.srcElement; } if(selected && selected != node) { if(selected.className == 'libraryselected') { selected.className = 'libraryname'; } else { selected.className = 'bookmark'; } selected = node; node.className = 'libraryselected'; } else if(!selected) { selected = node; node.className = 'libraryselected'; } } ///////////////////////////////////////////////////// // händelsehanterare som aktiveras när användaren klickar på ett bokmärke function selectBookmark(evt) { var node; if(dom) { node = this; } else if(ie) { node = evt.srcElement; } if(selected && selected != node) { if(selected.className == 'libraryselected') { selected.className = 'libraryname'; } else { selected.className = 'bookmark'; } selected = node; node.className = 'bookmarkselected'; } else if(!selected) { selected = node; node.className = 'bookmarkselected'; } } ////////////////////////////////////////////////////////////////////// // tar bort valt bokmärke eller folder från bokmärkesträdet(om det inte är roten) function removeNode(evt) { if(selected && selected.id != 'root') { var id = selected.id; var prevId = getPreviousId(id); var lastInNodeId = getLastNodeId(id); var nextId = getNextId(lastInNodeId); if(selected.className == 'libraryselected') { selected.className = 'libraryname'; deleted = selected.parentNode; deleted.parentNode.removeChild(deleted); } else { selected.className = 'bookmark'; deleted = selected; selected.parentNode.removeChild(selected); } selected = 0; var applet = document.getElementById('dbapplet'); applet.removeDbNode(id, lastInNodeId, prevId, nextId); } } setEventById('removeButton', 'click', removeNode); ////////////////////////////////////////////////////////////////////// // Letar fram ett nytt unikt idvärde function getId() { bigId++; return 'id' + bigId; } ////////////////////////////////////////////////////////////////////// // Lägger till en ny folder efter valt bokmärke eller som sista barn till vald folder function insertFolder(evt) { if(selected) { var library = document.createElement('div'); var expandImage = document.createElement('img'); var libraryName = document.createElement('div'); var libraryContent = document.createElement('div'); library.insertBefore(libraryName, null); library.insertBefore(libraryContent, null); var id = getId(); var nextId = getNextId(getLastNodeId(selected.id)); var parentId; if(selected.className == 'bookmarkselected') { parentId = selected.parentNode.previousSibling.id; } else { parentId = selected.id; } var txt = ''; while(txt == '') { txt = window.prompt('Folder name:', ''); } if(txt == null) { return; } txt = ' ' + txt; libraryName.insertBefore(expandImage, null); libraryName.insertBefore(document.createTextNode(txt), null); if(selected.className == 'libraryselected') { var ip = selected.nextSibling; if(ip.nodeType == 3) { // Textnode? ip = ip.nextSibling; } ip.insertBefore(library, null); } else { selected.parentNode.insertBefore(library, selected); selected.parentNode.insertBefore(selected, library); } if(ie) { // ie tycker inte omm 'class' library.setAttribute('className', 'library'); libraryContent.setAttribute('className', 'libraryContent'); libraryName.setAttribute('className', 'libraryselected'); } else { // och mozilla tycker inte om className library.setAttribute('class', 'library'); libraryContent.setAttribute('class', 'libraryContent'); libraryName.setAttribute('class', 'libraryselected'); } libraryName.setAttribute('id', id); expandImage.setAttribute('id', 'e' + id); expandImage.setAttribute('src', 'expanded.gif'); setEventHandlers(id); if(selected.className == 'libraryselected') { selected.className = 'libraryname'; } else { selected.className = 'bookmark'; } selected = libraryName; var prevId = getPreviousId(id); var applet = document.getElementById('dbapplet'); applet.addFolderNode(id, prevId, nextId, parentId, txt) } } setEventById('insertButton', 'click', insertFolder); ////////////////////////////////////////////////////////////////////// // flyttar vald nod ett hack uppåt function moveUp(evt) { if(selected) { // är detta rotens första barn går det inte att klättra högre i trädet if((selected.className == 'bookmarkselected' && selected.parentNode.firstChild == selected && selected.parentNode.previousSibling.id == 'root') || (selected.parentNode.parentNode.firstChild == selected.parentNode && selected.parentNode.parentNode.previousSibling.id == 'root')) { return; } var thisNode = selected; var classNme = selected.className; var parentNode; if(selected.className == 'bookmarkselected') { // om detta är äldsta barnet if(selected.previousSibling == null) { parentNode = selected.parentNode.previousSibling; removeNode(null); selected = parentNode; pasteAsPreviousSibling(); selected = thisNode; selected.className = 'bookmarkselected'; } // är nodens äldre syskon ett bopkmärke else if(selected.previousSibling.className == 'bookmark') { selected = selected.previousSibling; removeNode(null); selected = thisNode; paste('dummy'); } // annars är det ett bibliotek else { parentNode = selected.previousSibling.firstChild; removeNode(null); selected = parentNode; paste('dummy'); selected = thisNode; selected.className = 'bookmarkselected'; } } else { // noden är ett bibliotek // om detta är äldsta barnet if(selected.parentNode.previousSibling == null) { parentNode = selected.parentNode.parentNode.previousSibling; removeNode(null); selected = parentNode; pasteAsPreviousSibling(); selected = thisNode; selected.className = 'libraryselected'; } // är nodens äldre syskon ett bopkmärke else if(selected.parentNode.previousSibling.className == 'bookmark') { parentNode = selected.parentNode.previousSibling; removeNode(null); selected = parentNode; pasteAsPreviousSibling(); selected = thisNode; selected.className = 'libraryselected'; } // annars är det ett bibliotek else { parentNode = selected.parentNode.previousSibling.firstChild; removeNode(null); selected = parentNode; paste('dummy'); selected = thisNode; selected.className = 'libraryselected'; } } } } setEventById('upButton', 'click', moveUp); ////////////////////////////////////////////////////////////////////// // flyttar vald nod ett hack ner function moveDown(evt) { if(selected) { var thisNode = selected; var classNme = selected.className; if(thisNode.parentNode.lastChild.id == thisNode.id || (thisNode.className == 'libraryselected' && thisNode.parentNode.parentNode.lastChild.className == 'library' && thisNode.parentNode.parentNode.lastChild.firstChild.id == thisNode.id)) { // är selected 'yngsta' barnet? if((thisNode.className == 'libraryselected' && thisNode.parentNode.parentNode.previousSibling.id == 'root') || (thisNode.className == 'bookmarkselected' && thisNode.parentNode.previousSibling.id == 'root')) { return; } var nextNode; if(thisNode.className == 'libraryselected') { nextNode = thisNode.parentNode.parentNode.parentNode; } else { nextNode = thisNode.parentNode.parentNode; } removeNode(null); selected = nextNode; pasteAsNextSibling(); } else { var nextNode = document.getElementById(getNextId(getLastNodeId(thisNode.id))); removeNode(null); selected = nextNode; paste(null); } selected = thisNode; selected.className = classNme; } } setEventById('downButton', 'click', moveDown); ////////////////////////////////////////////////////////////////////// // sätter in en tidigare deletad nod som den nu valda nodens nästa syskon om detta är ett bibliotek function pasteAsNextSibling() { if(selected && selected.className == 'library') { selected.parentNode.insertBefore(deleted, selected); selected.parentNode.insertBefore(selected, deleted); var id; if(deleted.className == 'library') { id = deleted.firstChild.id; } else { id = deleted.id; } var lastInNodeId = getLastNodeId(id); var prevId = getPreviousId(id); var nextId = getNextId(lastInNodeId); var parentId = getParentId(id); var applet = document.getElementById('dbapplet'); applet.pasteNode(id, lastInNodeId, prevId, nextId, parentId) deleted = 0; } } ////////////////////////////////////////////////////////////////////// // sätter in en tidigare deletad nod som äldre syskon till vald nod function pasteAsPreviousSibling() { if(selected) { var prevNode; if(selected.className == 'bookmarkselected' || selected.className == 'bookmark') { prevNode = selected; } else { prevNode = selected.parentNode; } prevNode.parentNode.insertBefore(deleted, prevNode); var id; if(deleted.className == 'library') { id = deleted.firstChild.id; } else { id = deleted.id; } var lastInNodeId = getLastNodeId(id); var prevId = getPreviousId(id); var nextId = getNextId(lastInNodeId); var parentId = getParentId(id); var applet = document.getElementById('dbapplet'); applet.pasteNode(id, lastInNodeId, prevId, nextId, parentId) deleted = 0; } } ////////////////////////////////////////////////////////////////////// // sätter in en tidigare deletad nod efter den nu valda noden function paste(evt) { if(selected) { if(selected.className == 'bookmarkselected' || selected.className == 'bookmark') { selected.parentNode.insertBefore(deleted, selected); selected.parentNode.insertBefore(selected, deleted); } else { var tmp = selected.nextSibling; while(tmp.nodeType == 3) { // textnod? tmp = tmp.nextSibling; } if(evt != null || tmp.lastChild == null) { tmp.insertBefore(deleted, null); } else { tmp.insertBefore(deleted, tmp.firstChild); } } var id; if(deleted.className == 'library') { id = deleted.firstChild.id; } else { id = deleted.id; } var lastInNodeId = getLastNodeId(id); var prevId = getPreviousId(id); var nextId = getNextId(lastInNodeId); var parentId = getParentId(id); var applet = document.getElementById('dbapplet'); applet.pasteNode(id, lastInNodeId, prevId, nextId, parentId) deleted = 0; } } setEventById('pasteButton', 'click', paste); ////////////////////////////////////////////////////////////////////// // skapar och lägger in ett nytt bokmärke function pasteBookmark(evt) { if(selected) { var bookmark = document.createElement('div'); var name = document.getElementById('name').value; var bookmarkName = document.createTextNode(name); var location = document.createElement('span'); var a = document.createElement('a'); var destination = document.getElementById('location').value; var url = document.createTextNode(destination); a.insertBefore(url, null); location.insertBefore(a, null); bookmark.insertBefore(bookmarkName, null); bookmark.insertBefore(location, null); var id = getId(); if(ie) { // ie tycker inte omm 'class' bookmark.setAttribute('className', 'bookmark'); location.setAttribute('className', 'location'); } else { // och mozilla tycker inte om className bookmark.setAttribute('class', 'bookmark'); location.setAttribute('class', 'location'); } bookmark.setAttribute('id', id); a.setAttribute('href', destination); if(selected.className == 'bookmarkselected') { selected.parentNode.insertBefore(bookmark, selected); selected.parentNode.insertBefore(selected, bookmark); } else { var tmp = selected.nextSibling; while(tmp.nodeType == 3) { // textnod? tmp = tmp.nextSibling; } tmp.insertBefore(bookmark, null); } setEventHandlers(id); var previous = getPreviousId(id); var next = getNextId(id); var parent = getParentId(id); document.getElementById('dbapplet').addBookmarkNode(id, previous, next, parent, name, destination); } } setEventById('okButton', 'click', pasteBookmark); ////////////////////////////////////////////////////////////////////// // returnerar idvärdet för närmast föregående bokmärke eller katalog function getPreviousId(id) { var tmp = document.getElementById(id); if(tmp.className == 'root') { return null; // tmp är äldst i världen } if(tmp.className != 'bookmark' && tmp.className != 'bookmarkselected') { // tmp är ett bibliotek annars ett bokmärke tmp = tmp.parentNode } if(tmp.previousSibling != null) { // tmp är inte första barnet if(tmp.previousSibling.className == 'library') { // äldre syskonet är ett bibliotek tmp = tmp.previousSibling.firstChild; // tmp blir nu detta bibliotek while(tmp.nextSibling.lastChild != null && tmp.nextSibling.lastChild.className == 'library') { // så länge biblioteket har ett yngsta (som givetvis också kan vara älst) barn och detta barn är ett bibliotek tmp = tmp.nextSibling.lastChild.firstChild; // blir tmp detta bibliotek } if(tmp.nextSibling.lastChild != null) { return tmp.nextSibling.lastChild.id; // om tmp har ett yngsta barn är detta ett bokmärke } return tmp.id; // och annars är det 'biblioteket' tmp som gäller } return tmp.previousSibling.id; // äldre syskonet var ett bokmärke } return tmp.parentNode.previousSibling.id; // tmp är det älsta barnet } ////////////////////////////////////////////////////////////////////// // returnerar idvärdet för föräldern function getParentId(id) { var tmp = document.getElementById(id); if(tmp.id == 'root') { return null; } if(tmp.className == 'bookmark' || tmp.className == 'bookmarkselected') { return tmp.parentNode.previousSibling.id; } return tmp.parentNode.parentNode.previousSibling.id; } ////////////////////////////////////////////////////////////////////// // returnerar idvärdet för sista barnet till den här noden eller nodens // idvärde om den är barnlös function getLastNodeId(id) { var tmp = document.getElementById(id); if(tmp.className == 'bookmark' || tmp.className == 'bookmarkselected') { return id; } // tmp är ett bibliotek tmp = tmp.parentNode; while(tmp.lastChild.lastChild != null && tmp.lastChild.lastChild.className == 'library') { tmp = tmp.lastChild.lastChild; } if(tmp.lastChild.lastChild != null) { return tmp.lastChild.lastChild.id; } if(tmp.className == 'library') { return tmp.firstChild.id; } return tmp.id; } ////////////////////////////////////////////////////////////////////// // returnerar idvärdet för närmast efterföljande bokmärke eller katalog function getNextId(id) { var tmp = document.getElementById(id); var nextElement; // är tmp ett bibliotek som har barn? if((tmp.className == 'libraryname' || tmp.className == 'libraryselected') && tmp.nextSibling.firstChild != null) { nextElement = tmp.nextSibling.firstChild; } // har tmp ett yngre syskon? else if((tmp.className == 'bookmark' || tmp.className == 'bookmarkselected') && tmp.nextSibling != null) { nextElement = tmp.nextSibling; } else if((tmp.className == 'libraryname' || tmp.className == 'libraryselected') && tmp.parentNode.nextSibling != null) { nextElement = tmp.parentNode.nextSibling; } // finns någon förfader med yngre syskon? else { if(tmp.className == 'bookmark' || tmp.className == 'bookmarkselected') { tmp = tmp.parentNode.parentNode; } else { tmp = tmp.parentNode; } while(tmp.nextSibling == null) { if(tmp.firstChild.id == 'root') { return null; } tmp = tmp.parentNode.parentNode; } nextElement = tmp.nextSibling; } // är nextElement ett bokmärke eller ett bibliotek? if(nextElement.className == 'library') { return nextElement.firstChild.id; } return nextElement.id; } ////////////////////////////////////////////////////////////////////// // sparar ändringar i databasen function saveChanges(evt) { document.getElementById('dbapplet').dbupdate(); } setEventById('saveButton', 'click', saveChanges); ////////////////////////////////////////////////////////////////////// // laddar om sidan utan att spara förändringar i databasen function undoChanges(evt) { document.getElementById('dbapplet').cancelUpdate(); location.reload(true); } setEventById('cancelButton', 'click', undoChanges); ////////////////////////////////////////////////////////////////////// // expanderad folder blir oexpanderad och tvärtom function expandLibrary(evt) { var applet = document.getElementById('dbapplet'); var node; if(dom) { node = this; } else if(ie) { node = evt.srcElement; } var container = node.parentNode.nextSibling; if(node.src.indexOf('/expanded.gif') != -1) { node.src = './unexpanded.gif'; container.className = 'libraryContenthidden'; applet.setExpanded(node.parentNode.id, false); } else { node.src = './expanded.gif'; container.className = 'libraryContent'; applet.setExpanded(node.parentNode.id, true); } } ////////////////////////////////////////////////////////////////////// // Sätter eventhandlers för elementet med id id och dess barn. function setEventHandlers(id) { var node = document.getElementById(id); var idNum = Number(id.substring(2)); if(id != 'root' && idNum > bigId) { bigId = idNum; } if(node.className == 'libraryname' || node.className == 'libraryselected') { setEventById(id, 'click', selectLibrary); setEventById('e' + id, 'click', expandLibrary); node = node.nextSibling; if(node.nodeType == 3) { // Textnode? node = node.nextSibling; } var children = node.childNodes; for(var i = 0; i < children.length; i++) { if(children[i].nodeType != 3) { // !Textnode? if(children[i].className == 'library') { var tmpNode = children[i].firstChild; while(tmpNode.nodeType == 3) { // TextNode? tmpNode = tmpNode.nextSibling; } setEventHandlers(tmpNode.id); } else { setEventHandlers(children[i].id); } } } } else { setEventById(id, 'click', selectBookmark); } } setEventHandlers('root'); // ser till att alla bokmärken och foldrar assosieras med tillämpliga händelsehanterare selected = document.getElementById('root'); // ser till att roten blir vald