~ubuntu-branches/ubuntu/raring/speeddial/raring

« back to all changes in this revision

Viewing changes to content/speeddial.js

  • Committer: Bazaar Package Importer
  • Author(s): Andrea Veri, Andrea Veri, Vikram Dhillon
  • Date: 2009-10-11 12:10:35 UTC
  • mfrom: (1.1.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20091011121035-0ysv7mrfd2by5yot
Tags: 0.9.1.1-0ubuntu1

[ Andrea Veri ]

* New upstream release. FFe granted. (LP: #430155)
* debian/control:
  - added missing xpi:enhances, xpi:provides, xpi:recommends
    fields.
  - set depends on misc:depends
  - removed ant B-D, no more needed
  - added Vcs-Browser field.
  - added homepage field.
* debian/rules:
  - cleaned a bit removing useless comments
  - removed MOZ_EXTENSION_PKG field, it's deprecated atm.
  - MOZ_XPI_BUILD_COMMAND is not set to $(null), nothing needs
    to be built manually. 

[ Vikram Dhillon ]

* Updated Standards-Version to 3.8.3
* Updated mozilla-devscripts to 0.16~

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
// Global vars
2
 
var gPref = Components.classes["@mozilla.org/preferences-service;1"]
3
 
               .getService(Components.interfaces.nsIPrefService)
4
 
               .QueryInterface(Components.interfaces.nsIPrefBranch2);
5
 
var cacheService = Components.classes["@uworks.net/speeddialcache;1"].getService().wrappedJSObject;
6
 
 
7
 
var speedDialBundle;
8
 
 
9
 
// Configuration parameters
10
 
var thumbnailTooltipTitle = true;
11
 
var thumbnailTooltipURL = true;
12
 
var showThumbnailOpenButton = true;
13
 
var showThumbnailReloadButton = true;
14
 
var showThumbnailDeassignButton = true;
15
 
var showThumbnailNewTabButton = true;
16
 
var showThumbnailBackgroundTabButton = true;
17
 
var showThumbnailNewWindowButton = true;
18
 
var showThumbnailEditButton = true;
19
 
var wheelScrollAmount = 10;
20
 
var enableCache = true;
21
 
var hideThumbnailNumbers;
22
 
var enableGroups = false;
23
 
var numGroups = 1;
24
 
var thumbnailDragDropExclude;
25
 
var thumbnailSequentialUpdate;
26
 
var screenColumns = 3;
27
 
var screenRows = 3;
28
 
var imageFormat = "png";
29
 
var marginVertical = -1;
30
 
var marginHorizontal = -1;
31
 
var numberThumbnails = 9;
32
 
var boardMinimumWidth;
33
 
var boardMaximumWidth;
34
 
var boardWidthModifier;
35
 
var boardWidthModifierType;
36
 
var boardMinimumHeight;
37
 
var boardMaximumHeight;
38
 
var boardHeightModifier;
39
 
var boardHeightModifierType;
40
 
var rightClickAction;
41
 
var oldResampling = false;
42
 
var colorizeTabs = false;
43
 
var rememberTabLastGroup = false;
44
 
 
45
 
// Global vars
46
 
var thumbnailCanvasWidth = 0;
47
 
var thumbnailCanvasHeight = 0;
48
 
var updateTimer = null;
49
 
var updateItems = new Array(9);
50
 
var updateLayout = false;
51
 
var boardWidth;
52
 
var boardHeight;
53
 
var isFirefox3 = false;
54
 
var currentGroup = 1;
55
 
var lastCreatedCell = null;
56
 
var topWindow = null;
57
 
 
58
 
function speeddialStartup() {
59
 
  // Load bundle
60
 
  speedDialBundle = document.getElementById("bundle_speeddial");
61
 
 
62
 
  cacheService.addInstance();
63
 
 
64
 
  // Detect version
65
 
  var appInfo = Components.classes["@mozilla.org/xre/app-info;1"]
66
 
                        .getService(Components.interfaces.nsIXULAppInfo)
67
 
  var versionChecker = Components.classes["@mozilla.org/xpcom/version-comparator;1"]
68
 
                        .getService(Components.interfaces.nsIVersionComparator);
69
 
  // only if the platform version is 1.9 or greater
70
 
  if (versionChecker.compare(appInfo.platformVersion, "1.9a1") >= 0) {
71
 
    isFirefox3 = true;
72
 
  }
73
 
  
74
 
  // Load settings
75
 
  thumbnailTooltipTitle = gPref.getBoolPref("extensions.speeddial.thumbnailTooltipTitle");
76
 
  thumbnailTooltipURL = gPref.getBoolPref("extensions.speeddial.thumbnailTooltipURL");
77
 
  thumbnailDragDropExclude = gPref.getBoolPref("extensions.speeddial.thumbnailDragDropExclude");
78
 
  thumbnailSequentialUpdate = gPref.getBoolPref("extensions.speeddial.thumbnailSequentialUpdate");
79
 
  showThumbnailReloadButton = gPref.getBoolPref("extensions.speeddial.showThumbnailReloadButton");
80
 
  showThumbnailDeassignButton = gPref.getBoolPref("extensions.speeddial.showThumbnailDeassignButton");
81
 
  showThumbnailNewTabButton = gPref.getBoolPref("extensions.speeddial.showThumbnailNewTabButton");
82
 
  showThumbnailNewWindowButton = gPref.getBoolPref("extensions.speeddial.showThumbnailNewWindowButton");
83
 
  showThumbnailOpenButton = gPref.getBoolPref("extensions.speeddial.showThumbnailOpenButton");
84
 
  showThumbnailBackgroundTabButton = gPref.getBoolPref("extensions.speeddial.showThumbnailBackgroundTabButton");
85
 
  showThumbnailEditButton = gPref.getBoolPref("extensions.speeddial.showThumbnailEditButton");
86
 
  enableCache = gPref.getBoolPref("extensions.speeddial.enableCache");
87
 
  wheelScrollAmount = gPref.getIntPref("extensions.speeddial.wheelScrollAmount");
88
 
  screenRows = gPref.getIntPref("extensions.speeddial.rows");
89
 
  screenColumns = gPref.getIntPref("extensions.speeddial.columns");
90
 
  boardMinimumWidth = gPref.getIntPref("extensions.speeddial.minimumWidth");
91
 
  boardWidthModifier = gPref.getIntPref("extensions.speeddial.widthModifier");
92
 
  boardWidthModifierType = gPref.getIntPref("extensions.speeddial.widthModifierType");
93
 
  boardMaximumWidth = gPref.getIntPref("extensions.speeddial.maximumWidth");
94
 
  boardMinimumHeight = gPref.getIntPref("extensions.speeddial.minimumHeight");
95
 
  boardHeightModifier = gPref.getIntPref("extensions.speeddial.heightModifier");
96
 
  boardHeightModifierType = gPref.getIntPref("extensions.speeddial.heightModifierType");
97
 
  boardMaximumHeight = gPref.getIntPref("extensions.speeddial.maximumHeight");
98
 
  boardMaximumHeight = gPref.getIntPref("extensions.speeddial.maximumHeight");
99
 
  rightClickAction = gPref.getIntPref("extensions.speeddial.rightClickAction");
100
 
  hideThumbnailNumbers = gPref.getBoolPref("extensions.speeddial.hideThumbnailNumbers");
101
 
  enableGroups = gPref.getBoolPref("extensions.speeddial.enableGroups");
102
 
  imageFormat = gPref.getCharPref("extensions.speeddial.imageFormat");
103
 
  if (enableGroups) {
104
 
    numGroups = gPref.getIntPref("extensions.speeddial.numGroups");
105
 
    colorizeTabs = gPref.getBoolPref("extensions.speeddial.colorizeTabs");
106
 
    rememberTabLastGroup = gPref.getBoolPref("extensions.speeddial.rememberTabLastGroup");
107
 
    // Show tab strip
108
 
    document.getElementById("speeddialTabbox-tabs").setAttribute("collapsed", false);
109
 
  }
110
 
  if (numGroups < 1) numGroups = 1;
111
 
  if (currentGroup >= numGroups) {
112
 
    currentGroup = numGroups;
113
 
  }
114
 
  
115
 
  numberThumbnails = screenRows * screenColumns * numGroups;
116
 
  
117
 
  if (!isFirefox3) {
118
 
    oldResampling = gPref.getBoolPref("extensions.speeddial.oldResampling");
119
 
  }
120
 
  
121
 
  if (gPref.getBoolPref("extensions.speeddial.mouseOverThumbnailButtons")) {
122
 
    document.getElementById("speeddialTabbox").setAttribute("hideThumbButtons", "true");
123
 
  }
124
 
  
125
 
  if (gPref.getBoolPref("extensions.speeddial.hideThumbnailIcons")) {
126
 
    document.getElementById("speeddialTabbox").setAttribute("hideThumbIcons", "true");
127
 
  }
128
 
 
129
 
  if (enableGroups) {
130
 
    var speedDialTab = null;
131
 
    if (rememberTabLastGroup) {
132
 
      // Set top window
133
 
      topWindow = QueryInterface(Components.interfaces.nsIInterfaceRequestor).getInterface(Components.interfaces.nsIWebNavigation).QueryInterface(Components.interfaces.nsIDocShellTreeItem).rootTreeItem.QueryInterface(Components.interfaces.nsIInterfaceRequestor).getInterface(Components.interfaces.nsIDOMWindow);
134
 
    
135
 
      var tabbrowser = topWindow.getBrowser();
136
 
      for (var i = 0; (i < tabbrowser.mTabContainer.childNodes.length) && !speedDialTab; i++) {
137
 
        var tab = tabbrowser.mTabContainer.childNodes[i];
138
 
        if (tab.linkedBrowser.contentWindow == window) {
139
 
          speedDialTab = tab;
140
 
        }
141
 
      }
142
 
    }
143
 
    if ((speedDialTab) && (speedDialTab.hasAttribute("speedDialLastGroup"))) {
144
 
      currentGroup = parseInt(speedDialTab.getAttribute("speedDialLastGroup"));
145
 
    } else {
146
 
      // Retrieve current group if necessary
147
 
      if (window.location.search) {
148
 
        var groupParameter = window.location.search.substr("?group=".length, window.location.search.length);
149
 
        currentGroup = parseInt(groupParameter);
150
 
      }
151
 
    }
152
 
  }
153
 
  
154
 
  // Generate content
155
 
  try {
156
 
  generateContent();
157
 
  } catch (e) { alert(e); }
158
 
 
159
 
  calculateBoardSize();
160
 
  restoreCanvasSize(false);
161
 
 
162
 
  // Register observers
163
 
  SpeedDialPrefObserver.addPrefObserver();
164
 
  window.addEventListener("resize", sizeChanged, false);
165
 
  window.addEventListener("mousedown", windowMouseDown, true);
166
 
 
167
 
  /*
168
 
  if (gPref.getBoolPref("extensions.speeddial.clearURLBarOnLoad")) {
169
 
    // Save selection ranges
170
 
    var parentWindow = getParentWindow();
171
 
    var urlBar = parentWindow.document.getElementById("urlbar");
172
 
    selectionStart = urlBar.selectionStart;
173
 
    selectionEnd = urlBar.selectionEnd;
174
 
  }
175
 
  */
176
 
  
177
 
  //setTimeout(speeddialAfterLoad, 0);
178
 
}
179
 
/*
180
 
function speeddialAfterLoad() {
181
 
  var parentWindow = getParentWindow();
182
 
  var urlBar = parentWindow.document.getElementById("urlbar");
183
 
 
184
 
  if (gPref.getBoolPref("extensions.speeddial.clearURLBarOnLoad")) {
185
 
    urlBar.editor.undo(2);
186
 
    // Restore selection ranges
187
 
    urlBar.setSelectionRange(selectionStart, selectionEnd);
188
 
  }
189
 
 
190
 
  if (gPref.getBoolPref("extensions.speeddial.focusURLBarOnLoad")) {
191
 
    setTimeout(speeddialFocusURLBar, 0);
192
 
  }
193
 
}
194
 
*/
195
 
 
196
 
function tabDragOverEvent(event) {
197
 
  var found = false;
198
 
  var foundNode = null;
199
 
  var currentNode = event.target;
200
 
  
201
 
  while ((currentNode.parentNode) && !found) {
202
 
    if (currentNode.localName == "tab") {
203
 
      found = true;
204
 
      foundNode = currentNode;
205
 
    }
206
 
    currentNode = currentNode.parentNode;
207
 
  }
208
 
  if (found) {
209
 
    if (currentGroup != foundNode.getAttribute("group")) {
210
 
      var tabContainer = document.getElementById("speeddialTabbox-tabs");
211
 
      tabContainer.selectedItem = foundNode;
212
 
    }
213
 
  }
214
 
}
215
 
 
216
 
function generateContent() {
217
 
  var tabContainer = document.getElementById("speeddialTabbox-tabs");
218
 
  var panelContainer = document.getElementById("speeddialTabbox-panelContainer");
219
 
  var selectedPanel = null;
220
 
 
221
 
  for (var b=1; b<=numGroups; b++) {
222
 
    // Create tab
223
 
    var newTab = document.createElement("tab");
224
 
    var newTabPanel = document.createElement("tabpanel");
225
 
    
226
 
    newTab.setAttribute("group", b);
227
 
    if (gPref.prefHasUserValue("extensions.speeddial.group-" + b + "-title")) {
228
 
      newTab.setAttribute("label", gPref.getComplexValue("extensions.speeddial.group-" + b + "-title", Components.interfaces.nsISupportsString).data);
229
 
    } else {
230
 
      newTab.setAttribute("label", speedDialBundle.getFormattedString("untitledGroup.label", [b]));
231
 
    }
232
 
    
233
 
    newTab.setAttribute("ondragover", "tabDragOverEvent(event);");
234
 
    
235
 
    if (gPref.prefHasUserValue("extensions.speeddial.group-" + b + "-backgroundColor")) {
236
 
      newTabPanel.style.backgroundColor = gPref.getCharPref("extensions.speeddial.group-" + b + "-backgroundColor") + " !important";
237
 
      if (colorizeTabs) {
238
 
        newTab.style.backgroundColor = newTabPanel.style.backgroundColor;
239
 
        newTab.style.MozAppearance = "none !important";
240
 
      }
241
 
    }
242
 
 
243
 
    if (gPref.prefHasUserValue("extensions.speeddial.group-" + b + "-textColor")) {
244
 
      newTabPanel.style.color = gPref.getCharPref("extensions.speeddial.group-" + b + "-textColor") + " !important";
245
 
      if (colorizeTabs) {
246
 
        newTab.style.color = gPref.getCharPref("extensions.speeddial.group-" + b + "-textColor") + " !important";
247
 
      }
248
 
    }
249
 
    
250
 
    var newGrid = document.createElement("grid");
251
 
    newGrid.setAttribute("flex", 1);
252
 
    
253
 
    var columns = document.createElement("columns");
254
 
    var column = document.createElement("column");
255
 
    var rows = document.createElement("rows");
256
 
    
257
 
    column.setAttribute("flex", 1);
258
 
    newTab.linkedPanel = "speedDialPanel" + b;
259
 
    newTabPanel.setAttribute("id", newTab.linkedPanel);
260
 
    newTabPanel.setAttribute("group", b);
261
 
    rows.setAttribute("id", newTab.linkedPanel + "-rows");
262
 
 
263
 
    columns.appendChild(column);
264
 
    newGrid.appendChild(columns);
265
 
    newGrid.appendChild(rows);
266
 
    newTabPanel.appendChild(newGrid);
267
 
    panelContainer.appendChild(newTabPanel);
268
 
    tabContainer.appendChild(newTab);
269
 
    
270
 
    if (b == currentGroup) {
271
 
      newTab.setAttribute("selected", "true");
272
 
      selectedPanel = newTabPanel;
273
 
    }
274
 
  }
275
 
 
276
 
  // Generate cells
277
 
  generateTabCells(currentGroup);
278
 
  
279
 
  // Select new panel
280
 
  panelContainer.selectedPanel = selectedPanel;
281
 
}
282
 
 
283
 
function generateTabCells(selectedGroup) {
284
 
  var targetPanelRows = document.getElementById("speedDialPanel" + selectedGroup + "-rows");
285
 
  var currentDial = (selectedGroup - 1) * screenRows * screenColumns + 1;
286
 
  var cellMaxWidth = Math.floor(100/screenColumns);
287
 
  for (var c=1; c<=screenRows; c++) {
288
 
    var newRow = document.createElement("row");
289
 
    newRow.setAttribute("flex", 1);
290
 
    var newRowBox = document.createElement("hbox");
291
 
    newRowBox.setAttribute("flex", 1);
292
 
    for (var d=1; d<=screenColumns; d++) {
293
 
      var newCell = document.createElement("box");
294
 
      newCell.setAttribute("id", "speeddial" + currentDial);
295
 
      newCell.setAttribute("speeddial", currentDial);
296
 
      newCell.setAttribute("class", "speeddialThumb");
297
 
      if (rightClickAction == 6) {
298
 
        newCell.setAttribute("context", "thumbMenu");
299
 
      }
300
 
      newCell.style.maxWidth = cellMaxWidth + "%";
301
 
      newCell.style.width = newCell.style.maxWidth;
302
 
      newCell.style.minWidth = newCell.style.maxWidth;
303
 
      newRowBox.appendChild(newCell);
304
 
      lastCreatedCell = newCell;
305
 
      currentDial++;
306
 
    }
307
 
    newRow.appendChild(newRowBox);
308
 
    targetPanelRows.appendChild(newRow);
309
 
  }
310
 
  document.getElementById("speedDialPanel" + selectedGroup).setAttribute("initiated", true);
311
 
}
312
 
 
313
 
function checkSelectedPanel() {
314
 
  var panelContainer = document.getElementById("speeddialTabbox-panelContainer");
315
 
 
316
 
  if (currentGroup != (panelContainer.selectedIndex + 1)) {
317
 
    currentGroup = panelContainer.selectedIndex + 1;
318
 
 
319
 
    if (!panelContainer.selectedPanel.hasAttribute("initiated")) {
320
 
      generateTabCells(currentGroup);
321
 
    }
322
 
    sizeChanged();
323
 
  }
324
 
  /*
325
 
  var initialDial = currentGroup * screenRows * screenColumns + 1;
326
 
  // Update thumbnails
327
 
  for (var c=initialDial; c<=(initialDial + screenRows * screenColumns); c++) {
328
 
    var currentThumbnail = document.getElementById("speeddial" + c);
329
 
    if (currentThumbnail) {
330
 
      currentThumbnail.updateThumbnail();
331
 
    }
332
 
    updateItems[c] = false;
333
 
  }
334
 
  */
335
 
}
336
 
 
337
 
function destroyContent() {
338
 
  var tabContainer = document.getElementById("speeddialTabbox-tabs");
339
 
  var panelContainer = document.getElementById("speeddialTabbox-panelContainer");
340
 
 
341
 
  for (var c=tabContainer.childNodes.length-1; c>=0; c--) {
342
 
    var currentElement = tabContainer.childNodes[c];
343
 
    if (currentElement.localName == "tab") {
344
 
      var targetPanel = document.getElementById(currentElement.linkedPanel);
345
 
      
346
 
      // Take out tab
347
 
      panelContainer.removeChild(targetPanel);
348
 
      tabContainer.removeChild(currentElement);
349
 
    }
350
 
  }
351
 
}
352
 
 
353
 
function checkThumbnailDragDropExcludeCanvas(event) {
354
 
  if (thumbnailDragDropExclude) {
355
 
    event.stopPropagation();
356
 
  }
357
 
}
358
 
 
359
 
function speeddialFocusURLBar() {
360
 
  var parentWindow = getParentWindow();
361
 
  var urlBar = parentWindow.document.getElementById("urlbar");
362
 
  urlBar.focus();
363
 
  urlBar.select();
364
 
}
365
 
 
366
 
function speeddialUnload() {
367
 
  // Unregister observers
368
 
  SpeedDialPrefObserver.removePrefObserver();
369
 
  window.removeEventListener("resize", sizeChanged, false);
370
 
  window.removeEventListener("mousedown", windowMouseDown, true);
371
 
 
372
 
  cacheService.removeInstance();
373
 
  if (!enableCache) {
374
 
    if (cacheService.getNumberInstances() <= 0) {
375
 
      // Nullify cache
376
 
      for (var c=0; c<numberThumbnails; c++) {
377
 
        cacheService.setImage(null, c);
378
 
      }
379
 
    }
380
 
  }
381
 
  
382
 
  if (rememberTabLastGroup) {
383
 
    // Remember current group
384
 
    var tabbrowser = topWindow.getBrowser();
385
 
    var foundTab = false;
386
 
    for (var i = 0; (i < tabbrowser.mTabContainer.childNodes.length) && !foundTab; i++) {
387
 
      var tab = tabbrowser.mTabContainer.childNodes[i];
388
 
      if (tab.linkedBrowser.contentWindow == window) {
389
 
        tab.setAttribute("speedDialLastGroup", currentGroup);
390
 
        foundTab = true;
391
 
      }
392
 
    }
393
 
  }
394
 
}
395
 
 
396
 
function restoreCanvasSize(sequentialUpdate) {
397
 
//  if (marginHorizontal < 0) {
398
 
    var canvasBox = document.getBoxObjectFor(lastCreatedCell.getCanvasBox());
399
 
    thumbnailCanvasWidth = canvasBox.width;
400
 
    thumbnailCanvasHeight = canvasBox.height;
401
 
    marginHorizontal = boardWidth - screenColumns * thumbnailCanvasWidth;
402
 
    marginVertical = boardHeight - screenRows * thumbnailCanvasHeight;
403
 
//  }
404
 
 
405
 
//  if (thumbnailCanvasWidth < 0) {
406
 
//    thumbnailCanvasWidth = Math.floor((boardWidth - marginHorizontal) / screenColumns);
407
 
//    thumbnailCanvasHeight = Math.floor((boardHeight - marginVertical) / screenRows);
408
 
//  }
409
 
 
410
 
  // Update thumbnails for current group
411
 
  var initialDial = (currentGroup - 1) * screenRows * screenColumns + 1;
412
 
  // Update thumbnails
413
 
  for (var c=initialDial; c<=(initialDial + screenRows * screenColumns); c++) {
414
 
    var currentThumbnail = document.getElementById("speeddial" + c);
415
 
    if (currentThumbnail) {
416
 
      currentThumbnail.updateThumbnail();
417
 
    }
418
 
    updateItems[c] = false;
419
 
  }
420
 
}
421
 
 
422
 
function nullifyCanvasSize() {
423
 
  for (var c=1; c<=numberThumbnails; c++) {
424
 
    var currentThumbnail = document.getElementById("speeddial" + c);
425
 
    if (currentThumbnail) {
426
 
      currentThumbnail.nullifyCanvas();
427
 
    }
428
 
  }
429
 
}
430
 
 
431
 
function updatePendingItems() {
432
 
  for (var c=1; c<=numberThumbnails; c++) {
433
 
    if (updateItems[c]) {
434
 
      var currentThumbnail = document.getElementById("speeddial" + c);
435
 
      if (currentThumbnail) {
436
 
        currentThumbnail.updateThumbnail();
437
 
      }
438
 
      updateItems[c] = false;
439
 
    }
440
 
  }
441
 
}
442
 
 
443
 
function openURL(url, where) {
444
 
  if (!url) return;
445
 
 
446
 
  var parentWindow = getParentWindow();
447
 
  if (where == "current") {
448
 
    document.location = url;
449
 
  } else {
450
 
    parentWindow.openUILinkIn(url, where);
451
 
  }
452
 
}
453
 
 
454
 
function contextEditGroup() {
455
 
  var found = false;
456
 
  var foundIndex = -1;
457
 
  var currentNode = document.popupNode;
458
 
  
459
 
  while ((currentNode.parentNode) && !found) {
460
 
    if (currentNode.localName == "tab") {
461
 
      found = true;
462
 
      foundIndex = currentNode.getAttribute("group");
463
 
    }
464
 
    currentNode = currentNode.parentNode;
465
 
  }
466
 
  if (found) {
467
 
    openDialog("chrome://speeddial/content/editGroup.xul", "",
468
 
             "centerscreen,chrome,dialog,resizable,dependent", [ foundIndex ]);
469
 
  }
470
 
}
471
 
 
472
 
function contextAddGroup() {
473
 
  openDialog("chrome://speeddial/content/editGroup.xul", "",
474
 
             "centerscreen,chrome,dialog,resizable,dependent", [ -1 ]);
475
 
}
476
 
 
477
 
function contextRemoveGroup() {
478
 
  var found = false;
479
 
  var foundIndex = -1;
480
 
  var currentNode = document.popupNode;
481
 
  
482
 
  while ((currentNode.parentNode) && !found) {
483
 
    if (currentNode.localName == "tab") {
484
 
      found = true;
485
 
      foundIndex = parseInt(currentNode.getAttribute("group"));
486
 
    }
487
 
    currentNode = currentNode.parentNode;
488
 
  }
489
 
  if (found) {
490
 
    var totalGroups = gPref.getIntPref("extensions.speeddial.numGroups");
491
 
    
492
 
    if (totalGroups < 2) return;
493
 
    
494
 
    // Move data
495
 
    for (var c=foundIndex; c<totalGroups; c++) {
496
 
      // Move title
497
 
      if (gPref.prefHasUserValue("extensions.speeddial.group-" + (c+1) + "-title")) {
498
 
        gPref.setComplexValue("extensions.speeddial.group-" + c + "-title", Components.interfaces.nsISupportsString, gPref.getComplexValue("extensions.speeddial.group-" + (c+1) + "-title", Components.interfaces.nsISupportsString));
499
 
        gPref.clearUserPref("extensions.speeddial.group-" + (c+1) + "-title");
500
 
      } else if (gPref.prefHasUserValue("extensions.speeddial.group-" + c + "-title")) {
501
 
        gPref.clearUserPref("extensions.speeddial.group-" + c + "-title");
502
 
      }
503
 
      
504
 
      // Move background color
505
 
      if (gPref.prefHasUserValue("extensions.speeddial.group-" + (c+1) + "-backgroundColor")) {
506
 
        gPref.setCharPref("extensions.speeddial.group-" + c + "-backgroundColor", gPref.getCharPref("extensions.speeddial.group-" + (c+1) + "-backgroundColor"));
507
 
        gPref.clearUserPref("extensions.speeddial.group-" + (c+1) + "-backgroundColor");
508
 
      } else if (gPref.prefHasUserValue("extensions.speeddial.group-" + c + "-backgroundColor")) {
509
 
        gPref.clearUserPref("extensions.speeddial.group-" + c + "-backgroundColor");
510
 
      }
511
 
      
512
 
      // Move text color
513
 
      if (gPref.prefHasUserValue("extensions.speeddial.group-" + (c+1) + "-textColor")) {
514
 
        gPref.setCharPref("extensions.speeddial.group-" + c + "-textColor", gPref.getCharPref("extensions.speeddial.group-" + (c+1) + "-textColor"));
515
 
        gPref.clearUserPref("extensions.speeddial.group-" + (c+1) + "-textColor");
516
 
      } else if (gPref.prefHasUserValue("extensions.speeddial.group-" + c + "-textColor")) {
517
 
        gPref.clearUserPref("extensions.speeddial.group-" + c + "-textColor");
518
 
      }
519
 
      
520
 
    }
521
 
    
522
 
    gPref.setIntPref("extensions.speeddial.numGroups", totalGroups - 1);
523
 
    if (currentGroup == totalGroups) {
524
 
      currentGroup--;
525
 
    }
526
 
  }
527
 
}
528
 
 
529
 
function editThumbnail(thumbNumber) {
530
 
  openDialog("chrome://speeddial/content/editDial.xul", "",
531
 
             "centerscreen,chrome,dialog,resizable,dependent", [ thumbNumber ]);
532
 
}
533
 
 
534
 
function refreshThumbnail(thumbNumber) {
535
 
  gPref.setBoolPref("extensions.speeddial.thumbnail-" + thumbNumber + "-manualrefresh", true);
536
 
}
537
 
 
538
 
function refreshAllThumbnails() {
539
 
  for (var c=0; c<=numberThumbnails; c++) {
540
 
    if (gPref.prefHasUserValue("extensions.speeddial.thumbnail-" + c + "-url")) {
541
 
      gPref.setBoolPref("extensions.speeddial.thumbnail-" + c + "-manualrefresh", true);
542
 
    }
543
 
  }
544
 
}
545
 
 
546
 
function showingThumbnailTooltip(event) {
547
 
  event.stopPropagation();
548
 
 
549
 
  var currentTitle = document.getElementById("thumbnailTooltipTitle");
550
 
  var currentURL = document.getElementById("thumbnailTooltipURL");
551
 
  var showTooltip = false;
552
 
 
553
 
  var targetNode = document.tooltipNode;
554
 
  while (targetNode && (!targetNode.parentThumbnail)) {
555
 
    targetNode = targetNode.parentNode;
556
 
  }
557
 
  if (targetNode.parentThumbnail)
558
 
    targetNode = targetNode.parentThumbnail;
559
 
 
560
 
  if (thumbnailTooltipTitle && targetNode.hasAttribute("thumbnailTitle")) {
561
 
    currentTitle.removeAttribute("hidden");
562
 
    currentTitle.value = targetNode.getAttribute("thumbnailTitle");
563
 
    showTooltip = true;
564
 
  } else {
565
 
    currentTitle.setAttribute("hidden", true);
566
 
  }
567
 
 
568
 
  if (thumbnailTooltipURL && targetNode.hasAttribute("thumbnailURL")) {
569
 
    currentURL.removeAttribute("hidden");
570
 
    currentURL.value = targetNode.getAttribute("thumbnailURL");
571
 
    showTooltip = true;
572
 
  } else {
573
 
    currentURL.setAttribute("hidden", true);
574
 
  }
575
 
  return showTooltip;
576
 
}
577
 
 
578
 
function getParentWindow() {
579
 
  if (window.opener) {
580
 
    return window.opener;
581
 
  } else {
582
 
    return QueryInterface(Components.interfaces.nsIInterfaceRequestor).getInterface(Components.interfaces.nsIWebNavigation).QueryInterface(Components.interfaces.nsIDocShellTreeItem).rootTreeItem.QueryInterface(Components.interfaces.nsIInterfaceRequestor).getInterface(Components.interfaces.nsIDOMWindow);
583
 
  }
584
 
}
585
 
 
586
 
function getThumbnailImageURL(thumbnailNumber) {
587
 
  var file = Components.classes["@mozilla.org/file/directory_service;1"]
588
 
                     .getService(Components.interfaces.nsIProperties)
589
 
                     .get("ProfD", Components.interfaces.nsIFile);
590
 
  var fileExtension = imageFormat;
591
 
  if (gPref.prefHasUserValue("extensions.speeddial.thumbnail-" + thumbnailNumber + "-format")) {
592
 
    fileExtension = gPref.getCharPref("extensions.speeddial.thumbnail-" + thumbnailNumber + "-format");
593
 
  }
594
 
  file.append(SpeedDialUtils.thumbFolder);
595
 
  if (!gPref.prefHasUserValue("extensions.speeddial.thumbnail-" + thumbnailNumber + "-lastsaved")) {
596
 
    file.append("thumbnail-" + thumbnailNumber + "." + fileExtension);
597
 
  } else {
598
 
    file.append("thumbnail-" + thumbnailNumber + "-" + gPref.getCharPref("extensions.speeddial.thumbnail-" + thumbnailNumber + "-lastsaved") + "." + fileExtension);
599
 
  }
600
 
  if (file.exists() && !file.isDirectory()) {
601
 
    var ios = Components.classes["@mozilla.org/network/io-service;1"]
602
 
                    .getService(Components.interfaces.nsIIOService);
603
 
    return ios.newFileURI(file).spec;
604
 
  } else {
605
 
    return null;
606
 
  }
607
 
}
608
 
 
609
 
function moveThumbnailImage(originalNumber, destinationNumber) {
610
 
  var file = Components.classes["@mozilla.org/file/directory_service;1"]
611
 
                     .getService(Components.interfaces.nsIProperties)
612
 
                     .get("ProfD", Components.interfaces.nsIFile);
613
 
  file.append(SpeedDialUtils.thumbFolder);
614
 
  var thumbFolder = file.clone();
615
 
 
616
 
  var fileExtension = imageFormat;
617
 
  if (gPref.prefHasUserValue("extensions.speeddial.thumbnail-" + originalNumber + "-format")) {
618
 
    fileExtension = gPref.getCharPref("extensions.speeddial.thumbnail-" + originalNumber + "-format");
619
 
  } else if (gPref.prefHasUserValue("extensions.speeddial.thumbnail-" + destinationNumber + "-format")) {
620
 
    fileExtension = gPref.getCharPref("extensions.speeddial.thumbnail-" + destinationNumber + "-format");
621
 
  }
622
 
 
623
 
  if (gPref.prefHasUserValue("extensions.speeddial.thumbnail-" + originalNumber + "-lastsaved")) {
624
 
    file.append("thumbnail-" + originalNumber + "-" + gPref.getCharPref("extensions.speeddial.thumbnail-" + originalNumber + "-lastsaved") + "." + fileExtension);
625
 
  } else {
626
 
    file.append("thumbnail-" + originalNumber + "." + fileExtension);
627
 
  }
628
 
 
629
 
  var destFileName;
630
 
  if (gPref.prefHasUserValue("extensions.speeddial.thumbnail-" + destinationNumber + "-lastsaved")) {
631
 
    destFileName = "thumbnail-" + destinationNumber + "-" + gPref.getCharPref("extensions.speeddial.thumbnail-" + destinationNumber + "-lastsaved") + "." + fileExtension;
632
 
  } else {
633
 
    destFileName = "thumbnail-" + destinationNumber + "." + fileExtension;
634
 
  }
635
 
//alert("file: " + file.path + ", to: " + destFileName);
636
 
  if (file.exists() && !file.isDirectory()) {
637
 
    file.moveTo(thumbFolder, destFileName);
638
 
  }
639
 
}
640
 
 
641
 
function copyThumbnailData(originalDial, targetDial) {
642
 
  // Copy data
643
 
  if (gPref.prefHasUserValue("extensions.speeddial.thumbnail-" + originalDial + "-url")) {
644
 
    gPref.setCharPref("extensions.speeddial.thumbnail-" + targetDial + "-url", gPref.getCharPref("extensions.speeddial.thumbnail-" + originalDial + "-url"));
645
 
  }
646
 
 
647
 
  if (gPref.prefHasUserValue("extensions.speeddial.thumbnail-" + originalDial + "-icon")) {
648
 
    gPref.setCharPref("extensions.speeddial.thumbnail-" + targetDial + "-icon", gPref.getCharPref("extensions.speeddial.thumbnail-" + originalDial + "-icon"));
649
 
  }
650
 
 
651
 
  if (gPref.prefHasUserValue("extensions.speeddial.thumbnail-" + originalDial + "-label")) {
652
 
    gPref.setComplexValue("extensions.speeddial.thumbnail-" + targetDial + "-label", Components.interfaces.nsISupportsString, gPref.getComplexValue("extensions.speeddial.thumbnail-" + originalDial + "-label", Components.interfaces.nsISupportsString));
653
 
  }
654
 
 
655
 
  if (gPref.prefHasUserValue("extensions.speeddial.thumbnail-" + originalDial + "-lastsaved")) {
656
 
    gPref.setCharPref("extensions.speeddial.thumbnail-" + targetDial + "-lastsaved", gPref.getCharPref("extensions.speeddial.thumbnail-" + originalDial + "-lastsaved"));
657
 
  }
658
 
 
659
 
  if (gPref.prefHasUserValue("extensions.speeddial.thumbnail-" + originalDial + "-dynamictitle")) {
660
 
    gPref.setBoolPref("extensions.speeddial.thumbnail-" + targetDial + "-dynamictitle", gPref.getBoolPref("extensions.speeddial.thumbnail-" + originalDial + "-dynamictitle"));
661
 
  }
662
 
 
663
 
  if (gPref.prefHasUserValue("extensions.speeddial.thumbnail-" + originalDial + "-refreshinterval")) {
664
 
    gPref.setIntPref("extensions.speeddial.thumbnail-" + targetDial + "-refreshinterval", gPref.getIntPref("extensions.speeddial.thumbnail-" + originalDial + "-refreshinterval"));
665
 
  }
666
 
 
667
 
  if (gPref.prefHasUserValue("extensions.speeddial.thumbnail-" + originalDial + "-manualrefresh")) {
668
 
    gPref.setBoolPref("extensions.speeddial.thumbnail-" + targetDial + "-manualrefresh", gPref.getBoolPref("extensions.speeddial.thumbnail-" + originalDial + "-manualrefresh"));
669
 
  }
670
 
 
671
 
  if (gPref.prefHasUserValue("extensions.speeddial.thumbnail-" + originalDial + "-format")) {
672
 
    gPref.setCharPref("extensions.speeddial.thumbnail-" + targetDial + "-format", gPref.getCharPref("extensions.speeddial.thumbnail-" + originalDial + "-format"));
673
 
  }
674
 
 
675
 
  if (gPref.prefHasUserValue("extensions.speeddial.thumbnail-" + originalDial + "-backgroundcolor")) {
676
 
    gPref.setCharPref("extensions.speeddial.thumbnail-" + targetDial + "-backgroundcolor", gPref.getCharPref("extensions.speeddial.thumbnail-" + originalDial + "-backgroundcolor"));
677
 
  }
678
 
 
679
 
  if (gPref.prefHasUserValue("extensions.speeddial.thumbnail-" + originalDial + "-layout")) {
680
 
    gPref.setIntPref("extensions.speeddial.thumbnail-" + targetDial + "-layout", gPref.getIntPref("extensions.speeddial.thumbnail-" + originalDial + "-layout"));
681
 
  }
682
 
 
683
 
  if (gPref.prefHasUserValue("extensions.speeddial.thumbnail-" + originalDial + "-cropping")) {
684
 
    gPref.setCharPref("extensions.speeddial.thumbnail-" + targetDial + "-cropping", gPref.getCharPref("extensions.speeddial.thumbnail-" + originalDial + "-cropping"));
685
 
  }
686
 
 
687
 
  if (gPref.prefHasUserValue("extensions.speeddial.thumbnail-" + originalDial + "-thumbnailurl")) {
688
 
    gPref.setCharPref("extensions.speeddial.thumbnail-" + targetDial + "-thumbnailurl", gPref.getCharPref("extensions.speeddial.thumbnail-" + originalDial + "-thumbnailurl"));
689
 
  }
690
 
}
691
 
 
692
 
function copyThumbnailImage(originalNumber, destinationNumber) {
693
 
  var file = Components.classes["@mozilla.org/file/directory_service;1"]
694
 
                     .getService(Components.interfaces.nsIProperties)
695
 
                     .get("ProfD", Components.interfaces.nsIFile);
696
 
  file.append(SpeedDialUtils.thumbFolder);
697
 
  var thumbFolder = file.clone();
698
 
 
699
 
  var fileExtension = imageFormat;
700
 
  if (gPref.prefHasUserValue("extensions.speeddial.thumbnail-" + originalNumber + "-format")) {
701
 
    fileExtension = gPref.getCharPref("extensions.speeddial.thumbnail-" + originalNumber + "-format");
702
 
  } else if (gPref.prefHasUserValue("extensions.speeddial.thumbnail-" + destinationNumber + "-format")) {
703
 
    fileExtension = gPref.getCharPref("extensions.speeddial.thumbnail-" + destinationNumber + "-format");
704
 
  }  
705
 
 
706
 
  if (gPref.prefHasUserValue("extensions.speeddial.thumbnail-" + originalNumber + "-lastsaved")) {
707
 
    file.append("thumbnail-" + originalNumber + "-" + gPref.getCharPref("extensions.speeddial.thumbnail-" + originalNumber + "-lastsaved") + "." + fileExtension);
708
 
  } else {
709
 
    file.append("thumbnail-" + originalNumber + "." + fileExtension);
710
 
  }
711
 
 
712
 
  var destFileName;
713
 
  if (gPref.prefHasUserValue("extensions.speeddial.thumbnail-" + destinationNumber + "-lastsaved")) {
714
 
    destFileName = "thumbnail-" + destinationNumber + "-" + gPref.getCharPref("extensions.speeddial.thumbnail-" + destinationNumber + "-lastsaved") + "." + fileExtension;
715
 
  } else {
716
 
    destFileName = "thumbnail-" + destinationNumber + "." + fileExtension;
717
 
  }
718
 
 
719
 
  if (file.exists() && !file.isDirectory()) {
720
 
    file.copyTo(thumbFolder, destFileName);
721
 
  }
722
 
}
723
 
 
724
 
 
725
 
function getThumbnailCanvasWidth() {
726
 
  return thumbnailCanvasWidth;
727
 
}
728
 
 
729
 
function getThumbnailCanvasHeight() {
730
 
  return thumbnailCanvasHeight;
731
 
}
732
 
 
733
 
function checkShouldShowContextMenu(thumbNumber) {
734
 
  var thumbMenu = document.getElementById("thumbMenu");
735
 
  var showItems;
736
 
  
737
 
  if (gPref.prefHasUserValue("extensions.speeddial.thumbnail-" + thumbNumber + "-url")) {
738
 
    showItems = true;
739
 
  } else {
740
 
    showItems = false;
741
 
  }
742
 
  
743
 
  for (var c=0; c<thumbMenu.childNodes.length; c++) {
744
 
    if ((thumbMenu.childNodes[c].getAttribute("id") != "context-edit") &&
745
 
        (thumbMenu.childNodes[c].getAttribute("id") != "context-refreshall")) {
746
 
      thumbMenu.childNodes[c].setAttribute("hidden", !showItems);
747
 
    }
748
 
  }
749
 
  
750
 
  return true;
751
 
}
752
 
 
753
 
function sizeChanged() {
754
 
/*
755
 
  var innerBox = document.getElementById("speeddialBox");
756
 
  
757
 
  if ((innerBox.boxObject.width < boardWidth) || (innerBox.boxObject.height < boardHeight)) {
758
 
    boardWidth = innerBox.boxObject.width;
759
 
    boardHeight = innerBox.boxObject.height;
760
 
    nullifyCanvasSize();
761
 
    setTimeout(restoreCanvasSize, 0);
762
 
  } else {
763
 
    restoreCanvasSize();
764
 
  }
765
 
*/
766
 
//  nullifyCanvasSize();
767
 
//  setTimeout(restoreCanvasSize, 0, false);
768
 
  thumbnailCanvasWidth = -1;
769
 
  thumbnailCanvasHeight = -1;
770
 
 
771
 
  calculateBoardSize();
772
 
 
773
 
  restoreCanvasSize(false);
774
 
}
775
 
 
776
 
function windowMouseDown(el) {
777
 
  if (el.button == 1) {
778
 
    el.stopPropagation();
779
 
//    el.preventDefault();
780
 
  }
781
 
}
782
 
 
783
 
var SpeedDialPrefObserver = 
784
 
{
785
 
  prefObserver : {
786
 
    observe: function(subject, topic, data) {
787
 
    // subject is the nsIPrefBranch we're observing (after appropriate QI)
788
 
    // data is the name of the pref that's been changed (relative to subject)
789
 
    var updateAllThumbnails = false;
790
 
    var updatePendingThumbnails = false;
791
 
 
792
 
    if (topic == "nsPref:changed") {
793
 
      if (data.indexOf("extensions.speeddial.thumbnail-") == 0) {
794
 
        // A thumbnail is updated!
795
 
        var number = (data.split("-", 2))[1];
796
 
        if (number <= numberThumbnails) {
797
 
          updateItems[number] = true;
798
 
          updatePendingThumbnails = true;
799
 
        }
800
 
      } else {
801
 
        var updateSize = false;
802
 
        if (data == "extensions.speeddial.thumbnailTooltipTitle") {
803
 
          thumbnailTooltipTitle = gPref.getBoolPref("extensions.speeddial.thumbnailTooltipTitle");
804
 
        } else if (data == "extensions.speeddial.thumbnailTooltipTitle") {
805
 
          thumbnailTooltipURL = gPref.getBoolPref("extensions.speeddial.thumbnailTooltipURL");
806
 
        } else if (data == "extensions.speeddial.thumbnailDragDropExclude") {
807
 
          thumbnailDragDropExclude = gPref.getBoolPref("extensions.speeddial.thumbnailDragDropExclude");
808
 
        } else if (data == "extensions.speeddial.showThumbnailReloadButton") {
809
 
          showThumbnailReloadButton = gPref.getBoolPref("extensions.speeddial.showThumbnailReloadButton");
810
 
          updateAllThumbnails = true;
811
 
        } else if (data == "extensions.speeddial.showThumbnailDeassignButton") {
812
 
          showThumbnailDeassignButton = gPref.getBoolPref("extensions.speeddial.showThumbnailDeassignButton");
813
 
          updateAllThumbnails = true;
814
 
        } else if (data == "extensions.speeddial.showThumbnailNewTabButton") {
815
 
          showThumbnailNewTabButton = gPref.getBoolPref("extensions.speeddial.showThumbnailNewTabButton");
816
 
          updateAllThumbnails = true;
817
 
        } else if (data == "extensions.speeddial.showThumbnailNewWindowButton") {
818
 
          showThumbnailNewWindowButton = gPref.getBoolPref("extensions.speeddial.showThumbnailNewWindowButton");
819
 
          updateAllThumbnails = true;
820
 
        } else if (data == "extensions.speeddial.showThumbnailEditButton") {
821
 
          showThumbnailEditButton = gPref.getBoolPref("extensions.speeddial.showThumbnailEditButton");
822
 
          updateAllThumbnails = true;
823
 
        } else if (data == "extensions.speeddial.showThumbnailBackgroundTabButton") {
824
 
          showThumbnailBackgroundTabButton = gPref.getBoolPref("extensions.speeddial.showThumbnailBackgroundTabButton");
825
 
          updateAllThumbnails = true;
826
 
        } else if (data == "extensions.speeddial.showThumbnailOpenButton") {
827
 
          showThumbnailOpenButton = gPref.getBoolPref("extensions.speeddial.showThumbnailOpenButton");
828
 
          updateAllThumbnails = true;
829
 
        } else if (data == "extensions.speeddial.whellScrollAmount") {
830
 
          whellScrollAmount = gPref.getIntPref("extensions.speeddial.whellScrollAmount");
831
 
        } else if (data == "extensions.speeddial.enableCache") {
832
 
          enableCache = gPref.getBoolPref("extensions.speeddial.enableCache");
833
 
        } else if (data == "extensions.speeddial.rows") {
834
 
          screenRows = gPref.getIntPref("extensions.speeddial.rows");
835
 
          updateAllThumbnails = true;
836
 
          updateLayout = true;
837
 
          numberThumbnails = screenRows * screenColumns;
838
 
        } else if (data == "extensions.speeddial.columns") {
839
 
          screenColumns = gPref.getIntPref("extensions.speeddial.columns");
840
 
          updateAllThumbnails = true;
841
 
          updateLayout = true;
842
 
          numberThumbnails = screenRows * screenColumns;
843
 
        } else if (data == "extensions.speeddial.minimumWidth") {
844
 
          boardMinimumWidth = gPref.getIntPref("extensions.speeddial.minimumWidth");
845
 
          updateSize = true;
846
 
        } else if (data == "extensions.speeddial.widthModifier") {
847
 
          boardWidthModifier = gPref.getIntPref("extensions.speeddial.widthModifier");
848
 
          updateSize = true;
849
 
        } else if (data == "extensions.speeddial.widthModifierType") {
850
 
          boardWidthModifierType = gPref.getIntPref("extensions.speeddial.widthModifierType");
851
 
          updateSize = true;
852
 
        } else if (data == "extensions.speeddial.maximumWidth") {
853
 
          boardMaximumWidth = gPref.getIntPref("extensions.speeddial.maximumWidth");
854
 
          updateSize = true;
855
 
        } else if (data == "extensions.speeddial.minimumHeight") {
856
 
          boardMinimumHeight = gPref.getIntPref("extensions.speeddial.minimumHeight");
857
 
          updateSize = true;
858
 
        } else if (data == "extensions.speeddial.heightModifier") {
859
 
          boardHeightModifier = gPref.getIntPref("extensions.speeddial.heightModifier");
860
 
          updateSize = true;
861
 
        } else if (data == "extensions.speeddial.heightModifierType") {
862
 
          boardHeightModifierType = gPref.getIntPref("extensions.speeddial.heightModifierType");
863
 
          updateSize = true;
864
 
        } else if (data == "extensions.speeddial.maximumHeight") {
865
 
          boardMaximumHeight = gPref.getIntPref("extensions.speeddial.maximumHeight");
866
 
          updateSize = true;
867
 
        } else if (data == "extensions.speeddial.rightClickAction") {
868
 
          rightClickAction = gPref.getIntPref("extensions.speeddial.rightClickAction");
869
 
          updateAllThumbnails = true;
870
 
          updateLayout = true;
871
 
        } else if (data == "extensions.speeddial.imageFormat") {
872
 
          imageFormat = gPref.getCharPref("extensions.speeddial.imageFormat");
873
 
        } else if ((data == "extensions.speeddial.oldResampling") && (!isFirefox3)) {
874
 
          oldResampling = gPref.getBoolPref("extensions.speeddial.oldResampling");
875
 
        } else if (data == "extensions.speeddial.mouseOverThumbnailButtons") {
876
 
          document.getElementById("speeddialTabbox").setAttribute("hideThumbButtons", gPref.getBoolPref("extensions.speeddial.mouseOverThumbnailButtons"));
877
 
        } else if (data == "extensions.speeddial.hideThumbnailNumbers") {
878
 
          hideThumbnailNumbers = gPref.getBoolPref("extensions.speeddial.hideThumbnailNumbers");
879
 
          updateAllThumbnails = true;
880
 
        } else if (data == "extensions.speeddial.hideThumbnailIcons") {
881
 
          document.getElementById("speeddialTabbox").setAttribute("hideThumbIcons", gPref.getBoolPref("extensions.speeddial.hideThumbnailIcons"));
882
 
        } else if (data == "extensions.speeddial.colorizeTabs") {
883
 
          colorizeTabs = gPref.getBoolPref("extensions.speeddial.colorizeTabs");
884
 
          if (enableGroups) {
885
 
            updateAllThumbnails = true;
886
 
            updateLayout = true;
887
 
          }
888
 
        } else if (data == "extensions.speeddial.enableGroups") {
889
 
          enableGroups = gPref.getBoolPref("extensions.speeddial.enableGroups");
890
 
          if (enableGroups) {
891
 
            document.getElementById("speeddialTabbox-tabs").setAttribute("collapsed", false);
892
 
            numGroups = gPref.getIntPref("extensions.speeddial.numGroups");
893
 
            colorizeTabs = gPref.getBoolPref("extensions.speeddial.colorizeTabs");
894
 
            if (numGroups < 1) numGroups = 1;
895
 
          } else {
896
 
            document.getElementById("speeddialTabbox-tabs").setAttribute("collapsed", true);
897
 
            numGroups = 1;
898
 
          }
899
 
          updateAllThumbnails = true;
900
 
          updateLayout = true;
901
 
        } else if (data == "extensions.speeddial.numGroups") {
902
 
          if (enableGroups) {
903
 
            numGroups = gPref.getIntPref("extensions.speeddial.numGroups");
904
 
            if (numGroups < 1) numGroups = 1;
905
 
            updateAllThumbnails = true;
906
 
            updateLayout = true;
907
 
          }
908
 
        } else if (data.indexOf("extensions.speeddial.group-") == 0) {
909
 
          var number = (data.split("-", 2))[1];
910
 
          if ((number == 1) || (enableGroups)) {
911
 
            updateAllThumbnails = true;
912
 
            updateLayout = true;
913
 
          }
914
 
        }
915
 
        
916
 
        if (updateSize) {
917
 
          sizeChanged();
918
 
        }
919
 
      }
920
 
      if (updateAllThumbnails) {
921
 
        for (var c=1; c<=numberThumbnails; c++) {
922
 
          updateItems[c] = true;
923
 
        }
924
 
      }
925
 
 
926
 
      if (updateAllThumbnails || updatePendingThumbnails) {
927
 
        if (updateTimer == null) {
928
 
          updateTimer = Components.classes["@mozilla.org/timer;1"].createInstance(Components.interfaces.nsITimer);
929
 
        }
930
 
        updateTimer.cancel();
931
 
        updateTimer.initWithCallback(SpeedDialPrefObserver.prefObserver, 100, Components.interfaces.nsITimer.TYPE_ONE_SHOT);
932
 
      }
933
 
    }
934
 
  },
935
 
 
936
 
  QueryInterface : function (aIID) {
937
 
    if (aIID.equals(Components.interfaces.nsIObserver) || 
938
 
    aIID.equals(Components.interfaces.nsITimerCallback) ||
939
 
    aIID.equals(Components.interfaces.nsISupports) ||
940
 
    aIID.equals(Components.interfaces.nsISupportsWeakReference))
941
 
      return this;
942
 
    throw Components.results.NS_NOINTERFACE;
943
 
  },
944
 
 
945
 
    notify: function(timer) {
946
 
      if (updateLayout) {
947
 
        destroyContent();
948
 
        generateContent();
949
 
        thumbnailCanvasWidth = -1;
950
 
        thumbnailCanvasHeight = -1;
951
 
        sizeChanged();
952
 
        restoreCanvasSize(false);
953
 
      } else {
954
 
        updatePendingItems();
955
 
      }
956
 
    }
957
 
  },
958
 
 
959
 
  addPrefObserver : function () {
960
 
    if (!gPref) return;
961
 
    gPref.addObserver("extensions.speeddial.", SpeedDialPrefObserver.prefObserver, true);
962
 
  },
963
 
 
964
 
  removePrefObserver : function () {
965
 
    if (!gPref) return;
966
 
    gPref.removeObserver("extensions.speeddial.", SpeedDialPrefObserver.prefObserver);
967
 
  }
968
 
};
969
 
 
970
 
// Drag & drop
971
 
var thumbnailObserver = {
972
 
  onDragStart: function (evt,transferData,action) {
973
 
    transferData.data = createTransferDataForEntry(evt.currentTarget.getAttribute("speeddial"));
974
 
    if (transferData.data == null)
975
 
      return false;
976
 
    return true;
977
 
  },
978
 
 
979
 
  getSupportedFlavours : function () {
980
 
    var flavours = new FlavourSet();
981
 
    flavours.appendFlavour("text/x-speeddial-entry");
982
 
    flavours.appendFlavour("text/x-moz-url");
983
 
    flavours.appendFlavour("application/x-moz-file", "nsIFile");
984
 
    return flavours;
985
 
  },
986
 
 
987
 
  checkCanDrop: function(aEvent, aDragDropObserver) {
988
 
    // Allow drop on itself
989
 
    return true;
990
 
  },
991
 
 
992
 
  onDragOver: function (evt,flavour,session) {
993
 
  },
994
 
 
995
 
  onDragExit: function (aEvent, aDragSession) {
996
 
  },
997
 
 
998
 
  onDrop: function (aEvent,dropdata,session) {
999
 
try {
1000
 
    const kDSIID      = Components.interfaces.nsIDragService;
1001
 
    const kCopyAction = kDSIID.DRAGDROP_ACTION_COPY + kDSIID.DRAGDROP_ACTION_LINK;
1002
 
    var moveIfPossible = !(session.dragAction & kCopyAction);
1003
 
 
1004
 
    var targetData = getSelectionFromXferData(session);
1005
 
    var targetDial = aEvent.currentTarget.getAttribute("speeddial");
1006
 
 
1007
 
    if (targetData.type == "speedDialId") {
1008
 
      var originalDial = targetData.value;
1009
 
 
1010
 
      if (originalDial == targetDial) {
1011
 
        // If dropping on itself, just open it
1012
 
        openURL(gPref.getCharPref("extensions.speeddial.thumbnail-" + originalDial + "-url"), "current");
1013
 
        return;
1014
 
      }
1015
 
 
1016
 
      if (moveIfPossible) {
1017
 
        SpeedDialUtils.deassignThumbnail(numberThumbnails+1);
1018
 
        SpeedDialUtils.deassignThumbnail(numberThumbnails+2);
1019
 
 
1020
 
        // Move image
1021
 
        moveThumbnailImage(originalDial, numberThumbnails+1);
1022
 
        moveThumbnailImage(targetDial, numberThumbnails+2);
1023
 
 
1024
 
        // Move data
1025
 
        copyThumbnailData(originalDial, numberThumbnails+1);
1026
 
        SpeedDialUtils.deassignThumbnail(originalDial);
1027
 
        copyThumbnailData(targetDial, originalDial);
1028
 
        SpeedDialUtils.deassignThumbnail(targetDial);
1029
 
        copyThumbnailData(numberThumbnails+1, targetDial);
1030
 
 
1031
 
        SpeedDialUtils.deassignThumbnail(numberThumbnails+1);
1032
 
        
1033
 
        // Move images back again
1034
 
        moveThumbnailImage(numberThumbnails+1, targetDial);
1035
 
        moveThumbnailImage(numberThumbnails+2, originalDial);
1036
 
 
1037
 
        // Update cache...
1038
 
        if (enableCache || oldResampling) {
1039
 
          cacheService.setImage(getThumbnailImageURL(originalDial), originalDial);
1040
 
          cacheService.setImage(getThumbnailImageURL(targetDial), targetDial);
1041
 
        }
1042
 
      } else {
1043
 
        SpeedDialUtils.deassignThumbnail(targetDial);
1044
 
        copyThumbnailData(originalDial, targetDial);
1045
 
        // Copy image
1046
 
        copyThumbnailImage(originalDial, targetDial);
1047
 
 
1048
 
        // Update cache...
1049
 
        if (enableCache || oldResampling) {
1050
 
          cacheService.setImage(getThumbnailImageURL(targetDial), targetDial);
1051
 
        }
1052
 
      }
1053
 
    } else {
1054
 
      // We're inserting a new URL if possible...
1055
 
      var url = transferUtils.retrieveURLFromData(targetData.data, targetData.contentType);
1056
 
        
1057
 
      if (!url || !url.length || url.indexOf(" ", 0) != -1 ||
1058
 
        /^\s*(javascript|data):/.test(url))
1059
 
        return;
1060
 
      
1061
 
      // Just add the information...
1062
 
      gPref.setCharPref("extensions.speeddial.thumbnail-" + targetDial + "-url", url);
1063
 
 
1064
 
      var str = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString);
1065
 
      str.data = "";
1066
 
      gPref.setComplexValue("extensions.speeddial.thumbnail-" + targetDial + "-label", Components.interfaces.nsISupportsString, str);
1067
 
 
1068
 
      gPref.setCharPref("extensions.speeddial.thumbnail-" + targetDial + "-icon", "data:");
1069
 
      gPref.setBoolPref("extensions.speeddial.thumbnail-" + targetDial + "-dynamictitle", true);
1070
 
 
1071
 
      // add time intervals
1072
 
      var defaultRefreshInterval = gPref.getIntPref("extensions.speeddial.defaultRefreshInterval");
1073
 
      if (defaultRefreshInterval > 0) {
1074
 
        gPref.setIntPref("extensions.speeddial.thumbnail-" + targetDial + "-refreshinterval", defaultRefreshInterval);
1075
 
      } else {
1076
 
        if (gPref.prefHasUserValue("extensions.speeddial.thumbnail-" + targetDial + "-refreshinterval")) {
1077
 
          gPref.clearUserPref("extensions.speeddial.thumbnail-" + targetDial + "-refreshinterval");
1078
 
        }
1079
 
      }
1080
 
 
1081
 
      if (gPref.prefHasUserValue("extensions.speeddial.thumbnail-" + targetDial + "-lastsaved")) {
1082
 
        gPref.clearUserPref("extensions.speeddial.thumbnail-" + targetDial + "-lastsaved");
1083
 
      }
1084
 
 
1085
 
      if (gPref.prefHasUserValue("extensions.speeddial.thumbnail-" + targetDial + "-format")) {
1086
 
        gPref.clearUserPref("extensions.speeddial.thumbnail-" + targetDial + "-format");
1087
 
      }
1088
 
 
1089
 
      if (gPref.prefHasUserValue("extensions.speeddial.thumbnail-" + targetDial + "-backgroundcolor")) {
1090
 
        gPref.clearUserPref("extensions.speeddial.thumbnail-" + targetDial + "-backgroundcolor");
1091
 
      }
1092
 
 
1093
 
      if (gPref.prefHasUserValue("extensions.speeddial.thumbnail-" + targetDial + "-layout")) {
1094
 
        gPref.clearUserPref("extensions.speeddial.thumbnail-" + targetDial + "-layout");
1095
 
      }
1096
 
 
1097
 
      if (gPref.prefHasUserValue("extensions.speeddial.thumbnail-" + targetDial + "-cropping")) {
1098
 
        gPref.clearUserPref("extensions.speeddial.thumbnail-" + targetDial + "-cropping");
1099
 
      }
1100
 
 
1101
 
      if (gPref.prefHasUserValue("extensions.speeddial.thumbnail-" + targetDial + "-thumbnailurl")) {
1102
 
        gPref.clearUserPref("extensions.speeddial.thumbnail-" + targetDial + "-thumbnailurl");
1103
 
      }
1104
 
    }
1105
 
} catch (e) {
1106
 
alert(e);
1107
 
}
1108
 
  },
1109
 
 
1110
 
  canHandleMultipleItems: false
1111
 
};
1112
 
 
1113
 
function getSelectionFromXferData(aDragSession) {
1114
 
    var newValue = {};
1115
 
    var trans = Components.classes["@mozilla.org/widget/transferable;1"]
1116
 
                          .createInstance(Components.interfaces.nsITransferable);
1117
 
    trans.addDataFlavor("text/x-speeddial-entry");
1118
 
    trans.addDataFlavor("text/x-moz-url");
1119
 
    trans.addDataFlavor("text/x-moz-file");
1120
 
    trans.addDataFlavor("text/unicode");
1121
 
    var uri, extra, rSource, rParent, parent;
1122
 
    if (aDragSession.numDropItems > 0) {
1123
 
      var bestFlavour = {}, dataObj = {}, len = {};
1124
 
      aDragSession.getData(trans, 0);
1125
 
      trans.getAnyTransferData(bestFlavour, dataObj, len);
1126
 
      dataObj = dataObj.value.QueryInterface(Components.interfaces.nsISupportsString);
1127
 
      if (dataObj) {
1128
 
        var value = dataObj.data.substring(0, len.value);
1129
 
 
1130
 
        newValue.value = value;
1131
 
        switch (bestFlavour.value) {
1132
 
        case "text/x-speeddial-entry":
1133
 
          newValue.type = "speedDialId";
1134
 
          break;
1135
 
        case "text/x-moz-url":
1136
 
        case "text/x-moz-file":
1137
 
        case "text/unicode":
1138
 
          newValue.type = "url";
1139
 
          newValue.contentType = bestFlavour.value;
1140
 
          newValue.data = dataObj.data;
1141
 
          break;
1142
 
        }
1143
 
      }
1144
 
    }
1145
 
    return newValue;
1146
 
}
1147
 
 
1148
 
function createTransferDataForEntry(targetEntry) {
1149
 
  var value;
1150
 
  var title;
1151
 
 
1152
 
  if (gPref.prefHasUserValue("extensions.speeddial.thumbnail-" + targetEntry + "-url")) {
1153
 
    value = gPref.getCharPref("extensions.speeddial.thumbnail-" + targetEntry + "-url");
1154
 
  } else {
1155
 
    return null;
1156
 
  }
1157
 
 
1158
 
  if (gPref.prefHasUserValue("extensions.speeddial.thumbnail-" + targetEntry + "-label")) {
1159
 
    title = gPref.getCharPref("extensions.speeddial.thumbnail-" + targetEntry + "-label");
1160
 
  } else {
1161
 
    title = "";
1162
 
  }
1163
 
 
1164
 
  if (title == "") {
1165
 
    title = speedDialBundle.getString("untitled.label");
1166
 
  }
1167
 
  
1168
 
  var urlString = value + "\n" + title;
1169
 
  var htmlString = "<a href=\"" + value + "\">" + title + "</a>";
1170
 
 
1171
 
  var data = new TransferData();
1172
 
  data.addDataForFlavour("text/x-speeddial-entry", targetEntry);
1173
 
  if ((value == "") || (value == "about:blank")) {
1174
 
    data.addDataForFlavour("text/unicode", value);
1175
 
  } else {
1176
 
    data.addDataForFlavour("text/x-moz-url", urlString);
1177
 
    data.addDataForFlavour("text/unicode", value);
1178
 
    data.addDataForFlavour("text/html", htmlString);
1179
 
  }
1180
 
 
1181
 
  return data;
1182
 
}
1183
 
 
1184
 
function calculateBoardSize() {
1185
 
  var innerBox = document.getElementById("speedDialPanel" + currentGroup);
1186
 
  boardWidth = innerBox.boxObject.width;
1187
 
  boardHeight = innerBox.boxObject.height;
1188
 
  if (boardWidthModifierType == 0) {
1189
 
    boardWidth = Math.floor(boardWidth * boardWidthModifier / 100);
1190
 
  } else {
1191
 
    boardWidth -= boardWidthModifier;
1192
 
  }
1193
 
  if ((boardMinimumWidth > 0) && (boardWidth < boardMinimumWidth)) {
1194
 
    boardWidth = boardMinimumWidth;
1195
 
  }
1196
 
  if ((boardMaximumWidth > 0) && (boardWidth > boardMaximumWidth)) {
1197
 
    boardWidth = boardMaximumWidth;
1198
 
  }
1199
 
  
1200
 
  if (boardHeightModifierType == 0) {
1201
 
    boardHeight = Math.floor(boardHeight * boardHeightModifier / 100);
1202
 
  } else {
1203
 
    boardHeight -= boardHeightModifier;
1204
 
  }
1205
 
  if ((boardMinimumHeight > 0) && (boardHeight < boardMinimumHeight)) {
1206
 
    boardHeight = boardMinimumHeight;
1207
 
  }
1208
 
  if ((boardMaximumHeight > 0) && (boardHeight > boardMaximumHeight)) {
1209
 
    boardHeight = boardMaximumHeight;
1210
 
  }
1211
 
 
1212
 
  if (boardWidth > innerBox.boxObject.width) boardWidth = innerBox.boxObject.width;
1213
 
  if (boardHeight > innerBox.boxObject.height) boardHeight = innerBox.boxObject.height;
1214
 
 
1215
 
  // Set border
1216
 
  innerBox.style.paddingLeft = Math.floor((innerBox.boxObject.width - boardWidth) / 2) + "px";
1217
 
  innerBox.style.paddingRight = innerBox.style.paddingLeft;
1218
 
  innerBox.style.paddingTop = Math.floor((innerBox.boxObject.height - boardHeight) / 2) + "px";
1219
 
  innerBox.style.paddingBottom = innerBox.style.paddingTop;
1220
 
}
1221
 
 
1222
 
function groupContextShowing(event) {
1223
 
  var currentNode = document.popupNode;
1224
 
  var found = false;
1225
 
  while ((currentNode.parentNode) && !found) {
1226
 
    if (currentNode.localName == "tab") {
1227
 
      found = true;
1228
 
    }
1229
 
    currentNode = currentNode.parentNode;
1230
 
  }
1231
 
  if (found) {
1232
 
    // Show edit and remove
1233
 
    document.getElementById("groupcontext-edit").setAttribute("hidden", false);
1234
 
    var contextRemove = document.getElementById("groupcontext-remove");
1235
 
    contextRemove.setAttribute("hidden", false);
1236
 
    if (numGroups < 2) {
1237
 
      contextRemove.setAttribute("disabled", true);
1238
 
    } else {
1239
 
      contextRemove.setAttribute("disabled", false);
1240
 
    }
1241
 
  } else {
1242
 
    // hide edit and remove
1243
 
    document.getElementById("groupcontext-edit").setAttribute("hidden", true);
1244
 
    document.getElementById("groupcontext-remove").setAttribute("hidden", true);
1245
 
  }
1246
 
  return true;
1247
 
}
1248
 
 
1249
 
window.addEventListener("load", function(e) { speeddialStartup() }, false);
1250