// ==UserScript== // @id iitc-plugin-automultidraw@Jormund // @name IITC plugin: Automultidraw // @category Layer // @version 1.1.0.20230402.0005 // @description [2023-04-02-0005] Autodraw for multilayered fields // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL https://raw.githubusercontent.com/Jormund/automultidraw/master/automultidraw.meta.js // @downloadURL https://raw.githubusercontent.com/Jormund/automultidraw/master/automultidraw.user.js // @match https://intel.ingress.com/* // @match https://intel-x.ingress.com/* // @match https://*.ingress.com/intel* // @grant none // ==/UserScript== //Changelog //1.1.0: Added dropdownlist "number of players" to change link sense //1.0.1: Activate on intel-x.ingress.com //1.0.0: option to fit map to the draw //0.1.9: activate on intel.ingress.com, changed download url to github //0.1.8: allow choosing between polygons and polylines //0.1.7: display number of fields (layers) //0.1.6: display cumulated area //0.1.5: checkbox to clear draw and dropdownlist to choose mode //0.1.3: guess the 3 sets of portals from bookmark folders when there are 3 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 START //////////////////////////////////////////////////////// // use own namespace for plugin window.plugin.automultidraw = function () { }; window.plugin.automultidraw.KEY_STORAGE = 'automultidraw-storage'; window.plugin.automultidraw.FIELD_MODE = { BALANCED: 'BALANCED', STACKED: 'STACKED', DEFAULT: 'BALANCED' }; window.plugin.automultidraw.NB_PLAYERS = { ONE: '1', TWO: '2', THREE: '3', DEFAULT: '3' }; window.plugin.automultidraw.DRAWN_ITEM_TYPE = { ONE_LINE_PER_LINK: 'ONE_LINE_PER_LINK', TWO_LINES_PER_FIELD: 'TWO_LINES_PER_FIELD', ONE_POLYLINE_PER_FIELD: 'ONE_POLYLINE_PER_FIELD', ONE_POLYGON_PER_FIELD: 'ONE_POLYGON_PER_FIELD', DEFAULT: 'ONE_LINE_PER_LINK' }; window.plugin.automultidraw.DEFAULT_CLEAR_BEFORE_DRAW = true; window.plugin.automultidraw.DEFAULT_AUTOFIT = true; window.plugin.automultidraw.storage = { clearBeforeDraw: window.plugin.automultidraw.DEFAULT_CLEAR_BEFORE_DRAW, fieldMode: window.plugin.automultidraw.FIELD_MODE.DEFAULT, nbPlayers: window.plugin.automultidraw.NB_PLAYERS.DEFAULT, drawnItemType: window.plugin.automultidraw.DRAWN_ITEM_TYPE.DEFAULT, autofit: window.plugin.automultidraw.DEFAULT_AUTOFIT }; window.plugin.automultidraw.debug = false; window.plugin.automultidraw.isSmart = undefined; //will be true on smartphones after setup // update the localStorage datas window.plugin.automultidraw.saveStorage = function () { localStorage[window.plugin.automultidraw.KEY_STORAGE] = JSON.stringify(window.plugin.automultidraw.storage); }; // load the localStorage datas window.plugin.automultidraw.loadStorage = function () { if (typeof localStorage[window.plugin.automultidraw.KEY_STORAGE] != "undefined") { try { window.plugin.automultidraw.storage = JSON.parse(localStorage[window.plugin.automultidraw.KEY_STORAGE]); } catch (err) { window.plugin.automultidraw.log(err.stack, true); window.plugin.automultidraw.storage = {}; } } //ensure default values are always set if (typeof window.plugin.automultidraw.storage.clearBeforeDraw != "boolean") { window.plugin.automultidraw.storage.clearBeforeDraw = window.plugin.automultidraw.DEFAULT_CLEAR_BEFORE_DRAW; } if (typeof window.plugin.automultidraw.storage.fieldMode != "string") { window.plugin.automultidraw.storage.fieldMode = window.plugin.automultidraw.FIELD_MODE.DEFAULT; } if (typeof window.plugin.automultidraw.storage.nbPlayers != "string") { window.plugin.automultidraw.storage.nbPlayers = window.plugin.automultidraw.NB_PLAYERS.DEFAULT; } if (typeof window.plugin.automultidraw.storage.drawnItemType != "string") { window.plugin.automultidraw.storage.drawnItemType = window.plugin.automultidraw.DRAWN_ITEM_TYPE.DEFAULT; } if (typeof window.plugin.automultidraw.storage.autofit != "boolean") { window.plugin.automultidraw.storage.autofit = window.plugin.automultidraw.DEFAULT_AUTOFIT; } //conversion from old value if (window.plugin.automultidraw.storage.fieldMode == 'FIELD_MODE_BALANCED') window.plugin.automultidraw.storage.fieldMode = window.plugin.automultidraw.FIELD_MODE.BALANCED; if (window.plugin.automultidraw.storage.fieldMode == 'FIELD_MODE_STACKED') window.plugin.automultidraw.storage.fieldMode = window.plugin.automultidraw.FIELD_MODE.STACKED; }; /***************************************************************************************************************************************************************/ /** OPTIONS **************************************************************************************************************************************************/ /***************************************************************************************************************************************************************/ window.plugin.automultidraw.resetOpt = function () { window.plugin.automultidraw.storage.nbPlayers = window.plugin.automultidraw.NB_PLAYERS; window.plugin.automultidraw.storage.drawnItemType = window.plugin.automultidraw.DRAWN_ITEM_TYPE.DEFAULT; window.plugin.automultidraw.storage.clearBeforeDraw = window.plugin.automultidraw.DEFAULT_CLEAR_BEFORE_DRAW; window.plugin.automultidraw.storage.autofit = window.plugin.automultidraw.DEFAULT_AUTOFIT; window.plugin.automultidraw.saveStorage(); window.plugin.automultidraw.openOptDialog(); } window.plugin.automultidraw.saveOpt = function () { window.plugin.automultidraw.storage.nbPlayers = $('#automultidraw-nbPlayers').val(); window.plugin.automultidraw.storage.clearBeforeDraw = $("#automultidraw-clearBeforeDraw").is(":checked"); window.plugin.automultidraw.storage.autofit = $('#automultidraw-autofit').is(":checked"); window.plugin.automultidraw.storage.drawnItemType = $('#automultidraw-drawnItemType').val(); window.plugin.automultidraw.saveStorage(); } window.plugin.automultidraw.openOptDialog = function () { var html = '
' + ''; html += '' + '' + '' + ''; html += '' + '' + '' + ''; html += '' + '' + '' + ''; html += '' + '' + '' + ''; html += '
' + 'Clear before draw' + '' + '' + '
' + 'Autofit' + '' + '' + '
' + 'Draw type' + '' + '' + '
' + 'Players' + '' + '' + '
' + '
'; ; var d = dialog({ html: html, id: 'automultidraw_opt', title: 'Automultidraw preferences', width: 'auto', buttons: { 'Reset': function () { window.plugin.automultidraw.resetOpt(); }, 'Save': function () { window.plugin.automultidraw.saveOpt(); $(this).dialog('close'); } } }); $('#automultidraw-drawnItemType').val(window.plugin.automultidraw.storage.drawnItemType); $('#automultidraw-nbPlayers').val(window.plugin.automultidraw.storage.nbPlayers); var dialogId = d.data('id'); //dialog-bookmarkUnderDraw_opt $("#" + dialogId + "").parent().find(".ui-dialog-buttonpane .ui-button .ui-button-text:contains('OK')").parent().hide(); //remove the default OK button } window.plugin.automultidraw.optClicked = function () { window.plugin.automultidraw.openOptDialog(); } /***************************************************************************************************************************************************************/ /** DRAW **************************************************************************************************************************************************/ /***************************************************************************************************************************************************************/ window.plugin.automultidraw.dialogDrawer = function () { //no portal selection, we use them all window.plugin.automultidraw.drawMultilayeredField(); } window.plugin.automultidraw.resetDraw = function () { //similar to window.plugin.drawTools.optReset but without confirmation delete localStorage['plugin-draw-tools-layer']; window.plugin.drawTools.drawnItems.clearLayers(); window.plugin.drawTools.load(); runHooks('pluginDrawTools', { event: 'clear' }); }; //convert latlng string from Bookmarks to array of numbers (for Leaflet) window.plugin.automultidraw.latlngToLatLngArr = function (latlngstring) { var arr = latlngstring.split(','); if (arr.length != 2) return null; arr[0] = parseFloat(arr[0]); arr[1] = parseFloat(arr[1]); if (isNaN(arr[0]) || isNaN(arr[1])) return null; return arr; } window.plugin.automultidraw.areaToReadable = function (areaInSquareMeters) { if (areaInSquareMeters > 100000) { var areaInSquareKilometers = areaInSquareMeters / 1000000; if (areaInSquareKilometers < 1000) return areaInSquareKilometers.toFixed(2) + 'km²'; else return areaInSquareKilometers.toFixed(0) + 'km²'; } else { if (areaInSquareMeters < 1000) return areaInSquareMeters.toFixed(2) + 'm²'; else return areaInSquareMeters.toFixed(0) + 'm²'; } } window.plugin.automultidraw.drawLine = function (latlngs) { var layer; var layerType = 'polyline'; layer = L.geodesicPolyline(latlngs, window.plugin.drawTools.lineOptions); map.fire('draw:created', { layer: layer, layerType: layerType }); return layer; } window.plugin.automultidraw.drawPolygon = function (latlngs) { var layer; var layerType = 'polygon'; layer = L.geodesicPolygon(latlngs, window.plugin.drawTools.polygonOptions); map.fire('draw:created', { layer: layer, layerType: layerType }); return layer; } window.plugin.automultidraw.drawClicked = function () { //save field mode window.plugin.automultidraw.storage.fieldMode = $('#automultidraw-fieldMode').val(); window.plugin.automultidraw.saveStorage(); if (window.plugin.automultidraw.storage.clearBeforeDraw) { window.plugin.automultidraw.resetDraw(); } var options = { fieldMode: window.plugin.automultidraw.storage.fieldMode, nbPlayers: window.plugin.automultidraw.storage.nbPlayers, drawnItemType: window.plugin.automultidraw.storage.drawnItemType, autofit: window.plugin.automultidraw.storage.autofit } window.plugin.automultidraw.drawMultilayeredField(options); } window.plugin.automultidraw.drawMultilayeredField = function (options) { if (typeof options == 'undefined') options = { fieldMode: window.plugin.automultidraw.FIELD_MODE.DEFAULT, nbPlayers: window.plugin.automultidraw.NB_PLAYERS.DEFAULT, drawnItemType: window.plugin.automultidraw.DRAWN_ITEM_TYPE.DEFAULT, autofit: window.plugin.automultidraw.DEFAULT_AUTOFIT }; try { var msg = ''; var dirA = { index: 0 }; var dirB = { index: 1 }; var dirC = { index: 2 }; var allDirs = [dirA, dirB, dirC]; allDirs.next = function (dir) { if (dir.index < allDirs.length - 1) return allDirs[dir.index + 1]; else return allDirs[0]; }; allDirs.prev = function (dir) { if (dir.index > 0) return allDirs[dir.index - 1]; else return allDirs[allDirs.length - 1]; }; allDirs.nextIndex = function (index) { if (index < allDirs.length - 1) return index + 1; else return 0; }; allDirs.prevIndex = function (index) { if (index > 0) return index - 1; else return allDirs.length - 1; }; // directions will have the following attributes: // bkmrks : bookmarks of the direction // bkmrks.length : number of portals in the direction // temp attributes in the loop: // curBkmrk : current bookmark in the loop // remainingPortalRatio : ratio of portals not used yet in the direction over total number of portals in the direction // remainingPortalCount : number of portals not used yet in the direction // consecutiveLayers : number of fields where the current bookmark is used // local bookmark will have the following attributes: // globalIndex : index in the global array bkmrkArr // dirIndex : index in the direction, from in to out // distanceToPreviousBookmark : distance to the portal that has previous index in bkmrkArr // direction : considering an ABC triangle, values can be dirA, dirB or dirC //window.plugin.bookmarks.KEY_OTHER_BKMRK => "idOthers", le dossier racine //$('#mobileinfo').html('Starting automultidraw'); //debug window.plugin.automultidraw.log('Starting automultidraw'); // var bkmrkObj = {}; var bkmrkArr = []; var folders = {}; if (typeof window.plugin.bookmarks.bkmrksObj != 'undefined' && window.plugin.bookmarks.bkmrksObj.portals != 'undefined') { $.each(window.plugin.bookmarks.bkmrksObj.portals, function (folderId, folder) { if (typeof folder.bkmrk != 'undefined') { $.each(folder.bkmrk, function (bookmarkId, bookmarkOri) { var bookmark = {}; //new object so as to not interfere bookmark.folderId = folderId; bookmark.globalIndex = bkmrkArr.length; bookmark.latLngArr = window.plugin.automultidraw.latlngToLatLngArr(bookmarkOri.latlng); bookmark.latLng = L.latLng(bookmark.latLngArr); bkmrkArr.push(bookmark); if (typeof folders[folderId] == 'undefined') folders[folderId] = {}; folders[folderId].hasBookmarks = true; }); } }); } if (bkmrkArr.length < 3) { msg = bkmrkArr.length + ' bookmark(s) found (requires minimum 3 to field)'; //window.plugin.automultidraw.log(msg); alert(msg); return; } //when less than 3 bookmarks, do nothing //$('#mobileinfo').html(bkmrkArr.length + ' portals found'); //debug window.plugin.automultidraw.log(bkmrkArr.length + ' portals found'); $.each(allDirs, function (i, dir) { //bkmrksPerDir[dir] = []; dir.bkmrks = []; }); var folderCount = Object.keys(folders).length; //no need to check 'hasBookmarks' because we created only objects for used folders if (folderCount == 3) {//when there are exactly 3 folders containing bookmarks, we trust the user's folders window.plugin.automultidraw.log('Spliting by folders'); var currentDirection = dirA; $.each(folders, function (folderId, folder) {//assign direction to each folder folder.direction = currentDirection; currentDirection = allDirs.next(currentDirection); }); //currentDirection = null; $.each(bkmrkArr, function (index, bkmrk) {//assign direction to bookmarks of each folder currentDirection = folders[bkmrk.folderId].direction; bkmrk.direction = currentDirection; bkmrk.dirIndex = currentDirection.bkmrks.length; currentDirection.bkmrks.push(bkmrk); }); } else { //compute distance between following bookmarks //MAYBE?: use directions to handle max1 and max2 ? var maxDistanceBkmrk1 = { distanceToPreviousBookmark: -1 }, maxDistanceBkmrk2 = { distanceToPreviousBookmark: -2 }; $.each(bkmrkArr, function (index, bkmrk) { if (index > 0) { var previousBkrmk = bkmrkArr[index - 1]; var distance = bkmrk.latLng.distanceTo(previousBkrmk.latLng); bkmrk.distanceToPreviousBookmark = distance; if (distance > maxDistanceBkmrk1.distanceToPreviousBookmark) { maxDistanceBkmrk2 = maxDistanceBkmrk1; maxDistanceBkmrk1 = bkmrk; } else if (distance > maxDistanceBkmrk2.distanceToPreviousBookmark) { maxDistanceBkmrk2 = bkmrk; } } }); if (maxDistanceBkmrk1.distanceToPreviousBookmark == -1 || maxDistanceBkmrk2.distanceToPreviousBookmark == -1) { msg = 'No max distance found between bookmarks'; //window.plugin.automultidraw.log('No max distance found between bookmarks'); alert(msg); return; } //should not be possible with valid distinct bookmarks else { //$('#mobileinfo').html('Split found by distance'); //debug window.plugin.automultidraw.log('Split found by distance'); } //we suppose direction changes with the 2 max distances var currentDirection = dirA; //var bkmrksPerDir = {}; $.each(bkmrkArr, function (index, bkmrk) { if (bkmrk == maxDistanceBkmrk1 || bkmrk == maxDistanceBkmrk2) { currentDirection = allDirs.next(currentDirection); } bkmrk.direction = currentDirection; bkmrk.dirIndex = currentDirection.bkmrks.length; currentDirection.bkmrks.push(bkmrk); }); } window.plugin.automultidraw.log('Portals sorted in directions'); var portalCount = bkmrkArr.length; var fieldCount = portalCount - 2; if (dirA.bkmrks.length + dirB.bkmrks.length + dirC.bkmrks.length != portalCount) { msg = 'Direction lengths and total length dont match'; //window.plugin.automultidraw.log('Direction lengths and total length dont match'); alert(msg); return; } //$('#mobileinfo').html('A:' + dirA.bkmrks.length + ',B:' + dirB.bkmrks.length + ',C:' + dirC.bkmrks.length);//debug window.plugin.automultidraw.log('A:' + dirA.bkmrks.length + ',B:' + dirB.bkmrks.length + ',C:' + dirC.bkmrks.length); var fields = []; window.plugin.automultidraw.fields = fields; //debug var latLngs = []; //link first field var curField = []; $.each(allDirs, function (i, dir) { dir.curBkmrk = dir.bkmrks[0]; //current portals of the loop curField.push(dir.curBkmrk); dir.consecutiveLayers = 1; //used in the loop }); fields.push(curField); for (var f = 2; f <= fieldCount; f++) { var prevField = curField; curField = []; //find the portal that changes var changeDir = null; var testDirs = allDirs.slice(0); if (options.fieldMode == window.plugin.automultidraw.FIELD_MODE.BALANCED) {//balanced //Remaining portals ratio if (testDirs.length > 1) { var maxRemainingPortalRatio = -Infinity; $.each(testDirs, function (i, dir) { //Count ratio between remaining portals and past portals to give priority to max. dir.remainingPortalCount = (dir.bkmrks.length - (dir.curBkmrk.dirIndex + 1)); dir.remainingPortalRatio = dir.remainingPortalCount / dir.bkmrks.length; if (dir.remainingPortalRatio > maxRemainingPortalRatio) maxRemainingPortalRatio = dir.remainingPortalRatio; }); //Is max of ratio ? if (testDirs.length > 1) { testDirs = $.grep(testDirs, function (dir, i) { if (dir.remainingPortalRatio < maxRemainingPortalRatio) return false; else return true; }); window.plugin.automultidraw.log('After max ratio: testDirs.length=' + testDirs.length); //Has most remaining portals ? if (testDirs.length > 1) { var maxPortals = -Infinity; $.each(testDirs, function (i, dir) { if (dir.remainingPortalCount > maxPortals) maxPortals = dir.remainingPortalCount; // if (dir.bkmrks.length > maxPortals) // maxPortals = dir.bkmrks.length; }); testDirs = $.grep(testDirs, function (dir, i) { //if (dir.bkmrks.length < maxPortals) return false; if (dir.remainingPortalCount < maxPortals) return false; else return true; }); window.plugin.automultidraw.log('After max portals: testDirs.length=' + testDirs.length); //Is max of consecutive layers ? if (testDirs.length > 1) { var maxConsecutiveLayers = -Infinity; $.each(testDirs, function (i, dir) { if (dir.consecutiveLayers > maxConsecutiveLayers) maxConsecutiveLayers = dir.consecutiveLayers; }); testDirs = $.grep(testDirs, function (dir, i) { if (dir.consecutiveLayers < maxConsecutiveLayers) return false; else return true; }); } } } } //Arbitrary ensure only one result (A before B before C when same priority) //(thus with a balanced plan, A will always be chosen before B and B before C) window.plugin.automultidraw.log('Before arbitrary: testDirs.length=' + testDirs.length); if (testDirs.length == 1) { changeDir = testDirs[0]; //one result, we take it } else if (testDirs.length > 1) { changeDir = testDirs[0]; //multiple result, arbitrary take the first one } else {//testDirs.length = 0; //should never happen because algorithm is based on max } $.each(allDirs, function (i, dir) { if (changeDir == dir) changeDir.consecutiveLayers = 1; else dir.consecutiveLayers++; }); } //end of balanced else {//stacked $.each(allDirs, function (i, dir) { dir.remainingPortalCount = (dir.bkmrks.length - (dir.curBkmrk.dirIndex + 1)); if (dir.remainingPortalCount > 0) { changeDir = dir; return false; //breaking the loop makes us change only one portal } }); } //end of stacked if (changeDir != null) { window.plugin.automultidraw.log('changeDir:' + changeDir.index); window.plugin.automultidraw.log('changeDir.remainingPortalCount:' + changeDir.remainingPortalCount); window.plugin.automultidraw.log('changeDir.remainingPortalRatio:' + changeDir.remainingPortalRatio); window.plugin.automultidraw.log('changeDir.consecutiveLayers:' + changeDir.consecutiveLayers); } //link the portal if (changeDir != null //test that we are not already on last portal just to be sure, but that should never happen && changeDir.curBkmrk.dirIndex < (changeDir.bkmrks.length - 1)) { window.plugin.automultidraw.log('Portal added in direction:' + changeDir.index); changeDir.curBkmrk = changeDir.bkmrks[changeDir.curBkmrk.dirIndex + 1]; //add field to the list $.each(allDirs, function (i, dir) { if (i == changeDir.index) { curField[i] = changeDir.curBkmrk; } else { curField[i] = prevField[i]; } }); fields.push(curField); } else { //should never happen if (changeDir == null) window.plugin.automultidraw.log('Fail changeDir is null'); else window.plugin.automultidraw.log('Fail, changeDir.curBkmrk.dirIndex:' + changeDir.curBkmrk.dirIndex + '
changeDir.bkmrks.length-1:' + (changeDir.bkmrks.length - 1)); } } //draw based on fields var cumulatedArea = 0; var prevField = []; if (options.drawnItemType == window.plugin.automultidraw.DRAWN_ITEM_TYPE.ONE_LINE_PER_LINK || options.drawnItemType == window.plugin.automultidraw.DRAWN_ITEM_TYPE.ONE_POLYLINE_PER_FIELD || options.drawnItemType == window.plugin.automultidraw.DRAWN_ITEM_TYPE.TWO_LINES_PER_FIELD) { $.each(fields, function (fieldIndex, curField) { window.plugin.automultidraw.log('fieldIndex:' + fieldIndex); //debug //draw var changeIndex = -1; if (fieldIndex != 0) { for (var i = 0; i < 3; i++) { if (curField[i] != prevField[i]) { changeIndex = i; break; } } } if (options.drawnItemType == window.plugin.automultidraw.DRAWN_ITEM_TYPE.ONE_LINE_PER_LINK) { if (fieldIndex == 0) { if (options.nbPlayers == window.plugin.automultidraw.NB_PLAYERS.THREE) { latLngs = [curField[0].latLng, curField[1].latLng]; window.plugin.automultidraw.drawLine(latLngs); latLngs = [curField[1].latLng, curField[2].latLng]; window.plugin.automultidraw.drawLine(latLngs); latLngs = [curField[2].latLng, curField[0].latLng]; window.plugin.automultidraw.drawLine(latLngs); } else { latLngs = [curField[1].latLng, curField[0].latLng]; window.plugin.automultidraw.drawLine(latLngs); latLngs = [curField[2].latLng, curField[1].latLng]; window.plugin.automultidraw.drawLine(latLngs); latLngs = [curField[2].latLng, curField[0].latLng]; window.plugin.automultidraw.drawLine(latLngs); } } else { if (options.nbPlayers == window.plugin.automultidraw.NB_PLAYERS.THREE) { latLngs = [curField[changeIndex].latLng, curField[allDirs.nextIndex(changeIndex)].latLng]; window.plugin.automultidraw.drawLine(latLngs); latLngs = [curField[changeIndex].latLng, curField[allDirs.prevIndex(changeIndex)].latLng]; window.plugin.automultidraw.drawLine(latLngs); } else if (options.nbPlayers == window.plugin.automultidraw.NB_PLAYERS.TWO) { if (changeIndex == 0) { latLngs = [curField[1].latLng, curField[0].latLng]; window.plugin.automultidraw.drawLine(latLngs); latLngs = [curField[2].latLng, curField[0].latLng]; window.plugin.automultidraw.drawLine(latLngs); } else if (changeIndex == 1) { latLngs = [curField[1].latLng, curField[0].latLng]; window.plugin.automultidraw.drawLine(latLngs); latLngs = [curField[1].latLng, curField[2].latLng]; window.plugin.automultidraw.drawLine(latLngs); } else if (changeIndex == 2) { latLngs = [curField[2].latLng, curField[0].latLng]; window.plugin.automultidraw.drawLine(latLngs); latLngs = [curField[2].latLng, curField[1].latLng]; window.plugin.automultidraw.drawLine(latLngs); } } else if (options.nbPlayers == window.plugin.automultidraw.NB_PLAYERS.ONE) { if (changeIndex == 0) { latLngs = [curField[1].latLng, curField[0].latLng]; window.plugin.automultidraw.drawLine(latLngs); latLngs = [curField[2].latLng, curField[0].latLng]; window.plugin.automultidraw.drawLine(latLngs); } else if (changeIndex == 1) { latLngs = [curField[1].latLng, curField[0].latLng]; window.plugin.automultidraw.drawLine(latLngs); latLngs = [curField[2].latLng, curField[1].latLng]; window.plugin.automultidraw.drawLine(latLngs); } else if (changeIndex == 2) { latLngs = [curField[2].latLng, curField[0].latLng]; window.plugin.automultidraw.drawLine(latLngs); latLngs = [curField[2].latLng, curField[1].latLng]; window.plugin.automultidraw.drawLine(latLngs); } } } } else if (options.drawnItemType == window.plugin.automultidraw.DRAWN_ITEM_TYPE.ONE_POLYLINE_PER_FIELD) { latLngs = [curField[0].latLng, curField[1].latLng, curField[2].latLng, curField[0].latLng]; window.plugin.automultidraw.drawLine(latLngs); } else if (options.drawnItemType == window.plugin.automultidraw.DRAWN_ITEM_TYPE.TWO_LINES_PER_FIELD) { if (fieldIndex == 0) { latLngs = [curField[0].latLng, curField[1].latLng, curField[2].latLng, curField[0].latLng]; window.plugin.automultidraw.drawLine(latLngs); } else { latLngs = [curField[allDirs.prevIndex(changeIndex)].latLng, curField[changeIndex].latLng, curField[allDirs.nextIndex(changeIndex)].latLng]; window.plugin.automultidraw.drawLine(latLngs); } } prevField = curField; }); } else if (options.drawnItemType == window.plugin.automultidraw.DRAWN_ITEM_TYPE.ONE_POLYGON_PER_FIELD) { for (var fieldIndex = fields.length - 1; fieldIndex >= 0; fieldIndex--) {//start from the bigger field so the small one is drawn on top var curField = fields[fieldIndex]; latLngs = [curField[0].latLng, curField[1].latLng, curField[2].latLng]; window.plugin.automultidraw.drawPolygon(latLngs); } } //compute area $.each(fields, function (fieldIndex, curField) { window.plugin.automultidraw.log('fieldIndex:' + fieldIndex); //debug var latLngs = []; $.each(curField, function (bkmrkIndex, bkmrk) { latLngs.push(bkmrk.latLng); }); var area = L.GeometryUtil.geodesicArea(latLngs); cumulatedArea += area; }); //MAYBE: user pref for showmap ? if (window.plugin.automultidraw.isSmart) { window.show('map'); } // Shown the layer if it is hidden if (!map.hasLayer(window.plugin.drawTools.drawnItems)) { map.addLayer(window.plugin.drawTools.drawnItems); } //var autofit = window.plugin.automultidraw.isSmart; var autofit = options.autofit; if (autofit) { latLngs = []; $.each(allDirs, function (i, dir) { latLngs.push(dir.curBkmrk.latLng); }); layer = L.geodesicPolygon(latLngs, window.plugin.drawTools.polygonOptions); //not drawn, only used for to get bounds for fitBounds layerType = 'polygon'; map.fitBounds(layer.getBounds()); } msg = 'Area: ' + window.plugin.automultidraw.areaToReadable(cumulatedArea); msg += ', Layers:' + fieldCount; window.plugin.automultidraw.setMessage(msg); } catch (err) { //$('#mobileinfo').html(err.message); //debug //window.debug.console.error(err.message); //window.plugin.automultidraw.log('Message:'+err.message); if (window.plugin.automultidraw.isSmart) window.plugin.automultidraw.log(err.stack, true); else throw err; } } /***************************************************************************************************************************************************************/ window.plugin.automultidraw.setMessage = function (text) { $('#automultidraw-message').html(text); } window.plugin.automultidraw.addMessage = function (text) { if ($('#automultidraw-message').html() == '') $('#automultidraw-message').html(text); else $('#automultidraw-message').append('
' + text); } window.plugin.automultidraw.log = function (text, isError) { if (window.plugin.automultidraw.debug || isError) { if (window.plugin.automultidraw.isSmart) { $('#automultidraw-log').prepend(text + '
'); } else { console.log(text); } } } //window.plugin.automultidraw.setupContent = function () { //plugin.automultidraw.htmlCalldrawBox = 'Automultidraw'; //plugin.automultidraw.htmlToolBox = '
'; //} /***************************************************************************************************************************************************************/ var setup = function () { if (!window.plugin.bookmarks) { alert('Bookmarks plugin required'); return false; } if (!window.plugin.drawTools) { alert('Draw tools plugin required'); return false; } window.plugin.automultidraw.isSmart = window.isSmartphone(); window.plugin.automultidraw.loadStorage(); //window.plugin.automultidraw.setupContent(); // window.plugin.automultidraw.setupCSS(); //$('#toolbox').append(window.plugin.automultidraw.htmlCalldrawBox); // toolbox menu $('#toolbox').after('
'); var amdToolbox = $('#automultidraw-toolbox'); amdToolbox.append(' Automultidraw : '); amdToolbox.append('Draw  '); amdToolbox.append(' '); //onchange="window.plugin.automultidraw.fieldModeChanged()" $('#automultidraw-fieldMode').append('') .append('') ; amdToolbox.append('Opt  '); $('#automultidraw-fieldMode').val(window.plugin.automultidraw.storage.fieldMode); $('#automultidraw-toolbox').append('
'); if (window.plugin.automultidraw.isSmart) { $('#automultidraw-toolbox').append('
'); } //alert('end of Automultidraw setup'); //TODO: android Pane //if(window.useAndroidPanes()) //android.addPane("plugin-bookmarks", "Bookmarks", "ic_action_star"); //window.addHook('paneChanged', window.plugin.bookmarks.onPaneChanged); } // 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);