diff --git a/images/missions.svg b/images/missions.svg
new file mode 100644
index 00000000..f9cf8429
--- /dev/null
+++ b/images/missions.svg
@@ -0,0 +1,16 @@
+
diff --git a/mobile/res/drawable-hdpi/ic_missions.png b/mobile/res/drawable-hdpi/ic_missions.png
new file mode 100644
index 00000000..4ce99216
Binary files /dev/null and b/mobile/res/drawable-hdpi/ic_missions.png differ
diff --git a/mobile/res/drawable-mdpi/ic_missions.png b/mobile/res/drawable-mdpi/ic_missions.png
new file mode 100644
index 00000000..0cf7a468
Binary files /dev/null and b/mobile/res/drawable-mdpi/ic_missions.png differ
diff --git a/mobile/res/drawable-xhdpi/ic_missions.png b/mobile/res/drawable-xhdpi/ic_missions.png
new file mode 100644
index 00000000..b314730e
Binary files /dev/null and b/mobile/res/drawable-xhdpi/ic_missions.png differ
diff --git a/mobile/res/drawable-xxhdpi/ic_missions.png b/mobile/res/drawable-xxhdpi/ic_missions.png
new file mode 100644
index 00000000..e45cb367
Binary files /dev/null and b/mobile/res/drawable-xxhdpi/ic_missions.png differ
diff --git a/plugins/missions.css b/plugins/missions.css
index 8df699b3..6ca45056 100644
--- a/plugins/missions.css
+++ b/plugins/missions.css
@@ -1,3 +1,14 @@
+.plugin-mission-pane {
+ background: transparent;
+ border: 0 none !important;
+ height: 100% !important;
+ width: 100% !important;
+ left: 0 !important;
+ top: 0 !important;
+ position: absolute;
+ overflow: auto;
+}
+
.plugin-mission-summary {
padding: 5px;
border-top: black solid 1px;
diff --git a/plugins/missions.user.js b/plugins/missions.user.js
index 88cf0a17..78712ac9 100644
--- a/plugins/missions.user.js
+++ b/plugins/missions.user.js
@@ -138,23 +138,58 @@ window.plugin.missions = {
showMissionDialog: function(mission) {
var me = this;
var markers = this.highlightMissionPortals(mission);
- dialog({
- id: 'plugin-mission-details-' + mission.guid.replace(/\./g, '_') /* dots irritate the dialog framework */,
- title: mission.title,
- height: 'auto',
- html: this.renderMission(mission),
- width: '450px',
- closeCallback: function() {
- me.unhighlightMissionPortals(markers);
- },
- collapseCallback: this.collapseFix,
- expandCallback: this.collapseFix,
- }).dialog('option', 'buttons', {
- 'Zoom to mission': function() {
- me.zoomToMission(mission);
- },
- 'OK': function() { $(this).dialog('close'); },
- });
+ var content = this.renderMission(mission);
+ var id = mission.guid.replace(/\./g, '_'); // dots irritate the dialog framework and are not allowed in HTML IDs
+
+ if(useAndroidPanes()) {
+ if(this.tabHeaders[id]) {
+ this.tabHeaders[id].parentNode.querySelector('.ui-icon-close').click();
+ }
+
+ var li = this.tabBar.appendChild(document.createElement('li'));
+ var a = li.appendChild(document.createElement('a'));
+ a.textContent = mission.title;
+ a.href = '#mission_pane_'+id;
+ this.tabHeaders[id] = a;
+ var span = li.appendChild(document.createElement('span'));
+ span.className = 'ui-icon ui-icon-close';
+ span.textContent = 'Close mission';
+ span.addEventListener('click', function() {
+ li.parentNode.removeChild(li);
+ content.parentNode.removeChild(content);
+ delete this.tabHeaders[id];
+ $(this.tabs)
+ .tabs('refresh')
+ .find('.ui-tabs-nav')
+ .sortable('refresh');
+ }.bind(this), false);
+
+ this.tabs.appendChild(content);
+ content.id = 'mission_pane_'+id;
+ var tabs = $(this.tabs);
+ tabs.tabs('refresh');
+ tabs.find('.ui-tabs-nav').sortable('refresh');
+ tabs.tabs('option','active', -1);
+ show('plugin-missions');
+ } else {
+ dialog({
+ id: 'plugin-mission-details-' + id,
+ title: mission.title,
+ height: 'auto',
+ html: content,
+ width: '450px',
+ closeCallback: function() {
+ me.unhighlightMissionPortals(markers);
+ },
+ collapseCallback: this.collapseFix,
+ expandCallback: this.collapseFix,
+ }).dialog('option', 'buttons', {
+ 'Zoom to mission': function() {
+ me.zoomToMission(mission);
+ },
+ 'OK': function() { $(this).dialog('close'); },
+ });
+ }
},
showMissionListDialog: function(missions) {
@@ -272,7 +307,7 @@ window.plugin.missions = {
callback(mission);
}, function() {
- console.error('Error loading mission data: ' + guid + ", " + Array.prototype.slice.call(arguments));
+ console.error('Error loading mission data: ' + guid + ', ' + Array.prototype.slice.call(arguments));
if (errorcallback) {
errorcallback(error);
@@ -335,9 +370,9 @@ window.plugin.missions = {
if(len > 0) {
if(len > 1000)
- len = Math.round(len / 100) / 10 + "km";
+ len = Math.round(len / 100) / 10 + 'km';
else
- len = Math.round(len * 10) / 10 + "m";
+ len = Math.round(len * 10) / 10 + 'm';
var infoLength = container.appendChild(document.createElement('span'));
infoLength.className = 'plugin-mission-info length help';
@@ -466,11 +501,13 @@ window.plugin.missions = {
title.href = perma;
title.addEventListener('click', function(ev) {
+ show('map');
selectPortalByLatLng(lat, lng);
ev.preventDefault();
return false;
}, false);
title.addEventListener('dblclick', function(ev) {
+ show('map');
zoomToAndShowPortal(waypoint.portal.guid, [lat, lng]);
ev.preventDefault();
return false;
@@ -630,7 +667,7 @@ window.plugin.missions = {
this.cacheByPortalGuid = JSON.parse(localStorage['plugins-missions-portalcache'] || '{}');
this.cacheByMissionGuid = JSON.parse(localStorage['plugins-missions-missioncache'] || '{}');
- if("plugins-missions-settings" in localStorage) {
+ if('plugins-missions-settings' in localStorage) {
var settings = JSON.parse(localStorage['plugins-missions-settings'] || '{}');
localStorage['plugins-missions-checkedMissions'] = JSON.stringify(settings.checkedMissions);
localStorage['plugins-missions-checkedWaypoints'] = JSON.stringify(settings.checkedWaypoints);
@@ -834,6 +871,14 @@ window.plugin.missions = {
}
},
+ onPaneChanged: function(pane) {
+ if(pane == 'plugin-missions') {
+ document.body.appendChild(this.mobilePane);
+ } else if(this.mobilePane.parentNode) {
+ this.mobilePane.parentNode.removeChild(this.mobilePane);
+ }
+ },
+
setup: function() {
this.cacheByPortalGuid = {};
this.cacheByMissionGuid = {};
@@ -846,6 +891,31 @@ window.plugin.missions = {
$('