ginebra2/chrome/bedrockchrome/bookmarkview.superpage/bookmarkviewTenone.js
changeset 16 3c88a81ff781
equal deleted inserted replaced
14:6aeb7a756187 16:3c88a81ff781
       
     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, "&#39");
       
   260     dbgTitle = dbgTitle.replace(/"/g, "&#34");
       
   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(/&#39/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 }