/////////////////////////////////////////////////////////////////////////// // Copyright (c) 2014 - 2018 Esri. All Rights Reserved. // // Licensed under the Apache License Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /////////////////////////////////////////////////////////////////////////// /*global define*/ define([ 'dojo/_base/declare', 'dojo/_base/array', 'dojo/_base/lang', 'dojo/on', 'dojo/dom-attr', 'dojo/dom-class', 'dojo/dom-style', 'dojo/string', 'dojo/topic', 'dojo/keys', 'dojo/Deferred', 'dojo/Evented', 'dojo/dom', 'dojo/dom-construct', 'dijit/_WidgetBase', 'dijit/_TemplatedMixin', 'dijit/_WidgetsInTemplateMixin', 'dijit/registry', 'dijit/Tooltip', 'dijit/TooltipDialog', 'dijit/popup', 'dojo/text!./templates/CoordinateControl.html', 'esri/geometry/webMercatorUtils', 'esri/graphic', 'esri/geometry/Point', 'esri/request', 'esri/SpatialReference', 'esri/tasks/GeometryService', 'esri/tasks/ProjectParameters', 'esri/toolbars/draw', 'jimu/dijit/Message', './_CoordinateControlFormatNotation', './_CoordinateControlConfirmNotation', 'dijit/form/TextBox', 'dijit/form/Textarea', 'dijit/form/Select', 'dijit/InlineEditBox' ], function ( dojoDeclare, dojoArray, dojoLang, dojoOn, dojoDomAttr, dojoDomClass, dojoDomStyle, dojoString, dojoTopic, dojoKeys, dojoDeferred, dojoEvented, dojoDom, dojoDomConstruct, dijitWidgetBase, dijitTemplatedMixin, dijitWidgetsInTemplate, dijitRegistry, dijitTooltip, dijitTooltipDialog, dijitPopup, coordCntrl, EsriWMUtils, EsriGraphic, EsriPoint, EsriRequest, EsriSpatialReference, EsriGeometryService, EsriProjectParameters, EsriDraw, JimuMessage, CoordFormat, ConfirmNotation ) { 'use strict'; return dojoDeclare([dijitWidgetBase, dijitTemplatedMixin, dijitWidgetsInTemplate, dojoEvented], { templateString: coordCntrl, baseClass: 'jimu-coordinate-control', /** Config parameters: parentWidget: widget (mandatory) -> the parent widget the control is going to be used in input: boolean (optional) -> set the control to type input or output Default true label: string (optional) -> label to be used above the coordinate control if not set label will not be shown showCopyButton: boolean (optional) -> is copy notation button shown Default false showFormatButton: boolean (optional) -> is format notation button shown Default false zoomScale: number (optional) -> if not set, the zoom button will not be shown showDeleteButton: boolean (optional) -> is delete button shown (only used if input set to false) Default true showExpandButton: boolean (optional) -> is expand button shown (only used if input set to false) Default true drawButtonLabel: string (optional) -> if not set, the draw button button will not be shown drawToolTip: string (optional) -> tooltip to be used on draw point if not set default tooltip will be used from main nls file graphicsLayer: graphicsLayer (optional) -> The graphics layer to place current map point on if not supplied no graphics will be drawn on map type: string (optional) -> default notation format. Available Types: DD, DDM, DMS, GARS, GEOREF, MGRS, USNG, UTM, UTM_H Default DD Methods: getFormattedCoordinateText: Returns the sanitized formatted coordinate getCurrentMapCoordinate: Returns the current map coordinate getMapCoordinateDD: Returns the current map coordinate in DD Event: get-coordinate-complete: Fired when coordinates are returned in sanitized format. */ parentWidget: null, input: true, label: null, showCopyButton: false, showFormatButton: false, zoomScale: null, showDeleteButton: true, showExpandButton: true, drawButtonLabel: null, drawToolTip: null, graphicsLayer: null, type: 'DD', inputFromText: true, addSign: false, /** * **/ postMixInProperties: function () { this.nls = window.jimuNls.coordinateControl; }, /** * **/ constructor: function (args) { dojoDeclare.safeMixin(this, args); this.uid = args.id || dijitRegistry.getUniqueId('cc'); if (this.parentWidget === null) { console.error('No parentWidget parameter supplied: ' + 'Parameter is mandatory'); } if (this.label === null) { console.info('No label parameter supplied (optional): ' + 'Coordinate Control will have no label'); } if (this.zoomScale === null) { console.info('No zoomScale parameter supplied (optional): ' + 'Coordinate Control will have no zoom button'); } if (this.drawButtonLabel === null) { console.info('No drawButtonLabel parameter supplied (optional): ' + 'Coordinate Control will have no draw button'); } if (this.graphicsLayer === null) { console.info('No graphicsLayer parameter supplied: ' + 'Input graphics will not be shown on map'); } }, /** * **/ postCreate: function () { this._frmtdlg = new dijitTooltipDialog({ id: this.uid + '_formatCoordinateTooltip', content: new CoordFormat({ nls: this.nls, ct: this.type }), style: 'width: 400px', onClose: dojoLang.hitch(this, this.popupDidClose) }); if (this.parentWidget.appConfig.theme.name === 'DartTheme') { dojoDomClass.add(this._frmtdlg.domNode, 'coordinateControlDialog'); } if (this.defaultFormat) { this._frmtdlg.content.formats[this.type].defaultFormat = this.defaultFormat; } this.geomsrvc = new EsriGeometryService(this.parentWidget.appConfig.geometryService); this.dt = new EsriDraw(this.parentWidget.map); this.initUI(); //get the current extent center this.currentClickPoint = this.parentWidget.map.extent.getCenter(); this.getDDPoint(this.currentClickPoint).then(dojoLang.hitch(this, function (mapPoint) { this.currentClickPointDD = mapPoint; this.currentClickPointDDDD = mapPoint; this.formatButton.title = this.nls.formatInput; }), dojoLang.hitch(this, function (err) { console.error(err); })); this.setUIListeners(); }, /** * **/ initUI: function () { // show label above control if (this.label === null) { this.setHidden(this.coordNameContainer, false); } else { this.coordName.innerText = this.label; } if (this.input) { // hide any actions we don't want to see on the input coords this.setHidden(this.expandButton, true); //we never want to show expand button on input this.setHidden(this.removeControlBtn, true); //we never want to show delete on input if (this.drawButtonLabel === null) { // if no drawButtonLabel supplied hide button this.setHidden(this.drawPointButton, true); } else { this.drawPointButton.title = this.drawButtonLabel; if (this.drawToolTip === null) { this.drawToolTip = this.nls.tooltip; } } } else { //for an output control set the text area to read only this.coordtext.disabled = true; this.setHidden(this.drawPointButton, true); //we never want to show draw button on output if (!this.showExpandButton) { this.setHidden(this.expandButton, true); dojoDomClass.remove(this.domNode, "coordinateContainer"); dojoDomClass.add(this.domNode, "outputCoordinateContainer"); dojoDomClass.add(this.cpbtn, 'outputCopyBtn'); this.coordtext.readOnly = true; } if (!this.showDeleteButton) { this.setHidden(this.removeControlBtn, true); } } if (!this.showCopyButton) { this.setHidden(this.cpbtn, true); dojoDomClass.add(this.cpbtn, 'inputCopyBtn'); dojoDomAttr.set(this.cpbtn, 'title', this.nls.copyAll); } if (!this.showFormatButton) { this.setHidden(this.formatButton, true); } if (this.zoomScale === null) { this.setHidden(this.zoomButton, true); } }, /** * **/ setUIListeners: function () { if (!this.input) { dojoTopic.subscribe( 'INPUTPOINTDIDCHANGE', dojoLang.hitch(this, this.mapWasClicked) ); } dojoTopic.subscribe( 'INPUTERROR', dojoLang.hitch(this, this.inputError) ); // listen for dijit events this.own(dojoOn( this.expandButton, 'click', dojoLang.hitch(this, this.expandButtonWasClicked) )); this.own(dojoOn( this.zoomButton, 'click', dojoLang.hitch(this, this.zoomButtonWasClicked) )); this.cpbtn.addEventListener( 'click', dojoLang.hitch(this, this.cpBtnWasClicked) ); this.subVal1CpBtn.addEventListener( 'click', dojoLang.hitch(this, this.cpSubBtnWasClicked) ); this.subVal2CpBtn.addEventListener( 'click', dojoLang.hitch(this, this.cpSubBtnWasClicked) ); this.subVal3CpBtn.addEventListener( 'click', dojoLang.hitch(this, this.cpSubBtnWasClicked) ); this.subVal4CpBtn.addEventListener( 'click', dojoLang.hitch(this, this.cpSubBtnWasClicked) ); this.own(dojoOn( this.formatButton, 'click', dojoLang.hitch(this, this.formatButtonWasClicked) )); this.own(dojoOn( this.drawPointButton, 'click', dojoLang.hitch(this, this.drawPointButtonWasClicked) )); this.own(dojoOn(this._frmtdlg.content.applyButton, 'click', dojoLang.hitch(this, function () { this.type = this._frmtdlg.content.ct; this.updateDisplay(); if (!this.hasCustomLabel && !this._frmtdlg.content.formats[this._frmtdlg.content.ct].useCustom) { //this.coordName.set('value', this._frmtdlg.content.ct); } dijitPopup.close(this._frmtdlg); }))); this.own(dojoOn(this._frmtdlg.content.cancelButton, 'click', dojoLang.hitch(this, function () { dijitPopup.close(this._frmtdlg); }))); this.own(dojoOn( this.coordtext, 'keyup', dojoLang.hitch(this, this.coordTextInputKeyWasPressed) )); this.own(this.geomsrvc.on('error', dojoLang.hitch( this, this.geomSrvcDidFail))); this.own(dojoOn( this.dt, 'draw-complete', dojoLang.hitch(this, this.drawComplete) )); }, /** * **/ popupDidClose: function () { var isCanceled = this._frmtdlg.content.isCanceled; if (isCanceled) { if (this.addSign !== this._frmtdlg.content.addSignChkBox.checked) { this._frmtdlg.content.addSignChkBox.checked = this.addSign; } return; } this.addSign = this._frmtdlg.content.addSignChkBox.checked; var fv = this._frmtdlg.content.ct; if (this.type !== fv) { this.type = fv; this.updateDisplay(); } }, /** * **/ cpSubBtnWasClicked: function (evt) { var c = evt.currentTarget.id.split('~')[0]; var s; this[c].select(); try { s = document.execCommand('copy'); } catch (err) { s = false; } var t = s ? this.nls.copySuccessful : this.nls.copyFailed; this.showToolTip(evt.currentTarget.id, t); }, /** * **/ cpBtnWasClicked: function (evt) { evt.preventDefault(); var s, t, tv, fw, w; if (this.input) { fw = dijitRegistry.toArray().filter(function (w) { return w.baseClass === 'jimu-widget-cc' && !w.input; }); fw.reverse(); w = fw.map(function (w) { return w.coordtext.value; }).join('\r\n'); tv = this.coordtext.value; w = tv + '\r\n' + w; this.coordtext.value = w; this.coordtext.select(); try { s = document.execCommand('copy'); } catch (caerr) { s = false; } this.coordtext.value = tv; } else { this.coordtext.select(); try { s = document.execCommand('copy'); } catch (cerr) { s = false; } } t = s ? this.nls.copySuccessful : this.nls.copyFailed; this.showToolTip(this.cpbtn.id, t); }, /** * **/ showToolTip: function (onId, withText) { var n = dojoDom.byId(onId); dijitTooltip.show(withText, n); setTimeout(function () { dijitTooltip.hide(n); }, 1000); }, /** * **/ geomSrvcDidComplete: function (r) { if (r[0].length <= 0) { new JimuMessage({ message: this.nls.parseCoordinatesError }); dojoTopic.publish('INPUTERROR'); return; } var newpt = new EsriPoint(r[0][0], r[0][1], new EsriSpatialReference({ wkid: 4326 })); this.currentClickPointDD = this.currentClickPoint = newpt; if (this.input) { this.parentWidget.map.centerAt(this.currentClickPointDD); this.updateDisplay(); dojoTopic.publish('INPUTPOINTDIDCHANGE', { mapPoint: this.currentClickPointDD, inputFromText: true }); } }, /** * **/ geomSrvcDidFail: function () { new JimuMessage({ message: this.nls.parseCoordinatesError }); dojoTopic.publish('INPUTERROR'); }, /** * Handles enter key press event **/ coordTextInputKeyWasPressed: function (evt) { if (evt.keyCode === dojoKeys.ENTER) { var sanitizedInput = this.getCleanInput(evt.currentTarget.value); this.getCoordinateType(sanitizedInput).then(dojoLang.hitch(this, function (itm) { if (itm) { if (itm.length === 1) { var withStr = this.processCoordTextInput(sanitizedInput, itm[0], false); this.getXYNotation(withStr, itm[0].conversionType).then( dojoLang.hitch(this, function (r) { if (r[0].length > 0) { this.geomSrvcDidComplete(r); } else { this.geomSrvcDidFail(); } })); } else { var dialog = new ConfirmNotation({ title: this.nls.comfirmInputNotation, nls: this.nls, options: itm, style: "width: 400px", hasSkipCheckBox: false, theme: this.parentWidget.appConfig.theme.name }); dialog.show().then(dojoLang.hitch(this, function () { var singleMatch = dojoArray.filter(itm, function (singleItm) { return singleItm.name === dialog.comboOptions.get('value'); }); var withStr = this.processCoordTextInput(sanitizedInput, singleMatch[0], false); this.getXYNotation(withStr, singleMatch[0].conversionType).then( dojoLang.hitch(this, function (r) { if (r[0].length > 0) { this.geomSrvcDidComplete(r); } else { this.geomSrvcDidFail(); } })); }, function () { //THROW ERROR })); } } else { new JimuMessage({ message: this.nls.parseCoordinatesError }); dojoTopic.publish('INPUTERROR'); } })); dojoDomAttr.set(this.coordtext, 'value', sanitizedInput); this.emit('get-coordinate-complete', sanitizedInput); this.currentClickPoint = null; } }, /** * Returns the sanitized formatted coordinate */ getFormattedCoordinateText: function () { return this.coordtext.value; }, /** * Returns the current map coordinate */ getCurrentMapCoordinate: function () { return this.currentClickPoint; }, /** * Returns the current map coordinate in DD */ getMapCoordinateDD: function () { return this.currentClickPointDD; }, /** * **/ processCoordTextInput: function (withStr, asType, testingMode) { var match = asType.pattern.exec(withStr); var northSouthPrefix, northSouthSuffix, eastWestPrefix, eastWestSuffix, latDeg, longDeg, latMin, longMin, latSec, longSec; var prefixSuffixError = false; var conversionType = asType.name; switch (asType.name) { case 'DD': northSouthPrefix = match[2]; northSouthSuffix = match[7]; eastWestPrefix = match[10]; eastWestSuffix = match[16]; latDeg = match[3].replace(/[,:]/, '.'); longDeg = match[11].replace(/[,:]/, '.'); conversionType = 'DD'; break; case 'DDrev': northSouthPrefix = match[11]; northSouthSuffix = match[16]; eastWestPrefix = match[2]; eastWestSuffix = match[8]; latDeg = match[12].replace(/[,:]/, '.'); longDeg = match[3].replace(/[,:]/, '.'); conversionType = 'DD'; break; case 'DDM': northSouthPrefix = match[2]; northSouthSuffix = match[7]; eastWestPrefix = match[10]; eastWestSuffix = match[15]; latDeg = match[3]; latMin = match[4].replace(/[,:]/, '.'); longDeg = match[11]; longMin = match[12].replace(/[,:]/, '.'); conversionType = 'DDM'; break; case 'DDMrev': northSouthPrefix = match[10]; northSouthSuffix = match[15]; eastWestPrefix = match[2]; eastWestSuffix = match[7]; latDeg = match[11]; latMin = match[12].replace(/[,:]/, '.'); longDeg = match[3]; longMin = match[4].replace(/[,:]/, '.'); conversionType = 'DDM'; break; case 'DMS': northSouthPrefix = match[2]; northSouthSuffix = match[8]; eastWestPrefix = match[11]; eastWestSuffix = match[17]; latDeg = match[3]; latMin = match[4]; latSec = match[5].replace(/[,:]/, '.'); longDeg = match[12]; longMin = match[13]; longSec = match[14].replace(/[,:]/, '.'); conversionType = 'DMS'; break; case 'DMSrev': northSouthPrefix = match[11]; northSouthSuffix = match[17]; eastWestPrefix = match[2]; eastWestSuffix = match[8]; latDeg = match[12]; latMin = match[13]; latSec = match[14].replace(/[,:]/, '.'); longDeg = match[3]; longMin = match[4]; longSec = match[5].replace(/[,:]/, '.'); conversionType = 'DMS'; break; } //check for north/south prefix/suffix if (northSouthPrefix && northSouthSuffix) { prefixSuffixError = true; if (new RegExp(/[Ss-]/).test(northSouthPrefix)) { northSouthPrefix = '-'; } else { northSouthPrefix = '+'; } } else { if (northSouthPrefix && new RegExp(/[Ss-]/).test(northSouthPrefix)) { northSouthPrefix = '-'; } else { if (northSouthSuffix && new RegExp(/[Ss-]/).test(northSouthSuffix)) { northSouthPrefix = '-'; } else { northSouthPrefix = '+'; } } } //check for east/west prefix/suffix if (eastWestPrefix && eastWestSuffix) { prefixSuffixError = true; if (new RegExp(/[Ww-]/).test(eastWestPrefix)) { eastWestPrefix = '-'; } else { eastWestPrefix = '+'; } } else { if (eastWestPrefix && new RegExp(/[Ww-]/).test(eastWestPrefix)) { eastWestPrefix = '-'; } else { if (eastWestSuffix && new RegExp(/[Ww-]/).test(eastWestSuffix)) { eastWestPrefix = '-'; } else { eastWestPrefix = '+'; } } } //give user warning if lat or long is determined as having a prefix and suffix if (prefixSuffixError) { if (!testingMode) { new JimuMessage({ message: this.nls.latLongWarningMessage }); } } switch (conversionType) { case 'DD': withStr = northSouthPrefix + latDeg + ',' + eastWestPrefix + longDeg; break; case 'DDM': withStr = northSouthPrefix + latDeg + ' ' + latMin + ',' + eastWestPrefix + longDeg + ' ' + longMin; break; case 'DMS': withStr = northSouthPrefix + latDeg + ' ' + latMin + ' ' + latSec + ',' + eastWestPrefix + longDeg + ' ' + longMin + ' ' + longSec; break; default: withStr = withStr; break; } return withStr; }, /** * **/ zoomButtonWasClicked: function () { if (this.parentWidget.map.getZoom() < this.zoomScale) { this.parentWidget.map.centerAt(this.currentClickPointDD).then( dojoLang.hitch(this, function () { this.parentWidget.map.setScale(this.zoomScale); }) ); } else { this.parentWidget.map.centerAt(this.currentClickPointDD); } }, /** * **/ setHidden: function (cntrl, shouldDestroy) { dojoDomStyle.set(cntrl, 'display', 'none'); if (shouldDestroy) { dojoDomConstruct.destroy(cntrl.parentNode); } }, /** * **/ setVisible: function (cntrl) { dojoDomStyle.set(cntrl, 'display', 'inline-flex'); }, /** * **/ remove: function () { this.destroyRecursive(); }, /** * **/ mapWasClicked: function (evt) { this.currentClickPoint = evt.mapPoint; this.getDDPoint(evt.mapPoint).then(dojoLang.hitch(this, function (mapPoint) { this.currentClickPointDD = mapPoint; if (evt.inputFromText) { this.inputFromText = true; } else { this.inputFromText = false; } this.updateDisplay(); }), dojoLang.hitch(this, function (err) { console.error(err); } )); }, /** * **/ getDDPoint: function (fromPoint) { var def = new dojoDeferred(); var webMerc = new EsriSpatialReference(3857); if (EsriWMUtils.canProject(fromPoint, webMerc)) { // if the point is in geographics or can be projected to geographics do so def.resolve(EsriWMUtils.webMercatorToGeographic(EsriWMUtils.project(fromPoint, webMerc))); } else { // if the point is NOT geographics and can NOT be projected to geographics // Find the most appropriate geo transformation and project the point to geographic var args = { url: this.geomsrvc.url + '/findTransformations', content: { f: 'json', inSR: fromPoint.spatialReference.wkid, outSR: 4326, extentOfInterest: JSON.stringify(this.parentWidget.map.extent) // jshint ignore:line }, handleAs: 'json', callbackParamName: 'callback' }; new EsriRequest(args, { usePost: false }).then(dojoLang.hitch(this, function (response) { var transformations = response && response.transformations ? response.transformations : undefined; var wkid = transformations && transformations.length > 0 ? transformations[0].wkid : undefined; var pp = new EsriProjectParameters(); pp.outSR = new EsriSpatialReference(4326); pp.geometries = [fromPoint]; pp.transformForward = true; pp.transformation = wkid; this.geomsrvc.project(pp, dojoLang.hitch(this, function (r) { def.resolve(r[0]); }), function (err) { def.reject(err); }); }), dojoLang.hitch(this, function (err) { def.reject(err); })); } return def; }, /** * **/ getProjectedPoint: function (fromPoint) { var def = new dojoDeferred(); if (EsriWMUtils.canProject(fromPoint, this.parentWidget.map)) { // if the geographic point can be projected the map spatial reference do so def.resolve(EsriWMUtils.geographicToWebMercator(fromPoint)); } else { // if the point can NOT be projected to the maps spatial reference // find the most appropriate geo transformation and project the point to the map SR var args = { url: this.geomsrvc.url + '/findTransformations', content: { f: 'json', inSR: 4326, outSR: this.parentWidget.map.spatialReference.wkid, extentOfInterest: JSON.stringify(this.parentWidget.map.extent) // jshint ignore:line }, handleAs: 'json', callbackParamName: 'callback' }; new EsriRequest(args, { usePost: false }).then(dojoLang.hitch(this, function (response) { var transformations = response && response.transformations ? response.transformations : undefined; var wkid = transformations && transformations.length > 0 ? transformations[0].geoTransforms[0].wkid : undefined; var pp = new EsriProjectParameters(); pp.outSR = new EsriSpatialReference(this.parentWidget.map.spatialReference); pp.geometries = [fromPoint]; pp.transformForward = true; pp.transformation = wkid; this.geomsrvc.project(pp, dojoLang.hitch(this, function (r) { def.resolve(r[0]); }), function (err) { def.reject(err); }); }), dojoLang.hitch(this, function (err) { def.reject(err); })); } return def; }, /** * **/ expandButtonWasClicked: function () { dojoDomClass.toggle(this.coordcontrols, 'expanded'); if (dojoDomClass.contains(this.coordcontrols, 'expanded')) { dojoDomClass.remove(this.expandButton, "expandBtn"); dojoDomClass.add(this.expandButton, "collapseBtn"); } else { dojoDomClass.remove(this.expandButton, "collapseBtn"); dojoDomClass.add(this.expandButton, "expandBtn"); } // if this.coordcontrols is expanded then disable all it's children this.setSubCoordUI(dojoDomClass.contains(this.coordcontrols, 'expanded')); }, /** * **/ formatButtonWasClicked: function () { this._frmtdlg.content.setCt(this.type); dijitPopup.open({ popup: this._frmtdlg, around: this.formatButton }); }, /** * **/ drawPointButtonWasClicked: function () { if (dojoDomClass.contains(this.drawPointButton, 'drawPointBtn-active')) { //already selected so deactivate draw tool this.dt.deactivate(); this.parentWidget.map.enableMapNavigation(); } else { this.parentWidget.map.disableMapNavigation(); this.dt.activate(EsriDraw.POINT); var tooltip = this.dt._tooltip; if (tooltip) { tooltip.innerHTML = this.drawToolTip; } } dojoDomClass.toggle(this.drawPointButton, 'drawPointBtn-active'); }, drawComplete: function (results) { this.dt.deactivate(); dojoDomClass.toggle(this.drawPointButton, 'drawPointBtn-active'); var evt = {}; evt.mapPoint = results.geometry; this.parentWidget.map.enableMapNavigation(); this.mapWasClicked(evt); }, /** * **/ setSubCoordUI: function (expanded) { if (expanded) { var cntrHeight = '165px'; switch (this.type) { case 'DD': case 'DMS': case 'DDM': this.sub1label.innerHTML = 'Lat'; this.sub2label.innerHTML = 'Lon'; this.setHidden(this.sub3, false); this.setHidden(this.sub4, false); cntrHeight = '90px'; break; case 'GARS': this.sub1label.innerHTML = 'Lon'; this.sub2label.innerHTML = 'Lat'; this.sub3label.innerHTML = 'Quadrant'; this.sub4label.innerHTML = 'Key'; this.setVisible(this.sub3); this.setVisible(this.sub4); break; case 'GEOREF': this.sub1label.innerHTML = '15° Quad'; this.sub2label.innerHTML = '1° Quad'; this.sub3label.innerHTML = 'Easting'; this.setVisible(this.sub3); this.sub4label.innerHTML = 'Northing'; this.setVisible(this.sub4); break; case 'USNG': case 'MGRS': this.sub1label.innerHTML = 'GZD'; this.sub2label.innerHTML = 'Grid Sq'; this.sub3label.innerHTML = 'Easting'; this.sub4label.innerHTML = 'Northing'; this.setVisible(this.sub3); this.setVisible(this.sub4); break; case 'UTM': this.sub1label.innerHTML = 'Zone'; this.sub2label.innerHTML = 'Band'; this.sub3label.innerHTML = 'Easting'; this.sub4label.innerHTML = 'Northing'; this.setVisible(this.sub3); this.setVisible(this.sub4); break; case 'UTM_H': this.sub1label.innerHTML = 'Zone'; this.sub2label.innerHTML = 'Hemisphere'; this.sub3label.innerHTML = 'Easting'; this.sub4label.innerHTML = 'Northing'; this.setVisible(this.sub3); this.setVisible(this.sub4); break; } dojoDomStyle.set(this.coordcontrols, 'height', cntrHeight); dojoDomStyle.set(this.coordcontrols, 'width', '300px'); } else { dojoDomStyle.set(this.coordcontrols, 'height', '0px'); } }, /** * **/ setCoordUI: function (withValue) { var formattedStr; if (withValue) { var cntrlid = this.uid.split('_')[1]; // make sure we haven't been removed if (!this['cc_' + cntrlid + 'sub1val']) { return; } if (this.input && this.inputFromText) { return; } else { var format; var f = this._frmtdlg.content.formats[this.type]; var r; if (f.useCustom) { format = f.customFormat; } else { format = f.defaultFormat; } switch (this.type) { case 'DD': r = this.getFormattedDDStr(withValue, format, this.addSign); this['cc_' + cntrlid + 'sub1val'].value = dojoString.substitute('${xcrd}', { xcrd: r.latdeg }); this['cc_' + cntrlid + 'sub2val'].value = dojoString.substitute('${ycrd}', { ycrd: r.londeg }); formattedStr = r.formatResult; break; case 'DDM': r = this.getFormattedDDMStr(withValue, format, this.addSign); this['cc_' + cntrlid + 'sub1val'].value = dojoString.substitute('${latd} ${latm}', { latd: r.latdeg, latm: r.latmin }); this['cc_' + cntrlid + 'sub2val'].value = dojoString.substitute('${lond} ${lonm}', { lond: r.londeg, lonm: r.lonmin }); formattedStr = r.formatResult; break; case 'DMS': r = this.getFormattedDMSStr(withValue, format, this.addSign); this['cc_' + cntrlid + 'sub1val'].value = dojoString.substitute('${latd} ${latm} ${lats}', { latd: r.latdeg, latm: r.latmin, lats: r.latsec }); this['cc_' + cntrlid + 'sub2val'].value = dojoString.substitute('${lond} ${lonm} ${lons}', { lond: r.londeg, lonm: r.lonmin, lons: r.lonsec }); formattedStr = r.formatResult; break; case 'USNG': r = this.getFormattedUSNGStr(withValue, format, false); this['cc_' + cntrlid + 'sub1val'].value = r.gzd; this['cc_' + cntrlid + 'sub2val'].value = r.grdsq; this['cc_' + cntrlid + 'sub3val'].value = r.easting; this['cc_' + cntrlid + 'sub4val'].value = r.northing; formattedStr = r.formatResult; break; case 'MGRS': r = this.getFormattedMGRSStr(withValue, format, false); this['cc_' + cntrlid + 'sub1val'].value = r.gzd; this['cc_' + cntrlid + 'sub2val'].value = r.grdsq; this['cc_' + cntrlid + 'sub3val'].value = r.easting; this['cc_' + cntrlid + 'sub4val'].value = r.northing; formattedStr = r.formatResult; break; case 'GARS': r = this.getFormattedGARSStr(withValue, format, false); this['cc_' + cntrlid + 'sub1val'].value = r.lon; this['cc_' + cntrlid + 'sub2val'].value = r.lat; this['cc_' + cntrlid + 'sub3val'].value = r.quadrant; this['cc_' + cntrlid + 'sub4val'].value = r.key; formattedStr = r.formatResult; break; case 'GEOREF': r = this.getFormattedGEOREFStr(withValue, format, false); this['cc_' + cntrlid + 'sub1val'].value = r.lon + r.lat; this['cc_' + cntrlid + 'sub2val'].value = r.quadrant15lon + r.quadrant15lat; this['cc_' + cntrlid + 'sub3val'].value = r.quadrant1lon; this['cc_' + cntrlid + 'sub4val'].value = r.quadrant1lat; formattedStr = r.formatResult; break; case 'UTM': r = this.getFormattedUTMStr(withValue, format, false); if (r.bandLetter.match(/^[AaBbYyZz]/)) { //do not calculate values if out side of the UTM range (i.e. polar regions) this['cc_' + cntrlid + 'sub1val'].value = ''; this['cc_' + cntrlid + 'sub2val'].value = ''; this['cc_' + cntrlid + 'sub3val'].value = ''; this['cc_' + cntrlid + 'sub4val'].value = ''; r.formatResult = ''; } else { this['cc_' + cntrlid + 'sub1val'].value = r.zone; this['cc_' + cntrlid + 'sub2val'].value = r.bandLetter; this['cc_' + cntrlid + 'sub3val'].value = r.easting; this['cc_' + cntrlid + 'sub4val'].value = r.westing; } //r.bandLetter.match(/^[AaBbYyZz]/)?this.coordName.set('value','UPS'):this.coordName.set('value','UTM'); formattedStr = r.formatResult; break; case 'UTM_H': r = this.getFormattedUTMHStr(withValue, format, false); if (r.hemisphere.match(/^[AaBbYyZz]/)) { //do not calculate values if out side of the UTM range (i.e. polar regions) this['cc_' + cntrlid + 'sub1val'].value = ''; this['cc_' + cntrlid + 'sub2val'].value = ''; this['cc_' + cntrlid + 'sub3val'].value = ''; this['cc_' + cntrlid + 'sub4val'].value = ''; r.formatResult = ''; } else { this['cc_' + cntrlid + 'sub1val'].value = r.zone; this['cc_' + cntrlid + 'sub2val'].value = r.hemisphere; this['cc_' + cntrlid + 'sub3val'].value = r.easting; this['cc_' + cntrlid + 'sub4val'].value = r.westing; } //r.hemisphere.match(/^[AaBbYyZz]/) ? // this.coordName.set('value','UPS') : // this.coordName.set('value','UTM_H'); formattedStr = r.formatResult; break; } } } else { formattedStr = ''; } this.setSubCoordUI(dojoDomClass.contains(this.coordcontrols, 'expanded')); if (this.coordtext) { dojoDomAttr.set(this.coordtext, 'value', formattedStr); this.emit('get-coordinate-complete', formattedStr); } }, /** * **/ getFormattedCoordinates: function () { this.getCoordValues(this.currentClickPointDD, this.type, 4).then( dojoLang.hitch(this, function (r) { this.setCoordUI(r); }), dojoLang.hitch(this, function (err) { console.log(err); }) ); }, /** * **/ updateDisplay: function () { this.getFormattedCoordinates(this.currentClickPointDD); if (this.input) { if (this.graphicsLayer !== null) { this.graphicsLayer.clear(); if (this.currentClickPoint.spatialReference.wkid === this.parentWidget.map.spatialReference.wkid) { this.graphicsLayer.add(new EsriGraphic(this.currentClickPoint)); } else { this.getProjectedPoint(this.currentClickPointDD).then(dojoLang.hitch(this, function (mapPoint) { this.graphicsLayer.add(new EsriGraphic(mapPoint)); } ), dojoLang.hitch(this, function (err) { console.error(err); })); } } dojoTopic.publish('INPUTPOINTDIDCHANGE', { mapPoint: this.currentClickPointDD, inputFromText: true }); } }, /** * **/ inputError: function () { this.setCoordUI(); }, /** * **/ getCleanInput: function (fromstr) { fromstr = fromstr.replace(/\n/g, ''); fromstr = fromstr.replace(/\s+/g, ' ').trim(); return fromstr.toUpperCase(); }, /** * Send request to get dd coordinates in format string **/ getCoordValues: function (fromInput, toType, numDigits) { var deferred = new dojoDeferred(); var nd = numDigits || 6; var tt; if (toType.name) { tt = toType.name; } else { tt = toType; } /** * for parameter info * http://resources.arcgis.com/en/help/arcgis-rest-api/#/To_GeoCoordinateString/02r30000026w000000/ **/ var params = { sr: 4326, coordinates: [ [fromInput.x, fromInput.y] ], conversionType: tt, numOfDigits: nd, rounding: true, addSpaces: false }; switch (toType) { case 'DD': params.numOfDigits = 6; break; case 'USNG': params.numOfDigits = 5; break; case 'MGRS': params.conversionMode = 'mgrsDefault'; params.numOfDigits = 5; break; case 'UTM_H': params.conversionType = 'utm'; params.conversionMode = 'utmNorthSouth'; params.addSpaces = true; break; case 'UTM': params.conversionType = 'utm'; params.conversionMode = 'utmDefault'; params.addSpaces = true; break; case 'GARS': params.conversionMode = 'garsDefault'; break; } this.geomsrvc.toGeoCoordinateString(params).then(function (itm) { deferred.resolve(itm); }, function () { deferred.resolve(null); }); return deferred.promise; }, /** * **/ getXYNotation: function (fromStr, toType) { var deferred = new dojoDeferred(); var a; var tt; if (toType.name) { tt = toType.name; } else { tt = toType; } var params = { sr: 4326, conversionType: tt, strings: [] }; switch (tt) { case 'DD': case 'DDM': case 'DMS': params.numOfDigits = 2; a = fromStr.replace(/[°˚º^~*"'′¨˝]/g, ''); params.strings.push(a); break; case 'DDrev': params.conversionType = 'DD'; params.numOfDigits = 2; a = fromStr.replace(/[°˚º^~*"'′¨˝]/g, ''); params.strings.push(a); break; case 'DDMrev': params.conversionType = 'DDM'; params.numOfDigits = 2; a = fromStr.replace(/[°˚º^~*"'′¨˝]/g, ''); params.strings.push(a); break; case 'DMSrev': params.conversionType = 'DMS'; params.numOfDigits = 2; a = fromStr.replace(/[°˚º^~*"'′¨˝]/g, ''); params.strings.push(a); break; case 'USNG': params.strings.push(fromStr); params.addSpaces = 'false'; break; case 'MGRS': params.conversionMode = 'mgrsNewStyle'; params.strings.push(fromStr); params.addSpaces = 'false'; break; case 'UTM_H': params.conversionType = 'utm'; params.conversionMode = 'utmNorthSouth'; params.strings.push(fromStr); break; case 'UTM': params.conversionType = 'utm'; params.conversionMode = 'utmDefault'; params.strings.push(fromStr); break; case 'GARS': params.conversionMode = 'garsCenter'; params.strings.push(fromStr); break; case 'GEOREF': params.strings.push(fromStr); break; } this.geomsrvc.fromGeoCoordinateString(params).then(function (itm) { deferred.resolve(itm); }, function () { deferred.resolve(null); }); return deferred.promise; }, getNotations: function () { // using jshint ignore line on parts of the regular // expressions that cannot be split over lines var strs = [{ name: "DD", pattern: new RegExp([ /^(([NS\+\-\s])*([0-8]?\d([,.]\d*)?|90([,.]0*)?)([°˚º^~*]*)([NS\+\-\s])*)([,:;\s|\/\\]+)/, /(([EW\+\-\s])*([0]?\d?\d([,.]\d*)?|1[0-7]\d([,.]\d*)?|180([,.]0*)?)([°˚º^~*]*)([EW\+\-\s])*)$/ // jshint ignore:line ].map(function (r) { return r.source; }).join("")), notationType: this.nls.DDLatLongNotation, conversionType: "DD" }, { name: "DDrev", pattern: new RegExp([ /^(([EW\+\-\s])*([0]?\d?\d([,.]\d*)?|1[0-7]\d([,.]\d*)?|180([,.]0*)?)([°˚º^~*]*)([EW\+\-\s])*)/, // jshint ignore:line /([,:;\s|\/\\]+)(([NS\+\-\s])*([0-8]?\d([,.]\d*)?|90([,.]0*)?)([°˚º^~*]*)([NS\+\-\s])*)$/ ].map(function (r) { return r.source; }).join("")), notationType: this.nls.DDLongLatNotation, conversionType: "DD" }, { name: "DDM", pattern: new RegExp([ /^(([NS\+\-\s])*([0-8]?\d|90)[°˚º^~*\s\-_]+(([0-5]?\d|\d)([,.]\d*)?)['′\s_]*([NS\+\-\s])*)/, /([,:;\s|\/\\]+)/, /(([EW\+\-\s])*([0]?\d?\d|1[0-7]\d|180)[°˚º^~*\s\-_]+(([0-5]\d|\d)([,.]\d*)?)['′\s_]*([EW\+\-\s])*)/, // jshint ignore:line /[\s]*$/ ].map(function (r) { return r.source; }).join("")), notationType: this.nls.DDMLatLongNotation, conversionType: "DDM" }, { name: "DDMrev", pattern: new RegExp([ /^(([EW\+\-\s])*([0]?\d?\d|1[0-7]\d|180)[°˚º^~*\s\-_]+(([0-5]\d|\d)([,.]\d*)?)['′\s_]*([EW\+\-\s])*)/, // jshint ignore:line /([,:;\s|\/\\]+)/, /(([NS\+\-\s])*([0-8]?\d|90)[°˚º^~*\s\-_]+(([0-5]?\d|\d)([,.]\d*)?)['′\s_]*([NS\+\-\s])*)[\s]*$/ // jshint ignore:line ].map(function (r) { return r.source; }).join("")), notationType: this.nls.DDMLongLatNotation, conversionType: "DDM" }, { name: "DMS", pattern: new RegExp([ /^(([NS\+\-\s])*([0-8]?\d|90)[°˚º^~*\s\-_]+([0-5]?\d|\d)['′\s\-_]+(([0-5]?\d|\d)([,.]\d*)?)["¨˝\s_]*([NS\+\-\s])*)/, // jshint ignore:line /([,:;\s|\/\\]+)/, /(([EW\+\-\s])*([0]?\d?\d|1[0-7]\d|180)[°˚º^~*\s\-_]+([0-5]\d|\d)['′\s\-_]+(([0-5]?\d|\d)([,.]\d*)?)["¨˝\s_]*([EW\+\-\s])*)[\s]*$/ // jshint ignore:line ].map(function (r) { return r.source; }).join("")), notationType: this.nls.DMSLatLongNotation, conversionType: "DMS" }, { name: "DMSrev", pattern: new RegExp([ /^(([EW\+\-\s])*([0]?\d?\d|1[0-7]\d|180)[°˚º^~*\s\-_]+([0-5]\d|\d)['′\s\-_]+(([0-5]?\d|\d)([,.]\d*)?)["¨˝\s_]*([EW\+\-\s])*)/, // jshint ignore:line /([,:;\s|\/\\]+)/, /(([NS\+\-\s])*([0-8]?\d|90)[°˚º^~*\s\-_]+([0-5]?\d|\d)['′\s\-_]+(([0-5]?\d|\d)([,.]\d*)?)["¨˝\s_]*([NS\+\-\s])*)[\s]*$/ // jshint ignore:line ].map(function (r) { return r.source; }).join("")), notationType: this.nls.DMSLongLatNotation, conversionType: "DMS" }, { name: "GARS", pattern: /^\d{3}[a-zA-Z]{2}[1-4]?[1-9]?$/, notationType: this.nls.GARSNotation, conversionType: "GARS" }, { name: "GEOREF", pattern: /^[a-zA-Z]{4}\d{1,8}$/, notationType: this.nls.GEOREFNotation, conversionType: "GEOREF" }, { name: "MGRS", pattern: new RegExp([ /^\d{1,2}[-,;:\s]*[C-HJ-NP-X][-,;:\s]*[A-HJ-NP-Z]{2}[-,;:\s]*/, /(\d[-,;:\s]+\d|\d{2}[-,;:\s]+\d{2}|\d{3}[-,;:\s]+\d{3}|\d{4}[-,;:\s]+\d{4}|\d{5}[-,;:\s]+\d{5})/, // jshint ignore:line /$|^(\d{1,2}[-,;:\s]*[C-HJ-NP-X][-,;:\s]*[A-HJ-NP-Z]{2}[-,;:\s]*)/, /(\d{2}|\d{4}|\d{6}|\d{8}|\d{10})?$|^[ABYZ][-,;:\s]*[A-HJ-NP-Z]{2}[-,;:\s]*/, /(\d[-,;:\s]+\d|\d{2}[-,;:\s]+\d{2}|\d{3}[-,;:\s]+\d{3}|\d{4}[-,;:\s]+\d{4}|\d{5}[-,;:\s]+\d{5})/, // jshint ignore:line /$|^[ABYZ][-,;:\s]*[A-HJ-NP-Z]{2}[-,;:\s]*(\d{2}|\d{4}|\d{6}|\d{8}|\d{10})?$/ ].map(function (r) { return r.source; }).join("")), notationType: this.nls.MGRSNotation, conversionType: "MGRS" }, { name: "UTM", pattern: new RegExp([ /^\d{1,2}[-,;:\s]*[c-hj-np-xC-HJ-NP-X][-,;:\s]*\d{1,6}\.?\d*[mM]?[-,;:\s]?\d{1,7}\.?\d*[mM]?$/ // jshint ignore:line ].map(function (r) { return r.source; }).join("")), notationType: this.nls.UTMBandNotation, conversionType: "UTM" }, { name: "UTM (H)", pattern: new RegExp([ /^\d{1,2}[-,;:\s]*[NnSs][-,;:\s]*\d{1,6}\.?\d*[mM]?[-,;:\s]+\d{1,7}\.?\d*[mM]?$/ ].map(function (r) { return r.source; }).join("")), notationType: this.nls.UTMHemNotation, conversionType: "UTM_H" } ]; return strs; }, getCoordinateType: function (fromInput) { var clnInput = this.getCleanInput(fromInput); var deferred = new dojoDeferred(); //regexr.com var strs = this.getNotations(); var matchedtype = dojoArray.filter(strs, function (itm) { return itm.pattern.test(this.v); }, { v: clnInput }); if (matchedtype.length > 0) { deferred.resolve(matchedtype); } else { deferred.resolve(null); } return deferred.promise; }, /** * **/ getFormattedDDStr: function (fromValue, withFormatStr, addSignPrefix) { var r = {}; r.sourceValue = fromValue; r.sourceFormatString = withFormatStr; var parts = fromValue[0].split(/[ ,]+/); r.latdeg = parts[0].replace(/[nNsS]/, ''); r.londeg = parts[1].replace(/[eEwW]/, ''); if (addSignPrefix) { if (parts[0].slice(-1) === 'N') { r.latdeg = '+' + r.latdeg; } else { r.latdeg = '-' + r.latdeg; } if (parts[1].slice(-1) === "W") { r.londeg = '-' + r.londeg; } else { r.londeg = '+' + r.londeg; } } var s = withFormatStr.replace(/X/, r.londeg); s = s.replace(/[eEwW]/, parts[1].slice(-1)); s = s.replace(/[nNsS]/, parts[0].slice(-1)); s = s.replace(/Y/, r.latdeg); r.formatResult = s; return r; }, /** * **/ getFormattedDDMStr: function (fromValue, withFormatStr, addSignPrefix) { var r = {}; r.sourceValue = fromValue; r.sourceFormatString = withFormatStr; r.parts = fromValue[0].split(/[ ,]+/); r.latdeg = r.parts[0]; r.latmin = r.parts[1].replace(/[nNsS]/, ''); r.londeg = r.parts[2]; r.lonmin = r.parts[3].replace(/[eEwW]/, ''); if (addSignPrefix) { if (r.parts[1].slice(-1) === 'N') { r.latdeg = '+' + r.latdeg; } else { r.latdeg = '-' + r.latdeg; } if (r.parts[3].slice(-1) === 'W') { r.londeg = '-' + r.londeg; } else { r.londeg = '+' + r.londeg; } } //A° B'N X° Y'E var s = withFormatStr.replace(/[EeWw]/, r.parts[3].slice(-1)); s = s.replace(/Y/, r.lonmin); s = s.replace(/X/, r.londeg); s = s.replace(/[NnSs]/, r.parts[1].slice(-1)); s = s.replace(/B/, r.latmin); s = s.replace(/A/, r.latdeg); r.formatResult = s; return r; }, /** * **/ getFormattedDMSStr: function (fromValue, withFormatStr, addSignPrefix) { var r = {}; r.sourceValue = fromValue; r.sourceFormatString = withFormatStr; r.parts = fromValue[0].split(/[ ,]+/); r.latdeg = r.parts[0]; r.latmin = r.parts[1]; r.latsec = r.parts[2].replace(/[NnSs]/, ''); r.londeg = r.parts[3]; r.lonmin = r.parts[4]; if (r.parts[5]) { r.lonsec = r.parts[5].replace(/[EWew]/, ''); } if (addSignPrefix) { if (r.parts[2].slice(-1) === 'N') { r.latdeg = '+' + r.latdeg; } else { r.latdeg = '-' + r.latdeg; } if (r.parts[5].slice(-1) === 'W') { r.londeg = '-' + r.londeg; } else { r.londeg = '+' + r.londeg; } } //A° B' C''N X° Y' Z''E var s = withFormatStr.replace(/A/, r.latdeg); s = s.replace(/B/, r.latmin); s = s.replace(/C/, r.latsec); s = s.replace(/X/, r.londeg); s = s.replace(/Y/, r.lonmin); s = s.replace(/Z/, r.lonsec); s = s.replace(/[NnSs]/, r.parts[2].slice(-1)); if (r.parts[5]) { s = s.replace(/[EeWw]/, r.parts[5].slice(-1)); } r.formatResult = s; return r; }, /** * **/ getFormattedUSNGStr: function (fromValue, withFormatStr) { var r = {}; r.sourceValue = fromValue; r.sourceFormatString = withFormatStr; if (fromValue[0].match(/^[ABYZ]/)) { r.gzd = fromValue[0].match(/[ABYZ]/)[0].trim(); } else { r.gzd = fromValue[0].match(/\d{1,2}[C-HJ-NP-X]/)[0].trim(); } if (fromValue[0].replace(r.gzd, '').match(/[a-hJ-zA-HJ-Z]{2}/)) { r.grdsq = fromValue[0].replace(r.gzd, '').match(/[a-hJ-zA-HJ-Z]{2}/)[0].trim(); } if (fromValue[0].replace(r.gzd + r.grdsq, '').match(/^\d{1,5}/)) { r.easting = fromValue[0].replace(r.gzd + r.grdsq, '').match(/^\d{1,5}/)[0].trim(); } if (fromValue[0].replace(r.gzd + r.grdsq, '').match(/\d{1,5}$/)) { r.northing = fromValue[0].replace(r.gzd + r.grdsq, '').match(/\d{1,5}$/)[0].trim(); } //Z S X# Y# var s = withFormatStr.replace(/Y/, r.northing); s = s.replace(/X/, r.easting); s = s.replace(/S/, r.grdsq); s = s.replace(/Z/, r.gzd); r.formatResult = s; return r; }, /** * **/ getFormattedMGRSStr: function (fromValue, withFormatStr) { var r = {}; r.sourceValue = fromValue; r.sourceFormatString = withFormatStr; if (fromValue[0].match(/^[ABYZ]/)) { r.gzd = fromValue[0].match(/[ABYZ]/)[0].trim(); } else { r.gzd = fromValue[0].match(/\d{1,2}[C-HJ-NP-X]/)[0].trim(); } r.grdsq = fromValue[0].replace(r.gzd, '').match(/[a-hJ-zA-HJ-Z]{2}/)[0].trim(); r.easting = fromValue[0].replace(r.gzd + r.grdsq, '').match(/^\d{1,5}/)[0].trim(); r.northing = fromValue[0].replace(r.gzd + r.grdsq, '').match(/\d{1,5}$/)[0].trim(); //Z S X# Y# var s = withFormatStr.replace(/Y/, r.northing); s = s.replace(/X/, r.easting); s = s.replace(/S/, r.grdsq); s = s.replace(/Z/, r.gzd); r.formatResult = s; return r; }, /** * **/ getFormattedGARSStr: function (fromValue, withFormatStr) { var r = {}; r.sourceValue = fromValue; r.sourceFormatString = withFormatStr; r.lon = fromValue[0].match(/\d{3}/); r.lat = fromValue[0].match(/[a-zA-Z]{2}/); var q = fromValue[0].match(/\d*$/); r.quadrant = q[0][0]; r.key = q[0][1]; //XYQK var s = withFormatStr.replace(/K/, r.key); s = s.replace(/Q/, r.quadrant); s = s.replace(/Y/, r.lat); s = s.replace(/X/, r.lon); r.formatResult = s; return r; }, /** * **/ getFormattedGEOREFStr: function (fromValue, withFormatStr) { var r = {}; r.sourceValue = fromValue; r.sourceFormatString = withFormatStr; r.lon = fromValue[0].match(/[a-zA-Z]{1}/)[0].trim(); r.lat = fromValue[0].replace(r.lon, '').match(/[a-zA-Z]{1}/)[0].trim(); r.quadrant15lon = fromValue[0].replace(r.lon + r.lat, '').match(/[a-zA-Z]{1}/)[0].trim(); r.quadrant15lat = fromValue[0].replace(r.lon + r.lat + r.quadrant15lon, '').match(/[a-zA-Z]{1}/)[0].trim(); var q = fromValue[0].replace(r.lon + r.lat + r.quadrant15lon + r.quadrant15lat, ''); r.quadrant1lon = q.substr(0, q.length / 2); r.quadrant1lat = q.substr(q.length / 2, q.length); //ABCDXY var s = withFormatStr.replace(/Y/, r.quadrant1lat); s = s.replace(/X/, r.quadrant1lon); s = s.replace(/D/, r.quadrant15lat); s = s.replace(/C/, r.quadrant15lon); s = s.replace(/B/, r.lat); s = s.replace(/A/, r.lon); r.formatResult = s; return r; }, /** * **/ getFormattedUTMStr: function (fromValue, withFormatStr) { var r = {}; r.sourceValue = fromValue; r.sourceFormatString = withFormatStr; r.parts = fromValue[0].split(/[ ,]+/); r.zone = r.parts[0].replace(/[A-Z]/, ''); r.bandLetter = r.parts[0].slice(-1); r.easting = r.parts[1]; r.westing = r.parts[2]; //ZB Xm Ym' var s = withFormatStr.replace(/Y/, r.westing); s = s.replace(/X/, r.easting); s = s.replace(/B/, r.bandLetter); s = s.replace(/Z/, r.zone); r.formatResult = s; return r; }, /** * **/ getFormattedUTMHStr: function (fromValue, withFormatStr) { var r = {}; r.sourceValue = fromValue; r.sourceFormatString = withFormatStr; r.parts = fromValue[0].split(/[ ,]+/); r.zone = r.parts[0].replace(/[A-Z]/, ''); r.hemisphere = r.parts[0].slice(-1); r.easting = r.parts[1]; r.westing = r.parts[2]; //ZH Xm Ym' var s = withFormatStr.replace(/Y/, r.westing); s = s.replace(/X/, r.easting); s = s.replace(/H/, r.hemisphere); s = s.replace(/Z/, r.zone); r.formatResult = s; return r; } }); });