|
1 var __prevOpenedBookmarkControl = null; |
|
2 var __previousSortEle = null; |
|
3 var __bookmarkCount= 0; |
|
4 var __dragendFlag = false; |
|
5 var __dogearSelected = false; |
|
6 var __timerValueLeft = 0; |
|
7 var __timerId = ""; |
|
8 var __longPressEvent = false; |
|
9 // Set to the LongPress object that is currently waiting for activation, |
|
10 // ie. it has gotten a mouse-down event and has its timer running. |
|
11 var __currentLongPress; |
|
12 var __cancelLinkOpening = false; |
|
13 |
|
14 var __closed = true; |
|
15 |
|
16 function _displayError(text) { |
|
17 var el = document.getElementById("errorText"); |
|
18 el.style.visibility = "visible"; |
|
19 el.style.width = "100%"; |
|
20 el.style.height = "100%"; |
|
21 el.innerHTML = "<p>" + text; |
|
22 } |
|
23 |
|
24 function _clearError(text) { |
|
25 var el = document.getElementById("errorText"); |
|
26 el.style.visibility = "hidden"; |
|
27 el.style.width = "0"; |
|
28 el.style.height = "0"; |
|
29 el.innerHTML = ""; |
|
30 } |
|
31 |
|
32 function _enableSorting(ele) { |
|
33 // This is messy, why do we even need to do this sort/no-sort stuff??? |
|
34 $(ele).removeClass('no-sort'); |
|
35 $(ele).addClass('sort'); |
|
36 |
|
37 var evt = document.createEvent("MouseEvents"); |
|
38 evt.initMouseEvent("mousedown", true, true, window, |
|
39 0, 0, 0, gInitialX, gInitialY, false, false, false, false, 0, null); |
|
40 var canceled = !ele.dispatchEvent(evt); |
|
41 |
|
42 views.WebView.gesturesEnabled = false; |
|
43 |
|
44 $(ele).find(".dogEarBox").addClass('selected'); |
|
45 $(ele).find(".dogEar").addClass('selected'); |
|
46 |
|
47 __sortingEnabled = true; |
|
48 __sortEleOffsetTop = ele.offsetTop; |
|
49 __previousSortEle = ele; |
|
50 $(ele).toggleClass('highlight'); |
|
51 |
|
52 } |
|
53 |
|
54 function _disableSorting(ele) { |
|
55 // app.debug('disablesorting:'); printProp(ele); |
|
56 |
|
57 views.WebView.gesturesEnabled = true; |
|
58 |
|
59 $(ele).removeClass('sort'); |
|
60 $(ele).addClass('no-sort'); |
|
61 $(ele).find('.dogEarBox').removeClass('selected').addClass('closed'); |
|
62 $(ele).find('.dogEar').removeClass('selected').addClass('closed'); |
|
63 |
|
64 __sortingEnabled = false; |
|
65 __sortEleOffsetTop = 0; |
|
66 __previousSortEle = null; |
|
67 } |
|
68 |
|
69 function _dragInit() |
|
70 { |
|
71 $("#bookmarkListTree").sortable({ |
|
72 placeholder: 'ui-state-highlight', |
|
73 axis:'y', |
|
74 cancel : 'li.no-sort', |
|
75 scrollSensitivity : 40, |
|
76 scrollSpeed : 40, |
|
77 start: function(event, ui) { |
|
78 __dragendFlag = true; |
|
79 }, |
|
80 update: function(event, ui) { |
|
81 var sortedBookmark = ui.item[0]; |
|
82 _disableSorting(sortedBookmark); // Unselect it |
|
83 // If there's only one bookmark in the list, do nothing |
|
84 if ($('#bookmarkListTree').children().length == 0) |
|
85 return; |
|
86 var nextBookmark = $(sortedBookmark).next()[0]; |
|
87 var bm = window.bookmarksController.findBookmark(sortedBookmark.id); |
|
88 // If it wasn't moved to the end, change the sortIndex to the next bookmark's sortIndex and the rest will propagate down |
|
89 if (nextBookmark) { |
|
90 var nextbm = window.bookmarksController.findBookmark(nextBookmark.id); |
|
91 window.bookmarksController.reorderBookmark(sortedBookmark.id, nextbm.sortIndex); |
|
92 } |
|
93 // It was moved to the end, so change the sortIndex to the prev bookmark's sortIndex + 1 |
|
94 else { |
|
95 var prevBookmark = $(sortedBookmark).prev()[0]; |
|
96 var prevbm = window.bookmarksController.findBookmark(prevBookmark.id); |
|
97 window.bookmarksController.reorderBookmark(sortedBookmark.id, prevbm.sortIndex+1); |
|
98 } |
|
99 } |
|
100 |
|
101 }); |
|
102 |
|
103 $("#bookmarkListTree").sortable('enable'); |
|
104 $("#bookmarkListTree").disableSelection(); |
|
105 } |
|
106 |
|
107 function _longPress(ele) { |
|
108 |
|
109 __longPressEvent = true; |
|
110 if(__timerId != "") |
|
111 { |
|
112 window.clearTimeout(__timerId); |
|
113 __timerId = ""; |
|
114 } |
|
115 if (__sortingEnabled) |
|
116 { |
|
117 _disableSorting(__previousSortEle) |
|
118 return false; |
|
119 } |
|
120 |
|
121 if ( $(ele).find('.dogEarBox').hasClass('closed') ) { |
|
122 if ( __closed ) { |
|
123 //_bookmarkHideControl(__prevOpenedBookmarkControl, true ); |
|
124 } else { |
|
125 _bookmarkHideControl(__prevOpenedBookmarkControl, true ); |
|
126 } |
|
127 } else { |
|
128 if (ele.parentNode) |
|
129 { |
|
130 _bookmarkHideControl(ele, false ); |
|
131 __closed = true; |
|
132 } |
|
133 } |
|
134 |
|
135 if(!__dogearSelected) |
|
136 _enableSorting(ele); |
|
137 } |
|
138 |
|
139 function _timeLeft() { |
|
140 |
|
141 __timerValueLeft = 1; |
|
142 } |
|
143 function _longPressStarted(lp) |
|
144 { |
|
145 __timerValueLeft = 0; |
|
146 __longPressEvent = false; |
|
147 if(!window.views.WebView.bedrockTiledBackingStoreEnabled()) |
|
148 { |
|
149 __timerId = window.setTimeout("_timeLeft()",250); |
|
150 } |
|
151 else |
|
152 { |
|
153 __timerId = window.setTimeout("_timeLeft()",550); |
|
154 } |
|
155 // Remember the current LongPress object so we can cancel it if scrolling |
|
156 // starts. |
|
157 __currentLongPress = lp; |
|
158 __cancelLinkOpening = false; |
|
159 |
|
160 } |
|
161 |
|
162 function _handlePanStarted(type) |
|
163 { |
|
164 if(app.ui() != "maemo5_ui") // workaround for Maemo Issue |
|
165 { |
|
166 __cancelLinkOpening = true; |
|
167 } |
|
168 |
|
169 // Scrolling started, cancel the LongPress. |
|
170 if (__currentLongPress != undefined) { |
|
171 __currentLongPress.cancel(); |
|
172 __currentLongPress = undefined; |
|
173 } |
|
174 } |
|
175 |
|
176 |
|
177 function _bookmarkHideControl(ele, is_forward){ |
|
178 var dogEarBox = $(ele).find('.dogEarBox'); |
|
179 var dogEar = $(ele).find('.dogEar'); |
|
180 |
|
181 dogEarBox.addClass('closed'); |
|
182 dogEar.addClass('closed'); |
|
183 $(ele).find('.bookmarkItem').css('width', (parseInt(window.innerWidth)-70)+"px"); |
|
184 |
|
185 if ( is_forward ) |
|
186 dogEar.css('background-image', 'url(/bookmarkview/dogear.png)'); |
|
187 else |
|
188 dogEar.css('background-image', 'url(/bookmarkview/dogear_pressed.png)'); |
|
189 } |
|
190 |
|
191 function _bookmarkToggleControls(event){ |
|
192 var ele = event.target; |
|
193 try { |
|
194 if(__timerId != "") |
|
195 { |
|
196 window.clearTimeout(__timerId); |
|
197 __timerId = ""; |
|
198 } |
|
199 if (__sortingEnabled && ele.parentNode.parentNode!=__previousSortEle) |
|
200 { |
|
201 _disableSorting(__previousSortEle) |
|
202 return false; |
|
203 } |
|
204 else if (__sortingEnabled && (ele.parentNode.parentNode==__previousSortEle)) |
|
205 { |
|
206 return false; |
|
207 } |
|
208 if(__timerValueLeft == 1 || __longPressEvent == true) |
|
209 { |
|
210 __timerValueLeft = 0; |
|
211 __longPressEvent = false; |
|
212 return false; |
|
213 } |
|
214 __timerValueLeft = 0; |
|
215 |
|
216 var li = $(ele).parents('li'); |
|
217 var dogEarBox = li.find('.dogEarBox'); |
|
218 dogEarBox.toggleClass('closed'); |
|
219 dogEarBox.find('.dogEar').toggleClass('closed'); |
|
220 // It's too bad we can't do this via margin-right because then we could just do it in the .css file coz it would be a static value |
|
221 if (dogEarBox.hasClass('closed')) { |
|
222 li.find('.bookmarkItem').css('width', (parseInt(window.innerWidth)-70)+"px"); |
|
223 dogEarBox.find('.dogEar').css('background-image', 'url(/bookmarkview/dogear_pressed.png)'); |
|
224 __closed = true; |
|
225 } |
|
226 else { |
|
227 li.find('.bookmarkItem').css('width', (parseInt(window.innerWidth)-220)+"px"); |
|
228 dogEarBox.find('.dogEar').css('background-image', 'url(/bookmarkview/dogear_open_pressed.png)'); |
|
229 __closed = false; |
|
230 } |
|
231 if (__prevOpenedBookmarkControl != null && __prevOpenedBookmarkControl != ele.parentNode.parentNode) |
|
232 _bookmarkHideControl(__prevOpenedBookmarkControl, true); |
|
233 |
|
234 }catch(e) { alert(e); } |
|
235 |
|
236 __prevOpenedBookmarkControl = ele.parentNode.parentNode; |
|
237 } |
|
238 |
|
239 function _addNewBookmark(bmtitle,bmurl,bmid) |
|
240 { |
|
241 // bookmark title/url may have been altered by the controller's add method (i.e. to include http://) so reload it |
|
242 var bm = window.bookmarksController.findBookmark(bmid); |
|
243 bmtitle = bm.title; |
|
244 bmurl = bm.url; |
|
245 if(__timerId != "") |
|
246 { |
|
247 window.clearTimeout(__timerId); |
|
248 __timerId = ""; |
|
249 } |
|
250 if(__prevOpenedBookmarkControl) |
|
251 _bookmarkHideControl(__prevOpenedBookmarkControl); |
|
252 |
|
253 if(__previousSortEle != null) |
|
254 _disableSorting(__previousSortEle) |
|
255 |
|
256 __bookmarkCount += 1; |
|
257 //create element and add it to bookmark view |
|
258 var ul=document.getElementById('bookmarkListTree'); |
|
259 var dbgTitle = bmtitle.replace(/'/g, "'"); |
|
260 dbgTitle = dbgTitle.replace(/"/g, """); |
|
261 var li = _createBookmarkElement(dbgTitle,bmurl,bmid); |
|
262 $(li).addClass('no-sort'); |
|
263 ul.insertBefore(li, ul.firstChild); |
|
264 ul.childNodes[ul.childNodes.length-1].focus(); |
|
265 |
|
266 if (!window.views.WebView.bedrockTiledBackingStoreEnabled()) |
|
267 new LongPress(li.id, _longPress, _longPressStarted, 250); |
|
268 else |
|
269 new LongPress(li.id, _longPress, _longPressStarted, 550); |
|
270 |
|
271 $('html, body').animate({ |
|
272 scrollTop: 0}, 1000); |
|
273 } |
|
274 |
|
275 function _editBookmark(bmtitle,bmurl,bmid) |
|
276 { |
|
277 if(__prevOpenedBookmarkControl) |
|
278 _bookmarkHideControl(__prevOpenedBookmarkControl); |
|
279 |
|
280 // bookmark title/url may have been altered by the controller's edit method (i.e. to include http://) so reload it |
|
281 var bm = window.bookmarksController.findBookmark(bmid); |
|
282 |
|
283 $('#'+bmid).find('.aTitle').text(bm.title); |
|
284 $('#'+bmid).find('.aUrl').text(bm.url); |
|
285 } |
|
286 |
|
287 function _launchEditBookmark(r,bmtitle,bmurl,id) |
|
288 { |
|
289 // bookmark title/url may have been altered by the controller's edit method, so reload it |
|
290 var bm = window.bookmarksController.findBookmark(id); |
|
291 window.bookmarksController.showBookmarkEditDialog(bm.title,bm.url,id); |
|
292 } |
|
293 |
|
294 function _deleteBookmark(r,bmid) |
|
295 { |
|
296 window.bookmarksController.deleteBookmark(bmid); |
|
297 $('#'+bmid).remove(); |
|
298 } |
|
299 |
|
300 function _openUrl(ele, bmid) { |
|
301 if(__timerId != "") |
|
302 { |
|
303 window.clearTimeout(__timerId); |
|
304 __timerId = ""; |
|
305 } |
|
306 // DragStart & DragEnd listeners are defined at bottom |
|
307 if (__sortingEnabled && (ele.parentNode!=__previousSortEle)) |
|
308 { |
|
309 _disableSorting(__previousSortEle) |
|
310 return false; |
|
311 } |
|
312 else if (__sortingEnabled && (ele.parentNode==__previousSortEle)) |
|
313 { |
|
314 return false; |
|
315 } |
|
316 else if (__dragendFlag) |
|
317 { |
|
318 __dragendFlag = false; |
|
319 return false; |
|
320 } |
|
321 else if(__cancelLinkOpening) |
|
322 { |
|
323 __cancelLinkOpening = false; |
|
324 return false; |
|
325 } |
|
326 |
|
327 window.views.WebView.showNormalPage(); |
|
328 window.ViewStack.switchView( "WebView","BookmarkTreeView"); |
|
329 |
|
330 // Laod a page to chrome view |
|
331 // bookmark title/url may have been altered by the controller's edit method, so reload it |
|
332 var bm = window.bookmarksController.findBookmark(bmid); |
|
333 window.views.WebView.loadUrlToCurrentPage(bm.url); |
|
334 views.WebView.gesturesEnabled = true; |
|
335 } |
|
336 |
|
337 function _updateBookmarkViewGoemetry(displayMode) |
|
338 { |
|
339 // It's too bad we couldn't use margin-right instead of width coz then we could just put a static value in the .css file and not even need to do anything |
|
340 $('.dogEarBox.closed').next('.bookmarkItem').css('width', (parseInt(window.innerWidth)-70)+"px"); |
|
341 $('.dogEarBox').not('.closed').next('.bookmarkItem').css('width', (parseInt(window.innerWidth)-220)+"px"); |
|
342 } |
|
343 |
|
344 function _setDogear() |
|
345 { |
|
346 __dogearSelected = true; |
|
347 } |
|
348 |
|
349 function _unsetDogear() |
|
350 { |
|
351 __dogearSelected = false; |
|
352 } |
|
353 |
|
354 function _changeDogearBackground(ele, bmid, img, img1) { |
|
355 |
|
356 $('#'+bmid).css('background-image', img1); |
|
357 |
|
358 $('#'+bmid).find('.dogEar').css('background-image', img); |
|
359 |
|
360 } |
|
361 |
|
362 function _changeBookmarkItemBackground(ele, bmid, img, img1, img2) { |
|
363 |
|
364 $('#'+bmid).css('background-image', img); |
|
365 |
|
366 if (img1 != '' && img2 != '') |
|
367 { |
|
368 var dogEarBox = $('#'+bmid).find('.dogEarBox'); |
|
369 if (dogEarBox.hasClass('closed')) { |
|
370 $('#'+bmid).find('.dogEar.closed').css('background-image', img1); |
|
371 } else { |
|
372 $('#'+bmid).find('.dogEar').not('.closed').css('background-image', img2); |
|
373 } |
|
374 } |
|
375 |
|
376 } |
|
377 |
|
378 function _createBookmarkElement(bmtitle,bmfullurl,idValue) |
|
379 { |
|
380 var _width = parseInt(window.innerWidth)-70; |
|
381 var escapedTitle = bmtitle.replace(/'/g, "\\'"); |
|
382 var li=document.createElement('li'); |
|
383 li.id = idValue; |
|
384 li.innerHTML = |
|
385 '<div class="dogEarBox closed">'+ // bookmarkBox |
|
386 '<div class="dogEar closed"></div>'+ |
|
387 '<img class="bookmarkEditBtn" src="/bookmarkview/edit_btn.png" width="56" height="56" vspace="7" hspace="5">'+ |
|
388 '<img class="bookmarkDeleteBtn" src="/bookmarkview/delete_btn.png" width="56" height="56" vspace="7" hspace="5" >'+ |
|
389 '</div>'+ |
|
390 '<div class="bookmarkItem" style="width:'+_width+'px;">'+ |
|
391 '<span class="aTitle">'+bmtitle+'</span>'+ |
|
392 '<br/>'+ |
|
393 '<span class="aUrl">'+bmfullurl+'</span>'+ |
|
394 '</div>'; |
|
395 $(li).find('.dogEar.closed').css('background-image', 'url(/bookmarkview/dogear.png)'); |
|
396 $(li).css('background-image', 'url(/bookmarkview/list_itembg.png)'); |
|
397 $(li).find(".dogEar") |
|
398 .click(_bookmarkToggleControls) |
|
399 .mouseover(function (event) {_changeBookmarkItemBackground(event.target, idValue, 'url(/bookmarkview/list_itembg_pressed.png)', 'url(/bookmarkview/dogear_pressed.png)', 'url(/bookmarkview/dogear_open_pressed.png)'); _setDogear();}) |
|
400 .mouseout(function (event) {_changeBookmarkItemBackground(event.target, idValue, 'url(/bookmarkview/list_itembg.png)', 'url(/bookmarkview/dogear.png)', 'url(/bookmarkview/dogear_open.png)'); _unsetDogear(); __prevOpenedBookmarkControl = event.target.parentNode.parentNode;}); |
|
401 $(li).find(".bookmarkItem"). |
|
402 click(function (event) {_openUrl(event.target, idValue);}); |
|
403 $(li).find(".bookmarkEditBtn"). |
|
404 click(function (event) {_launchEditBookmark(event.target, bmtitle, bmfullurl, idValue);}); |
|
405 $(li).find(".bookmarkDeleteBtn"). |
|
406 click(function (event) {_deleteBookmark(event.target, idValue);}); |
|
407 |
|
408 $(li).find(".bookmarkItem"). |
|
409 mouseover(function (event) {_changeDogearBackground(event.target, idValue, 'url(/bookmarkview/dogear_pressed.png)', 'url(/bookmarkview/list_itembg_pressed.png)');}); |
|
410 $(li).find(".bookmarkItem"). |
|
411 mouseout(function (event) {_changeDogearBackground(event.target, idValue, 'url(/bookmarkview/dogear.png)', 'url(/bookmarkview/list_itembg.png)'); __prevOpenedBookmarkControl = event.target.parentNode.parentNode;}); |
|
412 |
|
413 return li; |
|
414 } |
|
415 |
|
416 function _createBookmarkView() |
|
417 { |
|
418 try |
|
419 { |
|
420 __currentLongPress = undefined; |
|
421 //Get bookmarks data from database |
|
422 window.bookmarksController.findAllBookmarks(); |
|
423 var ul=document.getElementById('bookmarkListTree'); |
|
424 while (window.bookmarksController.hasMoreBookmarks()) |
|
425 { |
|
426 var bm = window.bookmarksController.nextBookmark(); |
|
427 var bmurl = bm.url; |
|
428 var bmtitle = bm.title; |
|
429 var id = bm.id; |
|
430 |
|
431 //create element and add it to bookmark view |
|
432 var li = _createBookmarkElement(bmtitle,bmurl,id); |
|
433 $(li).addClass('no-sort'); |
|
434 ul.appendChild(li); |
|
435 ul.childNodes[0].focus(); |
|
436 if (!window.views.WebView.bedrockTiledBackingStoreEnabled()) |
|
437 new LongPress(li.id, _longPress, _longPressStarted, 250); |
|
438 else |
|
439 new LongPress(li.id, _longPress, _longPressStarted, 550); |
|
440 |
|
441 __bookmarkCount++; |
|
442 } |
|
443 } catch(E) { |
|
444 _displayError("Bookmarks unavailable"); // Localize! |
|
445 app.debug("bookmarkView.js:_createBookmarkView: " + E); |
|
446 } |
|
447 |
|
448 _dragInit(); |
|
449 } |
|
450 |
|
451 function launchBookmarkView() |
|
452 { |
|
453 __closed = true; |
|
454 try{ |
|
455 window.chrome.aspectChanged.connect(_updateBookmarkViewGoemetry); |
|
456 window.bookmarksController.bookmarkAdded.connect(_addNewBookmark); |
|
457 window.bookmarksController.bookmarkModified.connect(_editBookmark); |
|
458 |
|
459 // Get Bookmarks from the database |
|
460 _createBookmarkView(); |
|
461 |
|
462 // Watch for the start of scrolling in the view so we can cancel the |
|
463 // long presses to prevent them from interfere with scrolling. Otherwise |
|
464 // the long press callback will fire and trigger sortable mode. |
|
465 views.WebView.startingPanGesture.connect(_handlePanStarted); |
|
466 |
|
467 }catch(e){ alert(e); } |
|
468 } |