// WR-generated JavaScript compilation 

// WR serving: /js/TWGmapLib.js

	/*
		TW GMaps Lib v.1.0
		
		
	*/


	
	function LocationMarker(long, lat, gMarker)
	{
		this.Long=long;
		this.Lat=lat;
		this.gMarker=gMarker;
		this.commArray=new Array();
	}


	
	LocationMarker.prototype.AddCommunity=function(comm)
	{
		this.commArray[this.commArray.length]=comm;
	}


	
	LocationMarker.prototype.GetCommunities=function()
	{
			return this.commArray;
	}


	
   	function CLongLat(long, lat)
    	{
		this.Long=long;
		this.Lat=lat;
	}


	
	function Community(lat, long, name, id, priceRange, phone, statusId, desc, city, state, zip, divID)
	{
		this.Long=long;
		this.Lat=lat;
		this.Name=name;
		this.Id=id;
		this.PriceRange=priceRange;
		this.Phone=phone;
		this.StatusId=statusId;
		this.Description=desc;
		this.City=city;
		this.State=state;
		this.Zip=zip;
		this.DivID=divID;
	}


	
	Community.COMM_STATUS_INACTIVE=1;
	Community.COMM_STATUS_COMING_SOON=2;
	Community.COMM_STATUS_GRAND_OPENING=3;
	Community.COMM_STATUS_ACTIVE=4;
	Community.COMM_STATUS_CLOSEOUT=5;
	Community.COMM_STATUS_CLOSED=6;
	Community.COMM_STATUS_COMPLETED=-1;
	Community.COMM_STATUS_DC=-2;
	
    var map;
    var mapPrintMode=false;
    var mapHouseClickEnabled=true;
    var isHighRiseDivision=false;
    var mapZoomLevel="N/A";
    
	
	function InitMap(mapElementId)
	{

		if (GBrowserIsCompatible())
		{

			
			map = new GMap2(document.getElementById(mapElementId));

			
			map.addControl(new GSmallMapControl());


			
			var commArray=GetMapData(mapElementId);
            
           
            
            if(commArray.length==0)
            {
                
                return;
            }
            
			
			map.setCenter(new GLatLng(commArray[0].Lat, commArray[0].Long), 13);

			
			var bounds = new GLatLngBounds();

			
			for (var i=0; i<commArray.length; i++)
			{
				bounds.extend(new GLatLng(commArray[i].Lat, commArray[i].Long));

			}

			
			CreateCommunityMarkers(map, commArray);

			
			if (mapZoomLevel == 'N/A')
			{
			    map.setZoom(map.getBoundsZoomLevel(bounds));
			}
			else 
			{
			     map.setZoom(mapZoomLevel);
			}

			
			map.setCenter(bounds.getCenter());

		}
	}


    var markerArray;
	
	
	function CreateCommunityMarkers(map, commArray)
	{

		
		markerArray=new Array();

		var funcCheck=CheckIfMarkerForLocationExists;
		var funcCreate=CreateMarker;

		

		
		
		for(var i=0;i<commArray.length;i++)
		{

			
			var currentLat=commArray[i].Lat;
			var currentLong=commArray[i].Long;


			
			var markerIndex=funcCheck(markerArray, currentLat,currentLong);
			if(markerIndex!=-1)
			{


				
				var locationMarker=markerArray[markerIndex];
				locationMarker.commArray.push(commArray[i]);


			}
			else
			{
				
				var locationMarker=new LocationMarker(currentLong, currentLat);

				
				locationMarker.commArray.push(commArray[i]);

				
				markerArray.push(locationMarker);	
						
			
			}	

			

		}

		


		
		for(var i=0;i<markerArray.length;i++)
		{

			
			var gMarker=funcCreate(map, markerArray[i], i);

			
			map.addOverlay(gMarker);
		}

		
		
	}



    function CheckIfClusterHasAtLeastOneComingSoonCommunity(commArray)
    {
        for(var i=0;i<commArray.length;i++)
		{     
		    if(commArray[i].StatusId == Community.COMM_STATUS_COMING_SOON)
		    {			        
		        return true;
		    }
		}
        return false;
    }
    
    function IsClusterAllCompleted(commArray)
    {
        for(var i=0;i<commArray.length;i++)
		{     
		    if(commArray[i].StatusId != Community.COMM_STATUS_COMPLETED)
		    {			        
		        return false;
		    }
		}
        return true;
    }

	
	function CreateMarker(map, currentMarker, locMarkerIndex)
	{

		
		var markerLatLng=new GLatLng(currentMarker.Lat, currentMarker.Long);

		var infoWindowDOM=CreateLocationMarkerInfoWindowDOM(currentMarker);
		var commListText=CreateLocationMarkerTooltip(currentMarker);


		
		var multipleCommsAtLocation=false;
		
		
		var hasAtLeastOneComingSoonComm = false;
		var isClusterAllComplete = false;
		if(currentMarker.commArray.length>1)
		{
		    hasAtLeastOneComingSoonComm = CheckIfClusterHasAtLeastOneComingSoonCommunity(currentMarker.commArray);
			multipleCommsAtLocation=true;
			
			isClusterAllComplete = IsClusterAllCompleted(currentMarker.commArray)
		}
		
		var commStatusId=null;		
				
		
		if(!multipleCommsAtLocation)
		{
		    commStatusId=currentMarker.commArray[0].StatusId;
		}
		
		var commIcon=GetCustomCommunityIcon(multipleCommsAtLocation, locMarkerIndex, commStatusId, hasAtLeastOneComingSoonComm, isClusterAllComplete);
		var markerOpts={ title:commListText, icon:commIcon };

		
		var gMarker = new GMarker(markerLatLng, markerOpts);

		
		if(mapHouseClickEnabled)
		{
		    GEvent.addListener(gMarker, "click", function()
		    {
    			

			    var infoWindowOpts={maxWidth:150, noCloseOnClick:false};
			    map.openInfoWindowHtml(markerLatLng, infoWindowDOM, infoWindowOpts);
		    }
		    );
		}

        currentMarker.gMarker=gMarker;
		
		return gMarker;
		
	}


	
	function GetMaxLongLat(commArray)
	{
		var maxLongLat=new CLongLat();
		maxLongLat.Lat=0;
		maxLongLat.Long=-100;


		for(var i=0;i<commArray.length;i++)
		{
			if(commArray[i].Long< maxLongLat.Long)
			{
				maxLongLat.Long=commArray[i].Long;
			}


			if(commArray[i].Lat> maxLongLat.Lat)
			{
				maxLongLat.Lat=commArray[i].Lat;
			}

		}

		return maxLongLat;
	}



	
	function GetMinLongLat(commArray)
	{
		var minLongLat=new CLongLat();
		minLongLat.Lat=150;
		minLongLat.Long=0;


		for(var i=0;i<commArray.length;i++)
		{
			if(commArray[i].Long> minLongLat.Long)
			{
				minLongLat.Long=commArray[i].Long;
			}


			if(commArray[i].Lat< minLongLat.Lat)
			{
				minLongLat.Lat=commArray[i].Lat;
			}

		}

		return minLongLat;
	}



	function CheckIfMarkerForLocationExists(markerArray, lat, long)
	{


		var currentLoc;

		for(var j=0;j<markerArray.length;j++)
		{


			
			if(markerArray[j].Lat==lat && markerArray[j].Long==long)
			{
				return j;
			}

			var distance=distVincenty(markerArray[j].Lat, markerArray[j].Long, lat, long);
			


			if(distance<1000)
			{
				return j;
			}


		}


		return -1;
	}


    
	function GetDistanceBetweenLocations(long1, lat1, long2, lat2)
	{

		var loc1=new GLatLng(lat1, long1);
		var loc2=new GLatLng(lat2, long2);
		
		var distance=loc1.distanceFrom(loc2);

		return distance;

	}




     
	function GetCustomCommunityIcon(multipleCommsAtLocation, locMarkerIndex, commStatusId, hasAtLeastOneCommingSoon, isClusterAllComplete)
	{
	
	
	    var imgUrlPrefix="";
	    	    
	    if(document.location.href.toLowerCase().indexOf("/monarchjourney/")!=-1)
	    {
	        imgUrlPrefix="../";
	    }
	
		var commIcon = new GIcon();

        if(mapPrintMode)
        {
            
            commIcon.image = imgUrlPrefix+"images/division/markers/marker"+(locMarkerIndex+1).toString()+".png";
		   
		    commIcon.iconSize = new GSize(20, 34);
		   
		    commIcon.iconAnchor = new GPoint(6, 20);
		    commIcon.infoWindowAnchor = new GPoint(5, 1);
        }
        else
        {
		    if(multipleCommsAtLocation)
		    {
		        
		        if (isHighRiseDivision)
		        {	
		                
		                
		                if(isClusterAllComplete)
		                {		                        
		                        commIcon.image = imgUrlPrefix+"images/gmap/Clustercompleted_towers_icon.gif";
		                        commIcon.iconSize = new GSize(31, 26);
		                }
		                else 
		                {    
		                    if (hasAtLeastOneCommingSoon)
		                    {
		                         commIcon.image = imgUrlPrefix+"images/gmap/ClusterComingSoonTower_icon.gif";
		                         commIcon.iconSize = new GSize(28, 33);
		                    }
		                    else 
		                    {
			                    commIcon.image = imgUrlPrefix+"images/gmap/ClusterTower_icon.gif";
			                    commIcon.iconSize = new GSize(31, 26);
			                }
			            }
			            
			        
			    }
			    else 
			    {
			        if (hasAtLeastOneCommingSoon)
			        { 
			            commIcon.image = imgUrlPrefix+"images/gmap/ClusterComingSoonHomes_icon.gif";
			        }
			        else 
			        {
			            commIcon.image = imgUrlPrefix+"images/gmap/ClusterHomes_icon.gif";
			        }
			        commIcon.iconSize = new GSize(31, 26);
			    }
			    
			   
			    
			    commIcon.iconAnchor = new GPoint(6, 20);
			    commIcon.infoWindowAnchor = new GPoint(5, 1);
		    }
		    else
		    {
		        if(commStatusId==Community.COMM_STATUS_COMING_SOON)
		        {
		            if (isHighRiseDivision)
		            {
		                
		                commIcon.image = imgUrlPrefix+"images/gmap/tower_comingsoon.gif";		                
		                commIcon.iconSize = new GSize(30, 28);
		            }
		            else
		            {
		                commIcon.image = imgUrlPrefix+"images/gmap/homes_comingsoon.gif";
		                 commIcon.iconSize = new GSize(28,21);
		            }
			        
			       
			        
			        commIcon.iconAnchor = new GPoint(6, 20);
			        commIcon.infoWindowAnchor = new GPoint(5, 1);
		        }
		        else
		        {
		            if (isHighRiseDivision)
		            {
		                if(commStatusId==Community.COMM_STATUS_COMPLETED)
		                {
		                    commIcon.image = imgUrlPrefix+"images/gmap/completed_towers_icon.gif";
			                commIcon.iconSize = new GSize(19,28);
		                }
		                else 
		                {
		                    
			                commIcon.image = imgUrlPrefix+"images/gmap/towers_icon.gif";
			                commIcon.iconSize = new GSize(19,28);
		                }
		                    
			        }
			        else 
			        {
			            commIcon.image = imgUrlPrefix+"images/gmap/homes_icon.gif";
			            commIcon.iconSize = new GSize(27, 20);
			        }
			        
			        
			        
			        commIcon.iconAnchor = new GPoint(6, 20);
			        commIcon.infoWindowAnchor = new GPoint(5, 1);
			    }
		    }
        }                
		return commIcon;
	}
	
	
	
	function ShowCommunityInfoInCluster(commId)
	{
	
		var overlayXPos=event.x;
		var overlayYPos=event.y;
		
		alert("Invoking cluster info at: "+overlayXPos+", "+overlayYPos);
	}
	
	
	
	
	function CreateLocationMarkerInfoWindowDOM(currentMarker)
	{
	
	    var fmtCommName;
        var fmtStateName;
        var fmtZipName;
        var spaceFix = / /g;
        var aposFix = new RegExp("'","g"); 
	    
	    
		var markerCommArray=currentMarker.commArray;

		
		var multipleCommsAtLocation=false;

		
		if(markerCommArray.length>1)
		{
			multipleCommsAtLocation=true;
			
		}
		
		var divWrapper=document.createElement("DIV");
		
		if(multipleCommsAtLocation)
		{
		    YAHOO.util.Dom.addClass(divWrapper, "GMap_CommInfoListWrapper");
		}
		else
		{
		   YAHOO.util.Dom.addClass(divWrapper, "GMap_CommInfoWrapper"); 
		}
		    
		
		
		
		if(multipleCommsAtLocation)
		{
			
			var ulCommList=document.createElement("UL");
			divWrapper.appendChild(ulCommList);
			
			
			for(var i=0;i<markerCommArray.length;i++)
			{
			
				
				var comm=markerCommArray[i];
				
				
				var liItem=document.createElement("LI");
				ulCommList.appendChild(liItem);
				
				var liLink=document.createElement("A");
				
				if(comm.StatusId==Community.COMM_STATUS_COMPLETED)
			    {
				    liLink.setAttribute("href",comm.Description);
				    liLink.setAttribute("target", "_blank");
				}
				else 
				{
				    
				     fmtCommName = comm.Name;                    
                    fmtStateName = comm.State;
                    fmtZipName = comm.Zip;                    
                    fmtCommName = fmtCommName.replace(spaceFix, "-").replace(aposFix, "-");
                    fmtStateName = fmtStateName.replace(spaceFix, "-").replace(aposFix, "-");
                    fmtZipName = fmtZipName.replace(spaceFix, "-");
                    
				   
				    liLink.setAttribute("href", comm.Id + "," + comm.DivID + "-new-homes-CA-" + fmtZipName + "-" + fmtStateName + "-" + fmtCommName + "-Community.aspx");
				}
				YAHOO.util.Dom.addClass(liLink, "GMap_CommInfoMultiLink");
				liItem.appendChild(liLink);
			
				
				var txCommName=document.createTextNode(comm.Name);
				liLink.appendChild(txCommName);
				
				
				var brEl=document.createElement("BR");
				liItem.appendChild(brEl);
				
				
				
				if(comm.PriceRange!="" && comm.PriceRange!="0")
				{   
					var spanCommInfo1=document.createElement("SPAN");
					YAHOO.util.Dom.addClass(spanCommInfo1, "GMap_MultiLink_CommInfoSpan");
					liItem.appendChild(spanCommInfo1);

					
					var txCommInfo1=document.createTextNode("Priced from $"+comm.PriceRange+"s");
					spanCommInfo1.appendChild(txCommInfo1);
				}
				
				
				
				if(comm.Phone!="")
				{
				   
					var spanCommInfo2=document.createElement("SPAN");
					YAHOO.util.Dom.addClass(spanCommInfo2, "GMap_MultiLink_CommInfoSpan");
					liItem.appendChild(spanCommInfo2);
					
					
					if(comm.PriceRange!="" && comm.PriceRange!="0")
				    {
					    var brSpacer=document.createElement("BR");
			            spanCommInfo2.appendChild(brSpacer);				
			        }
                    

					var txCommInfo2=document.createTextNode("Phone: "+comm.Phone);
					spanCommInfo2.appendChild(txCommInfo2);
				}				
			}

		}
		else
		{
			var comm=markerCommArray[0];
			
			var spanCommName=document.createElement("SPAN");
			YAHOO.util.Dom.addClass(spanCommName, "GMap_CommNameSpan");
			divWrapper.appendChild(spanCommName);
					
			var txCommName;
			
			
			if(comm.StatusId==Community.COMM_STATUS_COMPLETED)
		    {
		        txCommName=document.createTextNode("Completed project - " + comm.Name);
		    }
		    else 
		    {
		        txCommName=document.createTextNode(comm.Name);
		    }
		    
		    spanCommName.appendChild(txCommName);
			
			
			
			
			var divSpacer = document.createElement("DIV");
			YAHOO.util.Dom.addClass(divSpacer, "GMap_CommInfoWrapperSingleSpacer");
			divWrapper.appendChild(divSpacer);
			
			
			if(comm.City!="")
			{
			    var spanCommCity=document.createElement("SPAN");
			    YAHOO.util.Dom.addClass(spanCommCity, "GMap_CommCitySpan");
			    var txCommCity=document.createTextNode(comm.City);
			    spanCommCity.appendChild(txCommCity);
			    
			    divWrapper.appendChild(spanCommCity);
			   
			}
			
			if(comm.StatusId==Community.COMM_STATUS_COMING_SOON)
			{
			    var spanComingSoon=document.createElement("SPAN");
			    YAHOO.util.Dom.addClass(spanComingSoon, "GMap_CommComingSoonSpan");
			    var txComingSoon=document.createTextNode("COMING SOON");
			    spanComingSoon.appendChild(txComingSoon);
			    
			    divWrapper.appendChild(spanComingSoon);
			}
			
			
		    
		    
		    
			
			var divSpacer1 = document.createElement("DIV");
			YAHOO.util.Dom.addClass(divSpacer1, "GMap_CommInfoWrapperDoubleSpacer");
			divWrapper.appendChild(divSpacer1);
			
			
			
			
			if(comm.Phone!="")
			{
				var spanCommInfo2=document.createElement("SPAN");
				YAHOO.util.Dom.addClass(spanCommInfo2, "GMap_CommInfoSpan");
				divWrapper.appendChild(spanCommInfo2);


				var txCommInfo2=document.createTextNode("Sales office: "+comm.Phone);
				spanCommInfo2.appendChild(txCommInfo2);								
			}
			
			
			
			
			
			if(comm.PriceRange!=""  && comm.PriceRange!="0")
			{
			    //
			    
			    
			    var divSpacer3 = document.createElement("DIV");
			    YAHOO.util.Dom.addClass(divSpacer3, "GMap_CommInfoWrapperSingleSpacer");
			    divWrapper.appendChild(divSpacer3);
			
				var spanCommInfo1=document.createElement("SPAN");
				YAHOO.util.Dom.addClass(spanCommInfo1, "GMap_CommInfoSpan");
				divWrapper.appendChild(spanCommInfo1);

				
				var txCommInfo1=document.createTextNode("New homes priced from the $"+comm.PriceRange+"s");
				spanCommInfo1.appendChild(txCommInfo1);
			}

			
			
			
			
			
			
			var divSpacer4 = document.createElement("DIV");
			YAHOO.util.Dom.addClass(divSpacer4, "GMap_CommInfoWrapperDoubleSpacer");
			divWrapper.appendChild(divSpacer4);
			
			var lnkCommPage=document.createElement("A");
			if(comm.StatusId==Community.COMM_STATUS_COMPLETED || comm.StatusId==Community.COMM_STATUS_DC)
			{
			    lnkCommPage.setAttribute("href",comm.Description);	
			    lnkCommPage.setAttribute("target", "_blank");
			}
			
			else 
			{			    
			     fmtCommName = comm.Name;                    
                    fmtStateName = comm.State;
                    fmtZipName = comm.Zip;                    
                    fmtCommName = fmtCommName.replace(spaceFix, "-").replace(aposFix, "-");                    
                    fmtStateName = fmtStateName.replace(spaceFix, "-").replace(aposFix, "-");
                    fmtZipName = fmtZipName.replace(spaceFix, "-");
                    
				   
				    lnkCommPage.setAttribute("href", comm.Id + "," + comm.DivID + "-new-homes-CA-" + fmtZipName + "-" + fmtStateName + "-" + fmtCommName + "-Community.aspx");
			    
			    
			}
			YAHOO.util.Dom.addClass(lnkCommPage, "GMap_CommInfoSingleLink");
			
			var txCommNameInLink=document.createTextNode("Visit "+comm.Name);
			lnkCommPage.appendChild(txCommNameInLink);
			
			divWrapper.appendChild(lnkCommPage);
		}

	
		return divWrapper;
		
	}
	
	
	
	function CreateLocationMarkerTooltip(currentMarker)
	{
	
		
		
		
		var commListText="";

		
		var markerCommArray=currentMarker.commArray;

		
		var multipleCommsAtLocation=false;

		
		if(markerCommArray.length>1)
		{
			multipleCommsAtLocation=true;
			
			commListText+="Multiple communities at this location:\n";
		}


		
		for(var i=0;i<markerCommArray.length;i++)
		{
			if(i>0)
			{
				
				commListText+="\n";
			}



			
			if(multipleCommsAtLocation)
			{
				commListText+="- ";
				
			}

			
			commListText+=markerCommArray[i].Name;

			
		}


		return commListText;

	}
	
	
	
	function LocationMarkerCommunityMouseOver(e, comm)
	{
		var divGMapCommPopOut=YAHOO.util.Dom.get("divGMapCommPopOut");
		
		YAHOO.util.Dom.setStyle(divGMapCommPopOut, "visibility", "visible");
		YAHOO.util.Dom.setStyle(divGMapCommPopOut, "display", "block");
		
		YAHOO.util.Dom.setX(divGMapCommPopOut, e.clientX);
		YAHOO.util.Dom.setY(divGMapCommPopOut, e.clientY);
		
		YAHOO.util.Event.addListener(divGMapCommPopOut, "mouseout", HideCommDivPopOut);  
		
		
		
	}
	
	
	
	function HideCommDivPopOut(e)
	{
		var divGMapCommPopOut=YAHOO.util.Dom.get("divGMapCommPopOut");
			
		YAHOO.util.Dom.setStyle(divGMapCommPopOut, "visibility", "hidden");
		YAHOO.util.Dom.setStyle(divGMapCommPopOut, "display", "none");
	}
	
	function CleanupPage()
	{
	    
	    GUnload();
	}



/*
 * Calculate geodesic distance (in m) between two points specified by latitude/longitude (in numeric degrees)
 * using Vincenty inverse formula for ellipsoids
 */
function distVincenty(lat1, lon1, lat2, lon2) {
  var a = 6378137, b = 6356752.3142,  f = 1/298.257223563;  
  var L = (lon2-lon1).toRad();
  var U1 = Math.atan((1-f) * Math.tan(lat1.toRad()));
  var U2 = Math.atan((1-f) * Math.tan(lat2.toRad()));
  var sinU1 = Math.sin(U1), cosU1 = Math.cos(U1);
  var sinU2 = Math.sin(U2), cosU2 = Math.cos(U2);

  var lambda = L, lambdaP = 2*Math.PI;
  var iterLimit = 20;
  while (Math.abs(lambda-lambdaP) > 1e-12 && --iterLimit>0) {
    var sinLambda = Math.sin(lambda), cosLambda = Math.cos(lambda);
    var sinSigma = Math.sqrt((cosU2*sinLambda) * (cosU2*sinLambda) +
      (cosU1*sinU2-sinU1*cosU2*cosLambda) * (cosU1*sinU2-sinU1*cosU2*cosLambda));
    if (sinSigma==0) return 0;  
    var cosSigma = sinU1*sinU2 + cosU1*cosU2*cosLambda;
    var sigma = Math.atan2(sinSigma, cosSigma);
    var sinAlpha = cosU1 * cosU2 * sinLambda / sinSigma;
    var cosSqAlpha = 1 - sinAlpha*sinAlpha;
    var cos2SigmaM = cosSigma - 2*sinU1*sinU2/cosSqAlpha;
    if (isNaN(cos2SigmaM)) cos2SigmaM = 0;  
    var C = f/16*cosSqAlpha*(4+f*(4-3*cosSqAlpha));
    lambdaP = lambda;
    lambda = L + (1-C) * f * sinAlpha *
      (sigma + C*sinSigma*(cos2SigmaM+C*cosSigma*(-1+2*cos2SigmaM*cos2SigmaM)));
  }
  if (iterLimit==0) return NaN  

  var uSq = cosSqAlpha * (a*a - b*b) / (b*b);
  var A = 1 + uSq/16384*(4096+uSq*(-768+uSq*(320-175*uSq)));
  var B = uSq/1024 * (256+uSq*(-128+uSq*(74-47*uSq)));
  var deltaSigma = B*sinSigma*(cos2SigmaM+B/4*(cosSigma*(-1+2*cos2SigmaM*cos2SigmaM)-
    B/6*cos2SigmaM*(-3+4*sinSigma*sinSigma)*(-3+4*cos2SigmaM*cos2SigmaM)));
  var s = b*A*(sigma-deltaSigma);

  s = s.toFixed(3); 
  return s;
}



//





String.prototype.parseDeg = function() {
  if (!isNaN(this)) return Number(this);                 

  var degLL = this.replace(/^-/,'').replace(/[NSEW]/i,'');  
  var dms = degLL.split(/[^0-9.]+/);                     
  for (var i in dms) if (dms[i]=='') dms.splice(i,1);    
  switch (dms.length) {                                  
    case 3:                                              
      var deg = dms[0]/1 + dms[1]/60 + dms[2]/3600; break;
    case 2:                                              
      var deg = dms[0]/1 + dms[1]/60; break;
    case 1:                                              
      if (/[NS]/i.test(this)) degLL = '0' + degLL;       
      var deg = dms[0].slice(0,3)/1 + dms[0].slice(3,5)/60 + dms[0].slice(5)/3600; break;
    default: return NaN;
  }
  if (/^-/.test(this) || /[WS]/i.test(this)) deg = -deg; 
  return deg;
}




Number.prototype.toRad = function() {  
  return this * Math.PI / 180;
}