if (Freeance_Extension_Manager)
Freeance_Extension_Manager.register('coordConv',function(){
		document.CoordinateControl = new (
			function (){
				var eventHandlers = {requestCoords:[],receiveCoords:[]};
				function decdeg_to_dms(dd){
					var pos=(dd>0);
					dd=Math.abs(dd);
					var D = Math.floor(dd);
					var dm = (dd-D) * 60;
					var M = Math.floor(dm);
					var S = (dm-M) * 60;
					var arr = new Array(D*(pos?1:-1),M,S);
					return(arr);
				}
				function dmsToStr(dmsArray){
					return (dmsArray[0]+'° '+dmsArray[1]+"' "+Math.floor(dmsArray[2]*100)/100+'"');
				}
        function dd_to_dm(dd){
          var pos=(dd>0);
					dd=Math.abs(dd);
					var D = Math.floor(dd);
					var M = (dd-D) * 60;
					var arr = new Array(D*(pos?1:-1),M);
					return(arr);
        }
				function dmToStr(dmArray){
					return (dmArray[0]+'° '+Math.floor(dmArray[1]*10000)/10000+"'");
				}
				function str_to_decdeg(str){
					var parts1 = str.split('°');
					if(parts1.length <= 1){
						return parseFloat(str);
					}
					var parts2 = parts1[1].split("'");
					var deg = parseFloat(parts1[0]);
					var sign = 1;
					if(deg < 0)
						sign = -1;
					var min = parseFloat(parts2[0])/60*sign;
					var sec = parseFloat(parts2[1])/3600*sign;
          if(isNaN(sec))
            sec = 0;
					return deg+min+sec;
				}
				this.str_to_decdeg = str_to_decdeg;
				function _mapClick(response){
					if(!response.XMLRPC_FAULT){
            switch(document.mapObject.config.coordDisplay){
              case 'dm':
                $('latitudeInput').value = dmToStr(dd_to_dm(response.data['lat']));
                $('longitudeInput').value = dmToStr(dd_to_dm(response.data['lon']));
                break;
              case 'dms':
                $('latitudeInput').value = dmsToStr(decdeg_to_dms(response.data['lat']));
                $('longitudeInput').value = dmsToStr(decdeg_to_dms(response.data['lon']));
                break;
              case 'dd':
              default:
                $('latitudeInput').value = response.data['lat'];
                $('longitudeInput').value = response.data['lon'];
                break;
            }
					}
					var handlers=eventHandlers["receiveCoords"];
					for (var i=0;i<handlers.length;i++){
						if(typeof(handlers[i])=='function')
							handlers[i](response.data);
					}
				};
				function mapClick (xPos,yPos,width,height,XPercent,YPercent,clickMode){
					var extent = document.mapObject.extent;
					var extentHeight = extent[1]-extent[0];
					var extentWidth = extent[3]-extent[2];
					var coords={x:XPercent*extentWidth+extent[2],y:YPercent*extentHeight+extent[0]};
					freeance_request(_mapClick,'CoordConv.SP.to.LL',document.mapObject.config.projectionId,coords.x,coords.y);
					var handlers=eventHandlers["requestCoords"];
					for (var i=0;i<handlers.length;i++){
						if(typeof(handlers[i])=='function')
							handlers[i](coords);
					}
				};
				document.mapObject.addCursorEventHandler('click','CoordConvSP2LatLon',function(xPos,yPos,width,height,XPercent,YPercent,clickMode){mapClick(xPos,yPos,width,height,XPercent,YPercent,clickMode);});
				this.addEventHandler = function(eventType,callback){if (eventHandlers[eventType]!=null)eventHandlers[eventType].push(callback);return eventHandlers[eventType].length-1;};
				this.removeEventHandler = function(eventType,index){if (eventHandlers[eventType]!=null)eventHandlers[eventType][index]=null;};
			})();
			var latLonButton = (document.mapToolbar.showButton('latLonButton'))?document.mapToolbar.getButton('latLonButton'):document.mapToolbar.addButton('bufferButton',ToolBar.BUTTON_RADIO,ToolBar.ADD_BUTTON_LAST,null,25,25,75,true,'toolBar.png','Buffer Features',mapCursorRadioButtonGroup,'');
			latLonButton.clickEvent = function (e){
				document.mapObject.mapImage.setMouseMode('CoordConvSP2LatLon');
				setActiveMapTool('coordinateControl');
				$('mapToolPanelNameField').innerHTML = 'Find Lat/Lon Coordinates';
			};
			xAddEventListener($('latlonZoomTo'),'click', function(){
				var latitude = document.CoordinateControl.str_to_decdeg($('latitudeInput').value);
				var longitude = document.CoordinateControl.str_to_decdeg($('longitudeInput').value);
        if(isNaN(latitude) || isNaN(longitude)){
          alert('Invalid coordinates entered');
          return;
        }
				var result = freeance_request(null,'CoordConv.LL.to.SP',document.mapObject.config.projectionId,latitude,longitude);
				if (!result.XMLRPC_FAULT)
        {
          if(document.markupControl && document.mapObject.config.coordZoomToStyle != '')
          {
            document.markupControl.addMarkupPoint_NoRedraw('Zoom to Lat/Lon Result','',document.mapObject.config.coordZoomToStyle,[[[result.data.x,result.data.y]]],[result.data.y-document.mapObject.config.coordZoomToTolerance,result.data.y+document.mapObject.config.coordZoomToTolerance,result.data.x-document.mapObject.config.coordZoomToTolerance,result.data.x+document.mapObject.config.coordZoomToTolerance],null);
          }
					document.mapObject.zoomToExtent([result.data.y-document.mapObject.config.coordZoomToTolerance,result.data.y+document.mapObject.config.coordZoomToTolerance,result.data.x-document.mapObject.config.coordZoomToTolerance,result.data.x+document.mapObject.config.coordZoomToTolerance]);
        }
			});
			return true;
});


