15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Search the bookmarks when entering the search keyword.
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)$(function() {
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  $('#search').change(function() {
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     $('#bookmarks').empty();
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     dumpBookmarks($('#search').val());
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  });
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)});
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Traverse the bookmark tree, and print the folder and nodes.
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function dumpBookmarks(query) {
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var bookmarkTreeNodes = chrome.bookmarks.getTree(
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    function(bookmarkTreeNodes) {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      $('#bookmarks').append(dumpTreeNodes(bookmarkTreeNodes, query));
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    });
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function dumpTreeNodes(bookmarkNodes, query) {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var list = $('<ul>');
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var i;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (i = 0; i < bookmarkNodes.length; i++) {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    list.append(dumpNode(bookmarkNodes[i], query));
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return list;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function dumpNode(bookmarkNode, query) {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (bookmarkNode.title) {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (query && !bookmarkNode.children) {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (String(bookmarkNode.title).indexOf(query) == -1) {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return $('<span></span>');
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var anchor = $('<a>');
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    anchor.attr('href', bookmarkNode.url);
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    anchor.text(bookmarkNode.title);
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * When clicking on a bookmark in the extension, a new tab is fired with
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * the bookmark url.
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    anchor.click(function() {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome.tabs.create({url: bookmarkNode.url});
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    });
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var span = $('<span>');
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var options = bookmarkNode.children ?
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      $('<span>[<a href="#" id="addlink">Add</a>]</span>') :
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      $('<span>[<a id="editlink" href="#">Edit</a> <a id="deletelink" ' +
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'href="#">Delete</a>]</span>');
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var edit = bookmarkNode.children ? $('<table><tr><td>Name</td><td>' +
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      '<input id="title"></td></tr><tr><td>URL</td><td><input id="url">' +
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      '</td></tr></table>') : $('<input>');
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Show add and edit links when hover over.
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        span.hover(function() {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        span.append(options);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        $('#deletelink').click(function() {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          $('#deletedialog').empty().dialog({
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 autoOpen: false,
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 title: 'Confirm Deletion',
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 resizable: false,
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 height: 140,
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 modal: true,
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 overlay: {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   backgroundColor: '#000',
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   opacity: 0.5
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 },
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 buttons: {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   'Yes, Delete It!': function() {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      chrome.bookmarks.remove(String(bookmarkNode.id));
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      span.parent().remove();
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      $(this).dialog('destroy');
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    },
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    Cancel: function() {
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      $(this).dialog('destroy');
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    }
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 }
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               }).dialog('open');
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         });
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        $('#addlink').click(function() {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          $('#adddialog').empty().append(edit).dialog({autoOpen: false,
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            closeOnEscape: true, title: 'Add New Bookmark', modal: true,
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            buttons: {
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            'Add' : function() {
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               chrome.bookmarks.create({parentId: bookmarkNode.id,
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 title: $('#title').val(), url: $('#url').val()});
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               $('#bookmarks').empty();
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               $(this).dialog('destroy');
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               window.dumpBookmarks();
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             },
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            'Cancel': function() {
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               $(this).dialog('destroy');
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }}).dialog('open');
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        });
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        $('#editlink').click(function() {
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         edit.val(anchor.text());
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         $('#editdialog').empty().append(edit).dialog({autoOpen: false,
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           closeOnEscape: true, title: 'Edit Title', modal: true,
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           show: 'slide', buttons: {
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              'Save': function() {
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 chrome.bookmarks.update(String(bookmarkNode.id), {
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   title: edit.val()
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 });
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 anchor.text(edit.val());
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 options.show();
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 $(this).dialog('destroy');
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              },
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             'Cancel': function() {
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 $(this).dialog('destroy');
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             }
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         }}).dialog('open');
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        });
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        options.fadeIn();
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      },
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // unhover
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      function() {
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        options.remove();
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }).append(anchor);
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var li = $(bookmarkNode.title ? '<li>' : '<div>').append(span);
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (bookmarkNode.children && bookmarkNode.children.length > 0) {
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    li.append(dumpTreeNodes(bookmarkNode.children, query));
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return li;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)document.addEventListener('DOMContentLoaded', function () {
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dumpBookmarks();
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)});
129