//Vincenty distance calculator  merci a http://www.movable-type.co.uk/scripts/latlong-vincenty.html
	function distVincenty(lat1, lon1, lat2, lon2) {
		var a = 6378137, b = 6356752.3142,  f = 1/298.257223563;  // WGS-84 ellipsiod
		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, iterLimit = 100;
		
		do {
			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;  // co-incident points
			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;  // equatorial line: cosSqAlpha=0 (6)
				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)));
		} while (Math.abs(lambda-lambdaP) > 1e-12 && --iterLimit>0);
		
		if (iterLimit==0) return NaN  // formula failed to converge
		
		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/1000); // round to 1mm precision
		
		return s;
	}

	String.prototype.parseDeg = function() {
		if (!isNaN(this)) return Number(this);                 // signed decimal degrees without NSEW
		var degLL = this.replace(/^-/,'').replace(/[NSEW]/i,'');  // strip off any sign or compass dir'n
		var dms = degLL.split(/[^0-9.]+/);                     // split out separate d/m/s
		for (var i in dms) if (dms[i]=='') dms.splice(i,1);    // remove empty elements (see note below)
		switch (dms.length) {                                  // convert to decimal degrees...
			case 3:                                              // interpret 3-part result as d/m/s
				var deg = dms[0]/1 + dms[1]/60 + dms[2]/3600; break;
			case 2:                                              // interpret 2-part result as d/m
				var deg = dms[0]/1 + dms[1]/60; break;
			case 1:                                              // decimal or non-separated dddmmss
				if (/[NS]/i.test(this)) degLL = '0' + degLL;       // - normalise N/S to 3-digit degrees
				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; // take '-', west and south as -ve
	return deg;
	}
	
	Number.prototype.toRad = function() {  // convert degrees to radians
		return this * Math.PI / 180;
	}
//End distance
