diff -r 6aeb7a756187 -r 3c88a81ff781 ginebra2/chrome/bedrockchrome/bookmarkview.superpage/bookmarkviewTenone.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ginebra2/chrome/bedrockchrome/bookmarkview.superpage/bookmarkviewTenone.js Fri Oct 15 17:30:59 2010 -0400 @@ -0,0 +1,468 @@ +var __prevOpenedBookmarkControl = null; +var __previousSortEle = null; +var __bookmarkCount= 0; +var __dragendFlag = false; +var __dogearSelected = false; +var __timerValueLeft = 0; +var __timerId = ""; +var __longPressEvent = false; +// Set to the LongPress object that is currently waiting for activation, +// ie. it has gotten a mouse-down event and has its timer running. +var __currentLongPress; +var __cancelLinkOpening = false; + +var __closed = true; + +function _displayError(text) { + var el = document.getElementById("errorText"); + el.style.visibility = "visible"; + el.style.width = "100%"; + el.style.height = "100%"; + el.innerHTML = "

" + text; +} + +function _clearError(text) { + var el = document.getElementById("errorText"); + el.style.visibility = "hidden"; + el.style.width = "0"; + el.style.height = "0"; + el.innerHTML = ""; +} + +function _enableSorting(ele) { + // This is messy, why do we even need to do this sort/no-sort stuff??? + $(ele).removeClass('no-sort'); + $(ele).addClass('sort'); + + var evt = document.createEvent("MouseEvents"); + evt.initMouseEvent("mousedown", true, true, window, + 0, 0, 0, gInitialX, gInitialY, false, false, false, false, 0, null); + var canceled = !ele.dispatchEvent(evt); + + views.WebView.gesturesEnabled = false; + + $(ele).find(".dogEarBox").addClass('selected'); + $(ele).find(".dogEar").addClass('selected'); + + __sortingEnabled = true; + __sortEleOffsetTop = ele.offsetTop; + __previousSortEle = ele; + $(ele).toggleClass('highlight'); + + } + +function _disableSorting(ele) { +// app.debug('disablesorting:'); printProp(ele); + + views.WebView.gesturesEnabled = true; + + $(ele).removeClass('sort'); + $(ele).addClass('no-sort'); + $(ele).find('.dogEarBox').removeClass('selected').addClass('closed'); + $(ele).find('.dogEar').removeClass('selected').addClass('closed'); + + __sortingEnabled = false; + __sortEleOffsetTop = 0; + __previousSortEle = null; +} + +function _dragInit() +{ + $("#bookmarkListTree").sortable({ + placeholder: 'ui-state-highlight', + axis:'y', + cancel : 'li.no-sort', + scrollSensitivity : 40, + scrollSpeed : 40, + start: function(event, ui) { + __dragendFlag = true; + }, + update: function(event, ui) { + var sortedBookmark = ui.item[0]; + _disableSorting(sortedBookmark); // Unselect it + // If there's only one bookmark in the list, do nothing + if ($('#bookmarkListTree').children().length == 0) + return; + var nextBookmark = $(sortedBookmark).next()[0]; + var bm = window.bookmarksController.findBookmark(sortedBookmark.id); + // If it wasn't moved to the end, change the sortIndex to the next bookmark's sortIndex and the rest will propagate down + if (nextBookmark) { + var nextbm = window.bookmarksController.findBookmark(nextBookmark.id); + window.bookmarksController.reorderBookmark(sortedBookmark.id, nextbm.sortIndex); + } + // It was moved to the end, so change the sortIndex to the prev bookmark's sortIndex + 1 + else { + var prevBookmark = $(sortedBookmark).prev()[0]; + var prevbm = window.bookmarksController.findBookmark(prevBookmark.id); + window.bookmarksController.reorderBookmark(sortedBookmark.id, prevbm.sortIndex+1); + } + } + + }); + + $("#bookmarkListTree").sortable('enable'); + $("#bookmarkListTree").disableSelection(); +} + +function _longPress(ele) { + + __longPressEvent = true; + if(__timerId != "") + { + window.clearTimeout(__timerId); + __timerId = ""; + } + if (__sortingEnabled) + { + _disableSorting(__previousSortEle) + return false; + } + + if ( $(ele).find('.dogEarBox').hasClass('closed') ) { + if ( __closed ) { + //_bookmarkHideControl(__prevOpenedBookmarkControl, true ); + } else { + _bookmarkHideControl(__prevOpenedBookmarkControl, true ); + } + } else { + if (ele.parentNode) + { + _bookmarkHideControl(ele, false ); + __closed = true; + } + } + + if(!__dogearSelected) + _enableSorting(ele); +} + +function _timeLeft() { + + __timerValueLeft = 1; +} +function _longPressStarted(lp) +{ + __timerValueLeft = 0; + __longPressEvent = false; + if(!window.views.WebView.bedrockTiledBackingStoreEnabled()) + { + __timerId = window.setTimeout("_timeLeft()",250); + } + else + { + __timerId = window.setTimeout("_timeLeft()",550); + } + // Remember the current LongPress object so we can cancel it if scrolling + // starts. + __currentLongPress = lp; + __cancelLinkOpening = false; + +} + +function _handlePanStarted(type) +{ + if(app.ui() != "maemo5_ui") // workaround for Maemo Issue + { + __cancelLinkOpening = true; + } + + // Scrolling started, cancel the LongPress. + if (__currentLongPress != undefined) { + __currentLongPress.cancel(); + __currentLongPress = undefined; + } +} + + +function _bookmarkHideControl(ele, is_forward){ + var dogEarBox = $(ele).find('.dogEarBox'); + var dogEar = $(ele).find('.dogEar'); + + dogEarBox.addClass('closed'); + dogEar.addClass('closed'); + $(ele).find('.bookmarkItem').css('width', (parseInt(window.innerWidth)-70)+"px"); + + if ( is_forward ) + dogEar.css('background-image', 'url(/bookmarkview/dogear.png)'); + else + dogEar.css('background-image', 'url(/bookmarkview/dogear_pressed.png)'); +} + +function _bookmarkToggleControls(event){ + var ele = event.target; + try { + if(__timerId != "") + { + window.clearTimeout(__timerId); + __timerId = ""; + } + if (__sortingEnabled && ele.parentNode.parentNode!=__previousSortEle) + { + _disableSorting(__previousSortEle) + return false; + } + else if (__sortingEnabled && (ele.parentNode.parentNode==__previousSortEle)) + { + return false; + } + if(__timerValueLeft == 1 || __longPressEvent == true) + { + __timerValueLeft = 0; + __longPressEvent = false; + return false; + } + __timerValueLeft = 0; + + var li = $(ele).parents('li'); + var dogEarBox = li.find('.dogEarBox'); + dogEarBox.toggleClass('closed'); + dogEarBox.find('.dogEar').toggleClass('closed'); + // 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 + if (dogEarBox.hasClass('closed')) { + li.find('.bookmarkItem').css('width', (parseInt(window.innerWidth)-70)+"px"); + dogEarBox.find('.dogEar').css('background-image', 'url(/bookmarkview/dogear_pressed.png)'); + __closed = true; + } + else { + li.find('.bookmarkItem').css('width', (parseInt(window.innerWidth)-220)+"px"); + dogEarBox.find('.dogEar').css('background-image', 'url(/bookmarkview/dogear_open_pressed.png)'); + __closed = false; + } + if (__prevOpenedBookmarkControl != null && __prevOpenedBookmarkControl != ele.parentNode.parentNode) + _bookmarkHideControl(__prevOpenedBookmarkControl, true); + + }catch(e) { alert(e); } + + __prevOpenedBookmarkControl = ele.parentNode.parentNode; +} + +function _addNewBookmark(bmtitle,bmurl,bmid) +{ + // bookmark title/url may have been altered by the controller's add method (i.e. to include http://) so reload it + var bm = window.bookmarksController.findBookmark(bmid); + bmtitle = bm.title; + bmurl = bm.url; + if(__timerId != "") + { + window.clearTimeout(__timerId); + __timerId = ""; + } + if(__prevOpenedBookmarkControl) + _bookmarkHideControl(__prevOpenedBookmarkControl); + + if(__previousSortEle != null) + _disableSorting(__previousSortEle) + + __bookmarkCount += 1; + //create element and add it to bookmark view + var ul=document.getElementById('bookmarkListTree'); + var dbgTitle = bmtitle.replace(/'/g, "'"); + dbgTitle = dbgTitle.replace(/"/g, """); + var li = _createBookmarkElement(dbgTitle,bmurl,bmid); + $(li).addClass('no-sort'); + ul.insertBefore(li, ul.firstChild); + ul.childNodes[ul.childNodes.length-1].focus(); + + if (!window.views.WebView.bedrockTiledBackingStoreEnabled()) + new LongPress(li.id, _longPress, _longPressStarted, 250); + else + new LongPress(li.id, _longPress, _longPressStarted, 550); + + $('html, body').animate({ + scrollTop: 0}, 1000); +} + +function _editBookmark(bmtitle,bmurl,bmid) +{ + if(__prevOpenedBookmarkControl) + _bookmarkHideControl(__prevOpenedBookmarkControl); + + // bookmark title/url may have been altered by the controller's edit method (i.e. to include http://) so reload it + var bm = window.bookmarksController.findBookmark(bmid); + + $('#'+bmid).find('.aTitle').text(bm.title); + $('#'+bmid).find('.aUrl').text(bm.url); +} + +function _launchEditBookmark(r,bmtitle,bmurl,id) +{ + // bookmark title/url may have been altered by the controller's edit method, so reload it + var bm = window.bookmarksController.findBookmark(id); + window.bookmarksController.showBookmarkEditDialog(bm.title,bm.url,id); +} + +function _deleteBookmark(r,bmid) +{ + window.bookmarksController.deleteBookmark(bmid); + $('#'+bmid).remove(); +} + +function _openUrl(ele, bmid) { + if(__timerId != "") + { + window.clearTimeout(__timerId); + __timerId = ""; + } + // DragStart & DragEnd listeners are defined at bottom + if (__sortingEnabled && (ele.parentNode!=__previousSortEle)) + { + _disableSorting(__previousSortEle) + return false; + } + else if (__sortingEnabled && (ele.parentNode==__previousSortEle)) + { + return false; + } + else if (__dragendFlag) + { + __dragendFlag = false; + return false; + } + else if(__cancelLinkOpening) + { + __cancelLinkOpening = false; + return false; + } + + window.views.WebView.showNormalPage(); + window.ViewStack.switchView( "WebView","BookmarkTreeView"); + + // Laod a page to chrome view + // bookmark title/url may have been altered by the controller's edit method, so reload it + var bm = window.bookmarksController.findBookmark(bmid); + window.views.WebView.loadUrlToCurrentPage(bm.url); + views.WebView.gesturesEnabled = true; +} + +function _updateBookmarkViewGoemetry(displayMode) +{ + // 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 + $('.dogEarBox.closed').next('.bookmarkItem').css('width', (parseInt(window.innerWidth)-70)+"px"); + $('.dogEarBox').not('.closed').next('.bookmarkItem').css('width', (parseInt(window.innerWidth)-220)+"px"); +} + +function _setDogear() +{ + __dogearSelected = true; +} + +function _unsetDogear() +{ + __dogearSelected = false; +} + +function _changeDogearBackground(ele, bmid, img, img1) { + + $('#'+bmid).css('background-image', img1); + + $('#'+bmid).find('.dogEar').css('background-image', img); + +} + +function _changeBookmarkItemBackground(ele, bmid, img, img1, img2) { + + $('#'+bmid).css('background-image', img); + + if (img1 != '' && img2 != '') + { + var dogEarBox = $('#'+bmid).find('.dogEarBox'); + if (dogEarBox.hasClass('closed')) { + $('#'+bmid).find('.dogEar.closed').css('background-image', img1); + } else { + $('#'+bmid).find('.dogEar').not('.closed').css('background-image', img2); + } + } + +} + +function _createBookmarkElement(bmtitle,bmfullurl,idValue) +{ + var _width = parseInt(window.innerWidth)-70; + var escapedTitle = bmtitle.replace(/'/g, "\\'"); + var li=document.createElement('li'); + li.id = idValue; + li.innerHTML = + '

'+ // bookmarkBox + '
'+ + ''+ + ''+ + '
'+ + '
'+ + ''+bmtitle+''+ + '
'+ + ''+bmfullurl+''+ + '
'; + $(li).find('.dogEar.closed').css('background-image', 'url(/bookmarkview/dogear.png)'); + $(li).css('background-image', 'url(/bookmarkview/list_itembg.png)'); + $(li).find(".dogEar") + .click(_bookmarkToggleControls) + .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();}) + .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;}); + $(li).find(".bookmarkItem"). + click(function (event) {_openUrl(event.target, idValue);}); + $(li).find(".bookmarkEditBtn"). + click(function (event) {_launchEditBookmark(event.target, bmtitle, bmfullurl, idValue);}); + $(li).find(".bookmarkDeleteBtn"). + click(function (event) {_deleteBookmark(event.target, idValue);}); + + $(li).find(".bookmarkItem"). + mouseover(function (event) {_changeDogearBackground(event.target, idValue, 'url(/bookmarkview/dogear_pressed.png)', 'url(/bookmarkview/list_itembg_pressed.png)');}); + $(li).find(".bookmarkItem"). + mouseout(function (event) {_changeDogearBackground(event.target, idValue, 'url(/bookmarkview/dogear.png)', 'url(/bookmarkview/list_itembg.png)'); __prevOpenedBookmarkControl = event.target.parentNode.parentNode;}); + + return li; +} + +function _createBookmarkView() +{ + try + { + __currentLongPress = undefined; + //Get bookmarks data from database + window.bookmarksController.findAllBookmarks(); + var ul=document.getElementById('bookmarkListTree'); + while (window.bookmarksController.hasMoreBookmarks()) + { + var bm = window.bookmarksController.nextBookmark(); + var bmurl = bm.url; + var bmtitle = bm.title; + var id = bm.id; + + //create element and add it to bookmark view + var li = _createBookmarkElement(bmtitle,bmurl,id); + $(li).addClass('no-sort'); + ul.appendChild(li); + ul.childNodes[0].focus(); + if (!window.views.WebView.bedrockTiledBackingStoreEnabled()) + new LongPress(li.id, _longPress, _longPressStarted, 250); + else + new LongPress(li.id, _longPress, _longPressStarted, 550); + + __bookmarkCount++; + } + } catch(E) { + _displayError("Bookmarks unavailable"); // Localize! + app.debug("bookmarkView.js:_createBookmarkView: " + E); + } + + _dragInit(); +} + +function launchBookmarkView() +{ + __closed = true; + try{ + window.chrome.aspectChanged.connect(_updateBookmarkViewGoemetry); + window.bookmarksController.bookmarkAdded.connect(_addNewBookmark); + window.bookmarksController.bookmarkModified.connect(_editBookmark); + + // Get Bookmarks from the database + _createBookmarkView(); + + // Watch for the start of scrolling in the view so we can cancel the + // long presses to prevent them from interfere with scrolling. Otherwise + // the long press callback will fire and trigger sortable mode. + views.WebView.startingPanGesture.connect(_handlePanStarted); + + }catch(e){ alert(e); } +} \ No newline at end of file