|  |  | @@ -2,14 +2,29 @@ function round(number,precision=3) { | 
		
	
		
			
			|  |  |  | return Math.round(number*Math.pow(10,precision)) / Math.pow(10,precision); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | function mass(kg, metric=true, singular=false) { | 
		
	
		
			
			|  |  |  | return metric ? metricMass(kg, singular) : customaryMass(kg, singular); | 
		
	
		
			
			|  |  |  | function mass(kg, type="metric", singular=false) { | 
		
	
		
			
			|  |  |  | switch(type) { | 
		
	
		
			
			|  |  |  | case "metric": return metricMass(kg, singular); break; | 
		
	
		
			
			|  |  |  | case "customary": return customaryMass(kg, singular); break; | 
		
	
		
			
			|  |  |  | case "approx": return approxMass(kg, singular); break; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | function length(m, metric=true, singular=false) { | 
		
	
		
			
			|  |  |  | return metric ? metricLength(m, singular) : customaryLength(m, singular); | 
		
	
		
			
			|  |  |  | function length(m, type="metric", singular=false) { | 
		
	
		
			
			|  |  |  | switch(type) { | 
		
	
		
			
			|  |  |  | case "metric": return metricLength(m, singular); break; | 
		
	
		
			
			|  |  |  | case "customary": return customaryLength(m, singular); break; | 
		
	
		
			
			|  |  |  | case "approx": return approxLength(m, singular); break; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | function volume(m3, type="metric", singular=false) { | 
		
	
		
			
			|  |  |  | switch(type) { | 
		
	
		
			
			|  |  |  | case "metric": return metricVolume(m3, singular); break; | 
		
	
		
			
			|  |  |  | case "customary": return customaryVolume(m3, singular); break; | 
		
	
		
			
			|  |  |  | case "approx": return approxVolume(m3, singular); break; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | function metricMass(kg, singular=false) { | 
		
	
		
			
			|  |  |  | if (kg < 1) { | 
		
	
		
			
			|  |  |  | var mass = round(kg * 1000,0); | 
		
	
	
		
			
				|  |  | @@ -47,6 +62,25 @@ function customaryMass(kg, singular=false) { | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | function approxMass(kg, singular=false) { | 
		
	
		
			
			|  |  |  | if (kg < 10000) { | 
		
	
		
			
			|  |  |  | var mass = round(kg/1000,2); | 
		
	
		
			
			|  |  |  | return (singular || mass == 1 ? "a car" : mass + " cars"); | 
		
	
		
			
			|  |  |  | } else if (kg < 100000) { | 
		
	
		
			
			|  |  |  | var mass = round(kg/6000,2); | 
		
	
		
			
			|  |  |  | return (singular || mass == 1 ? "an elephant" : mass + " elephants"); | 
		
	
		
			
			|  |  |  | } else if (kg < 1000000000) { | 
		
	
		
			
			|  |  |  | var mass = round(kg/54431.1,2); | 
		
	
		
			
			|  |  |  | return (singular || mass == 1 ? "a tank" : mass + " tanks"); | 
		
	
		
			
			|  |  |  | } else if (kg < 1e21) { | 
		
	
		
			
			|  |  |  | var mass = round(kg/1.01605e8,2); | 
		
	
		
			
			|  |  |  | return (singular || mass == 1 ? "an aircraft carrier" : mass + " aircraft carriers"); | 
		
	
		
			
			|  |  |  | } else { | 
		
	
		
			
			|  |  |  | var mass = round(kg/5.972e24,4); | 
		
	
		
			
			|  |  |  | return (singular || mass == 1 ? "the Earth" : mass + " Earths"); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | function metricLength(m, singular=false) { | 
		
	
		
			
			|  |  |  | if (m < 1) { | 
		
	
		
			
			|  |  |  | var length = round(m * 100,0); | 
		
	
	
		
			
				|  |  | @@ -75,3 +109,86 @@ function customaryLength(m, singular=false) { | 
		
	
		
			
			|  |  |  | return length + (singular || length == 1 ? " mile" : " miles"); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | function approxLength(m, singular=false) { | 
		
	
		
			
			|  |  |  | if (m < 1000) { | 
		
	
		
			
			|  |  |  | var length = round(m/49,1); | 
		
	
		
			
			|  |  |  | return length + (singular || length == 1 ? " football field" : " football fields"); | 
		
	
		
			
			|  |  |  | } else if (m < 5000000) { | 
		
	
		
			
			|  |  |  | var length = round(m/449,1); | 
		
	
		
			
			|  |  |  | return length + (singular || length == 1 ? " Empire State Building" : " Empire State Buildings"); | 
		
	
		
			
			|  |  |  | } else if (m < 3474574*2) { | 
		
	
		
			
			|  |  |  | var length = round(m/3474574,1); | 
		
	
		
			
			|  |  |  | return length + (singular || length == 1 ? " moon" : " moons"); | 
		
	
		
			
			|  |  |  | } else if (m < 12.742e6*100) { | 
		
	
		
			
			|  |  |  | var length = round(m/12.742e6,1); | 
		
	
		
			
			|  |  |  | return length + (singular || length == 1 ? " earth" : " earths"); | 
		
	
		
			
			|  |  |  | } else if (m < 149.6e12) { | 
		
	
		
			
			|  |  |  | var length = round(m/149.6e9,1); | 
		
	
		
			
			|  |  |  | return length + (singular || length == 1 ? " AU" : " AUs"); | 
		
	
		
			
			|  |  |  | } else { | 
		
	
		
			
			|  |  |  | var length = round(m/9.4607e15,4); | 
		
	
		
			
			|  |  |  | return length + (singular || length == 1 ? " light year" : " light years"); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | function metricVolume(m3, singular=false) { | 
		
	
		
			
			|  |  |  | if (m3 < 1) { | 
		
	
		
			
			|  |  |  | var volume = round(m3/1000, 1); | 
		
	
		
			
			|  |  |  | return volume + (singular || volume == 1 ? " liter" : " liters"); | 
		
	
		
			
			|  |  |  | } else if (m3 < 1000000) { | 
		
	
		
			
			|  |  |  | var volume = round(m3, 0); | 
		
	
		
			
			|  |  |  | return volume + (singular || volume == 1 ? " cubic meter" : " cubic meters"); | 
		
	
		
			
			|  |  |  | } else if (m3 < 1e12){ | 
		
	
		
			
			|  |  |  | var volume = round(m3/1e9, 6); | 
		
	
		
			
			|  |  |  | return volume + (singular || volume == 1 ? " cubic kilometer" : " cubic kilometers"); | 
		
	
		
			
			|  |  |  | } else { | 
		
	
		
			
			|  |  |  | var volume = round(m3/1e9, 0); | 
		
	
		
			
			|  |  |  | return volume + (singular || volume == 1 ? " cubic kilometer" : " cubic kilometers"); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | function customaryVolume(m3, singular=false) { | 
		
	
		
			
			|  |  |  | var gallons = m3 * 264.172; | 
		
	
		
			
			|  |  |  | if (gallons < 1/16) { | 
		
	
		
			
			|  |  |  | var volume = round(gallons*128,0); | 
		
	
		
			
			|  |  |  | return volume + (singular || volume == 1 ? " fluid ounce" : " fluid ounces"); | 
		
	
		
			
			|  |  |  | } else if (gallons < 1/4) { | 
		
	
		
			
			|  |  |  | var volume = round(gallons*16,1); | 
		
	
		
			
			|  |  |  | return volume + (singular || volume == 1 ? " cup" : " cups"); | 
		
	
		
			
			|  |  |  | } else if (gallons < 1/2) { | 
		
	
		
			
			|  |  |  | var volume = round(gallons*8,1); | 
		
	
		
			
			|  |  |  | return volume + (singular || volume == 1 ? " pint" : " pints"); | 
		
	
		
			
			|  |  |  | } else if (gallons < 1) { | 
		
	
		
			
			|  |  |  | var volume = round(gallons*4,1); | 
		
	
		
			
			|  |  |  | return volume + (singular || volume == 1 ? " quart" : " quarts"); | 
		
	
		
			
			|  |  |  | } else if (gallons < 100) { | 
		
	
		
			
			|  |  |  | var volume = round(gallons,1); | 
		
	
		
			
			|  |  |  | return volume + (singular || volume == 1 ? " gallon" : " gallons"); | 
		
	
		
			
			|  |  |  | } else { | 
		
	
		
			
			|  |  |  | var volume = round(gallons,0); | 
		
	
		
			
			|  |  |  | return volume + (singular || volume == 1 ? " gallon" : " gallons"); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | function approxVolume(m3, singular=false) { | 
		
	
		
			
			|  |  |  | if (m3 < 1/10000) { | 
		
	
		
			
			|  |  |  | var volume = round(m3*1e6,0); | 
		
	
		
			
			|  |  |  | return (singular || volume == 1 ? "a shot" : volume + " shots"); | 
		
	
		
			
			|  |  |  | } else if (m3 < 1) { | 
		
	
		
			
			|  |  |  | var volume = round(m3*2000,0); | 
		
	
		
			
			|  |  |  | return (singular || volume == 1 ? "a glass" : volume + " glasses"); | 
		
	
		
			
			|  |  |  | } else if (m3 < 10) { | 
		
	
		
			
			|  |  |  | var volume = round(m3*2.64,1); | 
		
	
		
			
			|  |  |  | return(singular || volume == 1 ? "a bathtub" : volume + " bathtubs"); | 
		
	
		
			
			|  |  |  | } else if (m3 < 1e9) { | 
		
	
		
			
			|  |  |  | var volume = round(m3/1000,2); | 
		
	
		
			
			|  |  |  | return (singular || volume == 1 ? "an Olympic swimming pool" : volume + " Olympic swimming pools"); | 
		
	
		
			
			|  |  |  | } else if (m3 < 1e15) { | 
		
	
		
			
			|  |  |  | var volume = round(m3/1.8919e10,3); | 
		
	
		
			
			|  |  |  | return (singular || volume == 1 ? "a Great Salt Lake" : volume + " Great Salt Lakes"); | 
		
	
		
			
			|  |  |  | } else { | 
		
	
		
			
			|  |  |  | var volume = round(m3/3.547e17, 3); | 
		
	
		
			
			|  |  |  | return (singular || volume == 1 ? "an ocean" : volume + " oceans"); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } |