// ==UserScript==
// @id iitc-plugin-bookmarks@ZasoGD
// @name IITC plugin: Bookmarks for maps and portals
// @category Controls
// @version 0.2.4.@@DATETIMEVERSION@@
// @namespace https://github.com/jonatkins/ingress-intel-total-conversion
// @updateURL @@UPDATEURL@@
// @downloadURL @@DOWNLOADURL@@
// @description [@@BUILDNAME@@-@@BUILDDATE@@] Save your favorite Maps and Portals and move the intelmap with a click. Now sync.
// @include https://www.ingress.com/intel*
// @include http://www.ingress.com/intel*
// @match https://www.ingress.com/intel*
// @match http://www.ingress.com/intel*
// @grant none
// ==/UserScript==
@@PLUGINSTART@@
// PLUGIN START ////////////////////////////////////////////////////////
/***********************************************************************
USEFUL FUNCTIONS:
+ window.plugin.bookmarks.refreshBkmrks(): reloads the bookmarks into box;
HOOKS:
+ pluginBkmrksEdit: fired when a bookmarks/folder is removed, added or sorted, also when a folder is opened/closed;
+ pluginBkmrksOpenOpt: fired when the "Bookmarks Options" panel is opened (you can add new options);
CHANGELOG:
v 0.2.1-0.2.2:
+ auto-drawer minor bug fix;
+ auto-drawer improved UI;
+ auto-drawer improved UI on mobile;
+ fixed hidden box problem (I hope): sometimes the box and the ribbon hidden;
v 0.2.0:
+ code rewritten from scratch:
++ more optimization;
++ less animated effects;
+ Sync;
+ Hooks (for developer);
+ Option panel:
++ manual import/export/reset of the data;
++ sharing of the data (only IITCm);
++ storage/reset the box position (only desktop);
+ Auto-drawer feature: select two o three portals boomark to auto-draw a link or field (draw-tools required);
+ IITCm: you can open/close the folders;
+ IITCm: bookmarks/folders not sortable (the 'sortable' jquery function not work);
***********************************************************************/
// use own namespace for plugin
window.plugin.bookmarks = function() {};
window.plugin.bookmarks.SYNC_DELAY = 5000;
window.plugin.bookmarks.KEY_OTHER_BKMRK = 'idOthers';
window.plugin.bookmarks.KEY_STORAGE = 'plugin-bookmarks';
window.plugin.bookmarks.KEY_STATUS_BOX = 'plugin-bookmarks-box';
window.plugin.bookmarks.KEY = {key: window.plugin.bookmarks.KEY_STORAGE, field: 'bkmrksObj'};
window.plugin.bookmarks.UPDATE_QUEUE = {key: 'plugin-bookmarks-queue', field: 'updateQueue'};
window.plugin.bookmarks.UPDATING_QUEUE = {key: 'plugin-bookmarks-updating-queue', field: 'updatingQueue'};
window.plugin.bookmarks.bkmrksObj = {};
window.plugin.bookmarks.statusBox = {};
window.plugin.bookmarks.updateQueue = {};
window.plugin.bookmarks.updatingQueue = {};
window.plugin.bookmarks.enableSync = false;
window.plugin.bookmarks.isSmart = undefined;
window.plugin.bookmarks.isAndroid = function() { if(typeof android !== 'undefined' && android) { return true; } return false; }
/*********************************************************************************************************************/
// Generate an ID for the bookmark (date time + random number)
window.plugin.bookmarks.generateID = function() {
var d = new Date();
var ID = d.getTime()+(Math.floor(Math.random()*99)+1);
var ID = 'id'+ID.toString();
return ID;
}
// Format the string
window.plugin.bookmarks.escapeHtml = function(text) {
return text
.replace(/&/g, "&")
.replace(//g, ">")
.replace(/"/g, """)
.replace(/'/g, "'")
.replace(/\//g, '/')
.replace(/\\/g, '\');
}
// Update the localStorage
window.plugin.bookmarks.saveStorage = function() {
localStorage[plugin.bookmarks.KEY_STORAGE] = JSON.stringify(window.plugin.bookmarks.bkmrksObj);
}
// Load the localStorage
window.plugin.bookmarks.loadStorage = function() {
window.plugin.bookmarks.bkmrksObj = JSON.parse(localStorage[plugin.bookmarks.KEY_STORAGE]);
}
window.plugin.bookmarks.saveStorageBox = function() {
localStorage[plugin.bookmarks.KEY_STATUS_BOX] = JSON.stringify(window.plugin.bookmarks.statusBox);
}
window.plugin.bookmarks.loadStorageBox = function() {
window.plugin.bookmarks.statusBox = JSON.parse(localStorage[plugin.bookmarks.KEY_STATUS_BOX]);
}
window.plugin.bookmarks.upgradeToNewStorage = function() {
if(localStorage['plugin-bookmarks-portals-data'] && localStorage['plugin-bookmarks-maps-data']) {
var oldStor_1 = JSON.parse(localStorage['plugin-bookmarks-maps-data']);
var oldStor_2 = JSON.parse(localStorage['plugin-bookmarks-portals-data']);
window.plugin.bookmarks.bkmrksObj.maps = oldStor_1.bkmrk_maps;
window.plugin.bookmarks.bkmrksObj.portals = oldStor_2.bkmrk_portals;
window.plugin.bookmarks.saveStorage();
localStorage.removeItem('plugin-bookmarks-maps-data');
localStorage.removeItem('plugin-bookmarks-portals-data');
localStorage.removeItem('plugin-bookmarks-status-box');
}
}
window.plugin.bookmarks.createStorage = function() {
if(!localStorage[window.plugin.bookmarks.KEY_STORAGE]) {
window.plugin.bookmarks.bkmrksObj.maps = {idOthers:{label:"Others",state:1,bkmrk:{}}};
window.plugin.bookmarks.bkmrksObj.portals = {idOthers:{label:"Others",state:1,bkmrk:{}}};
window.plugin.bookmarks.saveStorage();
}
if(!localStorage[window.plugin.bookmarks.KEY_STATUS_BOX]) {
window.plugin.bookmarks.statusBox.show = 1;
window.plugin.bookmarks.statusBox.page = 0;
window.plugin.bookmarks.statusBox.pos = {x:100,y:100};
window.plugin.bookmarks.saveStorageBox();
}
}
window.plugin.bookmarks.refreshBkmrks = function() {
$('#bkmrk_maps > ul, #bkmrk_portals > ul').remove();
window.plugin.bookmarks.loadStorage();
window.plugin.bookmarks.loadList('maps');
window.plugin.bookmarks.loadList('portals');
window.plugin.bookmarks.updateStarPortal();
window.plugin.bookmarks.jquerySortableScript();
}
/***************************************************************************************************************************************************************/
// Show/hide the bookmarks box
window.plugin.bookmarks.switchStatusBkmrksBox = function(status) {
var newStatus = status;
if(newStatus === 'switch') {
if(window.plugin.bookmarks.statusBox.show === 1) {
newStatus = 0;
} else {
newStatus = 1;
}
}
if(newStatus === 1) {
$('#bookmarksBox').show();
$('#bkmrksTrigger').hide();
} else {
$('#bookmarksBox').hide();
$('#bkmrksTrigger').show();
}
if(window.plugin.bookmarks.isSmart) {
var button = $('#bkmrksTrigger');
button.toggleClass('open');
if(button.hasClass('open')) { button.text('[-] Bookmarks'); }
else{ button.text('[+] Bookmarks'); }
}
window.plugin.bookmarks.statusBox['show'] = newStatus;
window.plugin.bookmarks.saveStorageBox();
}
// Switch list (maps/portals)
window.plugin.bookmarks.switchPageBkmrksBox = function(elem, page) {
window.plugin.bookmarks.statusBox.page = page;
window.plugin.bookmarks.saveStorageBox();
$('h5').removeClass('current');
$(elem).addClass('current');
var sectList = '#'+$(elem).attr('class').replace(' current', '');
$('#bookmarksBox .bookmarkList').removeClass('current');
$(sectList).addClass('current');
}
// Switch the status folder to open/close (in the localStorage)
window.plugin.bookmarks.openFolder = function(elem) {
$(elem).parent().parent('li').toggleClass('open');
var typeList = $(elem).parent().parent().parent().parent('div').attr('id').replace('bkmrk_', '');
var ID = $(elem).parent().parent('li').attr('id');
var newFlag;
var flag = window.plugin.bookmarks.bkmrksObj[typeList][ID]['state'];
if(flag) { newFlag = 0; }
else if(!flag) { newFlag = 1; }
window.plugin.bookmarks.bkmrksObj[typeList][ID]['state'] = newFlag;
window.plugin.bookmarks.saveStorage();
window.runHooks('pluginBkmrksEdit');
}
// Load the HTML bookmarks
window.plugin.bookmarks.loadList = function(typeList) {
var element = '';
var elementTemp = '';
var elementExc = '';
var returnToMap = '';
if(window.plugin.bookmarks.isSmart) {
returnToMap = 'window.show(\'map\');';
}
// For each folder
var list = window.plugin.bookmarks.bkmrksObj[typeList];
for(var idFolders in list) {
var folders = list[idFolders];
var active = '';
// Create a label and a anchor for the sortable
var folderDelete = 'X';
var folderName = ''+folders['label']+'';
var folderLabel = folderDelete+folderName;
if(folders['state']) { active = ' open'; }
if(idFolders === window.plugin.bookmarks.KEY_OTHER_BKMRK) {
folderLabel = '';
active= ' othersBookmarks open';
}
// Create a folder
elementTemp = '
'+folderLabel+'';
// For each bookmark
var fold = folders['bkmrk'];
for(var idBkmrk in fold) {
var btn_link;
var btn_remove = 'X';
var bkmrk = fold[idBkmrk];
var label = bkmrk['label'];
var latlng = bkmrk['latlng'];
// If it's a map
if(typeList === 'maps') {
if(bkmrk['label']=='') { label = bkmrk['latlng']+' ['+bkmrk['z']+']'; }
btn_link = ''+label+'';
}
// If it's a portal
else if(typeList === 'portals') {
var guid = bkmrk['guid'];
var btn_link = ''+label+'';
}
elementTemp += '- '+btn_remove+btn_link+'
';
}
elementTemp += '
';
//Add folder 'Others' in last position
if(idFolders != window.plugin.bookmarks.KEY_OTHER_BKMRK) { element += elementTemp; }
else{ elementExc = elementTemp; }
}
element += elementExc;
element = '';
// Append all folders and bookmarks
$('#bkmrk_'+typeList).append(element);
}
/***************************************************************************************************************************************************************/
window.plugin.bookmarks.findByGuid = function(guid) {
var list = window.plugin.bookmarks.bkmrksObj['portals'];
for(var idFolders in list) {
for(var idBkmrk in list[idFolders]['bkmrk']) {
var portalGuid = list[idFolders]['bkmrk'][idBkmrk]['guid'];
if(guid === portalGuid) {
return {"folder":idFolders,"id":idBkmrk};
}
}
}
return;
}
// Append a 'star' flag in sidebar.
window.plugin.bookmarks.addStarToSidebar = function() {
if(typeof(Storage) === "undefined") {
$('#portaldetails > .imgpreview').after(plugin.bookmarks.htmlDisabledMessage);
return;
}
$('.bkmrksStar').remove();
// Prepend a star to mobile status-bar
if(window.plugin.bookmarks.isSmart) {
$('#updatestatus').prepend(plugin.bookmarks.htmlStar);
$('#updatestatus .bkmrksStar').attr('title', '');
}
$('#portaldetails > h3.title').before(plugin.bookmarks.htmlStar);
window.plugin.bookmarks.updateStarPortal();
}
// Update the status of the star (when a portal is selected from the map/bookmarks-list)
window.plugin.bookmarks.updateStarPortal = function() {
var guid = window.selectedPortal;
$('.bkmrksStar').removeClass('favorite');
$('.bkmrk a.bookmarksLink.selected').removeClass('selected');
// If current portal is into bookmarks: select bookmark portal from portals list and select the star
if(localStorage[window.plugin.bookmarks.KEY_STORAGE].search(guid) != -1) {
var bkmrkData = window.plugin.bookmarks.findByGuid(guid);
if(bkmrkData) {
$('.bkmrk#'+bkmrkData['id']+' a.bookmarksLink').addClass('selected');
$('.bkmrksStar').addClass('favorite');
}
}
}
// Switch the status of the star
window.plugin.bookmarks.switchStarPortal = function() {
var guid = window.selectedPortal;
// If portal is saved in bookmarks: Remove this bookmark
if($('.bkmrksStar').hasClass('favorite')) {
var bkmrkData = window.plugin.bookmarks.findByGuid(guid);
var list = window.plugin.bookmarks.bkmrksObj['portals'];
delete list[bkmrkData['folder']]['bkmrk'][bkmrkData['id']];
$('.bkmrk#'+bkmrkData['id']+'').remove();
window.plugin.bookmarks.saveStorage();
window.plugin.bookmarks.updateStarPortal();
window.runHooks('pluginBkmrksEdit');
}
// If portal isn't saved in bookmarks: Add this bookmark
else{
// Get portal name and coordinates
var d = window.portals[guid].options.details;
var label = d.portalV2.descriptiveText.TITLE;
var lat = (d.locationE6.latE6)/1E6;
var lng = (d.locationE6.lngE6)/1E6;
var latlng = lat+','+lng;
var ID = window.plugin.bookmarks.generateID();
// Add bookmark in the localStorage
window.plugin.bookmarks.bkmrksObj['portals'][window.plugin.bookmarks.KEY_OTHER_BKMRK]['bkmrk'][ID] = {"guid":guid,"latlng":latlng,"label":label};
window.plugin.bookmarks.saveStorage();
window.runHooks('pluginBkmrksEdit');
window.plugin.bookmarks.refreshBkmrks();
}
}
// Add BOOKMARK/FOLDER
window.plugin.bookmarks.addElement = function(elem, type) {
var ID = window.plugin.bookmarks.generateID();
var typeList = $(elem).parent().parent('div').attr('id');
// Get the label | Convert some characters | Set the input (empty)
var input = '#'+typeList+' .addForm input';
var label = $(input).val();
label = window.plugin.bookmarks.escapeHtml(label);
$(input).val('');
// Add a map
if(type === 'map') {
// Get the coordinates and zoom
var c = map.getCenter();
var lat = Math.round(c.lat*1E6)/1E6;
var lng = Math.round(c.lng*1E6)/1E6;
var latlng = lat+','+lng;
var zoom = parseInt(map.getZoom());
// Add bookmark in the localStorage
window.plugin.bookmarks.bkmrksObj['maps'][plugin.bookmarks.KEY_OTHER_BKMRK]['bkmrk'][ID] = {"label":label,"latlng":latlng,"z":zoom};
}
else{
if(label === '') { label = 'Folder'; }
var short_type = typeList.replace('bkmrk_', '');
// Add new folder in the localStorage
window.plugin.bookmarks.bkmrksObj[short_type][ID] = {"label":label,"state":1,"bkmrk":{}};
}
window.plugin.bookmarks.saveStorage();
window.runHooks('pluginBkmrksEdit');
window.plugin.bookmarks.refreshBkmrks();
}
// Remove BOOKMARK/FOLDER
window.plugin.bookmarks.removeElement = function(elem, type) {
if(type === 'maps' || type === 'portals') {
var typeList = $(elem).parent().parent().parent().parent().parent('div').attr('id');
var ID = $(elem).parent('li').attr('id');
var IDfold = $(elem).parent().parent().parent('li').attr('id');
delete window.plugin.bookmarks.bkmrksObj[typeList.replace('bkmrk_', '')][IDfold]['bkmrk'][ID];
$(elem).parent('li').remove();
if(type === 'portals') {
window.plugin.bookmarks.updateStarPortal();
}
}
else if(type === 'folder') {
var typeList = $(elem).parent().parent().parent().parent('div').attr('id');
var ID = $(elem).parent().parent('li').attr('id');
delete plugin.bookmarks.bkmrksObj[typeList.replace('bkmrk_', '')][ID];
$(elem).parent().parent('li').remove();
}
window.plugin.bookmarks.saveStorage();
window.runHooks('pluginBkmrksEdit');
}
/***************************************************************************************************************************************************************/
// Saved the new sort of the folders (in the localStorage)
window.plugin.bookmarks.sortFolder = function(typeList) {
var keyType = typeList.replace('bkmrk_', '');
var newArr = {};
$('#'+typeList+' li.bookmarkFolder').each(function() {
var idFold = $(this).attr('id');
newArr[idFold] = window.plugin.bookmarks.bkmrksObj[keyType][idFold];
});
window.plugin.bookmarks.bkmrksObj[keyType] = newArr;
window.plugin.bookmarks.saveStorage();
window.runHooks('pluginBkmrksEdit');
}
// Saved the new sort of the bookmarks (in the localStorage)
window.plugin.bookmarks.sortBookmark = function(typeList) {
var keyType = typeList.replace('bkmrk_', '');
var list = window.plugin.bookmarks.bkmrksObj[keyType];
var newArr = {};
$('#'+typeList+' li.bookmarkFolder').each(function() {
var idFold = $(this).attr('id');
newArr[idFold] = window.plugin.bookmarks.bkmrksObj[keyType][idFold];
newArr[idFold].bkmrk = {};
});
$('#'+typeList+' li.bkmrk').each(function() {
window.plugin.bookmarks.loadStorage();
var idFold = $(this).parent().parent('li').attr('id');
var id = $(this).attr('id');
var list = window.plugin.bookmarks.bkmrksObj[keyType];
for(var idFoldersOrigin in list) {
for(var idBkmrk in list[idFoldersOrigin]['bkmrk']) {
if(idBkmrk == id) {
newArr[idFold].bkmrk[id] = window.plugin.bookmarks.bkmrksObj[keyType][idFoldersOrigin].bkmrk[id];
}
}
}
});
window.plugin.bookmarks.bkmrksObj[keyType] = newArr;
window.plugin.bookmarks.saveStorage();
window.runHooks('pluginBkmrksEdit');
}
window.plugin.bookmarks.jquerySortableScript = function() {
$(".bookmarkList > ul").sortable({
items:"li.bookmarkFolder:not(.othersBookmarks)",
handle:".bookmarksAnchor",
placeholder:"sortable-placeholder",
forcePlaceholderSize:true,
update:function(event, ui) {
var typeList = $('#'+ui.item.context.id).parent().parent('.bookmarkList').attr('id');
window.plugin.bookmarks.sortFolder(typeList);
}
});
$(".bookmarkList ul li ul").sortable({
items:"li.bkmrk",
connectWith:".bookmarkList ul ul",
handle:".bookmarksLink",
placeholder:"sortable-placeholder",
forcePlaceholderSize:true,
update:function(event, ui) {
var typeList = $('#'+ui.item.context.id).parent().parent().parent().parent('.bookmarkList').attr('id');
window.plugin.bookmarks.sortBookmark(typeList);
}
});
}
/***************************************************************************************************************************************************************/
/** OPTIONS ****************************************************************************************************************************************************/
/***************************************************************************************************************************************************************/
// Manual import, export and reset data
window.plugin.bookmarks.manualOpt = function() {
dialog({
html: plugin.bookmarks.htmlSetbox,
dialogClass: 'ui-dialog-bkmrksSet',
title: 'Bookmarks Options'
});
if(window.plugin.bookmarks.isAndroid()) {
$('a:contains(\'Save box\'), a:contains(\'Reset box\')').addClass('disabled');
} else {
$('a:contains(\'Share all\')').addClass('disabled');
}
window.runHooks('pluginBkmrksOpenOpt');
}
window.plugin.bookmarks.optAlert = function(message) {
$('.ui-dialog-bkmrksSet .ui-dialog-buttonset').prepend(''+message+'
');
$('.bkrmks-alert').delay(2500).fadeOut();
}
window.plugin.bookmarks.optCopy = function() {
if(typeof android !== 'undefined' && android && android.intentPosLink) {
return androidCopy(localStorage[window.plugin.bookmarks.KEY_STORAGE]);
} else {
dialog({
html: 'Select all and press CTRL+C to copy it.
',
dialogClass: 'ui-dialog-bkmrksSet-copy',
title: 'Bookmarks Export'
});
}
}
window.plugin.bookmarks.optPaste = function() {
var promptAction = prompt('Press CTRL+V to paste it.', '');
if(promptAction !== null && promptAction !== '') {
localStorage[window.plugin.bookmarks.KEY_STORAGE] = promptAction;
window.plugin.bookmarks.refreshBkmrks();
window.plugin.bookmarks.optAlert('Succesful. ');
window.runHooks('pluginBkmrksEdit');
}
}
window.plugin.bookmarks.optReset = function() {
var promptAction = prompt('All bookmarks will be deleted. Are you sure? [Y/N]', '');
if(promptAction !== null && (promptAction === 'Y' || promptAction === 'y')) {
delete localStorage[window.plugin.bookmarks.KEY_STORAGE];
window.plugin.bookmarks.createStorage();
window.plugin.bookmarks.loadStorage();
window.plugin.bookmarks.refreshBkmrks();
window.runHooks('pluginBkmrksEdit');
window.plugin.bookmarks.optAlert('Succesful. ');
}
}
window.plugin.bookmarks.optShare = function() {
if(window.plugin.bookmarks.isAndroid() && android.shareString) {
android.shareString(localStorage[window.plugin.bookmarks.KEY_STORAGE]);
} else {
window.plugin.bookmarks.optAlert('Only IITC mobile. ');
}
}
window.plugin.bookmarks.optBox = function(command) {
if(!window.plugin.bookmarks.isAndroid()) {
switch(command) {
case 'save':
var boxX = parseInt($('#bookmarksBox').css('top'));
var boxY = parseInt($('#bookmarksBox').css('left'));
window.plugin.bookmarks.statusBox.pos = {x:boxX, y:boxY};
window.plugin.bookmarks.saveStorageBox();
window.plugin.bookmarks.optAlert('Position acquired. ');
break;
case 'reset':
$('#bookmarksBox').css({'top':100, 'left':100});
window.plugin.bookmarks.optBox('save');
break;
}
} else {
window.plugin.bookmarks.optAlert('Only IITC desktop. ');
}
}
/***************************************************************************************************************************************************************/
/** AUTO DRAWER ************************************************************************************************************************************************/
/***************************************************************************************************************************************************************/
window.plugin.bookmarks.dialogDrawer = function() {
dialog({
html:window.plugin.bookmarks.dialogLoadList,
dialogClass:'ui-dialog-autodrawer',
title:'Bookmarks - Auto Draw',
buttons:{
'DRAW': function() {
window.plugin.bookmarks.draw();
},
'REFRESH LIST': function() {
$(this).dialog('close');
window.plugin.bookmarks.dialogDrawer();
}
}
});
}
window.plugin.bookmarks.draw = function() {
var latlngs = [];
var uuu = $('#bkmrksAutoDrawer a.bkmrk.selected').each(function(i) {
var tt = $(this).data('latlng');
latlngs[i] = tt;
});
if(latlngs.length >= 2 && latlngs.length <= 3) {
var newItem;
var options = {color:"#f06eaa",weight:4,opacity:.5}
if(latlngs.length == 3) { newItem = L.geodesicPolygon(latlngs, options); }
else if(latlngs.length == 2) { newItem = L.geodesicPolyline(latlngs, options); }
$('#bkmrksAutoDrawer a.bkmrk.selected').removeClass('selected');
newItem.addTo(window.plugin.drawTools.drawnItems);
// Save in localStorage
window.plugin.drawTools.save();
if(window.plugin.bookmarks.isSmart) {
window.show('map');
}
map.fitBounds(newItem.getBounds());
}
else{
$('#bkmrksAutoDrawer p').toggle().delay('2500').fadeOut('500');
}
}
window.plugin.bookmarks.dialogLoadList = function() {
var r = 'The"Draw Tools" plugin is required.';
if(!window.plugin.bookmarks || !window.plugin.drawTools) {
$('.ui-dialog-autodrawer .ui-dialog-buttonset .ui-button:not(:first)').hide();
}
else{
var portalsList = JSON.parse(localStorage['plugin-bookmarks']);
var element = '';
var elementTemp = '';
var elemGenericFolder = '';
// For each folder
var list = portalsList.portals;
for(var idFolders in list) {
var folders = list[idFolders];
// Create a label and a anchor for the sortable
var folderLabel = ''+folders['label']+'';
// Create a folder
elementTemp = ''+folderLabel+'
';
// For each bookmark
var fold = folders['bkmrk'];
for(var idBkmrk in fold) {
var bkmrk = fold[idBkmrk];
var label = bkmrk['label'];
var latlng = bkmrk['latlng'];
// Create the bookmark
elementTemp += '
'+label+'';
}
elementTemp += '
';
if(idFolders !== window.plugin.bookmarks.KEY_OTHER_BKMRK) {
element += elementTemp;
} else {
elemGenericFolder += elementTemp;
}
}
element += elemGenericFolder;
// Append all folders and bookmarks
r = 'You must select 2 or 3 portals.
'+element+'
';
}
return r;
}
/***************************************************************************************************************************************************************/
/** SYNC *******************************************************************************************************************************************************/
/***************************************************************************************************************************************************************/
// Delay the syncing to group a few updates in a single request
window.plugin.bookmarks.delaySync = function() {
if(!window.plugin.bookmarks.enableSync) return;
clearTimeout(plugin.bookmarks.delaySync.timer);
window.plugin.bookmarks.delaySync.timer = setTimeout(function() {
window.plugin.bookmarks.delaySync.timer = null;
window.plugin.bookmarks.syncNow();
}, window.plugin.bookmarks.SYNC_DELAY);
}
// Store the upadteQueue in updatingQueue and upload
window.plugin.bookmarks.syncNow = function() {
if(!window.plugin.bookmarks.enableSync) return;
$.extend(window.plugin.bookmarks.updatingQueue, window.plugin.bookmarks.updateQueue);
window.plugin.bookmarks.updateQueue = {};
window.plugin.bookmarks.storeLocal(window.plugin.bookmarks.UPDATING_QUEUE);
window.plugin.bookmarks.storeLocal(window.plugin.bookmarks.UPDATE_QUEUE);
window.plugin.sync.updateMap('bookmarks', window.plugin.bookmarks.KEY.field, Object.keys(window.plugin.bookmarks.updatingQueue));
}
// Call after IITC and all plugin loaded
window.plugin.bookmarks.registerFieldForSyncing = function() {
if(!window.plugin.sync) return;
window.plugin.sync.registerMapForSync('bookmarks', window.plugin.bookmarks.KEY.field, window.plugin.bookmarks.syncCallback, window.plugin.bookmarks.syncInitialed);
}
// Call after local or remote change uploaded
window.plugin.bookmarks.syncCallback = function(pluginName, fieldName, e, fullUpdated) {
if(fieldName === window.plugin.bookmarks.KEY.field) {
window.plugin.bookmarks.storeLocal(window.plugin.bookmarks.KEY);
// All data is replaced if other client update the data duing this client offline,
if(fullUpdated) {
window.plugin.bookmarks.refreshBkmrks();
return;
}
if(!e) return;
if(e.isLocal) {
// Update pushed successfully, remove it from updatingQueue
delete window.plugin.bookmarks.updatingQueue[e.property];
} else {
// Remote update
delete window.plugin.bookmarks.updateQueue[e.property];
window.plugin.bookmarks.storeLocal(window.plugin.bookmarks.UPDATE_QUEUE);
window.plugin.bookmarks.refreshBkmrks();
}
}
}
// syncing of the field is initialed, upload all queued update
window.plugin.bookmarks.syncInitialed = function(pluginName, fieldName) {
if(fieldName === window.plugin.bookmarks.KEY.field) {
window.plugin.bookmarks.enableSync = true;
if(Object.keys(window.plugin.bookmarks.updateQueue).length > 0) {
window.plugin.bookmarks.delaySync();
}
}
}
window.plugin.bookmarks.storeLocal = function(mapping) {
if(typeof(window.plugin.bookmarks[mapping.field]) !== 'undefined' && window.plugin.bookmarks[mapping.field] !== null) {
localStorage[mapping.key] = JSON.stringify(window.plugin.bookmarks[mapping.field]);
} else {
localStorage.removeItem(mapping.key);
}
}
window.plugin.bookmarks.loadLocal = function(mapping) {
var objectJSON = localStorage[mapping.key];
if(!objectJSON) return;
window.plugin.bookmarks[mapping.field] = mapping.convertFunc ? mapping.convertFunc(JSON.parse(objectJSON)) : JSON.parse(objectJSON);
}
window.plugin.bookmarks.syncBkmrks = function() {
window.plugin.bookmarks.loadLocal(window.plugin.bookmarks.KEY);
window.plugin.bookmarks.updateQueue = window.plugin.bookmarks.bkmrksObj;
window.plugin.bookmarks.storeLocal(window.plugin.bookmarks.UPDATE_QUEUE);
window.plugin.bookmarks.delaySync();
}
/***************************************************************************************************************************************************************/
window.plugin.bookmarks.setupCSS = function() {
$('