From 61f61b0fdedc99c398a5b4776f7d464941ebd610 Mon Sep 17 00:00:00 2001 From: Mike Lambert Date: Wed, 31 Oct 2018 20:31:43 +0300 Subject: [PATCH 1/9] Migrating to build tools 28 and compatibility across 4.0-9.0 --- mobile/.gitignore | 41 +- mobile/.idea/compiler.xml | 22 +- mobile/.idea/misc.xml | 37 +- mobile/.idea/modules.xml | 6 +- mobile/.idea/vcs.xml | 3 +- mobile/HACKING.md | 2 +- mobile/assets/plugins/add-kml.user.js | 888 + mobile/assets/plugins/ap-list.user.js | 19 + mobile/assets/plugins/basemap-bing.user.js | 244 + mobile/assets/plugins/basemap-blank.user.js | 69 + .../assets/plugins/basemap-gmaps-gray.user.js | 79 + .../assets/plugins/basemap-kartverket.user.js | 72 + .../basemap-mapquest-open-aerial.user.js | 70 + .../assets/plugins/basemap-nokia-ovi.user.js | 80 + .../plugins/basemap-opencyclemap.user.js | 82 + .../plugins/basemap-openstreetmap.user.js | 80 + mobile/assets/plugins/basemap-stamen.user.js | 98 + mobile/assets/plugins/basemap-yandex.user.js | 268 + .../assets/plugins/bookmarks-by-zaso.user.js | 1343 ++ .../plugins/cache-details-on-map.user.js | 88 + mobile/assets/plugins/canvas-render.user.js | 80 + .../assets/plugins/compute-ap-stats.user.js | 203 + mobile/assets/plugins/cross_link.user.js | 346 + .../plugins/debug-raw-portal-data.user.js | 134 + .../plugins/default-intel-detail.user.js | 67 + .../assets/plugins/distance-to-portal.user.js | 218 + mobile/assets/plugins/done-links.user.js | 224 + mobile/assets/plugins/draw-resonators.user.js | 20 + mobile/assets/plugins/draw-tools.user.js | 5438 +++++ .../assets/plugins/favorite-portals.user.js | 19 + .../fix-googlemap-china-offset.user.js | 228 + mobile/assets/plugins/fly-links.user.js | 328 + .../plugins/guess-player-levels.user.js | 582 + .../iitc-ditigal-bumper-sticker.user.js | 33 + mobile/assets/plugins/ipas-link.user.js | 20 + mobile/assets/plugins/keys-on-map.user.js | 166 + mobile/assets/plugins/keys.user.js | 296 + mobile/assets/plugins/layer-count.user.js | 202 + .../assets/plugins/layer-farms-find.user.js | 380 + .../plugins/link-show-direction.user.js | 221 + mobile/assets/plugins/max-links.user.js | 370 + mobile/assets/plugins/minimap.user.js | 322 + mobile/assets/plugins/missions.user.js | 1126 + mobile/assets/plugins/pan-control.user.js | 134 + .../assets/plugins/periodic-refresh.user.js | 71 + mobile/assets/plugins/player-tracker.user.js | 604 + .../plugins/players-portal-pictures.user.js | 20 + .../assets/plugins/players-resonators.user.js | 19 + mobile/assets/plugins/portal-counts.user.js | 398 + mobile/assets/plugins/portal-defense.user.js | 18 + ...ighlighter-bad-deployment-distance.user.js | 19 + .../portal-highlighter-can-make-level.user.js | 19 + .../plugins/portal-highlighter-debug.user.js | 73 + .../portal-highlighter-forgotten.user.js | 82 + .../portal-highlighter-hide-team.user.js | 67 + .../portal-highlighter-high-level.user.js | 76 + .../portal-highlighter-imminent-decay.user.js | 19 + .../portal-highlighter-infrastructure.user.js | 90 + .../portal-highlighter-level-color.user.js | 68 + ...tal-highlighter-missing-resonators.user.js | 79 + .../portal-highlighter-mitigation.user.js | 19 + .../plugins/portal-highlighter-mods.user.js | 19 + .../portal-highlighter-my-8-portals.user.js | 19 + .../portal-highlighter-my-portals.user.js | 19 + .../portal-highlighter-needs-recharge.user.js | 85 + .../portal-highlighter-ornaments.user.js | 73 + ...-highlighter-outbound-link-counter.user.js | 19 + ...hlighter-portal-ap-energy-relative.user.js | 19 + ...tal-highlighter-portal-ap-relative.user.js | 19 + .../portal-highlighter-portal-ap.user.js | 19 + ...ortal-highlighter-portals-my-level.user.js | 83 + ...portal-highlighter-portals-upgrade.user.js | 19 + ...l-highlighter-with-lvl8-resonators.user.js | 19 + .../plugins/portal-level-numbers.user.js | 212 + mobile/assets/plugins/portal-names.user.js | 217 + mobile/assets/plugins/portals-list.user.js | 439 + mobile/assets/plugins/privacy-view.user.js | 147 + mobile/assets/plugins/regions.user.js | 653 + .../plugins/render-limit-increase.user.js | 21 + .../reso-energy-pct-in-portal-detail.user.js | 77 + ...onator-display-zoom-level-decrease.user.js | 20 + mobile/assets/plugins/scale-bar.user.js | 72 + .../assets/plugins/score-cycle-times.user.js | 115 + mobile/assets/plugins/scoreboard.user.js | 317 + mobile/assets/plugins/show-address.user.js | 20 + .../show-less-portals-zoomed-out.user.js | 67 + .../plugins/show-linked-portals.user.js | 196 + .../assets/plugins/show-more-portals.user.js | 20 + .../plugins/show-portal-weakness.user.js | 85 + mobile/assets/plugins/sync.user.js | 792 + mobile/assets/plugins/uniques.user.js | 626 + mobile/assets/plugins/update-check.user.js | 344 + mobile/assets/plugins/zaprange.user.js | 153 + mobile/assets/plugins/zoom-slider.user.js | 290 + mobile/assets/total-conversion-build.user.js | 17993 ++++++++++++++++ mobile/assets/user-location.user.js | 188 + mobile/build-test.xml | 204 - mobile/build.gradle | 20 + mobile/build.xml | 93 - mobile/gradle.properties | 18 + mobile/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 49896 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + mobile/gradlew | 164 + mobile/gradlew.bat | 90 + mobile/iitcm/.gitignore | 3 + mobile/iitcm/build.gradle | 70 + mobile/iitcm/proguard-rules.txt | 17 + .../{ => iitcm/src/main}/AndroidManifest.xml | 19 +- .../cradle/iitc_mobile/IITC_Application.java | 34 + .../iitc_mobile/IITC_DeviceAccountLogin.java | 196 + .../cradle/iitc_mobile/IITC_FileManager.java | 489 + .../cradle/iitc_mobile/IITC_JSInterface.java | 274 + .../iitc_mobile/IITC_JSInterfaceKitkat.java | 17 + .../iitc_mobile/IITC_JsDialogHelper.java | 154 + .../cradle/iitc_mobile/IITC_LogAdapter.java | 115 + .../cradle/iitc_mobile/IITC_MapSettings.java | 289 + .../com/cradle/iitc_mobile/IITC_Mobile.java | 1046 + .../iitc_mobile/IITC_NavigationHelper.java | 321 + .../iitc_mobile/IITC_NotificationHelper.java | 93 + .../cradle/iitc_mobile/IITC_TileManager.java | 56 + .../cradle/iitc_mobile/IITC_UserLocation.java | 269 + .../iitc_mobile/IITC_WebChromeClient.java | 79 + .../com/cradle/iitc_mobile/IITC_WebView.java | 288 + .../iitc_mobile/IITC_WebViewClient.java | 267 + .../main/java/com/cradle/iitc_mobile/Log.java | 341 + .../iitc_mobile/async/CheckHttpResponse.java | 100 + .../iitc_mobile/async/DownloadTile.java | 57 + .../iitc_mobile/async/UpdateScript.java | 123 + .../iitc_mobile/compass/AccMagCompass.java | 74 + .../cradle/iitc_mobile/compass/Compass.java | 53 + .../iitc_mobile/compass/CompassListener.java | 5 + .../iitc_mobile/compass/GyroCompass.java | 361 + .../iitc_mobile/fragments/MainSettings.java | 113 + .../fragments/PluginsFragment.java | 44 + .../prefs/AboutDialogPreference.java | 43 + .../prefs/ForceUpdatePreference.java | 44 + .../iitc_mobile/prefs/PluginPreference.java | 34 + .../prefs/PluginPreferenceActivity.java | 430 + .../iitc_mobile/prefs/PreferenceActivity.java | 41 + .../iitc_mobile/share/FragmentAdapter.java | 37 + .../iitc_mobile/share/IntentAdapter.java | 68 + .../iitc_mobile/share/IntentComparator.java | 196 + .../iitc_mobile/share/IntentGenerator.java | 204 + .../iitc_mobile/share/IntentListFragment.java | 66 + .../cradle/iitc_mobile/share/SaveToFile.java | 96 + .../iitc_mobile/share/SendToClipboard.java | 30 + .../iitc_mobile/share/ShareActivity.java | 235 + .../res/drawable-hdpi/ic_action_about.png | Bin 0 -> 646 bytes .../drawable-hdpi/ic_action_add_to_queue.png | Bin 0 -> 356 bytes .../res/drawable-hdpi/ic_action_cc_bcc.png | Bin 0 -> 707 bytes .../main/res/drawable-hdpi/ic_action_copy.png | Bin 0 -> 375 bytes .../drawable-hdpi/ic_action_data_usage.png | Bin 0 -> 633 bytes .../res/drawable-hdpi/ic_action_discard.png | Bin 0 -> 454 bytes .../res/drawable-hdpi/ic_action_error.png | Bin 0 -> 389 bytes .../res/drawable-hdpi/ic_action_error_red.png | Bin 0 -> 300 bytes .../drawable-hdpi/ic_action_full_screen.png | Bin 0 -> 587 bytes .../res/drawable-hdpi/ic_action_group.png | Bin 0 -> 769 bytes .../ic_action_location_follow.png | Bin 0 -> 646 bytes .../ic_action_location_found.png | Bin 0 -> 638 bytes .../main/res/drawable-hdpi/ic_action_map.png | Bin 0 -> 824 bytes .../main/res/drawable-hdpi/ic_action_new.png | Bin 0 -> 262 bytes .../res/drawable-hdpi/ic_action_new_event.png | Bin 0 -> 407 bytes .../res/drawable-hdpi/ic_action_paste.png | Bin 0 -> 462 bytes .../res/drawable-hdpi/ic_action_place.png | Bin 0 -> 555 bytes .../res/drawable-hdpi/ic_action_refresh.png | Bin 0 -> 677 bytes .../ic_action_return_from_full_screen.png | Bin 0 -> 663 bytes .../main/res/drawable-hdpi/ic_action_save.png | Bin 0 -> 394 bytes .../res/drawable-hdpi/ic_action_search.png | Bin 0 -> 639 bytes .../res/drawable-hdpi/ic_action_share.png | Bin 0 -> 561 bytes .../main/res/drawable-hdpi/ic_action_star.png | Bin 0 -> 3147 bytes .../drawable-hdpi/ic_action_view_as_list.png | Bin 0 -> 307 bytes .../ic_action_view_as_list_compact.png | Bin 0 -> 435 bytes .../res/drawable-hdpi/ic_action_warning.png | Bin 0 -> 515 bytes .../ic_action_warning_yellow.png | Bin 0 -> 471 bytes .../res/drawable-hdpi/ic_action_web_site.png | Bin 0 -> 1154 bytes .../src/main/res/drawable-hdpi/ic_drawer.png | Bin 0 -> 2826 bytes .../src/main/res/drawable-hdpi/ic_iitcm.png | Bin 0 -> 5498 bytes .../main/res/drawable-hdpi/ic_launcher.png | Bin 0 -> 9397 bytes .../iitcm/src/main/res/drawable-hdpi/iitc.png | Bin 0 -> 52987 bytes .../src/main/res/drawable-hdpi/iitc_blue.png | Bin 0 -> 4851 bytes .../src/main/res/drawable-ldpi/ic_iitcm.png | Bin 0 -> 2686 bytes .../iitcm/src/main/res/drawable-ldpi/iitc.png | Bin 0 -> 52987 bytes .../src/main/res/drawable-ldpi/iitc_blue.png | Bin 0 -> 4851 bytes .../res/drawable-mdpi/ic_action_about.png | Bin 0 -> 434 bytes .../drawable-mdpi/ic_action_add_to_queue.png | Bin 0 -> 303 bytes .../res/drawable-mdpi/ic_action_cc_bcc.png | Bin 0 -> 497 bytes .../main/res/drawable-mdpi/ic_action_copy.png | Bin 0 -> 288 bytes .../drawable-mdpi/ic_action_data_usage.png | Bin 0 -> 464 bytes .../res/drawable-mdpi/ic_action_discard.png | Bin 0 -> 333 bytes .../res/drawable-mdpi/ic_action_error.png | Bin 0 -> 357 bytes .../res/drawable-mdpi/ic_action_error_red.png | Bin 0 -> 259 bytes .../drawable-mdpi/ic_action_full_screen.png | Bin 0 -> 461 bytes .../res/drawable-mdpi/ic_action_group.png | Bin 0 -> 543 bytes .../ic_action_location_follow.png | Bin 0 -> 451 bytes .../ic_action_location_found.png | Bin 0 -> 460 bytes .../main/res/drawable-mdpi/ic_action_map.png | Bin 0 -> 613 bytes .../main/res/drawable-mdpi/ic_action_new.png | Bin 0 -> 185 bytes .../res/drawable-mdpi/ic_action_new_event.png | Bin 0 -> 369 bytes .../res/drawable-mdpi/ic_action_paste.png | Bin 0 -> 331 bytes .../res/drawable-mdpi/ic_action_place.png | Bin 0 -> 393 bytes .../res/drawable-mdpi/ic_action_refresh.png | Bin 0 -> 492 bytes .../ic_action_return_from_full_screen.png | Bin 0 -> 477 bytes .../main/res/drawable-mdpi/ic_action_save.png | Bin 0 -> 362 bytes .../res/drawable-mdpi/ic_action_search.png | Bin 0 -> 449 bytes .../res/drawable-mdpi/ic_action_share.png | Bin 0 -> 418 bytes .../main/res/drawable-mdpi/ic_action_star.png | Bin 0 -> 3048 bytes .../drawable-mdpi/ic_action_view_as_list.png | Bin 0 -> 246 bytes .../ic_action_view_as_list_compact.png | Bin 0 -> 334 bytes .../res/drawable-mdpi/ic_action_warning.png | Bin 0 -> 410 bytes .../ic_action_warning_yellow.png | Bin 0 -> 374 bytes .../res/drawable-mdpi/ic_action_web_site.png | Bin 0 -> 733 bytes .../src/main/res/drawable-mdpi/ic_drawer.png | Bin 0 -> 2816 bytes .../src/main/res/drawable-mdpi/ic_iitcm.png | Bin 0 -> 3427 bytes .../main/res/drawable-mdpi/ic_launcher.png | Bin 0 -> 5237 bytes .../iitcm/src/main/res/drawable-mdpi/iitc.png | Bin 0 -> 52987 bytes .../src/main/res/drawable-mdpi/iitc_blue.png | Bin 0 -> 4851 bytes .../res/drawable-xhdpi/ic_action_about.png | Bin 0 -> 787 bytes .../drawable-xhdpi/ic_action_add_to_queue.png | Bin 0 -> 416 bytes .../res/drawable-xhdpi/ic_action_cc_bcc.png | Bin 0 -> 925 bytes .../res/drawable-xhdpi/ic_action_copy.png | Bin 0 -> 350 bytes .../drawable-xhdpi/ic_action_data_usage.png | Bin 0 -> 848 bytes .../res/drawable-xhdpi/ic_action_discard.png | Bin 0 -> 552 bytes .../res/drawable-xhdpi/ic_action_error.png | Bin 0 -> 482 bytes .../drawable-xhdpi/ic_action_error_red.png | Bin 0 -> 385 bytes .../drawable-xhdpi/ic_action_full_screen.png | Bin 0 -> 774 bytes .../res/drawable-xhdpi/ic_action_group.png | Bin 0 -> 1067 bytes .../ic_action_location_follow.png | Bin 0 -> 820 bytes .../ic_action_location_found.png | Bin 0 -> 854 bytes .../main/res/drawable-xhdpi/ic_action_map.png | Bin 0 -> 1032 bytes .../main/res/drawable-xhdpi/ic_action_new.png | Bin 0 -> 250 bytes .../drawable-xhdpi/ic_action_new_event.png | Bin 0 -> 480 bytes .../res/drawable-xhdpi/ic_action_paste.png | Bin 0 -> 499 bytes .../res/drawable-xhdpi/ic_action_place.png | Bin 0 -> 712 bytes .../res/drawable-xhdpi/ic_action_refresh.png | Bin 0 -> 876 bytes .../ic_action_return_from_full_screen.png | Bin 0 -> 761 bytes .../res/drawable-xhdpi/ic_action_save.png | Bin 0 -> 441 bytes .../res/drawable-xhdpi/ic_action_search.png | Bin 0 -> 827 bytes .../res/drawable-xhdpi/ic_action_share.png | Bin 0 -> 666 bytes .../res/drawable-xhdpi/ic_action_star.png | Bin 0 -> 3220 bytes .../drawable-xhdpi/ic_action_view_as_list.png | Bin 0 -> 353 bytes .../ic_action_view_as_list_compact.png | Bin 0 -> 450 bytes .../res/drawable-xhdpi/ic_action_warning.png | Bin 0 -> 682 bytes .../ic_action_warning_yellow.png | Bin 0 -> 632 bytes .../res/drawable-xhdpi/ic_action_web_site.png | Bin 0 -> 1532 bytes .../src/main/res/drawable-xhdpi/ic_drawer.png | Bin 0 -> 1038 bytes .../src/main/res/drawable-xhdpi/ic_iitcm.png | Bin 0 -> 7713 bytes .../main/res/drawable-xhdpi/ic_launcher.png | Bin 0 -> 14383 bytes .../src/main/res/drawable-xhdpi/iitc.png | Bin 0 -> 52987 bytes .../src/main/res/drawable-xhdpi/iitc_blue.png | Bin 0 -> 4851 bytes .../res/drawable-xxhdpi/ic_action_about.png | Bin 0 -> 1231 bytes .../ic_action_add_to_queue.png | Bin 0 -> 493 bytes .../res/drawable-xxhdpi/ic_action_cc_bcc.png | Bin 0 -> 1384 bytes .../res/drawable-xxhdpi/ic_action_copy.png | Bin 0 -> 464 bytes .../drawable-xxhdpi/ic_action_data_usage.png | Bin 0 -> 1293 bytes .../res/drawable-xxhdpi/ic_action_discard.png | Bin 0 -> 781 bytes .../res/drawable-xxhdpi/ic_action_error.png | Bin 0 -> 544 bytes .../drawable-xxhdpi/ic_action_error_red.png | Bin 0 -> 432 bytes .../drawable-xxhdpi/ic_action_full_screen.png | Bin 0 -> 1009 bytes .../res/drawable-xxhdpi/ic_action_group.png | Bin 0 -> 1475 bytes .../ic_action_location_follow.png | Bin 0 -> 1236 bytes .../ic_action_location_found.png | Bin 0 -> 1148 bytes .../res/drawable-xxhdpi/ic_action_map.png | Bin 0 -> 1561 bytes .../res/drawable-xxhdpi/ic_action_new.png | Bin 0 -> 288 bytes .../drawable-xxhdpi/ic_action_new_event.png | Bin 0 -> 521 bytes .../res/drawable-xxhdpi/ic_action_paste.png | Bin 0 -> 685 bytes .../res/drawable-xxhdpi/ic_action_place.png | Bin 0 -> 958 bytes .../res/drawable-xxhdpi/ic_action_refresh.png | Bin 0 -> 1248 bytes .../ic_action_return_from_full_screen.png | Bin 0 -> 1098 bytes .../res/drawable-xxhdpi/ic_action_save.png | Bin 0 -> 495 bytes .../res/drawable-xxhdpi/ic_action_search.png | Bin 0 -> 1152 bytes .../res/drawable-xxhdpi/ic_action_share.png | Bin 0 -> 969 bytes .../res/drawable-xxhdpi/ic_action_star.png | Bin 0 -> 3390 bytes .../ic_action_view_as_list.png | Bin 0 -> 431 bytes .../ic_action_view_as_list_compact.png | Bin 0 -> 385 bytes .../res/drawable-xxhdpi/ic_action_warning.png | Bin 0 -> 888 bytes .../ic_action_warning_yellow.png | Bin 0 -> 840 bytes .../drawable-xxhdpi/ic_action_web_site.png | Bin 0 -> 2461 bytes .../main/res/drawable-xxhdpi/ic_drawer.png | Bin 0 -> 202 bytes .../src/main/res/drawable-xxhdpi/ic_iitcm.png | Bin 0 -> 8849 bytes .../main/res/drawable-xxhdpi/ic_launcher.png | Bin 0 -> 19388 bytes .../src/main/res/drawable-xxhdpi/iitc.png | Bin 0 -> 52987 bytes .../main/res/drawable-xxhdpi/iitc_blue.png | Bin 0 -> 4851 bytes .../src/main/res/layout/activity_main.xml | 110 + .../src/main/res/layout/activity_share.xml | 9 + .../src/main/res/layout/checked_textview.xml | 15 + .../res/layout/dialog_http_authentication.xml | 29 + .../src/main/res/layout/dialog_notice.xml | 28 + .../main/res/layout/dialog_progressbar.xml | 11 + .../iitcm/src/main/res/layout/js_prompt.xml | 43 + .../src/main/res/layout/list_item_narrow.xml | 12 + .../main/res/layout/list_item_selectable.xml | 13 + .../main/res/layout/map_options_header.xml | 50 + .../iitcm/src/main/res/layout/pref_main.xml | 16 + .../res/layout/preference_header_item.xml | 39 + .../src/main/res/layout/toolbar_layout.xml | 10 + .../src/main/res/layout/view_log_msg.xml | 53 + mobile/iitcm/src/main/res/menu/debug.xml | 13 + mobile/iitcm/src/main/res/menu/main.xml | 60 + mobile/iitcm/src/main/res/menu/plugins.xml | 11 + .../iitcm/src/main/res/values-v21/styles.xml | 17 + mobile/iitcm/src/main/res/values/app_name.xml | 4 + mobile/iitcm/src/main/res/values/dimens.xml | 18 + mobile/iitcm/src/main/res/values/strings.xml | 257 + mobile/iitcm/src/main/res/values/styles.xml | 58 + .../src/main/res/xml/pluginspreference.xml | 6 + mobile/iitcm/src/main/res/xml/preferences.xml | 141 + mobile/iitcm/src/main/res/xml/searchable.xml | 7 + .../src/testBuild/res/values/app_name.xml | 4 + mobile/libs/android-support-v4.jar | Bin 556198 -> 0 bytes mobile/project.properties | 14 - mobile/settings.gradle | 1 + 311 files changed, 48109 insertions(+), 391 deletions(-) create mode 100644 mobile/assets/plugins/add-kml.user.js create mode 100644 mobile/assets/plugins/ap-list.user.js create mode 100644 mobile/assets/plugins/basemap-bing.user.js create mode 100644 mobile/assets/plugins/basemap-blank.user.js create mode 100644 mobile/assets/plugins/basemap-gmaps-gray.user.js create mode 100644 mobile/assets/plugins/basemap-kartverket.user.js create mode 100644 mobile/assets/plugins/basemap-mapquest-open-aerial.user.js create mode 100644 mobile/assets/plugins/basemap-nokia-ovi.user.js create mode 100644 mobile/assets/plugins/basemap-opencyclemap.user.js create mode 100644 mobile/assets/plugins/basemap-openstreetmap.user.js create mode 100644 mobile/assets/plugins/basemap-stamen.user.js create mode 100644 mobile/assets/plugins/basemap-yandex.user.js create mode 100644 mobile/assets/plugins/bookmarks-by-zaso.user.js create mode 100644 mobile/assets/plugins/cache-details-on-map.user.js create mode 100644 mobile/assets/plugins/canvas-render.user.js create mode 100644 mobile/assets/plugins/compute-ap-stats.user.js create mode 100644 mobile/assets/plugins/cross_link.user.js create mode 100644 mobile/assets/plugins/debug-raw-portal-data.user.js create mode 100644 mobile/assets/plugins/default-intel-detail.user.js create mode 100644 mobile/assets/plugins/distance-to-portal.user.js create mode 100644 mobile/assets/plugins/done-links.user.js create mode 100644 mobile/assets/plugins/draw-resonators.user.js create mode 100644 mobile/assets/plugins/draw-tools.user.js create mode 100644 mobile/assets/plugins/favorite-portals.user.js create mode 100644 mobile/assets/plugins/fix-googlemap-china-offset.user.js create mode 100644 mobile/assets/plugins/fly-links.user.js create mode 100644 mobile/assets/plugins/guess-player-levels.user.js create mode 100644 mobile/assets/plugins/iitc-ditigal-bumper-sticker.user.js create mode 100644 mobile/assets/plugins/ipas-link.user.js create mode 100644 mobile/assets/plugins/keys-on-map.user.js create mode 100644 mobile/assets/plugins/keys.user.js create mode 100644 mobile/assets/plugins/layer-count.user.js create mode 100644 mobile/assets/plugins/layer-farms-find.user.js create mode 100644 mobile/assets/plugins/link-show-direction.user.js create mode 100644 mobile/assets/plugins/max-links.user.js create mode 100644 mobile/assets/plugins/minimap.user.js create mode 100644 mobile/assets/plugins/missions.user.js create mode 100644 mobile/assets/plugins/pan-control.user.js create mode 100644 mobile/assets/plugins/periodic-refresh.user.js create mode 100644 mobile/assets/plugins/player-tracker.user.js create mode 100644 mobile/assets/plugins/players-portal-pictures.user.js create mode 100644 mobile/assets/plugins/players-resonators.user.js create mode 100644 mobile/assets/plugins/portal-counts.user.js create mode 100644 mobile/assets/plugins/portal-defense.user.js create mode 100644 mobile/assets/plugins/portal-highlighter-bad-deployment-distance.user.js create mode 100644 mobile/assets/plugins/portal-highlighter-can-make-level.user.js create mode 100644 mobile/assets/plugins/portal-highlighter-debug.user.js create mode 100644 mobile/assets/plugins/portal-highlighter-forgotten.user.js create mode 100644 mobile/assets/plugins/portal-highlighter-hide-team.user.js create mode 100644 mobile/assets/plugins/portal-highlighter-high-level.user.js create mode 100644 mobile/assets/plugins/portal-highlighter-imminent-decay.user.js create mode 100644 mobile/assets/plugins/portal-highlighter-infrastructure.user.js create mode 100644 mobile/assets/plugins/portal-highlighter-level-color.user.js create mode 100644 mobile/assets/plugins/portal-highlighter-missing-resonators.user.js create mode 100644 mobile/assets/plugins/portal-highlighter-mitigation.user.js create mode 100644 mobile/assets/plugins/portal-highlighter-mods.user.js create mode 100644 mobile/assets/plugins/portal-highlighter-my-8-portals.user.js create mode 100644 mobile/assets/plugins/portal-highlighter-my-portals.user.js create mode 100644 mobile/assets/plugins/portal-highlighter-needs-recharge.user.js create mode 100644 mobile/assets/plugins/portal-highlighter-ornaments.user.js create mode 100644 mobile/assets/plugins/portal-highlighter-outbound-link-counter.user.js create mode 100644 mobile/assets/plugins/portal-highlighter-portal-ap-energy-relative.user.js create mode 100644 mobile/assets/plugins/portal-highlighter-portal-ap-relative.user.js create mode 100644 mobile/assets/plugins/portal-highlighter-portal-ap.user.js create mode 100644 mobile/assets/plugins/portal-highlighter-portals-my-level.user.js create mode 100644 mobile/assets/plugins/portal-highlighter-portals-upgrade.user.js create mode 100644 mobile/assets/plugins/portal-highlighter-with-lvl8-resonators.user.js create mode 100644 mobile/assets/plugins/portal-level-numbers.user.js create mode 100644 mobile/assets/plugins/portal-names.user.js create mode 100644 mobile/assets/plugins/portals-list.user.js create mode 100644 mobile/assets/plugins/privacy-view.user.js create mode 100644 mobile/assets/plugins/regions.user.js create mode 100644 mobile/assets/plugins/render-limit-increase.user.js create mode 100644 mobile/assets/plugins/reso-energy-pct-in-portal-detail.user.js create mode 100644 mobile/assets/plugins/resonator-display-zoom-level-decrease.user.js create mode 100644 mobile/assets/plugins/scale-bar.user.js create mode 100644 mobile/assets/plugins/score-cycle-times.user.js create mode 100644 mobile/assets/plugins/scoreboard.user.js create mode 100644 mobile/assets/plugins/show-address.user.js create mode 100644 mobile/assets/plugins/show-less-portals-zoomed-out.user.js create mode 100644 mobile/assets/plugins/show-linked-portals.user.js create mode 100644 mobile/assets/plugins/show-more-portals.user.js create mode 100644 mobile/assets/plugins/show-portal-weakness.user.js create mode 100644 mobile/assets/plugins/sync.user.js create mode 100644 mobile/assets/plugins/uniques.user.js create mode 100644 mobile/assets/plugins/update-check.user.js create mode 100644 mobile/assets/plugins/zaprange.user.js create mode 100644 mobile/assets/plugins/zoom-slider.user.js create mode 100644 mobile/assets/total-conversion-build.user.js create mode 100644 mobile/assets/user-location.user.js delete mode 100644 mobile/build-test.xml create mode 100644 mobile/build.gradle delete mode 100644 mobile/build.xml create mode 100644 mobile/gradle.properties create mode 100644 mobile/gradle/wrapper/gradle-wrapper.jar create mode 100644 mobile/gradle/wrapper/gradle-wrapper.properties create mode 100644 mobile/gradlew create mode 100644 mobile/gradlew.bat create mode 100644 mobile/iitcm/.gitignore create mode 100644 mobile/iitcm/build.gradle create mode 100644 mobile/iitcm/proguard-rules.txt rename mobile/{ => iitcm/src/main}/AndroidManifest.xml (95%) create mode 100644 mobile/iitcm/src/main/java/com/cradle/iitc_mobile/IITC_Application.java create mode 100644 mobile/iitcm/src/main/java/com/cradle/iitc_mobile/IITC_DeviceAccountLogin.java create mode 100644 mobile/iitcm/src/main/java/com/cradle/iitc_mobile/IITC_FileManager.java create mode 100644 mobile/iitcm/src/main/java/com/cradle/iitc_mobile/IITC_JSInterface.java create mode 100644 mobile/iitcm/src/main/java/com/cradle/iitc_mobile/IITC_JSInterfaceKitkat.java create mode 100644 mobile/iitcm/src/main/java/com/cradle/iitc_mobile/IITC_JsDialogHelper.java create mode 100644 mobile/iitcm/src/main/java/com/cradle/iitc_mobile/IITC_LogAdapter.java create mode 100644 mobile/iitcm/src/main/java/com/cradle/iitc_mobile/IITC_MapSettings.java create mode 100644 mobile/iitcm/src/main/java/com/cradle/iitc_mobile/IITC_Mobile.java create mode 100644 mobile/iitcm/src/main/java/com/cradle/iitc_mobile/IITC_NavigationHelper.java create mode 100644 mobile/iitcm/src/main/java/com/cradle/iitc_mobile/IITC_NotificationHelper.java create mode 100644 mobile/iitcm/src/main/java/com/cradle/iitc_mobile/IITC_TileManager.java create mode 100644 mobile/iitcm/src/main/java/com/cradle/iitc_mobile/IITC_UserLocation.java create mode 100644 mobile/iitcm/src/main/java/com/cradle/iitc_mobile/IITC_WebChromeClient.java create mode 100644 mobile/iitcm/src/main/java/com/cradle/iitc_mobile/IITC_WebView.java create mode 100644 mobile/iitcm/src/main/java/com/cradle/iitc_mobile/IITC_WebViewClient.java create mode 100644 mobile/iitcm/src/main/java/com/cradle/iitc_mobile/Log.java create mode 100644 mobile/iitcm/src/main/java/com/cradle/iitc_mobile/async/CheckHttpResponse.java create mode 100644 mobile/iitcm/src/main/java/com/cradle/iitc_mobile/async/DownloadTile.java create mode 100644 mobile/iitcm/src/main/java/com/cradle/iitc_mobile/async/UpdateScript.java create mode 100644 mobile/iitcm/src/main/java/com/cradle/iitc_mobile/compass/AccMagCompass.java create mode 100644 mobile/iitcm/src/main/java/com/cradle/iitc_mobile/compass/Compass.java create mode 100644 mobile/iitcm/src/main/java/com/cradle/iitc_mobile/compass/CompassListener.java create mode 100644 mobile/iitcm/src/main/java/com/cradle/iitc_mobile/compass/GyroCompass.java create mode 100644 mobile/iitcm/src/main/java/com/cradle/iitc_mobile/fragments/MainSettings.java create mode 100644 mobile/iitcm/src/main/java/com/cradle/iitc_mobile/fragments/PluginsFragment.java create mode 100644 mobile/iitcm/src/main/java/com/cradle/iitc_mobile/prefs/AboutDialogPreference.java create mode 100644 mobile/iitcm/src/main/java/com/cradle/iitc_mobile/prefs/ForceUpdatePreference.java create mode 100644 mobile/iitcm/src/main/java/com/cradle/iitc_mobile/prefs/PluginPreference.java create mode 100644 mobile/iitcm/src/main/java/com/cradle/iitc_mobile/prefs/PluginPreferenceActivity.java create mode 100644 mobile/iitcm/src/main/java/com/cradle/iitc_mobile/prefs/PreferenceActivity.java create mode 100644 mobile/iitcm/src/main/java/com/cradle/iitc_mobile/share/FragmentAdapter.java create mode 100644 mobile/iitcm/src/main/java/com/cradle/iitc_mobile/share/IntentAdapter.java create mode 100644 mobile/iitcm/src/main/java/com/cradle/iitc_mobile/share/IntentComparator.java create mode 100644 mobile/iitcm/src/main/java/com/cradle/iitc_mobile/share/IntentGenerator.java create mode 100644 mobile/iitcm/src/main/java/com/cradle/iitc_mobile/share/IntentListFragment.java create mode 100644 mobile/iitcm/src/main/java/com/cradle/iitc_mobile/share/SaveToFile.java create mode 100644 mobile/iitcm/src/main/java/com/cradle/iitc_mobile/share/SendToClipboard.java create mode 100644 mobile/iitcm/src/main/java/com/cradle/iitc_mobile/share/ShareActivity.java create mode 100644 mobile/iitcm/src/main/res/drawable-hdpi/ic_action_about.png create mode 100644 mobile/iitcm/src/main/res/drawable-hdpi/ic_action_add_to_queue.png create mode 100644 mobile/iitcm/src/main/res/drawable-hdpi/ic_action_cc_bcc.png create mode 100644 mobile/iitcm/src/main/res/drawable-hdpi/ic_action_copy.png create mode 100644 mobile/iitcm/src/main/res/drawable-hdpi/ic_action_data_usage.png create mode 100644 mobile/iitcm/src/main/res/drawable-hdpi/ic_action_discard.png create mode 100644 mobile/iitcm/src/main/res/drawable-hdpi/ic_action_error.png create mode 100644 mobile/iitcm/src/main/res/drawable-hdpi/ic_action_error_red.png create mode 100644 mobile/iitcm/src/main/res/drawable-hdpi/ic_action_full_screen.png create mode 100644 mobile/iitcm/src/main/res/drawable-hdpi/ic_action_group.png create mode 100644 mobile/iitcm/src/main/res/drawable-hdpi/ic_action_location_follow.png create mode 100644 mobile/iitcm/src/main/res/drawable-hdpi/ic_action_location_found.png create mode 100644 mobile/iitcm/src/main/res/drawable-hdpi/ic_action_map.png create mode 100644 mobile/iitcm/src/main/res/drawable-hdpi/ic_action_new.png create mode 100644 mobile/iitcm/src/main/res/drawable-hdpi/ic_action_new_event.png create mode 100644 mobile/iitcm/src/main/res/drawable-hdpi/ic_action_paste.png create mode 100644 mobile/iitcm/src/main/res/drawable-hdpi/ic_action_place.png create mode 100644 mobile/iitcm/src/main/res/drawable-hdpi/ic_action_refresh.png create mode 100644 mobile/iitcm/src/main/res/drawable-hdpi/ic_action_return_from_full_screen.png create mode 100644 mobile/iitcm/src/main/res/drawable-hdpi/ic_action_save.png create mode 100644 mobile/iitcm/src/main/res/drawable-hdpi/ic_action_search.png create mode 100644 mobile/iitcm/src/main/res/drawable-hdpi/ic_action_share.png create mode 100644 mobile/iitcm/src/main/res/drawable-hdpi/ic_action_star.png create mode 100644 mobile/iitcm/src/main/res/drawable-hdpi/ic_action_view_as_list.png create mode 100644 mobile/iitcm/src/main/res/drawable-hdpi/ic_action_view_as_list_compact.png create mode 100644 mobile/iitcm/src/main/res/drawable-hdpi/ic_action_warning.png create mode 100644 mobile/iitcm/src/main/res/drawable-hdpi/ic_action_warning_yellow.png create mode 100644 mobile/iitcm/src/main/res/drawable-hdpi/ic_action_web_site.png create mode 100644 mobile/iitcm/src/main/res/drawable-hdpi/ic_drawer.png create mode 100644 mobile/iitcm/src/main/res/drawable-hdpi/ic_iitcm.png create mode 100644 mobile/iitcm/src/main/res/drawable-hdpi/ic_launcher.png create mode 100644 mobile/iitcm/src/main/res/drawable-hdpi/iitc.png create mode 100644 mobile/iitcm/src/main/res/drawable-hdpi/iitc_blue.png create mode 100644 mobile/iitcm/src/main/res/drawable-ldpi/ic_iitcm.png create mode 100644 mobile/iitcm/src/main/res/drawable-ldpi/iitc.png create mode 100644 mobile/iitcm/src/main/res/drawable-ldpi/iitc_blue.png create mode 100644 mobile/iitcm/src/main/res/drawable-mdpi/ic_action_about.png create mode 100644 mobile/iitcm/src/main/res/drawable-mdpi/ic_action_add_to_queue.png create mode 100644 mobile/iitcm/src/main/res/drawable-mdpi/ic_action_cc_bcc.png create mode 100644 mobile/iitcm/src/main/res/drawable-mdpi/ic_action_copy.png create mode 100644 mobile/iitcm/src/main/res/drawable-mdpi/ic_action_data_usage.png create mode 100644 mobile/iitcm/src/main/res/drawable-mdpi/ic_action_discard.png create mode 100644 mobile/iitcm/src/main/res/drawable-mdpi/ic_action_error.png create mode 100644 mobile/iitcm/src/main/res/drawable-mdpi/ic_action_error_red.png create mode 100644 mobile/iitcm/src/main/res/drawable-mdpi/ic_action_full_screen.png create mode 100644 mobile/iitcm/src/main/res/drawable-mdpi/ic_action_group.png create mode 100644 mobile/iitcm/src/main/res/drawable-mdpi/ic_action_location_follow.png create mode 100644 mobile/iitcm/src/main/res/drawable-mdpi/ic_action_location_found.png create mode 100644 mobile/iitcm/src/main/res/drawable-mdpi/ic_action_map.png create mode 100644 mobile/iitcm/src/main/res/drawable-mdpi/ic_action_new.png create mode 100644 mobile/iitcm/src/main/res/drawable-mdpi/ic_action_new_event.png create mode 100644 mobile/iitcm/src/main/res/drawable-mdpi/ic_action_paste.png create mode 100644 mobile/iitcm/src/main/res/drawable-mdpi/ic_action_place.png create mode 100644 mobile/iitcm/src/main/res/drawable-mdpi/ic_action_refresh.png create mode 100644 mobile/iitcm/src/main/res/drawable-mdpi/ic_action_return_from_full_screen.png create mode 100644 mobile/iitcm/src/main/res/drawable-mdpi/ic_action_save.png create mode 100644 mobile/iitcm/src/main/res/drawable-mdpi/ic_action_search.png create mode 100644 mobile/iitcm/src/main/res/drawable-mdpi/ic_action_share.png create mode 100644 mobile/iitcm/src/main/res/drawable-mdpi/ic_action_star.png create mode 100644 mobile/iitcm/src/main/res/drawable-mdpi/ic_action_view_as_list.png create mode 100644 mobile/iitcm/src/main/res/drawable-mdpi/ic_action_view_as_list_compact.png create mode 100644 mobile/iitcm/src/main/res/drawable-mdpi/ic_action_warning.png create mode 100644 mobile/iitcm/src/main/res/drawable-mdpi/ic_action_warning_yellow.png create mode 100644 mobile/iitcm/src/main/res/drawable-mdpi/ic_action_web_site.png create mode 100644 mobile/iitcm/src/main/res/drawable-mdpi/ic_drawer.png create mode 100644 mobile/iitcm/src/main/res/drawable-mdpi/ic_iitcm.png create mode 100644 mobile/iitcm/src/main/res/drawable-mdpi/ic_launcher.png create mode 100644 mobile/iitcm/src/main/res/drawable-mdpi/iitc.png create mode 100644 mobile/iitcm/src/main/res/drawable-mdpi/iitc_blue.png create mode 100644 mobile/iitcm/src/main/res/drawable-xhdpi/ic_action_about.png create mode 100644 mobile/iitcm/src/main/res/drawable-xhdpi/ic_action_add_to_queue.png create mode 100644 mobile/iitcm/src/main/res/drawable-xhdpi/ic_action_cc_bcc.png create mode 100644 mobile/iitcm/src/main/res/drawable-xhdpi/ic_action_copy.png create mode 100644 mobile/iitcm/src/main/res/drawable-xhdpi/ic_action_data_usage.png create mode 100644 mobile/iitcm/src/main/res/drawable-xhdpi/ic_action_discard.png create mode 100644 mobile/iitcm/src/main/res/drawable-xhdpi/ic_action_error.png create mode 100644 mobile/iitcm/src/main/res/drawable-xhdpi/ic_action_error_red.png create mode 100644 mobile/iitcm/src/main/res/drawable-xhdpi/ic_action_full_screen.png create mode 100644 mobile/iitcm/src/main/res/drawable-xhdpi/ic_action_group.png create mode 100644 mobile/iitcm/src/main/res/drawable-xhdpi/ic_action_location_follow.png create mode 100644 mobile/iitcm/src/main/res/drawable-xhdpi/ic_action_location_found.png create mode 100644 mobile/iitcm/src/main/res/drawable-xhdpi/ic_action_map.png create mode 100644 mobile/iitcm/src/main/res/drawable-xhdpi/ic_action_new.png create mode 100644 mobile/iitcm/src/main/res/drawable-xhdpi/ic_action_new_event.png create mode 100644 mobile/iitcm/src/main/res/drawable-xhdpi/ic_action_paste.png create mode 100644 mobile/iitcm/src/main/res/drawable-xhdpi/ic_action_place.png create mode 100644 mobile/iitcm/src/main/res/drawable-xhdpi/ic_action_refresh.png create mode 100644 mobile/iitcm/src/main/res/drawable-xhdpi/ic_action_return_from_full_screen.png create mode 100644 mobile/iitcm/src/main/res/drawable-xhdpi/ic_action_save.png create mode 100644 mobile/iitcm/src/main/res/drawable-xhdpi/ic_action_search.png create mode 100644 mobile/iitcm/src/main/res/drawable-xhdpi/ic_action_share.png create mode 100644 mobile/iitcm/src/main/res/drawable-xhdpi/ic_action_star.png create mode 100644 mobile/iitcm/src/main/res/drawable-xhdpi/ic_action_view_as_list.png create mode 100644 mobile/iitcm/src/main/res/drawable-xhdpi/ic_action_view_as_list_compact.png create mode 100644 mobile/iitcm/src/main/res/drawable-xhdpi/ic_action_warning.png create mode 100644 mobile/iitcm/src/main/res/drawable-xhdpi/ic_action_warning_yellow.png create mode 100644 mobile/iitcm/src/main/res/drawable-xhdpi/ic_action_web_site.png create mode 100644 mobile/iitcm/src/main/res/drawable-xhdpi/ic_drawer.png create mode 100644 mobile/iitcm/src/main/res/drawable-xhdpi/ic_iitcm.png create mode 100644 mobile/iitcm/src/main/res/drawable-xhdpi/ic_launcher.png create mode 100644 mobile/iitcm/src/main/res/drawable-xhdpi/iitc.png create mode 100644 mobile/iitcm/src/main/res/drawable-xhdpi/iitc_blue.png create mode 100644 mobile/iitcm/src/main/res/drawable-xxhdpi/ic_action_about.png create mode 100644 mobile/iitcm/src/main/res/drawable-xxhdpi/ic_action_add_to_queue.png create mode 100644 mobile/iitcm/src/main/res/drawable-xxhdpi/ic_action_cc_bcc.png create mode 100644 mobile/iitcm/src/main/res/drawable-xxhdpi/ic_action_copy.png create mode 100644 mobile/iitcm/src/main/res/drawable-xxhdpi/ic_action_data_usage.png create mode 100644 mobile/iitcm/src/main/res/drawable-xxhdpi/ic_action_discard.png create mode 100644 mobile/iitcm/src/main/res/drawable-xxhdpi/ic_action_error.png create mode 100644 mobile/iitcm/src/main/res/drawable-xxhdpi/ic_action_error_red.png create mode 100644 mobile/iitcm/src/main/res/drawable-xxhdpi/ic_action_full_screen.png create mode 100644 mobile/iitcm/src/main/res/drawable-xxhdpi/ic_action_group.png create mode 100644 mobile/iitcm/src/main/res/drawable-xxhdpi/ic_action_location_follow.png create mode 100644 mobile/iitcm/src/main/res/drawable-xxhdpi/ic_action_location_found.png create mode 100644 mobile/iitcm/src/main/res/drawable-xxhdpi/ic_action_map.png create mode 100644 mobile/iitcm/src/main/res/drawable-xxhdpi/ic_action_new.png create mode 100644 mobile/iitcm/src/main/res/drawable-xxhdpi/ic_action_new_event.png create mode 100644 mobile/iitcm/src/main/res/drawable-xxhdpi/ic_action_paste.png create mode 100644 mobile/iitcm/src/main/res/drawable-xxhdpi/ic_action_place.png create mode 100644 mobile/iitcm/src/main/res/drawable-xxhdpi/ic_action_refresh.png create mode 100644 mobile/iitcm/src/main/res/drawable-xxhdpi/ic_action_return_from_full_screen.png create mode 100644 mobile/iitcm/src/main/res/drawable-xxhdpi/ic_action_save.png create mode 100644 mobile/iitcm/src/main/res/drawable-xxhdpi/ic_action_search.png create mode 100644 mobile/iitcm/src/main/res/drawable-xxhdpi/ic_action_share.png create mode 100644 mobile/iitcm/src/main/res/drawable-xxhdpi/ic_action_star.png create mode 100644 mobile/iitcm/src/main/res/drawable-xxhdpi/ic_action_view_as_list.png create mode 100644 mobile/iitcm/src/main/res/drawable-xxhdpi/ic_action_view_as_list_compact.png create mode 100644 mobile/iitcm/src/main/res/drawable-xxhdpi/ic_action_warning.png create mode 100644 mobile/iitcm/src/main/res/drawable-xxhdpi/ic_action_warning_yellow.png create mode 100644 mobile/iitcm/src/main/res/drawable-xxhdpi/ic_action_web_site.png create mode 100644 mobile/iitcm/src/main/res/drawable-xxhdpi/ic_drawer.png create mode 100644 mobile/iitcm/src/main/res/drawable-xxhdpi/ic_iitcm.png create mode 100644 mobile/iitcm/src/main/res/drawable-xxhdpi/ic_launcher.png create mode 100644 mobile/iitcm/src/main/res/drawable-xxhdpi/iitc.png create mode 100644 mobile/iitcm/src/main/res/drawable-xxhdpi/iitc_blue.png create mode 100644 mobile/iitcm/src/main/res/layout/activity_main.xml create mode 100644 mobile/iitcm/src/main/res/layout/activity_share.xml create mode 100644 mobile/iitcm/src/main/res/layout/checked_textview.xml create mode 100644 mobile/iitcm/src/main/res/layout/dialog_http_authentication.xml create mode 100644 mobile/iitcm/src/main/res/layout/dialog_notice.xml create mode 100644 mobile/iitcm/src/main/res/layout/dialog_progressbar.xml create mode 100644 mobile/iitcm/src/main/res/layout/js_prompt.xml create mode 100644 mobile/iitcm/src/main/res/layout/list_item_narrow.xml create mode 100644 mobile/iitcm/src/main/res/layout/list_item_selectable.xml create mode 100644 mobile/iitcm/src/main/res/layout/map_options_header.xml create mode 100644 mobile/iitcm/src/main/res/layout/pref_main.xml create mode 100644 mobile/iitcm/src/main/res/layout/preference_header_item.xml create mode 100644 mobile/iitcm/src/main/res/layout/toolbar_layout.xml create mode 100644 mobile/iitcm/src/main/res/layout/view_log_msg.xml create mode 100644 mobile/iitcm/src/main/res/menu/debug.xml create mode 100644 mobile/iitcm/src/main/res/menu/main.xml create mode 100644 mobile/iitcm/src/main/res/menu/plugins.xml create mode 100644 mobile/iitcm/src/main/res/values-v21/styles.xml create mode 100644 mobile/iitcm/src/main/res/values/app_name.xml create mode 100644 mobile/iitcm/src/main/res/values/dimens.xml create mode 100644 mobile/iitcm/src/main/res/values/strings.xml create mode 100644 mobile/iitcm/src/main/res/values/styles.xml create mode 100644 mobile/iitcm/src/main/res/xml/pluginspreference.xml create mode 100644 mobile/iitcm/src/main/res/xml/preferences.xml create mode 100644 mobile/iitcm/src/main/res/xml/searchable.xml create mode 100644 mobile/iitcm/src/testBuild/res/values/app_name.xml delete mode 100644 mobile/libs/android-support-v4.jar delete mode 100644 mobile/project.properties create mode 100644 mobile/settings.gradle diff --git a/mobile/.gitignore b/mobile/.gitignore index 20b44cb93..b99dd00e4 100644 --- a/mobile/.gitignore +++ b/mobile/.gitignore @@ -1,37 +1,6 @@ -.settings/ -assets/total-conversion-build.user.js -assets/user-location.user.js -assets/plugins/ - -# built application files -*.apk -*.ap_ - -# files for the dex VM -*.dex - -# Java class files -*.class - -# generated files -bin/ -gen/ -out/ - -# private ant configs -ant.properties - -# Local configuration file (sdk path, etc) +.gradle +.idea +*.iml local.properties - -# Eclipse project files -.classpath -.project - -# IntelliJ IDEA user settings -*.iws -.idea/workspace.xml -.idea/tasks.xml - -# Proguard logs -proguard_logs/ +signing.properties +.DS_Store diff --git a/mobile/.idea/compiler.xml b/mobile/.idea/compiler.xml index 1b255f76d..a1757ae52 100644 --- a/mobile/.idea/compiler.xml +++ b/mobile/.idea/compiler.xml @@ -1,26 +1,8 @@ - - - + \ No newline at end of file diff --git a/mobile/.idea/misc.xml b/mobile/.idea/misc.xml index 4742f8a17..5785cabbf 100644 --- a/mobile/.idea/misc.xml +++ b/mobile/.idea/misc.xml @@ -1,10 +1,35 @@ - - + + + - - + + - - + \ No newline at end of file diff --git a/mobile/.idea/modules.xml b/mobile/.idea/modules.xml index cbb8eea56..25311a17d 100644 --- a/mobile/.idea/modules.xml +++ b/mobile/.idea/modules.xml @@ -2,8 +2,8 @@ - + + - - + \ No newline at end of file diff --git a/mobile/.idea/vcs.xml b/mobile/.idea/vcs.xml index 21cbaa607..6c0b86358 100644 --- a/mobile/.idea/vcs.xml +++ b/mobile/.idea/vcs.xml @@ -3,5 +3,4 @@ - - + \ No newline at end of file diff --git a/mobile/HACKING.md b/mobile/HACKING.md index 196492b80..b2075d527 100644 --- a/mobile/HACKING.md +++ b/mobile/HACKING.md @@ -24,7 +24,7 @@ Debugging IITC(M) **before** it has booted requires the Android Developer Tools. Building the APK ---------------- -- **ant:** +- **gradle:** Set the ANDROID_HOME environment variable: ```export ANDROID_HOME=/path/to/android_sdk``` Then build the app via the build.py script ```./build.py mobile``` diff --git a/mobile/assets/plugins/add-kml.user.js b/mobile/assets/plugins/add-kml.user.js new file mode 100644 index 000000000..5f72ae2c5 --- /dev/null +++ b/mobile/assets/plugins/add-kml.user.js @@ -0,0 +1,888 @@ +// ==UserScript== +// @id overlay-kml@danielatkins +// @name IITC plugin: overlay KML +// @category Layer +// @version 0.2.0.20181030.90244 +// @namespace https://github.com/jonatkins/ingress-intel-total-conversion +// @updateURL none +// @downloadURL none +// @description [mobile-2018-10-30-090244] Allow users to overlay their own KML / GPX files on top of IITC. +// @include https://*.ingress.com/intel* +// @include http://*.ingress.com/intel* +// @match https://*.ingress.com/intel* +// @match http://*.ingress.com/intel* +// @include https://*.ingress.com/mission/* +// @include http://*.ingress.com/mission/* +// @match https://*.ingress.com/mission/* +// @match http://*.ingress.com/mission/* +// @grant none +// ==/UserScript== + + +function wrapper(plugin_info) { +// ensure plugin framework is there, even if iitc is not yet loaded +if(typeof window.plugin !== 'function') window.plugin = function() {}; + +//PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! +//(leaving them in place might break the 'About IITC' page or break update checks) +plugin_info.buildName = 'mobile'; +plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.pluginId = 'add-kml'; +//END PLUGIN AUTHORS NOTE + + + +// PLUGIN START //////////////////////////////////////////////////////// + +// use own namespace for plugin +window.plugin.overlayKML = function() {}; + +window.plugin.overlayKML.loadExternals = function() { + try { console.log('Loading leaflet.filelayer JS now'); } catch(e) {} + /* + * Load files *locally* (GeoJSON, KML, GPX) into the map + * using the HTML5 File API. + * + * Requires Pavel Shramov's GPX.js + * https://github.com/shramov/leaflet-plugins/blob/d74d67/layer/vector/GPX.js + */ +var FileLoader = L.Class.extend({ + includes: L.Mixin.Events, + options: { + layerOptions: {} + }, + + initialize: function (map, options) { + this._map = map; + L.Util.setOptions(this, options); + + this._parsers = { + 'geojson': this._loadGeoJSON, + 'gpx': this._convertToGeoJSON, + 'kml': this._convertToGeoJSON + }; + }, + + load: function (file /* File */) { + // Check file extension + var ext = file.name.split('.').pop(), + parser = this._parsers[ext]; + if (!parser) { + window.alert("Unsupported file type " + file.type + '(' + ext + ')'); + return; + } + // Read selected file using HTML5 File API + var reader = new FileReader(); + reader.onload = L.Util.bind(function (e) { + this.fire('data:loading', {filename: file.name, format: ext}); + var layer = parser.call(this, e.target.result, ext); + this.fire('data:loaded', {layer: layer, filename: file.name, format: ext}); + }, this); + reader.readAsText(file); + }, + + _loadGeoJSON: function (content) { + if (typeof content == 'string') { + content = JSON.parse(content); + } + return L.geoJson(content, L.Util.extend({}, this.options.layerOptions, { + style: function (feature) { + return feature.properties && feature.properties.style; + } + })).addTo(this._map); + }, + + _convertToGeoJSON: function (content, format) { + // Format is either 'gpx' or 'kml' + if (typeof content == 'string') { + content = ( new window.DOMParser() ).parseFromString(content, "text/xml"); + } + var geojson = toGeoJSON[format](content); + return this._loadGeoJSON(geojson); + } +}); + + +L.Control.FileLayerLoad = L.Control.extend({ + statics: { + TITLE: 'Load local file (GPX, KML, GeoJSON)', + LABEL: '⌅' + }, + options: { + position: 'topleft', + fitBounds: true, + layerOptions: {} + }, + + initialize: function (options) { + L.Util.setOptions(this, options); + this.loader = null; + }, + + onAdd: function (map) { + this.loader = new FileLoader(map, {layerOptions: this.options.layerOptions}); + + this.loader.on('data:loaded', function (e) { + // Fit bounds after loading + if (this.options.fitBounds) { + window.setTimeout(function () { + map.fitBounds(e.layer.getBounds()).zoomOut(); + }, 500); + } + }, this); + + // Initialize Drag-and-drop + this._initDragAndDrop(map); + + // Initialize map control + return this._initContainer(); + }, + + _initDragAndDrop: function (map) { + var fileLoader = this.loader, + dropbox = map._container; + + var callbacks = { + dragenter: function () { + map.scrollWheelZoom.disable(); + }, + dragleave: function () { + map.scrollWheelZoom.enable(); + }, + dragover: function (e) { + e.stopPropagation(); + e.preventDefault(); + }, + drop: function (e) { + e.stopPropagation(); + e.preventDefault(); + + var files = Array.prototype.slice.apply(e.dataTransfer.files), + i = files.length; + setTimeout(function(){ + fileLoader.load(files.shift()); + if (files.length > 0) { + setTimeout(arguments.callee, 25); + } + }, 25); + map.scrollWheelZoom.enable(); + } + }; + for (var name in callbacks) + dropbox.addEventListener(name, callbacks[name], false); + }, + + _initContainer: function () { + // Create an invisible file input + var fileInput = L.DomUtil.create('input', 'hidden', container); + fileInput.type = 'file'; + fileInput.accept = '.gpx,.kml,.geojson'; + fileInput.style.display = 'none'; + // Load on file change + var fileLoader = this.loader; + fileInput.addEventListener("change", function (e) { + fileLoader.load(this.files[0]); + }, false); + + // Create a button, and bind click on hidden file input + var zoomName = 'leaflet-control-filelayer leaflet-control-zoom', + barName = 'leaflet-bar', + partName = barName + '-part', + container = L.DomUtil.create('div', zoomName + ' ' + barName); + var link = L.DomUtil.create('a', zoomName + '-in ' + partName, container); + link.innerHTML = L.Control.FileLayerLoad.LABEL; + link.href = '#'; + link.title = L.Control.FileLayerLoad.TITLE; + + var stop = L.DomEvent.stopPropagation; + L.DomEvent + .on(link, 'click', stop) + .on(link, 'mousedown', stop) + .on(link, 'dblclick', stop) + .on(link, 'click', L.DomEvent.preventDefault) + .on(link, 'click', function (e) { + fileInput.click(); + e.preventDefault(); + }); + return container; + } +}); + +L.Control.fileLayerLoad = function (options) { + return new L.Control.FileLayerLoad(options); +}; + + try { console.log('done loading leaflet.filelayer JS'); } catch(e) {} + + if (window.requestFile !== undefined) { + try { console.log('Loading android webview extensions for leaflet.filelayer JS now'); } catch(e) {} + var FileLoaderMixin = { + parse: function (fileContent, fileName) { + // Check file extension + var ext = fileName.split('.').pop(), + parser = this._parsers[ext]; + if (!parser) { + window.alert("Unsupported file type " + file.type + '(' + ext + ')'); + return; + } + this.fire('data:loading', {filename: fileName, format: ext}); + var layer = parser.call(this, fileContent, ext); + this.fire('data:loaded', {layer: layer, filename: fileName, format: ext}); + } + }; + FileLoader.include(FileLoaderMixin); + + var FileLayerLoadMixin = { + getLoader: function () { + return this.loader; + }, + _initContainer: function () { + // Create a button, and bind click on hidden file input + var zoomName = 'leaflet-control-filelayer leaflet-control-zoom', + barName = 'leaflet-bar', + partName = barName + '-part', + container = L.DomUtil.create('div', zoomName + ' ' + barName); + var link = L.DomUtil.create('a', zoomName + '-in ' + partName, container); + link.innerHTML = L.Control.FileLayerLoad.LABEL; + link.href = '#'; + link.title = L.Control.FileLayerLoad.TITLE; + + var stop = L.DomEvent.stopPropagation; + L.DomEvent + .on(link, 'click', stop) + .on(link, 'mousedown', stop) + .on(link, 'dblclick', stop) + .on(link, 'click', L.DomEvent.preventDefault) + .on(link, 'click', function (e) { + window.requestFile(function(filename, content) { + _fileLayerLoad.getLoader().parse(content, filename); + }); + e.preventDefault(); + }); + return container; + } + }; + L.Control.FileLayerLoad.include(FileLayerLoadMixin); + + try { console.log('done loading android webview extensions for leaflet.filelayer JS'); } catch(e) {} + } + + try { console.log('Loading KML JS now'); } catch(e) {} + /*global L: true */ + +L.KML = L.FeatureGroup.extend({ + options: { + async: true + }, + + initialize: function(kml, options) { + L.Util.setOptions(this, options); + this._kml = kml; + this._layers = {}; + + if (kml) { + this.addKML(kml, options, this.options.async); + } + }, + + loadXML: function(url, cb, options, async) { + if (async == undefined) async = this.options.async; + if (options == undefined) options = this.options; + + var req = new window.XMLHttpRequest(); + req.open('GET', url, async); + try { + req.overrideMimeType('text/xml'); // unsupported by IE + } catch(e) {} + req.onreadystatechange = function() { + if (req.readyState != 4) return; + if(req.status == 200) cb(req.responseXML, options); + }; + req.send(null); + }, + + addKML: function(url, options, async) { + var _this = this; + var cb = function(gpx, options) { _this._addKML(gpx, options) }; + this.loadXML(url, cb, options, async); + }, + + _addKML: function(xml, options) { + var layers = L.KML.parseKML(xml); + if (!layers || !layers.length) return; + for (var i = 0; i < layers.length; i++) + { + this.fire('addlayer', { + layer: layers[i] + }); + this.addLayer(layers[i]); + } + this.latLngs = L.KML.getLatLngs(xml); + this.fire("loaded"); + }, + + latLngs: [] +}); + +L.Util.extend(L.KML, { + + parseKML: function (xml) { + var style = this.parseStyle(xml); + var el = xml.getElementsByTagName("Folder"); + var layers = [], l; + for (var i = 0; i < el.length; i++) { + if (!this._check_folder(el[i])) { continue; } + l = this.parseFolder(el[i], style); + if (l) { layers.push(l); } + } + el = xml.getElementsByTagName('Placemark'); + for (var j = 0; j < el.length; j++) { + if (!this._check_folder(el[j])) { continue; } + l = this.parsePlacemark(el[j], xml, style); + if (l) { layers.push(l); } + } + return layers; + }, + + // Return false if e's first parent Folder is not [folder] + // - returns true if no parent Folders + _check_folder: function (e, folder) { + e = e.parentElement; + while (e && e.tagName !== "Folder") + { + e = e.parentElement; + } + return !e || e === folder; + }, + + parseStyle: function (xml) { + var style = {}; + var sl = xml.getElementsByTagName("Style"); + + //for (var i = 0; i < sl.length; i++) { + var attributes = {color: true, width: true, Icon: true, href: true, + hotSpot: true}; + + function _parse(xml) { + var options = {}; + for (var i = 0; i < xml.childNodes.length; i++) { + var e = xml.childNodes[i]; + var key = e.tagName; + if (!attributes[key]) { continue; } + if (key === 'hotSpot') + { + for (var j = 0; j < e.attributes.length; j++) { + options[e.attributes[j].name] = e.attributes[j].nodeValue; + } + } else { + var value = e.childNodes[0].nodeValue; + if (key === 'color') { + options.opacity = parseInt(value.substring(0, 2), 16) / 255.0; + options.color = "#" + value.substring(6, 8) + value.substring(4, 6) + value.substring(2, 4); + } else if (key === 'width') { + options.weight = value; + } else if (key === 'Icon') { + ioptions = _parse(e); + if (ioptions.href) { options.href = ioptions.href; } + } else if (key === 'href') { + options.href = value; + } + } + } + return options; + } + + for (var i = 0; i < sl.length; i++) { + var e = sl[i], el; + var options = {}, poptions = {}, ioptions = {}; + el = e.getElementsByTagName("LineStyle"); + if (el && el[0]) { options = _parse(el[0]); } + el = e.getElementsByTagName("PolyStyle"); + if (el && el[0]) { poptions = _parse(el[0]); } + if (poptions.color) { options.fillColor = poptions.color; } + if (poptions.opacity) { options.fillOpacity = poptions.opacity; } + el = e.getElementsByTagName("IconStyle"); + if (el && el[0]) { ioptions = _parse(el[0]); } + if (ioptions.href) { + // save anchor info until the image is loaded + options.icon = new L.KMLIcon({ + iconUrl: ioptions.href, + shadowUrl: null, + iconAnchorRef: {x: ioptions.x, y: ioptions.y}, + iconAnchorType: {x: ioptions.xunits, y: ioptions.yunits} + }); + } + style['#' + e.getAttribute('id')] = options; + } + return style; + }, + + parseFolder: function (xml, style) { + var el, layers = [], l; + el = xml.getElementsByTagName('Folder'); + for (var i = 0; i < el.length; i++) { + if (!this._check_folder(el[i], xml)) { continue; } + l = this.parseFolder(el[i], style); + if (l) { layers.push(l); } + } + el = xml.getElementsByTagName('Placemark'); + for (var j = 0; j < el.length; j++) { + if (!this._check_folder(el[j], xml)) { continue; } + l = this.parsePlacemark(el[j], xml, style); + if (l) { layers.push(l); } + } + if (!layers.length) { return; } + if (layers.length === 1) { return layers[0]; } + return new L.FeatureGroup(layers); + }, + + parsePlacemark: function (place, xml, style) { + var i, j, el, options = {}; + el = place.getElementsByTagName('styleUrl'); + for (i = 0; i < el.length; i++) { + var url = el[i].childNodes[0].nodeValue; + for (var a in style[url]) + { + // for jshint + if (true) + { + options[a] = style[url][a]; + } + } + } + var layers = []; + + var parse = ['LineString', 'Polygon', 'Point']; + for (j in parse) { + // for jshint + if (true) + { + var tag = parse[j]; + el = place.getElementsByTagName(tag); + for (i = 0; i < el.length; i++) { + var l = this["parse" + tag](el[i], xml, options); + if (l) { layers.push(l); } + } + } + } + + if (!layers.length) { + return; + } + var layer = layers[0]; + if (layers.length > 1) { + layer = new L.FeatureGroup(layers); + } + + var name, descr = ""; + el = place.getElementsByTagName('name'); + if (el.length) { + name = el[0].childNodes[0].nodeValue; + } + el = place.getElementsByTagName('description'); + for (i = 0; i < el.length; i++) { + for (j = 0; j < el[i].childNodes.length; j++) { + descr = descr + el[i].childNodes[j].nodeValue; + } + } + + if (name) { + layer.bindPopup("

" + name + "

" + descr); + } + + return layer; + }, + + parseCoords: function (xml) { + var el = xml.getElementsByTagName('coordinates'); + return this._read_coords(el[0]); + }, + + parseLineString: function (line, xml, options) { + var coords = this.parseCoords(line); + if (!coords.length) { return; } + return new L.Polyline(coords, options); + }, + + parsePoint: function (line, xml, options) { + var el = line.getElementsByTagName('coordinates'); + if (!el.length) { + return; + } + var ll = el[0].childNodes[0].nodeValue.split(','); + return new L.KMLMarker(new L.LatLng(ll[1], ll[0]), options); + }, + + parsePolygon: function (line, xml, options) { + var el, polys = [], inner = [], i, coords; + el = line.getElementsByTagName('outerBoundaryIs'); + for (i = 0; i < el.length; i++) { + coords = this.parseCoords(el[i]); + if (coords) { + polys.push(coords); + } + } + el = line.getElementsByTagName('innerBoundaryIs'); + for (i = 0; i < el.length; i++) { + coords = this.parseCoords(el[i]); + if (coords) { + inner.push(coords); + } + } + if (!polys.length) { + return; + } + if (options.fillColor) { + options.fill = true; + } + if (polys.length === 1) { + return new L.Polygon(polys.concat(inner), options); + } + return new L.MultiPolygon(polys, options); + }, + + getLatLngs: function (xml) { + var el = xml.getElementsByTagName('coordinates'); + var coords = []; + for (var j = 0; j < el.length; j++) { + // text might span many childNodes + coords = coords.concat(this._read_coords(el[j])); + } + return coords; + }, + + _read_coords: function (el) { + var text = "", coords = [], i; + for (i = 0; i < el.childNodes.length; i++) { + text = text + el.childNodes[i].nodeValue; + } + text = text.split(/[\s\n]+/); + for (i = 0; i < text.length; i++) { + var ll = text[i].split(','); + if (ll.length < 2) { + continue; + } + coords.push(new L.LatLng(ll[1], ll[0])); + } + return coords; + } + +}); + +L.KMLIcon = L.Icon.extend({ + + createIcon: function () { + var img = this._createIcon('icon'); + img.onload = function () { + var i = new Image(); + i.src = this.src; + this.style.width = i.width + 'px'; + this.style.height = i.height + 'px'; + + if (this.anchorType.x === 'UNITS_FRACTION' || this.anchorType.x === 'fraction') { + img.style.marginLeft = (-this.anchor.x * i.width) + 'px'; + } + if (this.anchorType.y === 'UNITS_FRACTION' || this.anchorType.x === 'fraction') { + img.style.marginTop = (-(1 - this.anchor.y) * i.height) + 'px'; + } + this.style.display = ""; + }; + return img; + }, + + _setIconStyles: function (img, name) { + L.Icon.prototype._setIconStyles.apply(this, [img, name]) + // save anchor information to the image + img.anchor = this.options.iconAnchorRef; + img.anchorType = this.options.iconAnchorType; + } +}); + + +L.KMLMarker = L.Marker.extend({ + options: { + icon: new L.KMLIcon.Default() + } +}); + try { console.log('done loading KML JS'); } catch(e) {} + + try { console.log('Loading togeojson JS now'); } catch(e) {} + toGeoJSON = (function() { + 'use strict'; + + var removeSpace = (/\s*/g), + trimSpace = (/^\s*|\s*$/g), + splitSpace = (/\s+/); + // generate a short, numeric hash of a string + function okhash(x) { + if (!x || !x.length) return 0; + for (var i = 0, h = 0; i < x.length; i++) { + h = ((h << 5) - h) + x.charCodeAt(i) | 0; + } return h; + } + // all Y children of X + function get(x, y) { return x.getElementsByTagName(y); } + function attr(x, y) { return x.getAttribute(y); } + function attrf(x, y) { return parseFloat(attr(x, y)); } + // one Y child of X, if any, otherwise null + function get1(x, y) { var n = get(x, y); return n.length ? n[0] : null; } + // https://developer.mozilla.org/en-US/docs/Web/API/Node.normalize + function norm(el) { if (el.normalize) { el.normalize(); } return el; } + // cast array x into numbers + function numarray(x) { + for (var j = 0, o = []; j < x.length; j++) o[j] = parseFloat(x[j]); + return o; + } + function clean(x) { + var o = {}; + for (var i in x) if (x[i]) o[i] = x[i]; + return o; + } + // get the content of a text node, if any + function nodeVal(x) { if (x) {norm(x);} return x && x.firstChild && x.firstChild.nodeValue; } + // get one coordinate from a coordinate array, if any + function coord1(v) { return numarray(v.replace(removeSpace, '').split(',')); } + // get all coordinates from a coordinate array as [[],[]] + function coord(v) { + var coords = v.replace(trimSpace, '').split(splitSpace), + o = []; + for (var i = 0; i < coords.length; i++) { + o.push(coord1(coords[i])); + } + return o; + } + function coordPair(x) { return [attrf(x, 'lon'), attrf(x, 'lat')]; } + + // create a new feature collection parent object + function fc() { + return { + type: 'FeatureCollection', + features: [] + }; + } + + var serializer; + if (typeof XMLSerializer !== 'undefined') { + serializer = new XMLSerializer(); + } else if (typeof require !== 'undefined') { + serializer = new (require('xmldom').XMLSerializer)(); + } + function xml2str(str) { return serializer.serializeToString(str); } + + var t = { + kml: function(doc, o) { + o = o || {}; + + var gj = fc(), + // styleindex keeps track of hashed styles in order to match features + styleIndex = {}, + // atomic geospatial types supported by KML - MultiGeometry is + // handled separately + geotypes = ['Polygon', 'LineString', 'Point', 'Track'], + // all root placemarks in the file + placemarks = get(doc, 'Placemark'), + styles = get(doc, 'Style'); + + for (var k = 0; k < styles.length; k++) { + styleIndex['#' + attr(styles[k], 'id')] = okhash(xml2str(styles[k])).toString(16); + } + for (var j = 0; j < placemarks.length; j++) { + gj.features = gj.features.concat(getPlacemark(placemarks[j])); + } + function gxCoord(v) { return numarray(v.split(' ')); } + function gxCoords(root) { + var elems = get(root, 'coord', 'gx'), coords = []; + for (var i = 0; i < elems.length; i++) coords.push(gxCoord(nodeVal(elems[i]))); + return coords; + } + function getGeometry(root) { + var geomNode, geomNodes, i, j, k, geoms = []; + if (get1(root, 'MultiGeometry')) return getGeometry(get1(root, 'MultiGeometry')); + if (get1(root, 'MultiTrack')) return getGeometry(get1(root, 'MultiTrack')); + for (i = 0; i < geotypes.length; i++) { + geomNodes = get(root, geotypes[i]); + if (geomNodes) { + for (j = 0; j < geomNodes.length; j++) { + geomNode = geomNodes[j]; + if (geotypes[i] == 'Point') { + if(nodeVal(get1(geomNode, 'coordinates')) === null) + continue; + geoms.push({ + type: 'Point', + coordinates: coord1(nodeVal(get1(geomNode, 'coordinates'))) + }); + } else if (geotypes[i] == 'LineString') { + geoms.push({ + type: 'LineString', + coordinates: coord(nodeVal(get1(geomNode, 'coordinates'))) + }); + } else if (geotypes[i] == 'Polygon') { + var rings = get(geomNode, 'LinearRing'), + coords = []; + for (k = 0; k < rings.length; k++) { + coords.push(coord(nodeVal(get1(rings[k], 'coordinates')))); + } + geoms.push({ + type: 'Polygon', + coordinates: coords + }); + } else if (geotypes[i] == 'Track') { + geoms.push({ + type: 'LineString', + coordinates: gxCoords(geomNode) + }); + } + } + } + } + return geoms; + } + function getPlacemark(root) { + var geoms = getGeometry(root), i, properties = {}, + name = nodeVal(get1(root, 'name')), + styleUrl = nodeVal(get1(root, 'styleUrl')), + description = nodeVal(get1(root, 'description')), + extendedData = get1(root, 'ExtendedData'); + + if (!geoms.length) return []; + if (name) properties.name = name; + if (styleUrl && styleIndex[styleUrl]) { + properties.styleUrl = styleUrl; + properties.styleHash = styleIndex[styleUrl]; + } + if (description) properties.description = description; + if (extendedData) { + var datas = get(extendedData, 'Data'), + simpleDatas = get(extendedData, 'SimpleData'); + + for (i = 0; i < datas.length; i++) { + properties[datas[i].getAttribute('name')] = nodeVal(get1(datas[i], 'value')); + } + for (i = 0; i < simpleDatas.length; i++) { + properties[simpleDatas[i].getAttribute('name')] = nodeVal(simpleDatas[i]); + } + } + return [{ + type: 'Feature', + geometry: (geoms.length === 1) ? geoms[0] : { + type: 'GeometryCollection', + geometries: geoms + }, + properties: properties + }]; + } + return gj; + }, + gpx: function(doc, o) { + var i, + tracks = get(doc, 'trk'), + routes = get(doc, 'rte'), + waypoints = get(doc, 'wpt'), + // a feature collection + gj = fc(); + for (i = 0; i < tracks.length; i++) { + gj.features.push(getLinestring(tracks[i], 'trkpt')); + } + for (i = 0; i < routes.length; i++) { + gj.features.push(getLinestring(routes[i], 'rtept')); + } + for (i = 0; i < waypoints.length; i++) { + gj.features.push(getPoint(waypoints[i])); + } + function getLinestring(node, pointname) { + var j, pts = get(node, pointname), line = []; + for (j = 0; j < pts.length; j++) { + line.push(coordPair(pts[j])); + } + return { + type: 'Feature', + properties: getProperties(node), + geometry: { + type: 'LineString', + coordinates: line + } + }; + } + function getPoint(node) { + var prop = getProperties(node); + prop.ele = nodeVal(get1(node, 'ele')); + prop.sym = nodeVal(get1(node, 'sym')); + return { + type: 'Feature', + properties: prop, + geometry: { + type: 'Point', + coordinates: coordPair(node) + } + }; + } + function getProperties(node) { + var meta = ['name', 'desc', 'author', 'copyright', 'link', + 'time', 'keywords'], + prop = {}, + k; + for (k = 0; k < meta.length; k++) { + prop[meta[k]] = nodeVal(get1(node, meta[k])); + } + return clean(prop); + } + return gj; + } + }; + return t; +})(); + +if (typeof module !== 'undefined') module.exports = toGeoJSON; + + try { console.log('done loading togeojson JS'); } catch(e) {} + + window.plugin.overlayKML.load(); +} + +var _fileLayerLoad = null; + +window.plugin.overlayKML.load = function() { + // Provide popup window allow user to select KML to overlay + + L.Icon.Default.imagePath = 'data:image/png;base64,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'; + var KMLIcon = L.icon({ + iconUrl: 'data:image/png;base64,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', + + iconSize: [16, 24], // size of the icon + iconAnchor: [8, 24], // point of the icon which will correspond to marker's location + popupAnchor: [-3, 16] // point from which the popup should open relative to the iconAnchor + }); + + L.Control.FileLayerLoad.LABEL = 'Open'; + _fileLayerLoad = L.Control.fileLayerLoad({ + fitBounds: true, + layerOptions: { + pointToLayer: function (data, latlng) { + return L.marker(latlng, {icon: KMLIcon}); + }}, + }); + _fileLayerLoad.addTo(map); +} + +var setup = function() { + window.plugin.overlayKML.loadExternals(); +} + +// PLUGIN END ////////////////////////////////////////////////////////// + + +setup.info = plugin_info; //add the script info data to the function as a property +if(!window.bootPlugins) window.bootPlugins = []; +window.bootPlugins.push(setup); +// if IITC has already booted, immediately run the 'setup' function +if(window.iitcLoaded && typeof setup === 'function') setup(); +} // wrapper end +// inject code into site context +var script = document.createElement('script'); +var info = {}; +if (typeof GM_info !== 'undefined' && GM_info && GM_info.script) info.script = { version: GM_info.script.version, name: GM_info.script.name, description: GM_info.script.description }; +script.appendChild(document.createTextNode('('+ wrapper +')('+JSON.stringify(info)+');')); +(document.body || document.head || document.documentElement).appendChild(script); + + + diff --git a/mobile/assets/plugins/ap-list.user.js b/mobile/assets/plugins/ap-list.user.js new file mode 100644 index 000000000..7076fc765 --- /dev/null +++ b/mobile/assets/plugins/ap-list.user.js @@ -0,0 +1,19 @@ +// ==UserScript== +// @id iitc-plugin-ap-list@xelio +// @name IITC plugin: AP List +// @category Deleted +// @version 0.5.7.20181030.90244 +// @namespace https://github.com/jonatkins/ingress-intel-total-conversion +// @updateURL none +// @downloadURL none +// @description PLUGIN CURRENTLY UNAVAILABLE +// @include https://*.ingress.com/intel* +// @include http://*.ingress.com/intel* +// @match https://*.ingress.com/intel* +// @match http://*.ingress.com/intel* +// @include https://*.ingress.com/mission/* +// @include http://*.ingress.com/mission/* +// @match https://*.ingress.com/mission/* +// @match http://*.ingress.com/mission/* +// @grant none +// ==/UserScript== diff --git a/mobile/assets/plugins/basemap-bing.user.js b/mobile/assets/plugins/basemap-bing.user.js new file mode 100644 index 000000000..e7bca1027 --- /dev/null +++ b/mobile/assets/plugins/basemap-bing.user.js @@ -0,0 +1,244 @@ +// ==UserScript== +// @id iitc-plugin-bing-maps +// @name IITC plugin: Bing maps +// @category Map Tiles +// @version 0.1.3.20181030.90244 +// @namespace https://github.com/jonatkins/ingress-intel-total-conversion +// @updateURL none +// @downloadURL none +// @description [mobile-2018-10-30-090244] Add the maps.bing.com map layers. +// @include https://*.ingress.com/intel* +// @include http://*.ingress.com/intel* +// @match https://*.ingress.com/intel* +// @match http://*.ingress.com/intel* +// @include https://*.ingress.com/mission/* +// @include http://*.ingress.com/mission/* +// @match https://*.ingress.com/mission/* +// @match http://*.ingress.com/mission/* +// @grant none +// ==/UserScript== + + +function wrapper(plugin_info) { +// ensure plugin framework is there, even if iitc is not yet loaded +if(typeof window.plugin !== 'function') window.plugin = function() {}; + +//PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! +//(leaving them in place might break the 'About IITC' page or break update checks) +plugin_info.buildName = 'mobile'; +plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.pluginId = 'basemap-bing'; +//END PLUGIN AUTHORS NOTE + + + +// PLUGIN START //////////////////////////////////////////////////////// + +window.plugin.mapBing = function() {}; + +window.plugin.mapBing.setupBingLeaflet = function() { +L.BingLayer = L.TileLayer.extend({ + options: { + subdomains: [0, 1, 2, 3], + type: 'Aerial', + attribution: 'Bing', + culture: '' + }, + + initialize: function(key, options) { + L.Util.setOptions(this, options); + + this._key = key; + this._url = null; + this.meta = {}; + this.loadMetadata(); + }, + + tile2quad: function(x, y, z) { + var quad = ''; + for (var i = z; i > 0; i--) { + var digit = 0; + var mask = 1 << (i - 1); + if ((x & mask) != 0) digit += 1; + if ((y & mask) != 0) digit += 2; + quad = quad + digit; + } + return quad; + }, + + getTileUrl: function(p, z) { + var z = this._getZoomForUrl(); + var subdomains = this.options.subdomains, + s = this.options.subdomains[Math.abs((p.x + p.y) % subdomains.length)]; + return this._url.replace('{subdomain}', s) + .replace('{quadkey}', this.tile2quad(p.x, p.y, z)) + .replace('http:', document.location.protocol) + .replace('{culture}', this.options.culture); + }, + + loadMetadata: function() { + //MODIFIED: use browser sessionStorage, if available, to cache the metadata + var _this = this; + var cbid = '_bing_metadata_' + L.Util.stamp(this); + var cachedMetadataKey = '_Leaflet_Bing_metadata_'+this.options.type; + + try { + if (sessionStorage[cachedMetadataKey]) { + this.meta = JSON.parse(sessionStorage[cachedMetadataKey]); + this.initMetadata(); + return; + } + } catch(e) {} + + window[cbid] = function (meta) { + _this.meta = meta; + window[cbid] = undefined; + var e = document.getElementById(cbid); + e.parentNode.removeChild(e); + if (meta.errorDetails) { + if (window.console) console.log("Leaflet Bing Plugin Error - Got metadata: " + meta.errorDetails); + return; + } + try { + sessionStorage[cachedMetadataKey] = JSON.stringify(meta); + } catch(e) {} + _this.initMetadata(); + }; + var url = document.location.protocol + "//dev.virtualearth.net/REST/v1/Imagery/Metadata/" + this.options.type + "?include=ImageryProviders&jsonp=" + cbid + "&key=" + this._key; + var script = document.createElement("script"); + script.type = "text/javascript"; + script.src = url; + script.id = cbid; + document.getElementsByTagName("head")[0].appendChild(script); + }, + + initMetadata: function() { + var r = this.meta.resourceSets[0].resources[0]; + this.options.subdomains = r.imageUrlSubdomains; + this._url = r.imageUrl; + this._providers = []; + if (r.imageryProviders) { + for (var i = 0; i < r.imageryProviders.length; i++) { + var p = r.imageryProviders[i]; + for (var j = 0; j < p.coverageAreas.length; j++) { + var c = p.coverageAreas[j]; + var coverage = {zoomMin: c.zoomMin, zoomMax: c.zoomMax, active: false}; + var bounds = new L.LatLngBounds( + new L.LatLng(c.bbox[0]+0.01, c.bbox[1]+0.01), + new L.LatLng(c.bbox[2]-0.01, c.bbox[3]-0.01) + ); + coverage.bounds = bounds; + coverage.attrib = p.attribution; + this._providers.push(coverage); + } + } + } + this._update(); + }, + + _update: function() { + if (this._url == null || !this._map) return; + this._update_attribution(); + L.TileLayer.prototype._update.apply(this, []); + }, + + _update_attribution: function() { + var bounds = this._map.getBounds(); + var zoom = this._map.getZoom(); + for (var i = 0; i < this._providers.length; i++) { + var p = this._providers[i]; + if ((zoom <= p.zoomMax && zoom >= p.zoomMin) && + bounds.intersects(p.bounds)) { + if (!p.active && this._map.attributionControl) + this._map.attributionControl.addAttribution(p.attrib); + p.active = true; + } else { + if (p.active && this._map.attributionControl) + this._map.attributionControl.removeAttribution(p.attrib); + p.active = false; + } + } + }, + + onRemove: function(map) { + for (var i = 0; i < this._providers.length; i++) { + var p = this._providers[i]; + if (p.active && this._map.attributionControl) { + this._map.attributionControl.removeAttribution(p.attrib); + p.active = false; + } + } + L.TileLayer.prototype.onRemove.apply(this, [map]); + } +}); + +L.bingLayer = function (key, options) { + return new L.BingLayer(key, options); +}; + +} + + +window.plugin.mapBing.setup = function() { + window.plugin.mapBing.setupBingLeaflet(); + + //set this to your API key + var bingApiKey = 'ArR2hTa2C9cRQZT-RmgrDkfvh3PwEVRl0gB34OO4wJI7vQNElg3DDWvbo5lfUs3p'; + + var bingTypes = { + 'Road': "Road", + 'Aerial': "Aerial", + 'AerialWithLabels': "Aerial with labels", + }; + + // bing maps has an annual usage limit, which will likely be hit in 6 months at this time. + // it seems that the usage is counted on initialising the L.BingLayer, when the metadata is retrieved. + // so, we'll create some dummy layers and add those to the map, then, the first time a layer is added, + // create the L.BingLayer. This will eliminate all usage for users who install but don't use the map, + // and only create usage for the map layers actually selected in use + + var bingMapContainers = []; + + for (type in bingTypes) { + var name = bingTypes[type]; + + bingMapContainers[type] = new L.LayerGroup(); + layerChooser.addBaseLayer(bingMapContainers[type], 'Bing '+name); + } + + // now a leaflet event to catch base layer changes and create a L.BingLayer when needed + map.on('baselayerchange', function(e) { + for (type in bingMapContainers) { + if (e.layer == bingMapContainers[type]) { + if (bingMapContainers[type].getLayers().length == 0) { + // dummy layer group is empty - create the bing layer + console.log('basemap-bing: creating '+type+' layer'); + var bingMap = new L.BingLayer (bingApiKey, {type: type, maxNativeZoom: 19, maxZoom: 21}); + bingMapContainers[type].addLayer(bingMap); + } + } + } + }); + +}; + +var setup = window.plugin.mapBing.setup; + +// PLUGIN END ////////////////////////////////////////////////////////// + + + +setup.info = plugin_info; //add the script info data to the function as a property +if(!window.bootPlugins) window.bootPlugins = []; +window.bootPlugins.push(setup); +// if IITC has already booted, immediately run the 'setup' function +if(window.iitcLoaded && typeof setup === 'function') setup(); +} // wrapper end +// inject code into site context +var script = document.createElement('script'); +var info = {}; +if (typeof GM_info !== 'undefined' && GM_info && GM_info.script) info.script = { version: GM_info.script.version, name: GM_info.script.name, description: GM_info.script.description }; +script.appendChild(document.createTextNode('('+ wrapper +')('+JSON.stringify(info)+');')); +(document.body || document.head || document.documentElement).appendChild(script); + + diff --git a/mobile/assets/plugins/basemap-blank.user.js b/mobile/assets/plugins/basemap-blank.user.js new file mode 100644 index 000000000..2a1569f93 --- /dev/null +++ b/mobile/assets/plugins/basemap-blank.user.js @@ -0,0 +1,69 @@ +// ==UserScript== +// @id iitc-plugin-basemap-blank@jonatkins +// @name IITC plugin: Blank map +// @category Map Tiles +// @version 0.1.2.20181030.90244 +// @namespace https://github.com/jonatkins/ingress-intel-total-conversion +// @updateURL none +// @downloadURL none +// @description [mobile-2018-10-30-090244] Add a blank map layer - no roads or other features. +// @include https://*.ingress.com/intel* +// @include http://*.ingress.com/intel* +// @match https://*.ingress.com/intel* +// @match http://*.ingress.com/intel* +// @include https://*.ingress.com/mission/* +// @include http://*.ingress.com/mission/* +// @match https://*.ingress.com/mission/* +// @match http://*.ingress.com/mission/* +// @grant none +// ==/UserScript== + + +function wrapper(plugin_info) { +// ensure plugin framework is there, even if iitc is not yet loaded +if(typeof window.plugin !== 'function') window.plugin = function() {}; + +//PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! +//(leaving them in place might break the 'About IITC' page or break update checks) +plugin_info.buildName = 'mobile'; +plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.pluginId = 'basemap-blank'; +//END PLUGIN AUTHORS NOTE + + + +// PLUGIN START //////////////////////////////////////////////////////// + + +// use own namespace for plugin +window.plugin.mapTileBlank = function() {}; + +window.plugin.mapTileBlank.addLayer = function() { + + var blankOpt = {attribution: '', maxNativeZoom: 18, maxZoom: 21}; + var blankWhite = new L.TileLayer('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gEFCSU6z3A8pwAAAA1JREFUCNdj+P///38ACfsD/dGDjPAAAAAASUVORK5CYII=', blankOpt); + var blankBlack = new L.TileLayer('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gEFCQkJSZE2HwAAAAxJREFUCNdjYGBgAAAABAABJzQnCgAAAABJRU5ErkJggg==', blankOpt); + + layerChooser.addBaseLayer(blankWhite, "Blank Map (White)"); + layerChooser.addBaseLayer(blankBlack, "Blank Map (Black)"); +}; + +var setup = window.plugin.mapTileBlank.addLayer; + +// PLUGIN END ////////////////////////////////////////////////////////// + + +setup.info = plugin_info; //add the script info data to the function as a property +if(!window.bootPlugins) window.bootPlugins = []; +window.bootPlugins.push(setup); +// if IITC has already booted, immediately run the 'setup' function +if(window.iitcLoaded && typeof setup === 'function') setup(); +} // wrapper end +// inject code into site context +var script = document.createElement('script'); +var info = {}; +if (typeof GM_info !== 'undefined' && GM_info && GM_info.script) info.script = { version: GM_info.script.version, name: GM_info.script.name, description: GM_info.script.description }; +script.appendChild(document.createTextNode('('+ wrapper +')('+JSON.stringify(info)+');')); +(document.body || document.head || document.documentElement).appendChild(script); + + diff --git a/mobile/assets/plugins/basemap-gmaps-gray.user.js b/mobile/assets/plugins/basemap-gmaps-gray.user.js new file mode 100644 index 000000000..6837ead0d --- /dev/null +++ b/mobile/assets/plugins/basemap-gmaps-gray.user.js @@ -0,0 +1,79 @@ +// ==UserScript== +// @id iitc-plugin-basemap-gmaps-gray@jacob1123 +// @name IITC plugin: Gray Google Roads +// @category Map Tiles +// @version 0.1.2.20181030.90244 +// @namespace https://github.com/jonatkins/ingress-intel-total-conversion +// @updateURL none +// @downloadURL none +// @description [mobile-2018-10-30-090244] Add a simplified gray Version of Google map tiles as an optional layer. +// @include https://*.ingress.com/intel* +// @include http://*.ingress.com/intel* +// @match https://*.ingress.com/intel* +// @match http://*.ingress.com/intel* +// @include https://*.ingress.com/mission/* +// @include http://*.ingress.com/mission/* +// @match https://*.ingress.com/mission/* +// @match http://*.ingress.com/mission/* +// @grant none +// ==/UserScript== + + +function wrapper(plugin_info) { +// ensure plugin framework is there, even if iitc is not yet loaded +if(typeof window.plugin !== 'function') window.plugin = function() {}; + +//PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! +//(leaving them in place might break the 'About IITC' page or break update checks) +plugin_info.buildName = 'mobile'; +plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.pluginId = 'basemap-gmaps-gray'; +//END PLUGIN AUTHORS NOTE + + + +// PLUGIN START //////////////////////////////////////////////////////// + +// use own namespace for plugin +window.plugin.grayGMaps = function() {}; +window.plugin.grayGMaps.addLayer = function() { + var grayGMapsOptions = { + backgroundColor: '#0e3d4e', //or #dddddd ? - that's the Google tile layer default + styles: [ + {featureType:"landscape.natural",stylers:[{visibility:"simplified"},{saturation:-100},{lightness:-80},{gamma:2.44}]}, + {featureType:"road",stylers:[{visibility:"simplified"},{color:"#bebebe"},{weight:.6}]}, + {featureType:"poi",stylers:[{saturation:-100},{visibility:"on"},{gamma:.14}]}, + {featureType:"water",stylers:[{color:"#32324f"}]}, + {featureType:"transit",stylers:[{visibility:"off"}]}, + {featureType:"road",elementType:"labels",stylers:[{visibility:"off"}]}, + {featureType:"poi",elementType:"labels",stylers:[{visibility:"off"}]}, + {featureType:"poi"}, + {featureType:"landscape.man_made",stylers:[{saturation:-100},{gamma:.13}]}, + {featureType:"water",elementType:"labels",stylers:[{visibility:"off"}]} + ] + }; + + var grayGMaps = new L.Google('ROA#DMAP',{maxZoom:21, mapOptions: grayGMapsOptions}); + + layerChooser.addBaseLayer(grayGMaps, "Google Gray"); +}; + +var setup = window.plugin.grayGMaps.addLayer; + +// PLUGIN END ////////////////////////////////////////////////////////// + + +setup.info = plugin_info; //add the script info data to the function as a property +if(!window.bootPlugins) window.bootPlugins = []; +window.bootPlugins.push(setup); +// if IITC has already booted, immediately run the 'setup' function +if(window.iitcLoaded && typeof setup === 'function') setup(); +} // wrapper end +// inject code into site context +var script = document.createElement('script'); +var info = {}; +if (typeof GM_info !== 'undefined' && GM_info && GM_info.script) info.script = { version: GM_info.script.version, name: GM_info.script.name, description: GM_info.script.description }; +script.appendChild(document.createTextNode('('+ wrapper +')('+JSON.stringify(info)+');')); +(document.body || document.head || document.documentElement).appendChild(script); + + diff --git a/mobile/assets/plugins/basemap-kartverket.user.js b/mobile/assets/plugins/basemap-kartverket.user.js new file mode 100644 index 000000000..f0756063b --- /dev/null +++ b/mobile/assets/plugins/basemap-kartverket.user.js @@ -0,0 +1,72 @@ +// ==UserScript== +// @id iitc-plugin-basemap-kartverket@sollie +// @name IITC plugin: Kartverket.no map tiles +// @category Map Tiles +// @version 0.1.0.20181030.90244 +// @namespace https://github.com/jonatkins/ingress-intel-total-conversion +// @updateURL none +// @downloadURL none +// @description [mobile-2018-10-30-090244] Add the color and grayscale map tiles from Kartverket.no as an optional layer. +// @include https://*.ingress.com/intel* +// @include http://*.ingress.com/intel* +// @match https://*.ingress.com/intel* +// @match http://*.ingress.com/intel* +// @include https://*.ingress.com/mission/* +// @include http://*.ingress.com/mission/* +// @match https://*.ingress.com/mission/* +// @match http://*.ingress.com/mission/* +// @grant none +// ==/UserScript== + + +function wrapper(plugin_info) { +// ensure plugin framework is there, even if iitc is not yet loaded +if(typeof window.plugin !== 'function') window.plugin = function() {}; + +//PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! +//(leaving them in place might break the 'About IITC' page or break update checks) +plugin_info.buildName = 'mobile'; +plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.pluginId = 'basemap-kartverket'; +//END PLUGIN AUTHORS NOTE + + + +// PLUGIN START //////////////////////////////////////////////////////// + + +// use own namespace for plugin +window.plugin.mapTileKartverketMap = function() {}; + +window.plugin.mapTileKartverketMap.addLayer = function() { + + // Map data from Kartverket (http://statkart.no/en/) + kartverketAttribution = 'Map data © Kartverket'; + var kartverketOpt = {attribution: kartverketAttribution, maxNativeZoom: 18, maxZoom: 21, subdomains: ['opencache', 'opencache2', 'opencache3']}; + var kartverketTopo2 = new L.TileLayer('http://{s}.statkart.no/gatekeeper/gk/gk.open_gmaps?layers=topo2&zoom={z}&x={x}&y={y}', kartverketOpt); + var kartverketTopo2Grayscale = new L.TileLayer('http://{s}.statkart.no/gatekeeper/gk/gk.open_gmaps?layers=topo2graatone&zoom={z}&x={x}&y={y}', kartverketOpt); + + layerChooser.addBaseLayer(kartverketTopo2, "Norway Topo"); + layerChooser.addBaseLayer(kartverketTopo2Grayscale, "Norway Topo Grayscale"); +}; + +var setup = window.plugin.mapTileKartverketMap.addLayer; + +// PLUGIN END ////////////////////////////////////////////////////////// + + +setup.info = plugin_info; //add the script info data to the function as a property +if(!window.bootPlugins) window.bootPlugins = []; +window.bootPlugins.push(setup); +// if IITC has already booted, immediately run the 'setup' function +if(window.iitcLoaded && typeof setup === 'function') setup(); +} // wrapper end +// inject code into site context +var script = document.createElement('script'); +var info = {}; +if (typeof GM_info !== 'undefined' && GM_info && GM_info.script) info.script = { version: GM_info.script.version, name: GM_info.script.name, description: GM_info.script.description }; +script.appendChild(document.createTextNode('('+ wrapper +')('+JSON.stringify(info)+');')); +(document.body || document.head || document.documentElement).appendChild(script); + + + diff --git a/mobile/assets/plugins/basemap-mapquest-open-aerial.user.js b/mobile/assets/plugins/basemap-mapquest-open-aerial.user.js new file mode 100644 index 000000000..8208f966d --- /dev/null +++ b/mobile/assets/plugins/basemap-mapquest-open-aerial.user.js @@ -0,0 +1,70 @@ +// ==UserScript== +// @id iitc-plugin-basemap-mapquest-open-aerial@jonatkins +// @name IITC plugin: MapQuest Open Satellite view (US Only) +// @category Map Tiles +// @version 0.1.1.20181030.90244 +// @namespace https://github.com/jonatkins/ingress-intel-total-conversion +// @updateURL none +// @downloadURL none +// @description [mobile-2018-10-30-090244] Add the MapQuest Open Aerial satellite view tiles as a map layer. High detail in the US (lower 48) only. +// @include https://*.ingress.com/intel* +// @include http://*.ingress.com/intel* +// @match https://*.ingress.com/intel* +// @match http://*.ingress.com/intel* +// @include https://*.ingress.com/mission/* +// @include http://*.ingress.com/mission/* +// @match https://*.ingress.com/mission/* +// @match http://*.ingress.com/mission/* +// @grant none +// ==/UserScript== + + +function wrapper(plugin_info) { +// ensure plugin framework is there, even if iitc is not yet loaded +if(typeof window.plugin !== 'function') window.plugin = function() {}; + +//PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! +//(leaving them in place might break the 'About IITC' page or break update checks) +plugin_info.buildName = 'mobile'; +plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.pluginId = 'basemap-mapquest-open-aerial'; +//END PLUGIN AUTHORS NOTE + + + +// PLUGIN START //////////////////////////////////////////////////////// + + +// use own namespace for plugin +window.plugin.mapTileMapQuestSat = function() {}; + +window.plugin.mapTileMapQuestSat.addLayer = function() { + + var mqSubdomains = [ 'otile1','otile2', 'otile3', 'otile4' ]; + var mqTileUrlPrefix = window.location.protocol !== 'https:' ? 'http://{s}.mqcdn.com' : 'https://{s}-s.mqcdn.com'; + //MapQuest satellite coverage outside of the US is rather limited - so not really worth having as we have google as an op! + var mqSatOpt = {attribution: 'Portions Courtesy NASA/JPL-Caltech and U.S. Depart. of Agriculture, Farm Service Agency', maxNativeZoom: 18, maxZoom: 21, subdomains: mqSubdomains}; + var mqSat = new L.TileLayer('http://{s}.mqcdn.com/tiles/1.0.0/sat/{z}/{x}/{y}.jpg',mqSatOpt); + + layerChooser.addBaseLayer(mqSat, "MapQuest Open Satellite"); +}; + +var setup = window.plugin.mapTileMapQuestSat.addLayer; + +// PLUGIN END ////////////////////////////////////////////////////////// + + +setup.info = plugin_info; //add the script info data to the function as a property +if(!window.bootPlugins) window.bootPlugins = []; +window.bootPlugins.push(setup); +// if IITC has already booted, immediately run the 'setup' function +if(window.iitcLoaded && typeof setup === 'function') setup(); +} // wrapper end +// inject code into site context +var script = document.createElement('script'); +var info = {}; +if (typeof GM_info !== 'undefined' && GM_info && GM_info.script) info.script = { version: GM_info.script.version, name: GM_info.script.name, description: GM_info.script.description }; +script.appendChild(document.createTextNode('('+ wrapper +')('+JSON.stringify(info)+');')); +(document.body || document.head || document.documentElement).appendChild(script); + + diff --git a/mobile/assets/plugins/basemap-nokia-ovi.user.js b/mobile/assets/plugins/basemap-nokia-ovi.user.js new file mode 100644 index 000000000..c527912e7 --- /dev/null +++ b/mobile/assets/plugins/basemap-nokia-ovi.user.js @@ -0,0 +1,80 @@ +// ==UserScript== +// @id iitc-plugin-nokia-ovi-maps +// @name IITC plugin: Nokia OVI maps +// @category Map Tiles +// @version 0.1.3.20181030.90244 +// @namespace https://github.com/jonatkins/ingress-intel-total-conversion +// @updateURL none +// @downloadURL none +// @description [mobile-2018-10-30-090244] Add various map layers from Nokia OVI Maps. +// @include https://*.ingress.com/intel* +// @include http://*.ingress.com/intel* +// @match https://*.ingress.com/intel* +// @match http://*.ingress.com/intel* +// @include https://*.ingress.com/mission/* +// @include http://*.ingress.com/mission/* +// @match https://*.ingress.com/mission/* +// @match http://*.ingress.com/mission/* +// @grant none +// ==/UserScript== + + +function wrapper(plugin_info) { +// ensure plugin framework is there, even if iitc is not yet loaded +if(typeof window.plugin !== 'function') window.plugin = function() {}; + +//PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! +//(leaving them in place might break the 'About IITC' page or break update checks) +plugin_info.buildName = 'mobile'; +plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.pluginId = 'basemap-nokia-ovi'; +//END PLUGIN AUTHORS NOTE + + + +// PLUGIN START //////////////////////////////////////////////////////// + +window.plugin.mapNokiaOvi = function() {}; + +window.plugin.mapNokiaOvi.setup = function() { + //the list of styles you'd like to see + var oviStyles = { + 'normal.day': { name: "Normal", type: 'png8' }, + 'normal.day.grey': { name: "Normal (grey)", type: 'png8' }, + 'normal.day.transit': { name: "Normal (transit)", type: 'png8' }, + 'satellite.day': { name: "Satellite", type: 'jpg' }, + 'terrain.day': { name: "Terrain", type: 'png8' }, //would jpg be better? + 'normal.night.grey': { name: "Normal Night (grey)", type: 'png8' }, + }; + + + var oviOpt = {attribution: 'Imagery © Nokia OVI', maxNativeZoom: 20, maxZoom: 21}; + + $.each(oviStyles, function(style,data) { + oviOpt['style'] = style; + oviOpt['type'] = data.type; + var oviMap = new L.TileLayer('http://{s}.maptile.maps.svc.ovi.com/maptiler/maptile/newest/{style}/{z}/{x}/{y}/256/{type}', oviOpt); + layerChooser.addBaseLayer(oviMap, 'Nokia OVI '+data.name); + }); + +}; + +var setup = window.plugin.mapNokiaOvi.setup; + +// PLUGIN END ////////////////////////////////////////////////////////// + + +setup.info = plugin_info; //add the script info data to the function as a property +if(!window.bootPlugins) window.bootPlugins = []; +window.bootPlugins.push(setup); +// if IITC has already booted, immediately run the 'setup' function +if(window.iitcLoaded && typeof setup === 'function') setup(); +} // wrapper end +// inject code into site context +var script = document.createElement('script'); +var info = {}; +if (typeof GM_info !== 'undefined' && GM_info && GM_info.script) info.script = { version: GM_info.script.version, name: GM_info.script.name, description: GM_info.script.description }; +script.appendChild(document.createTextNode('('+ wrapper +')('+JSON.stringify(info)+');')); +(document.body || document.head || document.documentElement).appendChild(script); + + diff --git a/mobile/assets/plugins/basemap-opencyclemap.user.js b/mobile/assets/plugins/basemap-opencyclemap.user.js new file mode 100644 index 000000000..ee59bf5a3 --- /dev/null +++ b/mobile/assets/plugins/basemap-opencyclemap.user.js @@ -0,0 +1,82 @@ +// ==UserScript== +// @id iitc-plugin-basemap-opencyclepam@jonatkins +// @name IITC plugin: OpenCycleMap.org map tiles +// @category Map Tiles +// @version 0.2.0.20181030.90244 +// @namespace https://github.com/jonatkins/ingress-intel-total-conversion +// @updateURL none +// @downloadURL none +// @description [mobile-2018-10-30-090244] Add the OpenCycleMap.org map tiles as an optional layer. +// @include https://*.ingress.com/intel* +// @include http://*.ingress.com/intel* +// @match https://*.ingress.com/intel* +// @match http://*.ingress.com/intel* +// @include https://*.ingress.com/mission/* +// @include http://*.ingress.com/mission/* +// @match https://*.ingress.com/mission/* +// @match http://*.ingress.com/mission/* +// @grant none +// ==/UserScript== + + +function wrapper(plugin_info) { +// ensure plugin framework is there, even if iitc is not yet loaded +if(typeof window.plugin !== 'function') window.plugin = function() {}; + +//PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! +//(leaving them in place might break the 'About IITC' page or break update checks) +plugin_info.buildName = 'mobile'; +plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.pluginId = 'basemap-opencyclemap'; +//END PLUGIN AUTHORS NOTE + + + +// PLUGIN START //////////////////////////////////////////////////////// + + +// use own namespace for plugin +window.plugin.mapTileOpenCycleMap = { + addLayer: function() { + //the Thunderforest (OpenCycleMap) tiles are free to use - http://www.thunderforest.com/terms/ + + var ocmOpt = { + attribution: 'Tiles © OpenCycleMap, Map data © OpenStreetMap', + maxNativeZoom: 18, + maxZoom: 21, + }; + + var layers = { + 'cycle': 'OpenCycleMap', + 'transport': 'Transport', + 'transport-dark': 'Transport Dark', + 'outdoors': 'Outdoors', + 'landscape': 'Landscape', + }; + + for(var i in layers) { + var layer = new L.TileLayer('http://{s}.tile.thunderforest.com/' + i + '/{z}/{x}/{y}.png', ocmOpt); + layerChooser.addBaseLayer(layer, 'Thunderforest ' + layers[i]); + } + }, +}; + +var setup = window.plugin.mapTileOpenCycleMap.addLayer; + +// PLUGIN END ////////////////////////////////////////////////////////// + + +setup.info = plugin_info; //add the script info data to the function as a property +if(!window.bootPlugins) window.bootPlugins = []; +window.bootPlugins.push(setup); +// if IITC has already booted, immediately run the 'setup' function +if(window.iitcLoaded && typeof setup === 'function') setup(); +} // wrapper end +// inject code into site context +var script = document.createElement('script'); +var info = {}; +if (typeof GM_info !== 'undefined' && GM_info && GM_info.script) info.script = { version: GM_info.script.version, name: GM_info.script.name, description: GM_info.script.description }; +script.appendChild(document.createTextNode('('+ wrapper +')('+JSON.stringify(info)+');')); +(document.body || document.head || document.documentElement).appendChild(script); + + diff --git a/mobile/assets/plugins/basemap-openstreetmap.user.js b/mobile/assets/plugins/basemap-openstreetmap.user.js new file mode 100644 index 000000000..d98cf01e0 --- /dev/null +++ b/mobile/assets/plugins/basemap-openstreetmap.user.js @@ -0,0 +1,80 @@ +// ==UserScript== +// @id iitc-plugin-basemap-openstreetpam@jonatkins +// @name IITC plugin: OpenStreetMap.org map tiles +// @category Map Tiles +// @version 0.1.1.20181030.90244 +// @namespace https://github.com/jonatkins/ingress-intel-total-conversion +// @updateURL none +// @downloadURL none +// @description [mobile-2018-10-30-090244] Add the native OpenStreetMap.org map tiles as an optional layer. +// @include https://*.ingress.com/intel* +// @include http://*.ingress.com/intel* +// @match https://*.ingress.com/intel* +// @match http://*.ingress.com/intel* +// @include https://*.ingress.com/mission/* +// @include http://*.ingress.com/mission/* +// @match https://*.ingress.com/mission/* +// @match http://*.ingress.com/mission/* +// @grant none +// ==/UserScript== + + +function wrapper(plugin_info) { +// ensure plugin framework is there, even if iitc is not yet loaded +if(typeof window.plugin !== 'function') window.plugin = function() {}; + +//PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! +//(leaving them in place might break the 'About IITC' page or break update checks) +plugin_info.buildName = 'mobile'; +plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.pluginId = 'basemap-openstreetmap'; +//END PLUGIN AUTHORS NOTE + + + +// PLUGIN START //////////////////////////////////////////////////////// + + +// use own namespace for plugin +window.plugin.mapTileOpenStreetMap = { + addLayer: function() { + // OpenStreetMap tiles - we shouldn't use these by default - https://wiki.openstreetmap.org/wiki/Tile_usage_policy + // "Heavy use (e.g. distributing an app that uses tiles from openstreetmap.org) is forbidden without prior permission from the System Administrators" + + var osmOpt = { + attribution: 'Map data © OpenStreetMap contributors', + maxNativeZoom: 18, + maxZoom: 21, + }; + + var layers = { + 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png': 'OpenStreetMap', + 'https://{s}.tile.openstreetmap.fr/hot/{z}/{x}/{y}.png': 'Humanitarian', + }; + + for(var url in layers) { + var layer = new L.TileLayer(url, osmOpt); + layerChooser.addBaseLayer(layer, layers[url]); + } + }, +}; + +var setup = window.plugin.mapTileOpenStreetMap.addLayer; + +// PLUGIN END ////////////////////////////////////////////////////////// + + +setup.info = plugin_info; //add the script info data to the function as a property +if(!window.bootPlugins) window.bootPlugins = []; +window.bootPlugins.push(setup); +// if IITC has already booted, immediately run the 'setup' function +if(window.iitcLoaded && typeof setup === 'function') setup(); +} // wrapper end +// inject code into site context +var script = document.createElement('script'); +var info = {}; +if (typeof GM_info !== 'undefined' && GM_info && GM_info.script) info.script = { version: GM_info.script.version, name: GM_info.script.name, description: GM_info.script.description }; +script.appendChild(document.createTextNode('('+ wrapper +')('+JSON.stringify(info)+');')); +(document.body || document.head || document.documentElement).appendChild(script); + + diff --git a/mobile/assets/plugins/basemap-stamen.user.js b/mobile/assets/plugins/basemap-stamen.user.js new file mode 100644 index 000000000..e504451dd --- /dev/null +++ b/mobile/assets/plugins/basemap-stamen.user.js @@ -0,0 +1,98 @@ +// ==UserScript== +// @id iitc-plugin-basemap-stamen@jonatkins +// @name IITC plugin: Map layers from stamen.com +// @category Map Tiles +// @version 0.2.0.20181030.90244 +// @namespace https://github.com/jonatkins/ingress-intel-total-conversion +// @updateURL none +// @downloadURL none +// @description [mobile-2018-10-30-090244] Add the 'Toner' and 'Watercolor' map layers from maps.stamen.com. +// @include https://*.ingress.com/intel* +// @include http://*.ingress.com/intel* +// @match https://*.ingress.com/intel* +// @match http://*.ingress.com/intel* +// @include https://*.ingress.com/mission/* +// @include http://*.ingress.com/mission/* +// @match https://*.ingress.com/mission/* +// @match http://*.ingress.com/mission/* +// @grant none +// ==/UserScript== + + +function wrapper(plugin_info) { +// ensure plugin framework is there, even if iitc is not yet loaded +if(typeof window.plugin !== 'function') window.plugin = function() {}; + +//PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! +//(leaving them in place might break the 'About IITC' page or break update checks) +plugin_info.buildName = 'mobile'; +plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.pluginId = 'basemap-stamen'; +//END PLUGIN AUTHORS NOTE + + + +// PLUGIN START //////////////////////////////////////////////////////// + + +// use own namespace for plugin +window.plugin.mapTileStamen = function() {}; + + +window.plugin.mapTileStamen.addLayer = function() { + + var types = { + 'toner': [ 'Toner', 'png', 0, 20 ], +// 'toner-hybrid': [ ' Toner Hybrid', 'png', 0, 20 ], // transparent layer. could be useful over satellite imagery or similar +// 'toner-labels': [ 'Toner Labels', 'png', 0, 20 ], // transparent layer. could be useful over satellite imagery or similar +// 'toner-lines': [ 'Toner Lines', 'png', 0, 20 ], // transparent layer. could be useful over satellite imagery or similar + 'toner-background': [ 'Toner Background', 'png', 0, 20 ], + 'toner-lite': [ 'Toner Lite', 'png', 0, 20 ], + 'watercolor': [ 'Watercolor', 'jpg', 1, 16 ], + }; + + var baseUrl = window.location.protocol == 'https:' ? 'https://stamen-tiles-{s}.a.ssl.fastly.net/' : 'http://{s}.tile.stamen.com/'; + + + for (var layer in types) { + var info = types[layer]; + + var name = info[0]; + var type = info[1]; + var minZoom = info[2]; + var maxZoom = info[3]; + + var mapLayer = new L.TileLayer (baseUrl+'{layer}/{z}/{x}/{y}.{type}', { + attribution: 'Map tiles by Stamen Design, under CC BY 3.0. Data by OpenStreetMap, under CC BY SA.', + subdomains: 'abcd', + layer: layer, + type: type, + minZoom: minZoom, + maxNativeZoom: maxZoom, + maxZoom: 21 + }); + + layerChooser.addBaseLayer(mapLayer,'Stamen '+name); + } + +}; + +var setup = window.plugin.mapTileStamen.addLayer; + +// PLUGIN END ////////////////////////////////////////////////////////// + + +setup.info = plugin_info; //add the script info data to the function as a property +if(!window.bootPlugins) window.bootPlugins = []; +window.bootPlugins.push(setup); +// if IITC has already booted, immediately run the 'setup' function +if(window.iitcLoaded && typeof setup === 'function') setup(); +} // wrapper end +// inject code into site context +var script = document.createElement('script'); +var info = {}; +if (typeof GM_info !== 'undefined' && GM_info && GM_info.script) info.script = { version: GM_info.script.version, name: GM_info.script.name, description: GM_info.script.description }; +script.appendChild(document.createTextNode('('+ wrapper +')('+JSON.stringify(info)+');')); +(document.body || document.head || document.documentElement).appendChild(script); + + diff --git a/mobile/assets/plugins/basemap-yandex.user.js b/mobile/assets/plugins/basemap-yandex.user.js new file mode 100644 index 000000000..7c9ef0d8a --- /dev/null +++ b/mobile/assets/plugins/basemap-yandex.user.js @@ -0,0 +1,268 @@ +// ==UserScript== +// @id iitc-plugin-basemap-yandex@jonatkins +// @name IITC plugin: Yandex maps +// @category Map Tiles +// @version 0.2.0.20181030.90244 +// @namespace https://github.com/jonatkins/ingress-intel-total-conversion +// @updateURL none +// @downloadURL none +// @description [mobile-2018-10-30-090244] Add Yandex.com (Russian/Русский) map layers +// @include https://*.ingress.com/intel* +// @include http://*.ingress.com/intel* +// @match https://*.ingress.com/intel* +// @match http://*.ingress.com/intel* +// @include https://*.ingress.com/mission/* +// @include http://*.ingress.com/mission/* +// @match https://*.ingress.com/mission/* +// @match http://*.ingress.com/mission/* +// @grant none +// ==/UserScript== + + +function wrapper(plugin_info) { +// ensure plugin framework is there, even if iitc is not yet loaded +if(typeof window.plugin !== 'function') window.plugin = function() {}; + +//PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! +//(leaving them in place might break the 'About IITC' page or break update checks) +plugin_info.buildName = 'mobile'; +plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.pluginId = 'basemap-yandex'; +//END PLUGIN AUTHORS NOTE + + + +// PLUGIN START //////////////////////////////////////////////////////// + + +// use own namespace for plugin +window.plugin.mapTileYandex = function() {}; + +window.plugin.mapTileYandex.leafletSetup = function() { + +//include Yandex.js start +/* + * L.TileLayer is used for standard xyz-numbered tile layers. + */ +//(function (ymaps, L) { + +L.Yandex = L.Class.extend({ + includes: L.Mixin.Events, + + options: { + minZoom: 0, + maxZoom: 18, + attribution: '', + opacity: 1, + traffic: false + }, + + // Possible types: map, satellite, hybrid, publicMap, publicMapHybrid + initialize: function(type, options) { + L.Util.setOptions(this, options); + + this._type = "yandex#" + (type || 'map'); + }, + + onAdd: function(map, insertAtTheBottom) { + this._map = map; + this._insertAtTheBottom = insertAtTheBottom; + + // create a container div for tiles + this._initContainer(); + this._initMapObject(); + + // set up events + map.on('viewreset', this._resetCallback, this); + + this._limitedUpdate = L.Util.limitExecByInterval(this._update, 150, this); + map.on('move', this._update, this); + + map._controlCorners['bottomright'].style.marginBottom = "3em"; + + this._reset(); + this._update(true); + }, + + onRemove: function(map) { + this._map._container.removeChild(this._container); + + this._map.off('viewreset', this._resetCallback, this); + + this._map.off('move', this._update, this); + + map._controlCorners['bottomright'].style.marginBottom = "0em"; + }, + + getAttribution: function() { + return this.options.attribution; + }, + + setOpacity: function(opacity) { + this.options.opacity = opacity; + if (opacity < 1) { + L.DomUtil.setOpacity(this._container, opacity); + } + }, + + setElementSize: function(e, size) { + e.style.width = size.x + "px"; + e.style.height = size.y + "px"; + }, + + _initContainer: function() { + var tilePane = this._map._container, + first = tilePane.firstChild; + + if (!this._container) { + this._container = L.DomUtil.create('div', 'leaflet-yandex-layer leaflet-top leaflet-left'); + this._container.id = "_YMapContainer_" + L.Util.stamp(this); + this._container.style.zIndex = "auto"; + } + + if (this.options.overlay) { + first = this._map._container.getElementsByClassName('leaflet-map-pane')[0]; + first = first.nextSibling; + // XXX: Bug with layer order + if (L.Browser.opera) + this._container.className += " leaflet-objects-pane"; + } + tilePane.insertBefore(this._container, first); + + this.setOpacity(this.options.opacity); + this.setElementSize(this._container, this._map.getSize()); + }, + + _initMapObject: function() { + if (this._yandex) return; + + // Check that ymaps.Map is ready + if (ymaps.Map === undefined) { + if (console) { + console.debug("L.Yandex: Waiting on ymaps.load('package.map')"); + } + return ymaps.load(["package.map"], this._initMapObject, this); + } + + // If traffic layer is requested check if control.TrafficControl is ready + if (this.options.traffic) + if (ymaps.control === undefined || + ymaps.control.TrafficControl === undefined) { + if (console) { + console.debug("L.Yandex: loading traffic and controls"); + } + return ymaps.load(["package.traffic", "package.controls"], + this._initMapObject, this); + } + + var map = new ymaps.Map(this._container, {center: [0,0], zoom: 0, behaviors: []}); + + if (this.options.traffic) + map.controls.add(new ymaps.control.TrafficControl({shown: true})); + + if (this._type == "yandex#null") { + this._type = new ymaps.MapType("null", []); + map.container.getElement().style.background = "transparent"; + } + map.setType(this._type); + + this._yandex = map; + this._update(true); + }, + + _resetCallback: function(e) { + this._reset(e.hard); + }, + + _reset: function(clearOldContainer) { + this._initContainer(); + }, + + _update: function(force) { + if (!this._yandex) return; + this._resize(force); + + var center = this._map.getCenter(); + var _center = [center.lat, center.lng]; + var zoom = this._map.getZoom(); + + if (force || this._yandex.getZoom() != zoom) + this._yandex.setZoom(zoom); + this._yandex.panTo(_center, {duration: 0, delay: 0}); + }, + + _resize: function(force) { + var size = this._map.getSize(), style = this._container.style; + if (style.width == size.x + "px" && + style.height == size.y + "px") + if (force != true) return; + this.setElementSize(this._container, size); + var b = this._map.getBounds(), sw = b.getSouthWest(), ne = b.getNorthEast(); + this._yandex.container.fitToViewport(); + } +}); +//})(ymaps, L) + +//include Yandex.js end + +} + + + +window.plugin.mapTileYandex.setup = function() { + + var yStyles = { + 'map': "Map", + 'satellite': "Satellite", + 'hybrid': "Hybrid", +// 'publicMap': "Public Map", +// 'publicMapHybrid': "Public Hybrid", + }; + + + // we can't directly create the L.Yandex object, as we need to async load the yandex map API + // so we'll add empty layer groups, then in the callback we can add the yandex layers to the layer groups + var layers = {}; + + $.each(yStyles, function(key,value) { + layers[key] = new L.LayerGroup(); + layerChooser.addBaseLayer(layers[key], 'Yandex '+value); + }); + + var callback = function() { + window.plugin.mapTileYandex.leafletSetup(); + var yOpt = {maxZoom: 18}; + $.each(layers, function(key,layer) { + var yMap = new L.Yandex(key, yOpt); + layer.addLayer(yMap); + }); + } + + +//a few options on language are available, including en-US. Oddly, the detail available on the maps varies +//depending on the language + var yandexApiJs = '//api-maps.yandex.ru/2.0-stable/?load=package.standard&lang=ru-RU' + + load(yandexApiJs).thenRun(callback); +} + + +var setup = window.plugin.mapTileYandex.setup; + +// PLUGIN END ////////////////////////////////////////////////////////// + + +setup.info = plugin_info; //add the script info data to the function as a property +if(!window.bootPlugins) window.bootPlugins = []; +window.bootPlugins.push(setup); +// if IITC has already booted, immediately run the 'setup' function +if(window.iitcLoaded && typeof setup === 'function') setup(); +} // wrapper end +// inject code into site context +var script = document.createElement('script'); +var info = {}; +if (typeof GM_info !== 'undefined' && GM_info && GM_info.script) info.script = { version: GM_info.script.version, name: GM_info.script.name, description: GM_info.script.description }; +script.appendChild(document.createTextNode('('+ wrapper +')('+JSON.stringify(info)+');')); +(document.body || document.head || document.documentElement).appendChild(script); + + diff --git a/mobile/assets/plugins/bookmarks-by-zaso.user.js b/mobile/assets/plugins/bookmarks-by-zaso.user.js new file mode 100644 index 000000000..9dd7fa4dc --- /dev/null +++ b/mobile/assets/plugins/bookmarks-by-zaso.user.js @@ -0,0 +1,1343 @@ +// ==UserScript== +// @id iitc-plugin-bookmarks@ZasoGD +// @name IITC plugin: Bookmarks for maps and portals +// @category Controls +// @version 0.2.12.20181030.90244 +// @namespace https://github.com/jonatkins/ingress-intel-total-conversion +// @updateURL none +// @downloadURL none +// @description [mobile-2018-10-30-090244] Save your favorite Maps and Portals and move the intel map with a click. Works with sync. +// @include https://*.ingress.com/intel* +// @include http://*.ingress.com/intel* +// @match https://*.ingress.com/intel* +// @match http://*.ingress.com/intel* +// @include https://*.ingress.com/mission/* +// @include http://*.ingress.com/mission/* +// @match https://*.ingress.com/mission/* +// @match http://*.ingress.com/mission/* +// @grant none +// ==/UserScript== + + +function wrapper(plugin_info) { +// ensure plugin framework is there, even if iitc is not yet loaded +if(typeof window.plugin !== 'function') window.plugin = function() {}; + +//PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! +//(leaving them in place might break the 'About IITC' page or break update checks) +plugin_info.buildName = 'mobile'; +plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.pluginId = 'bookmarks-by-zaso'; +//END PLUGIN AUTHORS NOTE + + + +// PLUGIN START //////////////////////////////////////////////////////// +/*********************************************************************** + + 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); + - pluginBkmrksSyncEnd: fired when the sync is finished; + +***********************************************************************/ +//////////////////////////////////////////////////////////////////////// + + // 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.IDcount = 0; + + window.plugin.bookmarks.enableSync = false; + + window.plugin.bookmarks.starLayers = {}; + window.plugin.bookmarks.starLayerGroup = null; + + 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().toString() + window.plugin.bookmarks.IDcount.toString() + (Math.floor(Math.random()*99)+1); + window.plugin.bookmarks.IDcount++; + 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').css('height', 'auto'); + $('#bkmrksTrigger').css('height', '0'); + } else { + $('#bkmrksTrigger').css('height', '64px'); + $('#bookmarksBox').css('height', '0'); + } + + window.plugin.bookmarks.statusBox['show'] = newStatus; + window.plugin.bookmarks.saveStorageBox(); + } + + window.plugin.bookmarks.onPaneChanged = function(pane) { + if(pane == "plugin-bookmarks") + $('#bookmarksBox').css("display", ""); + else + $('#bookmarksBox').css("display", "none"); + } + + // 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', {"target": "folder", "action": newFlag?"open":"close", "id": ID}); + } + + // 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+''; + + // 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 {"id_folder":idFolders,"id_bookmark":idBkmrk}; + } + } + } + return; + } + + // Append a 'star' flag in sidebar. + window.plugin.bookmarks.onPortalSelectedPending = false; + window.plugin.bookmarks.onPortalSelected = function() { + $('.bkmrksStar').remove(); + + if(window.selectedPortal == null) return; + + if (!window.plugin.bookmarks.onPortalSelectedPending) { + window.plugin.bookmarks.onPortalSelectedPending = true; + + setTimeout(function() { // the sidebar is constructed after firing the hook + window.plugin.bookmarks.onPortalSelectedPending = false; + + $('.bkmrksStar').remove(); + + if(typeof(Storage) === "undefined") { + $('#portaldetails > .imgpreview').after(plugin.bookmarks.htmlDisabledMessage); + return; + } + + // 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(); + }, 0); + } + + } + + // 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_bookmark']+' a.bookmarksLink').addClass('selected'); + $('.bkmrksStar').addClass('favorite'); + } + } + } + + // Switch the status of the star + window.plugin.bookmarks.switchStarPortal = function(guid) { + if(guid == undefined) guid = window.selectedPortal; + + // If portal is saved in bookmarks: Remove this bookmark + var bkmrkData = window.plugin.bookmarks.findByGuid(guid); + if(bkmrkData) { + var list = window.plugin.bookmarks.bkmrksObj['portals']; + delete list[bkmrkData['id_folder']]['bkmrk'][bkmrkData['id_bookmark']]; + $('.bkmrk#'+bkmrkData['id_bookmark']+'').remove(); + + window.plugin.bookmarks.saveStorage(); + window.plugin.bookmarks.updateStarPortal(); + + window.runHooks('pluginBkmrksEdit', {"target": "portal", "action": "remove", "folder": bkmrkData['id_folder'], "id": bkmrkData['id_bookmark'], "guid":guid}); + console.log('BOOKMARKS: removed portal ('+bkmrkData['id_bookmark']+' situated in '+bkmrkData['id_folder']+' folder)'); + } + // If portal isn't saved in bookmarks: Add this bookmark + else{ + // Get portal name and coordinates + var p = window.portals[guid]; + var ll = p.getLatLng(); + plugin.bookmarks.addPortalBookmark(guid, ll.lat+','+ll.lng, p.options.data.title); + } + } + + plugin.bookmarks.addPortalBookmark = function(guid, latlng, label) { + 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.plugin.bookmarks.refreshBkmrks(); + window.runHooks('pluginBkmrksEdit', {"target": "portal", "action": "add", "id": ID, "guid": guid}); + console.log('BOOKMARKS: added portal '+ID); + } + + // 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.plugin.bookmarks.refreshBkmrks(); + window.runHooks('pluginBkmrksEdit', {"target": type, "action": "add", "id": ID}); + console.log('BOOKMARKS: added '+type+' '+ID); + } + + // 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'); + var guid = window.plugin.bookmarks.bkmrksObj[typeList.replace('bkmrk_', '')][IDfold]['bkmrk'][ID].guid; + + delete window.plugin.bookmarks.bkmrksObj[typeList.replace('bkmrk_', '')][IDfold]['bkmrk'][ID]; + $(elem).parent('li').remove(); + + if(type === 'portals') { + var list = window.plugin.bookmarks.bkmrksObj['portals']; + + window.plugin.bookmarks.updateStarPortal(); + window.plugin.bookmarks.saveStorage(); + + window.runHooks('pluginBkmrksEdit', {"target": "portal", "action": "remove", "folder": IDfold, "id": ID, "guid": guid}); + console.log('BOOKMARKS: removed portal ('+ID+' situated in '+IDfold+' folder)'); + } else { + window.plugin.bookmarks.saveStorage(); + window.runHooks('pluginBkmrksEdit', {"target": "map", "action": "remove", "id": ID}); + console.log('BOOKMARKS: removed map '+ID); + } + } + 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.plugin.bookmarks.updateStarPortal(); + window.runHooks('pluginBkmrksEdit', {"target": "folder", "action": "remove", "id": ID}); + console.log('BOOKMARKS: removed folder '+ID); + } + } + + window.plugin.bookmarks.deleteMode = function() { + $('#bookmarksBox').removeClass('moveMode').toggleClass('deleteMode'); + } + + window.plugin.bookmarks.moveMode = function() { + $('#bookmarksBox').removeClass('deleteMode').toggleClass('moveMode'); + } + + window.plugin.bookmarks.mobileSortIDb = ''; + window.plugin.bookmarks.mobileSortIDf = ''; + window.plugin.bookmarks.dialogMobileSort = function(type, elem){ + window.plugin.bookmarks.mobileSortIDb = $(elem).parent('li.bkmrk').attr('id'); + window.plugin.bookmarks.mobileSortIDf = $(elem).parent('li.bkmrk').parent('ul').parent('li.bookmarkFolder').attr('id'); + + if(type === 'maps'){ type = 1; } + else if(type === 'portals'){ type = 2; } + + dialog({ + html: window.plugin.bookmarks.dialogLoadListFolders('bookmarksDialogMobileSort', 'window.plugin.bookmarks.mobileSort', true, type), + dialogClass: 'ui-dialog-bkmrksSet-copy', + title: 'Bookmarks - Move Bookmark' + }); + } + + window.plugin.bookmarks.mobileSort = function(elem){ + var type = $(elem).data('type'); + var idBkmrk = window.plugin.bookmarks.mobileSortIDb; + var newFold = $(elem).data('id'); + var oldFold = window.plugin.bookmarks.mobileSortIDf; + + var Bkmrk = window.plugin.bookmarks.bkmrksObj[type][oldFold].bkmrk[idBkmrk]; + + delete window.plugin.bookmarks.bkmrksObj[type][oldFold].bkmrk[idBkmrk]; + + window.plugin.bookmarks.bkmrksObj[type][newFold].bkmrk[idBkmrk] = Bkmrk; + + window.plugin.bookmarks.saveStorage(); + window.plugin.bookmarks.refreshBkmrks(); + window.runHooks('pluginBkmrksEdit', {"target": "bookmarks", "action": "sort"}); + window.plugin.bookmarks.mobileSortIDf = newFold; + console.log('Move Bookmarks '+type+' ID:'+idBkmrk+' from folder ID:'+oldFold+' to folder ID:'+newFold); + } + + window.plugin.bookmarks.onSearch = function(query) { + var term = query.term.toLowerCase(); + + $.each(plugin.bookmarks.bkmrksObj.maps, function(id, folder) { + $.each(folder.bkmrk, function(id, bookmark) { + if(bookmark.label.toLowerCase().indexOf(term) === -1) return; + + query.addResult({ + title: escapeHtmlSpecialChars(bookmark.label), + description: 'Map in folder "' + escapeHtmlSpecialChars(folder.label) + '"', + icon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAADYSURBVCiRldExLoRxEAXw33xZ4QIKB9BQWPl0yFKJA4hCo1CqXMABVA6gcgkFnc7/s7VQaByAgoYdhU3sZr9NmGSaee/NvJeJUkr6R3WgrusYm/ajJ7zr5t3ouGmarFrXpFPpuA2aFDSxIWxjXz/mWy25jx3hEAsqS0NsFi/68YxHlXPK8MKbGwR6GN06g0XhwYrrX0tb+enJAS5b8pzp5gk5GM+wl1/C1YQgfEwPPbA+JN3iAgMsTxeEOWlXNzet5pHKGl7HOKWUzEx/6VJKdvj54IT3KfUNvrNZ/jYm+uoAAAAASUVORK5CYII=', + position: L.latLng(bookmark.latlng.split(",")), + zoom: bookmark.z, + onSelected: window.plugin.bookmarks.onSearchResultSelected, + }); + }); + }); + + $.each(plugin.bookmarks.bkmrksObj.portals, function(id, folder) { + $.each(folder.bkmrk, function(id, bookmark) { + if(bookmark.label.toLowerCase().indexOf(term) === -1) return; + + query.addResult({ + title: escapeHtmlSpecialChars(bookmark.label), + description: 'Bookmark in folder "' + escapeHtmlSpecialChars(folder.label) + '"', + icon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAADFSURBVCiRrdEtTkMBEATgb19C0gsgEEgMFW2TooAURzgACoNAorgAB6jqAVBcghBQYPmxBAQeBYYQ4C2CJvTlPUibMG53ZpKZ3chMs6Bo3N7EwG2sTG9Ih9J+ExW1SFexpnCBNyzq5VPdcB2bwi4WsIz5Mf+OR9wrjHTy9DvSi3MEBhNimMOScKfj7KfDRn54sIPjhj5D3Twgy2rp7fwUTuotvU6O1SuVVseiSxyhRPt3Q2hJW7q5rpd7Cn08VyT/8+k/8AVY7Dd1pA43RAAAAABJRU5ErkJggg==', + position: L.latLng(bookmark.latlng.split(",")), + guid: bookmark.guid, + onSelected: window.plugin.bookmarks.onSearchResultSelected, + }); + }); + }); + }; + + window.plugin.bookmarks.onSearchResultSelected = function(result, event) { + if(result.guid) { // portal + var guid = result.guid; + if(event.type == 'dblclick') + zoomToAndShowPortal(guid, result.position); + else if(window.portals[guid]) + renderPortalDetails(guid); + else + window.selectPortalByLatLng(result.position); + } else if(result.zoom) { // map + map.setView(result.position, result.zoom); + } + return true; // prevent default behavior + }; + +/***************************************************************************************************************************************************************/ + + // 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', {"target": "folder", "action": "sort"}); + console.log('BOOKMARKS: sorted folder'); + } + + // 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', {"target": "bookmarks", "action": "sort"}); + console.log('BOOKMARKS: sorted bookmark (portal/map)'); + } + + window.plugin.bookmarks.jquerySortableScript = function() { + $(".bookmarkList > ul").sortable({ + items:"li.bookmarkFolder:not(.othersBookmarks)", + handle:".bookmarksAnchor", + placeholder:"sortable-placeholder", + helper:'clone', // fix accidental click in firefox + 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", + helper:'clone', // fix accidental click in firefox + 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' + }); + + 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.shareString) { + return android.shareString(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.optExport = function() { + if(typeof android !== 'undefined' && android && android.saveFile) { + android.saveFile("IITC-bookmarks.json", "application/json", localStorage[window.plugin.bookmarks.KEY_STORAGE]); + } + } + + window.plugin.bookmarks.optPaste = function() { + var promptAction = prompt('Press CTRL+V to paste it.', ''); + if(promptAction !== null && promptAction !== '') { + try { + JSON.parse(promptAction); // try to parse JSON first + localStorage[window.plugin.bookmarks.KEY_STORAGE] = promptAction; + window.plugin.bookmarks.refreshBkmrks(); + window.runHooks('pluginBkmrksEdit', {"target": "all", "action": "import"}); + console.log('BOOKMARKS: reset and imported bookmarks'); + window.plugin.bookmarks.optAlert('Successful. '); + } catch(e) { + console.warn('BOOKMARKS: failed to import data: '+e); + window.plugin.bookmarks.optAlert('Import failed '); + } + } + } + + window.plugin.bookmarks.optImport = function() { + if (window.requestFile === undefined) return; + window.requestFile(function(filename, content) { + try { + JSON.parse(content); // try to parse JSON first + localStorage[window.plugin.bookmarks.KEY_STORAGE] = content; + window.plugin.bookmarks.refreshBkmrks(); + window.runHooks('pluginBkmrksEdit', {"target": "all", "action": "import"}); + console.log('BOOKMARKS: reset and imported bookmarks'); + window.plugin.bookmarks.optAlert('Successful. '); + } catch(e) { + console.warn('BOOKMARKS: failed to import data: '+e); + window.plugin.bookmarks.optAlert('Import failed '); + } + }); + } + + window.plugin.bookmarks.optReset = function() { + var promptAction = confirm('All bookmarks will be deleted. Are you sure?', ''); + if(promptAction) { + delete localStorage[window.plugin.bookmarks.KEY_STORAGE]; + window.plugin.bookmarks.createStorage(); + window.plugin.bookmarks.loadStorage(); + window.plugin.bookmarks.refreshBkmrks(); + window.runHooks('pluginBkmrksEdit', {"target": "all", "action": "reset"}); + console.log('BOOKMARKS: reset all bookmarks'); + window.plugin.bookmarks.optAlert('Successful. '); + } + } + + 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. '); + } + } + + window.plugin.bookmarks.dialogLoadListFolders = function(idBox, clickAction, showOthersF, scanType/*0 = maps&portals; 1 = maps; 2 = portals*/) { + var list = JSON.parse(localStorage['plugin-bookmarks']); + var listHTML = ''; + var foldHTML = ''; + var elemGenericFolder = ''; + + // For each type and folder + for(var type in list){ + if(scanType === 0 || (scanType === 1 && type === 'maps') || (scanType === 2 && type === 'portals')){ + listHTML += '

    '+type+':

    '; + + for(var idFolders in list[type]) { + var label = list[type][idFolders]['label']; + + // Create a folder + foldHTML = '
    '+label+'
    '; + + if(idFolders !== window.plugin.bookmarks.KEY_OTHER_BKMRK) { + listHTML += foldHTML; + } else { + if(showOthersF === true){ + elemGenericFolder = foldHTML; + } + } + } + } + listHTML += elemGenericFolder; + elemGenericFolder = ''; + } + + // Append all folders + var r = '
    ' + + listHTML + + '
    '; + + return r; + } + + window.plugin.bookmarks.renameFolder = function(elem){ + var type = $(elem).data('type'); + var idFold = $(elem).data('id'); + + var promptAction = prompt('Insert a new name.', ''); + if(promptAction !== null && promptAction !== '') { + try { + var newName = window.plugin.bookmarks.escapeHtml(promptAction); + + window.plugin.bookmarks.bkmrksObj[type][idFold].label = newName; + $('#bookmarksDialogRenameF #'+idFold).text(newName); + window.plugin.bookmarks.saveStorage(); + window.plugin.bookmarks.refreshBkmrks(); + window.runHooks('pluginBkmrksEdit', {"target": "all", "action": "import"}); + + console.log('BOOKMARKS: renamed bookmarks folder'); + window.plugin.bookmarks.optAlert('Successful. '); + } catch(e) { + console.warn('BOOKMARKS: failed to rename folder: '+e); + window.plugin.bookmarks.optAlert('Rename failed '); + return; + } + } + } + + window.plugin.bookmarks.optRenameF = function() { + dialog({ + html: window.plugin.bookmarks.dialogLoadListFolders('bookmarksDialogRenameF', 'window.plugin.bookmarks.renameFolder', false, 0), + dialogClass: 'ui-dialog-bkmrksSet-copy', + title: 'Bookmarks Rename Folder' + }); + } + +/***************************************************************************************************************************************************************/ +/** AUTO DRAW **************************************************************************************************************************************************/ +/***************************************************************************************************************************************************************/ + 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(0); + }, + 'DRAW&VIEW': function() { + window.plugin.bookmarks.draw(1); + } + } + }); + window.plugin.bookmarks.autoDrawOnSelect(); + } + + window.plugin.bookmarks.draw = function(view) { + 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) { + // TODO: add an API to draw-tools rather than assuming things about its internals + + var layer, layerType; + if(latlngs.length == 2) { + layer = L.geodesicPolyline(latlngs, window.plugin.drawTools.lineOptions); + layerType = 'polyline'; + } else { + layer = L.geodesicPolygon(latlngs, window.plugin.drawTools.polygonOptions); + layerType = 'polygon'; + } + + map.fire('draw:created', { + layer: layer, + layerType: layerType + }); + + if($('#bkmrkClearSelection').prop('checked')) + $('#bkmrksAutoDrawer a.bkmrk.selected').removeClass('selected'); + + if(window.plugin.bookmarks.isSmart) { + window.show('map'); + } + + // Shown the layer if it is hidden + if(!map.hasLayer(window.plugin.drawTools.drawnItems)) { + map.addLayer(window.plugin.drawTools.drawnItems); + } + + if(view) { + map.fitBounds(layer.getBounds()); + } + } + } + + window.plugin.bookmarks.autoDrawOnSelect = function() { + var latlngs = []; + var uuu = $('#bkmrksAutoDrawer a.bkmrk.selected').each(function(i) { + var tt = $(this).data('latlng'); + latlngs[i] = tt; + }); + + var text = "You must select 2 or 3 portals!"; + var color = "red"; + + function formatDistance(distance) { + var text = digits(distance > 10000 ? (distance/1000).toFixed(2) + "km" : (Math.round(distance) + "m")); + return distance >= 200000 + ? ''+text+'' + : text; + } + + if(latlngs.length == 2) { + var distance = L.latLng(latlngs[0]).distanceTo(latlngs[1]); + text = 'Distance between portals: ' + formatDistance(distance); + color = ""; + } else if(latlngs.length == 3) { + var longdistance = false; + var distances = latlngs.map(function(ll1, i, latlngs) { + var ll2 = latlngs[(i+1)%3]; + return formatDistance(L.latLng(ll1).distanceTo(ll2)); + }); + text = 'Distances: ' + distances.join(", "); + color = ""; + } + + $('#bkmrksAutoDrawer p') + .html(text) + .css("color", color); + } + + 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 updateQueue 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 during 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(); + window.runHooks('pluginBkmrksSyncEnd', {"target": "all", "action": "sync"}); + console.log('BOOKMARKS: synchronized all'); + } + } + } + + // 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(); + } + +/***************************************************************************************************************************************************************/ +/** HIGHLIGHTER ************************************************************************************************************************************************/ +/***************************************************************************************************************************************************************/ + window.plugin.bookmarks.highlight = function(data) { + var guid = data.portal.options.ent[0]; + if(window.plugin.bookmarks.findByGuid(guid)) { + data.portal.setStyle({fillColor:'red'}); + } + } + + window.plugin.bookmarks.highlightRefresh = function(data) { + if(_current_highlighter === 'Bookmarked Portals') { + if(data.action === 'sync' || data.target === 'portal' || (data.target === 'folder' && data.action === 'remove') || (data.target === 'all' && data.action === 'import') || (data.target === 'all' && data.action === 'reset')) { + window.resetHighlightedPortals(); + } + } + } + +/***************************************************************************************************************************************************************/ +/** BOOKMARKED PORTALS LAYER ***********************************************************************************************************************************/ +/***************************************************************************************************************************************************************/ + window.plugin.bookmarks.addAllStars = function() { + var list = window.plugin.bookmarks.bkmrksObj.portals; + + for(var idFolders in list) { + for(var idBkmrks in list[idFolders]['bkmrk']) { + var latlng = list[idFolders]['bkmrk'][idBkmrks].latlng.split(","); + var guid = list[idFolders]['bkmrk'][idBkmrks].guid; + var lbl = list[idFolders]['bkmrk'][idBkmrks].label; + window.plugin.bookmarks.addStar(guid, latlng, lbl); + } + } + } + + window.plugin.bookmarks.resetAllStars = function() { + for(guid in window.plugin.bookmarks.starLayers) { + var starInLayer = window.plugin.bookmarks.starLayers[guid]; + window.plugin.bookmarks.starLayerGroup.removeLayer(starInLayer); + delete window.plugin.bookmarks.starLayers[guid]; + } + window.plugin.bookmarks.addAllStars(); + } + + window.plugin.bookmarks.addStar = function(guid, latlng, lbl) { + var star = L.marker(latlng, { + title: lbl, + icon: L.icon({ + iconUrl: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAoCAMAAACo9wirAAAAzFBMVEXbuTR9YwDd0T+ulyry2VDt53/s5Jv34a+tmUbJtGRtVwAtJADg14j304viyIZeSwDXyH5IOQD07JLPvnhqVQBuWACmkjpgTQBxWwC4p1WchikRDQCPdxeBaAQTDwADAgAOCwAAAAAAAAAAAAALCQAAAAAAAAAAAAD9+Jb97IT+3VT9+WH+0i3993D+80793Yr/yXL+5Tr+6XL+zEP/z2X+vSX+zB/+52L/qw393SX89xr9+yv/siP/vUf9+Dv+20P+rgH+xQv+vgH+twNAe/b8AAAAKHRSTlPywvLj+vn4/OLrqFb0/PSS8Hb77meB4FGX5t1A2dUkEy8HDQoaAwEAoclaPQAAAo1JREFUeF5VkeeyozAMRrPphdwkdIxpBu7SSe/llvd/p5VxlMx+PxiMzhxJuPX3mc/PzzgIQwYJwyCGoyggwMuRav6BmKrLGgQBrBvUkuQkkSWLGh5DooX1UNWlXplDyp6kq5EXCqL1qlu9srpfIPeq7FmaIBCIA9WScyjznC/3XOZEEAsABIFBoH6GUrt9v5zPQEAXFoCiAWLPkUqon+8lIbl4kRwfmggABFZSXXh9PhbopUos1fWCBoAJnT4MCMMlZLHQE/Hed/wIFA3gkiSvqjLtK45tO/N+WlZVnhA7YgKAFZK83dGJM5v4rmFSonfaeWotoEcDhJqSVl06W0A5gviTGelWqTJzvZADcWjO11XVIzPbjzzGPFfT4bxWTD8SAANgtTrIQ8eF3QPmDOXDarWej/mUL+C0SgfU91gcR3TAj42BNQDMAMDpwBfzwjCi/cMJgNFMGGBIY5g+AACnrWl+NJay0+mRDhcAiDVdKsOnzJqZRFGoZo74SaYTXDPwzPnhUTw6dCSnaT2inUdRHD7GNgIxM/QUvrW6WfZ4ZFm3VRSiA4sFEEaOlBX7oij2EP4ssqlj413wHqq13uy/X9lvYAcbb5P3cGmd7b9/nvneZzWdNB0EAApN2RZvoNjCvfKb4IBQ+LTe7H5+RXabmjwFCISw6Xb3i8D2oxEgwMdkBgHF7xeEC/SF34yIAN90/LHdHb94QCB2REBsauj17cqB660eogAB8bOE4vgUsBiBt2J6ux6P19v0OQECb8V8y4G34D+AKwgoQEBQgMBLYSrL222pjHEFBN4KOl0up/wWUIAA/k5tNBg014gCBPB3+s5g0EwYYB2Bl8KyND9CAQJvgnmq6kYeXxHzDyATueNnvZcYAAAAAElFTkSuQmCC', + iconAnchor: [15,40], + iconSize: [30,40] + }) + }); + window.registerMarkerForOMS(star); + star.on('spiderfiedclick', function() { renderPortalDetails(guid); }); + + window.plugin.bookmarks.starLayers[guid] = star; + star.addTo(window.plugin.bookmarks.starLayerGroup); + } + + window.plugin.bookmarks.editStar = function(data) { + if(data.target === 'portal') { + if(data.action === 'add') { + var guid = data.guid; + var latlng = window.portals[guid].getLatLng(); + var lbl = window.portals[guid].options.data.title; + var starInLayer = window.plugin.bookmarks.starLayers[data.guid]; + window.plugin.bookmarks.addStar(guid, latlng, lbl); + } + else if(data.action === 'remove') { + var starInLayer = window.plugin.bookmarks.starLayers[data.guid]; + window.plugin.bookmarks.starLayerGroup.removeLayer(starInLayer); + delete window.plugin.bookmarks.starLayers[data.guid]; + } + } + else if((data.target === 'all' && (data.action === 'import' || data.action === 'reset')) || (data.target === 'folder' && data.action === 'remove')) { + window.plugin.bookmarks.resetAllStars(); + } + } + +/***************************************************************************************************************************************************************/ + + window.plugin.bookmarks.setupCSS = function() { + $(''); +} + + +// PLUGIN END ////////////////////////////////////////////////////////// + + +setup.info = plugin_info; //add the script info data to the function as a property +if(!window.bootPlugins) window.bootPlugins = []; +window.bootPlugins.push(setup); +// if IITC has already booted, immediately run the 'setup' function +if(window.iitcLoaded && typeof setup === 'function') setup(); +} // wrapper end +// inject code into site context +var script = document.createElement('script'); +var info = {}; +if (typeof GM_info !== 'undefined' && GM_info && GM_info.script) info.script = { version: GM_info.script.version, name: GM_info.script.name, description: GM_info.script.description }; +script.appendChild(document.createTextNode('('+ wrapper +')('+JSON.stringify(info)+');')); +(document.body || document.head || document.documentElement).appendChild(script); + + diff --git a/mobile/assets/plugins/default-intel-detail.user.js b/mobile/assets/plugins/default-intel-detail.user.js new file mode 100644 index 000000000..32907e8a0 --- /dev/null +++ b/mobile/assets/plugins/default-intel-detail.user.js @@ -0,0 +1,67 @@ +// ==UserScript== +// @id iitc-plugin-default-intel-detail@jonatkins +// @name IITC plugin: Default intel detail level +// @category Tweaks +// @version 0.2.0.20181030.90244 +// @namespace https://github.com/jonatkins/ingress-intel-total-conversion +// @updateURL none +// @downloadURL none +// @description [mobile-2018-10-30-090244] Use the portal level detail levels from the standard intel site. By default, IITC shows less detail when zoomed out, as this is enough for general use, is more friendly to the niantic servers, and loads much faster. This plugin restores the default zoom level to portal level mapping. Note: using this plugin causes a larger number of requests to the intel server, and at high resolutions can cause excessive requests to be made (yes: the default intel site also has this problem!), so it is not recommended except for low resolution screens. +// @include https://*.ingress.com/intel* +// @include http://*.ingress.com/intel* +// @match https://*.ingress.com/intel* +// @match http://*.ingress.com/intel* +// @include https://*.ingress.com/mission/* +// @include http://*.ingress.com/mission/* +// @match https://*.ingress.com/mission/* +// @match http://*.ingress.com/mission/* +// @grant none +// ==/UserScript== + + +function wrapper(plugin_info) { +// ensure plugin framework is there, even if iitc is not yet loaded +if(typeof window.plugin !== 'function') window.plugin = function() {}; + +//PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! +//(leaving them in place might break the 'About IITC' page or break update checks) +plugin_info.buildName = 'mobile'; +plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.pluginId = 'default-intel-detail'; +//END PLUGIN AUTHORS NOTE + + + +// PLUGIN START //////////////////////////////////////////////////////// + + +// use own namespace for plugin +window.plugin.defaultIntelDetail = function() {}; + +window.plugin.defaultIntelDetail.setup = function() { + +// NOTE: the logic required is closely tied to the IITC+stock map detail level code - so the logic is moved there now +// and just enabled by this flag + window.CONFIG_ZOOM_DEFAULT_DETAIL_LEVEL=true; + +}; + +var setup = window.plugin.defaultIntelDetail.setup; + +// PLUGIN END ////////////////////////////////////////////////////////// + + +setup.info = plugin_info; //add the script info data to the function as a property +if(!window.bootPlugins) window.bootPlugins = []; +window.bootPlugins.push(setup); +// if IITC has already booted, immediately run the 'setup' function +if(window.iitcLoaded && typeof setup === 'function') setup(); +} // wrapper end +// inject code into site context +var script = document.createElement('script'); +var info = {}; +if (typeof GM_info !== 'undefined' && GM_info && GM_info.script) info.script = { version: GM_info.script.version, name: GM_info.script.name, description: GM_info.script.description }; +script.appendChild(document.createTextNode('('+ wrapper +')('+JSON.stringify(info)+');')); +(document.body || document.head || document.documentElement).appendChild(script); + + diff --git a/mobile/assets/plugins/distance-to-portal.user.js b/mobile/assets/plugins/distance-to-portal.user.js new file mode 100644 index 000000000..7672fc73a --- /dev/null +++ b/mobile/assets/plugins/distance-to-portal.user.js @@ -0,0 +1,218 @@ +// ==UserScript== +// @id iitc-plugin-distance-to-portal@jonatkins +// @name IITC plugin: Distance to portal +// @category Portal Info +// @version 0.1.1.20181030.90244 +// @namespace https://github.com/jonatkins/ingress-intel-total-conversion +// @updateURL none +// @downloadURL none +// @description [mobile-2018-10-30-090244] Allows your current location to be set manually, then shows the distance to the selected portal. Useful when managing portal keys. +// @include https://*.ingress.com/intel* +// @include http://*.ingress.com/intel* +// @match https://*.ingress.com/intel* +// @match http://*.ingress.com/intel* +// @include https://*.ingress.com/mission/* +// @include http://*.ingress.com/mission/* +// @match https://*.ingress.com/mission/* +// @match http://*.ingress.com/mission/* +// @grant none +// ==/UserScript== + + +function wrapper(plugin_info) { +// ensure plugin framework is there, even if iitc is not yet loaded +if(typeof window.plugin !== 'function') window.plugin = function() {}; + +//PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! +//(leaving them in place might break the 'About IITC' page or break update checks) +plugin_info.buildName = 'mobile'; +plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.pluginId = 'distance-to-portal'; +//END PLUGIN AUTHORS NOTE + + + +// PLUGIN START //////////////////////////////////////////////////////// + + +// use own namespace for plugin +window.plugin.distanceToPortal = function() {}; + +window.plugin.distanceToPortal.addDistance = function() { + var div = $('
    ') + .attr({ + id: 'portal-distance', + title: 'Double-click to set/change current location', + }) + .on('dblclick', window.plugin.distanceToPortal.setLocation); + + $('#resodetails').after(div); + + window.plugin.distanceToPortal.updateDistance(); +}; + +window.plugin.distanceToPortal.formatDistance = function(dist) { + if (dist >= 10000) { + dist = Math.round(dist/1000)+'km'; + } else if (dist >= 1000) { + dist = Math.round(dist/100)/10+'km'; + } else { + dist = Math.round(dist)+'m'; + } + + return dist; +} + + +window.plugin.distanceToPortal.updateDistance = function() { + if(!(selectedPortal && portals[selectedPortal])) return; + var portal = portals[selectedPortal]; + + var ll = portal.getLatLng(); + + var text; + + if (window.plugin.distanceToPortal.currentLoc) { + var dist = window.plugin.distanceToPortal.currentLoc.distanceTo(ll); + + dist = window.plugin.distanceToPortal.formatDistance(dist); + + var bearing = window.plugin.distanceToPortal.currentLoc.bearingTo(ll); + var bearingWord = window.plugin.distanceToPortal.currentLoc.bearingWordTo(ll); + + $('#portal-distance') + .text('Distance: ' + dist + ' ') + .append($('') + .addClass('portal-distance-bearing') + .css({ + 'transform': 'rotate('+bearing+'deg)', + '-moz-transform': 'rotate('+bearing+'deg)', + '-webkit-transform': 'rotate('+bearing+'deg)', + })) + .append(document.createTextNode(' ' + zeroPad(bearing, 3) + '° ' + bearingWord)); + } else { + $('#portal-distance').text('Location not set'); + } +}; + + +window.plugin.distanceToPortal.setLocation = function() { + if (window.plugin.distanceToPortal.currentLocMarker) { + map.removeLayer(window.plugin.distanceToPortal.currentLocMarker); + window.plugin.distanceToPortal.currentLocMarker = null; + return; + } + + + if (!window.plugin.distanceToPortal.currentLoc) { + window.plugin.distanceToPortal.currentLoc = map.getCenter(); + } + + window.plugin.distanceToPortal.currentLocMarker = createGenericMarker (window.plugin.distanceToPortal.currentLoc,'#444',{draggable:true}); + + window.plugin.distanceToPortal.currentLocMarker.on('drag', function(e) { + window.plugin.distanceToPortal.currentLoc = window.plugin.distanceToPortal.currentLocMarker.getLatLng(); + + localStorage['plugin-distance-to-portal'] = JSON.stringify({lat:window.plugin.distanceToPortal.currentLoc.lat, lng:window.plugin.distanceToPortal.currentLoc.lng}); + + if (selectedPortal) window.plugin.distanceToPortal.updateDistance(); + }); + + map.addLayer(window.plugin.distanceToPortal.currentLocMarker); +}; + +window.plugin.distanceToPortal.setupPortalsList = function() { + if(!window.plugin.portalslist) return; + + window.plugin.portalslist.fields.push({ + title: "Dist", + value: function(portal) { if (window.plugin.distanceToPortal.currentLoc) return window.plugin.distanceToPortal.currentLoc.distanceTo(portal.getLatLng()); else return 0; }, + format: function(cell, portal, dist) { + $(cell).addClass('alignR').text(dist?window.plugin.distanceToPortal.formatDistance(dist):'-'); + } + }); +} + + +window.plugin.distanceToPortal.setup = function() { + // https://github.com/gregallensworth/Leaflet/ + /* + * extend Leaflet's LatLng class + * giving it the ability to calculate the bearing to another LatLng + * Usage example: + * here = map.getCenter(); / some latlng + * there = L.latlng([37.7833,-122.4167]); + * var whichway = here.bearingWordTo(there); + * var howfar = (here.distanceTo(there) / 1609.34).toFixed(2); + * alert("San Francisco is " + howfar + " miles, to the " + whichway ); + * + * Greg Allensworth + * No license, use as you will, kudos welcome but not required, etc. + */ + + +L.LatLng.prototype.bearingTo = function(other) { + var d2r = L.LatLng.DEG_TO_RAD; + var r2d = L.LatLng.RAD_TO_DEG; + var lat1 = this.lat * d2r; + var lat2 = other.lat * d2r; + var dLon = (other.lng-this.lng) * d2r; + var y = Math.sin(dLon) * Math.cos(lat2); + var x = Math.cos(lat1)*Math.sin(lat2) - Math.sin(lat1)*Math.cos(lat2)*Math.cos(dLon); + var brng = Math.atan2(y, x); + brng = parseInt( brng * r2d ); + brng = (brng + 360) % 360; + return brng; +}; + +L.LatLng.prototype.bearingWordTo = function(other) { + var bearing = this.bearingTo(other); + var bearingword = ''; + if (bearing >= 22 && bearing <= 67) bearingword = 'NE'; + else if (bearing >= 67 && bearing <= 112) bearingword = 'E'; + else if (bearing >= 112 && bearing <= 157) bearingword = 'SE'; + else if (bearing >= 157 && bearing <= 202) bearingword = 'S'; + else if (bearing >= 202 && bearing <= 247) bearingword = 'SW'; + else if (bearing >= 247 && bearing <= 292) bearingword = 'W'; + else if (bearing >= 292 && bearing <= 337) bearingword = 'NW'; + else if (bearing >= 337 || bearing <= 22) bearingword = 'N'; + return bearingword; +}; + + + + try { + window.plugin.distanceToPortal.currentLoc = L.latLng(JSON.parse(localStorage['plugin-distance-to-portal'])); + } catch(e) { + window.plugin.distanceToPortal.currentLoc = null; + } + + window.plugin.distanceToPortal.currentLocMarker = null; + + $(''); + $('head').append(''); +} + +window.plugin.drawTools.getMarkerIcon = function(color) { + if (typeof(color) === 'undefined') { + console.warn('Color is not set or not a valid color. Using default color as fallback.'); + color = '#a24ac3'; + } + + var svgIcon = window.plugin.drawTools.markerTemplate.replace(/%COLOR%/g, color); + + return L.divIcon({ + iconSize: new L.Point(25, 41), + iconAnchor: new L.Point(12, 41), + html: svgIcon, + className: 'leaflet-iitc-custom-icon', + // L.divIcon does not use the option color, but we store it here to + // be able to simply retrieve the color for serializing markers + color: color + }); +} + +window.plugin.drawTools.currentColor = '#a24ac3'; +window.plugin.drawTools.markerTemplate = '\n\n\n \n \n \n\n \n\n'; + +window.plugin.drawTools.setOptions = function() { + + window.plugin.drawTools.lineOptions = { + stroke: true, + color: window.plugin.drawTools.currentColor, + weight: 4, + opacity: 0.5, + fill: false, + clickable: true + }; + + window.plugin.drawTools.polygonOptions = L.extend({}, window.plugin.drawTools.lineOptions, { + fill: true, + fillColor: null, // to use the same as 'color' for fill + fillOpacity: 0.2 + }); + + window.plugin.drawTools.editOptions = L.extend({}, window.plugin.drawTools.polygonOptions, { + dashArray: [10,10] + }); + delete window.plugin.drawTools.editOptions.color; + + window.plugin.drawTools.markerOptions = { + icon: window.plugin.drawTools.currentMarker, + zIndexOffset: 2000 + }; + +} + +window.plugin.drawTools.setDrawColor = function(color) { + window.plugin.drawTools.currentColor = color; + window.plugin.drawTools.currentMarker = window.plugin.drawTools.getMarkerIcon(color); + + window.plugin.drawTools.lineOptions.color = color; + window.plugin.drawTools.polygonOptions.color = color; + window.plugin.drawTools.markerOptions.icon = window.plugin.drawTools.currentMarker; + + plugin.drawTools.drawControl.setDrawingOptions({ + polygon: { shapeOptions: plugin.drawTools.polygonOptions }, + polyline: { shapeOptions: plugin.drawTools.lineOptions }, + circle: { shapeOptions: plugin.drawTools.polygonOptions }, + marker: { icon: plugin.drawTools.markerOptions.icon }, + }); +} + +// renders the draw control buttons in the top left corner +window.plugin.drawTools.addDrawControl = function() { + var drawControl = new L.Control.Draw({ + draw: { + rectangle: false, + polygon: { + title: 'Add a polygon\n\n' + + 'Click on the button, then click on the map to\n' + + 'define the start of the polygon. Continue clicking\n' + + 'to draw the line you want. Click the first or last\n' + + 'point of the line (a small white rectangle) to\n' + + 'finish. Double clicking also works.', + shapeOptions: window.plugin.drawTools.polygonOptions, + snapPoint: window.plugin.drawTools.getSnapLatLng, + }, + + polyline: { + title: 'Add a (poly) line.\n\n' + + 'Click on the button, then click on the map to\n' + + 'define the start of the line. Continue clicking\n' + + 'to draw the line you want. Click the last\n' + + 'point of the line (a small white rectangle) to\n' + + 'finish. Double clicking also works.', + shapeOptions: window.plugin.drawTools.lineOptions, + snapPoint: window.plugin.drawTools.getSnapLatLng, + }, + + circle: { + title: 'Add a circle.\n\n' + + 'Click on the button, then click-AND-HOLD on the\n' + + 'map where the circle’s center should be. Move\n' + + 'the mouse to control the radius. Release the mouse\n' + + 'to finish.', + shapeOptions: window.plugin.drawTools.polygonOptions, + snapPoint: window.plugin.drawTools.getSnapLatLng, + }, + + // Options for marker (icon, zIndexOffset) are not set via shapeOptions, + // so we have merge them here! + marker: L.extend({}, window.plugin.drawTools.markerOptions, { + title: 'Add a marker.\n\n' + + 'Click on the button, then click on the map where\n' + + 'you want the marker to appear.', + snapPoint: window.plugin.drawTools.getSnapLatLng, + repeatMode: true + }), + + }, + + edit: { + featureGroup: window.plugin.drawTools.drawnItems, + + edit: { + title: 'Edit drawn items', + selectedPathOptions: window.plugin.drawTools.editOptions, + }, + + remove: { + title: 'Delete drawn items' + }, + + }, + + }); + + window.plugin.drawTools.drawControl = drawControl; + + map.addControl(drawControl); + //plugin.drawTools.addCustomButtons(); + + window.plugin.drawTools.setAccessKeys(); + for (var toolbarId in drawControl._toolbars) { + if (drawControl._toolbars[toolbarId] instanceof L.Toolbar) { + drawControl._toolbars[toolbarId].on('enable', function() { + setTimeout(window.plugin.drawTools.setAccessKeys, 10); + }); + } + } +} + +window.plugin.drawTools.setAccessKeys = function() { + var expr = /\s*\[\w+\]$/; + // there is no API to add accesskeys, so have to dig in the DOM + // must be same order as in markup. Note that each toolbar has a container for save/cancel + var accessKeys = [ + 'l', 'p', 'o', 'm', // line, polygon, circle, marker + 'a', // cancel (_abort) + 'e', 'd', // edit, delete + 's', 'a', // save, cancel + ]; + var buttons = window.plugin.drawTools.drawControl._container.getElementsByTagName('a'); + for(var i=0;i size) return true; + candidates.push([dist, ll]); + }); + + if(candidates.length === 0) return unsnappedLatLng; + candidates = candidates.sort(function(a, b) { return a[0]-b[0]; }); + return new L.LatLng(candidates[0][1].lat, candidates[0][1].lng); //return a clone of the portal location +} + + +window.plugin.drawTools.save = function() { + var data = []; + + window.plugin.drawTools.drawnItems.eachLayer( function(layer) { + var item = {}; + if (layer instanceof L.GeodesicCircle || layer instanceof L.Circle) { + item.type = 'circle'; + item.latLng = layer.getLatLng(); + item.radius = layer.getRadius(); + item.color = layer.options.color; + } else if (layer instanceof L.GeodesicPolygon || layer instanceof L.Polygon) { + item.type = 'polygon'; + item.latLngs = layer.getLatLngs(); + item.color = layer.options.color; + } else if (layer instanceof L.GeodesicPolyline || layer instanceof L.Polyline) { + item.type = 'polyline'; + item.latLngs = layer.getLatLngs(); + item.color = layer.options.color; + } else if (layer instanceof L.Marker) { + item.type = 'marker'; + item.latLng = layer.getLatLng(); + item.color = layer.options.icon.options.color; + } else { + console.warn('Unknown layer type when saving draw tools layer'); + return; //.eachLayer 'continue' + } + + data.push(item); + }); + + localStorage['plugin-draw-tools-layer'] = JSON.stringify(data); + + console.log('draw-tools: saved to localStorage'); +} + +window.plugin.drawTools.load = function() { + try { + var dataStr = localStorage['plugin-draw-tools-layer']; + if (dataStr === undefined) return; + + var data = JSON.parse(dataStr); + window.plugin.drawTools.import(data); + + } catch(e) { + console.warn('draw-tools: failed to load data from localStorage: '+e); + } +} + +window.plugin.drawTools.import = function(data) { + $.each(data, function(index,item) { + var layer = null; + var extraOpt = {}; + if (item.color) extraOpt.color = item.color; + + switch(item.type) { + case 'polyline': + layer = L.geodesicPolyline(item.latLngs, L.extend({},window.plugin.drawTools.lineOptions,extraOpt)); + break; + case 'polygon': + layer = L.geodesicPolygon(item.latLngs, L.extend({},window.plugin.drawTools.polygonOptions,extraOpt)); + break; + case 'circle': + layer = L.geodesicCircle(item.latLng, item.radius, L.extend({},window.plugin.drawTools.polygonOptions,extraOpt)); + break; + case 'marker': + var extraMarkerOpt = {}; + if (item.color) extraMarkerOpt.icon = window.plugin.drawTools.getMarkerIcon(item.color); + layer = L.marker(item.latLng, L.extend({},window.plugin.drawTools.markerOptions,extraMarkerOpt)); + window.registerMarkerForOMS(layer); + break; + default: + console.warn('unknown layer type "'+item.type+'" when loading draw tools layer'); + break; + } + if (layer) { + window.plugin.drawTools.drawnItems.addLayer(layer); + } + }); + + runHooks('pluginDrawTools', {event: 'import'}); + +} + + +//Draw Tools Options + +// Manual import, export and reset data +window.plugin.drawTools.manualOpt = function() { + + var html = '
    ' + + '' +//TODO: add line style choosers: thickness, maybe dash styles? + + '
    ' + + '
    ' + + 'Copy Drawn Items' + + 'Paste Drawn Items' + + (window.requestFile != undefined + ? 'Import Drawn Items' : '') + + ((typeof android !== 'undefined' && android && android.saveFile) + ? 'Export Drawn Items' : '') + + 'Reset Drawn Items' + + 'Snap to portals' + + '
    '; + + dialog({ + html: html, + id: 'plugin-drawtools-options', + dialogClass: 'ui-dialog-drawtoolsSet', + title: 'Draw Tools Options' + }); + + // need to initialise the 'spectrum' colour picker + $('#drawtools_color').spectrum({ + flat: false, + showInput: false, + showButtons: false, + showPalette: true, + showPaletteOnly: false, + showSelectionPalette: false, + palette: [ ['#a24ac3','#514ac3','#4aa8c3','#51c34a'], + ['#c1c34a','#c38a4a','#c34a4a','#c34a6f'], + ['#000000','#666666','#bbbbbb','#ffffff'] + ], + change: function(color) { window.plugin.drawTools.setDrawColor(color.toHexString()); }, +// move: function(color) { window.plugin.drawTools.setDrawColor(color.toHexString()); }, + color: window.plugin.drawTools.currentColor, + }); +} + +window.plugin.drawTools.optAlert = function(message) { + $('.ui-dialog-drawtoolsSet .ui-dialog-buttonset').prepend('

    '+message+'

    '); + $('.drawtools-alert').delay(2500).fadeOut(); +} + +window.plugin.drawTools.optCopy = function() { + if (typeof android !== 'undefined' && android && android.shareString) { + android.shareString(localStorage['plugin-draw-tools-layer']); + } else { + var stockWarnings = {}; + var stockLinks = []; + window.plugin.drawTools.drawnItems.eachLayer( function(layer) { + if (layer instanceof L.GeodesicCircle || layer instanceof L.Circle) { + stockWarnings.noCircle = true; + return; //.eachLayer 'continue' + } else if (layer instanceof L.GeodesicPolygon || layer instanceof L.Polygon) { + stockWarnings.polyAsLine = true; + // but we can export them + } else if (layer instanceof L.GeodesicPolyline || layer instanceof L.Polyline) { + // polylines are fine + } else if (layer instanceof L.Marker) { + stockWarnings.noMarker = true; + return; //.eachLayer 'continue' + } else { + stockWarnings.unknown = true; //should never happen + return; //.eachLayer 'continue' + } + // only polygons and polylines make it through to here + var latLngs = layer.getLatLngs(); + // stock only handles one line segment at a time + for (var i=0; i40) stockWarnTexts.push('Warning: Stock intel may not work with more than 40 line segments - there are '+stockLinks.length); + if (stockWarnings.noCircle) stockWarnTexts.push('Warning: Circles cannot be exported to stock intel'); + if (stockWarnings.noMarker) stockWarnTexts.push('Warning: Markers cannot be exported to stock intel'); + if (stockWarnings.unknown) stockWarnTexts.push('Warning: UNKNOWN ITEM TYPE'); + + var html = '

    Select all and press CTRL+C to copy it.

    ' + +'' + +'

    or, export as a link for the standard intel map (for non IITC users)

    ' + +''; + if (stockWarnTexts.length>0) { + html += '
    • '+stockWarnTexts.join('
    • ')+'
    '; + } + + dialog({ + html: html, + width: 600, + dialogClass: 'ui-dialog-drawtoolsSet-copy', + title: 'Draw Tools Export' + }); + } +} + +window.plugin.drawTools.optExport = function() { + if(typeof android !== 'undefined' && android && android.saveFile) { + android.saveFile('IITC-drawn-items.json', 'application/json', localStorage['plugin-draw-tools-layer']); + } +} + +window.plugin.drawTools.optPaste = function() { + var promptAction = prompt('Press CTRL+V to paste (draw-tools data or stock intel URL).', ''); + if(promptAction !== null && promptAction !== '') { + try { + // first see if it looks like a URL-format stock intel link, and if so, try and parse out any stock drawn items + // from the pls parameter + if (promptAction.match(new RegExp("^(https?://)?(www\\.)?ingress\\.com/intel.*[?&]pls="))) { + //looks like a ingress URL that has drawn items... + var items = promptAction.split(/[?&]/); + var foundAt = -1; + for (var i=0; iImport failed
    '); + } + } +} + +window.plugin.drawTools.optImport = function() { + if (window.requestFile === undefined) return; + window.requestFile(function(filename, content) { + try { + var data = JSON.parse(content); + window.plugin.drawTools.drawnItems.clearLayers(); + window.plugin.drawTools.import(data); + console.log('DRAWTOOLS: reset and imported drawn tiems'); + window.plugin.drawTools.optAlert('Import Successful.'); + + // to write back the data to localStorage + window.plugin.drawTools.save(); + } catch(e) { + console.warn('DRAWTOOLS: failed to import data: '+e); + window.plugin.drawTools.optAlert('Import failed'); + } + }); +} + +window.plugin.drawTools.optReset = function() { + var promptAction = confirm('All drawn items will be deleted. Are you sure?', ''); + if(promptAction) { + delete localStorage['plugin-draw-tools-layer']; + window.plugin.drawTools.drawnItems.clearLayers(); + window.plugin.drawTools.load(); + console.log('DRAWTOOLS: reset all drawn items'); + window.plugin.drawTools.optAlert('Reset Successful. '); + runHooks('pluginDrawTools', {event: 'clear'}); + } +} + +window.plugin.drawTools.snapToPortals = function() { + var dataParams = getMapZoomTileParameters(getDataZoomForMapZoom(map.getZoom())); + if (dataParams.level > 0) { + if (!confirm('Not all portals are visible on the map. Snap to portals may move valid points to the wrong place. Continue?')) { + return; + } + } + + if (mapDataRequest.status.short != 'done') { + if (!confirm('Map data has not completely loaded, so some portals may be missing. Do you want to continue?')) { + return; + } + } + + var visibleBounds = map.getBounds(); + + // let's do all the distance calculations in screen space. 2d is much easier, should be faster, and is more than good enough + // we'll pre-project all the on-screen portals too, to save repeatedly doing it + var visiblePortals = {}; + $.each(window.portals, function(guid,portal) { + var ll = portal.getLatLng(); + if (visibleBounds.contains(ll)) { + visiblePortals[guid] = map.project(ll); + } + }); + + if (Object.keys(visiblePortals).length == 0) { + alert('Error: No portals visible in this view - nothing to snap points to!'); + return; + } + + var findClosestPortalLatLng = function(latlng) { + var testpoint = map.project(latlng); + + var minDistSquared = undefined; + var minGuid = undefined; + for (var guid in visiblePortals) { + var p = visiblePortals[guid]; + var distSquared = (testpoint.x-p.x)*(testpoint.x-p.x) + (testpoint.y-p.y)*(testpoint.y-p.y); + if (minDistSquared == undefined || minDistSquared > distSquared) { + minDistSquared = distSquared; + minGuid = guid; + } + } + return minGuid ? portals[minGuid].getLatLng() : undefined; //should never hit 'undefined' case - as we abort when the list is empty + }; + + + var changedCount = 0; + var testCount = 0; + + window.plugin.drawTools.drawnItems.eachLayer(function(layer) { + if (layer.getLatLng) { + //circles and markers - a single point to snap + var ll = layer.getLatLng(); + if (visibleBounds.contains(ll)) { + testCount++; + var newll = findClosestPortalLatLng(ll); + if (!newll.equals(ll)) { + layer.setLatLng(new L.LatLng(newll.lat,newll.lng)); + changedCount++; + } + } + } else if (layer.getLatLngs) { + var lls = layer.getLatLngs(); + var layerChanged = false; + for (var i=0; i 0) { + runHooks('pluginDrawTools',{event:'layersSnappedToPortals'}); //or should we send 'layersEdited'? as that's effectively what's happened... + } + + alert('Tested '+testCount+' points, and moved '+changedCount+' onto portal coordinates'); + + window.plugin.drawTools.save(); +} + +window.plugin.drawTools.boot = function() { + // add a custom hook for draw tools to share it's activity with other plugins + pluginCreateHook('pluginDrawTools'); + + window.plugin.drawTools.currentMarker = window.plugin.drawTools.getMarkerIcon(window.plugin.drawTools.currentColor); + + window.plugin.drawTools.setOptions(); + + //create a leaflet FeatureGroup to hold drawn items + window.plugin.drawTools.drawnItems = new L.FeatureGroup(); + + //load any previously saved items + plugin.drawTools.load(); + + //add the draw control - this references the above FeatureGroup for editing purposes + plugin.drawTools.addDrawControl(); + + //start off hidden. if the layer is enabled, the below addLayerGroup will add it, triggering a 'show' + $('.leaflet-draw-section').hide(); + + + //hide the draw tools when the 'drawn items' layer is off, show it when on + map.on('layeradd', function(obj) { + if(obj.layer === window.plugin.drawTools.drawnItems) { + $('.leaflet-draw-section').show(); + } + }); + map.on('layerremove', function(obj) { + if(obj.layer === window.plugin.drawTools.drawnItems) { + $('.leaflet-draw-section').hide(); + } + }); + + //add the layer + window.addLayerGroup('Drawn Items', window.plugin.drawTools.drawnItems, true); + + + //place created items into the specific layer + map.on('draw:created', function(e) { + var type=e.layerType; + var layer=e.layer; + window.plugin.drawTools.drawnItems.addLayer(layer); + window.plugin.drawTools.save(); + + if(layer instanceof L.Marker) { + window.registerMarkerForOMS(layer); + } + + runHooks('pluginDrawTools',{event:'layerCreated',layer:layer}); + }); + + map.on('draw:deleted', function(e) { + window.plugin.drawTools.save(); + runHooks('pluginDrawTools',{event:'layersDeleted'}); + }); + + map.on('draw:edited', function(e) { + window.plugin.drawTools.save(); + runHooks('pluginDrawTools',{event:'layersEdited'}); + }); + //add options menu + $('#toolbox').append('DrawTools Opt'); + + $('head').append(''); + +} + + +var setup = window.plugin.drawTools.loadExternals; + +// PLUGIN END ////////////////////////////////////////////////////////// + + +setup.info = plugin_info; //add the script info data to the function as a property +if(!window.bootPlugins) window.bootPlugins = []; +window.bootPlugins.push(setup); +// if IITC has already booted, immediately run the 'setup' function +if(window.iitcLoaded && typeof setup === 'function') setup(); +} // wrapper end +// inject code into site context +var script = document.createElement('script'); +var info = {}; +if (typeof GM_info !== 'undefined' && GM_info && GM_info.script) info.script = { version: GM_info.script.version, name: GM_info.script.name, description: GM_info.script.description }; +script.appendChild(document.createTextNode('('+ wrapper +')('+JSON.stringify(info)+');')); +(document.body || document.head || document.documentElement).appendChild(script); + + diff --git a/mobile/assets/plugins/favorite-portals.user.js b/mobile/assets/plugins/favorite-portals.user.js new file mode 100644 index 000000000..75ce6bd8c --- /dev/null +++ b/mobile/assets/plugins/favorite-portals.user.js @@ -0,0 +1,19 @@ +// ==UserScript== +// @id iitc-plugin-favorite-portals@soulBit +// @name IITC plugin: Favorite Portals +// @category Deleted +// @version 0.2.0.20181030.90244 +// @description Plugin replaced by the "Bookmarks for maps and portals" plugin +// @namespace https://github.com/jonatkins/ingress-intel-total-conversion +// @updateURL none +// @downloadURL none +// @include https://*.ingress.com/intel* +// @include http://*.ingress.com/intel* +// @match https://*.ingress.com/intel* +// @match http://*.ingress.com/intel* +// @include https://*.ingress.com/mission/* +// @include http://*.ingress.com/mission/* +// @match https://*.ingress.com/mission/* +// @match http://*.ingress.com/mission/* +// @grant none +// ==/UserScript== diff --git a/mobile/assets/plugins/fix-googlemap-china-offset.user.js b/mobile/assets/plugins/fix-googlemap-china-offset.user.js new file mode 100644 index 000000000..cc4c5614f --- /dev/null +++ b/mobile/assets/plugins/fix-googlemap-china-offset.user.js @@ -0,0 +1,228 @@ +// ==UserScript== +// @id iitc-plugin-fix-googlemap-china-offset@breezewish +// @name IITC plugin: Fix Google Map offsets in China +// @category Tweaks +// @version 0.0.1.20181030.90244 +// @namespace https://github.com/jonatkins/ingress-intel-total-conversion +// @updateURL none +// @downloadURL none +// @description [mobile-2018-10-30-090244] Show correct Google Map for China user by applying offset tweaks. +// @include https://*.ingress.com/intel* +// @include http://*.ingress.com/intel* +// @match https://*.ingress.com/intel* +// @match http://*.ingress.com/intel* +// @include https://*.ingress.com/mission/* +// @include http://*.ingress.com/mission/* +// @match https://*.ingress.com/mission/* +// @match http://*.ingress.com/mission/* +// @grant none +// ==/UserScript== + + +function wrapper(plugin_info) { +// ensure plugin framework is there, even if iitc is not yet loaded +if(typeof window.plugin !== 'function') window.plugin = function() {}; + +//PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! +//(leaving them in place might break the 'About IITC' page or break update checks) +plugin_info.buildName = 'mobile'; +plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.pluginId = 'fix-googlemap-china-offset'; +//END PLUGIN AUTHORS NOTE + + + +// PLUGIN START //////////////////////////////////////////////////////// + +// use own namespace for plugin +window.plugin.fixChinaOffset = {}; + +// Before understanding how this plugin works, you should know 3 points: +// +// Point1. +// The coordinate system of Ingress is WGS-84. +// However, the tiles of Google maps (except satellite map) in China have +// offsets (base on GCJ-02 coordinate system) by China policy. +// That means, if you request map tiles by giving GCJ-02 position, you +// will get the correct map. +// +// Point2. +// Currently there are no easy algorithm to transform from GCJ-02 to WGS-84, +// but we can easily transform data from WGS-84 to GCJ-02. +// +// Point3. +// When using Google maps in IITC, the layer structure looks like this: +// ---------------------- +// | Other Leaflet layers | (Including portals, links, fields, and so on) +// ---------------------- +// | L.Google | (Only for controling) +// ---------------------- +// | Google Map layer | (Generated by Google Map APIs, for rendering maps) +// ---------------------- +// +// When users are interacting with L.Google (for example, dragging, zooming), +// L.Google will perform the same action on the Google Map layer using Google +// Map APIs. +// +// So, here is the internal of the plugin: +// +// The plugin overwrites behaviours of L.Google. When users are dragging the map, +// L.Google will pass offseted positions to Google Map APIs (WGS-84 to GCJ-02). +// So Google Map APIs will render a correct map. +// +// The offset between Google maps and Ingress objects can also be fixed by applying +// WGS-84 to GCJ-02 transformation on Ingress objects. However we cannot simply know +// the requesting bounds of Ingress objects because we cannot transform GCJ-02 to +// WGS-84. As a result, the Ingress objects on maps would be incomplete. +// +// The algorithm of transforming WGS-84 to GCJ-02 comes from: +// https://on4wp7.codeplex.com/SourceControl/changeset/view/21483#353936 +// There is no official algorithm because it is classified information. + +/////////// begin WGS84 to GCJ-02 transformer ///////// +var WGS84transformer = window.plugin.fixChinaOffset.WGS84transformer = function() {}; +// Krasovsky 1940 +// +// a = 6378245.0, 1/f = 298.3 +// b = a * (1 - f) +// ee = (a^2 - b^2) / a^2; +WGS84transformer.prototype.a = 6378245.0; +WGS84transformer.prototype.ee = 0.00669342162296594323; + +WGS84transformer.prototype.transform = function(wgLat, wgLng) { + + if(this.isOutOfChina(wgLat, wgLng)) + return {lat: wgLat, lng: wgLng}; + + dLat = this.transformLat(wgLng - 105.0, wgLat - 35.0); + dLng = this.transformLng(wgLng - 105.0, wgLat - 35.0); + radLat = wgLat / 180.0 * Math.PI; + magic = Math.sin(radLat); + magic = 1 - this.ee * magic * magic; + sqrtMagic = Math.sqrt(magic); + dLat = (dLat * 180.0) / ((this.a * (1 - this.ee)) / (magic * sqrtMagic) * Math.PI); + dLng = (dLng * 180.0) / (this.a / sqrtMagic * Math.cos(radLat) * Math.PI); + mgLat = wgLat + dLat; + mgLng = wgLng + dLng; + + return {lat: mgLat, lng: mgLng}; + +}; + +WGS84transformer.prototype.isOutOfChina = function(lat, lng) { + + if(lng < 72.004 || lng > 137.8347) return true; + if(lat < 0.8293 || lat > 55.8271) return true; + + return false; + +}; + +WGS84transformer.prototype.transformLat = function(x, y) { + + var ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * Math.sqrt(Math.abs(x)); + ret += (20.0 * Math.sin(6.0 * x * Math.PI) + 20.0 * Math.sin(2.0 * x * Math.PI)) * 2.0 / 3.0; + ret += (20.0 * Math.sin(y * Math.PI) + 40.0 * Math.sin(y / 3.0 * Math.PI)) * 2.0 / 3.0; + ret += (160.0 * Math.sin(y / 12.0 * Math.PI) + 320 * Math.sin(y * Math.PI / 30.0)) * 2.0 / 3.0; + + return ret; + +}; + +WGS84transformer.prototype.transformLng = function(x, y) { + + var ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * Math.sqrt(Math.abs(x)); + ret += (20.0 * Math.sin(6.0 * x * Math.PI) + 20.0 * Math.sin(2.0 * x * Math.PI)) * 2.0 / 3.0; + ret += (20.0 * Math.sin(x * Math.PI) + 40.0 * Math.sin(x / 3.0 * Math.PI)) * 2.0 / 3.0; + ret += (150.0 * Math.sin(x / 12.0 * Math.PI) + 300.0 * Math.sin(x / 30.0 * Math.PI)) * 2.0 / 3.0; + + return ret; + +}; +/////////// end WGS84 to GCJ-02 transformer ///////// + +var WGS84toGCJ02 = new WGS84transformer(); + +/////////// begin overwrited L.Google ///////// +window.plugin.fixChinaOffset.L = {}; +window.plugin.fixChinaOffset.L.Google = { + + _update: function(e) { + + if(!this._google) return; + this._resize(); + + var center = e && e.latlng ? e.latlng : this._map.getCenter(); + + ///// modified here /// + var _center = window.plugin.fixChinaOffset.getLatLng(center, this._type); + /////////////////////// + + this._google.setCenter(_center); + this._google.setZoom(this._map.getZoom()); + + this._checkZoomLevels(); + + }, + + _handleZoomAnim: function (e) { + + var center = e.center; + + ///// modified here /// + var _center = window.plugin.fixChinaOffset.getLatLng(center, this._type); + /////////////////////// + + this._google.setCenter(_center); + this._google.setZoom(e.zoom); + + } + +} +/////////// end overwrited L.Google ///////// + +window.plugin.fixChinaOffset.getLatLng = function(pos, type) { + + // No offsets in satellite and hybrid maps + if(type !== 'SATELLITE' && type !== 'HYBRID') { + var newPos = WGS84toGCJ02.transform(pos.lat, pos.lng); + return new google.maps.LatLng(newPos.lat, newPos.lng); + } else { + return new google.maps.LatLng(pos.lat, pos.lng); + } + +}; + +window.plugin.fixChinaOffset.overwrite = function(dest, src) { + + for(var key in src) { + if(src.hasOwnProperty(key)) { + dest[key] = src[key]; + } + } + +} + +var setup = function() { + + window.plugin.fixChinaOffset.overwrite(L.Google.prototype, window.plugin.fixChinaOffset.L.Google); + +} + +// PLUGIN END ////////////////////////////////////////////////////////// + + +setup.info = plugin_info; //add the script info data to the function as a property +if(!window.bootPlugins) window.bootPlugins = []; +window.bootPlugins.push(setup); +// if IITC has already booted, immediately run the 'setup' function +if(window.iitcLoaded && typeof setup === 'function') setup(); +} // wrapper end +// inject code into site context +var script = document.createElement('script'); +var info = {}; +if (typeof GM_info !== 'undefined' && GM_info && GM_info.script) info.script = { version: GM_info.script.version, name: GM_info.script.name, description: GM_info.script.description }; +script.appendChild(document.createTextNode('('+ wrapper +')('+JSON.stringify(info)+');')); +(document.body || document.head || document.documentElement).appendChild(script); + + diff --git a/mobile/assets/plugins/fly-links.user.js b/mobile/assets/plugins/fly-links.user.js new file mode 100644 index 000000000..1bdfd82d8 --- /dev/null +++ b/mobile/assets/plugins/fly-links.user.js @@ -0,0 +1,328 @@ +// ==UserScript== +// @id fly-links@fly +// @name IITC plugin: Fly Links +// @category Layer +// @version 0.2.1.20181030.90244 +// @updateURL none +// @downloadURL none +// @description [mobile-2018-10-30-090244] Calculate how to link the portals to create the largest tidy set of nested fields. Enable from the layer chooser. +// @include https://*.ingress.com/intel* +// @include http://*.ingress.com/intel* +// @match https://*.ingress.com/intel* +// @match http://*.ingress.com/intel* +// @include https://*.ingress.com/mission/* +// @include http://*.ingress.com/mission/* +// @match https://*.ingress.com/mission/* +// @match http://*.ingress.com/mission/* +// @grant none +// ==/UserScript== + + +function wrapper(plugin_info) { +// ensure plugin framework is there, even if iitc is not yet loaded +if(typeof window.plugin !== 'function') window.plugin = function() {}; + +//PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! +//(leaving them in place might break the 'About IITC' page or break update checks) +plugin_info.buildName = 'mobile'; +plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.pluginId = 'fly-links'; +//END PLUGIN AUTHORS NOTE + + + +// PLUGIN START //////////////////////////////////////////////////////// + +// use own namespace for plugin +window.plugin.flyLinks = function() {}; + +// const values +window.plugin.flyLinks.MAX_PORTALS_TO_OBSERVE = 1000; +window.plugin.flyLinks.MAX_PORTALS_TO_LINK = 100; +// zoom level used for projecting points between latLng and pixel coordinates. may affect precision of triangulation +window.plugin.flyLinks.PROJECT_ZOOM = 16; + + +window.plugin.flyLinks.linksLayerGroup = null; +window.plugin.flyLinks.fieldsLayerGroup = null; + +window.plugin.flyLinks.updateLayer = function() { + if (!window.map.hasLayer(window.plugin.flyLinks.linksLayerGroup) && + !window.map.hasLayer(window.plugin.flyLinks.fieldsLayerGroup)) + return; + + window.plugin.flyLinks.linksLayerGroup.clearLayers(); + window.plugin.flyLinks.fieldsLayerGroup.clearLayers(); + var ctrl = [$('.leaflet-control-layers-selector + span:contains("Fly links")').parent(), + $('.leaflet-control-layers-selector + span:contains("Fly fields")').parent()]; + if (Object.keys(window.portals).length > window.plugin.flyLinks.MAX_PORTALS_TO_OBSERVE) { + $.each(ctrl, function(guid, ctl) {ctl.addClass('disabled').attr('title', 'Too many portals: ' + Object.keys(window.portals).length);}); + return; + } + + var locations = []; + + var bounds = map.getBounds(); + $.each(window.portals, function(guid, portal) { + var ll = portal.getLatLng(); + if (bounds.contains(ll)) { + var p = map.project(portal.getLatLng(), window.plugin.flyLinks.PROJECT_ZOOM); + locations.push(p); + } + }); + + var distance = function(a, b) { + return Math.sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y)); + }; + + var drawLink = function(a, b, style) { + var alatlng = map.unproject(a, window.plugin.flyLinks.PROJECT_ZOOM); + var blatlng = map.unproject(b, window.plugin.flyLinks.PROJECT_ZOOM); + + var poly = L.polyline([alatlng, blatlng], style); + poly.addTo(window.plugin.flyLinks.linksLayerGroup); + } + + var drawField = function(a, b, c, style) { + var alatlng = map.unproject(a, window.plugin.flyLinks.PROJECT_ZOOM); + var blatlng = map.unproject(b, window.plugin.flyLinks.PROJECT_ZOOM); + var clatlng = map.unproject(c, window.plugin.flyLinks.PROJECT_ZOOM); + + var poly = L.polygon([alatlng, blatlng, clatlng], style); + poly.addTo(window.plugin.flyLinks.fieldsLayerGroup); + } + + if (locations.length > window.plugin.flyLinks.MAX_PORTALS_TO_LINK) { + $.each(ctrl, function(guid, ctl) {ctl.addClass('disabled').attr('title', 'Too many portals (linked/observed): ' + locations.length + '/' + Object.keys(window.portals).length);}); + return; + } + $.each(ctrl, function(guid, ctl) {ctl.removeClass('disabled').attr('title', 'portals (linked/observed): ' + locations.length + '/' + Object.keys(window.portals).length);}); + + var EPS = 1e-9; + var det = function(a, b, c) { + return a.x * b.y - a.y * b.x + b.x * c.y - b.y * c.x + c.x * a.y - c.y * a.x; + } + + var convexHull = function(points) { + if (points.length < 3) + return []; + var result = []; + var func = function _func(ai, bi, index) { + var maxd = 0; + var maxdi = -1; + var a = points[ai]; + var b = points[bi]; + var _index = []; + for (var i = 0; i < index.length; ++i) { + var c = points[index[i]]; + var d = -det(a, b, c); + if (d > EPS) { + _index.push(index[i]); + } + if (maxd < d - EPS) { + maxd = d; + maxdi = index[i]; + } + } + if (maxdi != -1) { + _func(ai, maxdi, _index); + _func(maxdi, bi, _index); + } else { + result.push(ai); + } + } + var minxi = 0; + var maxxi = 0; + var index = []; + for (var i = 0; i < points.length; ++i) { + index.push(i); + if (points[minxi].x > points[i].x) + minxi = i; + if (points[maxxi].x < points[i].x) + maxxi = i; + } + func(minxi, maxxi, index); + func(maxxi, minxi, index); + return result; + } + + var index = convexHull(locations); + + var triangulate = function(index, locations) { + if (index.length == 0) + return {edges: [], triangles: []}; + var data = []; + var subtriangulate = function _subtriangulate(ai, bi, ci, index) { + var _i = [ai, bi, ci].sort(function(a,b){return a-b;}); + if (data[_i[0]] === undefined) + data[_i[0]] = []; + if (data[_i[0]][_i[1]-_i[0]] === undefined) + data[_i[0]][_i[1]-_i[0]] = []; + if (data[_i[0]][_i[1]-_i[0]][_i[2]-_i[1]] === undefined) { + var _index = []; + for (var i = 0; i < index.length; ++i) { + var detc = det(locations[ai], locations[bi], locations[index[i]]); + var deta = det(locations[bi], locations[ci], locations[index[i]]); + var detb = det(locations[ci], locations[ai], locations[index[i]]); + if (deta > EPS && detb > EPS && detc > EPS) { + _index.push(index[i]); + } + } + var besth = 0; + var besthi = -1; + if (_index.length == 0) { + var a = locations[ai]; + var b = locations[bi]; + var c = locations[ci]; + var s = Math.abs(det(a, b, c)); + var ch = s / distance(a, b); + var ah = s / distance(b, c); + var bh = s / distance(c, a); + besth = Math.min(ah, bh, ch); + besthi = -1; + } else { + var besths = 0; + for (var i = 0; i < _index.length; ++i) { + var ch = _subtriangulate(ai, bi, _index[i], _index); + var ah = _subtriangulate(bi, ci, _index[i], _index); + var bh = _subtriangulate(ci, ai, _index[i], _index); + var _besth = Math.min(ah, bh, ch); + var _besths = ah + bh + ch; + if (besth < _besth || Math.abs(besth - _besth) <= EPS && besths < _besths) { + besth = _besth; + besths = _besths; + besthi = _index[i]; + } + } + } + data[_i[0]][_i[1]-_i[0]][_i[2]-_i[1]] = {height: besth, index: besthi}; + } + return data[_i[0]][_i[1]-_i[0]][_i[2]-_i[1]].height; + } + var subindex = []; + for (var i = 0; i < locations.length; ++i) { + subindex.push(i); + } + var best = []; + for (var len = 1; len <= index.length - 1; ++len) { + best[len] = []; + for (var k = 0; k < index.length - len; ++k) { + var t = 0; + var tlen = -1; + for (var _len = 1; _len <= len - 1; ++_len) { + var _t = 0; + $.each([best[_len][k].height, best[len-_len][k+_len].height, subtriangulate(index[k], index[k+_len], index[k+len], subindex)], function(guid, __t) { + if (__t == 0) + return; + if (_t == 0 || _t > __t) + _t = __t; + }); + if (t == 0 || t < _t) { + t = _t; + tlen = _len; + } + } + best[len][k] = {height: t, length: tlen}; + } + } + + var edges = []; + var triangles = []; + var makesubtriangulation = function _makesubtriangulation(ai, bi, ci, depth) { + var _i = [ai, bi, ci].sort(function(a,b){return a-b;}); + if (data[_i[0]][_i[1]-_i[0]][_i[2]-_i[1]].index == -1) { + triangles.push(new window.plugin.flyLinks.Triangle(locations[ai], locations[bi], locations[ci], depth)); + } else { + _makesubtriangulation(ai, bi, data[_i[0]][_i[1]-_i[0]][_i[2]-_i[1]].index, depth+1); + _makesubtriangulation(bi, ci, data[_i[0]][_i[1]-_i[0]][_i[2]-_i[1]].index, depth+1); + _makesubtriangulation(ci, ai, data[_i[0]][_i[1]-_i[0]][_i[2]-_i[1]].index, depth+1); + edges.push(new window.plugin.flyLinks.Edge(locations[ai], locations[data[_i[0]][_i[1]-_i[0]][_i[2]-_i[1]].index], depth)); + edges.push(new window.plugin.flyLinks.Edge(locations[bi], locations[data[_i[0]][_i[1]-_i[0]][_i[2]-_i[1]].index], depth)); + edges.push(new window.plugin.flyLinks.Edge(locations[ci], locations[data[_i[0]][_i[1]-_i[0]][_i[2]-_i[1]].index], depth)); + } + } + var maketriangulation = function _maketriangulation(len, a) { + edges.push(new window.plugin.flyLinks.Edge(locations[index[a]], locations[index[a+len]], 0)); + if (best[len][a].length == -1) + return; + makesubtriangulation(index[a], index[a+best[len][a].length], index[a+len], 1); + _maketriangulation(best[len][a].length, a); + _maketriangulation(len - best[len][a].length, a + best[len][a].length); + } + maketriangulation(index.length - 1, 0); + return {edges: edges, triangles: triangles}; + } + + var triangulation = triangulate(index, locations); + var edges = triangulation.edges; + var triangles = triangulation.triangles; + + $.each(edges, function(idx, edge) { + drawLink(edge.a, edge.b, { + color: '#FF0000', + opacity: 1, + weight: 1.5, + clickable: false, + smoothFactor: 10, + dashArray: [6, 4], + }); + }); + + $.each(triangles, function(idx, triangle) { + drawField(triangle.a, triangle.b, triangle.c, { + stroke: false, + fill: true, + fillColor: '#FF0000', + fillOpacity: 1 - Math.pow(0.85, triangle.depth), + clickable: false, + }); + }); +} + +window.plugin.flyLinks.Edge = function(a, b, depth) { + this.a = a; + this.b = b; + this.depth = depth; +} + +window.plugin.flyLinks.Triangle = function(a, b, c, depth) { + this.a = a; + this.b = b; + this.c = c; + this.depth = depth; +} + +window.plugin.flyLinks.setup = function() { + window.plugin.flyLinks.linksLayerGroup = new L.LayerGroup(); + window.plugin.flyLinks.fieldsLayerGroup = new L.LayerGroup(); + + window.addHook('mapDataRefreshEnd', function(e) { + window.plugin.flyLinks.updateLayer(); + }); + + window.map.on('moveend', function() { + window.plugin.flyLinks.updateLayer(); + }); + + window.addLayerGroup('Fly links', window.plugin.flyLinks.linksLayerGroup, false); + window.addLayerGroup('Fly fields', window.plugin.flyLinks.fieldsLayerGroup, false); +} +var setup = window.plugin.flyLinks.setup; + +// PLUGIN END ////////////////////////////////////////////////////////// + + +setup.info = plugin_info; //add the script info data to the function as a property +if(!window.bootPlugins) window.bootPlugins = []; +window.bootPlugins.push(setup); +// if IITC has already booted, immediately run the 'setup' function +if(window.iitcLoaded && typeof setup === 'function') setup(); +} // wrapper end +// inject code into site context +var script = document.createElement('script'); +var info = {}; +if (typeof GM_info !== 'undefined' && GM_info && GM_info.script) info.script = { version: GM_info.script.version, name: GM_info.script.name, description: GM_info.script.description }; +script.appendChild(document.createTextNode('('+ wrapper +')('+JSON.stringify(info)+');')); +(document.body || document.head || document.documentElement).appendChild(script); + + diff --git a/mobile/assets/plugins/guess-player-levels.user.js b/mobile/assets/plugins/guess-player-levels.user.js new file mode 100644 index 000000000..2798a09d4 --- /dev/null +++ b/mobile/assets/plugins/guess-player-levels.user.js @@ -0,0 +1,582 @@ +// ==UserScript== +// @id iitc-plugin-guess-player-levels@breunigs +// @name IITC plugin: guess player level +// @category Info +// @version 0.5.7.20181030.90244 +// @namespace https://github.com/jonatkins/ingress-intel-total-conversion +// @updateURL none +// @downloadURL none +// @description [mobile-2018-10-30-090244] Try to determine player levels from the data available in the current view. +// @include https://*.ingress.com/intel* +// @include http://*.ingress.com/intel* +// @match https://*.ingress.com/intel* +// @match http://*.ingress.com/intel* +// @include https://*.ingress.com/mission/* +// @include http://*.ingress.com/mission/* +// @match https://*.ingress.com/mission/* +// @match http://*.ingress.com/mission/* +// @grant none +// ==/UserScript== + + +function wrapper(plugin_info) { +// ensure plugin framework is there, even if iitc is not yet loaded +if(typeof window.plugin !== 'function') window.plugin = function() {}; + +//PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! +//(leaving them in place might break the 'About IITC' page or break update checks) +plugin_info.buildName = 'mobile'; +plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.pluginId = 'guess-player-levels'; +//END PLUGIN AUTHORS NOTE + + + +// PLUGIN START //////////////////////////////////////////////////////// + +// use own namespace for plugin +window.plugin.guessPlayerLevels = function() {}; +window.plugin.guessPlayerLevels.BURSTER_RANGES = [0, 42, 48, 58, 72, 90, 112, 138, 168]; + +// we prepend a hash sign (#) in front of the player name in storage in order to prevent accessing a pre-defined property +// (like constructor, __defineGetter__, etc. + +window.plugin.guessPlayerLevels.setupCallback = function() { + $('#toolbox').append(' Guess player levels'); + addHook('portalDetailLoaded', window.plugin.guessPlayerLevels.extractPortalData); + addHook('publicChatDataAvailable', window.plugin.guessPlayerLevels.extractChatData); +} + + +// This function is intended to be called by other plugins +window.plugin.guessPlayerLevels.fetchLevelByPlayer = function(nick) { + var cache = window.plugin.guessPlayerLevels._nameToLevelCache; + + if(cache['#' + nick] === undefined) + cache = window.plugin.guessPlayerLevels._loadLevels(); + + var details = cache['#' + nick]; + if(details === undefined) + return 1; + if(typeof details === 'number') + return details; + return details.guessed; +} + +// This function is intended to be called by other plugins +window.plugin.guessPlayerLevels.fetchLevelDetailsByPlayer = function(nick) { + var cache = window.plugin.guessPlayerLevels._nameToLevelCache; + + if(cache['#' + nick] === undefined) + cache = window.plugin.guessPlayerLevels._loadLevels(); + + var details = cache['#' + nick]; + if(details === undefined) + return {min: 1, guessed: 1}; + if(typeof details === 'number') + return {min: 1, guessed: details}; + return details; +} + +window.plugin.guessPlayerLevels._nameToLevelCache = {}; +window.plugin.guessPlayerLevels._localStorageLastUpdate = 0; + +window.plugin.guessPlayerLevels._loadLevels = function() { + // no use in reading localStorage repeatedly + if(window.plugin.guessPlayerLevels._localStorageLastUpdate < Date.now() - 10*1000) { + try { + var cache = JSON.parse(localStorage['plugin-guess-player-levels']) + window.plugin.guessPlayerLevels._nameToLevelCache = cache; + window.plugin.guessPlayerLevels._localStorageLastUpdate = Date.now(); + } catch(e) { + } + } + + return window.plugin.guessPlayerLevels._nameToLevelCache; +} + +window.plugin.guessPlayerLevels.setLevelTitle = function(dom) { + // expects dom node with nick in its child text node + + var el = $(dom); + var nick = el.text(); + if (nick[0] == '@') nick = nick.substring(1); + + var details = window.plugin.guessPlayerLevels.fetchLevelDetailsByPlayer(nick); + + function getLevel(lvl) { + return ''+lvl+''; + } + + var text = '' + nick + '\n'; + text += 'Min player level: ' + getLevel(details.min); + if(details.min != details.guessed) + text += '\nGuessed player level: ' + getLevel(details.guessed); + + window.setupTooltips(el); + + /* + This code looks hacky but since we are a little late within the mouseenter so + we need to improvise a little. The open method doesn't open the tooltip directly. + It starts the whole opening procedure (including the timeout etc) and is normally + started by the mousemove event of the enhanced element. + */ + el.addClass('help') // Add the "Help Mouse Cursor" + .attr('title', text) // Set the title for the jquery tooltip + .tooltip('open') // Start the "open" method + .attr('title', null); // And remove the title to prevent the browsers tooltip +} + +window.plugin.guessPlayerLevels.setupChatNickHelper = function() { + $(document).on('mouseenter', '.nickname, .pl_nudge_player', function() { + window.plugin.guessPlayerLevels.setLevelTitle(this); + }); +} + +window.plugin.guessPlayerLevels.extractPortalData = function(data) { + if(!data.success) return; + + var r = data.details.resonators; + + /* Due to the Jarvis Virus/ADA Refactor it's possible for a player to own resonators on a portal at a higher level + than the player themselves. It is not possible to detect for sure when this has happened, but in many cases it will + result in an impossible deployment arrangement (more than 1 L8/7 res, more than 2 L6/5 res, etc). If we detect this + case, we ignore all resonators owned by that player on the portal + Hint: This can only happen to the owner of the portal, so resonators by other players can be used to determine + their minimal level */ + + var owner = data.details.owner && data.details.owner || ""; + var ownerModCount = 0; + data.details.mods.forEach(function(mod) { + if(mod && mod.owner == owner) + ownerModCount++; + }); + + var players = {}; + + $.each(r, function(ind, reso) { + if(!reso) return true; + + if(!players[reso.owner]) players[reso.owner] = []; + + if(players[reso.owner][reso.level] === undefined) + players[reso.owner][reso.level] = 1 + else + players[reso.owner][reso.level]++; + }); + + for(nickname in players) { + var ignore = false; + var minLevel = 0; + + if(nickname == owner) { + if(ownerModCount > 2) // more than 2 mods by capturing player --> portal was flipped, ignore their resonators + continue; + var certain = false; + } else { // not deployed by owner - player must be at least that level + var certain = true; + } + + players[nickname].forEach(function(count, level) { + if(MAX_RESO_PER_PLAYER[level] < count) + ignore = true; + + if(count > 0) + minLevel = level; + }); + + if(ignore) + continue; + + window.plugin.guessPlayerLevels.savePlayerLevel(nickname, minLevel, certain); + } +} + +window.plugin.guessPlayerLevels.extractChatData = function(data) { + var attackData = {}; + function addAttackMessage(nick, timestamp, portal) { + var details = window.plugin.guessPlayerLevels.fetchLevelDetailsByPlayer(nick); + if(details.guessed == 8 || details.min == 8) return; // we wouldn't get better results, so skip the calcula + if(!attackData[nick]) attackData[nick] = {}; + if(!attackData[nick][timestamp]) attackData[nick][timestamp] = []; + attackData[nick][timestamp].push(portal); + } + + data.result.forEach(function(msg) { + var plext = msg[2].plext; + + // search for "x deployed an Ly Resonator on z" + if(plext.plextType == 'SYSTEM_BROADCAST' + && plext.markup.length==5 + && plext.markup[0][0] == 'PLAYER' + && plext.markup[1][0] == 'TEXT' + && plext.markup[1][1].plain == ' deployed an ' + && plext.markup[2][0] == 'TEXT' + && plext.markup[3][0] == 'TEXT' + && plext.markup[3][1].plain == ' Resonator on ') { + var nick = plext.markup[0][1].plain; + var lvl = parseInt(plext.markup[2][1].plain.substr(1)); + window.plugin.guessPlayerLevels.savePlayerLevel(nick, lvl, true); + } + + // search for "x destroyed an Ly Resonator on z" + if(plext.plextType == 'SYSTEM_BROADCAST' + && plext.markup.length==5 + && plext.markup[0][0] == 'PLAYER' + && plext.markup[1][0] == 'TEXT' + && plext.markup[1][1].plain == ' destroyed an ' + && plext.markup[2][0] == 'TEXT' + && plext.markup[3][0] == 'TEXT' + && plext.markup[3][1].plain == ' Resonator on ') { + var nick = plext.markup[0][1].plain; + var portal = plext.markup[4][1]; + addAttackMessage(nick, msg[1], portal) + } + + // search for "Your Lx Resonator on y was destroyed by z" + if(plext.plextType == 'SYSTEM_NARROWCAST' + && plext.markup.length==6 + && plext.markup[0][0] == 'TEXT' + && plext.markup[0][1].plain == 'Your ' + && plext.markup[1][0] == 'TEXT' + && plext.markup[2][0] == 'TEXT' + && plext.markup[2][1].plain == ' Resonator on ' + && plext.markup[3][0] == 'PORTAL' + && plext.markup[4][0] == 'TEXT' + && plext.markup[4][1].plain == ' was destroyed by ' + && plext.markup[5][0] == 'PLAYER') { + var nick = plext.markup[5][1].plain; + var portal = plext.markup[3][1]; + addAttackMessage(nick, msg[1], portal) + } + + // search for "Your Portal x neutralized by y" + // search for "Your Portal x is under attack by y" + if(plext.plextType == 'SYSTEM_NARROWCAST' + && plext.markup.length==4 + && plext.markup[0][0] == 'TEXT' + && plext.markup[0][1].plain == 'Your Portal ' + && plext.markup[1][0] == 'PORTAL' + && plext.markup[2][0] == 'TEXT' + && (plext.markup[2][1].plain == ' neutralized by ' || plext.markup[2][1].plain == ' is under attack by ') + && plext.markup[3][0] == 'PLAYER') { + var nick = plext.markup[3][1].plain; + var portal = plext.markup[1][1]; + addAttackMessage(nick, msg[1], portal) + } + }); + + for(nick in attackData) { + for(timestamp in attackData[nick]) { + // remove duplicates + var latlngs = []; + var portals = {}; + attackData[nick][timestamp].forEach(function(portal) { + // no GUID in the data any more - but we need some unique string. use the latE6,lngE6 + var id = portal.latE6+","+portal.lngE6; + if(portals.hasOwnProperty(id)) + return; + portals[id] = 1; + latlngs.push({x: portal.lngE6/1E6, y:portal.latE6/1E6}); + }); + if(latlngs.length < 2) // we need at least 2 portals to calculate burster range + continue; + + window.plugin.guessPlayerLevels.handleAttackData(nick, latlngs); + } + } +}; + +window.plugin.guessPlayerLevels.handleAttackData = function(nick, latlngs) { + /* + This is basically the smallest enclosing circle problem. The algorithm is for points on a plane, but for our ranges + (X8 has 168m) this should work. + http://www.cs.uu.nl/docs/vakken/ga/slides4b.pdf + http://nayuki.eigenstate.org/page/smallest-enclosing-circle + http://everything2.com/title/Circumcenter + */ + var circle = { + x: latlngs[0].x, + y: latlngs[0].y, + radius: 0 + }; + for(var i=1; i range) + range = d; + } + + // In earlier versions, the algorithm failed. Should be fixed now, but just to be sure, we ignore escalating values... + if(circle.x == 0 || circle.y == 0 || range > 1000) { + console.warn("ignoring attack data: ", nick, latlngs, circle, range); + return; + } + + var burster = window.plugin.guessPlayerLevels.BURSTER_RANGES; + + + // res can be up to 40m from a portal, so attack notifications for portals, say, 100m apart could + // actually be a weapon range as low as 20m. however, typical deployments are a bit less than 40m, and resonators + // can only be deployed on the 8 compass points. a value of 40m x 2 would never be wrong + var reso_range_correction = 40*2; + // however, the full correction often under-estimates. + + for(var i=burster.length-1; i>=1; i--) { + if(range >= (burster[i]+reso_range_correction)) { + window.plugin.guessPlayerLevels.savePlayerLevel(nick, Math.min(i+1, MAX_PORTAL_LEVEL), true); + break; + } + } + + //L.circle(latlng, range, { + // weight:1, + // title: nick + ", " + range + "m" + //}).addTo(map); +} + +window.plugin.guessPlayerLevels.calculateCircleWithAnchor = function(latlngs, anchor) { + var circle = { + x: anchor.x, + y: anchor.y, + radius: 0 + }; + for(var i=0; i= level) + return; + + details.min = level; + if(details.guessed < details.min) + details.guessed = details.min; + } else { + if(details.guessed >= level) + return; + + details.guessed = level; + } + + window.plugin.guessPlayerLevels._nameToLevelCache['#' + nick] = details; + + // to minimize accesses to localStorage, writing is delayed a bit + + if(window.plugin.guessPlayerLevels._writeTimeout) + clearTimeout(window.plugin.guessPlayerLevels._writeTimeout); + + window.plugin.guessPlayerLevels._writeTimeout = setTimeout(function() { + localStorage['plugin-guess-player-levels'] = JSON.stringify(window.plugin.guessPlayerLevels._nameToLevelCache); + }, 500); +} + +window.plugin.guessPlayerLevels.guess = function() { + var playersRes = {}; + var playersEnl = {}; + $.each(window.portals, function(guid,p) { + var details = portalDetail.get(guid); + if(details) { + var r = details.resonators; + $.each(r, function(ind, reso) { + if(!reso) return true; + var nick = reso.owner; + if(isSystemPlayer(nick)) return true; + + var lvl = window.plugin.guessPlayerLevels.fetchLevelDetailsByPlayer(nick).min; + if(!lvl) return true; + + if(getTeam(details) === TEAM_ENL) + playersEnl[nick] = lvl; + else + playersRes[nick] = lvl; + }); + + if(details.captured) { + var nick = details.owner; + if(isSystemPlayer(nick)) return true; + var lvl = window.plugin.guessPlayerLevels.fetchLevelDetailsByPlayer(nick).min; + if(!lvl) return true; + + if(getTeam(details) === TEAM_ENL) + playersEnl[nick] = lvl; + else + playersRes[nick] = lvl; + } + } + }); + + var s = 'Players have at least the following level:\n\n'; + s += 'Resistance:\t   \tEnlightened:\t\n'; + + var namesR = plugin.guessPlayerLevels.sort(playersRes); + var namesE = plugin.guessPlayerLevels.sort(playersEnl); + var totallvlR = 0; + var totallvlE = 0; + var max = Math.max(namesR.length, namesE.length); + + function makeRow(nick, lvl, team) { + if(!nick) + return '\t'; + + var color = COLORS[team]; + if (nick === window.PLAYER.nickname) color = '#fd6'; //highlight the player's name in a unique colour (similar to @player mentions from others in the chat text itself) + + return ''+nick+'\t' + lvl; + } + + var nick, lvl, lineE, lineR; + for(var i = 0; i < max; i++) { + nick = namesR[i]; + lvl = playersRes[nick]; + lineR = makeRow(nick, lvl, TEAM_RES); + if(!isNaN(parseInt(lvl))) + totallvlR += parseInt(lvl); + + nick = namesE[i]; + lvl = playersEnl[nick]; + lineE = makeRow(nick, lvl, TEAM_ENL); + if(!isNaN(parseInt(lvl))) + totallvlE += parseInt(lvl); + + s += '\n'+lineR + '\t' + lineE + '\n'; + } + s += '\nTotal level :\t'+totallvlR+'\tTotal level :\t'+totallvlE; + s += '\nTotal player:\t'+namesR.length+'\tTotal player:\t'+namesE.length; + var averageR = 0, averageE = 0; + if (namesR.length > 0) averageR = (totallvlR/namesR.length); + if (namesE.length > 0) averageE = (totallvlE/namesE.length); + s += '\nAverage level:\t'+averageR.toFixed(2)+'\tAverage level:\t'+averageE.toFixed(2); + s += '\n\nOnly players from recently viewed portal details are listed.' + + dialog({ + text: s, + title: 'Player levels: R' + averageR.toFixed(2) + ', E' + averageE.toFixed(2), + id: 'guess-player-levels', + width: 350, + buttons: { + 'RESET GUESSES': function() { + // clear all guessed levels from local storage + localStorage.removeItem('plugin-guess-player-levels') + window.plugin.guessPlayerLevels._nameToLevelCache = {} + // now force all portals through the callback manually + $.each(window.portals, function(guid,p) { + var details = portalDetail.get(guid); + if(details) + window.plugin.guessPlayerLevels.extractPortalData({details:details, success:true}); + }); + // and re-open the dialog (on a minimal timeout - so it's not closed while processing this callback) + setTimeout(window.plugin.guessPlayerLevels.guess,1); + }, + } + }); +} + +window.plugin.guessPlayerLevels.sort = function(playerHash) { + return Object.keys(playerHash).sort(function(a, b) { + if(playerHash[a] < playerHash[b]) return 1; + if(playerHash[a] > playerHash[b]) return -1; + + if (a.toLowerCase() < b.toLowerCase()) return -1; + if (a.toLowerCase() > b.toLowerCase()) return 1; + return 0; + }); +} + + +var setup = function() { + // we used to store level guesses as one localStorage key per player, named 'level-PLAYER_GUID' + // they're now stored in a single storage key - 'plugin-guess-player-levels' - so clear these old entries + $.each(Object.keys(localStorage), function(ind,key) {// legacy code - should be removed in the future + if(key.lastIndexOf('level-',0)===0) { + localStorage.removeItem(key); + } + }); + + window.plugin.guessPlayerLevels.setupCallback(); + window.plugin.guessPlayerLevels.setupChatNickHelper(); +} + +// PLUGIN END ////////////////////////////////////////////////////////// + + +setup.info = plugin_info; //add the script info data to the function as a property +if(!window.bootPlugins) window.bootPlugins = []; +window.bootPlugins.push(setup); +// if IITC has already booted, immediately run the 'setup' function +if(window.iitcLoaded && typeof setup === 'function') setup(); +} // wrapper end +// inject code into site context +var script = document.createElement('script'); +var info = {}; +if (typeof GM_info !== 'undefined' && GM_info && GM_info.script) info.script = { version: GM_info.script.version, name: GM_info.script.name, description: GM_info.script.description }; +script.appendChild(document.createTextNode('('+ wrapper +')('+JSON.stringify(info)+');')); +(document.body || document.head || document.documentElement).appendChild(script); + + diff --git a/mobile/assets/plugins/iitc-ditigal-bumper-sticker.user.js b/mobile/assets/plugins/iitc-ditigal-bumper-sticker.user.js new file mode 100644 index 000000000..4aa88576f --- /dev/null +++ b/mobile/assets/plugins/iitc-ditigal-bumper-sticker.user.js @@ -0,0 +1,33 @@ +// ==UserScript== +// @id iitc-digital-bumper-sticker +// @name IITC Digital Bumper Sticker +// @category Stock +// @version 0.1.1.20181030.90244 +// @namespace https://github.com/jonatkins/ingress-intel-total-conversion +// @updateURL none +// @downloadURL none +// @description [mobile-2018-10-30-090244] Adds a "I'd rather be using IITC" logo to the standard intel map. +// @include https://*.ingress.com/intel* +// @include http://*.ingress.com/intel* +// @match https://*.ingress.com/intel* +// @match http://*.ingress.com/intel* +// @include https://*.ingress.com/mission/* +// @include http://*.ingress.com/mission/* +// @match https://*.ingress.com/mission/* +// @match http://*.ingress.com/mission/* +// @grant none +// ==/UserScript== + +var targetContainer = document.getElementById('dashboard_container'); +if (targetContainer) { + + var logoDiv = document.createElement('div'); + logoDiv.setAttribute('style', "position: fixed; left: 20px; top: 130px; z-index: auto; pointer-events: none;"); + + var img = document.createElement('img'); + img.setAttribute('src', 'http://iitc.me/assets/img/prefer-iitc-200.png'); + + logoDiv.appendChild(img); + + targetContainer.appendChild(logoDiv); +} diff --git a/mobile/assets/plugins/ipas-link.user.js b/mobile/assets/plugins/ipas-link.user.js new file mode 100644 index 000000000..438a50d4b --- /dev/null +++ b/mobile/assets/plugins/ipas-link.user.js @@ -0,0 +1,20 @@ +// ==UserScript== +// @id iitc-plugin-ipas-link@graphracer +// @name IITC Plugin: simulate an attack on portal +// @category Deleted +// @version 0.3.0.20181030.90244 +// @namespace https://github.com/xosofox/IPAS +// @updateURL none +// @downloadURL none +// @description [mobile-2018-10-30-090244] No longer available, as the resonator slot number and deployment distance is no longer available +// @include https://*.ingress.com/intel* +// @include http://*.ingress.com/intel* +// @match https://*.ingress.com/intel* +// @match http://*.ingress.com/intel* +// @include https://*.ingress.com/mission/* +// @include http://*.ingress.com/mission/* +// @match https://*.ingress.com/mission/* +// @match http://*.ingress.com/mission/* +// @grant none +// ==/UserScript== + diff --git a/mobile/assets/plugins/keys-on-map.user.js b/mobile/assets/plugins/keys-on-map.user.js new file mode 100644 index 000000000..0c9fb6dd0 --- /dev/null +++ b/mobile/assets/plugins/keys-on-map.user.js @@ -0,0 +1,166 @@ +// ==UserScript== +// @id iitc-plugin-keys-on-map@xelio +// @name IITC plugin: Keys on map +// @category Keys +// @version 0.2.1.20181030.90244 +// @namespace https://github.com/jonatkins/ingress-intel-total-conversion +// @updateURL none +// @downloadURL none +// @description [mobile-2018-10-30-090244] Show the manually entered key counts from the 'keys' plugin on the map. +// @include https://*.ingress.com/intel* +// @include http://*.ingress.com/intel* +// @match https://*.ingress.com/intel* +// @match http://*.ingress.com/intel* +// @include https://*.ingress.com/mission/* +// @include http://*.ingress.com/mission/* +// @match https://*.ingress.com/mission/* +// @match http://*.ingress.com/mission/* +// @grant none +// ==/UserScript== + + +function wrapper(plugin_info) { +// ensure plugin framework is there, even if iitc is not yet loaded +if(typeof window.plugin !== 'function') window.plugin = function() {}; + +//PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! +//(leaving them in place might break the 'About IITC' page or break update checks) +plugin_info.buildName = 'mobile'; +plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.pluginId = 'keys-on-map'; +//END PLUGIN AUTHORS NOTE + + + +// PLUGIN START //////////////////////////////////////////////////////// + +// use own namespace for plugin +window.plugin.keysOnMap = function() {}; + +window.plugin.keysOnMap.keyLayers = {}; + +// Use portal add and remove event to control render of keys +window.plugin.keysOnMap.portalAdded = function(data) { + // Disable if Plugin Keys is not there + if(!plugin.keys) { + plugin.keysOnMap.disableMessage(); + return; + } + + data.portal.on('add', function() { + plugin.keysOnMap.renderKey(this.options.guid, this.getLatLng()); + }); + + data.portal.on('remove', function() { + plugin.keysOnMap.removeKey(this.options.guid); + }); +} + +window.plugin.keysOnMap.keyUpdate = function(data) { + // Disable if Plugin Keys is not there + if(!plugin.keys) { + plugin.keysOnMap.disableMessage(); + return; + } + var portal = window.portals[data.guid]; + if(!portal) return; + var latLng = portal.getLatLng(); + + plugin.keysOnMap.renderKey(data.guid, latLng) +} + +window.plugin.keysOnMap.refreshAllKeys = function() { + plugin.keysOnMap.keyLayerGroup.clearLayers(); + $.each(plugin.keys.keys, function(key, count) { + plugin.keysOnMap.keyUpdate({guid: key}); + }); +} + +window.plugin.keysOnMap.renderKey = function(guid,latLng) { + plugin.keysOnMap.removeKey(guid); + + var keyCount = plugin.keys.keys[guid]; + if (keyCount > 0) { + var key = L.marker(latLng, { + icon: L.divIcon({ + className: 'plugin-keys-on-map-key', + iconAnchor: [6,7], + iconSize: [12,10], + html: keyCount + }), + guid: guid + }); + + plugin.keysOnMap.keyLayers[guid] = key; + key.addTo(plugin.keysOnMap.keyLayerGroup); + } +} + +window.plugin.keysOnMap.removeKey = function(guid) { + var previousLayer = plugin.keysOnMap.keyLayers[guid]; + if(previousLayer) { + plugin.keysOnMap.keyLayerGroup.removeLayer(previousLayer); + delete plugin.keysOnMap.keyLayers[guid]; + } +} + +window.plugin.keysOnMap.disableMessage = function() { + if(!plugin.keysOnMap.messageShown) { + alert('Plugin "Keys On Map" need plugin "Keys" to run!'); + plugin.keysOnMap.messageShown = true; + } +} + +window.plugin.keysOnMap.setupCSS = function() { + $("'); + + +} +var setup = window.plugin.maxLinks.setup; + +// PLUGIN END ////////////////////////////////////////////////////////// + + +setup.info = plugin_info; //add the script info data to the function as a property +if(!window.bootPlugins) window.bootPlugins = []; +window.bootPlugins.push(setup); +// if IITC has already booted, immediately run the 'setup' function +if(window.iitcLoaded && typeof setup === 'function') setup(); +} // wrapper end +// inject code into site context +var script = document.createElement('script'); +var info = {}; +if (typeof GM_info !== 'undefined' && GM_info && GM_info.script) info.script = { version: GM_info.script.version, name: GM_info.script.name, description: GM_info.script.description }; +script.appendChild(document.createTextNode('('+ wrapper +')('+JSON.stringify(info)+');')); +(document.body || document.head || document.documentElement).appendChild(script); + + diff --git a/mobile/assets/plugins/minimap.user.js b/mobile/assets/plugins/minimap.user.js new file mode 100644 index 000000000..e2f70c71a --- /dev/null +++ b/mobile/assets/plugins/minimap.user.js @@ -0,0 +1,322 @@ +// ==UserScript== +// @id iitc-plugin-minimap@breunigs +// @name IITC plugin: Mini map +// @category Controls +// @version 0.2.0.20181030.90244 +// @namespace https://github.com/jonatkins/ingress-intel-total-conversion +// @updateURL none +// @downloadURL none +// @description [mobile-2018-10-30-090244] Show a mini map on the corner of the map. +// @include https://*.ingress.com/intel* +// @include http://*.ingress.com/intel* +// @match https://*.ingress.com/intel* +// @match http://*.ingress.com/intel* +// @include https://*.ingress.com/mission/* +// @include http://*.ingress.com/mission/* +// @match https://*.ingress.com/mission/* +// @match http://*.ingress.com/mission/* +// @grant none +// ==/UserScript== + + +function wrapper(plugin_info) { +// ensure plugin framework is there, even if iitc is not yet loaded +if(typeof window.plugin !== 'function') window.plugin = function() {}; + +//PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! +//(leaving them in place might break the 'About IITC' page or break update checks) +plugin_info.buildName = 'mobile'; +plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.pluginId = 'minimap'; +//END PLUGIN AUTHORS NOTE + + + +// PLUGIN START //////////////////////////////////////////////////////// + + +// use own namespace for plugin +window.plugin.miniMap = function() {}; + +window.plugin.miniMap.setup = function() { + + try { console.log('Loading leaflet.draw JS now'); } catch(e) {} + L.Control.MiniMap = L.Control.extend({ + options: { + position: 'bottomright', + toggleDisplay: false, + zoomLevelOffset: -5, + zoomLevelFixed: false, + zoomAnimation: false, + autoToggleDisplay: false, + width: 150, + height: 150 + }, + + hideText: 'Hide MiniMap', + + showText: 'Show MiniMap', + + //layer is the map layer to be shown in the minimap + initialize: function (layer, options) { + L.Util.setOptions(this, options); + this._layer = layer; + }, + + onAdd: function (map) { + + this._mainMap = map; + + //Creating the container and stopping events from spilling through to the main map. + this._container = L.DomUtil.create('div', 'leaflet-control-minimap'); + this._container.style.width = this.options.width + 'px'; + this._container.style.height = this.options.height + 'px'; + L.DomEvent.disableClickPropagation(this._container); + L.DomEvent.on(this._container, 'mousewheel', L.DomEvent.stopPropagation); + + + this._miniMap = new L.Map(this._container, + { + attributionControl: false, + zoomControl: false, + zoomAnimation: this.options.zoomAnimation, + autoToggleDisplay: this.options.autoToggleDisplay, + touchZoom: !this.options.zoomLevelFixed, + scrollWheelZoom: !this.options.zoomLevelFixed, + doubleClickZoom: !this.options.zoomLevelFixed, + boxZoom: !this.options.zoomLevelFixed, + crs: map.options.crs + }); + + this._miniMap.addLayer(this._layer); + + //These bools are used to prevent infinite loops of the two maps notifying each other that they've moved. + this._mainMapMoving = false; + this._miniMapMoving = false; + + //Keep a record of this to prevent auto toggling when the user explicitly doesn't want it. + this._userToggledDisplay = false; + this._minimized = false; + + if (this.options.toggleDisplay) { + this._addToggleButton(); + } + + this._miniMap.whenReady(L.Util.bind(function () { + this._aimingRect = L.rectangle(this._mainMap.getBounds(), {color: "#ff7800", weight: 1, clickable: false}).addTo(this._miniMap); + this._shadowRect = L.rectangle(this._mainMap.getBounds(), {color: "#000000", weight: 1, clickable: false,opacity:0,fillOpacity:0}).addTo(this._miniMap); + this._mainMap.on('moveend', this._onMainMapMoved, this); + this._mainMap.on('move', this._onMainMapMoving, this); + this._miniMap.on('movestart', this._onMiniMapMoveStarted, this); + this._miniMap.on('move', this._onMiniMapMoving, this); + this._miniMap.on('moveend', this._onMiniMapMoved, this); + }, this)); + + return this._container; + }, + + addTo: function (map) { + L.Control.prototype.addTo.call(this, map); + this._miniMap.setView(this._mainMap.getCenter(), this._decideZoom(true)); + this._setDisplay(this._decideMinimized()); + return this; + }, + + onRemove: function (map) { + this._mainMap.off('moveend', this._onMainMapMoved, this); + this._mainMap.off('move', this._onMainMapMoving, this); + this._miniMap.off('moveend', this._onMiniMapMoved, this); + + this._miniMap.removeLayer(this._layer); + }, + + _addToggleButton: function () { + this._toggleDisplayButton = this.options.toggleDisplay ? this._createButton( + '', this.hideText, 'leaflet-control-minimap-toggle-display', this._container, this._toggleDisplayButtonClicked, this) : undefined; + }, + + _createButton: function (html, title, className, container, fn, context) { + var link = L.DomUtil.create('a', className, container); + link.innerHTML = html; + link.href = '#'; + link.title = title; + + var stop = L.DomEvent.stopPropagation; + + L.DomEvent + .on(link, 'click', stop) + .on(link, 'mousedown', stop) + .on(link, 'dblclick', stop) + .on(link, 'click', L.DomEvent.preventDefault) + .on(link, 'click', fn, context); + + return link; + }, + + _toggleDisplayButtonClicked: function () { + this._userToggledDisplay = true; + if (!this._minimized) { + this._minimize(); + this._toggleDisplayButton.title = this.showText; + } + else { + this._restore(); + this._toggleDisplayButton.title = this.hideText; + } + }, + + _setDisplay: function (minimize) { + if (minimize != this._minimized) { + if (!this._minimized) { + this._minimize(); + } + else { + this._restore(); + } + } + }, + + _minimize: function () { + // hide the minimap + if (this.options.toggleDisplay) { + this._container.style.width = '19px'; + this._container.style.height = '19px'; + this._toggleDisplayButton.className += ' minimized'; + } + else { + this._container.style.display = 'none'; + } + this._minimized = true; + }, + + _restore: function () { + if (this.options.toggleDisplay) { + this._container.style.width = this.options.width + 'px'; + this._container.style.height = this.options.height + 'px'; + this._toggleDisplayButton.className = this._toggleDisplayButton.className + .replace(/(?:^|\s)minimized(?!\S)/g, ''); + } + else { + this._container.style.display = 'block'; + } + this._minimized = false; + }, + + _onMainMapMoved: function (e) { + if (!this._miniMapMoving) { + this._mainMapMoving = true; + this._miniMap.setView(this._mainMap.getCenter(), this._decideZoom(true)); + this._setDisplay(this._decideMinimized()); + } else { + this._miniMapMoving = false; + } + this._aimingRect.setBounds(this._mainMap.getBounds()); + }, + + _onMainMapMoving: function (e) { + this._aimingRect.setBounds(this._mainMap.getBounds()); + }, + + _onMiniMapMoveStarted:function (e) { + var lastAimingRect = this._aimingRect.getBounds(); + var sw = this._miniMap.latLngToContainerPoint(lastAimingRect.getSouthWest()); + var ne = this._miniMap.latLngToContainerPoint(lastAimingRect.getNorthEast()); + this._lastAimingRectPosition = {sw:sw,ne:ne}; + }, + + _onMiniMapMoving: function (e) { + if (!this._mainMapMoving && this._lastAimingRectPosition) { + this._shadowRect.setBounds(new L.LatLngBounds(this._miniMap.containerPointToLatLng(this._lastAimingRectPosition.sw),this._miniMap.containerPointToLatLng(this._lastAimingRectPosition.ne))); + this._shadowRect.setStyle({opacity:1,fillOpacity:0.3}); + } + }, + + _onMiniMapMoved: function (e) { + if (!this._mainMapMoving) { + this._miniMapMoving = true; + this._mainMap.setView(this._miniMap.getCenter(), this._decideZoom(false)); + this._shadowRect.setStyle({opacity:0,fillOpacity:0}); + } else { + this._mainMapMoving = false; + } + }, + + _decideZoom: function (fromMaintoMini) { + if (!this.options.zoomLevelFixed) { + if (fromMaintoMini) + return this._mainMap.getZoom() + this.options.zoomLevelOffset; + else + return this._miniMap.getZoom() - this.options.zoomLevelOffset; + } else { + if (fromMaintoMini) + return this.options.zoomLevelFixed; + else + return this._mainMap.getZoom(); + } + }, + + _decideMinimized: function () { + if (this._userToggledDisplay) { + return this._minimized; + } + + if (this.options.autoToggleDisplay) { + if (this._mainMap.getBounds().contains(this._miniMap.getBounds())) { + return true; + } + return false; + } + + return this._minimized; + } +}); + +L.Map.mergeOptions({ + miniMapControl: false +}); + +L.Map.addInitHook(function () { + if (this.options.miniMapControl) { + this.miniMapControl = (new L.Control.MiniMap()).addTo(this); + } +}); + +L.control.minimap = function (options) { + return new L.Control.MiniMap(options); +}; + + try { console.log('done loading leaflet.draw JS'); } catch(e) {} + + // we can't use the same TileLayer as the main map uses - it causes issues. + // stick with the Google tiles for now + + // desktop mode - bottom-left, so it doesn't clash with the sidebar + // mobile mode - bottom-right - so it floats above the map copyright text + var position = isSmartphone() ? 'bottomright' : 'bottomleft'; + + setTimeout(function() { + new L.Control.MiniMap(new L.Google('ROADMAP',{maxZoom:21}), {toggleDisplay: true, position: position}).addTo(window.map); + }, 0); + + $('head').append(''); +}; + +var setup = window.plugin.miniMap.setup; + +// PLUGIN END ////////////////////////////////////////////////////////// + + +setup.info = plugin_info; //add the script info data to the function as a property +if(!window.bootPlugins) window.bootPlugins = []; +window.bootPlugins.push(setup); +// if IITC has already booted, immediately run the 'setup' function +if(window.iitcLoaded && typeof setup === 'function') setup(); +} // wrapper end +// inject code into site context +var script = document.createElement('script'); +var info = {}; +if (typeof GM_info !== 'undefined' && GM_info && GM_info.script) info.script = { version: GM_info.script.version, name: GM_info.script.name, description: GM_info.script.description }; +script.appendChild(document.createTextNode('('+ wrapper +')('+JSON.stringify(info)+');')); +(document.body || document.head || document.documentElement).appendChild(script); + + diff --git a/mobile/assets/plugins/missions.user.js b/mobile/assets/plugins/missions.user.js new file mode 100644 index 000000000..361f0f6bf --- /dev/null +++ b/mobile/assets/plugins/missions.user.js @@ -0,0 +1,1126 @@ +// ==UserScript== +// @id iitc-plugin-missions@jonatkins +// @name IITC plugin: Missions +// @category Info +// @version 0.1.2.20181030.90244 +// @namespace https://github.com/jonatkins/ingress-intel-total-conversion +// @updateURL none +// @downloadURL none +// @description [mobile-2018-10-30-090244] View missions. Marking progress on waypoints/missions basis. Showing mission paths on the map. +// @include https://*.ingress.com/intel* +// @include http://*.ingress.com/intel* +// @match https://*.ingress.com/intel* +// @match http://*.ingress.com/intel* +// @include https://*.ingress.com/mission/* +// @include http://*.ingress.com/mission/* +// @match https://*.ingress.com/mission/* +// @match http://*.ingress.com/mission/* +// @grant none +// ==/UserScript== + + +function wrapper(plugin_info) { +// ensure plugin framework is there, even if iitc is not yet loaded +if(typeof window.plugin !== 'function') window.plugin = function() {}; + +//PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! +//(leaving them in place might break the 'About IITC' page or break update checks) +plugin_info.buildName = 'mobile'; +plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.pluginId = 'missions'; +//END PLUGIN AUTHORS NOTE + + + +// PLUGIN START //////////////////////////////////////////////////////// + + +var decodeWaypoint = function(data) { + var result = { + hidden: data[0], + guid: data[1], + title: data[2], + typeNum: data[3], + type: [null, 'Portal', 'Field Trip'][data[3]], + objectiveNum: data[4], + objective: [null, 'Hack this Portal', 'Capture or Upgrade Portal', 'Create Link from Portal', 'Create Field from Portal', 'Install a Mod on this Portal', 'Take a Photo', 'View this Field Trip Waypoint', 'Enter the Passphrase'][data[4]], + }; + if (result.typeNum === 1 && data[5]) { + result.portal = window.decodeArray.portalSummary(data[5]); + // Portal waypoints have the same guid as the respective portal. + result.portal.guid = result.guid; + } + return result; +}; +var decodeMission = function(data) { + return { + guid: data[0], + title: data[1], + description: data[2], + authorNickname: data[3], + authorTeam: data[4], + // Notice: this format is weird(100%: 1.000.000) + ratingE6: data[5], + medianCompletionTimeMs: data[6], + numUniqueCompletedPlayers: data[7], + typeNum: data[8], + type: [null, 'Sequential', 'Non Sequential', 'Hidden'][data[8]], + waypoints: data[9].map(decodeWaypoint), + image: data[10] + }; +}; +var decodeMissionSummary = function(data) { + return { + guid: data[0], + title: data[1], + image: data[2], + ratingE6: data[3], + medianCompletionTimeMs: data[4] + }; +}; +var timeToRemaining = function(t) { + var data = parseInt(t / 86400) + 'd ' + (new Date(t % 86400 * 1000)).toUTCString().replace(/.*(\d{2}):(\d{2}):(\d{2}).*/, '$1h $2m $3s'); + data = data.replace('0d', ''); + data = data.replace('00h', ''); + data = data.replace('00m', ''); + return data.trim(); +}; +window.plugin.missions = { + // 3 days. + missionCacheTime: 3 * 24 * 3600 * 1E3, + // 3 weeks. + portalMissionsCacheTime: 21 * 24 * 3600 * 1E3, + + MISSION_COLOR: '#404000', + MISSION_COLOR_ACTIVE: '#7f7f00', + MISSION_COLOR_START: '#A6A600', + + SYNC_DELAY: 5000, + enableSync: false, + + missionTypeImages: [ + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAQMAAABsABwUAAAABlBMVEWN+1Sx+/dsz4yeAAAAAXRSTlMAQObYZgAAAClJREFUCNdjYIACxgcMDOwfGBjYKoAcCyCugOIPEDnGAxAMVnsAlQ8EAEkHCRVXxWK2AAAAAElFTkSuQmCC', + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAQMAAABsABwUAAAABlBMVEUAAACy+/gnk9HpAAAAAXRSTlMAQObYZgAAAB9JREFUCNdjYMAGBIBYAohlGBju/zsAxiA2WEwAqw4Az84Fw61PmPwAAAAASUVORK5CYII=', + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAQMAAABsABwUAAAABlBMVEUAAACy+/gnk9HpAAAAAXRSTlMAQObYZgAAAClJREFUCNdjYACBB0gYCBgFIJiJA4JZWCCYgwmCQaCA8QBD+d8DYBoIAN15B5HS9gdlAAAAAElFTkSuQmCC', + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAQMAAABsABwUAAAABlBMVEWq+02y+/jJjgLNAAAAAXRSTlMAQObYZgAAADdJREFUCNdjYAAC9gMMDDwPgIwEIAbSjA0MDMwgzADBIMAsAMQSQIYMA8P9fwfAGMRmAIkJMAAAQKIJxqg43P4AAAAASUVORK5CYII=', + ], + + onPortalSelected: function(event) { + /*if(event.selectedPortalGuid === event.unselectedPortalGuid) { + return; + }*/ + if (window.selectedPortal === null) { + return; + } + var portal = window.portals[window.selectedPortal]; + if (!portal || (!portal.options.data.mission && !portal.options.data.mission50plus)) { + return; + } + // After select. + setTimeout(function() { + // #resodetails + $('.linkdetails').append(''); + }, 0); + }, + + openTopMissions: function(bounds) { + bounds = bounds || window.map.getBounds(); + this.loadMissionsInBounds(bounds, this.showMissionListDialog.bind(this)); + }, + + openPortalMissions: function() { + this.loadPortalMissions(window.selectedPortal, function(missions) { + if (!missions.length) { + return; + } + + if (missions.length === 1) { + this.loadMission(missions[0].guid, this.showMissionDialog.bind(this)); + } else { + this.showMissionListDialog(missions); + } + }.bind(this)); + }, + + openMission: function(guid) { + this.loadMission(guid, this.showMissionDialog.bind(this)); + }, + + showMissionDialog: function(mission) { + var me = this; + var markers = this.drawMission(mission); + 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(); + } + + this.tabMarkers[id] = markers; + + var button = content.insertBefore(document.createElement('button'), content.lastChild); + button.textContent = 'Zoom to mission'; + button.addEventListener('click', function() { + me.zoomToMission(mission); + show('map'); + }, false); + + var li = this.tabBar.appendChild(document.createElement('li')); + li.dataset['mission_id'] = id; + + 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() { + this.removeMissionLayers(markers); + li.parentNode.removeChild(li); + content.parentNode.removeChild(content); + delete this.tabHeaders[id]; + delete this.tabMarkers[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); + if(window.isSmartphone()) + show('plugin-missions'); + } else { + dialog({ + id: 'plugin-mission-details-' + id, + title: mission.title, + height: 'auto', + html: content, + width: '450px', + closeCallback: function() { + me.removeMissionLayers(markers); + }, + collapseCallback: this.collapseFix, + expandCallback: this.collapseFix, + focus: function() { + me.highlightMissionLayers(markers); + } + }).dialog('option', 'buttons', { + 'Zoom to mission': function() { + me.zoomToMission(mission); + }, + 'OK': function() { $(this).dialog('close'); }, + }); + } + }, + + showMissionListDialog: function(missions) { + dialog({ + html: this.renderMissionList(missions), + height: 'auto', + width: '400px', + collapseCallback: this.collapseFix, + expandCallback: this.collapseFix, + }).dialog('option', 'buttons', { + 'Create new mission': function() { open('//mission-author-dot-betaspike.appspot.com'); }, + 'OK': function() { $(this).dialog('close'); }, + }); + }, + + collapseFix: function() { + if (this && this.parentNode) { + this.parentNode.style.height = 'auto'; + } + }, + + zoomToMission: function(mission) { + map.fitBounds(this.getMissionBounds(mission), {maxZoom: 17}); + }, + + getMissionBounds: function(mission) { + var latlngs = mission.waypoints.filter(function(waypoint) { + return !!waypoint.portal; + }).map(function(waypoint) { + return [waypoint.portal.latE6/1E6, waypoint.portal.lngE6/1E6]; + }); + + return L.latLngBounds(latlngs); + }, + + loadMissionsInBounds: function(bounds, callback, errorcallback) { + var me = this; + window.postAjax('getTopMissionsInBounds', { + northE6: ((bounds.getNorth() * 1000000) | 0), + southE6: ((bounds.getSouth() * 1000000) | 0), + westE6: ((bounds.getWest() * 1000000) | 0), + eastE6: ((bounds.getEast() * 1000000) | 0) + }, function(data) { + var missions = data.result.map(decodeMissionSummary); + if (!missions) { + if (errorcallback) { + errorcallback('Invalid data'); + } + return; + } + callback(missions); + }, function(error) { + console.error('Error loading missions in bounds', arguments); + if (errorcallback) { + errorcallback(error); + } + }); + }, + + loadPortalMissions: function(guid, callback, errorcallback) { + var me = this; + // Mission summary rarely goes stale. + if (me.cacheByPortalGuid[guid] && this.cacheByPortalGuid[guid].time > (Date.now() - this.portalMissionsCacheTime)) { + callback(me.cacheByPortalGuid[guid].data); + return; + } + window.postAjax('getTopMissionsForPortal', { + guid: guid, + }, function(data) { + var missions = data.result.map(decodeMissionSummary); + if (!missions) { + if (errorcallback) { + errorcallback('Invalid data'); + } + return; + } + + window.runHooks('plugin-missions-on-portal-loaded', { missions: missions, portalguid: guid }); + + me.cacheByPortalGuid[guid] = { + time: Date.now(), + data: missions + }; + me.storeCache(); + callback(missions); + }, function(error) { + console.error('Error loading portal missions', arguments); + if (errorcallback) { + errorcallback(error); + } + // awww + }); + }, + loadMission: function(guid, callback, errorcallback) { + var me = this; + // TODO: we need to refresh data often enough, portal data can quickly go stale + if (this.cacheByMissionGuid[guid] && this.cacheByMissionGuid[guid].time > (Date.now() - this.missionCacheTime)) { + callback(this.getMissionCache(guid, true)); + return; + } + window.postAjax('getMissionDetails', { + guid: guid + }, function(data) { + var mission = decodeMission(data.result); + if (!mission) { + if (errorcallback) { + errorcallback('Invalid data'); + } + return; + } + + window.runHooks('plugin-missions-loaded-mission', { mission: mission }); + + me.cacheByMissionGuid[guid] = { + time: Date.now(), + data: mission + }; + me.storeCache(); + + callback(mission); + }, function() { + console.error('Error loading mission data: ' + guid + ', ' + Array.prototype.slice.call(arguments)); + + if (errorcallback) { + errorcallback(error); + } + // awww + }); + }, + + renderMissionList: function(missions) { + var container = document.createElement('div'); + missions.forEach(function(mission) { + container.appendChild(this.renderMissionSummary(mission)); + }, this); + return container; + }, + + renderMissionSummary: function(mission) { + var cachedMission = this.getMissionCache(mission.guid); + + var checked = this.checkedMissions[mission.guid]; + + var container = document.createElement('div'); + container.className = 'plugin-mission-summary'; + container.dataset['mission_mid'] = mission.guid; + if(checked) + container.classList.add('checked'); + + var img = container.appendChild(document.createElement('img')); + img.src = mission.image; + img.addEventListener('click', function(ev) { + plugin.missions.toggleMission(mission.guid); + }, false); + + var title = container.appendChild(document.createElement('a')); + title.textContent = mission.title; + title.href = '/mission/' + mission.guid; + title.addEventListener('click', function(ev) { + this.openMission(mission.guid); + // prevent browser from following link + ev.preventDefault(); + return false; + }.bind(this), false); + + if(cachedMission) { + var span = container.appendChild(document.createElement('span')); + span.className = 'nickname ' + (cachedMission.authorTeam === 'R' ? 'res' : 'enl') + span.textContent = cachedMission.authorNickname; + + var len = cachedMission.waypoints.filter(function(waypoint) { + return !!waypoint.portal; + }).map(function(waypoint) { + return L.latLng(waypoint.portal.latE6/1E6, waypoint.portal.lngE6/1E6); + }).map(function(latlng1, i, latlngs) { + if(i == 0) return 0; + var latlng2 = latlngs[i - 1]; + return latlng1.distanceTo(latlng2); + }).reduce(function(a, b) { + return a + b; + }, 0); + + if(len > 0) { + if(len > 1000) + len = Math.round(len / 100) / 10 + 'km'; + else + len = Math.round(len * 10) / 10 + 'm'; + + var infoLength = container.appendChild(document.createElement('span')); + infoLength.className = 'plugin-mission-info length help'; + infoLength.title = 'Length of this mission.\n\nNOTE: The actual distance required to cover may vary depending on several factors!'; + infoLength.textContent = len; + img = infoLength.insertBefore(document.createElement('img'), infoLength.firstChild); + img.src = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAQMAAABsABwUAAAABlBMVEUAAACy+/gnk9HpAAAAAXRSTlMAQObYZgAAABVJREFUCNdjYEADB9Dg//8QjA7RAAB2VBF9TkATUAAAAABJRU5ErkJggg=='; + } + + if(window.plugin.distanceToPortal && window.plugin.distanceToPortal.currentLoc) { + var infoDistance = container.appendChild(document.createElement('span')); + infoDistance.className = 'plugin-mission-info distance help'; + infoDistance.title = 'Distance to this mission. Click to update.'; + infoDistance.addEventListener('click', function() { + plugin.missions.renderMissionDistance(cachedMission, infoDistance); + }, false); + this.renderMissionDistance(cachedMission, infoDistance); + } + } + + container.appendChild(document.createElement('br')); + + var infoTime = container.appendChild(document.createElement('span')); + infoTime.className = 'plugin-mission-info time help'; + infoTime.title = 'Typical duration'; + infoTime.textContent = timeToRemaining((mission.medianCompletionTimeMs / 1000) | 0) + ' '; + img = infoTime.insertBefore(document.createElement('img'), infoTime.firstChild); + img.src = 'https://commondatastorage.googleapis.com/ingress.com/img/tm_icons/time.png'; + + var infoRating = container.appendChild(document.createElement('span')); + infoRating.className = 'plugin-mission-info rating help'; + infoRating.title = 'Average rating'; + infoRating.textContent = (((mission.ratingE6 / 100) | 0) / 100) + '%' + ' '; + img = infoRating.insertBefore(document.createElement('img'), infoRating.firstChild); + img.src = 'https://commondatastorage.googleapis.com/ingress.com/img/tm_icons/like.png'; + + if (cachedMission) { + var infoPlayers = container.appendChild(document.createElement('span')); + infoPlayers.className = 'plugin-mission-info players help'; + infoPlayers.title = 'Unique players who have completed this mission'; + infoPlayers.textContent = cachedMission.numUniqueCompletedPlayers + ' '; + img = infoPlayers.insertBefore(document.createElement('img'), infoPlayers.firstChild); + img.src = 'https://commondatastorage.googleapis.com/ingress.com/img/tm_icons/players.png'; + + var infoWaypoints = container.appendChild(document.createElement('span')); + infoWaypoints.className = 'plugin-mission-info waypoints help'; + infoWaypoints.title = (cachedMission.type ? cachedMission.type + ' mission' : 'Unknown mission type') + + ' with ' + cachedMission.waypoints.length + ' waypoints'; + infoWaypoints.textContent = cachedMission.waypoints.length + ' '; + img = infoWaypoints.insertBefore(document.createElement('img'), infoWaypoints.firstChild); + img.src = this.missionTypeImages[cachedMission.typeNum] || this.missionTypeImages[0]; + } + + return container; + }, + + renderMissionDistance: function(mission /* cached mission, full details*/, container) { + if(!(plugin.distanceToPortal && plugin.distanceToPortal.currentLoc)) return; + + var distances = mission.waypoints + .filter(function(waypoint) { + return !!waypoint.portal; + }) + .map(function(waypoint) { + var position = L.latLng(waypoint.portal.latE6/1E6, waypoint.portal.lngE6/1E6); + var distance = position.distanceTo(plugin.distanceToPortal.currentLoc); + return { + waypoint: waypoint, + distance: distance, + position: position, + }; + }); + + if(!distances.length) return; + + if(mission.typeNum == 2) { // non-sequential + distances.sort(function(a, b) { return a.distance - b.distance; }); + } + + var position = distances[0].position; + var distance = distances[0].distance; + + var bearing = window.plugin.distanceToPortal.currentLoc.bearingTo(position); + + $(container) + .text(window.plugin.distanceToPortal.formatDistance(distance)) + .prepend($('') + .addClass('portal-distance-bearing') + .css({ + 'transform': 'rotate('+bearing+'deg)', + '-moz-transform': 'rotate('+bearing+'deg)', + '-webkit-transform': 'rotate('+bearing+'deg)', + })); + }, + + renderMission: function(mission) { + var container = document.createElement('div'); + container.className = 'plugin-mission-details'; + + var summary = container.appendChild(this.renderMissionSummary(mission)); + + var desc = summary.appendChild(document.createElement('p')); + desc.className = 'description'; + desc.textContent = mission.description; + + var list = container.appendChild(document.createElement('ol')) + mission.waypoints.forEach(function(waypoint, index) { + list.appendChild(this.renderMissionWaypoint(waypoint, index, mission)); + }, this); + + return container; + }, + + renderMissionWaypoint: function(waypoint, index, mission) { + var container = document.createElement('li'); + container.className = 'plugin-mission-waypoint'; + + if (waypoint.portal) { + container.appendChild(this.renderPortalCircle(waypoint.portal)); + + var title = container.appendChild(document.createElement('a')); + + var lat = waypoint.portal.latE6/1E6; + var lng = waypoint.portal.lngE6/1E6; + var perma = '/intel?ll='+lat+','+lng+'&z=17&pll='+lat+','+lng; + + title.href = perma; + title.addEventListener('click', function(ev) { + if(window.isSmartphone()) + show('map'); + selectPortalByLatLng(lat, lng); + ev.preventDefault(); + return false; + }, false); + title.addEventListener('dblclick', function(ev) { + if(window.isSmartphone()) + show('map'); + zoomToAndShowPortal(waypoint.portal.guid, [lat, lng]); + ev.preventDefault(); + return false; + }, false); + } else if(waypoint.typeNum === 1) { + // if typeNum === 1 but portal is undefined, this waypoint is a deleted portal. + var title = container.appendChild(document.createElement('span')); + container.classList.add('unavailable'); + } else { + var title = container.appendChild(document.createElement('span')); + } + + title.className = 'title'; + if(waypoint.title) + title.textContent = waypoint.title; + else if(waypoint.portal && waypoint.portal.title) + title.textContent = waypoint.portal.title; + else + title.textContent = 'Unknown'; + + var mwpid = mission.guid + '-' + index + '-' + waypoint.guid; + var checked = this.checkedWaypoints[mwpid]; + + var label = container.appendChild(document.createElement('label')); + + var checkbox = label.appendChild(document.createElement('input')); + checkbox.type = 'checkbox'; + checkbox.addEventListener('change', function() { + plugin.missions.toggleWaypoint(mission.guid, mwpid); + }, false); + checkbox.dataset['mission_mwpid'] = mwpid; + + var objective = label.appendChild(document.createElement('span')); + objective.textContent = waypoint.objective ? waypoint.objective : '?'; + + return container; + }, + + renderPortalCircle: function(portal) { + var team = TEAM_TO_CSS[getTeam(portal)]; + var resCount = portal.resCount; + var level = resCount == 0 ? 0 : portal.level; // we want neutral portals to be level 0 + + var container = document.createElement('div'); + container.className = 'plugin-mission-portal-indicator help ' + team; + container.textContent = level; + container.title = 'Level:\t'+level+'\nResonators:\t'+resCount+'\nHealth:\t'+portal.health+'%'; + + for(var i = 0; i< resCount; i++) { + var resonator = container.appendChild(document.createElement('div')); + /* Firefox supports transform* without vendor prefix, but Android does not yet */ + resonator.style.transform = 'rotate(' + i*45 + 'deg)'; + resonator.style.webkitTransform = 'rotate(' + i*45 + 'deg)'; + } + return container; + }, + + toggleWaypoint: function(mid, mwpid, dontsave) { + if(this.checkedWaypoints[mwpid]) + delete this.checkedWaypoints[mwpid]; + else + this.checkedWaypoints[mwpid] = true; + + window.runHooks('plugin-missions-waypoint-changed', { mwpid: mwpid, local: true, }); + if (!dontsave) { + this.checkedWaypointsUpdateQueue[mwpid] = true; + this.storeLocal('checkedWaypoints'); + this.storeLocal('checkedWaypointsUpdateQueue'); + this.syncQueue(); + } + }, + + onWaypointChanged: function(data) { + var mwpid = data.mwpid; + + var checked = !!this.checkedWaypoints[mwpid]; + + $('[data-mission_mwpid="'+mwpid+'"]').prop('checked', checked); + }, + + onWaypointsRefreshed: function() { + $('[data-mission_mwpid]').each(function(i, element) { + var mwpid = element.dataset['mission_mwpid']; + var checked = !!this.checkedWaypoints[mwpid]; + element.checked = checked; + }); + }, + + toggleMission: function(mid) { + if(this.checkedMissions[mid]) + delete this.checkedMissions[mid]; + else + this.checkedMissions[mid] = true; + + window.runHooks('plugin-missions-mission-changed', { mid: mid, local: true, }); + this.checkedMissionsUpdateQueue[mid] = true; + this.storeLocal('checkedMissions'); + this.storeLocal('checkedMissionsUpdateQueue'); + this.syncQueue(); + }, + + onMissionChanged: function(data) { + var mid = data.mid; + + var checked = !!this.checkedMissions[mid]; + + $('[data-mission_mid="'+mid+'"]').toggleClass('checked', checked); + }, + + onMissionsRefreshed: function() { + $('[data-mission_mid]').each(function(i, element) { + var mid = element.dataset['mission_mid']; + var checked = !!this.checkedMissions[mid]; + $(element).toggleClass('checked', checked); + }); + }, + + getMissionCache: function(guid, updatePortals) { + if (this.cacheByMissionGuid[guid]) { + var cache = this.cacheByMissionGuid[guid]; + // Update portal data from map if older then 2 minutes. + if (updatePortals && cache.time < (Date.now() - (2 * 60 * 1000))) { + cache.data.waypoints.map(function(waypoint) { + if (!waypoint.portal) { + return; + } + var wp = window.portals[waypoint.portal.guid]; + if (!wp) { + return; + } + $.extend(waypoint.portal, wp.options.data); + }); + } + return cache.data; + } + return null; + }, + + getPortalCache: function(guid) { + if (this.cacheByPortalGuid[guid]) { + return this.cacheByPortalGuid[guid].data; + } + return null; + }, + + storeCache: function() { + this.checkCacheSize(); + localStorage['plugins-missions-portalcache'] = JSON.stringify(this.cacheByPortalGuid); + localStorage['plugins-missions-missioncache'] = JSON.stringify(this.cacheByMissionGuid); + }, + + storeLocal: function(key) { + localStorage['plugins-missions-' + key] = JSON.stringify(this[key]); + }, + + loadData: function() { + this.cacheByPortalGuid = JSON.parse(localStorage['plugins-missions-portalcache'] || '{}'); + this.cacheByMissionGuid = JSON.parse(localStorage['plugins-missions-missioncache'] || '{}'); + + 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); + delete localStorage['plugins-missions-settings']; + } + + this.loadLocal('checkedMissions'); + this.loadLocal('checkedMissionsUpdateQueue'); + this.loadLocal('checkedMissionsUpdatingQueue'); + this.loadLocal('checkedWaypoints'); + this.loadLocal('checkedWaypointsUpdateQueue'); + this.loadLocal('checkedWaypointsUpdatingQueue'); + }, + + loadLocal: function(key) { + this[key] = JSON.parse(localStorage['plugins-missions-' + key] || '{}'); + }, + + checkCacheSize: function() { + if (JSON.stringify(this.cacheByPortalGuid).length > 1e6) { // 1 MB not MiB ;) + this.cleanupPortalCache(); + } + if (JSON.stringify(this.cacheByMissionGuid).length > 2e6) { // 2 MB not MiB ;) + this.cleanupMissionCache(); + } + }, + + // Cleanup oldest half of the data. + cleanupPortalCache: function() { + var me = this; + var cache = Object.keys(this.cacheByPortalGuid); + cache.sort(function(a, b) { + return me.cacheByPortalGuid[a].time - me.cacheByPortalGuid[b].time; + }); + var toDelete = (cache.length / 2) | 0; + cache.splice(0, toDelete + 1).forEach(function(el) { + delete me.cacheByPortalGuid[el]; + }); + }, + + // Cleanup oldest half of the data. + cleanupMissionCache: function() { + var me = this; + var cache = Object.keys(this.cacheByMissionGuid); + cache.sort(function(a, b) { + return me.cacheByMissionGuid[a].time - me.cacheByMissionGuid[b].time; + }); + var toDelete = (cache.length / 2) | 0; + cache.splice(0, toDelete + 1).forEach(function(el) { + delete me.cacheByMissionGuid[el]; + }); + }, + + drawMission: function(mission) { + var markers = []; + var latlngs = []; + + mission.waypoints.forEach(function(waypoint) { + if (!waypoint.portal) { + return; + } + + var radius = window.portals[waypoint.portal.guid] ? window.portals[waypoint.portal.guid].options.radius * 1.75 : 5; + var ll = [waypoint.portal.latE6 / 1E6, waypoint.portal.lngE6 / 1E6]; + latlngs.push(ll); + + var marker = L.circleMarker(ll, { + radius: radius, + weight: 3, + opacity: 1, + color: this.MISSION_COLOR, + fill: false, + dashArray: null, + clickable: false + } + ); + this.missionLayer.addLayer(marker); + markers.push(marker); + }, this); + + var line = L.geodesicPolyline(latlngs, { + color: this.MISSION_COLOR, + opacity: 1, + weight: 2, + clickable: false, + dashArray: (mission.typeNum == 2 /* non-sequential */ ? '1,5' : undefined), + }); + this.missionLayer.addLayer(line); + markers.push(line); + return markers; + }, + + removeMissionLayers: function(markers) { + markers.forEach(function(marker) { + this.missionLayer.removeLayer(marker); + }, this); + }, + + highlightMissionLayers: function(markers) { + // layer.bringToFront() will break if the layer is not visible + var bringToFront = map.hasLayer(plugin.missions.missionLayer); + + this.missionLayer.eachLayer(function(layer) { + var active = (markers.indexOf(layer) !== -1); + layer.setStyle({ + color: active ? this.MISSION_COLOR_ACTIVE : this.MISSION_COLOR, + }); + if(active && bringToFront) layer.bringToFront(); + }, this); + }, + + onPortalChanged: function(type, guid, oldval) { + var portal; + if (type === 'add' || type === 'update') { + // Compatibility + portal = window.portals[guid] || oldval; + if (!portal.options.data.mission && !portal.options.data.mission50plus) { + return; + } + if (this.markedStarterPortals[guid]) { + return; + } + + this.markedStarterPortals[guid] = L.circleMarker( + L.latLng(portal.options.data.latE6 / 1E6, portal.options.data.lngE6 / 1E6), { + radius: portal.options.radius + Math.ceil(portal.options.radius / 2), + weight: 3, + opacity: 1, + color: this.MISSION_COLOR_START, + fill: false, + dashArray: null, + clickable: false + } + ); + this.missionStartLayer.addLayer(this.markedStarterPortals[guid]); + } else if (type === 'delete') { + portal = oldval; + if (!this.markedStarterPortals[guid]) { + return; + } + + this.missionStartLayer.removeLayer(this.markedStarterPortals[guid]); + delete this.markedStarterPortals[guid]; + } + }, + + // sync the queue, but delay the actual sync to group a few updates in a single request + syncQueue: function() { + if(!this.enableSync) return; + + clearTimeout(this.syncTimer); + + this.syncTimer = setTimeout(function() { + this.syncTimer = null; + + $.extend(this.checkedMissionsUpdatingQueue, this.checkedMissionsUpdateQueue); + this.checkedMissionsUpdateQueue = {}; + this.storeLocal('checkedMissionsUpdatingQueue'); + this.storeLocal('checkedMissionsUpdateQueue'); + plugin.sync.updateMap('missions', 'checkedMissions', Object.keys(this.checkedMissionsUpdatingQueue)); + + $.extend(this.checkedWaypointsUpdatingQueue, this.checkedWaypointsUpdateQueue); + this.checkedWaypointsUpdateQueue = {}; + this.storeLocal('checkedWaypointsUpdatingQueue'); + this.storeLocal('checkedWaypointsUpdateQueue'); + plugin.sync.updateMap('missions', 'checkedWaypoints', Object.keys(this.checkedWaypointsUpdatingQueue)); + + }.bind(this), this.SYNC_DELAY); + }, + + // called after IITC and all plugin loaded + onIITCLoaded: function() { + var match = location.pathname.match(/\/mission\/([0-9a-z.]+)/); + if(match && match[1]) { + var mid = match[1]; + + this.loadMission(mid, function(mission) { + this.openMission(mid); + this.zoomToMission(mission); + }.bind(this)); + } + + if(window.plugin.sync) { + window.plugin.sync.registerMapForSync('missions', 'checkedMissions', this.syncCallback.bind(this), this.syncInitialed.bind(this)); + window.plugin.sync.registerMapForSync('missions', 'checkedWaypoints', this.syncCallback.bind(this), this.syncInitialed.bind(this)); + } + }, + + // called after local or remote change uploaded + syncCallback: function(pluginName, fieldName, e, fullUpdated) { + this.storeLocal(fieldName); + // All data is replaced if another client updates the data while this client was offline, + // fire a complete refresh + if(fullUpdated) { + if(fieldName === 'checkedMissions') { + window.runHooks('plugin-missions-missions-refreshed'); + } else if(fieldName === 'checkedWaypoints') { + window.runHooks('plugin-missions-waypoints-refreshed'); + } + return; + } + + if(!e) return; + if(e.isLocal) { + // Update pushed successfully, remove it from updatingQueue + delete this[fieldName + 'UpdatingQueue'][e.property]; + } else { + // Remote update + delete this[fieldName + 'UpdateQueue'][e.property] + this.storeLocal(fieldName + 'UpdateQueue'); + + if(fieldName === 'checkedMissions') { + window.runHooks('plugin-missions-mission-changed', { mid: e.property, local: false, }); + } else if(fieldName === 'checkedWaypoints') { + window.runHooks('plugin-missions-waypoint-changed', { mwpid: e.property, local: false, }); + } + } + }, + + // syncing of the field is initialed, upload all queued update + syncInitialed: function(pluginName, fieldName) { + this.enableSync = true; + if(Object.keys(this[fieldName + 'UpdateQueue']).length > 0) { + this.syncQueue(); + } + }, + + onPaneChanged: function(pane) { + if(pane == 'plugin-missions') { + document.body.appendChild(this.mobilePane); + } else if(this.mobilePane.parentNode) { + this.mobilePane.parentNode.removeChild(this.mobilePane); + } + }, + + onSearch: function(query) { + var self = this; + + var bounds = window.map.getBounds(); + + if(query.confirmed) { + this.loadMissionsInBounds(bounds, function(missions) { + self.addMissionsToQuery(query, missions); + }); + } + + var cachedMissions = Object.keys(this.cacheByMissionGuid).map(function(guid) { + return self.cacheByMissionGuid[guid].data; + }); + + var cachedMissionsInView = cachedMissions.filter(function(mission) { + return mission.waypoints && mission.waypoints.some(function(waypoint) { + if(!waypoint) return false; + if(!waypoint.portal) return false; + return bounds.contains([waypoint.portal.latE6/1E6, waypoint.portal.lngE6/1E6]); + }); + }); + + self.addMissionsToQuery(query, cachedMissionsInView); + }, + + addMissionsToQuery: function(query, missions) { + var term = query.term.toLowerCase(); + + missions.forEach(function(mission) { + if(mission.title.toLowerCase().indexOf(term) === -1 + && ((!mission.description) || mission.description.toLowerCase().indexOf(term) === -1)) { + return; + } + + if(query.results.some(function(result) { return result.mission && (result.mission.guid == mission.guid); })) + // mission already in list (a cached mission may be found again via missions in bounds) + return; + + var result = { + title: escapeHtmlSpecialChars(mission.title), + description: mission.description + ? 'Recently viewed mission: ' + escapeHtmlSpecialChars(mission.description) + '' + : 'Mission in view', + icon: 'https://commondatastorage.googleapis.com/ingress.com/img/tm_icons/tm_cyan.png', + onSelected: this.onSearchResultSelected.bind(this), + mission: mission, + layer: null, // prevent a preview, we'll handle this + }; + + // mission may be a cached mission or contain the full details + if(mission.waypoints) { + result.bounds = this.getMissionBounds(mission); + } + if(mission.typeNum) { + result.icon = this.missionTypeImages[mission.typeNum] || this.missionTypeImages[0]; + } + + query.addResult(result); + }.bind(this)); + }, + + onSearchResultSelected: function(result, event) { + if(result.bounds) { + map.fitBounds(result.bounds, {maxZoom: 17}); + } + + this.openMission(result.mission.guid); + return false; + }, + + setup: function() { + this.cacheByPortalGuid = {}; + this.cacheByMissionGuid = {}; + + this.markedStarterPortals = {}; + this.markedMissionPortals = {}; + + this.loadData(); + + $(''); +}; + +var setup = window.plugin.panControl.setup; + +// PLUGIN END ////////////////////////////////////////////////////////// + + +setup.info = plugin_info; //add the script info data to the function as a property +if(!window.bootPlugins) window.bootPlugins = []; +window.bootPlugins.push(setup); +// if IITC has already booted, immediately run the 'setup' function +if(window.iitcLoaded && typeof setup === 'function') setup(); +} // wrapper end +// inject code into site context +var script = document.createElement('script'); +var info = {}; +if (typeof GM_info !== 'undefined' && GM_info && GM_info.script) info.script = { version: GM_info.script.version, name: GM_info.script.name, description: GM_info.script.description }; +script.appendChild(document.createTextNode('('+ wrapper +')('+JSON.stringify(info)+');')); +(document.body || document.head || document.documentElement).appendChild(script); + + diff --git a/mobile/assets/plugins/periodic-refresh.user.js b/mobile/assets/plugins/periodic-refresh.user.js new file mode 100644 index 000000000..2b2c97187 --- /dev/null +++ b/mobile/assets/plugins/periodic-refresh.user.js @@ -0,0 +1,71 @@ +// ==UserScript== +// @id iitc-plugin-periodic-refresh +// @name IITC plugin: Periodic refresh +// @category Tweaks +// @version 0.1.0.20181030.90244 +// @namespace https://github.com/jonatkins/ingress-intel-total-conversion +// @updateURL none +// @downloadURL none +// @description For use for unattended display screens only, this plugin causes idle mode to be left once per hour. +// @include https://*.ingress.com/intel* +// @include http://*.ingress.com/intel* +// @match https://*.ingress.com/intel* +// @match http://*.ingress.com/intel* +// @include https://*.ingress.com/mission/* +// @include http://*.ingress.com/mission/* +// @match https://*.ingress.com/mission/* +// @match http://*.ingress.com/mission/* +// @grant none +// ==/UserScript== + + +function wrapper(plugin_info) { +// ensure plugin framework is there, even if iitc is not yet loaded +if(typeof window.plugin !== 'function') window.plugin = function() {}; + +//PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! +//(leaving them in place might break the 'About IITC' page or break update checks) +plugin_info.buildName = 'mobile'; +plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.pluginId = 'periodic-refresh'; +//END PLUGIN AUTHORS NOTE + + + +// PLUGIN START //////////////////////////////////////////////////////// + +window.plugin.periodicRefresh = function() {}; + +window.plugin.periodicRefresh.wakeup = function() { + console.log('periodicRefresh: timer fired - leaving idle mode'); + idleReset(); +} + + +window.plugin.periodicRefresh.setup = function() { + + var refreshMinutes = 60; + + setInterval ( window.plugin.periodicRefresh.wakeup, refreshMinutes*60*1000 ); + +}; + +var setup = window.plugin.periodicRefresh.setup; + +// PLUGIN END ////////////////////////////////////////////////////////// + + +setup.info = plugin_info; //add the script info data to the function as a property +if(!window.bootPlugins) window.bootPlugins = []; +window.bootPlugins.push(setup); +// if IITC has already booted, immediately run the 'setup' function +if(window.iitcLoaded && typeof setup === 'function') setup(); +} // wrapper end +// inject code into site context +var script = document.createElement('script'); +var info = {}; +if (typeof GM_info !== 'undefined' && GM_info && GM_info.script) info.script = { version: GM_info.script.version, name: GM_info.script.name, description: GM_info.script.description }; +script.appendChild(document.createTextNode('('+ wrapper +')('+JSON.stringify(info)+');')); +(document.body || document.head || document.documentElement).appendChild(script); + + diff --git a/mobile/assets/plugins/player-tracker.user.js b/mobile/assets/plugins/player-tracker.user.js new file mode 100644 index 000000000..f15757466 --- /dev/null +++ b/mobile/assets/plugins/player-tracker.user.js @@ -0,0 +1,604 @@ +// ==UserScript== +// @id iitc-plugin-player-tracker@breunigs +// @name IITC Plugin: Player tracker +// @category Layer +// @version 0.11.1.20181030.90244 +// @namespace https://github.com/jonatkins/ingress-intel-total-conversion +// @updateURL none +// @downloadURL none +// @description [mobile-2018-10-30-090244] Draw trails for the path a user took onto the map based on status messages in COMMs. Uses up to three hours of data. Does not request chat data on its own, even if that would be useful. +// @include https://*.ingress.com/intel* +// @include http://*.ingress.com/intel* +// @match https://*.ingress.com/intel* +// @match http://*.ingress.com/intel* +// @include https://*.ingress.com/mission/* +// @include http://*.ingress.com/mission/* +// @match https://*.ingress.com/mission/* +// @match http://*.ingress.com/mission/* +// @grant none +// ==/UserScript== + + +function wrapper(plugin_info) { +// ensure plugin framework is there, even if iitc is not yet loaded +if(typeof window.plugin !== 'function') window.plugin = function() {}; + +//PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! +//(leaving them in place might break the 'About IITC' page or break update checks) +plugin_info.buildName = 'mobile'; +plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.pluginId = 'player-tracker'; +//END PLUGIN AUTHORS NOTE + + + +// PLUGIN START //////////////////////////////////////////////////////// +window.PLAYER_TRACKER_MAX_TIME = 3*60*60*1000; // in milliseconds +window.PLAYER_TRACKER_MIN_ZOOM = 9; +window.PLAYER_TRACKER_MIN_OPACITY = 0.3; +window.PLAYER_TRACKER_LINE_COLOUR = '#FF00FD'; + + +// use own namespace for plugin +window.plugin.playerTracker = function() {}; + +window.plugin.playerTracker.setup = function() { + $(''); +} + +// PLUGIN END ////////////////////////////////////////////////////////// + + +setup.info = plugin_info; //add the script info data to the function as a property +if(!window.bootPlugins) window.bootPlugins = []; +window.bootPlugins.push(setup); +// if IITC has already booted, immediately run the 'setup' function +if(window.iitcLoaded && typeof setup === 'function') setup(); +} // wrapper end +// inject code into site context +var script = document.createElement('script'); +var info = {}; +if (typeof GM_info !== 'undefined' && GM_info && GM_info.script) info.script = { version: GM_info.script.version, name: GM_info.script.name, description: GM_info.script.description }; +script.appendChild(document.createTextNode('('+ wrapper +')('+JSON.stringify(info)+');')); +(document.body || document.head || document.documentElement).appendChild(script); + + diff --git a/mobile/assets/plugins/portal-defense.user.js b/mobile/assets/plugins/portal-defense.user.js new file mode 100644 index 000000000..bf09c173a --- /dev/null +++ b/mobile/assets/plugins/portal-defense.user.js @@ -0,0 +1,18 @@ +// ==UserScript== +// @id iitc-plugin-defense@gluckies +// @name IITC plugin: portal defense +// @category Deleted +// @version 0.2.2.20181030.90244 +// @namespace https://github.com/jonatkins/ingress-intel-total-conversion +// @updateURL none +// @downloadURL none +// @description The data this plugin needs is no longer available since the late November 2013 intel site update. +// @include https://*.ingress.com/intel* +// @include http://*.ingress.com/intel* +// @match https://*.ingress.com/intel* +// @match http://*.ingress.com/intel* +// @include https://*.ingress.com/mission/* +// @include http://*.ingress.com/mission/* +// @match https://*.ingress.com/mission/* +// @match http://*.ingress.com/mission/* +// ==/UserScript== diff --git a/mobile/assets/plugins/portal-highlighter-bad-deployment-distance.user.js b/mobile/assets/plugins/portal-highlighter-bad-deployment-distance.user.js new file mode 100644 index 000000000..740463689 --- /dev/null +++ b/mobile/assets/plugins/portal-highlighter-bad-deployment-distance.user.js @@ -0,0 +1,19 @@ +// ==UserScript== +// @id iitc-plugin-highlight-bad-deployment-distance@cathesaurus +// @name IITC plugin: highlight badly-deployed portals +// @category Deleted +// @version 0.1.1.20181030.90244 +// @namespace https://github.com/jonatkins/ingress-intel-total-conversion +// @updateURL none +// @downloadURL none +// @description This plugin is no longer available, as Niantic optimisations have removed the data it needed. +// @include https://*.ingress.com/intel* +// @include http://*.ingress.com/intel* +// @match https://*.ingress.com/intel* +// @match http://*.ingress.com/intel* +// @include https://*.ingress.com/mission/* +// @include http://*.ingress.com/mission/* +// @match https://*.ingress.com/mission/* +// @match http://*.ingress.com/mission/* +// @grant none +// ==/UserScript== diff --git a/mobile/assets/plugins/portal-highlighter-can-make-level.user.js b/mobile/assets/plugins/portal-highlighter-can-make-level.user.js new file mode 100644 index 000000000..c598a23ca --- /dev/null +++ b/mobile/assets/plugins/portal-highlighter-can-make-level.user.js @@ -0,0 +1,19 @@ +// ==UserScript== +// @id iitc-plugin-highlight-portals-upgrade@vita10gy +// @name IITC plugin: highlight portals you can upgrade to a specific level +// @category Deleted +// @version 0.1.0.20181030.90244 +// @namespace https://github.com/jonatkins/ingress-intel-total-conversion +// @updateURL none +// @downloadURL none +// @description This plugin is no longer available, as Niantic optimisations have removed the data it needed. +// @include https://*.ingress.com/intel* +// @include http://*.ingress.com/intel* +// @match https://*.ingress.com/intel* +// @match http://*.ingress.com/intel* +// @include https://*.ingress.com/mission/* +// @include http://*.ingress.com/mission/* +// @match https://*.ingress.com/mission/* +// @match http://*.ingress.com/mission/* +// @grant none +// ==/UserScript== diff --git a/mobile/assets/plugins/portal-highlighter-debug.user.js b/mobile/assets/plugins/portal-highlighter-debug.user.js new file mode 100644 index 000000000..7126a34fb --- /dev/null +++ b/mobile/assets/plugins/portal-highlighter-debug.user.js @@ -0,0 +1,73 @@ +// ==UserScript== +// @id iitc-plugin-highlight-portals-debug +// @name IITC plugin: Debug: Highlighers +// @category Debug +// @version 0.1.0.20181030.90244 +// @namespace https://github.com/jonatkins/ingress-intel-total-conversion +// @updateURL none +// @downloadURL none +// @description [mobile-2018-10-30-090244] Various debug and/or temporary highlighters. Will change over time as needed. +// @include https://*.ingress.com/intel* +// @include http://*.ingress.com/intel* +// @match https://*.ingress.com/intel* +// @match http://*.ingress.com/intel* +// @include https://*.ingress.com/mission/* +// @include http://*.ingress.com/mission/* +// @match https://*.ingress.com/mission/* +// @match http://*.ingress.com/mission/* +// @grant none +// ==/UserScript== + + +function wrapper(plugin_info) { +// ensure plugin framework is there, even if iitc is not yet loaded +if(typeof window.plugin !== 'function') window.plugin = function() {}; + +//PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! +//(leaving them in place might break the 'About IITC' page or break update checks) +plugin_info.buildName = 'mobile'; +plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.pluginId = 'portal-highlighter-debug'; +//END PLUGIN AUTHORS NOTE + + + +// PLUGIN START //////////////////////////////////////////////////////// + +// use own namespace for plugin +window.plugin.portalHighlighterDebug = function() {}; + +//window.plugin.portalHighlighterDebug.unknown11 = function(data) { +// var opacity = 0.7; +// var color = undefined; +// +// if (data.portal.options.data.unknown_11) { +// color='red'; +// } +// +// if (color) { +// data.portal.setStyle({fillColor: color, fillOpacity: opacity}); +// } +//} + +var setup = function() { +// window.addPortalHighlighter('DEBUG: Unknoen_11', window.plugin.portalHighlighterDebug.unknown11); +} + +// PLUGIN END ////////////////////////////////////////////////////////// + + +setup.info = plugin_info; //add the script info data to the function as a property +if(!window.bootPlugins) window.bootPlugins = []; +window.bootPlugins.push(setup); +// if IITC has already booted, immediately run the 'setup' function +if(window.iitcLoaded && typeof setup === 'function') setup(); +} // wrapper end +// inject code into site context +var script = document.createElement('script'); +var info = {}; +if (typeof GM_info !== 'undefined' && GM_info && GM_info.script) info.script = { version: GM_info.script.version, name: GM_info.script.name, description: GM_info.script.description }; +script.appendChild(document.createTextNode('('+ wrapper +')('+JSON.stringify(info)+');')); +(document.body || document.head || document.documentElement).appendChild(script); + + diff --git a/mobile/assets/plugins/portal-highlighter-forgotten.user.js b/mobile/assets/plugins/portal-highlighter-forgotten.user.js new file mode 100644 index 000000000..1fb3de8fb --- /dev/null +++ b/mobile/assets/plugins/portal-highlighter-forgotten.user.js @@ -0,0 +1,82 @@ +// ==UserScript== +// @id iitc-plugin-highlight-forgotten@jonatkins +// @name IITC plugin: Inactive portals. Hightlight unclaimed portals with no recent activity +// @category Highlighter +// @version 0.1.0.20181030.90244 +// @namespace https://github.com/jonatkins/ingress-intel-total-conversion +// @updateURL none +// @downloadURL none +// @description [mobile-2018-10-30-090244] Use the portal fill color to denote if the portal is unclaimed with no recent activity. Shades of red from one week to one month, then tinted to purple for longer. May also highlight captured portals that are stuck and fail to decay every 24 hours. +// @include https://*.ingress.com/intel* +// @include http://*.ingress.com/intel* +// @match https://*.ingress.com/intel* +// @match http://*.ingress.com/intel* +// @include https://*.ingress.com/mission/* +// @include http://*.ingress.com/mission/* +// @match https://*.ingress.com/mission/* +// @match http://*.ingress.com/mission/* +// @grant none +// ==/UserScript== + + +function wrapper(plugin_info) { +// ensure plugin framework is there, even if iitc is not yet loaded +if(typeof window.plugin !== 'function') window.plugin = function() {}; + +//PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! +//(leaving them in place might break the 'About IITC' page or break update checks) +plugin_info.buildName = 'mobile'; +plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.pluginId = 'portal-highlighter-forgotten'; +//END PLUGIN AUTHORS NOTE + + + +// PLUGIN START //////////////////////////////////////////////////////// + +// use own namespace for plugin +window.plugin.portalHighlighterInactive = function() {}; + +window.plugin.portalHighlighterInactive.highlight = function(data) { + + if (data.portal.options.timestamp > 0) { + + var daysUnmodified = (new Date().getTime() - data.portal.options.timestamp) / (24*60*60*1000); + + if (daysUnmodified >= 7) { + + var fill_opacity = Math.min(1,((daysUnmodified-7)/24)*.85 + .15); + + var blue = Math.max(0,Math.min(255,Math.round((daysUnmodified-31)/62*255))); + + var colour = 'rgb(255,0,'+blue+')'; + + var params = {fillColor: colour, fillOpacity: fill_opacity}; + + data.portal.setStyle(params); + } + } + +} + +var setup = function() { + window.addPortalHighlighter('Inactive Portals', window.plugin.portalHighlighterInactive.highlight); +} + +// PLUGIN END ////////////////////////////////////////////////////////// + + +setup.info = plugin_info; //add the script info data to the function as a property +if(!window.bootPlugins) window.bootPlugins = []; +window.bootPlugins.push(setup); +// if IITC has already booted, immediately run the 'setup' function +if(window.iitcLoaded && typeof setup === 'function') setup(); +} // wrapper end +// inject code into site context +var script = document.createElement('script'); +var info = {}; +if (typeof GM_info !== 'undefined' && GM_info && GM_info.script) info.script = { version: GM_info.script.version, name: GM_info.script.name, description: GM_info.script.description }; +script.appendChild(document.createTextNode('('+ wrapper +')('+JSON.stringify(info)+');')); +(document.body || document.head || document.documentElement).appendChild(script); + + diff --git a/mobile/assets/plugins/portal-highlighter-hide-team.user.js b/mobile/assets/plugins/portal-highlighter-hide-team.user.js new file mode 100644 index 000000000..f6c29bb94 --- /dev/null +++ b/mobile/assets/plugins/portal-highlighter-hide-team.user.js @@ -0,0 +1,67 @@ +// ==UserScript== +// @id iitc-plugin-highlight-hide-team@vita10gy +// @name IITC plugin: Hide portal ownership +// @category Highlighter +// @version 0.1.1.20181030.90244 +// @namespace https://github.com/jonatkins/ingress-intel-total-conversion +// @updateURL none +// @downloadURL none +// @description [mobile-2018-10-30-090244] Show all portals as neutral, as if uncaptured. Great for creating plans. +// @include https://*.ingress.com/intel* +// @include http://*.ingress.com/intel* +// @match https://*.ingress.com/intel* +// @match http://*.ingress.com/intel* +// @include https://*.ingress.com/mission/* +// @include http://*.ingress.com/mission/* +// @match https://*.ingress.com/mission/* +// @match http://*.ingress.com/mission/* +// @grant none +// ==/UserScript== + + +function wrapper(plugin_info) { +// ensure plugin framework is there, even if iitc is not yet loaded +if(typeof window.plugin !== 'function') window.plugin = function() {}; + +//PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! +//(leaving them in place might break the 'About IITC' page or break update checks) +plugin_info.buildName = 'mobile'; +plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.pluginId = 'portal-highlighter-hide-team'; +//END PLUGIN AUTHORS NOTE + + + +// PLUGIN START //////////////////////////////////////////////////////// + +// use own namespace for plugin +window.plugin.portalHighlighterHideOwnership = function() {}; + +window.plugin.portalHighlighterHideOwnership.highlight = function(data) { + var scale = window.portalMarkerScale(); + + var params = getMarkerStyleOptions({team: TEAM_NONE, level: 0}); + data.portal.setStyle(params); +} + +var setup = function() { + window.addPortalHighlighter('Hide portal ownership', window.plugin.portalHighlighterHideOwnership.highlight); +} + +// PLUGIN END ////////////////////////////////////////////////////////// + + +setup.info = plugin_info; //add the script info data to the function as a property +if(!window.bootPlugins) window.bootPlugins = []; +window.bootPlugins.push(setup); +// if IITC has already booted, immediately run the 'setup' function +if(window.iitcLoaded && typeof setup === 'function') setup(); +} // wrapper end +// inject code into site context +var script = document.createElement('script'); +var info = {}; +if (typeof GM_info !== 'undefined' && GM_info && GM_info.script) info.script = { version: GM_info.script.version, name: GM_info.script.name, description: GM_info.script.description }; +script.appendChild(document.createTextNode('('+ wrapper +')('+JSON.stringify(info)+');')); +(document.body || document.head || document.documentElement).appendChild(script); + + diff --git a/mobile/assets/plugins/portal-highlighter-high-level.user.js b/mobile/assets/plugins/portal-highlighter-high-level.user.js new file mode 100644 index 000000000..bb1b52fc8 --- /dev/null +++ b/mobile/assets/plugins/portal-highlighter-high-level.user.js @@ -0,0 +1,76 @@ +// ==UserScript== +// @id iitc-plugin-highlight-portals-high-level +// @name IITC plugin: highlight high level portals +// @category Highlighter +// @version 0.1.0.20181030.90244 +// @namespace https://github.com/jonatkins/ingress-intel-total-conversion +// @updateURL none +// @downloadURL none +// @description [mobile-2018-10-30-090244] Use the portal fill color to denote high level portals: Purple L8, Red L7, Orange L6 +// @include https://*.ingress.com/intel* +// @include http://*.ingress.com/intel* +// @match https://*.ingress.com/intel* +// @match http://*.ingress.com/intel* +// @include https://*.ingress.com/mission/* +// @include http://*.ingress.com/mission/* +// @match https://*.ingress.com/mission/* +// @match http://*.ingress.com/mission/* +// @grant none +// ==/UserScript== + + +function wrapper(plugin_info) { +// ensure plugin framework is there, even if iitc is not yet loaded +if(typeof window.plugin !== 'function') window.plugin = function() {}; + +//PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! +//(leaving them in place might break the 'About IITC' page or break update checks) +plugin_info.buildName = 'mobile'; +plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.pluginId = 'portal-highlighter-high-level'; +//END PLUGIN AUTHORS NOTE + + + +// PLUGIN START //////////////////////////////////////////////////////// + +// use own namespace for plugin +window.plugin.portalHighlighterPortalsHighLevel = function() {}; + +window.plugin.portalHighlighterPortalsHighLevel.colorLevel = function(data) { + var portal_level = data.portal.options.data.level; + var opacity = 0.7; + var color = undefined; + + switch (portal_level) { + case 6: color='orange'; break; + case 7: color='red'; break; + case 8: color='magenta'; break; + } + + if (color) { + data.portal.setStyle({fillColor: color, fillOpacity: opacity}); + } +} + +var setup = function() { + window.addPortalHighlighter('Higher Level Portals', window.plugin.portalHighlighterPortalsHighLevel.colorLevel); +} + +// PLUGIN END ////////////////////////////////////////////////////////// + + +setup.info = plugin_info; //add the script info data to the function as a property +if(!window.bootPlugins) window.bootPlugins = []; +window.bootPlugins.push(setup); +// if IITC has already booted, immediately run the 'setup' function +if(window.iitcLoaded && typeof setup === 'function') setup(); +} // wrapper end +// inject code into site context +var script = document.createElement('script'); +var info = {}; +if (typeof GM_info !== 'undefined' && GM_info && GM_info.script) info.script = { version: GM_info.script.version, name: GM_info.script.name, description: GM_info.script.description }; +script.appendChild(document.createTextNode('('+ wrapper +')('+JSON.stringify(info)+');')); +(document.body || document.head || document.documentElement).appendChild(script); + + diff --git a/mobile/assets/plugins/portal-highlighter-imminent-decay.user.js b/mobile/assets/plugins/portal-highlighter-imminent-decay.user.js new file mode 100644 index 000000000..e417b29e3 --- /dev/null +++ b/mobile/assets/plugins/portal-highlighter-imminent-decay.user.js @@ -0,0 +1,19 @@ +// ==UserScript== +// @id iitc-plugin-highlight-imminent-decay@cathesaurus +// @name IITC plugin: highlight portals with resonators about to decay +// @category Deleted +// @version 0.1.0.20181030.90244 +// @namespace https://github.com/jonatkins/ingress-intel-total-conversion +// @updateURL none +// @downloadURL none +// @description This plugin is no longer available, as Niantic optimisations have removed the data it needed. +// @include https://*.ingress.com/intel* +// @include http://*.ingress.com/intel* +// @match https://*.ingress.com/intel* +// @match http://*.ingress.com/intel* +// @include https://*.ingress.com/mission/* +// @include http://*.ingress.com/mission/* +// @match https://*.ingress.com/mission/* +// @match http://*.ingress.com/mission/* +// @grant none +// ==/UserScript== diff --git a/mobile/assets/plugins/portal-highlighter-infrastructure.user.js b/mobile/assets/plugins/portal-highlighter-infrastructure.user.js new file mode 100644 index 000000000..a484c5472 --- /dev/null +++ b/mobile/assets/plugins/portal-highlighter-infrastructure.user.js @@ -0,0 +1,90 @@ +// ==UserScript== +// @id iitc-plugin-highlight-portal-infrastructure@vita10gy +// @name IITC plugin: highlight portals with infrastructure problems +// @category Highlighter +// @version 0.2.1.20181030.90244 +// @namespace https://github.com/jonatkins/ingress-intel-total-conversion +// @updateURL none +// @downloadURL none +// @description [mobile-2018-10-30-090244] Use the portal fill color to denote if the portal has any infrastructure problems. Red: no picture. Yellow: potential title issue. Orange: both of these. +// @include https://*.ingress.com/intel* +// @include http://*.ingress.com/intel* +// @match https://*.ingress.com/intel* +// @match http://*.ingress.com/intel* +// @include https://*.ingress.com/mission/* +// @include http://*.ingress.com/mission/* +// @match https://*.ingress.com/mission/* +// @match http://*.ingress.com/mission/* +// @grant none +// ==/UserScript== + + +function wrapper(plugin_info) { +// ensure plugin framework is there, even if iitc is not yet loaded +if(typeof window.plugin !== 'function') window.plugin = function() {}; + +//PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! +//(leaving them in place might break the 'About IITC' page or break update checks) +plugin_info.buildName = 'mobile'; +plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.pluginId = 'portal-highlighter-infrastructure'; +//END PLUGIN AUTHORS NOTE + + + +// PLUGIN START //////////////////////////////////////////////////////// + +// use own namespace for plugin +window.plugin.portalInfrastructure = function() {}; + +window.plugin.portalInfrastructure.badTitles = ['^statue$', + '^fountain$', + '^sculpture$', + '^post office$', + '^us post office$', + '^church$', + 'untitled', + 'no title']; + +window.plugin.portalInfrastructure.highlight = function(data) { + var d = data.portal.options.data; + var color = ''; + var opa = .75; + + if(!(d.image)) { + color = 'red'; + } + + if((new RegExp(window.plugin.portalInfrastructure.badTitles.join("|"),'i')).test(d.title)) { + color = color == 'red' ? 'orange' : 'yellow'; + opa = .9; + } + + if(color !== '') { + var params = {fillColor: color, fillOpacity: opa}; + data.portal.setStyle(params); + } + +} + +var setup = function() { + window.addPortalHighlighter('Infrastructure', window.plugin.portalInfrastructure.highlight); +} + +// PLUGIN END ////////////////////////////////////////////////////////// + + +setup.info = plugin_info; //add the script info data to the function as a property +if(!window.bootPlugins) window.bootPlugins = []; +window.bootPlugins.push(setup); +// if IITC has already booted, immediately run the 'setup' function +if(window.iitcLoaded && typeof setup === 'function') setup(); +} // wrapper end +// inject code into site context +var script = document.createElement('script'); +var info = {}; +if (typeof GM_info !== 'undefined' && GM_info && GM_info.script) info.script = { version: GM_info.script.version, name: GM_info.script.name, description: GM_info.script.description }; +script.appendChild(document.createTextNode('('+ wrapper +')('+JSON.stringify(info)+');')); +(document.body || document.head || document.documentElement).appendChild(script); + + diff --git a/mobile/assets/plugins/portal-highlighter-level-color.user.js b/mobile/assets/plugins/portal-highlighter-level-color.user.js new file mode 100644 index 000000000..10071baf4 --- /dev/null +++ b/mobile/assets/plugins/portal-highlighter-level-color.user.js @@ -0,0 +1,68 @@ +// ==UserScript== +// @id iitc-plugin-highlight-portals-level-color@vita10gy +// @name IITC plugin: highlight portals by level color +// @category Highlighter +// @version 0.1.2.20181030.90244 +// @namespace https://github.com/jonatkins/ingress-intel-total-conversion +// @updateURL none +// @downloadURL none +// @description [mobile-2018-10-30-090244] Use the portal fill color to denote the portal level by using the game level colors. +// @include https://*.ingress.com/intel* +// @include http://*.ingress.com/intel* +// @match https://*.ingress.com/intel* +// @match http://*.ingress.com/intel* +// @include https://*.ingress.com/mission/* +// @include http://*.ingress.com/mission/* +// @match https://*.ingress.com/mission/* +// @match http://*.ingress.com/mission/* +// @grant none +// ==/UserScript== + + +function wrapper(plugin_info) { +// ensure plugin framework is there, even if iitc is not yet loaded +if(typeof window.plugin !== 'function') window.plugin = function() {}; + +//PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! +//(leaving them in place might break the 'About IITC' page or break update checks) +plugin_info.buildName = 'mobile'; +plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.pluginId = 'portal-highlighter-level-color'; +//END PLUGIN AUTHORS NOTE + + + +// PLUGIN START //////////////////////////////////////////////////////// + +// use own namespace for plugin +window.plugin.portalHighlighterPortalsLevelColor = function() {}; + +window.plugin.portalHighlighterPortalsLevelColor.colorLevel = function(data) { + var portal_level = data.portal.options.data.level; + if (portal_level !== undefined) { + var opacity = .6; + data.portal.setStyle({fillColor: COLORS_LVL[portal_level], fillOpacity: opacity}); + } +} + +var setup = function() { + window.addPortalHighlighter('Level Color', window.plugin.portalHighlighterPortalsLevelColor.colorLevel); +} + +// PLUGIN END ////////////////////////////////////////////////////////// + + +setup.info = plugin_info; //add the script info data to the function as a property +if(!window.bootPlugins) window.bootPlugins = []; +window.bootPlugins.push(setup); +// if IITC has already booted, immediately run the 'setup' function +if(window.iitcLoaded && typeof setup === 'function') setup(); +} // wrapper end +// inject code into site context +var script = document.createElement('script'); +var info = {}; +if (typeof GM_info !== 'undefined' && GM_info && GM_info.script) info.script = { version: GM_info.script.version, name: GM_info.script.name, description: GM_info.script.description }; +script.appendChild(document.createTextNode('('+ wrapper +')('+JSON.stringify(info)+');')); +(document.body || document.head || document.documentElement).appendChild(script); + + diff --git a/mobile/assets/plugins/portal-highlighter-missing-resonators.user.js b/mobile/assets/plugins/portal-highlighter-missing-resonators.user.js new file mode 100644 index 000000000..2e4897fa6 --- /dev/null +++ b/mobile/assets/plugins/portal-highlighter-missing-resonators.user.js @@ -0,0 +1,79 @@ +// ==UserScript== +// @id iitc-plugin-highlight-portals-missing-resonators@vita10gy +// @name IITC plugin: highlight portals missing resonators +// @category Highlighter +// @version 0.1.2.20181030.90244 +// @namespace https://github.com/jonatkins/ingress-intel-total-conversion +// @updateURL none +// @downloadURL none +// @description [mobile-2018-10-30-090244] Use the portal fill color to denote if the portal is missing resonators. +// @include https://*.ingress.com/intel* +// @include http://*.ingress.com/intel* +// @match https://*.ingress.com/intel* +// @match http://*.ingress.com/intel* +// @include https://*.ingress.com/mission/* +// @include http://*.ingress.com/mission/* +// @match https://*.ingress.com/mission/* +// @match http://*.ingress.com/mission/* +// @grant none +// ==/UserScript== + + +function wrapper(plugin_info) { +// ensure plugin framework is there, even if iitc is not yet loaded +if(typeof window.plugin !== 'function') window.plugin = function() {}; + +//PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! +//(leaving them in place might break the 'About IITC' page or break update checks) +plugin_info.buildName = 'mobile'; +plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.pluginId = 'portal-highlighter-missing-resonators'; +//END PLUGIN AUTHORS NOTE + + + +// PLUGIN START //////////////////////////////////////////////////////// + +// use own namespace for plugin +window.plugin.portalsMissingResonators = function() {}; + +window.plugin.portalsMissingResonators.highlight = function(data) { + + if(data.portal.options.team != TEAM_NONE) { + var res_count = data.portal.options.data.resCount; + + if(res_count !== undefined && res_count < 8) { + var fill_opacity = ((8-res_count)/8)*.85 + .15; + var color = 'red'; + var params = {fillColor: color, fillOpacity: fill_opacity}; + + // Hole per missing resonator + var dash = new Array((8 - res_count) + 1).join("1,4,") + "100,0" + params.dashArray = dash; + + data.portal.setStyle(params); + } + } +} + +var setup = function() { + window.addPortalHighlighter('Portals Missing Resonators', window.plugin.portalsMissingResonators.highlight); +} + +// PLUGIN END ////////////////////////////////////////////////////////// + + +setup.info = plugin_info; //add the script info data to the function as a property +if(!window.bootPlugins) window.bootPlugins = []; +window.bootPlugins.push(setup); +// if IITC has already booted, immediately run the 'setup' function +if(window.iitcLoaded && typeof setup === 'function') setup(); +} // wrapper end +// inject code into site context +var script = document.createElement('script'); +var info = {}; +if (typeof GM_info !== 'undefined' && GM_info && GM_info.script) info.script = { version: GM_info.script.version, name: GM_info.script.name, description: GM_info.script.description }; +script.appendChild(document.createTextNode('('+ wrapper +')('+JSON.stringify(info)+');')); +(document.body || document.head || document.documentElement).appendChild(script); + + diff --git a/mobile/assets/plugins/portal-highlighter-mitigation.user.js b/mobile/assets/plugins/portal-highlighter-mitigation.user.js new file mode 100644 index 000000000..45292a56d --- /dev/null +++ b/mobile/assets/plugins/portal-highlighter-mitigation.user.js @@ -0,0 +1,19 @@ +// ==UserScript== +// @id iitc-plugin-highlight-mitigation@jonatkins +// @name IITC plugin: hightlight portals total mitigation +// @category Deleted +// @version 0.1.1.20181030.90244 +// @namespace https://github.com/jonatkins/ingress-intel-total-conversion +// @updateURL none +// @downloadURL none +// @description This plugin is no longer available, as Niantic optimisations have removed the data it needed. +// @include https://*.ingress.com/intel* +// @include http://*.ingress.com/intel* +// @match https://*.ingress.com/intel* +// @match http://*.ingress.com/intel* +// @include https://*.ingress.com/mission/* +// @include http://*.ingress.com/mission/* +// @match https://*.ingress.com/mission/* +// @match http://*.ingress.com/mission/* +// @grant none +// ==/UserScript== diff --git a/mobile/assets/plugins/portal-highlighter-mods.user.js b/mobile/assets/plugins/portal-highlighter-mods.user.js new file mode 100644 index 000000000..22ec064fa --- /dev/null +++ b/mobile/assets/plugins/portal-highlighter-mods.user.js @@ -0,0 +1,19 @@ +// ==UserScript== +// @id iitc-plugin-highlight-portals-mods@vita10gy +// @name IITC plugin: highlight portal mods +// @category Deleted +// @version 0.1.0.20181030.90244 +// @namespace https://github.com/jonatkins/ingress-intel-total-conversion +// @updateURL none +// @downloadURL none +// @description This plugin is no longer available, as Niantic optimisations have removed the data it needed. +// @include https://*.ingress.com/intel* +// @include http://*.ingress.com/intel* +// @match https://*.ingress.com/intel* +// @match http://*.ingress.com/intel* +// @include https://*.ingress.com/mission/* +// @include http://*.ingress.com/mission/* +// @match https://*.ingress.com/mission/* +// @match http://*.ingress.com/mission/* +// @grant none +// ==/UserScript== diff --git a/mobile/assets/plugins/portal-highlighter-my-8-portals.user.js b/mobile/assets/plugins/portal-highlighter-my-8-portals.user.js new file mode 100644 index 000000000..170108c12 --- /dev/null +++ b/mobile/assets/plugins/portal-highlighter-my-8-portals.user.js @@ -0,0 +1,19 @@ +// ==UserScript== +// @id iitc-plugin-highlight-portals-my-8-portals@vita10gy +// @name IITC plugin: highlight my level 8's on portals +// @category Deleted +// @version 0.1.0.20181030.90244 +// @namespace https://github.com/jonatkins/ingress-intel-total-conversion +// @updateURL none +// @downloadURL none +// @description This plugin is no longer available, as Niantic optimisations have removed the data it needed. +// @include https://*.ingress.com/intel* +// @include http://*.ingress.com/intel* +// @match https://*.ingress.com/intel* +// @match http://*.ingress.com/intel* +// @include https://*.ingress.com/mission/* +// @include http://*.ingress.com/mission/* +// @match https://*.ingress.com/mission/* +// @match http://*.ingress.com/mission/* +// @grant none +// ==/UserScript== diff --git a/mobile/assets/plugins/portal-highlighter-my-portals.user.js b/mobile/assets/plugins/portal-highlighter-my-portals.user.js new file mode 100644 index 000000000..32b509019 --- /dev/null +++ b/mobile/assets/plugins/portal-highlighter-my-portals.user.js @@ -0,0 +1,19 @@ +// ==UserScript== +// @id iitc-plugin-highlight-portals-my-portals@vita10gy +// @name IITC plugin: highlight my portals +// @category Deleted +// @version 0.1.1.20181030.90244 +// @namespace https://github.com/jonatkins/ingress-intel-total-conversion +// @updateURL none +// @downloadURL none +// @description This plugin is no longer available, as Niantic optimisations have removed the data it needed. +// @include https://*.ingress.com/intel* +// @include http://*.ingress.com/intel* +// @match https://*.ingress.com/intel* +// @match http://*.ingress.com/intel* +// @include https://*.ingress.com/mission/* +// @include http://*.ingress.com/mission/* +// @match https://*.ingress.com/mission/* +// @match http://*.ingress.com/mission/* +// @grant none +// ==/UserScript== diff --git a/mobile/assets/plugins/portal-highlighter-needs-recharge.user.js b/mobile/assets/plugins/portal-highlighter-needs-recharge.user.js new file mode 100644 index 000000000..3b59515e8 --- /dev/null +++ b/mobile/assets/plugins/portal-highlighter-needs-recharge.user.js @@ -0,0 +1,85 @@ +// ==UserScript== +// @id iitc-plugin-highlight-needs-recharge@vita10gy +// @name IITC plugin: hightlight portals that need recharging +// @category Highlighter +// @version 0.1.2.20181030.90244 +// @namespace https://github.com/jonatkins/ingress-intel-total-conversion +// @updateURL none +// @downloadURL none +// @description [mobile-2018-10-30-090244] Use the portal fill color to denote if the portal needs recharging and how much. Yellow: above 85%. Orange: above 50%. Red: above 15%. Magenta: below 15%. +// @include https://*.ingress.com/intel* +// @include http://*.ingress.com/intel* +// @match https://*.ingress.com/intel* +// @match http://*.ingress.com/intel* +// @include https://*.ingress.com/mission/* +// @include http://*.ingress.com/mission/* +// @match https://*.ingress.com/mission/* +// @match http://*.ingress.com/mission/* +// @grant none +// ==/UserScript== + + +function wrapper(plugin_info) { +// ensure plugin framework is there, even if iitc is not yet loaded +if(typeof window.plugin !== 'function') window.plugin = function() {}; + +//PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! +//(leaving them in place might break the 'About IITC' page or break update checks) +plugin_info.buildName = 'mobile'; +plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.pluginId = 'portal-highlighter-needs-recharge'; +//END PLUGIN AUTHORS NOTE + + + +// PLUGIN START //////////////////////////////////////////////////////// + +// use own namespace for plugin +window.plugin.portalHighlighterNeedsRecharge = function() {}; + +window.plugin.portalHighlighterNeedsRecharge.highlight = function(data) { + var d = data.portal.options.data; + var health = d.health; + + if(health !== undefined && data.portal.options.team != TEAM_NONE && health < 100) { + var color,fill_opacity; + if (health > 95) { + color = 'yellow'; + fill_opacity = (1-health/100)*.50 + .50; + } else if (health > 75) { + color = 'DarkOrange'; + fill_opacity = (1-health/100)*.50 + .50; + } else if (health > 15) { + color = 'red'; + fill_opacity = (1-health/100)*.75 + .25; + } else { + color = 'magenta'; + fill_opacity = (1-health/100)*.75 + .25; + } + + var params = {fillColor: color, fillOpacity: fill_opacity}; + data.portal.setStyle(params); + } +} + +var setup = function() { + window.addPortalHighlighter('Needs Recharge (Health)', window.plugin.portalHighlighterNeedsRecharge.highlight); +} + +// PLUGIN END ////////////////////////////////////////////////////////// + + +setup.info = plugin_info; //add the script info data to the function as a property +if(!window.bootPlugins) window.bootPlugins = []; +window.bootPlugins.push(setup); +// if IITC has already booted, immediately run the 'setup' function +if(window.iitcLoaded && typeof setup === 'function') setup(); +} // wrapper end +// inject code into site context +var script = document.createElement('script'); +var info = {}; +if (typeof GM_info !== 'undefined' && GM_info && GM_info.script) info.script = { version: GM_info.script.version, name: GM_info.script.name, description: GM_info.script.description }; +script.appendChild(document.createTextNode('('+ wrapper +')('+JSON.stringify(info)+');')); +(document.body || document.head || document.documentElement).appendChild(script); + + diff --git a/mobile/assets/plugins/portal-highlighter-ornaments.user.js b/mobile/assets/plugins/portal-highlighter-ornaments.user.js new file mode 100644 index 000000000..c623e18cd --- /dev/null +++ b/mobile/assets/plugins/portal-highlighter-ornaments.user.js @@ -0,0 +1,73 @@ +// ==UserScript== +// @id iitc-plugin-highlight-ornaments@jonatkins +// @name IITC plugin: hightlight portals with ornaments +// @category Highlighter +// @version 0.0.1.20181030.90244 +// @namespace https://github.com/jonatkins/ingress-intel-total-conversion +// @updateURL none +// @downloadURL none +// @description [mobile-2018-10-30-090244] Use the portal fill color to denote portals with additional 'ornament' markers. e.g. Anomaly portals +// @include https://*.ingress.com/intel* +// @include http://*.ingress.com/intel* +// @match https://*.ingress.com/intel* +// @match http://*.ingress.com/intel* +// @include https://*.ingress.com/mission/* +// @include http://*.ingress.com/mission/* +// @match https://*.ingress.com/mission/* +// @match http://*.ingress.com/mission/* +// @grant none +// ==/UserScript== + + +function wrapper(plugin_info) { +// ensure plugin framework is there, even if iitc is not yet loaded +if(typeof window.plugin !== 'function') window.plugin = function() {}; + +//PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! +//(leaving them in place might break the 'About IITC' page or break update checks) +plugin_info.buildName = 'mobile'; +plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.pluginId = 'portal-highlighter-ornaments'; +//END PLUGIN AUTHORS NOTE + + + +// PLUGIN START //////////////////////////////////////////////////////// + +// use own namespace for plugin +window.plugin.portalHighlightOrnaments = function() {}; + +window.plugin.portalHighlightOrnaments.highlight = function(data) { + var d = data.portal.options.data; + if(d.ornaments && d.ornaments.length > 0) { + var fill_opacity = 0.75; + var color = 'red'; + + // TODO? match specific cases of ornament name and/or portals with multiple ornaments, and highlight in different colours? + + var params = {fillColor: color, fillOpacity: fill_opacity}; + data.portal.setStyle(params); + } +} + +var setup = function() { + window.addPortalHighlighter('Ornaments (anomaly portals)', window.plugin.portalHighlightOrnaments.highlight); +} + +// PLUGIN END ////////////////////////////////////////////////////////// + + +setup.info = plugin_info; //add the script info data to the function as a property +if(!window.bootPlugins) window.bootPlugins = []; +window.bootPlugins.push(setup); +// if IITC has already booted, immediately run the 'setup' function +if(window.iitcLoaded && typeof setup === 'function') setup(); +} // wrapper end +// inject code into site context +var script = document.createElement('script'); +var info = {}; +if (typeof GM_info !== 'undefined' && GM_info && GM_info.script) info.script = { version: GM_info.script.version, name: GM_info.script.name, description: GM_info.script.description }; +script.appendChild(document.createTextNode('('+ wrapper +')('+JSON.stringify(info)+');')); +(document.body || document.head || document.documentElement).appendChild(script); + + diff --git a/mobile/assets/plugins/portal-highlighter-outbound-link-counter.user.js b/mobile/assets/plugins/portal-highlighter-outbound-link-counter.user.js new file mode 100644 index 000000000..6f4419a36 --- /dev/null +++ b/mobile/assets/plugins/portal-highlighter-outbound-link-counter.user.js @@ -0,0 +1,19 @@ +// ==UserScript== +// @id iitc-plugin-highlight-outbound-link-counter@cathesaurus +// @name IITC plugin: highlight portals running low on outbound links +// @category Deleted +// @version 0.1.0.20181030.90244 +// @namespace https://github.com/jonatkins/ingress-intel-total-conversion +// @updateURL none +// @downloadURL none +// @description PLUGIN CURRENTLY UNAVAILABLE +// @include https://*.ingress.com/intel* +// @include http://*.ingress.com/intel* +// @match https://*.ingress.com/intel* +// @match http://*.ingress.com/intel* +// @include https://*.ingress.com/mission/* +// @include http://*.ingress.com/mission/* +// @match https://*.ingress.com/mission/* +// @match http://*.ingress.com/mission/* +// @grant none +// ==/UserScript== diff --git a/mobile/assets/plugins/portal-highlighter-portal-ap-energy-relative.user.js b/mobile/assets/plugins/portal-highlighter-portal-ap-energy-relative.user.js new file mode 100644 index 000000000..ca517af23 --- /dev/null +++ b/mobile/assets/plugins/portal-highlighter-portal-ap-energy-relative.user.js @@ -0,0 +1,19 @@ +// ==UserScript== +// @id iitc-plugin-highlight-portals-by-ap-by-energy-relative@vita10gy +// @name IITC plugin: highlight portals by ap/energy (relative) +// @category Deleted +// @version 0.1.1.20181030.90244 +// @namespace https://github.com/jonatkins/ingress-intel-total-conversion +// @updateURL none +// @downloadURL none +// @description This plugin is no longer available, as Niantic optimisations have removed the data it needed. +// @include https://*.ingress.com/intel* +// @include http://*.ingress.com/intel* +// @match https://*.ingress.com/intel* +// @match http://*.ingress.com/intel* +// @include https://*.ingress.com/mission/* +// @include http://*.ingress.com/mission/* +// @match https://*.ingress.com/mission/* +// @match http://*.ingress.com/mission/* +// @grant none +// ==/UserScript== diff --git a/mobile/assets/plugins/portal-highlighter-portal-ap-relative.user.js b/mobile/assets/plugins/portal-highlighter-portal-ap-relative.user.js new file mode 100644 index 000000000..978e563c9 --- /dev/null +++ b/mobile/assets/plugins/portal-highlighter-portal-ap-relative.user.js @@ -0,0 +1,19 @@ +// ==UserScript== +// @id iitc-plugin-highlight-portals-by-ap-relative@vita10gy +// @name IITC plugin: highlight portals by ap relative +// @category Deleted +// @version 0.1.1.20181030.90244 +// @namespace https://github.com/jonatkins/ingress-intel-total-conversion +// @updateURL none +// @downloadURL none +// @description This plugin is no longer available, as Niantic optimisations have removed the data it needed. +// @include https://*.ingress.com/intel* +// @include http://*.ingress.com/intel* +// @match https://*.ingress.com/intel* +// @match http://*.ingress.com/intel* +// @include https://*.ingress.com/mission/* +// @include http://*.ingress.com/mission/* +// @match https://*.ingress.com/mission/* +// @match http://*.ingress.com/mission/* +// @grant none +// ==/UserScript== diff --git a/mobile/assets/plugins/portal-highlighter-portal-ap.user.js b/mobile/assets/plugins/portal-highlighter-portal-ap.user.js new file mode 100644 index 000000000..74e108cf2 --- /dev/null +++ b/mobile/assets/plugins/portal-highlighter-portal-ap.user.js @@ -0,0 +1,19 @@ +// ==UserScript== +// @id iitc-plugin-highlight-portals-by-ap@vita10gy +// @name IITC plugin: highlight portals by ap +// @category Deleted +// @version 0.1.1.20181030.90244 +// @namespace https://github.com/jonatkins/ingress-intel-total-conversion +// @updateURL none +// @downloadURL none +// @description This plugin is no longer available, as Niantic optimisations have removed the data it needed. +// @include https://*.ingress.com/intel* +// @include http://*.ingress.com/intel* +// @match https://*.ingress.com/intel* +// @match http://*.ingress.com/intel* +// @include https://*.ingress.com/mission/* +// @include http://*.ingress.com/mission/* +// @match https://*.ingress.com/mission/* +// @match http://*.ingress.com/mission/* +// @grant none +// ==/UserScript== diff --git a/mobile/assets/plugins/portal-highlighter-portals-my-level.user.js b/mobile/assets/plugins/portal-highlighter-portals-my-level.user.js new file mode 100644 index 000000000..fd824510d --- /dev/null +++ b/mobile/assets/plugins/portal-highlighter-portals-my-level.user.js @@ -0,0 +1,83 @@ +// ==UserScript== +// @id iitc-plugin-highlight-portals-my-level@vita10gy +// @name IITC plugin: highlight portals by my level +// @category Highlighter +// @version 0.1.2.20181030.90244 +// @namespace https://github.com/jonatkins/ingress-intel-total-conversion +// @updateURL none +// @downloadURL none +// @description [mobile-2018-10-30-090244] Use the portal fill color to denote if the portal is either at and above, or at and below your level. +// @include https://*.ingress.com/intel* +// @include http://*.ingress.com/intel* +// @match https://*.ingress.com/intel* +// @match http://*.ingress.com/intel* +// @include https://*.ingress.com/mission/* +// @include http://*.ingress.com/mission/* +// @match https://*.ingress.com/mission/* +// @match http://*.ingress.com/mission/* +// @grant none +// ==/UserScript== + + +function wrapper(plugin_info) { +// ensure plugin framework is there, even if iitc is not yet loaded +if(typeof window.plugin !== 'function') window.plugin = function() {}; + +//PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! +//(leaving them in place might break the 'About IITC' page or break update checks) +plugin_info.buildName = 'mobile'; +plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.pluginId = 'portal-highlighter-portals-my-level'; +//END PLUGIN AUTHORS NOTE + + + +// PLUGIN START //////////////////////////////////////////////////////// + +// use own namespace for plugin +window.plugin.portalHighlighterPortalsMyLevel = function() {}; + + +window.plugin.portalHighlighterPortalsMyLevel.belowLevel = function(data) { + window.plugin.portalHighlighterPortalsMyLevel.colorLevel(true,data); +} + +window.plugin.portalHighlighterPortalsMyLevel.aboveLevel = function(data) { + window.plugin.portalHighlighterPortalsMyLevel.colorLevel(false,data); +} + +window.plugin.portalHighlighterPortalsMyLevel.colorLevel = function(below,data) { + var portal_level = data.portal.options.level; + + // as portal levels can never be higher than L8, clamp the player level to this for highlight purposes + var player_level = Math.min(PLAYER.level,8); + + var opacity = .6; + if((below && portal_level <= player_level) || + (!below && portal_level >= player_level)) { + data.portal.setStyle({fillColor: 'red', fillOpacity: opacity}); + } +} + +var setup = function() { + window.addPortalHighlighter('Below My Level', window.plugin.portalHighlighterPortalsMyLevel.belowLevel); + window.addPortalHighlighter('Above My Level', window.plugin.portalHighlighterPortalsMyLevel.aboveLevel); +} + +// PLUGIN END ////////////////////////////////////////////////////////// + + +setup.info = plugin_info; //add the script info data to the function as a property +if(!window.bootPlugins) window.bootPlugins = []; +window.bootPlugins.push(setup); +// if IITC has already booted, immediately run the 'setup' function +if(window.iitcLoaded && typeof setup === 'function') setup(); +} // wrapper end +// inject code into site context +var script = document.createElement('script'); +var info = {}; +if (typeof GM_info !== 'undefined' && GM_info && GM_info.script) info.script = { version: GM_info.script.version, name: GM_info.script.name, description: GM_info.script.description }; +script.appendChild(document.createTextNode('('+ wrapper +')('+JSON.stringify(info)+');')); +(document.body || document.head || document.documentElement).appendChild(script); + + diff --git a/mobile/assets/plugins/portal-highlighter-portals-upgrade.user.js b/mobile/assets/plugins/portal-highlighter-portals-upgrade.user.js new file mode 100644 index 000000000..a2fa9cac8 --- /dev/null +++ b/mobile/assets/plugins/portal-highlighter-portals-upgrade.user.js @@ -0,0 +1,19 @@ +// ==UserScript== +// @id iitc-plugin-highlight-portals-upgrade@vita10gy +// @name IITC plugin: highlight portals you can upgrade +// @category Deleted +// @version 0.2.0.20181030.90244 +// @namespace https://github.com/jonatkins/ingress-intel-total-conversion +// @updateURL none +// @downloadURL none +// @description This plugin is no longer available, as Niantic optimisations have removed the data it needed. +// @include https://*.ingress.com/intel* +// @include http://*.ingress.com/intel* +// @match https://*.ingress.com/intel* +// @match http://*.ingress.com/intel* +// @include https://*.ingress.com/mission/* +// @include http://*.ingress.com/mission/* +// @match https://*.ingress.com/mission/* +// @match http://*.ingress.com/mission/* +// @grant none +// ==/UserScript== diff --git a/mobile/assets/plugins/portal-highlighter-with-lvl8-resonators.user.js b/mobile/assets/plugins/portal-highlighter-with-lvl8-resonators.user.js new file mode 100644 index 000000000..d3da67acf --- /dev/null +++ b/mobile/assets/plugins/portal-highlighter-with-lvl8-resonators.user.js @@ -0,0 +1,19 @@ +// ==UserScript== +// @id iitc-plugin-highlight-portals-with-L8-resonators@superd +// @name IITC plugin: highlight portals with L8 resonators +// @category Deleted +// @version 0.1.0.20181030.90244 +// @namespace https://github.com/jonatkins/ingress-intel-total-conversion +// @updateURL none +// @downloadURL none +// @description This plugin is no longer available, as Niantic optimisations have removed the data it needed. +// @include https://*.ingress.com/intel* +// @include http://*.ingress.com/intel* +// @match https://*.ingress.com/intel* +// @match http://*.ingress.com/intel* +// @include https://*.ingress.com/mission/* +// @include http://*.ingress.com/mission/* +// @match https://*.ingress.com/mission/* +// @match http://*.ingress.com/mission/* +// @grant none +// ==/UserScript== diff --git a/mobile/assets/plugins/portal-level-numbers.user.js b/mobile/assets/plugins/portal-level-numbers.user.js new file mode 100644 index 000000000..c7b1d2269 --- /dev/null +++ b/mobile/assets/plugins/portal-level-numbers.user.js @@ -0,0 +1,212 @@ +// ==UserScript== +// @id iitc-plugin-portal-level-numbers@rongou +// @name IITC plugin: Portal Level Numbers +// @category Layer +// @version 0.1.5.20181030.90244 +// @namespace https://github.com/jonatkins/ingress-intel-total-conversion +// @updateURL none +// @downloadURL none +// @description [mobile-2018-10-30-090244] Show portal level numbers on map. +// @include https://*.ingress.com/intel* +// @include http://*.ingress.com/intel* +// @match https://*.ingress.com/intel* +// @match http://*.ingress.com/intel* +// @include https://*.ingress.com/mission/* +// @include http://*.ingress.com/mission/* +// @match https://*.ingress.com/mission/* +// @match http://*.ingress.com/mission/* +// @grant none +// ==/UserScript== + + +function wrapper(plugin_info) { +// ensure plugin framework is there, even if iitc is not yet loaded +if(typeof window.plugin !== 'function') window.plugin = function() {}; + +//PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! +//(leaving them in place might break the 'About IITC' page or break update checks) +plugin_info.buildName = 'mobile'; +plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.pluginId = 'portal-level-numbers'; +//END PLUGIN AUTHORS NOTE + + + +// PLUGIN START //////////////////////////////////////////////////////// + +// use own namespace for plugin +window.plugin.portalLevelNumbers = function() { +}; + +window.plugin.portalLevelNumbers.ICON_SIZE = 12; +window.plugin.portalLevelNumbers.MOBILE_SCALE = 1.5; + +window.plugin.portalLevelNumbers.levelLayers = {}; +window.plugin.portalLevelNumbers.levelLayerGroup = null; + +window.plugin.portalLevelNumbers.setupCSS = function() { + $("'); + + $('body').addClass('privacy_inactive'); + + //Wrap iitc chat toggle to update our elements + $('#chatcontrols a:first').unbind('click'); + $('#chatcontrols a:first').click(window.plugin.privacyView.wrapChatToggle); + + $('#chatcontrols').before('
    ' + + ' ' + + '
    '); + $('#privacycontrols a').click(window.plugin.privacyView.toggle); + + window.plugin.privacyView.toggle(); +}; + +var setup = window.plugin.privacyView.setup; + +// PLUGIN END ////////////////////////////////////////////////////////// + + +setup.info = plugin_info; //add the script info data to the function as a property +if(!window.bootPlugins) window.bootPlugins = []; +window.bootPlugins.push(setup); +// if IITC has already booted, immediately run the 'setup' function +if(window.iitcLoaded && typeof setup === 'function') setup(); +} // wrapper end +// inject code into site context +var script = document.createElement('script'); +var info = {}; +if (typeof GM_info !== 'undefined' && GM_info && GM_info.script) info.script = { version: GM_info.script.version, name: GM_info.script.name, description: GM_info.script.description }; +script.appendChild(document.createTextNode('('+ wrapper +')('+JSON.stringify(info)+');')); +(document.body || document.head || document.documentElement).appendChild(script); + + diff --git a/mobile/assets/plugins/regions.user.js b/mobile/assets/plugins/regions.user.js new file mode 100644 index 000000000..92eb4019d --- /dev/null +++ b/mobile/assets/plugins/regions.user.js @@ -0,0 +1,653 @@ +// ==UserScript== +// @id iitc-plugin-regions@jonatkins +// @name IITC plugin: Show the local score regions +// @category Layer +// @version 0.1.2.20181030.90244 +// @namespace https://github.com/jonatkins/ingress-intel-total-conversion +// @updateURL none +// @downloadURL none +// @description [mobile-2018-10-30-090244] Show the local scoring regions on the map. No actual scores - just the region areas. +// @include https://*.ingress.com/intel* +// @include http://*.ingress.com/intel* +// @match https://*.ingress.com/intel* +// @match http://*.ingress.com/intel* +// @include https://*.ingress.com/mission/* +// @include http://*.ingress.com/mission/* +// @match https://*.ingress.com/mission/* +// @match http://*.ingress.com/mission/* +// @grant none +// ==/UserScript== + + +function wrapper(plugin_info) { +// ensure plugin framework is there, even if iitc is not yet loaded +if(typeof window.plugin !== 'function') window.plugin = function() {}; + +//PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! +//(leaving them in place might break the 'About IITC' page or break update checks) +plugin_info.buildName = 'mobile'; +plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.pluginId = 'regions'; +//END PLUGIN AUTHORS NOTE + + + +// PLUGIN START //////////////////////////////////////////////////////// + + +// use own namespace for plugin +window.plugin.regions = function() {}; + +window.plugin.regions.setup = function() { + /// S2 Geometry functions +// the regional scoreboard is based on a level 6 S2 Cell +// - https://docs.google.com/presentation/d/1Hl4KapfAENAOf4gv-pSngKwvS_jwNVHRPZTTDzXXn6Q/view?pli=1#slide=id.i22 +// at the time of writing there's no actual API for the intel map to retrieve scoreboard data, +// but it's still useful to plot the score cells on the intel map + + +// the S2 geometry is based on projecting the earth sphere onto a cube, with some scaling of face coordinates to +// keep things close to approximate equal area for adjacent cells +// to convert a lat,lng into a cell id: +// - convert lat,lng to x,y,z +// - convert x,y,z into face,u,v +// - u,v scaled to s,t with quadratic formula +// - s,t converted to integer i,j offsets +// - i,j converted to a position along a Hubbert space-filling curve +// - combine face,position to get the cell id + +//NOTE: compared to the google S2 geometry library, we vary from their code in the following ways +// - cell IDs: they combine face and the hilbert curve position into a single 64 bit number. this gives efficient space +// and speed. javascript doesn't have appropriate data types, and speed is not cricical, so we use +// as [face,[bitpair,bitpair,...]] instead +// - i,j: they always use 30 bits, adjusting as needed. we use 0 to (1< temp[1]) { + if (temp[0] > temp[2]) { + return 0; + } else { + return 2; + } + } else { + if (temp[1] > temp[2]) { + return 1; + } else { + return 2; + } + } + +}; + +var faceXYZToUV = function(face,xyz) { + var u,v; + + switch (face) { + case 0: u = xyz[1]/xyz[0]; v = xyz[2]/xyz[0]; break; + case 1: u = -xyz[0]/xyz[1]; v = xyz[2]/xyz[1]; break; + case 2: u = -xyz[0]/xyz[2]; v = -xyz[1]/xyz[2]; break; + case 3: u = xyz[2]/xyz[0]; v = xyz[1]/xyz[0]; break; + case 4: u = xyz[2]/xyz[1]; v = -xyz[0]/xyz[1]; break; + case 5: u = -xyz[1]/xyz[2]; v = -xyz[0]/xyz[2]; break; + default: throw {error: 'Invalid face'}; break; + } + + return [u,v]; +} + + + + +var XYZToFaceUV = function(xyz) { + var face = largestAbsComponent(xyz); + + if (xyz[face] < 0) { + face += 3; + } + + uv = faceXYZToUV (face,xyz); + + return [face, uv]; +}; + +var FaceUVToXYZ = function(face,uv) { + var u = uv[0]; + var v = uv[1]; + + switch (face) { + case 0: return [ 1, u, v]; + case 1: return [-u, 1, v]; + case 2: return [-u,-v, 1]; + case 3: return [-1,-v,-u]; + case 4: return [ v,-1,-u]; + case 5: return [ v, u,-1]; + default: throw {error: 'Invalid face'}; + } +}; + + +var STToUV = function(st) { + var singleSTtoUV = function(st) { + if (st >= 0.5) { + return (1/3.0) * (4*st*st - 1); + } else { + return (1/3.0) * (1 - (4*(1-st)*(1-st))); + } + } + + return [singleSTtoUV(st[0]), singleSTtoUV(st[1])]; +}; + + + +var UVToST = function(uv) { + var singleUVtoST = function(uv) { + if (uv >= 0) { + return 0.5 * Math.sqrt (1 + 3*uv); + } else { + return 1 - 0.5 * Math.sqrt (1 - 3*uv); + } + } + + return [singleUVtoST(uv[0]), singleUVtoST(uv[1])]; +}; + + +var STToIJ = function(st,order) { + var maxSize = (1<=0; i--) { + + var mask = 1<=0 && ij[1]>=0 && ij[0]") + .prop("type", "text/css") + .html(".plugin-regions-name {\ + font-size: 14px;\ + font-weight: bold;\ + color: gold;\ + opacity: 0.7;\ + text-align: center;\ + text-shadow: -1px -1px #000, 1px -1px #000, -1px 1px #000, 1px 1px #000, 0 0 2px #000; \ + pointer-events: none;\ + }") + .appendTo("head"); + + addLayerGroup('Score Regions', window.plugin.regions.regionLayer, true); + + map.on('moveend', window.plugin.regions.update); + + addHook('search', window.plugin.regions.search); + + window.plugin.regions.update(); +}; + +window.plugin.regions.FACE_NAMES = [ 'AF', 'AS', 'NR', 'PA', 'AM', 'ST' ]; +window.plugin.regions.CODE_WORDS = [ + 'ALPHA', 'BRAVO', 'CHARLIE', 'DELTA', + 'ECHO', 'FOXTROT', 'GOLF', 'HOTEL', + 'JULIET', 'KILO', 'LIMA', 'MIKE', + 'NOVEMBER', 'PAPA', 'ROMEO', 'SIERRA', +]; + +// This regexp is quite forgiving. Dashes are allowed between all components, each dash and leading zero is optional. +// All whitespace is removed in onSearch(). If the first or both the first and second component are omitted, they are +// replaced with the current cell's coordinates (=the cell which contains the center point of the map). If the last +// component is ommited, the 4x4 cell group is used. +window.plugin.regions.REGEXP = new RegExp('^(?:(?:(' + plugin.regions.FACE_NAMES.join('|') + ')-?)?((?:1[0-6])|(?:0?[1-9]))-?)?(' + + plugin.regions.CODE_WORDS.join('|') + ')(?:-?((?:1[0-5])|(?:0?\\d)))?$', 'i'); + +window.plugin.regions.regionName = function(cell) { + // ingress does some odd things with the naming. for some faces, the i and j coords are flipped when converting + // (and not only the names - but the full quad coords too!). easiest fix is to create a temporary cell with the coords + // swapped + if (cell.face == 1 || cell.face == 3 || cell.face == 5) { + cell = S2.S2Cell.FromFaceIJ ( cell.face, [cell.ij[1], cell.ij[0]], cell.level ); + } + + // first component of the name is the face + var name = window.plugin.regions.FACE_NAMES[cell.face]; + + if (cell.level >= 4) { + // next two components are from the most signifitant four bits of the cell I/J + var regionI = cell.ij[0] >> (cell.level-4); + var regionJ = cell.ij[1] >> (cell.level-4); + + name += zeroPad(regionI+1,2)+'-'+window.plugin.regions.CODE_WORDS[regionJ]; + } + + if (cell.level >= 6) { + // the final component is based on the hibbert curve for the relevant cell + var facequads = cell.getFaceAndQuads(); + var number = facequads[1][4]*4+facequads[1][5]; + + name += '-'+zeroPad(number,2); + } + + + return name; +}; + +window.plugin.regions.search = function(query) { + var terms = query.term.replace(/\s+/g, '').split(/[,;]/); + var matches = terms.map(function(string) { + return string.match(window.plugin.regions.REGEXP); + }); + if(!matches.every(function(match) { return match !== null; })) return; + + var currentCell = window.plugin.regions.regionName(S2.S2Cell.FromLatLng(map.getCenter(), 6)); + + matches.forEach(function(match) { + if(!match[1]) + match[1] = currentCell.substr(0, 2); + else + match[1] = match[1].toUpperCase(); + + if(!match[2]) + match[2] = currentCell.substr(2,2); + + match[3] = match[3].toUpperCase(); + + var result = window.plugin.regions.getSearchResult(match); + if(result) query.addResult(result); + }); +} + +// rot and d2xy from Wikipedia +window.plugin.regions.rot = function(n, x, y, rx, ry) { + if(ry == 0) { + if(rx == 1) { + x = n-1 - x; + y = n-1 - y; + } + + return [y, x]; + } + return [x, y]; +} +window.plugin.regions.d2xy = function(n, d) { + var rx, ry, s, t = d, xy = [0, 0]; + for(s=1; s 16 || codeWordId === -1 || id2 < 0 || id2 > 15) return; + + // looks good. now we need the face/i/j values for this cell + + // face is used as-is + + // id1 is the region 'i' value (first 4 bits), codeword is the 'j' value (first 4 bits) + var regionI = id1-1; + var regionJ = codeWordId; + + var result = {}, level; + + if(id2 === undefined) { + result.description = 'Regional score cells (cluster of 16 cells)'; + result.icon = 'data:image/svg+xml;base64,'+btoa('\n \n\n'.replace(/orange/, 'gold')); + level = 4; + } else { + result.description = 'Regional score cell'; + result.icon = 'data:image/svg+xml;base64,'+btoa('\n \n\n'); + level = 6; + + var xy = window.plugin.regions.d2xy(4, id2); + regionI = (regionI << 2) + xy[0]; + regionJ = (regionJ << 2) + xy[1]; + } + + // as in the name-construction above, for odd numbered faces, the I and J need swapping + var cell = (faceId % 2 == 1) + ? S2.S2Cell.FromFaceIJ(faceId, [regionJ,regionI], level) + : S2.S2Cell.FromFaceIJ(faceId, [regionI,regionJ], level); + + var corners = cell.getCornerLatLngs(); + + result.title = window.plugin.regions.regionName(cell); + result.layer = L.geodesicPolygon(corners, { fill: false, color: 'red', clickable: false }); + result.bounds = L.latLngBounds(corners); + + return result; +} + +window.plugin.regions.update = function() { + + window.plugin.regions.regionLayer.clearLayers(); + + var bounds = map.getBounds(); + + var seenCells = {}; + + var drawCellAndNeighbors = function(cell) { + + var cellStr = cell.toString(); + + if (!seenCells[cellStr]) { + // cell not visited - flag it as visited now + seenCells[cellStr] = true; + + // is it on the screen? + var corners = cell.getCornerLatLngs(); + var cellBounds = L.latLngBounds([corners[0],corners[1]]).extend(corners[2]).extend(corners[3]); + + if (cellBounds.intersects(bounds)) { + // on screen - draw it + window.plugin.regions.drawCell(cell); + + // and recurse to our neighbors + var neighbors = cell.getNeighbors(); + for (var i=0; i= 5) { + var cellSize = zoom>=7 ? 6 : 4; + var cell = S2.S2Cell.FromLatLng ( map.getCenter(), cellSize ); + + drawCellAndNeighbors(cell); + } + + + // the six cube side boundaries. we cheat by hard-coding the coords as it's simple enough + var latLngs = [ [45,-180], [35.264389682754654,-135], [35.264389682754654,-45], [35.264389682754654,45], [35.264389682754654,135], [45,180]]; + + var globalCellOptions = {color: 'red', weight: 7, opacity: 0.5, clickable: false }; + + for (var i=0; i= 9) { + var namebounds = map.getBounds().pad(-0.1); // pad 10% inside the screen bounds + if (!namebounds.contains(center)) { + // name is off-screen. pull it in so it's inside the bounds + var newlat = Math.max(Math.min(center.lat, namebounds.getNorth()), namebounds.getSouth()); + var newlng = Math.max(Math.min(center.lng, namebounds.getEast()), namebounds.getWest()); + + var newpos = L.latLng(newlat,newlng); + + // ensure the new position is still within the same cell + var newposcell = S2.S2Cell.FromLatLng ( newpos, 6 ); + if ( newposcell.toString() == cell.toString() ) { + center=newpos; + } + // else we leave the name where it was - offscreen + } + } + + var marker = L.marker(center, { + icon: L.divIcon({ + className: 'plugin-regions-name', + iconAnchor: [100,5], + iconSize: [200,10], + html: name, + }) + }); + window.plugin.regions.regionLayer.addLayer(marker); +}; + +var setup = window.plugin.regions.setup; + +// PLUGIN END ////////////////////////////////////////////////////////// + + +setup.info = plugin_info; //add the script info data to the function as a property +if(!window.bootPlugins) window.bootPlugins = []; +window.bootPlugins.push(setup); +// if IITC has already booted, immediately run the 'setup' function +if(window.iitcLoaded && typeof setup === 'function') setup(); +} // wrapper end +// inject code into site context +var script = document.createElement('script'); +var info = {}; +if (typeof GM_info !== 'undefined' && GM_info && GM_info.script) info.script = { version: GM_info.script.version, name: GM_info.script.name, description: GM_info.script.description }; +script.appendChild(document.createTextNode('('+ wrapper +')('+JSON.stringify(info)+');')); +(document.body || document.head || document.documentElement).appendChild(script); + + diff --git a/mobile/assets/plugins/render-limit-increase.user.js b/mobile/assets/plugins/render-limit-increase.user.js new file mode 100644 index 000000000..657ae92e8 --- /dev/null +++ b/mobile/assets/plugins/render-limit-increase.user.js @@ -0,0 +1,21 @@ +// ==UserScript== +// @id iitc-plugin-render-limit-increase@jonatkins +// @name IITC plugin: render limit increase +// @category Deleted +// @version 0.4.0.20181030.90244 +// @namespace https://github.com/jonatkins/ingress-intel-total-conversion +// @updateURL none +// @downloadURL none +// @description [mobile-2018-10-30-090244] IITC no longer has simple render limits that can be adjusted - many more portals are now displayed without any increases required. +// @include https://*.ingress.com/intel* +// @include http://*.ingress.com/intel* +// @match https://*.ingress.com/intel* +// @match http://*.ingress.com/intel* +// @include https://*.ingress.com/mission/* +// @include http://*.ingress.com/mission/* +// @match https://*.ingress.com/mission/* +// @match http://*.ingress.com/mission/* +// @grant none +// ==/UserScript== + + diff --git a/mobile/assets/plugins/reso-energy-pct-in-portal-detail.user.js b/mobile/assets/plugins/reso-energy-pct-in-portal-detail.user.js new file mode 100644 index 000000000..58674ef51 --- /dev/null +++ b/mobile/assets/plugins/reso-energy-pct-in-portal-detail.user.js @@ -0,0 +1,77 @@ +// ==UserScript== +// @id iitc-plugin-reso-energy-pct-in-portal-detail@xelio +// @name IITC plugin: reso energy pct in portal detail +// @category Portal Info +// @version 0.1.2.20181030.90244 +// @namespace https://github.com/jonatkins/ingress-intel-total-conversion +// @updateURL none +// @downloadURL none +// @description [mobile-2018-10-30-090244] Show resonator energy percentage on resonator energy bar in portal detail panel. +// @include https://*.ingress.com/intel* +// @include http://*.ingress.com/intel* +// @match https://*.ingress.com/intel* +// @match http://*.ingress.com/intel* +// @include https://*.ingress.com/mission/* +// @include http://*.ingress.com/mission/* +// @match https://*.ingress.com/mission/* +// @match http://*.ingress.com/mission/* +// @grant none +// ==/UserScript== + + +function wrapper(plugin_info) { +// ensure plugin framework is there, even if iitc is not yet loaded +if(typeof window.plugin !== 'function') window.plugin = function() {}; + +//PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! +//(leaving them in place might break the 'About IITC' page or break update checks) +plugin_info.buildName = 'mobile'; +plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.pluginId = 'reso-energy-pct-in-portal-detail'; +//END PLUGIN AUTHORS NOTE + + + +// PLUGIN START //////////////////////////////////////////////////////// + +// use own namespace for plugin +window.plugin.resoEnergyPctInPortalDetail = function() {}; + +window.plugin.resoEnergyPctInPortalDetail.updateMeter = function(data) { + $("span.meter-level") + .css({ + "word-spacing": "-1px", + "text-align": "left", + "font-size": "90%", + "padding-left": "2px", + }) + .each(function() { + var matchResult = $(this).parent().attr('title').match(/\((\d*\%)\)/); + if(matchResult) { + var html = $(this).html() + '
    ' + matchResult[1] + '
    '; + $(this).html(html); + } + }); +} + +var setup = function() { + window.addHook('portalDetailsUpdated', window.plugin.resoEnergyPctInPortalDetail.updateMeter); +} + +// PLUGIN END ////////////////////////////////////////////////////////// + + +setup.info = plugin_info; //add the script info data to the function as a property +if(!window.bootPlugins) window.bootPlugins = []; +window.bootPlugins.push(setup); +// if IITC has already booted, immediately run the 'setup' function +if(window.iitcLoaded && typeof setup === 'function') setup(); +} // wrapper end +// inject code into site context +var script = document.createElement('script'); +var info = {}; +if (typeof GM_info !== 'undefined' && GM_info && GM_info.script) info.script = { version: GM_info.script.version, name: GM_info.script.name, description: GM_info.script.description }; +script.appendChild(document.createTextNode('('+ wrapper +')('+JSON.stringify(info)+');')); +(document.body || document.head || document.documentElement).appendChild(script); + + diff --git a/mobile/assets/plugins/resonator-display-zoom-level-decrease.user.js b/mobile/assets/plugins/resonator-display-zoom-level-decrease.user.js new file mode 100644 index 000000000..74415790f --- /dev/null +++ b/mobile/assets/plugins/resonator-display-zoom-level-decrease.user.js @@ -0,0 +1,20 @@ +// ==UserScript== +// @id iitc-plugin-resonator-display-zoom-level-decrease@xelio +// @name IITC plugin: resonator display zoom level decrease +// @category Deleted +// @version 1.0.2.20181030.90244 +// @namespace https://github.com/jonatkins/ingress-intel-total-conversion +// @updateURL none +// @downloadURL none +// @description [mobile-2018-10-30-090244] Resonator display distance is no longer an option set with a plugin. With the 'draw-resonators' plugin you can now turn on/off resonators in the layer chooser instead. +// @include https://*.ingress.com/intel* +// @include http://*.ingress.com/intel* +// @match https://*.ingress.com/intel* +// @match http://*.ingress.com/intel* +// @include https://*.ingress.com/mission/* +// @include http://*.ingress.com/mission/* +// @match https://*.ingress.com/mission/* +// @match http://*.ingress.com/mission/* +// @grant none +// ==/UserScript== + diff --git a/mobile/assets/plugins/scale-bar.user.js b/mobile/assets/plugins/scale-bar.user.js new file mode 100644 index 000000000..da600f67d --- /dev/null +++ b/mobile/assets/plugins/scale-bar.user.js @@ -0,0 +1,72 @@ +// ==UserScript== +// @id iitc-plugin-scale-bar@breunigs +// @name IITC plugin: scale bar +// @category Controls +// @version 0.1.0.20181030.90244 +// @namespace https://github.com/jonatkins/ingress-intel-total-conversion +// @updateURL none +// @downloadURL none +// @description [mobile-2018-10-30-090244] Show scale bar on the map. +// @include https://*.ingress.com/intel* +// @include http://*.ingress.com/intel* +// @match https://*.ingress.com/intel* +// @match http://*.ingress.com/intel* +// @include https://*.ingress.com/mission/* +// @include http://*.ingress.com/mission/* +// @match https://*.ingress.com/mission/* +// @match http://*.ingress.com/mission/* +// @grant none +// ==/UserScript== + + +function wrapper(plugin_info) { +// ensure plugin framework is there, even if iitc is not yet loaded +if(typeof window.plugin !== 'function') window.plugin = function() {}; + +//PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! +//(leaving them in place might break the 'About IITC' page or break update checks) +plugin_info.buildName = 'mobile'; +plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.pluginId = 'scale-bar'; +//END PLUGIN AUTHORS NOTE + + + +// PLUGIN START //////////////////////////////////////////////////////// + + +// use own namespace for plugin +window.plugin.scaleBar = function() {}; + +window.plugin.scaleBar.setup = function() { + // Before you ask: yes, I explicitely turned off imperial units. Imperial units + // are worse than Internet Explorer 6 whirring fans combined. Upgrade to the metric + // system already. + if (window.isSmartphone()) { + $('head').append(''); + window.map.addControl(new L.Control.Scale({position: 'bottomright', imperial: false, maxWidth: 100})); + } else { + $('head').append(''); + window.map.addControl(new L.Control.Scale({position: 'topleft', imperial: false, maxWidth: 200})); + } +}; + +var setup = window.plugin.scaleBar.setup; + +// PLUGIN END ////////////////////////////////////////////////////////// + + +setup.info = plugin_info; //add the script info data to the function as a property +if(!window.bootPlugins) window.bootPlugins = []; +window.bootPlugins.push(setup); +// if IITC has already booted, immediately run the 'setup' function +if(window.iitcLoaded && typeof setup === 'function') setup(); +} // wrapper end +// inject code into site context +var script = document.createElement('script'); +var info = {}; +if (typeof GM_info !== 'undefined' && GM_info && GM_info.script) info.script = { version: GM_info.script.version, name: GM_info.script.name, description: GM_info.script.description }; +script.appendChild(document.createTextNode('('+ wrapper +')('+JSON.stringify(info)+');')); +(document.body || document.head || document.documentElement).appendChild(script); + + diff --git a/mobile/assets/plugins/score-cycle-times.user.js b/mobile/assets/plugins/score-cycle-times.user.js new file mode 100644 index 000000000..49cdabbca --- /dev/null +++ b/mobile/assets/plugins/score-cycle-times.user.js @@ -0,0 +1,115 @@ +// ==UserScript== +// @id iitc-plugin-score-cycle-times@jonatkins +// @name IITC plugin: Show scoreboard cycle/checkpoint times +// @category Info +// @version 0.1.0.20181030.90244 +// @namespace https://github.com/jonatkins/ingress-intel-total-conversion +// @updateURL none +// @downloadURL none +// @description [mobile-2018-10-30-090244] Show the times used for the septicycle and checkpoints for regional scoreboards. +// @include https://*.ingress.com/intel* +// @include http://*.ingress.com/intel* +// @match https://*.ingress.com/intel* +// @match http://*.ingress.com/intel* +// @include https://*.ingress.com/mission/* +// @include http://*.ingress.com/mission/* +// @match https://*.ingress.com/mission/* +// @match http://*.ingress.com/mission/* +// @grant none +// ==/UserScript== + + +function wrapper(plugin_info) { +// ensure plugin framework is there, even if iitc is not yet loaded +if(typeof window.plugin !== 'function') window.plugin = function() {}; + +//PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! +//(leaving them in place might break the 'About IITC' page or break update checks) +plugin_info.buildName = 'mobile'; +plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.pluginId = 'score-cycle-times'; +//END PLUGIN AUTHORS NOTE + + + +// PLUGIN START //////////////////////////////////////////////////////// + + +// use own namespace for plugin +window.plugin.scoreCycleTimes = function() {}; + +window.plugin.scoreCycleTimes.CHECKPOINT = 5*60*60; //5 hours per checkpoint +window.plugin.scoreCycleTimes.CYCLE = 7*25*60*60; //7 25 hour 'days' per cycle + + +window.plugin.scoreCycleTimes.setup = function() { + + // add a div to the sidebar, and basic style + $('#sidebar').append('
    '); + $('#score_cycle_times_display').css({'color':'#ffce00'}); + + + window.plugin.scoreCycleTimes.update(); +}; + + + +window.plugin.scoreCycleTimes.update = function() { + + // checkpoint and cycle start times are based on a simple modulus of the timestamp + // no special epoch (other than the unix timestamp/javascript's 1970-01-01 00:00 UTC) is required + + // when regional scoreboards were introduced, the first cycle would have started at 2014-01-15 10:00 UTC - but it was + // a few checkpoints in when scores were first added + + var now = new Date().getTime(); + + var cycleStart = Math.floor(now / (window.plugin.scoreCycleTimes.CYCLE*1000)) * (window.plugin.scoreCycleTimes.CYCLE*1000); + var cycleEnd = cycleStart + window.plugin.scoreCycleTimes.CYCLE*1000; + + var checkpointStart = Math.floor(now / (window.plugin.scoreCycleTimes.CHECKPOINT*1000)) * (window.plugin.scoreCycleTimes.CHECKPOINT*1000); + var checkpointEnd = checkpointStart + window.plugin.scoreCycleTimes.CHECKPOINT*1000; + + + var formatRow = function(label,time) { + var timeStr = unixTimeToString(time,true); + timeStr = timeStr.replace(/:00$/,''); //FIXME: doesn't remove seconds from AM/PM formatted dates + + return ''+label+''+timeStr+''; + }; + + var html = '' + + formatRow('Cycle start', cycleStart) + + formatRow('Previous checkpoint', checkpointStart) + + formatRow('Next checkpoint', checkpointEnd) + + formatRow('Cycle end', cycleEnd) + + '
    '; + + $('#score_cycle_times_display').html(html); + + setTimeout ( window.plugin.scoreCycleTimes.update, checkpointEnd-now); +}; + + + + + +var setup = window.plugin.scoreCycleTimes.setup; + +// PLUGIN END ////////////////////////////////////////////////////////// + + +setup.info = plugin_info; //add the script info data to the function as a property +if(!window.bootPlugins) window.bootPlugins = []; +window.bootPlugins.push(setup); +// if IITC has already booted, immediately run the 'setup' function +if(window.iitcLoaded && typeof setup === 'function') setup(); +} // wrapper end +// inject code into site context +var script = document.createElement('script'); +var info = {}; +if (typeof GM_info !== 'undefined' && GM_info && GM_info.script) info.script = { version: GM_info.script.version, name: GM_info.script.name, description: GM_info.script.description }; +script.appendChild(document.createTextNode('('+ wrapper +')('+JSON.stringify(info)+');')); +(document.body || document.head || document.documentElement).appendChild(script); + + diff --git a/mobile/assets/plugins/scoreboard.user.js b/mobile/assets/plugins/scoreboard.user.js new file mode 100644 index 000000000..6a325dc8a --- /dev/null +++ b/mobile/assets/plugins/scoreboard.user.js @@ -0,0 +1,317 @@ +// ==UserScript== +// @id iitc-plugin-scoreboard@vita10gy +// @name IITC plugin: show a localized scoreboard. +// @version 0.2.0.20181030.90244 +// @category Info +// @namespace https://github.com/jonatkins/ingress-intel-total-conversion +// @updateURL none +// @downloadURL none +// @description [mobile-2018-10-30-090244] Display a scoreboard about all visible portals with statistics about both teams,like average portal level,link & field counts etc. +// @include https://*.ingress.com/intel* +// @include http://*.ingress.com/intel* +// @match https://*.ingress.com/intel* +// @match http://*.ingress.com/intel* +// @include https://*.ingress.com/mission/* +// @include http://*.ingress.com/mission/* +// @match https://*.ingress.com/mission/* +// @match http://*.ingress.com/mission/* +// @grant none +// ==/UserScript== + + + +function wrapper(plugin_info) { +// ensure plugin framework is there, even if iitc is not yet loaded +if(typeof window.plugin !== 'function') window.plugin = function() {}; + +//PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! +//(leaving them in place might break the 'About IITC' page or break update checks) +plugin_info.buildName = 'mobile'; +plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.pluginId = 'scoreboard'; +//END PLUGIN AUTHORS NOTE + + + // PLUGIN START // + + // use own namespace for plugin + window.plugin.scoreboard = function() {}; + + + + + + //gets data of all the visible portals on the screen + window.plugin.scoreboard.getPortals = function() { + + var retval=false; + + var displayBounds = map.getBounds(); + + + window.plugin.scoreboard.enlP = 0; + window.plugin.scoreboard.resP = 0; + window.plugin.scoreboard.enlEightLevelP = 0; + window.plugin.scoreboard.resEightLevelP = 0; + window.plugin.scoreboard.enlPorLevels = 0; + window.plugin.scoreboard.resPorLevels = 0; + window.plugin.scoreboard.maxEnl=0; + window.plugin.scoreboard.maxRes=0; + window.plugin.scoreboard.healthEnl = 0; + window.plugin.scoreboard.healthRes = 0; + + + //get all portals on screen + $.each(window.portals, function(i, portal) { + // eliminate offscreen portals (selected, and in padding) + if(!displayBounds.contains(portal.getLatLng())) return true; + //if there are any portals return true + retval=true; + + //variable that contains portal data + var d = portal.options.data; + + //variable that contains each portal's team value + var teamN = portal.options.team; + + switch (teamN) { + case TEAM_RES: //if the portal is captured by the resistance,increase each counter's value for resistance counters + window.plugin.scoreboard.healthRes += d.health; + window.plugin.scoreboard.resP++; + window.plugin.scoreboard.resPorLevels = window.plugin.scoreboard.resPorLevels + portal.options.level; + if(portal.options.level===8){window.plugin.scoreboard.resEightLevelP++;} + if(portal.options.level>window.plugin.scoreboard.maxRes){window.plugin.scoreboard.maxRes = portal.options.level;} + break; + case TEAM_ENL: //if the portal is captured by the enlightened,increase each counter's value for enlightened counters + window.plugin.scoreboard.healthEnl += d.health; + window.plugin.scoreboard.enlP++; + window.plugin.scoreboard.enlPorLevels = window.plugin.scoreboard.enlPorLevels + portal.options.level; + if(portal.options.level===8){window.plugin.scoreboard.enlEightLevelP++;} + if(portal.options.level>window.plugin.scoreboard.maxEnl){window.plugin.scoreboard.maxEnl = portal.options.level;} + break; + } + + + + + + + }); + + return retval; + } + + // The final function that displays the scoreboard by calling the portalTable function + window.plugin.scoreboard.displayScoreboard = function() { + var html = ''; + + // If there are not portals on screen,display "Nothing to show!" + if (window.plugin.scoreboard.getPortals()) { + html += window.plugin.scoreboard.portalTable(); + } else { + html = '
    Nothing to show!
    '; + }; + + if(window.useAndroidPanes()) { + $('
    ' + html + '
    ').appendTo(document.body); + } else { + dialog({ + html: '
    ' + html + '
    ', + dialogClass: 'ui-dialog-scoreboard', + title: 'Scoreboard', + id: 'Scoreboard', + width: 700 + }); + } + } + + + + //---- function that gets all visible enlightened links on screen + window.plugin.scoreboard.getEnlLinks = function() { + var displayBounds = map.getBounds(); + window.plugin.scoreboard.enlL=0; + // now every link that starts/ends at a point on screen + $.each(window.links, function(guid, link) { + // only consider links that start/end on-screen + var points = link.getLatLngs(); + if (displayBounds.contains(points[0]) || displayBounds.contains(points[1])) { + if (link.options.team == TEAM_ENL) { + window.plugin.scoreboard.enlL++; + } + } + }); + return window.plugin.scoreboard.enlL; + } + + + //----function that gets all visible resistance links on screen + window.plugin.scoreboard.getResLinks = function() { + var displayBounds = map.getBounds(); + window.plugin.scoreboard.resL=0; + // now every link that starts/ends at a point on screen + $.each(window.links, function(guid, link) { + // only consider links that start/end on-screen + var points = link.getLatLngs(); + if (displayBounds.contains(points[0]) || displayBounds.contains(points[1])) {// boroume na kanoume ta 2 if ena + if (link.options.team == TEAM_RES) { + window.plugin.scoreboard.resL++; + } + } + }); + return window.plugin.scoreboard.resL; + } + + + + + + //----function that gets all visible enlightened fields on screen + window.plugin.scoreboard.getEnlFields = function() { + var displayBounds = map.getBounds(); + window.plugin.scoreboard.enlF=0; + // and now all fields that have a vertex on screen + $.each(window.fields, function(guid, field) { + // only consider fields with at least one vertex on screen + var points = field.getLatLngs(); + if (displayBounds.contains(points[0]) || displayBounds.contains(points[1]) || displayBounds.contains(points[2])) { + if (field.options.team == TEAM_ENL) { + window.plugin.scoreboard.enlF++; + } + } + }); + return window.plugin.scoreboard.enlF; + } + + + + //----function that gets all visible resistance fields on screen + window.plugin.scoreboard.getResFields = function() { + var displayBounds = map.getBounds(); + window.plugin.scoreboard.resF=0; + // and now all fields that have a vertex on screen + $.each(window.fields, function(guid, field) { + // only consider fields with at least one vertex on screen + var points = field.getLatLngs(); + if (displayBounds.contains(points[0]) || displayBounds.contains(points[1]) || displayBounds.contains(points[2])) { + if (field.options.team == TEAM_RES) { + window.plugin.scoreboard.resF++; + } + } + }); + return window.plugin.scoreboard.resF; + } + + + + // A function that creates the html code for the scoreboard table + window.plugin.scoreboard.portalTable = function() { + + + // html variable declaration + var html = ""; + // Create the header + html += '' + + '' + + '' + + '' + + '' + + '\n'; + + // if blocks to avoid division by zero + if(window.plugin.scoreboard.enlP!=0){ + var avgEnl = window.plugin.scoreboard.enlPorLevels/window.plugin.scoreboard.enlP; + avgEnl = avgEnl.toFixed(1); + var avgHealthEnl = window.plugin.scoreboard.healthEnl/window.plugin.scoreboard.enlP; + avgHealthEnl = avgHealthEnl.toFixed(1) } + else{ + var avgEnl = '-'; + var avgHealthEnl = '0'; + } + + if(window.plugin.scoreboard.resP!=0){ + var avgRes = window.plugin.scoreboard.resPorLevels/window.plugin.scoreboard.resP; + avgRes = avgRes.toFixed(1); + var avgHealthRes = window.plugin.scoreboard.healthRes/window.plugin.scoreboard.resP; + avgHealthRes = avgHealthRes.toFixed(1); + } + else{ + var avgRes = '-'; + var avgHealthRes = '0'; + } + + + // Get field-link count and assign them to variables + var enlCountOfLinks= window.plugin.scoreboard.getEnlLinks(); + var resCountOfLinks= window.plugin.scoreboard.getResLinks(); + var enlCountOfFields= window.plugin.scoreboard.getEnlFields(); + var resCountOfFields= window.plugin.scoreboard.getResFields(); + + // Creation of the html code + html += ''+''+'' + +''+''+'' + +''+''+'' + +''+''+'' + +''+''+'' + +''+''+'' + +''+''+''; + + + + html += '
    MetricsEnlightenedResistance
    Number of Portals' + +window.plugin.scoreboard.enlP+''+window.plugin.scoreboard.resP+'
    Average Portal Level' + +avgEnl+''+avgRes+'
    Number of Level 8 Portals' + +window.plugin.scoreboard.enlEightLevelP+''+window.plugin.scoreboard.resEightLevelP+'
    Max Portal Level' + +window.plugin.scoreboard.maxEnl+''+window.plugin.scoreboard.maxRes+'
    Number of Links' + +enlCountOfLinks+''+resCountOfLinks+'
    Number of Fields' + +enlCountOfFields+''+resCountOfFields+'
    Average portal Health' + +avgHealthEnl+'%'+avgHealthRes+'%
    '; + + html += '
    Zoom in for a more accurate scoreboard!
    '; + + return html; + } + + + + var setup = function() { + if(window.useAndroidPanes()) { // use android panes,texture and style + android.addPane("plugin-Scoreboard", "Scoreboard", "ic_action_paste"); + addHook("paneChanged", window.plugin.scoreboard.onPaneChanged); + } else { + $('#toolbox').append(' Scoreboard'); + } + + $('head').append(''); + } + + + // PLUGIN END ////////////////////////////////////////////////////////// + +setup.info = plugin_info; //add the script info data to the function as a property +if(!window.bootPlugins) window.bootPlugins = []; +window.bootPlugins.push(setup); +// if IITC has already booted, immediately run the 'setup' function +if(window.iitcLoaded && typeof setup === 'function') setup(); +} // wrapper end +// inject code into site context +var script = document.createElement('script'); +var info = {}; +if (typeof GM_info !== 'undefined' && GM_info && GM_info.script) info.script = { version: GM_info.script.version, name: GM_info.script.name, description: GM_info.script.description }; +script.appendChild(document.createTextNode('('+ wrapper +')('+JSON.stringify(info)+');')); +(document.body || document.head || document.documentElement).appendChild(script); + + + + \ No newline at end of file diff --git a/mobile/assets/plugins/show-address.user.js b/mobile/assets/plugins/show-address.user.js new file mode 100644 index 000000000..a5521079c --- /dev/null +++ b/mobile/assets/plugins/show-address.user.js @@ -0,0 +1,20 @@ +// ==UserScript== +// @id iitc-plugin-show-address@vita10gy +// @name IITC plugin: show portal address in sidebar +// @category Deleted +// @version 0.3.0.20181030.90244 +// @namespace https://github.com/jonatkins/ingress-intel-total-conversion +// @updateURL none +// @downloadURL none +// @description [mobile-2018-10-30-090244] Address no longer available, as of Niantic changes 2014-05-23 +// @include https://*.ingress.com/intel* +// @include http://*.ingress.com/intel* +// @match https://*.ingress.com/intel* +// @match http://*.ingress.com/intel* +// @include https://*.ingress.com/mission/* +// @include http://*.ingress.com/mission/* +// @match https://*.ingress.com/mission/* +// @match http://*.ingress.com/mission/* +// @grant none +// ==/UserScript== + diff --git a/mobile/assets/plugins/show-less-portals-zoomed-out.user.js b/mobile/assets/plugins/show-less-portals-zoomed-out.user.js new file mode 100644 index 000000000..0620c9372 --- /dev/null +++ b/mobile/assets/plugins/show-less-portals-zoomed-out.user.js @@ -0,0 +1,67 @@ +// ==UserScript== +// @id iitc-plugin-show-less-portals@jonatkins +// @name IITC plugin: Show less portals when zoomed out +// @category Tweaks +// @version 0.3.0.20181030.90244 +// @namespace https://github.com/jonatkins/ingress-intel-total-conversion +// @updateURL none +// @downloadURL none +// @description [mobile-2018-10-30-090244] Vastly reduce the detail level when zoomed out to level 11 or less (L4+ portals), to significantly reduce data usage when viewing large areas. +// @include https://*.ingress.com/intel* +// @include http://*.ingress.com/intel* +// @match https://*.ingress.com/intel* +// @match http://*.ingress.com/intel* +// @include https://*.ingress.com/mission/* +// @include http://*.ingress.com/mission/* +// @match https://*.ingress.com/mission/* +// @match http://*.ingress.com/mission/* +// @grant none +// ==/UserScript== + + +function wrapper(plugin_info) { +// ensure plugin framework is there, even if iitc is not yet loaded +if(typeof window.plugin !== 'function') window.plugin = function() {}; + +//PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! +//(leaving them in place might break the 'About IITC' page or break update checks) +plugin_info.buildName = 'mobile'; +plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.pluginId = 'show-less-portals-zoomed-out'; +//END PLUGIN AUTHORS NOTE + + + +// PLUGIN START //////////////////////////////////////////////////////// + + +// use own namespace for plugin +window.plugin.showLessPortalsZoomedOut = function() {}; + +window.plugin.showLessPortalsZoomedOut.setup = function() { + +// NOTE: the logic required is closely tied to the IITC+stock map detail level code - so the logic is moved there now +// and just enabled by this flag + window.CONFIG_ZOOM_SHOW_LESS_PORTALS_ZOOMED_OUT=true; + +}; + +var setup = window.plugin.showLessPortalsZoomedOut.setup; + +// PLUGIN END ////////////////////////////////////////////////////////// + + +setup.info = plugin_info; //add the script info data to the function as a property +if(!window.bootPlugins) window.bootPlugins = []; +window.bootPlugins.push(setup); +// if IITC has already booted, immediately run the 'setup' function +if(window.iitcLoaded && typeof setup === 'function') setup(); +} // wrapper end +// inject code into site context +var script = document.createElement('script'); +var info = {}; +if (typeof GM_info !== 'undefined' && GM_info && GM_info.script) info.script = { version: GM_info.script.version, name: GM_info.script.name, description: GM_info.script.description }; +script.appendChild(document.createTextNode('('+ wrapper +')('+JSON.stringify(info)+');')); +(document.body || document.head || document.documentElement).appendChild(script); + + diff --git a/mobile/assets/plugins/show-linked-portals.user.js b/mobile/assets/plugins/show-linked-portals.user.js new file mode 100644 index 000000000..25d28289d --- /dev/null +++ b/mobile/assets/plugins/show-linked-portals.user.js @@ -0,0 +1,196 @@ +// ==UserScript== +// @id iitc-plugin-show-linked-portals@fstopienski +// @name IITC plugin: Show linked portals +// @category Portal Info +// @version 0.3.1.20181030.90244 +// @namespace https://github.com/jonatkins/ingress-intel-total-conversion +// @updateURL none +// @downloadURL none +// @description [mobile-2018-10-30-090244] Try to show the linked portals (image, name and link direction) in portal detail view and jump to linked portal on click. Some details may not be available if the linked portal is not in the current view. +// @include https://*.ingress.com/intel* +// @include http://*.ingress.com/intel* +// @match https://*.ingress.com/intel* +// @match http://*.ingress.com/intel* +// @include https://*.ingress.com/mission/* +// @include http://*.ingress.com/mission/* +// @match https://*.ingress.com/mission/* +// @match http://*.ingress.com/mission/* +// @grant none +// ==/UserScript== + + +function wrapper(plugin_info) { +// ensure plugin framework is there, even if iitc is not yet loaded +if(typeof window.plugin !== 'function') window.plugin = function() {}; + +//PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! +//(leaving them in place might break the 'About IITC' page or break update checks) +plugin_info.buildName = 'mobile'; +plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.pluginId = 'show-linked-portals'; +//END PLUGIN AUTHORS NOTE + + + +// PLUGIN START //////////////////////////////////////////////////////// + +// use own namespace for plugin +window.plugin.showLinkedPortal = function () { +}; + +plugin.showLinkedPortal.previewOptions = { + color: "#C33", + opacity: 1, + weight: 5, + fill: false, + dashArray: "1,6", + radius: 18, +}; + +window.plugin.showLinkedPortal.portalDetail = function (data) { + plugin.showLinkedPortal.removePreview(); + + var portalLinks = getPortalLinks(data.guid); + var length = portalLinks.in.length + portalLinks.out.length + + var c = 1; + + $('
    ',{id:'showLinkedPortalContainer'}).appendTo('#portaldetails'); + + function renderLinkedPortal(linkGuid) { + if(c > 16) return; + + var key = this; // passed by Array.prototype.forEach + var link = window.links[linkGuid].options.data; + var guid = link[key + 'Guid']; + var lat = link[key + 'LatE6']/1E6; + var lng = link[key + 'LngE6']/1E6; + + var length = L.latLng(link.oLatE6/1E6, link.oLngE6/1E6).distanceTo([link.dLatE6/1E6, link.dLngE6/1E6]); + var lengthFull = digits(Math.round(length)) + 'm'; + var lengthShort = length < 100000 ? lengthFull : digits(Math.round(length/1000)) + 'km' + + var div = $('
    ').addClass('showLinkedPortalLink showLinkedPortalLink' + c + (key=='d' ? ' outgoing' : ' incoming')); + + var title; + + var data = (portals[guid] && portals[guid].options.data) || portalDetail.get(guid) || null; + if(data && data.title) { + title = data.title; + div.append($('').attr({ + 'src': fixPortalImageUrl(data.image), + 'class': 'minImg', + 'alt': title, + })); + } else { + title = 'Go to portal'; + div + .addClass('outOfRange') + .append($('') + .html('Portal not loaded.
    ' + lengthShort)); + } + + div + .attr({ + 'data-guid': guid, + 'data-lat': lat, + 'data-lng': lng, + 'title': $('
    ') + .append($('').text(title)) + .append($('
    ')) + .append($('').text(key=='d' ? '↴ outgoing link' : '↳ incoming link')) + .append($('
    ')) + .append($('').html(lengthFull)) + .html(), + }) + .appendTo('#showLinkedPortalContainer'); + + c++; + } + + portalLinks.out.forEach(renderLinkedPortal, 'd'); + portalLinks.in.forEach(renderLinkedPortal, 'o'); + + if(length > 16) { + $('
    ') + .addClass('showLinkedPortalLink showLinkedPortalOverflow') + .text(length-16 + ' more') + .appendTo('#showLinkedPortalContainer'); + } + + $('#showLinkedPortalContainer') + .on('click', '.showLinkedPortalLink', plugin.showLinkedPortal.onLinkedPortalClick) + .on('mouseover', '.showLinkedPortalLink', plugin.showLinkedPortal.onLinkedPortalMouseOver) + .on('mouseout', '.showLinkedPortalLink', plugin.showLinkedPortal.onLinkedPortalMouseOut); +} + +plugin.showLinkedPortal.onLinkedPortalClick = function() { + plugin.showLinkedPortal.removePreview(); + + var element = $(this); + var guid = element.attr('data-guid'); + var lat = element.attr('data-lat'); + var lng = element.attr('data-lng'); + + if(!guid) return; // overflow + + var position = L.latLng(lat, lng); + if(!map.getBounds().contains(position)) map.setView(position); + if(portals[guid]) + renderPortalDetails(guid); + else + zoomToAndShowPortal(guid, position); +}; + +plugin.showLinkedPortal.onLinkedPortalMouseOver = function() { + plugin.showLinkedPortal.removePreview(); + + var element = $(this); + var lat = element.attr('data-lat'); + var lng = element.attr('data-lng'); + + if(!(lat && lng)) return; // overflow + + var remote = L.latLng(lat, lng); + var local = portals[selectedPortal].getLatLng(); + + plugin.showLinkedPortal.preview = L.layerGroup().addTo(map); + + L.circleMarker(remote, plugin.showLinkedPortal.previewOptions) + .addTo(plugin.showLinkedPortal.preview); + + L.geodesicPolyline([local, remote], plugin.showLinkedPortal.previewOptions) + .addTo(plugin.showLinkedPortal.preview); +}; + +plugin.showLinkedPortal.onLinkedPortalMouseOut = function() { + plugin.showLinkedPortal.removePreview(); +}; + +plugin.showLinkedPortal.removePreview = function() { + if(plugin.showLinkedPortal.preview) + map.removeLayer(plugin.showLinkedPortal.preview); + plugin.showLinkedPortal.preview = null; +}; + +var setup = function () { + window.addHook('portalDetailsUpdated', window.plugin.showLinkedPortal.portalDetail); + $(''); +}; + +var setup = window.plugin.zoomSlider.setup; + +// PLUGIN END ////////////////////////////////////////////////////////// + + +setup.info = plugin_info; //add the script info data to the function as a property +if(!window.bootPlugins) window.bootPlugins = []; +window.bootPlugins.push(setup); +// if IITC has already booted, immediately run the 'setup' function +if(window.iitcLoaded && typeof setup === 'function') setup(); +} // wrapper end +// inject code into site context +var script = document.createElement('script'); +var info = {}; +if (typeof GM_info !== 'undefined' && GM_info && GM_info.script) info.script = { version: GM_info.script.version, name: GM_info.script.name, description: GM_info.script.description }; +script.appendChild(document.createTextNode('('+ wrapper +')('+JSON.stringify(info)+');')); +(document.body || document.head || document.documentElement).appendChild(script); + + diff --git a/mobile/assets/total-conversion-build.user.js b/mobile/assets/total-conversion-build.user.js new file mode 100644 index 000000000..6180cfa35 --- /dev/null +++ b/mobile/assets/total-conversion-build.user.js @@ -0,0 +1,17993 @@ +// ==UserScript== +// @id ingress-intel-total-conversion@jonatkins +// @name IITC: Ingress intel map total conversion +// @version 0.26.0.20181030.90244 +// @namespace https://github.com/jonatkins/ingress-intel-total-conversion +// @updateURL none +// @downloadURL none +// @description [mobile-2018-10-30-090244] Total conversion for the ingress intel map. +// @include https://*.ingress.com/intel* +// @include http://*.ingress.com/intel* +// @match https://*.ingress.com/intel* +// @match http://*.ingress.com/intel* +// @include https://*.ingress.com/mission/* +// @include http://*.ingress.com/mission/* +// @match https://*.ingress.com/mission/* +// @match http://*.ingress.com/mission/* +// @grant none +// ==/UserScript== + + +// REPLACE ORIG SITE /////////////////////////////////////////////////// +if(document.getElementsByTagName('html')[0].getAttribute('itemscope') != null) + throw('Ingress Intel Website is down, not a userscript issue.'); +window.iitcBuildDate = '2018-10-30-090244'; + +// disable vanilla JS +window.onload = function() {}; +document.body.onload = function() {}; + + +//originally code here parsed the '; + var gmaps = 'Google Maps'; + var bingmaps = 'Bing Maps'; + var osm = 'OpenStreetMap'; + var latLng = '<' + lat + ',' + lng +'>'; + dialog({ + html: '
    ' + qrcode + script + gmaps + '; ' + bingmaps + '; ' + osm + '
    ' + latLng + '
    ', + title: name, + id: 'poslinks' + }); + } +} + +window.isTouchDevice = function() { + return 'ontouchstart' in window // works on most browsers + || 'onmsgesturechange' in window; // works on ie10 +}; + +window.androidCopy = function(text) { + if(typeof android === 'undefined' || !android || !android.copy) + return true; // i.e. execute other actions + else + android.copy(text); + return false; +} + +window.androidPermalink = function() { + if(typeof android === 'undefined' || !android || !android.intentPosLink) + return true; // i.e. execute other actions + + var center = map.getCenter(); + android.intentPosLink(center.lat, center.lng, map.getZoom(), "Selected map view", false); + return false; +} + + + +window.getMinPortalLevel = function() { + var z = map.getZoom(); + z = getDataZoomForMapZoom(z); + return getMapZoomTileParameters(z).level; +} + +// returns number of pixels left to scroll down before reaching the +// bottom. Works similar to the native scrollTop function. +window.scrollBottom = function(elm) { + if(typeof elm === 'string') elm = $(elm); + return elm.get(0).scrollHeight - elm.innerHeight() - elm.scrollTop(); +} + +window.zoomToAndShowPortal = function(guid, latlng) { + map.setView(latlng, 17); + // if the data is available, render it immediately. Otherwise defer + // until it becomes available. + if(window.portals[guid]) + renderPortalDetails(guid); + else + urlPortal = guid; +} + +window.selectPortalByLatLng = function(lat, lng) { + if(lng === undefined && lat instanceof Array) { + lng = lat[1]; + lat = lat[0]; + } else if(lng === undefined && lat instanceof L.LatLng) { + lng = lat.lng; + lat = lat.lat; + } + for(var guid in window.portals) { + var latlng = window.portals[guid].getLatLng(); + if(latlng.lat == lat && latlng.lng == lng) { + renderPortalDetails(guid); + return; + } + } + + // not currently visible + urlPortalLL = [lat, lng]; + map.setView(urlPortalLL, 17); +}; + +String.prototype.capitalize = function() { + return this.charAt(0).toUpperCase() + this.slice(1).toLowerCase(); +} + +// http://stackoverflow.com/a/646643/1684530 by Bergi and CMS +if (typeof String.prototype.startsWith !== 'function') { + String.prototype.startsWith = function (str){ + return this.slice(0, str.length) === str; + }; +} + +// escape a javascript string, so quotes and backslashes are escaped with a backslash +// (for strings passed as parameters to html onclick="..." for example) +window.escapeJavascriptString = function(str) { + return (str+'').replace(/[\\"']/g,'\\$&'); +} + +//escape special characters, such as tags +window.escapeHtmlSpecialChars = function(str) { + var div = document.createElement(div); + var text = document.createTextNode(str); + div.appendChild(text); + return div.innerHTML; +} + +window.prettyEnergy = function(nrg) { + return nrg> 1000 ? Math.round(nrg/1000) + ' k': nrg; +} + +window.setPermaLink = function(elm) { + var c = map.getCenter(); + var lat = Math.round(c.lat*1E6)/1E6; + var lng = Math.round(c.lng*1E6)/1E6; + var qry = 'll='+lat+','+lng+'&z=' + map.getZoom(); + $(elm).attr('href', '/intel?' + qry); +} + +window.uniqueArray = function(arr) { + return $.grep(arr, function(v, i) { + return $.inArray(v, arr) === i; + }); +} + +window.genFourColumnTable = function(blocks) { + var t = $.map(blocks, function(detail, index) { + if(!detail) return ''; + var title = detail[2] ? ' title="'+escapeHtmlSpecialChars(detail[2]) + '"' : ''; + if(index % 2 === 0) + return ''+detail[1]+''+detail[0]+''; + else + return ' '+detail[0]+''+detail[1]+''; + }).join(''); + if(t.length % 2 === 1) t + ''; + return t; +} + + +// converts given text with newlines (\n) and tabs (\t) to a HTML +// table automatically. +window.convertTextToTableMagic = function(text) { + // check if it should be converted to a table + if(!text.match(/\t/)) return text.replace(/\n/g, '
    '); + + var data = []; + var columnCount = 0; + + // parse data + var rows = text.split('\n'); + $.each(rows, function(i, row) { + data[i] = row.split('\t'); + if(data[i].length > columnCount) columnCount = data[i].length; + }); + + // build the table + var table = ''; + $.each(data, function(i, row) { + table += ''; + $.each(data[i], function(k, cell) { + var attributes = ''; + if(k === 0 && data[i].length < columnCount) { + attributes = ' colspan="'+(columnCount - data[i].length + 1)+'"'; + } + table += ''+cell+''; + }); + table += ''; + }); + table += '
    '; + return table; +} + +// Given 3 sets of points in an array[3]{lat, lng} returns the area of the triangle +window.calcTriArea = function(p) { + return Math.abs((p[0].lat*(p[1].lng-p[2].lng)+p[1].lat*(p[2].lng-p[0].lng)+p[2].lat*(p[0].lng-p[1].lng))/2); +} + +// Update layerGroups display status to window.overlayStatus and localStorage 'ingress.intelmap.layergroupdisplayed' +window.updateDisplayedLayerGroup = function(name, display) { + overlayStatus[name] = display; + localStorage['ingress.intelmap.layergroupdisplayed'] = JSON.stringify(overlayStatus); +} + +// Read layerGroup status from window.overlayStatus if it was added to map, +// read from cookie if it has not added to map yet. +// return 'defaultDisplay' if both overlayStatus and cookie didn't have the record +window.isLayerGroupDisplayed = function(name, defaultDisplay) { + if(typeof(overlayStatus[name]) !== 'undefined') return overlayStatus[name]; + + convertCookieToLocalStorage('ingress.intelmap.layergroupdisplayed'); + var layersJSON = localStorage['ingress.intelmap.layergroupdisplayed']; + if(!layersJSON) return defaultDisplay; + + var layers = JSON.parse(layersJSON); + // keep latest overlayStatus + overlayStatus = $.extend(layers, overlayStatus); + if(typeof(overlayStatus[name]) === 'undefined') return defaultDisplay; + return overlayStatus[name]; +} + +window.addLayerGroup = function(name, layerGroup, defaultDisplay) { + if (defaultDisplay === undefined) defaultDisplay = true; + + if(isLayerGroupDisplayed(name, defaultDisplay)) map.addLayer(layerGroup); + layerChooser.addOverlay(layerGroup, name); +} + +window.removeLayerGroup = function(layerGroup) { + if(!layerChooser._layers[layerGroup._leaflet_id]) throw('Layer was not found'); + // removing the layer will set it's default visibility to false (store if layer gets added again) + var name = layerChooser._layers[layerGroup._leaflet_id].name; + var enabled = isLayerGroupDisplayed(name); + map.removeLayer(layerGroup); + layerChooser.removeLayer(layerGroup); + updateDisplayedLayerGroup(name, enabled); +}; + +window.clampLat = function(lat) { + // the map projection used does not handle above approx +- 85 degrees north/south of the equator + if (lat > 85.051128) + lat = 85.051128; + else if (lat < -85.051128) + lat = -85.051128; + return lat; +} + +window.clampLng = function(lng) { + if (lng > 179.999999) + lng = 179.999999; + else if (lng < -180.0) + lng = -180.0; + return lng; +} + + +window.clampLatLng = function(latlng) { + return new L.LatLng ( clampLat(latlng.lat), clampLng(latlng.lng) ); +} + +window.clampLatLngBounds = function(bounds) { + return new L.LatLngBounds ( clampLatLng(bounds.getSouthWest()), clampLatLng(bounds.getNorthEast()) ); +} + +window.getGenericMarkerSvg = function(color) { + var markerTemplate = '\n\n\n \n \n \n\n \n\n'; + + return markerTemplate.replace(/%COLOR%/g, color); +} + +window.getGenericMarkerIcon = function(color,className) { + return L.divIcon({ + iconSize: new L.Point(25, 41), + iconAnchor: new L.Point(12, 41), + html: getGenericMarkerSvg(color), + className: className || 'leaflet-iitc-divicon-generic-marker' + }); +} + +window.createGenericMarker = function(ll,color,options) { + options = options || {}; + + var markerOpt = $.extend({ + icon: getGenericMarkerIcon(color || '#a24ac3') + }, options); + + return L.marker(ll, markerOpt); +} + + + +// Fix Leaflet: handle touchcancel events in Draggable +L.Draggable.prototype._onDownOrig = L.Draggable.prototype._onDown; +L.Draggable.prototype._onDown = function(e) { + L.Draggable.prototype._onDownOrig.apply(this, arguments); + + if(e.type === "touchstart") { + L.DomEvent.on(document, "touchcancel", this._onUp, this); + } +} + + + + +} // end of wrapper + +// inject code into site context +var script = document.createElement('script'); +var info = { buildName: 'mobile', dateTimeVersion: '20181030.90244' }; +if (this.GM_info && this.GM_info.script) info.script = { version: GM_info.script.version, name: GM_info.script.name, description: GM_info.script.description }; +script.appendChild(document.createTextNode('('+ wrapper +')('+JSON.stringify(info)+');')); +(document.body || document.head || document.documentElement).appendChild(script); diff --git a/mobile/assets/user-location.user.js b/mobile/assets/user-location.user.js new file mode 100644 index 000000000..f4f649ab5 --- /dev/null +++ b/mobile/assets/user-location.user.js @@ -0,0 +1,188 @@ +// ==UserScript== +// @id iitc-plugin-user-location@cradle +// @name IITC plugin: User Location +// @category Tweaks +// @version 0.2.0.20181030.90244 +// @namespace https://github.com/jonatkins/ingress-intel-total-conversion +// @updateURL none +// @downloadURL none +// @description [mobile-2018-10-30-090244] Show user location marker on map +// @include https://*.ingress.com/intel* +// @include http://*.ingress.com/intel* +// @match https://*.ingress.com/intel* +// @match http://*.ingress.com/intel* +// @include https://*.ingress.com/mission/* +// @include http://*.ingress.com/mission/* +// @match https://*.ingress.com/mission/* +// @match http://*.ingress.com/mission/* +// @grant none +// ==/UserScript== + + +function wrapper(plugin_info) { +// ensure plugin framework is there, even if iitc is not yet loaded +if(typeof window.plugin !== 'function') window.plugin = function() {}; + +//PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! +//(leaving them in place might break the 'About IITC' page or break update checks) +plugin_info.buildName = 'mobile'; +plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.pluginId = 'user-location'; +//END PLUGIN AUTHORS NOTE + + + +// PLUGIN START //////////////////////////////////////////////////////// + +window.plugin.userLocation = function() {}; + +window.plugin.userLocation.follow = false; + +window.plugin.userLocation.setup = function() { + $(' + + + + \ No newline at end of file diff --git a/mobile/iitcm/src/main/res/values/app_name.xml b/mobile/iitcm/src/main/res/values/app_name.xml new file mode 100644 index 000000000..0c3d4a790 --- /dev/null +++ b/mobile/iitcm/src/main/res/values/app_name.xml @@ -0,0 +1,4 @@ + + + IITC Mobile + diff --git a/mobile/iitcm/src/main/res/values/dimens.xml b/mobile/iitcm/src/main/res/values/dimens.xml new file mode 100644 index 000000000..d0a2d4268 --- /dev/null +++ b/mobile/iitcm/src/main/res/values/dimens.xml @@ -0,0 +1,18 @@ + + + + + 16dp + 16dp + 640dip + 400dip + 400dip + 200dip + + + 8dp + + + 36dp + + \ No newline at end of file diff --git a/mobile/iitcm/src/main/res/values/strings.xml b/mobile/iitcm/src/main/res/values/strings.xml new file mode 100644 index 000000000..14bf9a9d5 --- /dev/null +++ b/mobile/iitcm/src/main/res/values/strings.xml @@ -0,0 +1,257 @@ + + + + Toggle map visibility + Clear log + Run + IITC Mobile Settings + IITC Plugins + Share using… + Copy to clipboard + Save to file + Settings + Show navigation menu + Hide navigation menu + Print Version + Close + Downloading latest intel package… + + + + The page at \"%s\" says: + + JavaScript + + Confirm Navigation + + Leave this Page + + Stay on this Page + + %s\n\nAre you sure you want to navigate away from this page? + + About IITC Mobile + + + Ingress Intel Total Conversion Mobile + Build Version: %1$s
    + IITC Version: %2$s
    +
    + by cradle, fkloft and + contributors

    + Icon by Giuseppe Lucido

    + IITC Mobile is an optimized mobile browser for the + Ingress Intel Total Conversion (IITC) userscript by breunigs. + After Niantic asked the main developer to shut down his github project, development + is continued on a fork of jonatkins. +

    Community:

    + • Visit the IITC website for new releases and the desktop version.
    + • Follow the IITC Google+ page + for release announcements.
    + • Join the IITC Google+ community + - a place to ask for help and discuss with other users. +

    Developers:

    + IITC on Github +

    IITC Licence:

    + Copyright © 2013 Stefan Breunig, Jon Atkins, Philipp Schäfer and others

    + + Permission to use, copy, modify, and/or distribute this software for + any purpose with or without fee is hereby granted, provided that the + above copyright notice and this permission notice appear in all + copies.

    + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL + WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE + AUTHORS BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA + OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + PERFORMANCE OF THIS SOFTWARE. + ]]> +
    + + How to use IITCm:

    + • Navigation: swipe from the left edge of your screen (or click the app icon) to evoke the Navigation Drawer. + Click the app icon again to return to the map.

    + • Layers/Highlights: swipe from the right edge of your screen (or click the layer-chooser icon in the ActionBar) + to evoke the Layer Drawer.

    + • You can quickly send the current portal link/permalink to another device if both devices support NFC (hold + both devices back-to-back and tap the screen to beam the map to the other device).

    + • You can add official plugins in the settings.

    + • For external plugins please have a look at the FAQ.]]> +
    + +
    + • tap and hold a portal for a second
    + • tap on the left half of the status bar]]> +
    + +
    + Some plugins (e.g. portals list and bookmarks) now appear in the navigation drawer for quick access.
    + They won\'t appear in the info pane any more.

    + Swipe from the left edge of your screen (or click the app icon) to seem them.]]> +
    + +
    + IITC Mobile is able to load external plugins too!

    + Add them by clicking the (+) icon at the top right. + The plugin files have to end with \'.user.js\' and are copied to %1$s
    ]]> +
    + + Share portal you can:
    + • send the portal link to other people
    + • view the selected portal\'s position in another app
    + • open the portal link in a webbrowser
    +
    + Hint: By selecting Google Maps (or any other installed navigation software), you can quickly navigate to the + selected portal.
    +
    + These hints also apply for the permalink.]]> +
    + + UI + Misc + Tweaks + IITC Plugins + Plugins extend/modify the IITC experience. Most plugins known from desktop IITC can be found here. + Available plugins + Display user location on map + Persistent zoom level + Don\'t change zoom level when locate button is pressed + Show zoom control + Shows +/- buttons even on multitouch capable devices. + Configure fullscreen mode + Which elements should be hidden in fullscreen mode. + Note: IITCm can still be controlled via the Navigation Drawers + Force desktop mode + Nice for tablets, looks awful on smartphones + Force https + Disabling may improve performance + Move tiles cache to external storage + Restart required! Write cache to sdCard. + External storage has to be mounted. + Press back button twice to exit + Avoids accidental exits + Advanced Settings + Developer options and advanced tweaks + Enable developer mode + If enabled, all IITC sources will be loaded from external storage of the Android device. + Please copy all sources from $IITC_folder/build/mobile/ to /sdcard/IITC_Mobile/dev/. + Disable Splash Screen + Fake User Agent + Let IITCm appear as a desktop browser for the intel site. + Note: If just want to use the desktop mode use the \'force desktop mode\' setting + Configure IITCm menu + Toggle visibility of IITCm menu entries + User plugin updates + Configure plugin update interval + How often IITCm should search for new plugin versions + Force plugin update + Update all enabled user plugins + Require secure updates + If enabled, only https updates are handled + + + System Notification Bar + IITC Action Bar + IITC Status Bar + System Navigation Bar + + + 2 + 4 + 8 + 16 + + + 2 + 4 + + + + @string/menu_search + @string/menu_locate + @string/menu_layer_chooser + @string/menu_toggle_fullscreen + @string/menu_reload + @string/menu_send_screenshot + @string/menu_clear_cookies + @string/menu_debug + + + @string/menu_search + @string/menu_locate + @string/menu_layer_chooser + @string/menu_toggle_fullscreen + @string/menu_reload + @string/menu_send_screenshot + + + + Don\'t show user position + Show user position on map + Show user position and orientation on map + + + 0 + 1 + 2 + + + + Disable + 1 day + 2 days + 1 week + 2 weeks + + + + 0 + 1 + 2 + 7 + 14 + + + Reload IITC + Fullscreen + Layer Chooser + Get Location + Clear cookies + Search + Debug + Send screenshot + Add external plugins + Copy + Delete + Choose account to login + Login failed. + Search locations + Address could not be opened + Copied to clipboard… + Do not show again + + Sign in to %1$s %2$s" + Username + Password + Sign in + + Locate + Share + Intel + + Highlighter + Base Layer + Overlay Layers + + Install external plugin? + +
    %1$s

    + Be careful: Javascript from external sources may contain harmful code (spyware etc.)!

    + Are you sure you want to proceed?]]> +
    + +
    diff --git a/mobile/iitcm/src/main/res/values/styles.xml b/mobile/iitcm/src/main/res/values/styles.xml new file mode 100644 index 000000000..7a892ff12 --- /dev/null +++ b/mobile/iitcm/src/main/res/values/styles.xml @@ -0,0 +1,58 @@ + + + + + + + + + #ff0e3d4e + #ff0b303e + + + + + + + + + + + + + + + + + + + #990e3d4e + + \ No newline at end of file diff --git a/mobile/iitcm/src/main/res/xml/pluginspreference.xml b/mobile/iitcm/src/main/res/xml/pluginspreference.xml new file mode 100644 index 000000000..5ab93da9e --- /dev/null +++ b/mobile/iitcm/src/main/res/xml/pluginspreference.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/mobile/iitcm/src/main/res/xml/preferences.xml b/mobile/iitcm/src/main/res/xml/preferences.xml new file mode 100644 index 000000000..f6d2082c2 --- /dev/null +++ b/mobile/iitcm/src/main/res/xml/preferences.xml @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mobile/iitcm/src/main/res/xml/searchable.xml b/mobile/iitcm/src/main/res/xml/searchable.xml new file mode 100644 index 000000000..384c47804 --- /dev/null +++ b/mobile/iitcm/src/main/res/xml/searchable.xml @@ -0,0 +1,7 @@ + + diff --git a/mobile/iitcm/src/testBuild/res/values/app_name.xml b/mobile/iitcm/src/testBuild/res/values/app_name.xml new file mode 100644 index 000000000..0b627422c --- /dev/null +++ b/mobile/iitcm/src/testBuild/res/values/app_name.xml @@ -0,0 +1,4 @@ + + + IITCm Test + diff --git a/mobile/libs/android-support-v4.jar b/mobile/libs/android-support-v4.jar deleted file mode 100644 index cf12d2839dc5ffe618b0233f0c30e681e8b9b0f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 556198 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

    I-vxNg9#R{H|2IQYz-L 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�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

    %-;htggoJsE4z=kY_wUkKP#dr`R*fgX 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 z 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%0AE24Q2KLTDEOET78(M9~)VXAT0 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 F{2yd Date: Wed, 31 Oct 2018 20:40:03 +0300 Subject: [PATCH 2/9] Restoring original SDK 14 as minimal --- mobile/iitcm/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mobile/iitcm/build.gradle b/mobile/iitcm/build.gradle index f7fe5efbd..7e8b01293 100644 --- a/mobile/iitcm/build.gradle +++ b/mobile/iitcm/build.gradle @@ -23,7 +23,7 @@ android { buildToolsVersion '28.0.3' defaultConfig { - minSdkVersion 16 + minSdkVersion 14 targetSdkVersion 28 versionCode = getVersionCode() versionName "0.26-prime" From 445ed30cf4315a1a588d2e98daa5dd0ada8c0ea6 Mon Sep 17 00:00:00 2001 From: Mike Lambert Date: Thu, 1 Nov 2018 08:54:57 +0300 Subject: [PATCH 3/9] Merged upstream changes --- mobile/.idea/.name | 1 - mobile/.idea/compiler.xml | 8 -------- mobile/.idea/copyright/profiles_settings.xml | 3 --- mobile/.idea/encodings.xml | 5 ----- mobile/.idea/libraries/android_support_v4.xml | 9 --------- mobile/.idea/misc.xml | 5 ++++- mobile/.idea/scopes/scope_settings.xml | 5 ----- 7 files changed, 4 insertions(+), 32 deletions(-) delete mode 100644 mobile/.idea/.name delete mode 100644 mobile/.idea/compiler.xml delete mode 100644 mobile/.idea/copyright/profiles_settings.xml delete mode 100644 mobile/.idea/encodings.xml delete mode 100644 mobile/.idea/libraries/android_support_v4.xml delete mode 100644 mobile/.idea/scopes/scope_settings.xml diff --git a/mobile/.idea/.name b/mobile/.idea/.name deleted file mode 100644 index b4e0055b1..000000000 --- a/mobile/.idea/.name +++ /dev/null @@ -1 +0,0 @@ -IITC_Mobile \ No newline at end of file diff --git a/mobile/.idea/compiler.xml b/mobile/.idea/compiler.xml deleted file mode 100644 index a1757ae52..000000000 --- a/mobile/.idea/compiler.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/mobile/.idea/copyright/profiles_settings.xml b/mobile/.idea/copyright/profiles_settings.xml deleted file mode 100644 index e7bedf337..000000000 --- a/mobile/.idea/copyright/profiles_settings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/mobile/.idea/encodings.xml b/mobile/.idea/encodings.xml deleted file mode 100644 index e206d70d8..000000000 --- a/mobile/.idea/encodings.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/mobile/.idea/libraries/android_support_v4.xml b/mobile/.idea/libraries/android_support_v4.xml deleted file mode 100644 index 90805f276..000000000 --- a/mobile/.idea/libraries/android_support_v4.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/mobile/.idea/misc.xml b/mobile/.idea/misc.xml index 5785cabbf..44a480215 100644 --- a/mobile/.idea/misc.xml +++ b/mobile/.idea/misc.xml @@ -29,7 +29,10 @@ - + + + \ No newline at end of file diff --git a/mobile/.idea/scopes/scope_settings.xml b/mobile/.idea/scopes/scope_settings.xml deleted file mode 100644 index 922003b84..000000000 --- a/mobile/.idea/scopes/scope_settings.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - \ No newline at end of file From 675ed6cbb731ba1ee61049b347dd35baebab6e54 Mon Sep 17 00:00:00 2001 From: Mike Lambert Date: Thu, 1 Nov 2018 09:17:53 +0300 Subject: [PATCH 4/9] Updated userscripts, changed build script in order to automatic reimport --- mobile/assets/plugins/add-kml.user.js | 6 +- mobile/assets/plugins/ap-list.user.js | 2 +- mobile/assets/plugins/basemap-bing.user.js | 6 +- mobile/assets/plugins/basemap-blank.user.js | 6 +- .../assets/plugins/basemap-gmaps-gray.user.js | 6 +- .../assets/plugins/basemap-kartverket.user.js | 6 +- .../basemap-mapquest-open-aerial.user.js | 57 +------------------ .../assets/plugins/basemap-nokia-ovi.user.js | 6 +- .../plugins/basemap-opencyclemap.user.js | 6 +- .../plugins/basemap-openstreetmap.user.js | 6 +- mobile/assets/plugins/basemap-stamen.user.js | 6 +- mobile/assets/plugins/basemap-yandex.user.js | 6 +- .../assets/plugins/bookmarks-by-zaso.user.js | 6 +- .../plugins/cache-details-on-map.user.js | 6 +- mobile/assets/plugins/canvas-render.user.js | 6 +- .../assets/plugins/compute-ap-stats.user.js | 6 +- mobile/assets/plugins/cross_link.user.js | 6 +- .../plugins/debug-raw-portal-data.user.js | 6 +- .../plugins/default-intel-detail.user.js | 6 +- .../assets/plugins/distance-to-portal.user.js | 6 +- mobile/assets/plugins/done-links.user.js | 6 +- mobile/assets/plugins/draw-resonators.user.js | 4 +- mobile/assets/plugins/draw-tools.user.js | 6 +- .../assets/plugins/favorite-portals.user.js | 2 +- .../fix-googlemap-china-offset.user.js | 6 +- mobile/assets/plugins/fly-links.user.js | 6 +- .../plugins/guess-player-levels.user.js | 6 +- .../iitc-ditigal-bumper-sticker.user.js | 4 +- mobile/assets/plugins/ipas-link.user.js | 4 +- mobile/assets/plugins/keys-on-map.user.js | 6 +- mobile/assets/plugins/keys.user.js | 6 +- mobile/assets/plugins/layer-count.user.js | 6 +- .../assets/plugins/layer-farms-find.user.js | 6 +- .../plugins/link-show-direction.user.js | 6 +- mobile/assets/plugins/max-links.user.js | 6 +- mobile/assets/plugins/minimap.user.js | 6 +- mobile/assets/plugins/missions.user.js | 6 +- mobile/assets/plugins/pan-control.user.js | 6 +- .../assets/plugins/periodic-refresh.user.js | 4 +- mobile/assets/plugins/player-tracker.user.js | 6 +- .../plugins/players-portal-pictures.user.js | 4 +- .../assets/plugins/players-resonators.user.js | 2 +- mobile/assets/plugins/portal-counts.user.js | 6 +- mobile/assets/plugins/portal-defense.user.js | 2 +- ...ighlighter-bad-deployment-distance.user.js | 2 +- .../portal-highlighter-can-make-level.user.js | 2 +- .../plugins/portal-highlighter-debug.user.js | 6 +- .../portal-highlighter-forgotten.user.js | 6 +- .../portal-highlighter-hide-team.user.js | 6 +- .../portal-highlighter-high-level.user.js | 6 +- .../portal-highlighter-imminent-decay.user.js | 2 +- .../portal-highlighter-infrastructure.user.js | 6 +- .../portal-highlighter-level-color.user.js | 6 +- ...tal-highlighter-missing-resonators.user.js | 6 +- .../portal-highlighter-mitigation.user.js | 2 +- .../plugins/portal-highlighter-mods.user.js | 2 +- .../portal-highlighter-my-8-portals.user.js | 2 +- .../portal-highlighter-my-portals.user.js | 2 +- .../portal-highlighter-needs-recharge.user.js | 6 +- .../portal-highlighter-ornaments.user.js | 6 +- ...-highlighter-outbound-link-counter.user.js | 2 +- ...hlighter-portal-ap-energy-relative.user.js | 2 +- ...tal-highlighter-portal-ap-relative.user.js | 2 +- .../portal-highlighter-portal-ap.user.js | 2 +- ...ortal-highlighter-portals-my-level.user.js | 6 +- ...portal-highlighter-portals-upgrade.user.js | 2 +- ...l-highlighter-with-lvl8-resonators.user.js | 2 +- .../plugins/portal-level-numbers.user.js | 6 +- mobile/assets/plugins/portal-names.user.js | 6 +- mobile/assets/plugins/portals-list.user.js | 6 +- mobile/assets/plugins/privacy-view.user.js | 6 +- mobile/assets/plugins/regions.user.js | 6 +- .../plugins/render-limit-increase.user.js | 4 +- .../reso-energy-pct-in-portal-detail.user.js | 6 +- ...onator-display-zoom-level-decrease.user.js | 4 +- mobile/assets/plugins/scale-bar.user.js | 6 +- .../assets/plugins/score-cycle-times.user.js | 6 +- mobile/assets/plugins/scoreboard.user.js | 6 +- mobile/assets/plugins/show-address.user.js | 4 +- .../show-less-portals-zoomed-out.user.js | 6 +- .../plugins/show-linked-portals.user.js | 6 +- .../assets/plugins/show-more-portals.user.js | 4 +- .../plugins/show-portal-weakness.user.js | 6 +- mobile/assets/plugins/sync.user.js | 6 +- mobile/assets/plugins/uniques.user.js | 6 +- mobile/assets/plugins/update-check.user.js | 6 +- mobile/assets/plugins/zaprange.user.js | 6 +- mobile/assets/plugins/zoom-slider.user.js | 6 +- mobile/assets/total-conversion-build.user.js | 14 ++--- mobile/assets/user-location.user.js | 6 +- mobile/iitcm/build.gradle | 12 ++++ 91 files changed, 243 insertions(+), 282 deletions(-) diff --git a/mobile/assets/plugins/add-kml.user.js b/mobile/assets/plugins/add-kml.user.js index 5f72ae2c5..bab0e2f15 100644 --- a/mobile/assets/plugins/add-kml.user.js +++ b/mobile/assets/plugins/add-kml.user.js @@ -2,11 +2,11 @@ // @id overlay-kml@danielatkins // @name IITC plugin: overlay KML // @category Layer -// @version 0.2.0.20181030.90244 +// @version 0.2.0.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] Allow users to overlay their own KML / GPX files on top of IITC. +// @description [mobile-2018-11-01-060209] Allow users to overlay their own KML / GPX files on top of IITC. // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* @@ -26,7 +26,7 @@ if(typeof window.plugin !== 'function') window.plugin = function() {}; //PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! //(leaving them in place might break the 'About IITC' page or break update checks) plugin_info.buildName = 'mobile'; -plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.dateTimeVersion = '20181101.60209'; plugin_info.pluginId = 'add-kml'; //END PLUGIN AUTHORS NOTE diff --git a/mobile/assets/plugins/ap-list.user.js b/mobile/assets/plugins/ap-list.user.js index 7076fc765..8b3a85a31 100644 --- a/mobile/assets/plugins/ap-list.user.js +++ b/mobile/assets/plugins/ap-list.user.js @@ -2,7 +2,7 @@ // @id iitc-plugin-ap-list@xelio // @name IITC plugin: AP List // @category Deleted -// @version 0.5.7.20181030.90244 +// @version 0.5.7.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none diff --git a/mobile/assets/plugins/basemap-bing.user.js b/mobile/assets/plugins/basemap-bing.user.js index e7bca1027..abc93e6d7 100644 --- a/mobile/assets/plugins/basemap-bing.user.js +++ b/mobile/assets/plugins/basemap-bing.user.js @@ -2,11 +2,11 @@ // @id iitc-plugin-bing-maps // @name IITC plugin: Bing maps // @category Map Tiles -// @version 0.1.3.20181030.90244 +// @version 0.1.3.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] Add the maps.bing.com map layers. +// @description [mobile-2018-11-01-060209] Add the maps.bing.com map layers. // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* @@ -26,7 +26,7 @@ if(typeof window.plugin !== 'function') window.plugin = function() {}; //PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! //(leaving them in place might break the 'About IITC' page or break update checks) plugin_info.buildName = 'mobile'; -plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.dateTimeVersion = '20181101.60209'; plugin_info.pluginId = 'basemap-bing'; //END PLUGIN AUTHORS NOTE diff --git a/mobile/assets/plugins/basemap-blank.user.js b/mobile/assets/plugins/basemap-blank.user.js index 2a1569f93..6a97d8abe 100644 --- a/mobile/assets/plugins/basemap-blank.user.js +++ b/mobile/assets/plugins/basemap-blank.user.js @@ -2,11 +2,11 @@ // @id iitc-plugin-basemap-blank@jonatkins // @name IITC plugin: Blank map // @category Map Tiles -// @version 0.1.2.20181030.90244 +// @version 0.1.2.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] Add a blank map layer - no roads or other features. +// @description [mobile-2018-11-01-060209] Add a blank map layer - no roads or other features. // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* @@ -26,7 +26,7 @@ if(typeof window.plugin !== 'function') window.plugin = function() {}; //PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! //(leaving them in place might break the 'About IITC' page or break update checks) plugin_info.buildName = 'mobile'; -plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.dateTimeVersion = '20181101.60209'; plugin_info.pluginId = 'basemap-blank'; //END PLUGIN AUTHORS NOTE diff --git a/mobile/assets/plugins/basemap-gmaps-gray.user.js b/mobile/assets/plugins/basemap-gmaps-gray.user.js index 6837ead0d..a4f18a305 100644 --- a/mobile/assets/plugins/basemap-gmaps-gray.user.js +++ b/mobile/assets/plugins/basemap-gmaps-gray.user.js @@ -2,11 +2,11 @@ // @id iitc-plugin-basemap-gmaps-gray@jacob1123 // @name IITC plugin: Gray Google Roads // @category Map Tiles -// @version 0.1.2.20181030.90244 +// @version 0.1.2.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] Add a simplified gray Version of Google map tiles as an optional layer. +// @description [mobile-2018-11-01-060209] Add a simplified gray Version of Google map tiles as an optional layer. // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* @@ -26,7 +26,7 @@ if(typeof window.plugin !== 'function') window.plugin = function() {}; //PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! //(leaving them in place might break the 'About IITC' page or break update checks) plugin_info.buildName = 'mobile'; -plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.dateTimeVersion = '20181101.60209'; plugin_info.pluginId = 'basemap-gmaps-gray'; //END PLUGIN AUTHORS NOTE diff --git a/mobile/assets/plugins/basemap-kartverket.user.js b/mobile/assets/plugins/basemap-kartverket.user.js index f0756063b..61259f544 100644 --- a/mobile/assets/plugins/basemap-kartverket.user.js +++ b/mobile/assets/plugins/basemap-kartverket.user.js @@ -2,11 +2,11 @@ // @id iitc-plugin-basemap-kartverket@sollie // @name IITC plugin: Kartverket.no map tiles // @category Map Tiles -// @version 0.1.0.20181030.90244 +// @version 0.1.0.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] Add the color and grayscale map tiles from Kartverket.no as an optional layer. +// @description [mobile-2018-11-01-060209] Add the color and grayscale map tiles from Kartverket.no as an optional layer. // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* @@ -26,7 +26,7 @@ if(typeof window.plugin !== 'function') window.plugin = function() {}; //PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! //(leaving them in place might break the 'About IITC' page or break update checks) plugin_info.buildName = 'mobile'; -plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.dateTimeVersion = '20181101.60209'; plugin_info.pluginId = 'basemap-kartverket'; //END PLUGIN AUTHORS NOTE diff --git a/mobile/assets/plugins/basemap-mapquest-open-aerial.user.js b/mobile/assets/plugins/basemap-mapquest-open-aerial.user.js index 8208f966d..0ef46b4f5 100644 --- a/mobile/assets/plugins/basemap-mapquest-open-aerial.user.js +++ b/mobile/assets/plugins/basemap-mapquest-open-aerial.user.js @@ -1,12 +1,12 @@ // ==UserScript== // @id iitc-plugin-basemap-mapquest-open-aerial@jonatkins // @name IITC plugin: MapQuest Open Satellite view (US Only) -// @category Map Tiles -// @version 0.1.1.20181030.90244 +// @category Deleted +// @version 0.0.0 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] Add the MapQuest Open Aerial satellite view tiles as a map layer. High detail in the US (lower 48) only. +// @description MapQuest doesn't support this anymore: https://lists.openstreetmap.org/pipermail/tile-serving/2016-June/003928.html // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* @@ -17,54 +17,3 @@ // @match http://*.ingress.com/mission/* // @grant none // ==/UserScript== - - -function wrapper(plugin_info) { -// ensure plugin framework is there, even if iitc is not yet loaded -if(typeof window.plugin !== 'function') window.plugin = function() {}; - -//PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! -//(leaving them in place might break the 'About IITC' page or break update checks) -plugin_info.buildName = 'mobile'; -plugin_info.dateTimeVersion = '20181030.90244'; -plugin_info.pluginId = 'basemap-mapquest-open-aerial'; -//END PLUGIN AUTHORS NOTE - - - -// PLUGIN START //////////////////////////////////////////////////////// - - -// use own namespace for plugin -window.plugin.mapTileMapQuestSat = function() {}; - -window.plugin.mapTileMapQuestSat.addLayer = function() { - - var mqSubdomains = [ 'otile1','otile2', 'otile3', 'otile4' ]; - var mqTileUrlPrefix = window.location.protocol !== 'https:' ? 'http://{s}.mqcdn.com' : 'https://{s}-s.mqcdn.com'; - //MapQuest satellite coverage outside of the US is rather limited - so not really worth having as we have google as an op! - var mqSatOpt = {attribution: 'Portions Courtesy NASA/JPL-Caltech and U.S. Depart. of Agriculture, Farm Service Agency', maxNativeZoom: 18, maxZoom: 21, subdomains: mqSubdomains}; - var mqSat = new L.TileLayer('http://{s}.mqcdn.com/tiles/1.0.0/sat/{z}/{x}/{y}.jpg',mqSatOpt); - - layerChooser.addBaseLayer(mqSat, "MapQuest Open Satellite"); -}; - -var setup = window.plugin.mapTileMapQuestSat.addLayer; - -// PLUGIN END ////////////////////////////////////////////////////////// - - -setup.info = plugin_info; //add the script info data to the function as a property -if(!window.bootPlugins) window.bootPlugins = []; -window.bootPlugins.push(setup); -// if IITC has already booted, immediately run the 'setup' function -if(window.iitcLoaded && typeof setup === 'function') setup(); -} // wrapper end -// inject code into site context -var script = document.createElement('script'); -var info = {}; -if (typeof GM_info !== 'undefined' && GM_info && GM_info.script) info.script = { version: GM_info.script.version, name: GM_info.script.name, description: GM_info.script.description }; -script.appendChild(document.createTextNode('('+ wrapper +')('+JSON.stringify(info)+');')); -(document.body || document.head || document.documentElement).appendChild(script); - - diff --git a/mobile/assets/plugins/basemap-nokia-ovi.user.js b/mobile/assets/plugins/basemap-nokia-ovi.user.js index c527912e7..91aec0f8d 100644 --- a/mobile/assets/plugins/basemap-nokia-ovi.user.js +++ b/mobile/assets/plugins/basemap-nokia-ovi.user.js @@ -2,11 +2,11 @@ // @id iitc-plugin-nokia-ovi-maps // @name IITC plugin: Nokia OVI maps // @category Map Tiles -// @version 0.1.3.20181030.90244 +// @version 0.1.3.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] Add various map layers from Nokia OVI Maps. +// @description [mobile-2018-11-01-060209] Add various map layers from Nokia OVI Maps. // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* @@ -26,7 +26,7 @@ if(typeof window.plugin !== 'function') window.plugin = function() {}; //PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! //(leaving them in place might break the 'About IITC' page or break update checks) plugin_info.buildName = 'mobile'; -plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.dateTimeVersion = '20181101.60209'; plugin_info.pluginId = 'basemap-nokia-ovi'; //END PLUGIN AUTHORS NOTE diff --git a/mobile/assets/plugins/basemap-opencyclemap.user.js b/mobile/assets/plugins/basemap-opencyclemap.user.js index ee59bf5a3..2095b98d7 100644 --- a/mobile/assets/plugins/basemap-opencyclemap.user.js +++ b/mobile/assets/plugins/basemap-opencyclemap.user.js @@ -2,11 +2,11 @@ // @id iitc-plugin-basemap-opencyclepam@jonatkins // @name IITC plugin: OpenCycleMap.org map tiles // @category Map Tiles -// @version 0.2.0.20181030.90244 +// @version 0.2.0.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] Add the OpenCycleMap.org map tiles as an optional layer. +// @description [mobile-2018-11-01-060209] Add the OpenCycleMap.org map tiles as an optional layer. // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* @@ -26,7 +26,7 @@ if(typeof window.plugin !== 'function') window.plugin = function() {}; //PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! //(leaving them in place might break the 'About IITC' page or break update checks) plugin_info.buildName = 'mobile'; -plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.dateTimeVersion = '20181101.60209'; plugin_info.pluginId = 'basemap-opencyclemap'; //END PLUGIN AUTHORS NOTE diff --git a/mobile/assets/plugins/basemap-openstreetmap.user.js b/mobile/assets/plugins/basemap-openstreetmap.user.js index d98cf01e0..d70552985 100644 --- a/mobile/assets/plugins/basemap-openstreetmap.user.js +++ b/mobile/assets/plugins/basemap-openstreetmap.user.js @@ -2,11 +2,11 @@ // @id iitc-plugin-basemap-openstreetpam@jonatkins // @name IITC plugin: OpenStreetMap.org map tiles // @category Map Tiles -// @version 0.1.1.20181030.90244 +// @version 0.1.1.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] Add the native OpenStreetMap.org map tiles as an optional layer. +// @description [mobile-2018-11-01-060209] Add the native OpenStreetMap.org map tiles as an optional layer. // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* @@ -26,7 +26,7 @@ if(typeof window.plugin !== 'function') window.plugin = function() {}; //PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! //(leaving them in place might break the 'About IITC' page or break update checks) plugin_info.buildName = 'mobile'; -plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.dateTimeVersion = '20181101.60209'; plugin_info.pluginId = 'basemap-openstreetmap'; //END PLUGIN AUTHORS NOTE diff --git a/mobile/assets/plugins/basemap-stamen.user.js b/mobile/assets/plugins/basemap-stamen.user.js index e504451dd..c25b162eb 100644 --- a/mobile/assets/plugins/basemap-stamen.user.js +++ b/mobile/assets/plugins/basemap-stamen.user.js @@ -2,11 +2,11 @@ // @id iitc-plugin-basemap-stamen@jonatkins // @name IITC plugin: Map layers from stamen.com // @category Map Tiles -// @version 0.2.0.20181030.90244 +// @version 0.2.0.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] Add the 'Toner' and 'Watercolor' map layers from maps.stamen.com. +// @description [mobile-2018-11-01-060209] Add the 'Toner' and 'Watercolor' map layers from maps.stamen.com. // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* @@ -26,7 +26,7 @@ if(typeof window.plugin !== 'function') window.plugin = function() {}; //PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! //(leaving them in place might break the 'About IITC' page or break update checks) plugin_info.buildName = 'mobile'; -plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.dateTimeVersion = '20181101.60209'; plugin_info.pluginId = 'basemap-stamen'; //END PLUGIN AUTHORS NOTE diff --git a/mobile/assets/plugins/basemap-yandex.user.js b/mobile/assets/plugins/basemap-yandex.user.js index 7c9ef0d8a..a377e3480 100644 --- a/mobile/assets/plugins/basemap-yandex.user.js +++ b/mobile/assets/plugins/basemap-yandex.user.js @@ -2,11 +2,11 @@ // @id iitc-plugin-basemap-yandex@jonatkins // @name IITC plugin: Yandex maps // @category Map Tiles -// @version 0.2.0.20181030.90244 +// @version 0.2.0.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] Add Yandex.com (Russian/Русский) map layers +// @description [mobile-2018-11-01-060209] Add Yandex.com (Russian/Русский) map layers // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* @@ -26,7 +26,7 @@ if(typeof window.plugin !== 'function') window.plugin = function() {}; //PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! //(leaving them in place might break the 'About IITC' page or break update checks) plugin_info.buildName = 'mobile'; -plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.dateTimeVersion = '20181101.60209'; plugin_info.pluginId = 'basemap-yandex'; //END PLUGIN AUTHORS NOTE diff --git a/mobile/assets/plugins/bookmarks-by-zaso.user.js b/mobile/assets/plugins/bookmarks-by-zaso.user.js index 9dd7fa4dc..6baa6b749 100644 --- a/mobile/assets/plugins/bookmarks-by-zaso.user.js +++ b/mobile/assets/plugins/bookmarks-by-zaso.user.js @@ -2,11 +2,11 @@ // @id iitc-plugin-bookmarks@ZasoGD // @name IITC plugin: Bookmarks for maps and portals // @category Controls -// @version 0.2.12.20181030.90244 +// @version 0.2.12.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] Save your favorite Maps and Portals and move the intel map with a click. Works with sync. +// @description [mobile-2018-11-01-060209] Save your favorite Maps and Portals and move the intel map with a click. Works with sync. // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* @@ -26,7 +26,7 @@ if(typeof window.plugin !== 'function') window.plugin = function() {}; //PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! //(leaving them in place might break the 'About IITC' page or break update checks) plugin_info.buildName = 'mobile'; -plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.dateTimeVersion = '20181101.60209'; plugin_info.pluginId = 'bookmarks-by-zaso'; //END PLUGIN AUTHORS NOTE diff --git a/mobile/assets/plugins/cache-details-on-map.user.js b/mobile/assets/plugins/cache-details-on-map.user.js index 3f6993cbe..e4bb9982f 100644 --- a/mobile/assets/plugins/cache-details-on-map.user.js +++ b/mobile/assets/plugins/cache-details-on-map.user.js @@ -2,11 +2,11 @@ // @id iitc-plugin-cache-details-on-map@jonatkins // @name IITC plugin: Cache viewed portal details and always show them on the map // @category Cache -// @version 0.1.0.20181030.90244 +// @version 0.1.0.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] Cache the details of recently viewed portals and use this to populate the map when possible +// @description [mobile-2018-11-01-060209] Cache the details of recently viewed portals and use this to populate the map when possible // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* @@ -26,7 +26,7 @@ if(typeof window.plugin !== 'function') window.plugin = function() {}; //PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! //(leaving them in place might break the 'About IITC' page or break update checks) plugin_info.buildName = 'mobile'; -plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.dateTimeVersion = '20181101.60209'; plugin_info.pluginId = 'cache-details-on-map'; //END PLUGIN AUTHORS NOTE diff --git a/mobile/assets/plugins/canvas-render.user.js b/mobile/assets/plugins/canvas-render.user.js index 6e1bddc14..c3bc000d6 100644 --- a/mobile/assets/plugins/canvas-render.user.js +++ b/mobile/assets/plugins/canvas-render.user.js @@ -2,11 +2,11 @@ // @id iitc-plugin-canvas-render@jonatkins // @name IITC plugin: Use Canvas rendering // @category Tweaks -// @version 0.1.0.20181030.90244 +// @version 0.1.0.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] EXPERIMENTAL: use canvas-based rendering. Can be faster when viewing dense areas. Limited testing of the feature so far +// @description [mobile-2018-11-01-060209] EXPERIMENTAL: use canvas-based rendering. Can be faster when viewing dense areas. Limited testing of the feature so far // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* @@ -32,7 +32,7 @@ if(typeof window.plugin !== 'function') window.plugin = function() {}; //PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! //(leaving them in place might break the 'About IITC' page or break update checks) plugin_info.buildName = 'mobile'; -plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.dateTimeVersion = '20181101.60209'; plugin_info.pluginId = 'canvas-render'; //END PLUGIN AUTHORS NOTE diff --git a/mobile/assets/plugins/compute-ap-stats.user.js b/mobile/assets/plugins/compute-ap-stats.user.js index 75a88ad36..c4cf4ca18 100644 --- a/mobile/assets/plugins/compute-ap-stats.user.js +++ b/mobile/assets/plugins/compute-ap-stats.user.js @@ -2,11 +2,11 @@ // @id iitc-plugin-compute-ap-stats@Hollow011 // @name IITC plugin: Compute AP statistics // @category Info -// @version 0.4.1.20181030.90244 +// @version 0.4.1.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] Displays the per-team AP gains available in the current view. +// @description [mobile-2018-11-01-060209] Displays the per-team AP gains available in the current view. // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* @@ -26,7 +26,7 @@ if(typeof window.plugin !== 'function') window.plugin = function() {}; //PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! //(leaving them in place might break the 'About IITC' page or break update checks) plugin_info.buildName = 'mobile'; -plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.dateTimeVersion = '20181101.60209'; plugin_info.pluginId = 'compute-ap-stats'; //END PLUGIN AUTHORS NOTE diff --git a/mobile/assets/plugins/cross_link.user.js b/mobile/assets/plugins/cross_link.user.js index 3cbae0b59..ba0a46bab 100644 --- a/mobile/assets/plugins/cross_link.user.js +++ b/mobile/assets/plugins/cross_link.user.js @@ -2,11 +2,11 @@ // @id iitc-plugin-cross-links@mcben // @name IITC plugin: cross links // @category Layer -// @version 1.1.2.20181030.90244 +// @version 1.1.2.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] EXPERIMENTAL: Checks for existing links that cross planned links. Requires draw-tools plugin. +// @description [mobile-2018-11-01-060209] EXPERIMENTAL: Checks for existing links that cross planned links. Requires draw-tools plugin. // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* @@ -26,7 +26,7 @@ if(typeof window.plugin !== 'function') window.plugin = function() {}; //PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! //(leaving them in place might break the 'About IITC' page or break update checks) plugin_info.buildName = 'mobile'; -plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.dateTimeVersion = '20181101.60209'; plugin_info.pluginId = 'cross_link'; //END PLUGIN AUTHORS NOTE diff --git a/mobile/assets/plugins/debug-raw-portal-data.user.js b/mobile/assets/plugins/debug-raw-portal-data.user.js index e60d8e660..86f01c37d 100644 --- a/mobile/assets/plugins/debug-raw-portal-data.user.js +++ b/mobile/assets/plugins/debug-raw-portal-data.user.js @@ -2,11 +2,11 @@ // @id iitc-plugin-raw-portal-data // @name IITC plugin: Debug: Raw portal JSON data // @category Debug -// @version 0.2.4.20181030.90244 +// @version 0.2.4.20181101.60209 // @namespace rawdata // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] Developer debugging aid: Add a link to the portal details to show the raw data of a portal. +// @description [mobile-2018-11-01-060209] Developer debugging aid: Add a link to the portal details to show the raw data of a portal. // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* @@ -26,7 +26,7 @@ if(typeof window.plugin !== 'function') window.plugin = function() {}; //PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! //(leaving them in place might break the 'About IITC' page or break update checks) plugin_info.buildName = 'mobile'; -plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.dateTimeVersion = '20181101.60209'; plugin_info.pluginId = 'debug-raw-portal-data'; //END PLUGIN AUTHORS NOTE diff --git a/mobile/assets/plugins/default-intel-detail.user.js b/mobile/assets/plugins/default-intel-detail.user.js index 32907e8a0..25d0f7c01 100644 --- a/mobile/assets/plugins/default-intel-detail.user.js +++ b/mobile/assets/plugins/default-intel-detail.user.js @@ -2,11 +2,11 @@ // @id iitc-plugin-default-intel-detail@jonatkins // @name IITC plugin: Default intel detail level // @category Tweaks -// @version 0.2.0.20181030.90244 +// @version 0.2.0.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] Use the portal level detail levels from the standard intel site. By default, IITC shows less detail when zoomed out, as this is enough for general use, is more friendly to the niantic servers, and loads much faster. This plugin restores the default zoom level to portal level mapping. Note: using this plugin causes a larger number of requests to the intel server, and at high resolutions can cause excessive requests to be made (yes: the default intel site also has this problem!), so it is not recommended except for low resolution screens. +// @description [mobile-2018-11-01-060209] Use the portal level detail levels from the standard intel site. By default, IITC shows less detail when zoomed out, as this is enough for general use, is more friendly to the niantic servers, and loads much faster. This plugin restores the default zoom level to portal level mapping. Note: using this plugin causes a larger number of requests to the intel server, and at high resolutions can cause excessive requests to be made (yes: the default intel site also has this problem!), so it is not recommended except for low resolution screens. // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* @@ -26,7 +26,7 @@ if(typeof window.plugin !== 'function') window.plugin = function() {}; //PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! //(leaving them in place might break the 'About IITC' page or break update checks) plugin_info.buildName = 'mobile'; -plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.dateTimeVersion = '20181101.60209'; plugin_info.pluginId = 'default-intel-detail'; //END PLUGIN AUTHORS NOTE diff --git a/mobile/assets/plugins/distance-to-portal.user.js b/mobile/assets/plugins/distance-to-portal.user.js index 7672fc73a..f5c46370c 100644 --- a/mobile/assets/plugins/distance-to-portal.user.js +++ b/mobile/assets/plugins/distance-to-portal.user.js @@ -2,11 +2,11 @@ // @id iitc-plugin-distance-to-portal@jonatkins // @name IITC plugin: Distance to portal // @category Portal Info -// @version 0.1.1.20181030.90244 +// @version 0.1.1.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] Allows your current location to be set manually, then shows the distance to the selected portal. Useful when managing portal keys. +// @description [mobile-2018-11-01-060209] Allows your current location to be set manually, then shows the distance to the selected portal. Useful when managing portal keys. // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* @@ -26,7 +26,7 @@ if(typeof window.plugin !== 'function') window.plugin = function() {}; //PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! //(leaving them in place might break the 'About IITC' page or break update checks) plugin_info.buildName = 'mobile'; -plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.dateTimeVersion = '20181101.60209'; plugin_info.pluginId = 'distance-to-portal'; //END PLUGIN AUTHORS NOTE diff --git a/mobile/assets/plugins/done-links.user.js b/mobile/assets/plugins/done-links.user.js index bf90f170d..e0ef4ca23 100644 --- a/mobile/assets/plugins/done-links.user.js +++ b/mobile/assets/plugins/done-links.user.js @@ -2,11 +2,11 @@ // @id iitc-plugin-done-links@jonatkins // @name IITC plugin: done links // @category Layer -// @version 0.0.1.20181030.90244 +// @version 0.0.1.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] A companion to the Cross Links plugin. Highlights any links that match existing draw-tools line/polygon edges +// @description [mobile-2018-11-01-060209] A companion to the Cross Links plugin. Highlights any links that match existing draw-tools line/polygon edges // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* @@ -26,7 +26,7 @@ if(typeof window.plugin !== 'function') window.plugin = function() {}; //PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! //(leaving them in place might break the 'About IITC' page or break update checks) plugin_info.buildName = 'mobile'; -plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.dateTimeVersion = '20181101.60209'; plugin_info.pluginId = 'done-links'; //END PLUGIN AUTHORS NOTE diff --git a/mobile/assets/plugins/draw-resonators.user.js b/mobile/assets/plugins/draw-resonators.user.js index 50f46620f..53aa205e4 100644 --- a/mobile/assets/plugins/draw-resonators.user.js +++ b/mobile/assets/plugins/draw-resonators.user.js @@ -2,11 +2,11 @@ // @id iitc-plugin-draw-resonators@xelio // @name IITC plugin: Draw resonators // @category Deleted -// @version 0.6.0.20181030.90244 +// @version 0.6.0.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] Resonator deployment distance data is no longer available, as of 2014-05-23 +// @description [mobile-2018-11-01-060209] Resonator deployment distance data is no longer available, as of 2014-05-23 // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* diff --git a/mobile/assets/plugins/draw-tools.user.js b/mobile/assets/plugins/draw-tools.user.js index 97801ddc8..cc682a2df 100644 --- a/mobile/assets/plugins/draw-tools.user.js +++ b/mobile/assets/plugins/draw-tools.user.js @@ -2,11 +2,11 @@ // @id iitc-plugin-draw-tools@breunigs // @name IITC plugin: draw tools // @category Layer -// @version 0.7.0.20181030.90244 +// @version 0.7.0.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] Allow drawing things onto the current map so you may plan your next move. +// @description [mobile-2018-11-01-060209] Allow drawing things onto the current map so you may plan your next move. // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* @@ -26,7 +26,7 @@ if(typeof window.plugin !== 'function') window.plugin = function() {}; //PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! //(leaving them in place might break the 'About IITC' page or break update checks) plugin_info.buildName = 'mobile'; -plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.dateTimeVersion = '20181101.60209'; plugin_info.pluginId = 'draw-tools'; //END PLUGIN AUTHORS NOTE diff --git a/mobile/assets/plugins/favorite-portals.user.js b/mobile/assets/plugins/favorite-portals.user.js index 75ce6bd8c..2e1207571 100644 --- a/mobile/assets/plugins/favorite-portals.user.js +++ b/mobile/assets/plugins/favorite-portals.user.js @@ -2,7 +2,7 @@ // @id iitc-plugin-favorite-portals@soulBit // @name IITC plugin: Favorite Portals // @category Deleted -// @version 0.2.0.20181030.90244 +// @version 0.2.0.20181101.60209 // @description Plugin replaced by the "Bookmarks for maps and portals" plugin // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none diff --git a/mobile/assets/plugins/fix-googlemap-china-offset.user.js b/mobile/assets/plugins/fix-googlemap-china-offset.user.js index cc4c5614f..c8cf28f1c 100644 --- a/mobile/assets/plugins/fix-googlemap-china-offset.user.js +++ b/mobile/assets/plugins/fix-googlemap-china-offset.user.js @@ -2,11 +2,11 @@ // @id iitc-plugin-fix-googlemap-china-offset@breezewish // @name IITC plugin: Fix Google Map offsets in China // @category Tweaks -// @version 0.0.1.20181030.90244 +// @version 0.0.1.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] Show correct Google Map for China user by applying offset tweaks. +// @description [mobile-2018-11-01-060209] Show correct Google Map for China user by applying offset tweaks. // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* @@ -26,7 +26,7 @@ if(typeof window.plugin !== 'function') window.plugin = function() {}; //PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! //(leaving them in place might break the 'About IITC' page or break update checks) plugin_info.buildName = 'mobile'; -plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.dateTimeVersion = '20181101.60209'; plugin_info.pluginId = 'fix-googlemap-china-offset'; //END PLUGIN AUTHORS NOTE diff --git a/mobile/assets/plugins/fly-links.user.js b/mobile/assets/plugins/fly-links.user.js index 1bdfd82d8..8e5999ea6 100644 --- a/mobile/assets/plugins/fly-links.user.js +++ b/mobile/assets/plugins/fly-links.user.js @@ -2,10 +2,10 @@ // @id fly-links@fly // @name IITC plugin: Fly Links // @category Layer -// @version 0.2.1.20181030.90244 +// @version 0.2.1.20181101.60209 // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] Calculate how to link the portals to create the largest tidy set of nested fields. Enable from the layer chooser. +// @description [mobile-2018-11-01-060209] Calculate how to link the portals to create the largest tidy set of nested fields. Enable from the layer chooser. // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* @@ -25,7 +25,7 @@ if(typeof window.plugin !== 'function') window.plugin = function() {}; //PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! //(leaving them in place might break the 'About IITC' page or break update checks) plugin_info.buildName = 'mobile'; -plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.dateTimeVersion = '20181101.60209'; plugin_info.pluginId = 'fly-links'; //END PLUGIN AUTHORS NOTE diff --git a/mobile/assets/plugins/guess-player-levels.user.js b/mobile/assets/plugins/guess-player-levels.user.js index 2798a09d4..e81e2f579 100644 --- a/mobile/assets/plugins/guess-player-levels.user.js +++ b/mobile/assets/plugins/guess-player-levels.user.js @@ -2,11 +2,11 @@ // @id iitc-plugin-guess-player-levels@breunigs // @name IITC plugin: guess player level // @category Info -// @version 0.5.7.20181030.90244 +// @version 0.5.7.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] Try to determine player levels from the data available in the current view. +// @description [mobile-2018-11-01-060209] Try to determine player levels from the data available in the current view. // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* @@ -26,7 +26,7 @@ if(typeof window.plugin !== 'function') window.plugin = function() {}; //PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! //(leaving them in place might break the 'About IITC' page or break update checks) plugin_info.buildName = 'mobile'; -plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.dateTimeVersion = '20181101.60209'; plugin_info.pluginId = 'guess-player-levels'; //END PLUGIN AUTHORS NOTE diff --git a/mobile/assets/plugins/iitc-ditigal-bumper-sticker.user.js b/mobile/assets/plugins/iitc-ditigal-bumper-sticker.user.js index 4aa88576f..2e86619c2 100644 --- a/mobile/assets/plugins/iitc-ditigal-bumper-sticker.user.js +++ b/mobile/assets/plugins/iitc-ditigal-bumper-sticker.user.js @@ -2,11 +2,11 @@ // @id iitc-digital-bumper-sticker // @name IITC Digital Bumper Sticker // @category Stock -// @version 0.1.1.20181030.90244 +// @version 0.1.1.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] Adds a "I'd rather be using IITC" logo to the standard intel map. +// @description [mobile-2018-11-01-060209] Adds a "I'd rather be using IITC" logo to the standard intel map. // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* diff --git a/mobile/assets/plugins/ipas-link.user.js b/mobile/assets/plugins/ipas-link.user.js index 438a50d4b..ff6ddb114 100644 --- a/mobile/assets/plugins/ipas-link.user.js +++ b/mobile/assets/plugins/ipas-link.user.js @@ -2,11 +2,11 @@ // @id iitc-plugin-ipas-link@graphracer // @name IITC Plugin: simulate an attack on portal // @category Deleted -// @version 0.3.0.20181030.90244 +// @version 0.3.0.20181101.60209 // @namespace https://github.com/xosofox/IPAS // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] No longer available, as the resonator slot number and deployment distance is no longer available +// @description [mobile-2018-11-01-060209] No longer available, as the resonator slot number and deployment distance is no longer available // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* diff --git a/mobile/assets/plugins/keys-on-map.user.js b/mobile/assets/plugins/keys-on-map.user.js index 0c9fb6dd0..f9b34cae4 100644 --- a/mobile/assets/plugins/keys-on-map.user.js +++ b/mobile/assets/plugins/keys-on-map.user.js @@ -2,11 +2,11 @@ // @id iitc-plugin-keys-on-map@xelio // @name IITC plugin: Keys on map // @category Keys -// @version 0.2.1.20181030.90244 +// @version 0.2.1.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] Show the manually entered key counts from the 'keys' plugin on the map. +// @description [mobile-2018-11-01-060209] Show the manually entered key counts from the 'keys' plugin on the map. // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* @@ -26,7 +26,7 @@ if(typeof window.plugin !== 'function') window.plugin = function() {}; //PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! //(leaving them in place might break the 'About IITC' page or break update checks) plugin_info.buildName = 'mobile'; -plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.dateTimeVersion = '20181101.60209'; plugin_info.pluginId = 'keys-on-map'; //END PLUGIN AUTHORS NOTE diff --git a/mobile/assets/plugins/keys.user.js b/mobile/assets/plugins/keys.user.js index a9b14aacc..57132990a 100644 --- a/mobile/assets/plugins/keys.user.js +++ b/mobile/assets/plugins/keys.user.js @@ -2,11 +2,11 @@ // @id iitc-plugin-keys@xelio // @name IITC plugin: Keys // @category Keys -// @version 0.3.0.20181030.90244 +// @version 0.3.0.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] Allow manual entry of key counts for each portal. Use the 'keys-on-map' plugin to show the numbers on the map, and 'sync' to share between multiple browsers or desktop/mobile. +// @description [mobile-2018-11-01-060209] Allow manual entry of key counts for each portal. Use the 'keys-on-map' plugin to show the numbers on the map, and 'sync' to share between multiple browsers or desktop/mobile. // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* @@ -26,7 +26,7 @@ if(typeof window.plugin !== 'function') window.plugin = function() {}; //PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! //(leaving them in place might break the 'About IITC' page or break update checks) plugin_info.buildName = 'mobile'; -plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.dateTimeVersion = '20181101.60209'; plugin_info.pluginId = 'keys'; //END PLUGIN AUTHORS NOTE diff --git a/mobile/assets/plugins/layer-count.user.js b/mobile/assets/plugins/layer-count.user.js index 8c8e39cd7..091b4360c 100644 --- a/mobile/assets/plugins/layer-count.user.js +++ b/mobile/assets/plugins/layer-count.user.js @@ -2,11 +2,11 @@ // @id layer-count@fkloft // @name IITC plugin: layer count // @category Info -// @version 0.1.0.20181030.90244 +// @version 0.1.0.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] Allow users to count nested fields +// @description [mobile-2018-11-01-060209] Allow users to count nested fields // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* @@ -26,7 +26,7 @@ if(typeof window.plugin !== 'function') window.plugin = function() {}; //PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! //(leaving them in place might break the 'About IITC' page or break update checks) plugin_info.buildName = 'mobile'; -plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.dateTimeVersion = '20181101.60209'; plugin_info.pluginId = 'layer-count'; //END PLUGIN AUTHORS NOTE diff --git a/mobile/assets/plugins/layer-farms-find.user.js b/mobile/assets/plugins/layer-farms-find.user.js index 3b86a16d8..bd9b360ad 100644 --- a/mobile/assets/plugins/layer-farms-find.user.js +++ b/mobile/assets/plugins/layer-farms-find.user.js @@ -2,11 +2,11 @@ // @id iitc-plugin-farms@949 // @name IITC plugin: Show farms by level // @category Info -// @version 1.4.1.20181030.90244 +// @version 1.4.1.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] Find farms by minimum level. +// @description [mobile-2018-11-01-060209] Find farms by minimum level. // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* @@ -53,7 +53,7 @@ if(typeof window.plugin !== 'function') window.plugin = function() {}; //PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! //(leaving them in place might break the 'About IITC' page or break update checks) plugin_info.buildName = 'mobile'; -plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.dateTimeVersion = '20181101.60209'; plugin_info.pluginId = 'layer-farms-find'; //END PLUGIN AUTHORS NOTE diff --git a/mobile/assets/plugins/link-show-direction.user.js b/mobile/assets/plugins/link-show-direction.user.js index c01aff902..e3d00eb9e 100644 --- a/mobile/assets/plugins/link-show-direction.user.js +++ b/mobile/assets/plugins/link-show-direction.user.js @@ -2,11 +2,11 @@ // @id iitc-plugin-link-show-direction // @name IITC plugin: Show the direction of links on the map // @category Tweaks -// @version 0.2.1.20181030.90244 +// @version 0.2.1.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] Show the direction of links on the map by adding short dashes to the line at the origin portal. +// @description [mobile-2018-11-01-060209] Show the direction of links on the map by adding short dashes to the line at the origin portal. // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* @@ -26,7 +26,7 @@ if(typeof window.plugin !== 'function') window.plugin = function() {}; //PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! //(leaving them in place might break the 'About IITC' page or break update checks) plugin_info.buildName = 'mobile'; -plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.dateTimeVersion = '20181101.60209'; plugin_info.pluginId = 'link-show-direction'; //END PLUGIN AUTHORS NOTE diff --git a/mobile/assets/plugins/max-links.user.js b/mobile/assets/plugins/max-links.user.js index c8502b207..933d09553 100644 --- a/mobile/assets/plugins/max-links.user.js +++ b/mobile/assets/plugins/max-links.user.js @@ -2,10 +2,10 @@ // @id max-links@boombuler // @name IITC plugin: Max Links // @category Layer -// @version 0.4.3.20181030.90244 +// @version 0.4.3.20181101.60209 // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] Calculate how to link the portals to create a reasonably tidy set of links/fields. Enable from the layer chooser. (Max Links is a poor name, but remains for historical reasons.) +// @description [mobile-2018-11-01-060209] Calculate how to link the portals to create a reasonably tidy set of links/fields. Enable from the layer chooser. (Max Links is a poor name, but remains for historical reasons.) // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* @@ -25,7 +25,7 @@ if(typeof window.plugin !== 'function') window.plugin = function() {}; //PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! //(leaving them in place might break the 'About IITC' page or break update checks) plugin_info.buildName = 'mobile'; -plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.dateTimeVersion = '20181101.60209'; plugin_info.pluginId = 'max-links'; //END PLUGIN AUTHORS NOTE diff --git a/mobile/assets/plugins/minimap.user.js b/mobile/assets/plugins/minimap.user.js index e2f70c71a..d38ae2405 100644 --- a/mobile/assets/plugins/minimap.user.js +++ b/mobile/assets/plugins/minimap.user.js @@ -2,11 +2,11 @@ // @id iitc-plugin-minimap@breunigs // @name IITC plugin: Mini map // @category Controls -// @version 0.2.0.20181030.90244 +// @version 0.2.0.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] Show a mini map on the corner of the map. +// @description [mobile-2018-11-01-060209] Show a mini map on the corner of the map. // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* @@ -26,7 +26,7 @@ if(typeof window.plugin !== 'function') window.plugin = function() {}; //PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! //(leaving them in place might break the 'About IITC' page or break update checks) plugin_info.buildName = 'mobile'; -plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.dateTimeVersion = '20181101.60209'; plugin_info.pluginId = 'minimap'; //END PLUGIN AUTHORS NOTE diff --git a/mobile/assets/plugins/missions.user.js b/mobile/assets/plugins/missions.user.js index 361f0f6bf..31dfb946b 100644 --- a/mobile/assets/plugins/missions.user.js +++ b/mobile/assets/plugins/missions.user.js @@ -2,11 +2,11 @@ // @id iitc-plugin-missions@jonatkins // @name IITC plugin: Missions // @category Info -// @version 0.1.2.20181030.90244 +// @version 0.1.2.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] View missions. Marking progress on waypoints/missions basis. Showing mission paths on the map. +// @description [mobile-2018-11-01-060209] View missions. Marking progress on waypoints/missions basis. Showing mission paths on the map. // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* @@ -26,7 +26,7 @@ if(typeof window.plugin !== 'function') window.plugin = function() {}; //PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! //(leaving them in place might break the 'About IITC' page or break update checks) plugin_info.buildName = 'mobile'; -plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.dateTimeVersion = '20181101.60209'; plugin_info.pluginId = 'missions'; //END PLUGIN AUTHORS NOTE diff --git a/mobile/assets/plugins/pan-control.user.js b/mobile/assets/plugins/pan-control.user.js index 951a5f565..0832468e8 100644 --- a/mobile/assets/plugins/pan-control.user.js +++ b/mobile/assets/plugins/pan-control.user.js @@ -2,11 +2,11 @@ // @id iitc-plugin-pan-control@fragger // @name IITC plugin: pan control // @category Controls -// @version 0.1.1.20181030.90244 +// @version 0.1.1.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] Show a panning control on the map. +// @description [mobile-2018-11-01-060209] Show a panning control on the map. // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* @@ -26,7 +26,7 @@ if(typeof window.plugin !== 'function') window.plugin = function() {}; //PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! //(leaving them in place might break the 'About IITC' page or break update checks) plugin_info.buildName = 'mobile'; -plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.dateTimeVersion = '20181101.60209'; plugin_info.pluginId = 'pan-control'; //END PLUGIN AUTHORS NOTE diff --git a/mobile/assets/plugins/periodic-refresh.user.js b/mobile/assets/plugins/periodic-refresh.user.js index 2b2c97187..af8832e44 100644 --- a/mobile/assets/plugins/periodic-refresh.user.js +++ b/mobile/assets/plugins/periodic-refresh.user.js @@ -2,7 +2,7 @@ // @id iitc-plugin-periodic-refresh // @name IITC plugin: Periodic refresh // @category Tweaks -// @version 0.1.0.20181030.90244 +// @version 0.1.0.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none @@ -26,7 +26,7 @@ if(typeof window.plugin !== 'function') window.plugin = function() {}; //PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! //(leaving them in place might break the 'About IITC' page or break update checks) plugin_info.buildName = 'mobile'; -plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.dateTimeVersion = '20181101.60209'; plugin_info.pluginId = 'periodic-refresh'; //END PLUGIN AUTHORS NOTE diff --git a/mobile/assets/plugins/player-tracker.user.js b/mobile/assets/plugins/player-tracker.user.js index f15757466..02fa5e03d 100644 --- a/mobile/assets/plugins/player-tracker.user.js +++ b/mobile/assets/plugins/player-tracker.user.js @@ -2,11 +2,11 @@ // @id iitc-plugin-player-tracker@breunigs // @name IITC Plugin: Player tracker // @category Layer -// @version 0.11.1.20181030.90244 +// @version 0.11.1.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] Draw trails for the path a user took onto the map based on status messages in COMMs. Uses up to three hours of data. Does not request chat data on its own, even if that would be useful. +// @description [mobile-2018-11-01-060209] Draw trails for the path a user took onto the map based on status messages in COMMs. Uses up to three hours of data. Does not request chat data on its own, even if that would be useful. // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* @@ -26,7 +26,7 @@ if(typeof window.plugin !== 'function') window.plugin = function() {}; //PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! //(leaving them in place might break the 'About IITC' page or break update checks) plugin_info.buildName = 'mobile'; -plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.dateTimeVersion = '20181101.60209'; plugin_info.pluginId = 'player-tracker'; //END PLUGIN AUTHORS NOTE diff --git a/mobile/assets/plugins/players-portal-pictures.user.js b/mobile/assets/plugins/players-portal-pictures.user.js index a2089c2a2..0e1559e21 100644 --- a/mobile/assets/plugins/players-portal-pictures.user.js +++ b/mobile/assets/plugins/players-portal-pictures.user.js @@ -1,12 +1,12 @@ // ==UserScript== // @id iitc-plugin-players-portal-pictures // @name IITC plugin: Player's Portal Pictures -// @version 0.1.0.20181030.90244 +// @version 0.1.0.20181101.60209 // @category Deleted // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] Niantic removed the data this plugin needed. It is no longer possible to search for photo submitter. +// @description [mobile-2018-11-01-060209] Niantic removed the data this plugin needed. It is no longer possible to search for photo submitter. // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* diff --git a/mobile/assets/plugins/players-resonators.user.js b/mobile/assets/plugins/players-resonators.user.js index 2bb4fe19d..f80611627 100644 --- a/mobile/assets/plugins/players-resonators.user.js +++ b/mobile/assets/plugins/players-resonators.user.js @@ -2,7 +2,7 @@ // @id iitc-plugin-players-resonators@rbino // @name IITC plugin: Player's Resonators // @category Deleted -// @version 0.1.5.20181030.90244 +// @version 0.1.5.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none diff --git a/mobile/assets/plugins/portal-counts.user.js b/mobile/assets/plugins/portal-counts.user.js index 10886e3f7..071d29f73 100644 --- a/mobile/assets/plugins/portal-counts.user.js +++ b/mobile/assets/plugins/portal-counts.user.js @@ -2,11 +2,11 @@ // @id iitc-plugin-portals-count@yenky // @name IITC plugin: Show total counts of portals // @category Info -// @version 0.1.2.20181030.90244 +// @version 0.1.2.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] Display a list of all localized portals by level and faction. +// @description [mobile-2018-11-01-060209] Display a list of all localized portals by level and faction. // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* @@ -26,7 +26,7 @@ if(typeof window.plugin !== 'function') window.plugin = function() {}; //PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! //(leaving them in place might break the 'About IITC' page or break update checks) plugin_info.buildName = 'mobile'; -plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.dateTimeVersion = '20181101.60209'; plugin_info.pluginId = 'portal-counts'; //END PLUGIN AUTHORS NOTE diff --git a/mobile/assets/plugins/portal-defense.user.js b/mobile/assets/plugins/portal-defense.user.js index bf09c173a..e24f84af4 100644 --- a/mobile/assets/plugins/portal-defense.user.js +++ b/mobile/assets/plugins/portal-defense.user.js @@ -2,7 +2,7 @@ // @id iitc-plugin-defense@gluckies // @name IITC plugin: portal defense // @category Deleted -// @version 0.2.2.20181030.90244 +// @version 0.2.2.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none diff --git a/mobile/assets/plugins/portal-highlighter-bad-deployment-distance.user.js b/mobile/assets/plugins/portal-highlighter-bad-deployment-distance.user.js index 740463689..bdf947ff6 100644 --- a/mobile/assets/plugins/portal-highlighter-bad-deployment-distance.user.js +++ b/mobile/assets/plugins/portal-highlighter-bad-deployment-distance.user.js @@ -2,7 +2,7 @@ // @id iitc-plugin-highlight-bad-deployment-distance@cathesaurus // @name IITC plugin: highlight badly-deployed portals // @category Deleted -// @version 0.1.1.20181030.90244 +// @version 0.1.1.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none diff --git a/mobile/assets/plugins/portal-highlighter-can-make-level.user.js b/mobile/assets/plugins/portal-highlighter-can-make-level.user.js index c598a23ca..c2c5a0a7b 100644 --- a/mobile/assets/plugins/portal-highlighter-can-make-level.user.js +++ b/mobile/assets/plugins/portal-highlighter-can-make-level.user.js @@ -2,7 +2,7 @@ // @id iitc-plugin-highlight-portals-upgrade@vita10gy // @name IITC plugin: highlight portals you can upgrade to a specific level // @category Deleted -// @version 0.1.0.20181030.90244 +// @version 0.1.0.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none diff --git a/mobile/assets/plugins/portal-highlighter-debug.user.js b/mobile/assets/plugins/portal-highlighter-debug.user.js index 7126a34fb..00b9bc1b9 100644 --- a/mobile/assets/plugins/portal-highlighter-debug.user.js +++ b/mobile/assets/plugins/portal-highlighter-debug.user.js @@ -2,11 +2,11 @@ // @id iitc-plugin-highlight-portals-debug // @name IITC plugin: Debug: Highlighers // @category Debug -// @version 0.1.0.20181030.90244 +// @version 0.1.0.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] Various debug and/or temporary highlighters. Will change over time as needed. +// @description [mobile-2018-11-01-060209] Various debug and/or temporary highlighters. Will change over time as needed. // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* @@ -26,7 +26,7 @@ if(typeof window.plugin !== 'function') window.plugin = function() {}; //PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! //(leaving them in place might break the 'About IITC' page or break update checks) plugin_info.buildName = 'mobile'; -plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.dateTimeVersion = '20181101.60209'; plugin_info.pluginId = 'portal-highlighter-debug'; //END PLUGIN AUTHORS NOTE diff --git a/mobile/assets/plugins/portal-highlighter-forgotten.user.js b/mobile/assets/plugins/portal-highlighter-forgotten.user.js index 1fb3de8fb..582c127a1 100644 --- a/mobile/assets/plugins/portal-highlighter-forgotten.user.js +++ b/mobile/assets/plugins/portal-highlighter-forgotten.user.js @@ -2,11 +2,11 @@ // @id iitc-plugin-highlight-forgotten@jonatkins // @name IITC plugin: Inactive portals. Hightlight unclaimed portals with no recent activity // @category Highlighter -// @version 0.1.0.20181030.90244 +// @version 0.1.0.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] Use the portal fill color to denote if the portal is unclaimed with no recent activity. Shades of red from one week to one month, then tinted to purple for longer. May also highlight captured portals that are stuck and fail to decay every 24 hours. +// @description [mobile-2018-11-01-060209] Use the portal fill color to denote if the portal is unclaimed with no recent activity. Shades of red from one week to one month, then tinted to purple for longer. May also highlight captured portals that are stuck and fail to decay every 24 hours. // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* @@ -26,7 +26,7 @@ if(typeof window.plugin !== 'function') window.plugin = function() {}; //PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! //(leaving them in place might break the 'About IITC' page or break update checks) plugin_info.buildName = 'mobile'; -plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.dateTimeVersion = '20181101.60209'; plugin_info.pluginId = 'portal-highlighter-forgotten'; //END PLUGIN AUTHORS NOTE diff --git a/mobile/assets/plugins/portal-highlighter-hide-team.user.js b/mobile/assets/plugins/portal-highlighter-hide-team.user.js index f6c29bb94..d22907426 100644 --- a/mobile/assets/plugins/portal-highlighter-hide-team.user.js +++ b/mobile/assets/plugins/portal-highlighter-hide-team.user.js @@ -2,11 +2,11 @@ // @id iitc-plugin-highlight-hide-team@vita10gy // @name IITC plugin: Hide portal ownership // @category Highlighter -// @version 0.1.1.20181030.90244 +// @version 0.1.1.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] Show all portals as neutral, as if uncaptured. Great for creating plans. +// @description [mobile-2018-11-01-060209] Show all portals as neutral, as if uncaptured. Great for creating plans. // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* @@ -26,7 +26,7 @@ if(typeof window.plugin !== 'function') window.plugin = function() {}; //PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! //(leaving them in place might break the 'About IITC' page or break update checks) plugin_info.buildName = 'mobile'; -plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.dateTimeVersion = '20181101.60209'; plugin_info.pluginId = 'portal-highlighter-hide-team'; //END PLUGIN AUTHORS NOTE diff --git a/mobile/assets/plugins/portal-highlighter-high-level.user.js b/mobile/assets/plugins/portal-highlighter-high-level.user.js index bb1b52fc8..84f8e822e 100644 --- a/mobile/assets/plugins/portal-highlighter-high-level.user.js +++ b/mobile/assets/plugins/portal-highlighter-high-level.user.js @@ -2,11 +2,11 @@ // @id iitc-plugin-highlight-portals-high-level // @name IITC plugin: highlight high level portals // @category Highlighter -// @version 0.1.0.20181030.90244 +// @version 0.1.0.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] Use the portal fill color to denote high level portals: Purple L8, Red L7, Orange L6 +// @description [mobile-2018-11-01-060209] Use the portal fill color to denote high level portals: Purple L8, Red L7, Orange L6 // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* @@ -26,7 +26,7 @@ if(typeof window.plugin !== 'function') window.plugin = function() {}; //PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! //(leaving them in place might break the 'About IITC' page or break update checks) plugin_info.buildName = 'mobile'; -plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.dateTimeVersion = '20181101.60209'; plugin_info.pluginId = 'portal-highlighter-high-level'; //END PLUGIN AUTHORS NOTE diff --git a/mobile/assets/plugins/portal-highlighter-imminent-decay.user.js b/mobile/assets/plugins/portal-highlighter-imminent-decay.user.js index e417b29e3..3d28d3a1b 100644 --- a/mobile/assets/plugins/portal-highlighter-imminent-decay.user.js +++ b/mobile/assets/plugins/portal-highlighter-imminent-decay.user.js @@ -2,7 +2,7 @@ // @id iitc-plugin-highlight-imminent-decay@cathesaurus // @name IITC plugin: highlight portals with resonators about to decay // @category Deleted -// @version 0.1.0.20181030.90244 +// @version 0.1.0.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none diff --git a/mobile/assets/plugins/portal-highlighter-infrastructure.user.js b/mobile/assets/plugins/portal-highlighter-infrastructure.user.js index a484c5472..baef52c7d 100644 --- a/mobile/assets/plugins/portal-highlighter-infrastructure.user.js +++ b/mobile/assets/plugins/portal-highlighter-infrastructure.user.js @@ -2,11 +2,11 @@ // @id iitc-plugin-highlight-portal-infrastructure@vita10gy // @name IITC plugin: highlight portals with infrastructure problems // @category Highlighter -// @version 0.2.1.20181030.90244 +// @version 0.2.1.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] Use the portal fill color to denote if the portal has any infrastructure problems. Red: no picture. Yellow: potential title issue. Orange: both of these. +// @description [mobile-2018-11-01-060209] Use the portal fill color to denote if the portal has any infrastructure problems. Red: no picture. Yellow: potential title issue. Orange: both of these. // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* @@ -26,7 +26,7 @@ if(typeof window.plugin !== 'function') window.plugin = function() {}; //PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! //(leaving them in place might break the 'About IITC' page or break update checks) plugin_info.buildName = 'mobile'; -plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.dateTimeVersion = '20181101.60209'; plugin_info.pluginId = 'portal-highlighter-infrastructure'; //END PLUGIN AUTHORS NOTE diff --git a/mobile/assets/plugins/portal-highlighter-level-color.user.js b/mobile/assets/plugins/portal-highlighter-level-color.user.js index 10071baf4..54d87d091 100644 --- a/mobile/assets/plugins/portal-highlighter-level-color.user.js +++ b/mobile/assets/plugins/portal-highlighter-level-color.user.js @@ -2,11 +2,11 @@ // @id iitc-plugin-highlight-portals-level-color@vita10gy // @name IITC plugin: highlight portals by level color // @category Highlighter -// @version 0.1.2.20181030.90244 +// @version 0.1.2.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] Use the portal fill color to denote the portal level by using the game level colors. +// @description [mobile-2018-11-01-060209] Use the portal fill color to denote the portal level by using the game level colors. // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* @@ -26,7 +26,7 @@ if(typeof window.plugin !== 'function') window.plugin = function() {}; //PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! //(leaving them in place might break the 'About IITC' page or break update checks) plugin_info.buildName = 'mobile'; -plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.dateTimeVersion = '20181101.60209'; plugin_info.pluginId = 'portal-highlighter-level-color'; //END PLUGIN AUTHORS NOTE diff --git a/mobile/assets/plugins/portal-highlighter-missing-resonators.user.js b/mobile/assets/plugins/portal-highlighter-missing-resonators.user.js index 2e4897fa6..f0af1cd22 100644 --- a/mobile/assets/plugins/portal-highlighter-missing-resonators.user.js +++ b/mobile/assets/plugins/portal-highlighter-missing-resonators.user.js @@ -2,11 +2,11 @@ // @id iitc-plugin-highlight-portals-missing-resonators@vita10gy // @name IITC plugin: highlight portals missing resonators // @category Highlighter -// @version 0.1.2.20181030.90244 +// @version 0.1.2.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] Use the portal fill color to denote if the portal is missing resonators. +// @description [mobile-2018-11-01-060209] Use the portal fill color to denote if the portal is missing resonators. // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* @@ -26,7 +26,7 @@ if(typeof window.plugin !== 'function') window.plugin = function() {}; //PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! //(leaving them in place might break the 'About IITC' page or break update checks) plugin_info.buildName = 'mobile'; -plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.dateTimeVersion = '20181101.60209'; plugin_info.pluginId = 'portal-highlighter-missing-resonators'; //END PLUGIN AUTHORS NOTE diff --git a/mobile/assets/plugins/portal-highlighter-mitigation.user.js b/mobile/assets/plugins/portal-highlighter-mitigation.user.js index 45292a56d..0e11ee6b1 100644 --- a/mobile/assets/plugins/portal-highlighter-mitigation.user.js +++ b/mobile/assets/plugins/portal-highlighter-mitigation.user.js @@ -2,7 +2,7 @@ // @id iitc-plugin-highlight-mitigation@jonatkins // @name IITC plugin: hightlight portals total mitigation // @category Deleted -// @version 0.1.1.20181030.90244 +// @version 0.1.1.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none diff --git a/mobile/assets/plugins/portal-highlighter-mods.user.js b/mobile/assets/plugins/portal-highlighter-mods.user.js index 22ec064fa..5c9c6709d 100644 --- a/mobile/assets/plugins/portal-highlighter-mods.user.js +++ b/mobile/assets/plugins/portal-highlighter-mods.user.js @@ -2,7 +2,7 @@ // @id iitc-plugin-highlight-portals-mods@vita10gy // @name IITC plugin: highlight portal mods // @category Deleted -// @version 0.1.0.20181030.90244 +// @version 0.1.0.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none diff --git a/mobile/assets/plugins/portal-highlighter-my-8-portals.user.js b/mobile/assets/plugins/portal-highlighter-my-8-portals.user.js index 170108c12..f32b5fc1a 100644 --- a/mobile/assets/plugins/portal-highlighter-my-8-portals.user.js +++ b/mobile/assets/plugins/portal-highlighter-my-8-portals.user.js @@ -2,7 +2,7 @@ // @id iitc-plugin-highlight-portals-my-8-portals@vita10gy // @name IITC plugin: highlight my level 8's on portals // @category Deleted -// @version 0.1.0.20181030.90244 +// @version 0.1.0.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none diff --git a/mobile/assets/plugins/portal-highlighter-my-portals.user.js b/mobile/assets/plugins/portal-highlighter-my-portals.user.js index 32b509019..3f7def03c 100644 --- a/mobile/assets/plugins/portal-highlighter-my-portals.user.js +++ b/mobile/assets/plugins/portal-highlighter-my-portals.user.js @@ -2,7 +2,7 @@ // @id iitc-plugin-highlight-portals-my-portals@vita10gy // @name IITC plugin: highlight my portals // @category Deleted -// @version 0.1.1.20181030.90244 +// @version 0.1.1.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none diff --git a/mobile/assets/plugins/portal-highlighter-needs-recharge.user.js b/mobile/assets/plugins/portal-highlighter-needs-recharge.user.js index 3b59515e8..4e33d3581 100644 --- a/mobile/assets/plugins/portal-highlighter-needs-recharge.user.js +++ b/mobile/assets/plugins/portal-highlighter-needs-recharge.user.js @@ -2,11 +2,11 @@ // @id iitc-plugin-highlight-needs-recharge@vita10gy // @name IITC plugin: hightlight portals that need recharging // @category Highlighter -// @version 0.1.2.20181030.90244 +// @version 0.1.2.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] Use the portal fill color to denote if the portal needs recharging and how much. Yellow: above 85%. Orange: above 50%. Red: above 15%. Magenta: below 15%. +// @description [mobile-2018-11-01-060209] Use the portal fill color to denote if the portal needs recharging and how much. Yellow: above 85%. Orange: above 50%. Red: above 15%. Magenta: below 15%. // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* @@ -26,7 +26,7 @@ if(typeof window.plugin !== 'function') window.plugin = function() {}; //PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! //(leaving them in place might break the 'About IITC' page or break update checks) plugin_info.buildName = 'mobile'; -plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.dateTimeVersion = '20181101.60209'; plugin_info.pluginId = 'portal-highlighter-needs-recharge'; //END PLUGIN AUTHORS NOTE diff --git a/mobile/assets/plugins/portal-highlighter-ornaments.user.js b/mobile/assets/plugins/portal-highlighter-ornaments.user.js index c623e18cd..0dc0677e8 100644 --- a/mobile/assets/plugins/portal-highlighter-ornaments.user.js +++ b/mobile/assets/plugins/portal-highlighter-ornaments.user.js @@ -2,11 +2,11 @@ // @id iitc-plugin-highlight-ornaments@jonatkins // @name IITC plugin: hightlight portals with ornaments // @category Highlighter -// @version 0.0.1.20181030.90244 +// @version 0.0.1.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] Use the portal fill color to denote portals with additional 'ornament' markers. e.g. Anomaly portals +// @description [mobile-2018-11-01-060209] Use the portal fill color to denote portals with additional 'ornament' markers. e.g. Anomaly portals // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* @@ -26,7 +26,7 @@ if(typeof window.plugin !== 'function') window.plugin = function() {}; //PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! //(leaving them in place might break the 'About IITC' page or break update checks) plugin_info.buildName = 'mobile'; -plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.dateTimeVersion = '20181101.60209'; plugin_info.pluginId = 'portal-highlighter-ornaments'; //END PLUGIN AUTHORS NOTE diff --git a/mobile/assets/plugins/portal-highlighter-outbound-link-counter.user.js b/mobile/assets/plugins/portal-highlighter-outbound-link-counter.user.js index 6f4419a36..828905a1d 100644 --- a/mobile/assets/plugins/portal-highlighter-outbound-link-counter.user.js +++ b/mobile/assets/plugins/portal-highlighter-outbound-link-counter.user.js @@ -2,7 +2,7 @@ // @id iitc-plugin-highlight-outbound-link-counter@cathesaurus // @name IITC plugin: highlight portals running low on outbound links // @category Deleted -// @version 0.1.0.20181030.90244 +// @version 0.1.0.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none diff --git a/mobile/assets/plugins/portal-highlighter-portal-ap-energy-relative.user.js b/mobile/assets/plugins/portal-highlighter-portal-ap-energy-relative.user.js index ca517af23..1264a6bdc 100644 --- a/mobile/assets/plugins/portal-highlighter-portal-ap-energy-relative.user.js +++ b/mobile/assets/plugins/portal-highlighter-portal-ap-energy-relative.user.js @@ -2,7 +2,7 @@ // @id iitc-plugin-highlight-portals-by-ap-by-energy-relative@vita10gy // @name IITC plugin: highlight portals by ap/energy (relative) // @category Deleted -// @version 0.1.1.20181030.90244 +// @version 0.1.1.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none diff --git a/mobile/assets/plugins/portal-highlighter-portal-ap-relative.user.js b/mobile/assets/plugins/portal-highlighter-portal-ap-relative.user.js index 978e563c9..5630c7a93 100644 --- a/mobile/assets/plugins/portal-highlighter-portal-ap-relative.user.js +++ b/mobile/assets/plugins/portal-highlighter-portal-ap-relative.user.js @@ -2,7 +2,7 @@ // @id iitc-plugin-highlight-portals-by-ap-relative@vita10gy // @name IITC plugin: highlight portals by ap relative // @category Deleted -// @version 0.1.1.20181030.90244 +// @version 0.1.1.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none diff --git a/mobile/assets/plugins/portal-highlighter-portal-ap.user.js b/mobile/assets/plugins/portal-highlighter-portal-ap.user.js index 74e108cf2..895f83bf3 100644 --- a/mobile/assets/plugins/portal-highlighter-portal-ap.user.js +++ b/mobile/assets/plugins/portal-highlighter-portal-ap.user.js @@ -2,7 +2,7 @@ // @id iitc-plugin-highlight-portals-by-ap@vita10gy // @name IITC plugin: highlight portals by ap // @category Deleted -// @version 0.1.1.20181030.90244 +// @version 0.1.1.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none diff --git a/mobile/assets/plugins/portal-highlighter-portals-my-level.user.js b/mobile/assets/plugins/portal-highlighter-portals-my-level.user.js index fd824510d..d637ef565 100644 --- a/mobile/assets/plugins/portal-highlighter-portals-my-level.user.js +++ b/mobile/assets/plugins/portal-highlighter-portals-my-level.user.js @@ -2,11 +2,11 @@ // @id iitc-plugin-highlight-portals-my-level@vita10gy // @name IITC plugin: highlight portals by my level // @category Highlighter -// @version 0.1.2.20181030.90244 +// @version 0.1.2.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] Use the portal fill color to denote if the portal is either at and above, or at and below your level. +// @description [mobile-2018-11-01-060209] Use the portal fill color to denote if the portal is either at and above, or at and below your level. // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* @@ -26,7 +26,7 @@ if(typeof window.plugin !== 'function') window.plugin = function() {}; //PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! //(leaving them in place might break the 'About IITC' page or break update checks) plugin_info.buildName = 'mobile'; -plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.dateTimeVersion = '20181101.60209'; plugin_info.pluginId = 'portal-highlighter-portals-my-level'; //END PLUGIN AUTHORS NOTE diff --git a/mobile/assets/plugins/portal-highlighter-portals-upgrade.user.js b/mobile/assets/plugins/portal-highlighter-portals-upgrade.user.js index a2fa9cac8..f8553de15 100644 --- a/mobile/assets/plugins/portal-highlighter-portals-upgrade.user.js +++ b/mobile/assets/plugins/portal-highlighter-portals-upgrade.user.js @@ -2,7 +2,7 @@ // @id iitc-plugin-highlight-portals-upgrade@vita10gy // @name IITC plugin: highlight portals you can upgrade // @category Deleted -// @version 0.2.0.20181030.90244 +// @version 0.2.0.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none diff --git a/mobile/assets/plugins/portal-highlighter-with-lvl8-resonators.user.js b/mobile/assets/plugins/portal-highlighter-with-lvl8-resonators.user.js index d3da67acf..5edbbb302 100644 --- a/mobile/assets/plugins/portal-highlighter-with-lvl8-resonators.user.js +++ b/mobile/assets/plugins/portal-highlighter-with-lvl8-resonators.user.js @@ -2,7 +2,7 @@ // @id iitc-plugin-highlight-portals-with-L8-resonators@superd // @name IITC plugin: highlight portals with L8 resonators // @category Deleted -// @version 0.1.0.20181030.90244 +// @version 0.1.0.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none diff --git a/mobile/assets/plugins/portal-level-numbers.user.js b/mobile/assets/plugins/portal-level-numbers.user.js index c7b1d2269..86b49ef6f 100644 --- a/mobile/assets/plugins/portal-level-numbers.user.js +++ b/mobile/assets/plugins/portal-level-numbers.user.js @@ -2,11 +2,11 @@ // @id iitc-plugin-portal-level-numbers@rongou // @name IITC plugin: Portal Level Numbers // @category Layer -// @version 0.1.5.20181030.90244 +// @version 0.1.5.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] Show portal level numbers on map. +// @description [mobile-2018-11-01-060209] Show portal level numbers on map. // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* @@ -26,7 +26,7 @@ if(typeof window.plugin !== 'function') window.plugin = function() {}; //PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! //(leaving them in place might break the 'About IITC' page or break update checks) plugin_info.buildName = 'mobile'; -plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.dateTimeVersion = '20181101.60209'; plugin_info.pluginId = 'portal-level-numbers'; //END PLUGIN AUTHORS NOTE diff --git a/mobile/assets/plugins/portal-names.user.js b/mobile/assets/plugins/portal-names.user.js index 3a9cb1e8d..24258ca20 100644 --- a/mobile/assets/plugins/portal-names.user.js +++ b/mobile/assets/plugins/portal-names.user.js @@ -2,11 +2,11 @@ // @id iitc-plugin-portal-names@zaso // @name IITC plugin: Portal Names // @category Layer -// @version 0.1.6.20181030.90244 +// @version 0.1.6.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] Show portal names on the map. +// @description [mobile-2018-11-01-060209] Show portal names on the map. // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* @@ -26,7 +26,7 @@ if(typeof window.plugin !== 'function') window.plugin = function() {}; //PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! //(leaving them in place might break the 'About IITC' page or break update checks) plugin_info.buildName = 'mobile'; -plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.dateTimeVersion = '20181101.60209'; plugin_info.pluginId = 'portal-names'; //END PLUGIN AUTHORS NOTE diff --git a/mobile/assets/plugins/portals-list.user.js b/mobile/assets/plugins/portals-list.user.js index 1a96f8410..3599a089e 100644 --- a/mobile/assets/plugins/portals-list.user.js +++ b/mobile/assets/plugins/portals-list.user.js @@ -2,11 +2,11 @@ // @id iitc-plugin-portals-list@teo96 // @name IITC plugin: show list of portals // @category Info -// @version 0.2.1.20181030.90244 +// @version 0.2.1.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] Display a sortable list of all visible portals with full details about the team, resonators, links, etc. +// @description [mobile-2018-11-01-060209] Display a sortable list of all visible portals with full details about the team, resonators, links, etc. // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* @@ -26,7 +26,7 @@ if(typeof window.plugin !== 'function') window.plugin = function() {}; //PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! //(leaving them in place might break the 'About IITC' page or break update checks) plugin_info.buildName = 'mobile'; -plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.dateTimeVersion = '20181101.60209'; plugin_info.pluginId = 'portals-list'; //END PLUGIN AUTHORS NOTE diff --git a/mobile/assets/plugins/privacy-view.user.js b/mobile/assets/plugins/privacy-view.user.js index 400536e49..13ac098a8 100644 --- a/mobile/assets/plugins/privacy-view.user.js +++ b/mobile/assets/plugins/privacy-view.user.js @@ -1,9 +1,9 @@ // ==UserScript== // @id iitc-plugin-privacy-view@Scrool // @name IITC plugin: Privacy view on Intel -// @version 1.0.1.20181030.90244 +// @version 1.0.1.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion -// @description [mobile-2018-10-30-090244] Hide info from intel which shouldn't leak to players of the other faction. +// @description [mobile-2018-11-01-060209] Hide info from intel which shouldn't leak to players of the other faction. // @updateURL none // @downloadURL none // @include https://*.ingress.com/intel* @@ -25,7 +25,7 @@ if(typeof window.plugin !== 'function') window.plugin = function() {}; //PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! //(leaving them in place might break the 'About IITC' page or break update checks) plugin_info.buildName = 'mobile'; -plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.dateTimeVersion = '20181101.60209'; plugin_info.pluginId = 'privacy-view'; //END PLUGIN AUTHORS NOTE diff --git a/mobile/assets/plugins/regions.user.js b/mobile/assets/plugins/regions.user.js index 92eb4019d..227baca5f 100644 --- a/mobile/assets/plugins/regions.user.js +++ b/mobile/assets/plugins/regions.user.js @@ -2,11 +2,11 @@ // @id iitc-plugin-regions@jonatkins // @name IITC plugin: Show the local score regions // @category Layer -// @version 0.1.2.20181030.90244 +// @version 0.1.2.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] Show the local scoring regions on the map. No actual scores - just the region areas. +// @description [mobile-2018-11-01-060209] Show the local scoring regions on the map. No actual scores - just the region areas. // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* @@ -26,7 +26,7 @@ if(typeof window.plugin !== 'function') window.plugin = function() {}; //PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! //(leaving them in place might break the 'About IITC' page or break update checks) plugin_info.buildName = 'mobile'; -plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.dateTimeVersion = '20181101.60209'; plugin_info.pluginId = 'regions'; //END PLUGIN AUTHORS NOTE diff --git a/mobile/assets/plugins/render-limit-increase.user.js b/mobile/assets/plugins/render-limit-increase.user.js index 657ae92e8..81647206b 100644 --- a/mobile/assets/plugins/render-limit-increase.user.js +++ b/mobile/assets/plugins/render-limit-increase.user.js @@ -2,11 +2,11 @@ // @id iitc-plugin-render-limit-increase@jonatkins // @name IITC plugin: render limit increase // @category Deleted -// @version 0.4.0.20181030.90244 +// @version 0.4.0.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] IITC no longer has simple render limits that can be adjusted - many more portals are now displayed without any increases required. +// @description [mobile-2018-11-01-060209] IITC no longer has simple render limits that can be adjusted - many more portals are now displayed without any increases required. // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* diff --git a/mobile/assets/plugins/reso-energy-pct-in-portal-detail.user.js b/mobile/assets/plugins/reso-energy-pct-in-portal-detail.user.js index 58674ef51..4d97a22c8 100644 --- a/mobile/assets/plugins/reso-energy-pct-in-portal-detail.user.js +++ b/mobile/assets/plugins/reso-energy-pct-in-portal-detail.user.js @@ -2,11 +2,11 @@ // @id iitc-plugin-reso-energy-pct-in-portal-detail@xelio // @name IITC plugin: reso energy pct in portal detail // @category Portal Info -// @version 0.1.2.20181030.90244 +// @version 0.1.2.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] Show resonator energy percentage on resonator energy bar in portal detail panel. +// @description [mobile-2018-11-01-060209] Show resonator energy percentage on resonator energy bar in portal detail panel. // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* @@ -26,7 +26,7 @@ if(typeof window.plugin !== 'function') window.plugin = function() {}; //PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! //(leaving them in place might break the 'About IITC' page or break update checks) plugin_info.buildName = 'mobile'; -plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.dateTimeVersion = '20181101.60209'; plugin_info.pluginId = 'reso-energy-pct-in-portal-detail'; //END PLUGIN AUTHORS NOTE diff --git a/mobile/assets/plugins/resonator-display-zoom-level-decrease.user.js b/mobile/assets/plugins/resonator-display-zoom-level-decrease.user.js index 74415790f..cf8c9a86b 100644 --- a/mobile/assets/plugins/resonator-display-zoom-level-decrease.user.js +++ b/mobile/assets/plugins/resonator-display-zoom-level-decrease.user.js @@ -2,11 +2,11 @@ // @id iitc-plugin-resonator-display-zoom-level-decrease@xelio // @name IITC plugin: resonator display zoom level decrease // @category Deleted -// @version 1.0.2.20181030.90244 +// @version 1.0.2.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] Resonator display distance is no longer an option set with a plugin. With the 'draw-resonators' plugin you can now turn on/off resonators in the layer chooser instead. +// @description [mobile-2018-11-01-060209] Resonator display distance is no longer an option set with a plugin. With the 'draw-resonators' plugin you can now turn on/off resonators in the layer chooser instead. // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* diff --git a/mobile/assets/plugins/scale-bar.user.js b/mobile/assets/plugins/scale-bar.user.js index da600f67d..080c5f362 100644 --- a/mobile/assets/plugins/scale-bar.user.js +++ b/mobile/assets/plugins/scale-bar.user.js @@ -2,11 +2,11 @@ // @id iitc-plugin-scale-bar@breunigs // @name IITC plugin: scale bar // @category Controls -// @version 0.1.0.20181030.90244 +// @version 0.1.0.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] Show scale bar on the map. +// @description [mobile-2018-11-01-060209] Show scale bar on the map. // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* @@ -26,7 +26,7 @@ if(typeof window.plugin !== 'function') window.plugin = function() {}; //PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! //(leaving them in place might break the 'About IITC' page or break update checks) plugin_info.buildName = 'mobile'; -plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.dateTimeVersion = '20181101.60209'; plugin_info.pluginId = 'scale-bar'; //END PLUGIN AUTHORS NOTE diff --git a/mobile/assets/plugins/score-cycle-times.user.js b/mobile/assets/plugins/score-cycle-times.user.js index 49cdabbca..b20b315b6 100644 --- a/mobile/assets/plugins/score-cycle-times.user.js +++ b/mobile/assets/plugins/score-cycle-times.user.js @@ -2,11 +2,11 @@ // @id iitc-plugin-score-cycle-times@jonatkins // @name IITC plugin: Show scoreboard cycle/checkpoint times // @category Info -// @version 0.1.0.20181030.90244 +// @version 0.1.0.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] Show the times used for the septicycle and checkpoints for regional scoreboards. +// @description [mobile-2018-11-01-060209] Show the times used for the septicycle and checkpoints for regional scoreboards. // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* @@ -26,7 +26,7 @@ if(typeof window.plugin !== 'function') window.plugin = function() {}; //PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! //(leaving them in place might break the 'About IITC' page or break update checks) plugin_info.buildName = 'mobile'; -plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.dateTimeVersion = '20181101.60209'; plugin_info.pluginId = 'score-cycle-times'; //END PLUGIN AUTHORS NOTE diff --git a/mobile/assets/plugins/scoreboard.user.js b/mobile/assets/plugins/scoreboard.user.js index 6a325dc8a..71160b3f6 100644 --- a/mobile/assets/plugins/scoreboard.user.js +++ b/mobile/assets/plugins/scoreboard.user.js @@ -1,12 +1,12 @@ // ==UserScript== // @id iitc-plugin-scoreboard@vita10gy // @name IITC plugin: show a localized scoreboard. -// @version 0.2.0.20181030.90244 +// @version 0.2.0.20181101.60209 // @category Info // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] Display a scoreboard about all visible portals with statistics about both teams,like average portal level,link & field counts etc. +// @description [mobile-2018-11-01-060209] Display a scoreboard about all visible portals with statistics about both teams,like average portal level,link & field counts etc. // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* @@ -27,7 +27,7 @@ if(typeof window.plugin !== 'function') window.plugin = function() {}; //PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! //(leaving them in place might break the 'About IITC' page or break update checks) plugin_info.buildName = 'mobile'; -plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.dateTimeVersion = '20181101.60209'; plugin_info.pluginId = 'scoreboard'; //END PLUGIN AUTHORS NOTE diff --git a/mobile/assets/plugins/show-address.user.js b/mobile/assets/plugins/show-address.user.js index a5521079c..c7db8e8bf 100644 --- a/mobile/assets/plugins/show-address.user.js +++ b/mobile/assets/plugins/show-address.user.js @@ -2,11 +2,11 @@ // @id iitc-plugin-show-address@vita10gy // @name IITC plugin: show portal address in sidebar // @category Deleted -// @version 0.3.0.20181030.90244 +// @version 0.3.0.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] Address no longer available, as of Niantic changes 2014-05-23 +// @description [mobile-2018-11-01-060209] Address no longer available, as of Niantic changes 2014-05-23 // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* diff --git a/mobile/assets/plugins/show-less-portals-zoomed-out.user.js b/mobile/assets/plugins/show-less-portals-zoomed-out.user.js index 0620c9372..49c6670f0 100644 --- a/mobile/assets/plugins/show-less-portals-zoomed-out.user.js +++ b/mobile/assets/plugins/show-less-portals-zoomed-out.user.js @@ -2,11 +2,11 @@ // @id iitc-plugin-show-less-portals@jonatkins // @name IITC plugin: Show less portals when zoomed out // @category Tweaks -// @version 0.3.0.20181030.90244 +// @version 0.3.0.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] Vastly reduce the detail level when zoomed out to level 11 or less (L4+ portals), to significantly reduce data usage when viewing large areas. +// @description [mobile-2018-11-01-060209] Vastly reduce the detail level when zoomed out to level 11 or less (L4+ portals), to significantly reduce data usage when viewing large areas. // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* @@ -26,7 +26,7 @@ if(typeof window.plugin !== 'function') window.plugin = function() {}; //PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! //(leaving them in place might break the 'About IITC' page or break update checks) plugin_info.buildName = 'mobile'; -plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.dateTimeVersion = '20181101.60209'; plugin_info.pluginId = 'show-less-portals-zoomed-out'; //END PLUGIN AUTHORS NOTE diff --git a/mobile/assets/plugins/show-linked-portals.user.js b/mobile/assets/plugins/show-linked-portals.user.js index 25d28289d..f6c7a195c 100644 --- a/mobile/assets/plugins/show-linked-portals.user.js +++ b/mobile/assets/plugins/show-linked-portals.user.js @@ -2,11 +2,11 @@ // @id iitc-plugin-show-linked-portals@fstopienski // @name IITC plugin: Show linked portals // @category Portal Info -// @version 0.3.1.20181030.90244 +// @version 0.3.1.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] Try to show the linked portals (image, name and link direction) in portal detail view and jump to linked portal on click. Some details may not be available if the linked portal is not in the current view. +// @description [mobile-2018-11-01-060209] Try to show the linked portals (image, name and link direction) in portal detail view and jump to linked portal on click. Some details may not be available if the linked portal is not in the current view. // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* @@ -26,7 +26,7 @@ if(typeof window.plugin !== 'function') window.plugin = function() {}; //PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! //(leaving them in place might break the 'About IITC' page or break update checks) plugin_info.buildName = 'mobile'; -plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.dateTimeVersion = '20181101.60209'; plugin_info.pluginId = 'show-linked-portals'; //END PLUGIN AUTHORS NOTE diff --git a/mobile/assets/plugins/show-more-portals.user.js b/mobile/assets/plugins/show-more-portals.user.js index 273e94466..75c2897f4 100644 --- a/mobile/assets/plugins/show-more-portals.user.js +++ b/mobile/assets/plugins/show-more-portals.user.js @@ -2,11 +2,11 @@ // @id iitc-plugin-show-more-portals@jonatkins // @name IITC plugin: Show more portals // @category Deleted -// @version 0.2.1.20181030.90244 +// @version 0.2.1.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] Standard intel has changed to show all portals from zoom level 15, which is what this plugin used to force. +// @description [mobile-2018-11-01-060209] Standard intel has changed to show all portals from zoom level 15, which is what this plugin used to force. // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* diff --git a/mobile/assets/plugins/show-portal-weakness.user.js b/mobile/assets/plugins/show-portal-weakness.user.js index d57623030..696730c89 100644 --- a/mobile/assets/plugins/show-portal-weakness.user.js +++ b/mobile/assets/plugins/show-portal-weakness.user.js @@ -2,11 +2,11 @@ // @id iitc-plugin-show-portal-weakness@vita10gy // @name IITC plugin: show portal weakness // @category Highlighter -// @version 0.7.2.20181030.90244 +// @version 0.7.2.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] Use the fill color of the portals to denote if the portal is weak. Stronger red indicates recharge required, missing resonators, or both. +// @description [mobile-2018-11-01-060209] Use the fill color of the portals to denote if the portal is weak. Stronger red indicates recharge required, missing resonators, or both. // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* @@ -26,7 +26,7 @@ if(typeof window.plugin !== 'function') window.plugin = function() {}; //PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! //(leaving them in place might break the 'About IITC' page or break update checks) plugin_info.buildName = 'mobile'; -plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.dateTimeVersion = '20181101.60209'; plugin_info.pluginId = 'show-portal-weakness'; //END PLUGIN AUTHORS NOTE diff --git a/mobile/assets/plugins/sync.user.js b/mobile/assets/plugins/sync.user.js index 01ccf8ab1..935097c3f 100644 --- a/mobile/assets/plugins/sync.user.js +++ b/mobile/assets/plugins/sync.user.js @@ -2,11 +2,11 @@ // @id iitc-plugin-sync@xelio // @name IITC plugin: Sync // @category Misc -// @version 0.2.3.20181030.90244 +// @version 0.2.3.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] Sync data between clients via Google Realtime API. Only syncs data from specific plugins (currently: Keys, Bookmarks). Sign in via the 'Sync' link. +// @description [mobile-2018-11-01-060209] Sync data between clients via Google Realtime API. Only syncs data from specific plugins (currently: Keys, Bookmarks). Sign in via the 'Sync' link. // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* @@ -26,7 +26,7 @@ if(typeof window.plugin !== 'function') window.plugin = function() {}; //PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! //(leaving them in place might break the 'About IITC' page or break update checks) plugin_info.buildName = 'mobile'; -plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.dateTimeVersion = '20181101.60209'; plugin_info.pluginId = 'sync'; //END PLUGIN AUTHORS NOTE diff --git a/mobile/assets/plugins/uniques.user.js b/mobile/assets/plugins/uniques.user.js index b547c6857..cb112ab6a 100644 --- a/mobile/assets/plugins/uniques.user.js +++ b/mobile/assets/plugins/uniques.user.js @@ -2,11 +2,11 @@ // @id iitc-plugin-uniques@3ch01c // @name IITC plugin: Uniques // @category Misc -// @version 0.2.4.20181030.90244 +// @version 0.2.4.20181101.60209 // @namespace https://github.com/3ch01c/ingress-intel-total-conversion // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] Allow manual entry of portals visited/captured. Use the 'highlighter-uniques' plugin to show the uniques on the map, and 'sync' to share between multiple browsers or desktop/mobile. It will try and guess which portals you have captured from COMM/portal details, but this will not catch every case. +// @description [mobile-2018-11-01-060209] Allow manual entry of portals visited/captured. Use the 'highlighter-uniques' plugin to show the uniques on the map, and 'sync' to share between multiple browsers or desktop/mobile. It will try and guess which portals you have captured from COMM/portal details, but this will not catch every case. // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* @@ -26,7 +26,7 @@ if(typeof window.plugin !== 'function') window.plugin = function() {}; //PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! //(leaving them in place might break the 'About IITC' page or break update checks) plugin_info.buildName = 'mobile'; -plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.dateTimeVersion = '20181101.60209'; plugin_info.pluginId = 'uniques'; //END PLUGIN AUTHORS NOTE diff --git a/mobile/assets/plugins/update-check.user.js b/mobile/assets/plugins/update-check.user.js index a0cd41a65..197960fc1 100644 --- a/mobile/assets/plugins/update-check.user.js +++ b/mobile/assets/plugins/update-check.user.js @@ -2,11 +2,11 @@ // @id iitc-plugin-update-check@jonatkins // @name IITC plugin: Check for updates // @category Misc -// @version 0.1.1.20181030.90244 +// @version 0.1.1.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] **WORK IN PROGRESS** Check for updates for IITC and plugins against http://iitc.jonatkins.com/. Can also report status messages for known IITC issues. +// @description [mobile-2018-11-01-060209] **WORK IN PROGRESS** Check for updates for IITC and plugins against http://iitc.jonatkins.com/. Can also report status messages for known IITC issues. // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* @@ -26,7 +26,7 @@ if(typeof window.plugin !== 'function') window.plugin = function() {}; //PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! //(leaving them in place might break the 'About IITC' page or break update checks) plugin_info.buildName = 'mobile'; -plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.dateTimeVersion = '20181101.60209'; plugin_info.pluginId = 'update-check'; //END PLUGIN AUTHORS NOTE diff --git a/mobile/assets/plugins/zaprange.user.js b/mobile/assets/plugins/zaprange.user.js index e6a1ecdac..6c6706a41 100644 --- a/mobile/assets/plugins/zaprange.user.js +++ b/mobile/assets/plugins/zaprange.user.js @@ -2,11 +2,11 @@ // @id iitc-plugin-zaprange@zaso // @name IITC plugin: Zaprange // @category Layer -// @version 0.1.4.20181030.90244 +// @version 0.1.4.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] Shows the maximum range of attack by the portals. +// @description [mobile-2018-11-01-060209] Shows the maximum range of attack by the portals. // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* @@ -26,7 +26,7 @@ if(typeof window.plugin !== 'function') window.plugin = function() {}; //PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! //(leaving them in place might break the 'About IITC' page or break update checks) plugin_info.buildName = 'mobile'; -plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.dateTimeVersion = '20181101.60209'; plugin_info.pluginId = 'zaprange'; //END PLUGIN AUTHORS NOTE diff --git a/mobile/assets/plugins/zoom-slider.user.js b/mobile/assets/plugins/zoom-slider.user.js index 266345488..af4f092ee 100644 --- a/mobile/assets/plugins/zoom-slider.user.js +++ b/mobile/assets/plugins/zoom-slider.user.js @@ -2,11 +2,11 @@ // @id iitc-plugin-zoom-slider@fragger // @name IITC plugin: zoom slider // @category Controls -// @version 0.1.1.20181030.90244 +// @version 0.1.1.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] Show a zoom slider on the map instead of the zoom buttons. +// @description [mobile-2018-11-01-060209] Show a zoom slider on the map instead of the zoom buttons. // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* @@ -26,7 +26,7 @@ if(typeof window.plugin !== 'function') window.plugin = function() {}; //PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! //(leaving them in place might break the 'About IITC' page or break update checks) plugin_info.buildName = 'mobile'; -plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.dateTimeVersion = '20181101.60209'; plugin_info.pluginId = 'zoom-slider'; //END PLUGIN AUTHORS NOTE diff --git a/mobile/assets/total-conversion-build.user.js b/mobile/assets/total-conversion-build.user.js index 6180cfa35..8a7301c9e 100644 --- a/mobile/assets/total-conversion-build.user.js +++ b/mobile/assets/total-conversion-build.user.js @@ -1,11 +1,11 @@ // ==UserScript== // @id ingress-intel-total-conversion@jonatkins // @name IITC: Ingress intel map total conversion -// @version 0.26.0.20181030.90244 +// @version 0.26.0.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] Total conversion for the ingress intel map. +// @description [mobile-2018-11-01-060209] Total conversion for the ingress intel map. // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* @@ -21,7 +21,7 @@ // REPLACE ORIG SITE /////////////////////////////////////////////////// if(document.getElementsByTagName('html')[0].getAttribute('itemscope') != null) throw('Ingress Intel Website is down, not a userscript issue.'); -window.iitcBuildDate = '2018-10-30-090244'; +window.iitcBuildDate = '2018-11-01-060209'; // disable vanilla JS window.onload = function() {}; @@ -1280,7 +1280,7 @@ function boot() { if(!isSmartphone()) // TODO remove completely? window.debug.console.overwriteNativeIfRequired(); - console.log('loading done, booting. Built: 2018-10-30-090244'); + console.log('loading done, booting. Built: 2018-11-01-060209'); if(window.deviceID) console.log('Your device ID: ' + window.deviceID); window.runOnSmartphonesBeforeBoot(); @@ -12724,12 +12724,12 @@ window.extractFromStock = function() { } } + if (niantic_params.CURRENT_VERSION === undefined) { dialog({ title: 'IITC Broken', html: '

    IITC failed to extract the required parameters from the intel site

    ' - +'

    This can happen after Niantic update the standard intel site. A fix will be needed from the IITC developers.


    ' - + JSON.stringify(window.niantic_params,null,2), + +'

    This can happen after Niantic update the standard intel site. A fix will be needed from the IITC developers.

    ', }); console.log('Discovered parameters'); @@ -17987,7 +17987,7 @@ L.Draggable.prototype._onDown = function(e) { // inject code into site context var script = document.createElement('script'); -var info = { buildName: 'mobile', dateTimeVersion: '20181030.90244' }; +var info = { buildName: 'mobile', dateTimeVersion: '20181101.60209' }; if (this.GM_info && this.GM_info.script) info.script = { version: GM_info.script.version, name: GM_info.script.name, description: GM_info.script.description }; script.appendChild(document.createTextNode('('+ wrapper +')('+JSON.stringify(info)+');')); (document.body || document.head || document.documentElement).appendChild(script); diff --git a/mobile/assets/user-location.user.js b/mobile/assets/user-location.user.js index f4f649ab5..713564ad9 100644 --- a/mobile/assets/user-location.user.js +++ b/mobile/assets/user-location.user.js @@ -2,11 +2,11 @@ // @id iitc-plugin-user-location@cradle // @name IITC plugin: User Location // @category Tweaks -// @version 0.2.0.20181030.90244 +// @version 0.2.0.20181101.60209 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none -// @description [mobile-2018-10-30-090244] Show user location marker on map +// @description [mobile-2018-11-01-060209] Show user location marker on map // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* @@ -26,7 +26,7 @@ if(typeof window.plugin !== 'function') window.plugin = function() {}; //PLUGIN AUTHORS: writing a plugin outside of the IITC build environment? if so, delete these lines!! //(leaving them in place might break the 'About IITC' page or break update checks) plugin_info.buildName = 'mobile'; -plugin_info.dateTimeVersion = '20181030.90244'; +plugin_info.dateTimeVersion = '20181101.60209'; plugin_info.pluginId = 'user-location'; //END PLUGIN AUTHORS NOTE diff --git a/mobile/iitcm/build.gradle b/mobile/iitcm/build.gradle index 7e8b01293..e1d8b9285 100644 --- a/mobile/iitcm/build.gradle +++ b/mobile/iitcm/build.gradle @@ -68,3 +68,15 @@ dependencies { implementation 'com.squareup.okhttp3:okhttp:3.11.0' implementation fileTree(dir: 'libs', include: ['*.jar']) } + +task copyUserscripts(type: Copy) + +copyUserscripts { + description = 'Updating prebuilt plugins' + from '../assets' + into 'src/main/assets' + include('*') + include('**/*') +} + +preBuild.dependsOn copyUserscripts \ No newline at end of file From 2465f969491b4038430dcc45399ba96bac318f30 Mon Sep 17 00:00:00 2001 From: Mike Lambert Date: Fri, 2 Nov 2018 20:48:20 +0300 Subject: [PATCH 5/9] Missions icon fixed in left drawer --- .../src/main/res/drawable-hdpi/ic_missions.png | Bin 0 -> 1015 bytes .../src/main/res/drawable-mdpi/ic_missions.png | Bin 0 -> 790 bytes .../src/main/res/drawable-xhdpi/ic_missions.png | Bin 0 -> 1418 bytes .../src/main/res/drawable-xxhdpi/ic_missions.png | Bin 0 -> 1992 bytes 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 mobile/iitcm/src/main/res/drawable-hdpi/ic_missions.png create mode 100644 mobile/iitcm/src/main/res/drawable-mdpi/ic_missions.png create mode 100644 mobile/iitcm/src/main/res/drawable-xhdpi/ic_missions.png create mode 100644 mobile/iitcm/src/main/res/drawable-xxhdpi/ic_missions.png diff --git a/mobile/iitcm/src/main/res/drawable-hdpi/ic_missions.png b/mobile/iitcm/src/main/res/drawable-hdpi/ic_missions.png new file mode 100644 index 0000000000000000000000000000000000000000..4ce992165b5a19da92b47f5515f9a1544a540fd5 GIT binary patch literal 1015 zcmV9dRBf* ziWmW70R%L8Gv-@zJwlj>y7&r0sDLqGqJV&l{Dyo&MQ9rn1d0e1@EKK6d<1;tH9|y~ zHde)FG65Z6(IcXWe255}{G#|QL~I$g9W4RV0pv~CeZsU6MZSyx=oX<7Tj%XQ0VT*o zxiZ>8{c9#(5Z9zOWR8g?BFRHJ0d>@po0!5~S;m1!@)@^mOj%>6JvMT&lN?w_{fkrb z{Uh)axCNY-@uz@;a{Ugt!S*~_24=`|A}WkxR=`zl+GN$~tB|+}915_Z$+n4ac7Neo zfdRH}cZ*8p0o3;SI&cTLhFXzvU|z=D2ae&dHg|hPHi;BNF#zgz(wE)@E8^Mb22}sN%@+c7S^;UxK`j2a9oURlI<#s z>ih%XFmMHxyc2XEXkrr7T!}THU#`CZ&&`3Z6<85xLmu+3(s%+m3oM}a{h!FT9c4PK zxe~)UbX>ihtn%Kg3)c1yvv0+VDhzlKt;bHa!3z(bj{pYE8? z+r|1|hmg*RNqe9x2Q=9hDje)2K1o&@?*ea(xi#P_-C+Z9J55(5s>wYaTDbzsmeE1f zcHpRkXk}$IRU-=_STrVCBlE#0BBsv!#)go0BIRZ-)N#_yT&e?2tm70mfOH3%cC~xVFXm7J|i)CsO}9-4Rs9E=&#CG6-MoZjqMXrNF74| l#cS4oie3MveosKJ@du13g#R;p+MWOa002ovPDHLkV1iP^x61$k literal 0 HcmV?d00001 diff --git a/mobile/iitcm/src/main/res/drawable-mdpi/ic_missions.png b/mobile/iitcm/src/main/res/drawable-mdpi/ic_missions.png new file mode 100644 index 0000000000000000000000000000000000000000..0cf7a4684d55785b711f1e30ecddb52d4d789ca1 GIT binary patch literal 790 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 a1M5FBArM~MY2obv0000 Date: Sat, 3 Nov 2018 10:32:33 +0300 Subject: [PATCH 6/9] removed mandatory signing of debug build --- mobile/build.gradle | 7 +++++++ mobile/iitcm/build.gradle | 15 +++++---------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/mobile/build.gradle b/mobile/build.gradle index 6cab2ce40..cd2970c1e 100644 --- a/mobile/build.gradle +++ b/mobile/build.gradle @@ -18,3 +18,10 @@ allprojects { jcenter() } } + +ext { + signKeyAlias = "" + signKeyPassword = "" + signKeyStore = "release.jks" + signKeyStorePassword = "" +} diff --git a/mobile/iitcm/build.gradle b/mobile/iitcm/build.gradle index e1d8b9285..3e87e8424 100644 --- a/mobile/iitcm/build.gradle +++ b/mobile/iitcm/build.gradle @@ -1,9 +1,5 @@ apply plugin: 'com.android.application'; -def keystorePropertiesFile = rootProject.file("signing.properties") -def keystoreProperties = new Properties() -keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) - def getVersionCode = { -> def git = 'git rev-list HEAD --count' @@ -31,10 +27,10 @@ android { signingConfigs { config { - keyAlias keystoreProperties['keystore.key'] - keyPassword keystoreProperties['keystore.key.password'] - storeFile file(keystoreProperties['keystore.file']) - storePassword keystoreProperties['keystore.password'] + keyAlias rootProject.ext.signKeyAlias + keyPassword rootProject.ext.signKeyPassword + storeFile file(rootProject.ext.signKeyStore) + storePassword rootProject.ext.signKeyStorePassword } } @@ -58,7 +54,6 @@ android { outputFileName = "${variant.applicationId}-${variant.name}-${variant.versionName}.apk" } } - signingConfig signingConfigs.config } } } @@ -79,4 +74,4 @@ copyUserscripts { include('**/*') } -preBuild.dependsOn copyUserscripts \ No newline at end of file +preBuild.dependsOn copyUserscripts From 8a787eb7fd8c538ddc8d8a618a52c12dd18f5604 Mon Sep 17 00:00:00 2001 From: Mike Lambert Date: Sun, 25 Nov 2018 14:44:04 +0300 Subject: [PATCH 7/9] Gradle integrated to build system properly --- build.py | 11 +++++------ mobile/iitcm/build.gradle | 4 ++-- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/build.py b/build.py index c01513060..b6ebee85c 100755 --- a/build.py +++ b/build.py @@ -59,9 +59,6 @@ resourceUrlBase = settings.get('resourceUrlBase') distUrlBase = settings.get('distUrlBase') buildMobile = settings.get('buildMobile') -antOptions = settings.get('antOptions','') -antBuildFile = settings.get('antBuildFile', 'mobile/build.xml'); - # plugin wrapper code snippets. handled as macros, to ensure that # 1. indentation caused by the "function wrapper()" doesn't apply to the plugin code body @@ -288,13 +285,15 @@ def saveScriptAndMeta(script,ourDir,filename,oldDir=None): if buildMobile != 'copyonly': # now launch 'ant' to build the mobile project - retcode = os.system("ant %s -buildfile %s %s" % (antOptions, antBuildFile, buildMobile)) + flavors = {'debug': 'assembleDebug', 'release': 'assembleRelease'} + retcode = os.system("java -cp mobile/gradle/wrapper/gradle-wrapper.jar org.gradle.wrapper.GradleWrapperMain -p mobile clean " + flavors[buildMobile]) if retcode != 0: - print ("Error: mobile app failed to build. ant returned %d" % retcode) + print ("Error: mobile app failed to build. gradle returned %d" % retcode) exit(1) # ant may return 256, but python seems to allow only values <256 else: - shutil.copy("mobile/bin/IITC_Mobile-%s.apk" % buildMobile, os.path.join(outDir,"IITC_Mobile-%s.apk" % buildMobile) ) + shutil.copy("mobile/iitcm/build/outputs/apk/%s/com.cradle.iitc_mobile-debug.apk" % buildMobile, os.path.join(outDir,"IITC_Mobile-%s.apk" % buildMobile) +) # run any postBuild commands diff --git a/mobile/iitcm/build.gradle b/mobile/iitcm/build.gradle index 3e87e8424..2de5ea2de 100644 --- a/mobile/iitcm/build.gradle +++ b/mobile/iitcm/build.gradle @@ -41,7 +41,7 @@ android { minifyEnabled false applicationVariants.all { variant -> variant.outputs.all { - outputFileName = "${variant.applicationId}-${variant.name}-${variant.versionName}.apk" + outputFileName = "${variant.applicationId}-${variant.name}.apk" } } signingConfig signingConfigs.config @@ -51,7 +51,7 @@ android { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' applicationVariants.all { variant -> variant.outputs.all { - outputFileName = "${variant.applicationId}-${variant.name}-${variant.versionName}.apk" + outputFileName = "${variant.applicationId}-${variant.name}.apk" } } } From 7a499d756dbec5065e71856e5e8d3ab3ee9ec583 Mon Sep 17 00:00:00 2001 From: Mike Lambert Date: Sun, 2 Dec 2018 12:08:13 +0300 Subject: [PATCH 8/9] Removed outdated MapBox OSM tiles Added storage read permissions Added new intel url handling in manifest --- mobile/.idea/misc.xml | 2 +- mobile/assets/total-conversion-build.user.js | 10 +++++----- mobile/iitcm/src/main/AndroidManifest.xml | 18 ++++++++++++++++++ 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/mobile/.idea/misc.xml b/mobile/.idea/misc.xml index 44a480215..eb655f9fa 100644 --- a/mobile/.idea/misc.xml +++ b/mobile/.idea/misc.xml @@ -29,7 +29,7 @@ - + diff --git a/mobile/assets/total-conversion-build.user.js b/mobile/assets/total-conversion-build.user.js index 8a7301c9e..21f8b2f95 100644 --- a/mobile/assets/total-conversion-build.user.js +++ b/mobile/assets/total-conversion-build.user.js @@ -1,11 +1,11 @@ // ==UserScript== // @id ingress-intel-total-conversion@jonatkins // @name IITC: Ingress intel map total conversion -// @version 0.26.0.20181101.60209 +// @version 0.26.0.20181125.114042 // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL none // @downloadURL none -// @description [mobile-2018-11-01-060209] Total conversion for the ingress intel map. +// @description [mobile-2018-11-25-114042] Total conversion for the ingress intel map. // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* @@ -21,7 +21,7 @@ // REPLACE ORIG SITE /////////////////////////////////////////////////// if(document.getElementsByTagName('html')[0].getAttribute('itemscope') != null) throw('Ingress Intel Website is down, not a userscript issue.'); -window.iitcBuildDate = '2018-11-01-060209'; +window.iitcBuildDate = '2018-11-25-114042'; // disable vanilla JS window.onload = function() {}; @@ -1280,7 +1280,7 @@ function boot() { if(!isSmartphone()) // TODO remove completely? window.debug.console.overwriteNativeIfRequired(); - console.log('loading done, booting. Built: 2018-11-01-060209'); + console.log('loading done, booting. Built: 2018-11-25-114042'); if(window.deviceID) console.log('Your device ID: ' + window.deviceID); window.runOnSmartphonesBeforeBoot(); @@ -17987,7 +17987,7 @@ L.Draggable.prototype._onDown = function(e) { // inject code into site context var script = document.createElement('script'); -var info = { buildName: 'mobile', dateTimeVersion: '20181101.60209' }; +var info = { buildName: 'mobile', dateTimeVersion: '20181125.114042' }; if (this.GM_info && this.GM_info.script) info.script = { version: GM_info.script.version, name: GM_info.script.name, description: GM_info.script.description }; script.appendChild(document.createTextNode('('+ wrapper +')('+JSON.stringify(info)+');')); (document.body || document.head || document.documentElement).appendChild(script); diff --git a/mobile/iitcm/src/main/AndroidManifest.xml b/mobile/iitcm/src/main/AndroidManifest.xml index e0a4305a7..15d26d828 100644 --- a/mobile/iitcm/src/main/AndroidManifest.xml +++ b/mobile/iitcm/src/main/AndroidManifest.xml @@ -9,6 +9,7 @@ + + + + + + From 154e1bca058ff6dfd37a56dcfc72013329e915c7 Mon Sep 17 00:00:00 2001 From: Mike Lambert Date: Sun, 2 Dec 2018 12:20:26 +0300 Subject: [PATCH 9/9] Processing storage permissions at startup --- .../com/cradle/iitc_mobile/IITC_Mobile.java | 37 +++++++++++++++---- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/mobile/iitcm/src/main/java/com/cradle/iitc_mobile/IITC_Mobile.java b/mobile/iitcm/src/main/java/com/cradle/iitc_mobile/IITC_Mobile.java index 2fa0abf7a..8a5a0f06f 100644 --- a/mobile/iitcm/src/main/java/com/cradle/iitc_mobile/IITC_Mobile.java +++ b/mobile/iitcm/src/main/java/com/cradle/iitc_mobile/IITC_Mobile.java @@ -1,5 +1,6 @@ package com.cradle.iitc_mobile; +import android.Manifest; import android.app.ActionBar; import android.app.AlertDialog; import android.app.DownloadManager; @@ -24,6 +25,7 @@ import android.os.Handler; import android.preference.PreferenceManager; import android.support.annotation.NonNull; +import android.support.v4.app.ActivityCompat; import android.support.v4.view.MenuItemCompat; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.SearchView; @@ -68,6 +70,7 @@ public class IITC_Mobile extends AppCompatActivity implements OnSharedPreferenceChangeListener, NfcAdapter.CreateNdefMessageCallback, OnItemLongClickListener { private static final String mIntelUrl = "https://intel.ingress.com/intel"; + private static final int REQ_PERMISSIONS_STORAGE = 0x0000FF02; private SharedPreferences mSharedPrefs; private IITC_FileManager mFileManager; @@ -111,7 +114,7 @@ protected void onCreate(final Bundle savedInstanceState) { // enable progress bar above action bar // must be called BEFORE calling parent method requestWindowFeature(Window.FEATURE_PROGRESS); - + requestStoragePermissions(); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); @@ -196,6 +199,15 @@ public boolean onEditorAction(final TextView v, final int actionId, final KeyEve handleIntent(getIntent(), true); } + private void requestStoragePermissions() { + if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED || + ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { + ActivityCompat.requestPermissions(this, + new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, + REQ_PERMISSIONS_STORAGE); + } + } + @Override public void onSharedPreferenceChanged(final SharedPreferences sharedPreferences, final String key) { if (key.equals("pref_force_desktop")) { @@ -1031,16 +1043,25 @@ public boolean onMenuItemClick(final MenuItem menuitem) { @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if (requestCode == IITC_UserLocation.REQ_PERMISSIONS_LOCATION && mUserLocation != null) { - int grantedCount = 0; - for (int i = 0; i < grantResults.length; i++) { - if (grantResults[i] == PackageManager.PERMISSION_GRANTED) { - grantedCount++; - } - } - if (grantedCount > 0) { + if (grantedCount(grantResults) > 0) { mUserLocation.onRuntimePermissionsGranted(); } } + if (requestCode == REQ_PERMISSIONS_STORAGE) { + if (grantedCount(grantResults) > 0) { + Toast.makeText(this, "Storage permissions acquired", Toast.LENGTH_SHORT).show(); + } + } super.onRequestPermissionsResult(requestCode, permissions, grantResults); } + + private int grantedCount(int[] grantResults) { + int grantedCount = 0; + for (int i = 0; i < grantResults.length; i++) { + if (grantResults[i] == PackageManager.PERMISSION_GRANTED) { + grantedCount++; + } + } + return grantedCount; + } }