annotate booket.js @ 26:8c2f3e72d514

Create new view for notifications Create new view for notifications which handles the keyboard shortcuts overlay message and the unsaved changes notification. This ensures that the unsaved changes notification is always visible, even when the save form expander is closed.
author Guido Berhoerster <guido+booket@berhoerster.name>
date Mon, 06 Oct 2014 13:52:50 +0200
parents b2c9c4fb8d4c
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1 /*
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
2 * Copyright (C) 2014 Guido Berhoerster <guido+booket@berhoerster.name>
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
3 *
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
4 * Permission is hereby granted, free of charge, to any person obtaining
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
5 * a copy of this software and associated documentation files (the
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
6 * "Software"), to deal in the Software without restriction, including
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
7 * without limitation the rights to use, copy, modify, merge, publish,
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
8 * distribute, sublicense, and/or sell copies of the Software, and to
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
9 * permit persons to whom the Software is furnished to do so, subject to
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
10 * the following conditions:
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
11 *
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
12 * The above copyright notice and this permission notice shall be included
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
13 * in all copies or substantial portions of the Software.
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
14 *
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
16 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
17 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
18 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
19 * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
20 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
21 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
22 */
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
23
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
24 (function () {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
25 'use strict';
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
26
6
e9ad4c625b7a Add bookmarklet for bookmarking
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 5
diff changeset
27 var BOOKMARKLET_URI =
7
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
28 'javascript:(function() {' +
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
29 '\'use strict\';' +
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
30 '' +
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
31 'function displayBookmarkData(bookmarkData) {' +
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
32 'window.alert(\'Copy the following data and paste it into \' +' +
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
33 '\'Booket:\\n\\n\' + JSON.stringify(bookmarkData));' +
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
34 '}' +
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
35 '' +
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
36 'var bookmarkData = {' +
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
37 '\'url\': document.URL,' +
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
38 '\'title\': document.title,' +
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
39 '\'favicon\': undefined' +
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
40 '};' +
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
41 'var faviconLinkElement;' +
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
42 'var faviconUrls = [];' +
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
43 'var aElement;' +
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
44 'var canvasElement;' +
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
45 'var canvasCtx;' +
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
46 'var imgElement;' +
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
47 '' +
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
48 'aElement = document.createElement(\'a\');' +
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
49 'aElement.href = document.URL;' +
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
50 '' +
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
51 'faviconUrls.push(aElement.protocol + \'//\' + aElement.host + ' +
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
52 '\'/favicon.ico\');' +
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
53 '' +
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
54 'faviconLinkElement = document.querySelector(' +
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
55 '\'link[rel~=\\\'icon\\\']\');' +
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
56 'if (faviconLinkElement !== null) {' +
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
57 'faviconUrls.push(faviconLinkElement.href);' +
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
58 '}' +
6
e9ad4c625b7a Add bookmarklet for bookmarking
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 5
diff changeset
59 '' +
7
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
60 'canvasElement = document.createElement(\'canvas\');' +
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
61 'canvasCtx = canvasElement.getContext(\'2d\');' +
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
62 '' +
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
63 'imgElement = new Image();' +
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
64 'imgElement.addEventListener(\'load\', function(e) {' +
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
65 'var faviconUrl;' +
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
66 '' +
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
67 'canvasElement.width = 16;' +
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
68 'canvasElement.height = 16;' +
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
69 'canvasCtx.clearRect(0, 0, 16, 16);' +
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
70 'try {' +
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
71 'canvasCtx.drawImage(this, 0, 0, 16, 16);' +
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
72 'bookmarkData.favicon = canvasElement.toDataURL();' +
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
73 '} catch (exception) {' +
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
74 'faviconUrl = faviconUrls.pop();' +
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
75 '}' +
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
76 'if (bookmarkData.favicon !== undefined || ' +
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
77 'faviconUrl === undefined) {' +
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
78 'displayBookmarkData(bookmarkData);' +
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
79 '} else {' +
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
80 'imgElement.src = faviconUrl;' +
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
81 '}' +
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
82 '});' +
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
83 'imgElement.addEventListener(\'error\', function(e) {' +
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
84 'var faviconUrl;' +
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
85 '' +
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
86 'faviconUrl = faviconUrls.pop();' +
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
87 'if (faviconUrl !== undefined) {' +
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
88 'imgElement.src = faviconUrl;' +
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
89 '} else {' +
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
90 'displayBookmarkData(bookmarkData);' +
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
91 '}' +
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
92 '});' +
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
93 'imgElement.src = faviconUrls.pop();' +
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
94 '})();';
6
e9ad4c625b7a Add bookmarklet for bookmarking
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 5
diff changeset
95
e9ad4c625b7a Add bookmarklet for bookmarking
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 5
diff changeset
96
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
97 /*
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
98 * utility stuff
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
99 */
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
100
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
101 function isNumber(number) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
102 return (Object.prototype.toString.call(number) === '[object Number]');
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
103 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
104
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
105 function isString(number) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
106 return (Object.prototype.toString.call(number) === '[object String]');
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
107 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
108
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
109 function arrayEqual(array1, array2) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
110 if (!Array.isArray(array1)) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
111 throw new TypeError(typeof array1 + ' is not an array');
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
112 } else if (!Array.isArray(array2)) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
113 throw new TypeError(typeof array2 + ' is not an array');
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
114 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
115
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
116 if (array1.length !== array2.length) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
117 return false;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
118 } else if (array1.length === 0 && array2.length === 0) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
119 return true;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
120 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
121
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
122 return array1.slice().sort().every(function (value, i) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
123 return value === array2[i];
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
124 });
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
125 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
126
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
127 function parseHash(url) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
128 var hashData;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
129 var pos;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
130 var hash;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
131 var hashParts;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
132 var key;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
133 var value;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
134 var i;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
135
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
136 hashData = new StringMap();
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
137 pos = url.indexOf('#');
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
138 hash = (pos > -1) ? url.substr(pos + 1) : '';
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
139 // hash parts are seperated by a ';'
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
140 hashParts = hash.split(';');
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
141 for (i = 0; i < hashParts.length; i++) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
142 // key and value pairs are seperated by a '=', an empty value will
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
143 // cause the key to be ignored
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
144 pos = hashParts[i].indexOf('=');
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
145 if (pos > -1) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
146 key = decodeURIComponent(hashParts[i].substr(0, pos));
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
147 value = decodeURIComponent(hashParts[i].substr(pos + 1));
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
148 hashData.set(key, value);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
149 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
150 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
151
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
152 return hashData;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
153 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
154
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
155 function serializeHash(url, hashData) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
156 var hashParts = [];
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
157 var pos;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
158
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
159 pos = url.indexOf('#');
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
160 if (pos > -1) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
161 url = url.substr(0, pos);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
162 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
163
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
164 hashData.forEach(function (value, key) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
165 if (value !== '') {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
166 hashParts.push(encodeURIComponent(key) + '=' +
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
167 encodeURIComponent(value));
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
168 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
169 });
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
170
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
171 // only append a '#' if there are any hash parts
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
172 return url + (hashParts.length > 0 ? '#' + hashParts.join(';') : '');
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
173 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
174
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
175 function getAncestorElementDatasetItem(node, item) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
176 while ((node = node.parentNode) !== null) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
177 if (node.dataset && node.dataset[item] !== undefined) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
178 return node.dataset[item];
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
179 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
180 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
181
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
182 return undefined;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
183 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
184
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
185 // for use with Node.querySelector() and Node.querySelectorAll()
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
186 function createDatasetSelector(name, value) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
187 return '[data-' + name + '="' + value.replace(/["\\]/g, '\\$&') + '"]';
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
188 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
189
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
190 function extend(targetObject, sourceObject) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
191 var propertyName;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
192
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
193 for (propertyName in sourceObject.prototype) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
194 if (!Object.prototype.hasOwnProperty.call(targetObject.prototype,
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
195 propertyName)) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
196 targetObject.prototype[propertyName] =
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
197 sourceObject.prototype[propertyName];
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
198 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
199 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
200 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
201
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
202
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
203 var ObservableMixin = function () {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
204 this._eventsObservers = {};
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
205 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
206
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
207 ObservableMixin.prototype.addObserver = function (eventName, observer) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
208 var i;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
209
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
210 if (!Object.prototype.hasOwnProperty.call(this._eventsObservers,
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
211 eventName)) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
212 this._eventsObservers[eventName] = [];
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
213 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
214
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
215 // prevent observers for an event from being called more than once
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
216 for (i = 0; i < this._eventsObservers[eventName].length; i++) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
217 if (this._eventsObservers[eventName][i] === observer) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
218 return;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
219 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
220 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
221 this._eventsObservers[eventName].push(observer);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
222 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
223
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
224 ObservableMixin.prototype.deleteObserver = function (eventName, observer) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
225 var i = 0;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
226
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
227 if (!Object.prototype.hasOwnProperty.call(this._eventsObservers,
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
228 eventName)) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
229 return;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
230 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
231
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
232 while (i < this._eventsObservers[eventName].length) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
233 if (this._eventsObservers[eventName][i] === observer) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
234 this._eventsObservers[eventName].splice(i, 1);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
235 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
236 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
237 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
238
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
239 ObservableMixin.prototype.notify = function (eventName) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
240 var origArguments;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
241
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
242 if (!Object.prototype.hasOwnProperty.call(this._eventsObservers,
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
243 eventName)) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
244 return;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
245 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
246
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
247 origArguments = Array.prototype.slice.call(arguments, 1);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
248 this._eventsObservers[eventName].forEach(function (observer, i) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
249 // call the observer function and pass on any additional arguments
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
250 observer.apply(undefined, origArguments);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
251 });
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
252 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
253
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
254
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
255 var StringMap = function (iter) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
256 this._stringMap = Object.create(null);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
257
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
258 if (iter !== undefined) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
259 if (Array.isArray(iter)) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
260 iter.forEach(function (pair) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
261 if (Array.isArray(pair)) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
262 this.set(pair[0], pair[1]);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
263 } else {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
264 throw new TypeError(typeof pair + ' is not an array');
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
265 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
266 }, this);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
267 } else {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
268 throw new TypeError(typeof iter + ' is not iterable');
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
269 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
270 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
271 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
272
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
273 Object.defineProperty(StringMap.prototype, 'size', {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
274 get: function () {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
275 var size = 0;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
276 var key;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
277
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
278 for (key in this._stringMap) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
279 if (key.charAt(0) === '@') {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
280 size++;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
281 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
282 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
283
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
284 return size;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
285 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
286 });
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
287
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
288 StringMap.prototype.set = function (key, value) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
289 this._stringMap['@' + key] = value;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
290
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
291 return this;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
292 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
293
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
294 StringMap.prototype.get = function (key) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
295 return this._stringMap['@' + key];
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
296 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
297
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
298 StringMap.prototype.has = function (key) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
299 return (('@' + key) in this._stringMap);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
300 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
301
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
302 StringMap.prototype.delete = function (key) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
303 if (this.has(key)) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
304 delete this._stringMap['@' + key];
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
305
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
306 return true;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
307 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
308
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
309 return false;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
310 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
311
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
312 StringMap.prototype.forEach = function (callbackFn, thisArg) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
313 Object.keys(this._stringMap).forEach(function (key) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
314 if (key.charAt(0) === '@') {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
315 key = key.substr(1);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
316 callbackFn.call(thisArg, this.get(key), key, this);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
317 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
318 }, this);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
319 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
320
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
321 StringMap.prototype.keys = function () {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
322 return Object.keys(this._stringMap).map(function (key) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
323 return key.substr(1);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
324 });
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
325 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
326
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
327 StringMap.prototype.toJSON = function () {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
328 return this._stringMap;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
329 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
330
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
331 StringMap.prototype.toString = function () {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
332 return Object.prototype.toString.call(this._stringMap);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
333 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
334
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
335
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
336 var StringSet = function (iter) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
337 this._stringArray = [];
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
338 this._stringMap = new StringMap();
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
339 if (iter !== undefined) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
340 if (Array.isArray(iter) || iter instanceof StringSet) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
341 iter.forEach(function (string) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
342 this.add(string);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
343 }, this);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
344 } else {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
345 throw new TypeError(typeof iter + ' is not iterable');
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
346 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
347 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
348 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
349
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
350 Object.defineProperty(StringSet.prototype, 'size', {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
351 get: function () {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
352 return this._stringArray.length;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
353 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
354 });
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
355
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
356 StringSet.prototype.has = function (string) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
357 return this._stringMap.has(string);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
358 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
359
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
360 StringSet.prototype.add = function (string) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
361 if (!this.has(string)) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
362 this._stringMap.set(string, true);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
363 this._stringArray.push(string);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
364 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
365 return this;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
366 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
367
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
368 StringSet.prototype.delete = function (string) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
369 if (this.has(string)) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
370 this._stringMap.delete(string);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
371 this._stringArray.splice(this._stringArray.indexOf(string), 1);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
372 return true;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
373 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
374 return false;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
375 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
376
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
377 StringSet.prototype.forEach = function (callbackFn, thisArg) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
378 this._stringArray.forEach(function (key) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
379 callbackFn.call(thisArg, key, key, this);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
380 });
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
381 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
382
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
383 StringSet.prototype.keys = function () {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
384 return this._stringArray.slice();
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
385 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
386
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
387 StringSet.prototype.values = function () {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
388 return this._stringArray.slice();
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
389 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
390
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
391 StringSet.prototype.clear = function () {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
392 this._stringMap = new StringMap();
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
393 this._stringArray = [];
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
394 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
395
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
396 StringSet.prototype.toJSON = function () {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
397 return this._stringArray;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
398 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
399
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
400 StringSet.prototype.toString = function () {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
401 return this._stringArray.toString();
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
402 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
403
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
404
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
405 /*
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
406 * model
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
407 */
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
408
7
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
409 var Bookmark = function (url, title, favicon, tags, ctime, mtime) {
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
410 var parsedTime;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
411
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
412 if (!isString(url)) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
413 throw new TypeError(typeof url + ' is not a string');
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
414 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
415 this.url = url;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
416
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
417 this.title = (isString(title) && title !== '') ? title : url;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
418
7
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
419 if (isString(favicon) && favicon.match(/^data:image\/png;base64,/)) {
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
420 this.favicon = favicon;
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
421 } else {
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
422 this.favicon = undefined;
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
423 }
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
424
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
425 if (Array.isArray(tags)) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
426 // remove duplicates, non-string or empty tags and tags containing
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
427 // commas
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
428 this.tags = new StringSet(tags.filter(function (tag) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
429 return (isString(tag) && tag !== '' && tag.indexOf(',') === -1);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
430 }).sort());
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
431 } else {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
432 this.tags = new StringSet();
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
433 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
434
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
435 if (isNumber(ctime) || isString(ctime)) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
436 parsedTime = new Date(ctime);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
437 this.ctime = !isNaN(parsedTime.getTime()) ? parsedTime : new Date();
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
438 } else {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
439 this.ctime = new Date();
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
440 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
441
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
442 if (isNumber(mtime) || isString(mtime)) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
443 parsedTime = new Date(mtime);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
444 // modification time must be greater than creation time
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
445 this.mtime = (!isNaN(parsedTime.getTime()) ||
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
446 parsedTime >= this.ctime) ? parsedTime : new Date(this.ctime);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
447 } else {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
448 this.mtime = new Date(this.ctime);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
449 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
450 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
451
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
452
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
453 var BookmarkModel = function () {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
454 ObservableMixin.call(this);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
455
18
3642bb668af1 Indicate if there are unsaved changes
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 16
diff changeset
456 this._unsavedChanges = false;
10
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
457 this.loadFileReader = null;
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
458 this.importFileReader= null;
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
459 this._bookmarks = new StringMap();
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
460 this._tagCount = new StringMap();
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
461 this._filterTags = new StringSet();
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
462 this._searchTerm = '';
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
463 this._filteredBookmarks = new StringSet();
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
464 this._searchedBookmarks = new StringSet();
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
465 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
466
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
467 extend(BookmarkModel, ObservableMixin);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
468
18
3642bb668af1 Indicate if there are unsaved changes
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 16
diff changeset
469 Object.defineProperty(BookmarkModel.prototype, 'unsavedChanges', {
3642bb668af1 Indicate if there are unsaved changes
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 16
diff changeset
470 set: function (value) {
3642bb668af1 Indicate if there are unsaved changes
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 16
diff changeset
471 if (this._unsavedChanges !== value) {
3642bb668af1 Indicate if there are unsaved changes
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 16
diff changeset
472 this._unsavedChanges = value;
3642bb668af1 Indicate if there are unsaved changes
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 16
diff changeset
473 this.notify('unsaved-changes-changed', value)
3642bb668af1 Indicate if there are unsaved changes
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 16
diff changeset
474 }
3642bb668af1 Indicate if there are unsaved changes
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 16
diff changeset
475 },
3642bb668af1 Indicate if there are unsaved changes
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 16
diff changeset
476 get: function () {
3642bb668af1 Indicate if there are unsaved changes
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 16
diff changeset
477 return this._unsavedChanges;
3642bb668af1 Indicate if there are unsaved changes
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 16
diff changeset
478 }
3642bb668af1 Indicate if there are unsaved changes
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 16
diff changeset
479 });
3642bb668af1 Indicate if there are unsaved changes
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 16
diff changeset
480
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
481 BookmarkModel.prototype.add = function (bookmarks) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
482 var addedBookmarkUrls = new StringSet();
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
483
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
484 // argument can be a single bookmark or a list of bookmarks
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
485 if (!Array.isArray(bookmarks)) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
486 bookmarks = [bookmarks];
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
487 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
488
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
489 bookmarks.forEach(function (bookmark) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
490 // delete any existing bookmark for the given URL before adding the new
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
491 // one in order to update views
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
492 this.delete(bookmark.url);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
493 this._bookmarks.set(bookmark.url, bookmark);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
494 addedBookmarkUrls.add(bookmark.url);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
495 this.unsavedChanges = true;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
496 this.notify('bookmark-added', bookmark);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
497
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
498 // update tag count
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
499 bookmark.tags.forEach(function (tag) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
500 var tagCount;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
501
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
502 if (this._tagCount.has(tag)) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
503 tagCount = this._tagCount.get(tag) + 1;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
504 this._tagCount.set(tag, tagCount);
12
948048e40fab Add option for displaying tag list as a tag cloud
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 11
diff changeset
505 this.notify('tag-count-changed', tag, this._tagCount);
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
506 } else {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
507 this._tagCount.set(tag, 1);
12
948048e40fab Add option for displaying tag list as a tag cloud
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 11
diff changeset
508 this.notify('tag-added', tag, this._tagCount);
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
509 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
510 }, this);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
511 }, this);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
512
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
513 // apply tag filter and search added bookmarks
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
514 this.updateFilteredSearchedBookmarks(addedBookmarkUrls);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
515 this.notify('filter-tags-search-changed', this._searchedBookmarks,
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
516 this._filterTags, this._searchTerm);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
517 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
518
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
519 BookmarkModel.prototype.has = function (url) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
520 return this._bookmarks.has(url);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
521 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
522
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
523 BookmarkModel.prototype.get = function (url) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
524 return this._bookmarks.get(url);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
525 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
526
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
527 BookmarkModel.prototype.delete = function (urls) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
528 var needUpdateFilterTags = false;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
529
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
530 // argument can be a single bookmark or a list of bookmarks
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
531 if (!Array.isArray(urls)) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
532 urls = [urls];
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
533 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
534
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
535 urls.forEach(function (url) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
536 var bookmark;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
537 var tagCount;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
538
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
539 if (this._bookmarks.has(url)) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
540 bookmark = this._bookmarks.get(url);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
541 this._bookmarks.delete(url);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
542 this.unsavedChanges = true;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
543 this.notify('bookmark-deleted', bookmark.url);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
544
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
545 // update tag count
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
546 bookmark.tags.forEach(function (tag) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
547 if (this._tagCount.has(tag)) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
548 tagCount = this._tagCount.get(tag);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
549 if (tagCount > 1) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
550 tagCount--;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
551 this._tagCount.set(tag, tagCount);
12
948048e40fab Add option for displaying tag list as a tag cloud
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 11
diff changeset
552 this.notify('tag-count-changed', tag, this._tagCount);
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
553 } else {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
554 this._tagCount.delete(tag);
12
948048e40fab Add option for displaying tag list as a tag cloud
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 11
diff changeset
555 this.notify('tag-deleted', tag, this._tagCount);
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
556
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
557 if (this._filterTags.has(tag)) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
558 this._filterTags.delete(tag);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
559 needUpdateFilterTags = true;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
560 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
561 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
562 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
563 }, this);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
564
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
565 // update filtered and searched bookmarks
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
566 if (this._filteredBookmarks.has(url)) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
567 this._filteredBookmarks.delete(url);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
568 if (this._searchedBookmarks.has(url)) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
569 this._searchedBookmarks.delete(url);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
570 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
571 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
572 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
573 }, this);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
574
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
575 if (needUpdateFilterTags) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
576 this.updateFilteredSearchedBookmarks();
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
577 this.notify('filter-tags-search-changed', this._searchedBookmarks,
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
578 this._filterTags, this._searchTerm);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
579 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
580 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
581
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
582 BookmarkModel.prototype.forEach = function (callbackFn, thisArg) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
583 this._bookmarks.keys().forEach(function (key) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
584 callbackFn.call(thisArg, this._bookmarks.get(key), key, this);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
585 }, this);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
586 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
587
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
588 BookmarkModel.prototype.hasTag = function (tag) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
589 return this._tagCount.has(tag);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
590 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
591
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
592 BookmarkModel.prototype.getTagCount = function (tag) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
593 return (this._tagCount.has(tag)) ? this._tagCount.get(tag) : undefined;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
594 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
595
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
596 BookmarkModel.prototype.updateSearchedBookmarks = function (urlsSubset) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
597 var searchUrls;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
598
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
599 // additive search if urlsSubset is given
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
600 if (urlsSubset !== undefined) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
601 searchUrls = urlsSubset;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
602 } else {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
603 this._searchedBookmarks = new StringSet();
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
604
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
605 searchUrls = this._filteredBookmarks.values();
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
606 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
607
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
608 // search for the search term in title and URL
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
609 searchUrls.forEach(function (url) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
610 var bookmark;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
611
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
612 bookmark = this.get(url);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
613 if (this._searchTerm === '' ||
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
614 bookmark.title.indexOf(this._searchTerm) !== -1 ||
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
615 bookmark.url.indexOf(this._searchTerm) !== -1) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
616 this._searchedBookmarks.add(url);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
617 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
618 }, this);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
619 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
620
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
621 BookmarkModel.prototype.updateFilteredSearchedBookmarks =
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
622 function (urlsSubset) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
623 var filterUrls;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
624 var searchUrls;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
625
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
626 // additive filtering if urlsSubset is given
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
627 if (urlsSubset !== undefined) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
628 filterUrls = urlsSubset;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
629 searchUrls = [];
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
630 } else {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
631 this._filteredBookmarks = new StringSet();
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
632
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
633 filterUrls = this._bookmarks.keys();
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
634 searchUrls = undefined;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
635 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
636
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
637 // apply tag filter
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
638 filterUrls.forEach(function (url) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
639 var bookmark;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
640 var matchingTagCount = 0;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
641
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
642 bookmark = this.get(url);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
643
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
644 bookmark.tags.forEach(function (tag) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
645 if (this._filterTags.has(tag)) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
646 matchingTagCount++;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
647 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
648 }, this);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
649
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
650 if (matchingTagCount === this._filterTags.size) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
651 this._filteredBookmarks.add(url);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
652 if (urlsSubset !== undefined) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
653 searchUrls.push(url);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
654 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
655 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
656 }, this);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
657
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
658 // search the filter results
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
659 this.updateSearchedBookmarks(searchUrls);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
660 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
661
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
662 BookmarkModel.prototype.toggleFilterTag = function (tag) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
663 if (this._filterTags.has(tag)) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
664 this._filterTags.delete(tag);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
665 } else {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
666 this._filterTags.add(tag);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
667 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
668 this.updateFilteredSearchedBookmarks();
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
669 this.notify('filter-tags-search-changed', this._searchedBookmarks,
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
670 this._filterTags, this._searchTerm);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
671 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
672
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
673 BookmarkModel.prototype.setFilterTags = function (filterTags) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
674 if (!arrayEqual(filterTags.values(), this._filterTags.values())) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
675 this._filterTags = new StringSet(filterTags);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
676 this.updateFilteredSearchedBookmarks();
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
677 this.notify('filter-tags-search-changed', this._searchedBookmarks,
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
678 this._filterTags, this._searchTerm);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
679 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
680 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
681
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
682 BookmarkModel.prototype.setSearchTerm = function (searchTerm) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
683 if (searchTerm !== this._searchTerm) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
684 this._searchTerm = searchTerm;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
685 this.updateSearchedBookmarks();
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
686 this.notify('filter-tags-search-changed', this._searchedBookmarks,
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
687 this._filterTags, this._searchTerm);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
688 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
689 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
690
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
691 BookmarkModel.prototype.setFilterTagsSearchTerm = function (filterTags,
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
692 searchTerm) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
693 if (!arrayEqual(filterTags.values(), this._filterTags.values())) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
694 this._filterTags = new StringSet(filterTags);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
695 this._searchTerm = searchTerm;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
696 this.updateFilteredSearchedBookmarks();
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
697 this.notify('filter-tags-search-changed', this._searchedBookmarks,
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
698 this._filterTags, this._searchTerm);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
699 } else if (searchTerm !== this._searchTerm) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
700 this._searchTerm = searchTerm;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
701 this.updateSearchedBookmarks();
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
702 this.notify('filter-tags-search-changed', this._searchedBookmarks,
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
703 this._filterTags, this._searchTerm);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
704 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
705 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
706
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
707 BookmarkModel.prototype.parseLoadedBookmarks = function (data) {
19
4a4d9527c06f Add merge options
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 18
diff changeset
708 var wasEmpty = !this._bookmarks.size;
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
709 var parsedData;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
710 var bookmarks = [];
19
4a4d9527c06f Add merge options
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 18
diff changeset
711 var bookmark;
4a4d9527c06f Add merge options
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 18
diff changeset
712 var oldBookmark;
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
713
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
714 try {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
715 parsedData = JSON.parse(data);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
716 } catch (e) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
717 this.notify('load-file-error', e.message);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
718 return;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
719 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
720
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
721 if (!Array.isArray(parsedData.bookmarks)) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
722 this.notify('parse-file-error',
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
723 'This file does not contain bookmarks.');
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
724 return;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
725 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
726
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
727 // create a temporary list of valid bookmarks
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
728 parsedData.bookmarks.forEach(function (bookmark) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
729 if (isString(bookmark.url) && bookmark.url !== '') {
19
4a4d9527c06f Add merge options
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 18
diff changeset
730 bookmark = new Bookmark(bookmark.url, bookmark.title,
4a4d9527c06f Add merge options
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 18
diff changeset
731 bookmark.favicon, bookmark.tags, bookmark.ctime, bookmark.mtime)
4a4d9527c06f Add merge options
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 18
diff changeset
732 oldBookmark = this.get(bookmark.url);
4a4d9527c06f Add merge options
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 18
diff changeset
733 if (oldBookmark === undefined ||
4a4d9527c06f Add merge options
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 18
diff changeset
734 oldBookmark.mtime < bookmark.mtime) {
4a4d9527c06f Add merge options
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 18
diff changeset
735 bookmarks.push(bookmark);
4a4d9527c06f Add merge options
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 18
diff changeset
736 }
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
737 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
738 }, this);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
739
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
740 // add each bookmark to the model ordered by the last modification time
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
741 this.add(bookmarks.sort(function (bookmark1, bookmark2) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
742 return bookmark1.ctime - bookmark2.ctime;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
743 }));
19
4a4d9527c06f Add merge options
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 18
diff changeset
744 if (wasEmpty) {
4a4d9527c06f Add merge options
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 18
diff changeset
745 // if there were no bookmarks before there cannot be any unsaved changes
4a4d9527c06f Add merge options
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 18
diff changeset
746 this.unsavedChanges = false;
4a4d9527c06f Add merge options
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 18
diff changeset
747 }
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
748 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
749
10
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
750 BookmarkModel.prototype.parseImportedBookmarks = function (data) {
19
4a4d9527c06f Add merge options
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 18
diff changeset
751 var wasEmpty = (this._bookmarks.size > 0);
10
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
752 var bookmarkDoc;
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
753 var bookmarkElements;
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
754 var i;
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
755 var url;
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
756 var title;
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
757 var favicon;
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
758 var tags;
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
759 var ctime;
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
760 var mtime;
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
761 var bookmarks = [];
19
4a4d9527c06f Add merge options
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 18
diff changeset
762 var bookmark;
4a4d9527c06f Add merge options
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 18
diff changeset
763 var oldBookmark;
10
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
764
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
765 bookmarkDoc = document.implementation.createHTMLDocument();
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
766 bookmarkDoc.open();
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
767 bookmarkDoc.write(data);
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
768 bookmarkDoc.close();
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
769
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
770 // create a temporary list of valid bookmarks
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
771 bookmarkElements = bookmarkDoc.querySelectorAll('dt > a[href]');
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
772 for (i = 0; i < bookmarkElements.length; i++) {
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
773 url = bookmarkElements[i].href;
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
774 if (url !== '') {
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
775 title = bookmarkElements[i].textContent;
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
776 favicon = bookmarkElements[i].getAttribute('icon');
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
777 tags = ((tags = bookmarkElements[i].getAttribute('tags')) !==
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
778 null) ? tags.split(',') : [];
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
779 ctime = !isNaN(ctime =
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
780 parseInt(bookmarkElements[i].getAttribute('add_date'), 10)) ?
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
781 ctime * 1000 : undefined;
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
782 mtime = !isNaN(mtime =
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
783 parseInt(bookmarkElements[i].getAttribute('last_modified'),
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
784 10)) ? mtime * 1000 : undefined;
19
4a4d9527c06f Add merge options
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 18
diff changeset
785 bookmark = new Bookmark(url, title, favicon, tags, ctime, mtime);
4a4d9527c06f Add merge options
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 18
diff changeset
786 oldBookmark = this.get(bookmark.url);
4a4d9527c06f Add merge options
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 18
diff changeset
787 if (oldBookmark === undefined ||
4a4d9527c06f Add merge options
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 18
diff changeset
788 oldBookmark.mtime < bookmark.mtime) {
4a4d9527c06f Add merge options
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 18
diff changeset
789 bookmarks.push(bookmark);
4a4d9527c06f Add merge options
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 18
diff changeset
790 }
10
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
791 }
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
792 }
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
793
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
794 // add each bookmark to the model ordered by the last modification time
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
795 this.add(bookmarks.sort(function (bookmark1, bookmark2) {
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
796 return bookmark1.ctime - bookmark2.ctime;
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
797 }));
19
4a4d9527c06f Add merge options
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 18
diff changeset
798 if (!wasEmpty) {
4a4d9527c06f Add merge options
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 18
diff changeset
799 // if there were no bookmarks before there cannot be any unsaved changes
4a4d9527c06f Add merge options
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 18
diff changeset
800 this.unsavedChanges = false;
4a4d9527c06f Add merge options
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 18
diff changeset
801 }
10
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
802 };
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
803
19
4a4d9527c06f Add merge options
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 18
diff changeset
804 BookmarkModel.prototype.loadFile = function (bookmarkFile, merge) {
4a4d9527c06f Add merge options
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 18
diff changeset
805 if (!merge) {
4a4d9527c06f Add merge options
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 18
diff changeset
806 // delete all existing bookmarks first
4a4d9527c06f Add merge options
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 18
diff changeset
807 this.delete(this._bookmarks.keys());
4a4d9527c06f Add merge options
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 18
diff changeset
808 this.unsavedChanges = false;
4a4d9527c06f Add merge options
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 18
diff changeset
809 }
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
810
10
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
811 this.loadFileReader = new FileReader();
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
812 this.loadFileReader.addEventListener('error', this);
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
813 this.loadFileReader.addEventListener('load', this);
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
814 this.loadFileReader.readAsText(bookmarkFile);
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
815 };
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
816
19
4a4d9527c06f Add merge options
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 18
diff changeset
817 BookmarkModel.prototype.importFile = function (bookmarkFile, merge) {
4a4d9527c06f Add merge options
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 18
diff changeset
818 if (!merge) {
4a4d9527c06f Add merge options
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 18
diff changeset
819 // delete all existing bookmarks first
4a4d9527c06f Add merge options
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 18
diff changeset
820 this.delete(this._bookmarks.keys());
4a4d9527c06f Add merge options
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 18
diff changeset
821 this.unsavedChanges = false;
4a4d9527c06f Add merge options
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 18
diff changeset
822 }
10
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
823
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
824 this.importFileReader = new FileReader();
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
825 this.importFileReader.addEventListener('error', this);
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
826 this.importFileReader.addEventListener('load', this);
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
827 this.importFileReader.readAsText(bookmarkFile);
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
828 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
829
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
830 BookmarkModel.prototype.saveFile = function () {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
831 var jsonBlob;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
832 var bookmarkData = {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
833 'bookmarks': []
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
834 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
835
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
836 this._bookmarks.forEach(function (bookmark) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
837 bookmarkData.bookmarks.push(bookmark);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
838 }, this);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
839
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
840 jsonBlob = new Blob([JSON.stringify(bookmarkData)], {type:
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
841 'application/json'});
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
842 this.notify('save-file', jsonBlob);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
843 this.unsavedChanges = false;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
844 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
845
11
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
846 BookmarkModel.prototype.exportFile = function () {
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
847 var htmlBlob;
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
848 var bookmarkDoc;
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
849 var commentNode;
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
850 var metaElement;
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
851 var titleElement;
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
852 var headingElement;
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
853 var bookmarkListElement;
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
854 var bookmarkLinkElement;
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
855 var bookmarkElement;
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
856
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
857 bookmarkDoc = document.implementation.createHTMLDocument();
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
858
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
859 // construct Netscape bookmarks format within body
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
860 commentNode = bookmarkDoc.createComment('This is an automatically ' +
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
861 'generated file.\nIt will be read and overwritten.\nDO NOT EDIT!');
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
862 bookmarkDoc.body.appendChild(commentNode);
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
863
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
864 metaElement = bookmarkDoc.createElement('meta');
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
865 metaElement.setAttribute('http-equiv', 'Content-Type');
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
866 metaElement.setAttribute('content', 'text/html; charset=UTF-8');
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
867 bookmarkDoc.body.appendChild(metaElement);
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
868
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
869 titleElement = bookmarkDoc.createElement('title');
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
870 titleElement.textContent = 'Bookmarks';
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
871 bookmarkDoc.body.appendChild(titleElement);
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
872
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
873 headingElement = bookmarkDoc.createElement('h1');
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
874 headingElement.textContent = 'Bookmarks';
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
875 bookmarkDoc.body.appendChild(headingElement);
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
876
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
877 bookmarkListElement = bookmarkDoc.createElement('dl');
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
878 bookmarkDoc.body.appendChild(bookmarkListElement);
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
879
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
880 this._bookmarks.forEach(function (bookmark) {
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
881 bookmarkElement = bookmarkDoc.createElement('dt');
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
882
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
883 bookmarkLinkElement = bookmarkDoc.createElement('a');
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
884 bookmarkLinkElement.href = bookmark.url;
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
885 bookmarkLinkElement.textContent = bookmark.title;
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
886 bookmarkLinkElement.setAttribute('icon', bookmark.favicon);
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
887 bookmarkLinkElement.setAttribute('tags',
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
888 bookmark.tags.values().join(','));
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
889 bookmarkLinkElement.setAttribute('add_date',
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
890 Math.round(bookmark.ctime.getTime() / 1000));
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
891 bookmarkLinkElement.setAttribute('last_modified',
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
892 Math.round(bookmark.mtime.getTime() / 1000));
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
893
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
894 bookmarkElement.appendChild(bookmarkLinkElement);
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
895
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
896 bookmarkListElement.appendChild(bookmarkElement);
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
897 bookmarkListElement.appendChild(bookmarkDoc.createElement('dd'));
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
898 }, this);
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
899
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
900 htmlBlob = new Blob(['<!DOCTYPE NETSCAPE-Bookmark-file-1>\n' +
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
901 bookmarkDoc.body.innerHTML], {type: 'text/html'});
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
902 this.notify('export-file', htmlBlob);
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
903 };
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
904
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
905 BookmarkModel.prototype.handleEvent = function (e) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
906 if (e.type === 'load') {
10
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
907 if (e.target === this.loadFileReader) {
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
908 this.parseLoadedBookmarks(e.target.result);
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
909 this.loadFileReader = null;
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
910 } else if (e.target === this.importFileReader) {
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
911 this.parseImportedBookmarks(e.target.result);
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
912 this.importFileReader = null;
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
913 }
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
914 } else if (e.type === 'error') {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
915 this.notify('load-file-error', e.target.error.message);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
916 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
917 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
918
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
919
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
920 /*
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
921 * view
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
922 */
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
923
26
8c2f3e72d514 Create new view for notifications
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 25
diff changeset
924 var NotificationsView = function () {
8c2f3e72d514 Create new view for notifications
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 25
diff changeset
925 this.unsavedChangesElement =
8c2f3e72d514 Create new view for notifications
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 25
diff changeset
926 document.querySelector('#notifications .unsaved-changes-message');
22
b19db583b5f8 Display keyboard shortcuts as an overly when pressing Alt
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 19
diff changeset
927
b19db583b5f8 Display keyboard shortcuts as an overly when pressing Alt
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 19
diff changeset
928 this.shortcutKeysOverlayElement =
b19db583b5f8 Display keyboard shortcuts as an overly when pressing Alt
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 19
diff changeset
929 document.querySelector('#keyboard-shortcuts');
26
8c2f3e72d514 Create new view for notifications
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 25
diff changeset
930
8c2f3e72d514 Create new view for notifications
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 25
diff changeset
931 document.addEventListener('keydown', this);
8c2f3e72d514 Create new view for notifications
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 25
diff changeset
932 document.addEventListener('keyup', this);
22
b19db583b5f8 Display keyboard shortcuts as an overly when pressing Alt
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 19
diff changeset
933 };
b19db583b5f8 Display keyboard shortcuts as an overly when pressing Alt
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 19
diff changeset
934
26
8c2f3e72d514 Create new view for notifications
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 25
diff changeset
935 NotificationsView.prototype.handleEvent = function (e) {
22
b19db583b5f8 Display keyboard shortcuts as an overly when pressing Alt
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 19
diff changeset
936 var elements;
b19db583b5f8 Display keyboard shortcuts as an overly when pressing Alt
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 19
diff changeset
937 var i;
b19db583b5f8 Display keyboard shortcuts as an overly when pressing Alt
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 19
diff changeset
938
b19db583b5f8 Display keyboard shortcuts as an overly when pressing Alt
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 19
diff changeset
939 // keyboard shortcut hints are visible when the Alt key is pressed and
b19db583b5f8 Display keyboard shortcuts as an overly when pressing Alt
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 19
diff changeset
940 // hidden again when the Alt key is released or another key is pressed
b19db583b5f8 Display keyboard shortcuts as an overly when pressing Alt
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 19
diff changeset
941 if (this.shortcutKeysOverlayElement.dataset.overlayVisible !== undefined &&
b19db583b5f8 Display keyboard shortcuts as an overly when pressing Alt
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 19
diff changeset
942 (e.type === 'keyup' || e.type === 'keydown')) {
b19db583b5f8 Display keyboard shortcuts as an overly when pressing Alt
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 19
diff changeset
943 delete this.shortcutKeysOverlayElement.dataset.overlayVisible;
b19db583b5f8 Display keyboard shortcuts as an overly when pressing Alt
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 19
diff changeset
944 } else if (e.type === 'keydown' && e.keyCode === 18) {
b19db583b5f8 Display keyboard shortcuts as an overly when pressing Alt
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 19
diff changeset
945 this.shortcutKeysOverlayElement.dataset.overlayVisible = '';
b19db583b5f8 Display keyboard shortcuts as an overly when pressing Alt
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 19
diff changeset
946 }
b19db583b5f8 Display keyboard shortcuts as an overly when pressing Alt
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 19
diff changeset
947 };
b19db583b5f8 Display keyboard shortcuts as an overly when pressing Alt
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 19
diff changeset
948
26
8c2f3e72d514 Create new view for notifications
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 25
diff changeset
949 NotificationsView.prototype.onUnsavedChangesChanged = function (unsavedChanges) {
8c2f3e72d514 Create new view for notifications
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 25
diff changeset
950 this.unsavedChangesElement.hidden = !unsavedChanges;
8c2f3e72d514 Create new view for notifications
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 25
diff changeset
951 };
8c2f3e72d514 Create new view for notifications
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 25
diff changeset
952
22
b19db583b5f8 Display keyboard shortcuts as an overly when pressing Alt
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 19
diff changeset
953
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
954 var TagView = function () {
12
948048e40fab Add option for displaying tag list as a tag cloud
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 11
diff changeset
955 var tagsElement;
948048e40fab Add option for displaying tag list as a tag cloud
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 11
diff changeset
956
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
957 ObservableMixin.call(this);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
958
12
948048e40fab Add option for displaying tag list as a tag cloud
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 11
diff changeset
959 tagsElement = document.querySelector('#tags');
948048e40fab Add option for displaying tag list as a tag cloud
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 11
diff changeset
960 tagsElement.addEventListener('click', this);
948048e40fab Add option for displaying tag list as a tag cloud
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 11
diff changeset
961
948048e40fab Add option for displaying tag list as a tag cloud
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 11
diff changeset
962 this.tagListElement = tagsElement.querySelector('ul.tag-list');
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
963
5
39c95b9826d2 Add autocompletion for tags
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 3
diff changeset
964 this.tagDatalistElement = document.querySelector('#tag-datalist');
39c95b9826d2 Add autocompletion for tags
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 3
diff changeset
965
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
966 this.tagTemplate = document.querySelector('#tag-template');
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
967 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
968
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
969 extend(TagView, ObservableMixin);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
970
12
948048e40fab Add option for displaying tag list as a tag cloud
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 11
diff changeset
971 TagView.prototype.onTagAdded = function (tag, tagCount) {
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
972 var newNode;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
973 var tagElement;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
974 var setTagButton;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
975 var toggleTagButton;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
976 var tagElements;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
977 var i;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
978 var referenceTag = '';
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
979 var referenceNode;
5
39c95b9826d2 Add autocompletion for tags
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 3
diff changeset
980 var tagOptionElement;
39c95b9826d2 Add autocompletion for tags
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 3
diff changeset
981 var i;
39c95b9826d2 Add autocompletion for tags
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 3
diff changeset
982 var isInDatalist = false;
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
983
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
984 // create new tag element from template
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
985 newNode = document.importNode(this.tagTemplate.content, true);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
986
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
987 tagElement = newNode.querySelector('li');
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
988 tagElement.dataset.tag = tag;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
989
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
990 setTagButton = tagElement.querySelector('button[name="set-tag"]');
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
991 setTagButton.textContent = tag;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
992 setTagButton.title = 'Set filter to "' + tag + '"';
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
993
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
994 toggleTagButton = tagElement.querySelector('button[name="toggle-tag"]');
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
995 toggleTagButton.textContent = '+';
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
996 toggleTagButton.title = 'Add "' + tag + '" to filter';
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
997
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
998 // maintain alphabetical order when inserting the tag element
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
999 tagElements = this.tagListElement.querySelectorAll('li');
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1000 for (i = 0; i < tagElements.length; i ++) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1001 if (tagElements[i].dataset.tag > referenceTag &&
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1002 tagElements[i].dataset.tag < tag) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1003 referenceTag = tagElements[i].dataset.tag;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1004 referenceNode = tagElements[i];
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1005 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1006 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1007 this.tagListElement.insertBefore(newNode, (referenceNode !== undefined) ?
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1008 referenceNode.nextSibling : this.tagListElement.firstChild);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1009
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1010 // initialize tag count
12
948048e40fab Add option for displaying tag list as a tag cloud
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 11
diff changeset
1011 this.onTagCountChanged(tag, tagCount);
5
39c95b9826d2 Add autocompletion for tags
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 3
diff changeset
1012
39c95b9826d2 Add autocompletion for tags
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 3
diff changeset
1013 // add to datalist
39c95b9826d2 Add autocompletion for tags
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 3
diff changeset
1014 for (i = 0; i < this.tagDatalistElement.options.length; i++) {
39c95b9826d2 Add autocompletion for tags
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 3
diff changeset
1015 if (this.tagDatalistElement.options[i].value == tag) {
39c95b9826d2 Add autocompletion for tags
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 3
diff changeset
1016 isInDatalist = true;
39c95b9826d2 Add autocompletion for tags
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 3
diff changeset
1017 break;
39c95b9826d2 Add autocompletion for tags
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 3
diff changeset
1018 }
39c95b9826d2 Add autocompletion for tags
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 3
diff changeset
1019 }
39c95b9826d2 Add autocompletion for tags
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 3
diff changeset
1020 if (!isInDatalist) {
39c95b9826d2 Add autocompletion for tags
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 3
diff changeset
1021 tagOptionElement = document.createElement('option');
39c95b9826d2 Add autocompletion for tags
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 3
diff changeset
1022 tagOptionElement.value = tag;
39c95b9826d2 Add autocompletion for tags
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 3
diff changeset
1023 this.tagDatalistElement.appendChild(tagOptionElement);
39c95b9826d2 Add autocompletion for tags
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 3
diff changeset
1024 }
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1025 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1026
12
948048e40fab Add option for displaying tag list as a tag cloud
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 11
diff changeset
1027 TagView.prototype.updateTagCloud = function (tagCount) {
948048e40fab Add option for displaying tag list as a tag cloud
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 11
diff changeset
1028 var tagElements;
948048e40fab Add option for displaying tag list as a tag cloud
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 11
diff changeset
1029 var i;
948048e40fab Add option for displaying tag list as a tag cloud
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 11
diff changeset
1030 var j;
948048e40fab Add option for displaying tag list as a tag cloud
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 11
diff changeset
1031 var tagCountMax = 1;
948048e40fab Add option for displaying tag list as a tag cloud
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 11
diff changeset
1032
948048e40fab Add option for displaying tag list as a tag cloud
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 11
diff changeset
1033 tagCount.forEach(function (count) {
948048e40fab Add option for displaying tag list as a tag cloud
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 11
diff changeset
1034 if (count > tagCountMax) {
948048e40fab Add option for displaying tag list as a tag cloud
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 11
diff changeset
1035 tagCountMax = count;
948048e40fab Add option for displaying tag list as a tag cloud
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 11
diff changeset
1036 }
948048e40fab Add option for displaying tag list as a tag cloud
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 11
diff changeset
1037 }, this);
948048e40fab Add option for displaying tag list as a tag cloud
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 11
diff changeset
1038
948048e40fab Add option for displaying tag list as a tag cloud
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 11
diff changeset
1039 tagElements = this.tagListElement.querySelectorAll('ul.tag-list > li');
948048e40fab Add option for displaying tag list as a tag cloud
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 11
diff changeset
1040 for (i = 0; i < tagElements.length; i++) {
948048e40fab Add option for displaying tag list as a tag cloud
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 11
diff changeset
1041 for (j = 1; j <= 10; j++) {
948048e40fab Add option for displaying tag list as a tag cloud
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 11
diff changeset
1042 tagElements[i].classList.remove('tag-frequency-' + j);
948048e40fab Add option for displaying tag list as a tag cloud
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 11
diff changeset
1043 }
948048e40fab Add option for displaying tag list as a tag cloud
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 11
diff changeset
1044 tagElements[i].classList.add('tag-frequency-' +
948048e40fab Add option for displaying tag list as a tag cloud
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 11
diff changeset
1045 (Math.floor(tagCount.get(tagElements[i].dataset.tag) /
948048e40fab Add option for displaying tag list as a tag cloud
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 11
diff changeset
1046 (tagCountMax / 9)) + 1));
948048e40fab Add option for displaying tag list as a tag cloud
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 11
diff changeset
1047 }
948048e40fab Add option for displaying tag list as a tag cloud
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 11
diff changeset
1048 };
948048e40fab Add option for displaying tag list as a tag cloud
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 11
diff changeset
1049
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1050 TagView.prototype.onTagCountChanged = function (tag, tagCount) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1051 this.tagListElement.querySelector('li' + createDatasetSelector('tag', tag) +
12
948048e40fab Add option for displaying tag list as a tag cloud
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 11
diff changeset
1052 ' .tag-count').textContent = '(' + tagCount.get(tag) + ')';
948048e40fab Add option for displaying tag list as a tag cloud
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 11
diff changeset
1053 this.updateTagCloud(tagCount);
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1054 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1055
12
948048e40fab Add option for displaying tag list as a tag cloud
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 11
diff changeset
1056 TagView.prototype.onTagDeleted = function (tag, tagCount) {
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1057 var tagElement;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1058
5
39c95b9826d2 Add autocompletion for tags
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 3
diff changeset
1059 // remove from tag list
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1060 tagElement = this.tagListElement.querySelector('li' +
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1061 createDatasetSelector('tag', tag));
5
39c95b9826d2 Add autocompletion for tags
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 3
diff changeset
1062 tagElement.parentNode.removeChild(tagElement);
12
948048e40fab Add option for displaying tag list as a tag cloud
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 11
diff changeset
1063
948048e40fab Add option for displaying tag list as a tag cloud
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 11
diff changeset
1064 this.updateTagCloud(tagCount);
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1065 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1066
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1067 TagView.prototype.onFilterTagsSearchChanged = function (filteredBookmarks,
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1068 newFilterTags, newSearchTerm) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1069 var tagElements;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1070 var i;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1071 var tag;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1072 var toggleTagButton;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1073
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1074 tagElements = this.tagListElement.querySelectorAll('li');
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1075 for (i = 0; i < tagElements.length; i++) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1076 tag = tagElements[i].dataset.tag;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1077 toggleTagButton =
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1078 tagElements[i].querySelector('button[name="toggle-tag"]');
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1079 if (newFilterTags.has(tag)) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1080 tagElements[i].classList.add('active-filter-tag');
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1081 toggleTagButton.textContent = '\u2212';
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1082 toggleTagButton.title = 'Remove "' + tag + '" from filter';
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1083 } else {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1084 tagElements[i].classList.remove('active-filter-tag');
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1085 toggleTagButton.textContent = '+';
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1086 toggleTagButton.title = 'Add "' + tag + '" to filter';
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1087 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1088 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1089 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1090
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1091 TagView.prototype.handleEvent = function (e) {
12
948048e40fab Add option for displaying tag list as a tag cloud
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 11
diff changeset
1092 if (e.type === 'click') {
948048e40fab Add option for displaying tag list as a tag cloud
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 11
diff changeset
1093 if (e.target.name === 'set-tag' ||
948048e40fab Add option for displaying tag list as a tag cloud
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 11
diff changeset
1094 e.target.name === 'toggle-tag') {
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1095 e.target.blur();
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1096
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1097 this.notify(e.target.name, getAncestorElementDatasetItem(e.target,
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1098 'tag'));
12
948048e40fab Add option for displaying tag list as a tag cloud
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 11
diff changeset
1099 } else if (e.target.name === 'show-tag-cloud') {
948048e40fab Add option for displaying tag list as a tag cloud
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 11
diff changeset
1100 this.tagListElement.classList.toggle('tag-cloud', e.target.checked);
948048e40fab Add option for displaying tag list as a tag cloud
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 11
diff changeset
1101 }
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1102 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1103 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1104
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1105
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1106 var ActionsView = function () {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1107 var saveFormElement;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1108 var newNode;
24
6cf1ec2e8955 Use expanders for action forms
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 23
diff changeset
1109 var fieldsetElement;
6cf1ec2e8955 Use expanders for action forms
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 23
diff changeset
1110 var legendElement;
16
64272f2105da Show four tag input elements by default
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 12
diff changeset
1111 var i;
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1112
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1113 ObservableMixin.call(this);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1114
24
6cf1ec2e8955 Use expanders for action forms
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 23
diff changeset
1115 this.actionsElement = document.querySelector('#actions');
6cf1ec2e8955 Use expanders for action forms
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 23
diff changeset
1116
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1117 this.tagInputTemplate = document.querySelector('#tag-input-template');
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1118 saveFormElement = document.querySelector('form#save-form');
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1119
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1120 this.saveLinkElement = saveFormElement.querySelector('a#save-link');
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1121
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1122 // create new editor form from template
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1123 newNode = document.importNode(
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1124 document.querySelector('#bookmark-editor-template').content, true);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1125
7
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1126 this.editorFormElement = newNode.querySelector('form.bookmark-editor-form');
22
b19db583b5f8 Display keyboard shortcuts as an overly when pressing Alt
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 19
diff changeset
1127 this.editorFormElement.querySelector('label').accessKey = 'a';
24
6cf1ec2e8955 Use expanders for action forms
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 23
diff changeset
1128
6cf1ec2e8955 Use expanders for action forms
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 23
diff changeset
1129 fieldsetElement = this.editorFormElement.querySelector('fieldset');
6cf1ec2e8955 Use expanders for action forms
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 23
diff changeset
1130 fieldsetElement.classList.add('expander');
6cf1ec2e8955 Use expanders for action forms
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 23
diff changeset
1131
6cf1ec2e8955 Use expanders for action forms
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 23
diff changeset
1132 legendElement = fieldsetElement.querySelector('legend');
6cf1ec2e8955 Use expanders for action forms
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 23
diff changeset
1133 legendElement.textContent = 'Add Bookmark';
6cf1ec2e8955 Use expanders for action forms
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 23
diff changeset
1134 legendElement.tabIndex = 0;
6cf1ec2e8955 Use expanders for action forms
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 23
diff changeset
1135 legendElement.classList.add('expander-label');
7
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1136
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1137 this.faviconImageElement =
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1138 this.editorFormElement.querySelector('img.bookmark-favicon');
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1139 this.faviconImageElement.addEventListener('load', this);
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1140 this.faviconImageElement.addEventListener('error', this);
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1141
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1142 this.missingFaviconUri = this.faviconImageElement.src;
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1143
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1144 this.editTagListElement =
7
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1145 this.editorFormElement.querySelector('ul.tag-input-list');
16
64272f2105da Show four tag input elements by default
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 12
diff changeset
1146 // add four tag input elements for convenience
64272f2105da Show four tag input elements by default
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 12
diff changeset
1147 for (i = 0; i < 4; i++) {
64272f2105da Show four tag input elements by default
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 12
diff changeset
1148 this.editTagListElement.appendChild(this.createTagInputElement(''));
64272f2105da Show four tag input elements by default
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 12
diff changeset
1149 }
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1150
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1151 saveFormElement.parentNode.insertBefore(newNode,
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1152 saveFormElement.nextSibling);
6
e9ad4c625b7a Add bookmarklet for bookmarking
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 5
diff changeset
1153
25
b2c9c4fb8d4c Add back the accidentally removed "input" event listener
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 24
diff changeset
1154 this.actionsElement.addEventListener('input', this);
24
6cf1ec2e8955 Use expanders for action forms
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 23
diff changeset
1155 this.actionsElement.addEventListener('click', this);
6cf1ec2e8955 Use expanders for action forms
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 23
diff changeset
1156 this.actionsElement.addEventListener('keydown', this);
6cf1ec2e8955 Use expanders for action forms
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 23
diff changeset
1157 this.actionsElement.addEventListener('submit', this);
6cf1ec2e8955 Use expanders for action forms
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 23
diff changeset
1158 this.actionsElement.addEventListener('reset', this);
6cf1ec2e8955 Use expanders for action forms
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 23
diff changeset
1159
6
e9ad4c625b7a Add bookmarklet for bookmarking
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 5
diff changeset
1160 document.querySelector('a#bookmarklet-link').href = BOOKMARKLET_URI;
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1161 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1162
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1163 extend(ActionsView, ObservableMixin);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1164
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1165 ActionsView.prototype.createTagInputElement = function (tag) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1166 var newNode;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1167
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1168 newNode = document.importNode(this.tagInputTemplate.content, true);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1169 newNode.querySelector('input[name="tag"]').value = tag;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1170
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1171 return newNode;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1172 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1173
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1174 ActionsView.prototype.handleEvent = function (e) {
6
e9ad4c625b7a Add bookmarklet for bookmarking
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 5
diff changeset
1175 var bookmarkletData;
e9ad4c625b7a Add bookmarklet for bookmarking
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 5
diff changeset
1176 var parsedData;
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1177 var tags = [];
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1178 var i;
16
64272f2105da Show four tag input elements by default
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 12
diff changeset
1179 var tagInputElements;
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1180
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1181 switch (e.type) {
7
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1182 case 'error':
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1183 if (e.target.classList.contains('bookmark-favicon')) {
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1184 if (e.target.src !== this.missingFaviconUri) {
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1185 e.target.src = this.missingFaviconUri;
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1186 }
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1187 }
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1188 break;
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1189 case 'load':
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1190 if (e.target.classList.contains('bookmark-favicon')) {
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1191 this.editorFormElement.favicon.value =
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1192 (e.target.src !== this.missingFaviconUri) ? e.target.src : '';
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1193 }
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1194 break;
6
e9ad4c625b7a Add bookmarklet for bookmarking
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 5
diff changeset
1195 case 'input':
e9ad4c625b7a Add bookmarklet for bookmarking
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 5
diff changeset
1196 if (e.target.name === 'bookmarklet-import') {
e9ad4c625b7a Add bookmarklet for bookmarking
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 5
diff changeset
1197 // get rid of any preceding text
e9ad4c625b7a Add bookmarklet for bookmarking
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 5
diff changeset
1198 bookmarkletData = e.target.value.replace(/^[^{]*/, '');
e9ad4c625b7a Add bookmarklet for bookmarking
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 5
diff changeset
1199
e9ad4c625b7a Add bookmarklet for bookmarking
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 5
diff changeset
1200 try {
e9ad4c625b7a Add bookmarklet for bookmarking
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 5
diff changeset
1201 parsedData = JSON.parse(bookmarkletData);
e9ad4c625b7a Add bookmarklet for bookmarking
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 5
diff changeset
1202 } catch (exception) {
e9ad4c625b7a Add bookmarklet for bookmarking
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 5
diff changeset
1203 return;
e9ad4c625b7a Add bookmarklet for bookmarking
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 5
diff changeset
1204 }
e9ad4c625b7a Add bookmarklet for bookmarking
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 5
diff changeset
1205
e9ad4c625b7a Add bookmarklet for bookmarking
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 5
diff changeset
1206 if (isString(parsedData.url) && parsedData.url !== '') {
e9ad4c625b7a Add bookmarklet for bookmarking
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 5
diff changeset
1207 e.target.form.elements.url.value = parsedData.url;
e9ad4c625b7a Add bookmarklet for bookmarking
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 5
diff changeset
1208 }
e9ad4c625b7a Add bookmarklet for bookmarking
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 5
diff changeset
1209 if (isString(parsedData.title) && parsedData.title !== '') {
e9ad4c625b7a Add bookmarklet for bookmarking
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 5
diff changeset
1210 e.target.form.elements.title.value = parsedData.title;
e9ad4c625b7a Add bookmarklet for bookmarking
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 5
diff changeset
1211 }
7
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1212 if (isString(parsedData.favicon) &&
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1213 parsedData.favicon.match(/^data:image\/png;base64,/)) {
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1214 this.faviconImageElement.src = parsedData.favicon;
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1215 }
6
e9ad4c625b7a Add bookmarklet for bookmarking
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 5
diff changeset
1216 }
e9ad4c625b7a Add bookmarklet for bookmarking
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 5
diff changeset
1217 break;
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1218 case 'click':
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1219 if (e.target.name === 'more-tags') {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1220 e.preventDefault();
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1221 e.target.blur();
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1222
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1223 this.editTagListElement.appendChild(this.createTagInputElement(''));
24
6cf1ec2e8955 Use expanders for action forms
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 23
diff changeset
1224 } else if (e.target.classList.contains('expander-label')) {
6cf1ec2e8955 Use expanders for action forms
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 23
diff changeset
1225 if (e.target.parentNode.dataset.expanderOpen !== undefined) {
6cf1ec2e8955 Use expanders for action forms
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 23
diff changeset
1226 delete e.target.parentNode.dataset.expanderOpen;
6cf1ec2e8955 Use expanders for action forms
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 23
diff changeset
1227 } else {
6cf1ec2e8955 Use expanders for action forms
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 23
diff changeset
1228 e.target.parentNode.dataset.expanderOpen = '';
6cf1ec2e8955 Use expanders for action forms
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 23
diff changeset
1229 }
6cf1ec2e8955 Use expanders for action forms
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 23
diff changeset
1230 }
6cf1ec2e8955 Use expanders for action forms
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 23
diff changeset
1231 break;
6cf1ec2e8955 Use expanders for action forms
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 23
diff changeset
1232 case 'keydown':
6cf1ec2e8955 Use expanders for action forms
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 23
diff changeset
1233 if (e.keyCode === 32 && e.target.classList.contains('expander-label')) {
6cf1ec2e8955 Use expanders for action forms
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 23
diff changeset
1234 if (e.target.parentNode.dataset.expanderOpen !== undefined) {
6cf1ec2e8955 Use expanders for action forms
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 23
diff changeset
1235 delete e.target.parentNode.dataset.expanderOpen;
6cf1ec2e8955 Use expanders for action forms
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 23
diff changeset
1236 } else {
6cf1ec2e8955 Use expanders for action forms
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 23
diff changeset
1237 e.target.parentNode.dataset.expanderOpen = '';
6cf1ec2e8955 Use expanders for action forms
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 23
diff changeset
1238 }
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1239 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1240 break;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1241 case 'submit':
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1242 if (e.target.id === 'save-form') {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1243 e.preventDefault();
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1244 e.target.blur();
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1245
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1246 this.notify('save-file');
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1247 } else if (e.target.id === 'load-form') {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1248 e.preventDefault();
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1249 e.target.blur();
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1250
19
4a4d9527c06f Add merge options
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 18
diff changeset
1251 this.notify('load-file', e.target.file.files[0],
4a4d9527c06f Add merge options
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 18
diff changeset
1252 e.target.merge.checked);
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1253 e.target.reset();
10
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
1254 } else if (e.target.id === 'import-form') {
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
1255 e.preventDefault();
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
1256 e.target.blur();
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
1257
19
4a4d9527c06f Add merge options
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 18
diff changeset
1258 this.notify('import-file', e.target.file.files[0],
4a4d9527c06f Add merge options
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 18
diff changeset
1259 e.target.merge.checked);
10
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
1260 e.target.reset();
11
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
1261 } else if (e.target.id === 'export-form') {
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
1262 e.preventDefault();
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
1263 e.target.blur();
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
1264
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
1265 this.notify('export-file');
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1266 } else if (e.target.classList.contains('bookmark-editor-form')) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1267 e.preventDefault();
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1268 e.target.blur();
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1269
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1270 if (e.target.tag.length) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1271 for (i = 0; i < e.target.tag.length; i++) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1272 tags.push(e.target.tag[i].value.trim());
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1273 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1274 } else {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1275 tags.push(e.target.tag.value.trim());
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1276 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1277
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1278 this.notify('save-bookmark', e.target.url.value,
7
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1279 e.target.title.value, e.target.favicon.value, tags);
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1280
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1281 e.target.reset();
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1282 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1283 break;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1284 case 'reset':
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1285 if (e.target.classList.contains('bookmark-editor-form')) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1286 e.target.blur();
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1287
7
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1288 e.target.querySelector('img.bookmark-favicon').src =
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1289 this.missingFaviconUri;
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1290
16
64272f2105da Show four tag input elements by default
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 12
diff changeset
1291 // remove all but the first four tag input elements
64272f2105da Show four tag input elements by default
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 12
diff changeset
1292 tagInputElements =
64272f2105da Show four tag input elements by default
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 12
diff changeset
1293 this.editTagListElement.querySelectorAll('li:nth-child(n+5)');
64272f2105da Show four tag input elements by default
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 12
diff changeset
1294 for (i = 0; i < tagInputElements.length; i++) {
64272f2105da Show four tag input elements by default
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 12
diff changeset
1295 this.editTagListElement.removeChild(tagInputElements[i]);
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1296 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1297 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1298 break;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1299 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1300 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1301
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1302 ActionsView.prototype.onSaveFile = function (jsonBlob) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1303 this.saveLinkElement.href = URL.createObjectURL(jsonBlob);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1304 this.saveLinkElement.click();
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1305 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1306
11
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
1307 ActionsView.prototype.onExportFile = function (htmlBlob) {
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
1308 var exportLinkElement;
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
1309
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
1310 exportLinkElement = document.querySelector('a#export-link');
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
1311 exportLinkElement.href = URL.createObjectURL(htmlBlob);
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
1312 exportLinkElement.click();
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
1313 };
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
1314
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1315 ActionsView.prototype.confirmLoadFile = function () {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1316 return window.confirm('There are unsaved changes to your bookmarks.\n' +
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1317 'Proceed loading the bookmark file?');
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1318 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1319
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1320 ActionsView.prototype.onLoadFileError = function (message) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1321 window.alert('Failed to load bookmark file:\n' + message);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1322 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1323
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1324 ActionsView.prototype.onParseFileError = function (message) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1325 window.alert('Failed to parse bookmark file:\n' + message);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1326 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1327
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1328
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1329 var BookmarkView = function () {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1330 var searchFormElement;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1331
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1332 ObservableMixin.call(this);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1333
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1334 this.bookmarkTemplate = document.querySelector('#bookmark-template');
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1335 this.bookmarkTagTemplate = document.querySelector('#bookmark-tag-template');
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1336 this.bookmarkEditorTemplate =
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1337 document.querySelector('#bookmark-editor-template');
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1338 this.tagInputTemplate = document.querySelector('#tag-input-template');
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1339
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1340 this.bookmarkListElement = document.querySelector('ul#bookmark-list');
7
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1341 this.bookmarkListElement.addEventListener('input', this);
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1342 this.bookmarkListElement.addEventListener('click', this);
23
69552aee9993 Use custom expander instead of details element
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 22
diff changeset
1343 this.bookmarkListElement.addEventListener('keydown', this);
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1344 this.bookmarkListElement.addEventListener('submit', this);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1345 this.bookmarkListElement.addEventListener('reset', this);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1346
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1347 searchFormElement = document.querySelector('#search-form');
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1348 searchFormElement.addEventListener('submit', this);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1349 searchFormElement.addEventListener('reset', this);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1350
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1351 this.searchTermInputElement = searchFormElement['search-term'];
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1352
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1353 this.bookmarkMessageElement = document.querySelector('#bookmark-message');
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1354
7
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1355 this.missingFaviconUri = '';
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1356
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1357 this.updateBookmarkMessage();
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1358 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1359
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1360 extend(BookmarkView, ObservableMixin);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1361
23
69552aee9993 Use custom expander instead of details element
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 22
diff changeset
1362 BookmarkView.prototype.getAncestorClass = function (node, className) {
69552aee9993 Use custom expander instead of details element
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 22
diff changeset
1363 while ((node = node.parentNode) !== null &&
69552aee9993 Use custom expander instead of details element
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 22
diff changeset
1364 (!node.classList || !node.classList.contains(className)));
69552aee9993 Use custom expander instead of details element
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 22
diff changeset
1365
69552aee9993 Use custom expander instead of details element
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 22
diff changeset
1366 return node;
69552aee9993 Use custom expander instead of details element
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 22
diff changeset
1367 };
69552aee9993 Use custom expander instead of details element
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 22
diff changeset
1368
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1369 BookmarkView.prototype.handleEvent = function (e) {
7
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1370 var bookmarkletData;
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1371 var parsedData;
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1372 var i;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1373 var tags = [];
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1374 var node;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1375
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1376 switch (e.type) {
7
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1377 case 'error':
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1378 if (e.target.classList.contains('bookmark-favicon')) {
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1379 if (e.target.src !== this.missingFaviconUri) {
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1380 e.target.src = this.missingFaviconUri;
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1381 }
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1382 }
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1383 break;
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1384 case 'load':
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1385 if (e.target.classList.contains('bookmark-favicon')) {
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1386 node = e.target;
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1387 while ((node = node.parentNode) !== null) {
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1388 if (node.classList.contains('bookmark-editor-form')) {
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1389 node.favicon.value =
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1390 (e.target.src !== this.missingFaviconUri) ?
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1391 e.target.src : '';
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1392 break;
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1393 }
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1394 }
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1395 }
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1396 break;
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1397 case 'input':
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1398 if (e.target.name === 'bookmarklet-import') {
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1399 // get rid of any preceding text
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1400 bookmarkletData = e.target.value.replace(/^[^{]*/, '');
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1401
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1402 try {
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1403 parsedData = JSON.parse(bookmarkletData);
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1404 } catch (exception) {
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1405 return;
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1406 }
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1407
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1408 if (isString(parsedData.url) && parsedData.url !== '') {
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1409 e.target.form.elements.url.value = parsedData.url;
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1410 }
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1411 if (isString(parsedData.title) && parsedData.title !== '') {
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1412 e.target.form.elements.title.value = parsedData.title;
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1413 }
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1414 if (isString(parsedData.favicon) &&
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1415 parsedData.favicon.match(/^data:image\/png;base64,/)) {
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1416 e.target.form.querySelector('img.bookmark-favicon').src =
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1417 parsedData.favicon;
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1418 }
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1419 }
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1420 break;
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1421 case 'click':
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1422 switch (e.target.name) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1423 case 'edit-bookmark':
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1424 e.target.blur();
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1425 // fallthrough
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1426 case 'delete-bookmark':
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1427 this.notify(e.target.name,
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1428 getAncestorElementDatasetItem(e.target, 'bookmarkUrl'));
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1429 break;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1430 case 'more-tags':
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1431 e.target.blur();
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1432
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1433 e.target.form.querySelector('ul.tag-input-list').appendChild(
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1434 this.createTagInputElement(''));
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1435 break;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1436 case 'set-tag':
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1437 case 'toggle-tag':
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1438 e.target.blur();
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1439
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1440 this.notify(e.target.name,
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1441 getAncestorElementDatasetItem(e.target, 'tag'));
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1442 break;
23
69552aee9993 Use custom expander instead of details element
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 22
diff changeset
1443 default:
69552aee9993 Use custom expander instead of details element
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 22
diff changeset
1444 if ((node = this.getAncestorClass(e.target, 'expander')) !== null) {
69552aee9993 Use custom expander instead of details element
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 22
diff changeset
1445 if (node.dataset.expanderOpen !== undefined) {
69552aee9993 Use custom expander instead of details element
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 22
diff changeset
1446 delete node.dataset.expanderOpen;
69552aee9993 Use custom expander instead of details element
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 22
diff changeset
1447 } else {
69552aee9993 Use custom expander instead of details element
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 22
diff changeset
1448 node.dataset.expanderOpen = '';
69552aee9993 Use custom expander instead of details element
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 22
diff changeset
1449 }
69552aee9993 Use custom expander instead of details element
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 22
diff changeset
1450 }
69552aee9993 Use custom expander instead of details element
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 22
diff changeset
1451 break;
69552aee9993 Use custom expander instead of details element
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 22
diff changeset
1452 }
69552aee9993 Use custom expander instead of details element
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 22
diff changeset
1453 break;
69552aee9993 Use custom expander instead of details element
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 22
diff changeset
1454 case 'keydown':
69552aee9993 Use custom expander instead of details element
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 22
diff changeset
1455 if (e.keyCode === 32 &&
69552aee9993 Use custom expander instead of details element
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 22
diff changeset
1456 (node = this.getAncestorClass(e.target, 'expander')) !== null) {
69552aee9993 Use custom expander instead of details element
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 22
diff changeset
1457 if (node.dataset.expanderOpen !== undefined) {
69552aee9993 Use custom expander instead of details element
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 22
diff changeset
1458 delete node.dataset.expanderOpen;
69552aee9993 Use custom expander instead of details element
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 22
diff changeset
1459 } else {
69552aee9993 Use custom expander instead of details element
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 22
diff changeset
1460 node.dataset.expanderOpen = '';
69552aee9993 Use custom expander instead of details element
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 22
diff changeset
1461 }
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1462 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1463 break;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1464 case 'submit':
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1465 if (e.target.classList.contains('bookmark-editor-form')) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1466 // save bookmark-editor-form form contents
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1467 e.preventDefault();
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1468
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1469 if (e.target.tag.length) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1470 for (i = 0; i < e.target.tag.length; i++) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1471 tags.push(e.target.tag[i].value.trim());
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1472 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1473 } else {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1474 tags.push(e.target.tag.value.trim());
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1475 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1476
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1477 this.notify('save-bookmark', e.target.url.value,
7
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1478 e.target.title.value, e.target.favicon.value, tags,
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1479 e.target['original-url'].value);
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1480 } else if (e.target.id === 'search-form') {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1481 // search
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1482 e.preventDefault();
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1483 e.target.blur();
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1484
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1485 this.notify('search', e.target['search-term'].value);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1486 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1487 break;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1488 case 'reset':
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1489 if (e.target.classList.contains('bookmark-editor-form')) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1490 // cancel bookmark-editor-form form
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1491 e.preventDefault();
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1492
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1493 // re-enable edit button
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1494 this.bookmarkListElement.querySelector('li' +
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1495 createDatasetSelector('bookmark-url',
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1496 e.target['original-url'].value) +
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1497 ' button[name="edit-bookmark"]').disabled = false;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1498
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1499 e.target.parentNode.removeChild(e.target);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1500 } else if (e.target.id === 'search-form') {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1501 // clear search
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1502 e.preventDefault();
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1503 e.target.blur();
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1504
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1505 this.notify('search', '');
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1506 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1507 break;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1508 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1509 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1510
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1511 BookmarkView.prototype.updateBookmarkMessage = function () {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1512 this.bookmarkMessageElement.textContent = 'Showing ' +
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1513 this.bookmarkListElement.querySelectorAll('ul#bookmark-list > ' +
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1514 'li:not([hidden])').length + ' of ' +
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1515 this.bookmarkListElement.querySelectorAll('ul#bookmark-list > ' +
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1516 'li').length + ' bookmarks.';
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1517 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1518
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1519 BookmarkView.prototype.onBookmarkAdded = function (bookmark) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1520 var newNode;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1521 var bookmarkElement;
7
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1522 var faviconElement;
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1523 var linkElement;
3
4786df0aec03 Display URL and hostname
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 2
diff changeset
1524 var hostnameElement;
4786df0aec03 Display URL and hostname
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 2
diff changeset
1525 var urlElement;
2
82c50265c8dc Display creation and modification time
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 0
diff changeset
1526 var ctimeElement;
82c50265c8dc Display creation and modification time
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 0
diff changeset
1527 var mtimeElement;
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1528 var tagListElement;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1529
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1530 newNode = document.importNode(this.bookmarkTemplate.content, true);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1531
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1532 bookmarkElement = newNode.querySelector('li');
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1533 bookmarkElement.dataset.bookmarkUrl = bookmark.url;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1534
7
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1535 faviconElement = bookmarkElement.querySelector('img.bookmark-favicon');
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1536 faviconElement.src = (bookmark.favicon) ? bookmark.favicon :
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1537 this.missingFaviconUri;
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1538 faviconElement.alt = '';
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1539
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1540 linkElement = bookmarkElement.querySelector('a.bookmark-link');
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1541 linkElement.textContent = linkElement.title = bookmark.title;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1542 linkElement.href = bookmark.url;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1543
3
4786df0aec03 Display URL and hostname
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 2
diff changeset
1544 hostnameElement = bookmarkElement.querySelector('.bookmark-hostname');
4786df0aec03 Display URL and hostname
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 2
diff changeset
1545 hostnameElement.textContent = (linkElement.hostname !== '') ?
4786df0aec03 Display URL and hostname
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 2
diff changeset
1546 '[' + linkElement.hostname + ']' : '';
4786df0aec03 Display URL and hostname
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 2
diff changeset
1547
4786df0aec03 Display URL and hostname
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 2
diff changeset
1548 urlElement = bookmarkElement.querySelector('.bookmark-url');
4786df0aec03 Display URL and hostname
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 2
diff changeset
1549 urlElement.textContent = bookmark.url;
4786df0aec03 Display URL and hostname
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 2
diff changeset
1550
2
82c50265c8dc Display creation and modification time
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 0
diff changeset
1551 ctimeElement = bookmarkElement.querySelector('.ctime');
82c50265c8dc Display creation and modification time
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 0
diff changeset
1552 ctimeElement.dateTime = bookmark.ctime.toISOString();
82c50265c8dc Display creation and modification time
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 0
diff changeset
1553 ctimeElement.textContent = bookmark.ctime.toString();
82c50265c8dc Display creation and modification time
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 0
diff changeset
1554
82c50265c8dc Display creation and modification time
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 0
diff changeset
1555 mtimeElement = bookmarkElement.querySelector('.mtime');
82c50265c8dc Display creation and modification time
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 0
diff changeset
1556 mtimeElement.dateTime = bookmark.mtime.toISOString();
82c50265c8dc Display creation and modification time
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 0
diff changeset
1557 mtimeElement.textContent = bookmark.mtime.toString();
82c50265c8dc Display creation and modification time
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 0
diff changeset
1558
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1559 tagListElement = bookmarkElement.querySelector('ul.tag-list');
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1560 bookmark.tags.forEach(function (tag) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1561 var newNode;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1562 var tagElement;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1563 var setTagButton;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1564 var toggleTagButton;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1565
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1566 newNode = document.importNode(this.bookmarkTagTemplate.content, true);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1567
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1568 tagElement = newNode.querySelector('li');
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1569 tagElement.dataset.tag = tag;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1570
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1571 setTagButton = newNode.querySelector('button[name="set-tag"]');
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1572 setTagButton.textContent = tag;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1573 setTagButton.title = 'Set filter to "' + tag + '"';
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1574
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1575 toggleTagButton = newNode.querySelector('button[name="toggle-tag"]');
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1576 toggleTagButton.textContent = '+';
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1577 toggleTagButton.title = 'Add "' + tag + '" to filter';
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1578
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1579 tagListElement.appendChild(newNode);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1580 }, this);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1581
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1582 // insert new or last modified bookmark on top of the list
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1583 this.bookmarkListElement.insertBefore(newNode,
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1584 this.bookmarkListElement.firstChild);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1585
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1586 this.updateBookmarkMessage();
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1587 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1588
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1589 BookmarkView.prototype.onBookmarkDeleted = function (bookmarkUrl) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1590 var bookmarkElement;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1591
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1592 bookmarkElement = this.bookmarkListElement.querySelector('li' +
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1593 createDatasetSelector('bookmark-url', bookmarkUrl));
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1594 if (bookmarkElement !== null) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1595 this.bookmarkListElement.removeChild(bookmarkElement);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1596
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1597 this.updateBookmarkMessage();
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1598 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1599 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1600
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1601 BookmarkView.prototype.onFilterTagsSearchChanged = function (filteredBookmarks,
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1602 newFilterTags, newSearchTerm) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1603 var bookmarkElements;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1604 var i;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1605 var tagElements;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1606 var toggleTagButton;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1607 var j;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1608 var tag;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1609
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1610 this.searchTermInputElement.value = newSearchTerm;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1611
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1612 bookmarkElements =
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1613 this.bookmarkListElement.querySelectorAll('ul#bookmark-list > li');
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1614 for (i = 0; i < bookmarkElements.length; i++) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1615 // update visibility of bookmarks
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1616 if (filteredBookmarks.has(bookmarkElements[i].dataset.bookmarkUrl)) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1617 // update tag elements of visible bookmarks
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1618 tagElements =
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1619 bookmarkElements[i].querySelectorAll('ul.tag-list > li');
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1620 for (j = 0; j < tagElements.length; j++) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1621 tag = tagElements[j].dataset.tag;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1622 toggleTagButton =
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1623 tagElements[j].querySelector('button[name="toggle-tag"]');
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1624 if (newFilterTags.has(tag)) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1625 tagElements[j].classList.add('active-filter-tag');
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1626 toggleTagButton.textContent = '\u2212';
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1627 toggleTagButton.title = 'Remove "' + tag + '" from filter';
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1628 } else {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1629 tagElements[j].classList.remove('active-filter-tag');
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1630 toggleTagButton.textContent = '+';
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1631 toggleTagButton.title = 'Add "' + tag + '" to filter';
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1632 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1633 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1634 bookmarkElements[i].hidden = false;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1635 } else {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1636 bookmarkElements[i].hidden = true;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1637 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1638 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1639
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1640 this.updateBookmarkMessage();
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1641 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1642
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1643 BookmarkView.prototype.createTagInputElement = function (tag) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1644 var newNode;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1645
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1646 newNode = document.importNode(this.tagInputTemplate.content, true);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1647 newNode.querySelector('input[name="tag"]').value = tag;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1648
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1649 return newNode;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1650 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1651
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1652 BookmarkView.prototype.displayBookmarkEditor = function (bookmark) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1653 var bookmarkElement;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1654 var newNode;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1655 var formElement;
7
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1656 var faviconImageElement;
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1657 var editTagListElement;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1658
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1659 bookmarkElement =
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1660 this.bookmarkListElement.querySelector('ul#bookmark-list > li' +
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1661 createDatasetSelector('bookmark-url', bookmark.url));
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1662
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1663 // disable edit button while editing
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1664 bookmarkElement.querySelector('button[name="edit-bookmark"]').disabled =
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1665 true;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1666
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1667 // create new editor form from template
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1668 newNode = document.importNode(this.bookmarkEditorTemplate.content, true);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1669
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1670 // fill with data of given bookmark
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1671 formElement = newNode.querySelector('form.bookmark-editor-form');
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1672 formElement.querySelector('legend').textContent = 'Edit Bookmark';
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1673 formElement['original-url'].value = bookmark.url;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1674 formElement.url.value = bookmark.url;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1675 formElement.title.value = bookmark.title;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1676
7
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1677 faviconImageElement = formElement.querySelector('img.bookmark-favicon');
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1678 faviconImageElement.addEventListener('load', this);
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1679 faviconImageElement.addEventListener('error', this);
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1680 this.missingFaviconUri = faviconImageElement.src;
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1681 if (bookmark.favicon) {
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1682 faviconImageElement.src = bookmark.favicon;
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1683 }
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1684
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1685 editTagListElement = formElement.querySelector('ul.tag-input-list');
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1686 bookmark.tags.forEach(function (tag) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1687 editTagListElement.appendChild(this.createTagInputElement(tag));
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1688 }, this);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1689 editTagListElement.appendChild(this.createTagInputElement(''));
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1690
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1691 // insert editor form into bookmark item
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1692 bookmarkElement.appendChild(newNode);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1693
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1694 // focus first input element
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1695 formElement.querySelector('input').focus();
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1696 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1697
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1698 BookmarkView.prototype.confirmReplaceBookmark = function (bookmark) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1699 return window.confirm('Replace bookmark "' + bookmark.title + '"\n[' +
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1700 bookmark.url + ']?');
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1701 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1702
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1703 BookmarkView.prototype.confirmDeleteBookmark = function (bookmark) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1704 return window.confirm('Delete bookmark "' + bookmark.title + '"\n[' +
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1705 bookmark.url + ']?');
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1706 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1707
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1708
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1709 /*
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1710 * controller
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1711 */
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1712
26
8c2f3e72d514 Create new view for notifications
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 25
diff changeset
1713 var BooketController = function(bookmarkModel, notificationsView,
22
b19db583b5f8 Display keyboard shortcuts as an overly when pressing Alt
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 19
diff changeset
1714 actionsView, tagView, bookmarkView) {
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1715 this.bookmarkModel = bookmarkModel;
26
8c2f3e72d514 Create new view for notifications
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 25
diff changeset
1716 this.notificationsView = notificationsView;
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1717 this.actionsView = actionsView;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1718 this.tagView = tagView;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1719 this.bookmarkView = bookmarkView;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1720
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1721 /* connect the views to the model */
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1722 this.bookmarkModel.addObserver('bookmark-added',
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1723 this.bookmarkView.onBookmarkAdded.bind(this.bookmarkView));
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1724 this.bookmarkModel.addObserver('bookmark-deleted',
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1725 this.bookmarkView.onBookmarkDeleted.bind(this.bookmarkView));
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1726 this.bookmarkModel.addObserver('filter-tags-search-changed',
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1727 this.bookmarkView.onFilterTagsSearchChanged.bind(this.bookmarkView));
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1728 this.bookmarkModel.addObserver('load-file-error',
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1729 this.actionsView.onLoadFileError.bind(this.actionsView));
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1730 this.bookmarkModel.addObserver('parse-file-error',
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1731 this.actionsView.onParseFileError.bind(this.actionsView));
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1732 this.bookmarkModel.addObserver('save-file',
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1733 this.actionsView.onSaveFile.bind(this.actionsView));
11
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
1734 this.bookmarkModel.addObserver('export-file',
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
1735 this.actionsView.onExportFile.bind(this.actionsView));
18
3642bb668af1 Indicate if there are unsaved changes
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 16
diff changeset
1736 this.bookmarkModel.addObserver('unsaved-changes-changed',
26
8c2f3e72d514 Create new view for notifications
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 25
diff changeset
1737 this.notificationsView.onUnsavedChangesChanged.bind(this.notificationsView));
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1738 this.bookmarkModel.addObserver('tag-added',
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1739 this.tagView.onTagAdded.bind(this.tagView));
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1740 this.bookmarkModel.addObserver('tag-count-changed',
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1741 this.tagView.onTagCountChanged.bind(this.tagView));
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1742 this.bookmarkModel.addObserver('tag-deleted',
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1743 this.tagView.onTagDeleted.bind(this.tagView));
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1744 this.bookmarkModel.addObserver('filter-tags-search-changed',
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1745 this.tagView.onFilterTagsSearchChanged.bind(this.tagView));
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1746 this.bookmarkModel.addObserver('filter-tags-search-changed',
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1747 this.onFilterTagsSearchChanged.bind(this));
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1748
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1749 /* handle input */
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1750 window.addEventListener('hashchange', this.onHashChange.bind(this));
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1751 window.addEventListener('beforeunload', this.onBeforeUnload.bind(this));
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1752 this.actionsView.addObserver('save-file',
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1753 this.bookmarkModel.saveFile.bind(this.bookmarkModel));
11
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
1754 this.actionsView.addObserver('export-file',
ef5d75bcac5e Add Netscape bookmark file export function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 10
diff changeset
1755 this.bookmarkModel.exportFile.bind(this.bookmarkModel));
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1756 this.actionsView.addObserver('load-file', this.onLoadFile.bind(this));
10
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
1757 this.actionsView.addObserver('import-file', this.onImportFile.bind(this));
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1758 this.actionsView.addObserver('save-bookmark',
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1759 this.onSaveBookmark.bind(this));
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1760 this.bookmarkView.addObserver('edit-bookmark',
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1761 this.onEditBookmark.bind(this));
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1762 this.bookmarkView.addObserver('save-bookmark',
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1763 this.onSaveBookmark.bind(this));
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1764 this.bookmarkView.addObserver('delete-bookmark',
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1765 this.onDeleteBookmark.bind(this));
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1766 this.bookmarkView.addObserver('toggle-tag',
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1767 this.onToggleFilterTag.bind(this));
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1768 this.bookmarkView.addObserver('set-tag', this.onSetTagFilter.bind(this));
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1769 this.bookmarkView.addObserver('search', this.onSearch.bind(this));
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1770 this.tagView.addObserver('toggle-tag', this.onToggleFilterTag.bind(this));
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1771 this.tagView.addObserver('set-tag', this.onSetTagFilter.bind(this));
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1772 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1773
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1774 BooketController.prototype.parseTagsParameter = function (tagsString) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1775 var tags;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1776
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1777 tags = tagsString.split(',').filter(function (tag) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1778 return (tag !== '') && this.bookmarkModel.hasTag(tag);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1779 }, this).sort();
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1780
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1781 return new StringSet(tags);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1782 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1783
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1784 BooketController.prototype.onHashChange = function (e) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1785 var hashData;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1786 var filterTags;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1787 var searchTerm;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1788
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1789 hashData = parseHash(window.location.href);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1790
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1791 filterTags = hashData.has('tags') ?
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1792 this.parseTagsParameter(hashData.get('tags')) : new StringSet();
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1793
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1794 searchTerm = hashData.has('search') ? hashData.get('search') : '';
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1795
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1796 this.bookmarkModel.setFilterTagsSearchTerm(filterTags, searchTerm);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1797 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1798
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1799 BooketController.prototype.onBeforeUnload = function (e) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1800 var confirmationMessage = 'There are unsaved changes to your bookmarks.';
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1801
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1802 if (this.bookmarkModel.unsavedChanges) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1803 if (e) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1804 e.returnValue = confirmationMessage;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1805 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1806 if (window.event) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1807 window.event.returnValue = confirmationMessage;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1808 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1809 return confirmationMessage;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1810 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1811 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1812
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1813 BooketController.prototype.onFilterTagsSearchChanged =
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1814 function (filteredBookmarks, newFilterTags, newSearchTerm) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1815 var url = window.location.href;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1816 var hashData;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1817
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1818 // serialize tag filter and search term and update window.location
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1819 hashData = parseHash(url);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1820 hashData.set('tags', newFilterTags.values().join(','));
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1821 hashData.set('search', newSearchTerm);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1822 history.pushState(null, null, serializeHash(url, hashData));
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1823 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1824
19
4a4d9527c06f Add merge options
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 18
diff changeset
1825 BooketController.prototype.onLoadFile = function (bookmarkFile, merge) {
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1826 if (this.bookmarkModel.unsavedChanges) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1827 if (!this.actionsView.confirmLoadFile()) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1828 return;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1829 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1830 this.bookmarkModel.unsavedChanges = false;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1831 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1832
19
4a4d9527c06f Add merge options
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 18
diff changeset
1833 this.bookmarkModel.loadFile(bookmarkFile, merge);
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1834 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1835
19
4a4d9527c06f Add merge options
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 18
diff changeset
1836 BooketController.prototype.onImportFile = function (bookmarkFile, merge) {
10
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
1837 if (this.bookmarkModel.unsavedChanges) {
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
1838 if (!this.actionsView.confirmLoadFile()) {
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
1839 return;
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
1840 }
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
1841 this.bookmarkModel.unsavedChanges = false;
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
1842 }
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
1843
19
4a4d9527c06f Add merge options
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 18
diff changeset
1844 this.bookmarkModel.importFile(bookmarkFile, merge);
10
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
1845 };
20902b548d9f Add Netscape bookmark file import function
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 7
diff changeset
1846
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1847 BooketController.prototype.onEditBookmark = function (bookmarkUrl) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1848 this.bookmarkView.displayBookmarkEditor(
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1849 this.bookmarkModel.get(bookmarkUrl));
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1850 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1851
7
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1852 BooketController.prototype.onSaveBookmark = function (url, title,
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1853 favicon, tags, originalUrl) {
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1854 var ctime;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1855
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1856 if (originalUrl === undefined) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1857 // saving new bookmark, get confirmation before replacing existing one
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1858 if (this.bookmarkModel.has(url)) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1859 if (this.bookmarkView.confirmReplaceBookmark(
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1860 this.bookmarkModel.get(url))) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1861 this.bookmarkModel.delete(url);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1862 } else {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1863 return;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1864 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1865 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1866
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1867 ctime = new Date();
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1868 } else {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1869 // saving edited bookmark, preserve creation time of any replaced
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1870 // bookmark
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1871 ctime = (this.bookmarkModel.has(url)) ?
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1872 this.bookmarkModel.get(url).ctime : new Date();
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1873
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1874 this.bookmarkModel.delete(originalUrl);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1875 }
7
a1a934adff8d Add support for favicons
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 6
diff changeset
1876 this.bookmarkModel.add(new Bookmark(url, title, favicon, tags, ctime));
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1877 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1878
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1879 BooketController.prototype.onDeleteBookmark = function (bookmarkUrl) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1880 if (this.bookmarkView.confirmDeleteBookmark(
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1881 this.bookmarkModel.get(bookmarkUrl))) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1882 this.bookmarkModel.delete(bookmarkUrl);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1883 }
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1884 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1885
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1886 BooketController.prototype.onToggleFilterTag = function (tag) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1887 this.bookmarkModel.toggleFilterTag(tag);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1888 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1889
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1890 BooketController.prototype.onSetTagFilter = function (tag) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1891 this.bookmarkModel.setFilterTags(new StringSet([tag]));
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1892 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1893
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1894 BooketController.prototype.onSearch = function (searchTerm) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1895 this.bookmarkModel.setSearchTerm(searchTerm);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1896 };
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1897
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1898
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1899 document.addEventListener('DOMContentLoaded', function (e) {
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1900 var controller;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1901 var bookmarkModel;
26
8c2f3e72d514 Create new view for notifications
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 25
diff changeset
1902 var notificationsView;
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1903 var actionsView;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1904 var tagView;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1905 var bookmarkView;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1906 var hashChangeEvent;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1907
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1908 bookmarkModel = new BookmarkModel();
26
8c2f3e72d514 Create new view for notifications
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 25
diff changeset
1909 notificationsView = new NotificationsView();
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1910 tagView = new TagView();
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1911 actionsView = new ActionsView();
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1912 bookmarkView = new BookmarkView();
26
8c2f3e72d514 Create new view for notifications
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 25
diff changeset
1913 controller = new BooketController(bookmarkModel, notificationsView,
22
b19db583b5f8 Display keyboard shortcuts as an overly when pressing Alt
Guido Berhoerster <guido+booket@berhoerster.name>
parents: 19
diff changeset
1914 actionsView, tagView, bookmarkView);
0
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1915
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1916 // initialize state from the current URL
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1917 hashChangeEvent = new Event('hashchange');
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1918 hashChangeEvent.oldURL = window.location.href;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1919 hashChangeEvent.newURL = window.location.href;
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1920 window.dispatchEvent(hashChangeEvent);
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1921 });
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1922 }());
c2248f662a2c Initial revision
Guido Berhoerster <guido+booket@berhoerster.name>
parents:
diff changeset
1923