function trimLeft(str) {
	var ListOfWhiteSpaceChars = "0";
	var k = 0;
	while (k < str.length) {
		if (ListOfWhiteSpaceChars.indexOf(str.charAt(k)) == -1) {
			return str.substring(k, str.length);
		}
		else {
			k++;
		}
	}
}

function rotate(vector, satInfo) {
	return rotateXY(rotateXZ(vector, deg2rad(90 - satInfo.latitude)), deg2rad(satInfo.longitude));
}

function rotateXY(vector, angle) {
	return [ Math.cos(angle)*vector[0] - Math.sin(angle)*vector[1], Math.cos(angle)*vector[1] + Math.sin(angle)*vector[0], vector[2] ];
}

function rotateXZ(vector, angle) {
	return [ Math.cos(angle)*vector[0] + Math.sin(angle)*vector[2], vector[1], Math.cos(angle)*vector[2] - Math.sin(angle)*vector[0] ];
}

//function rotateYZ(vector, angle) {
//	return [ vector[0], Math.cos(angle)*vector[1] - Math.sin(angle)*vector[2], Math.cos(angle)*vector[2] + Math.sin(angle)*vector[0] ];
//}

function mkYear(yr) {
	if (yr == "00") {
		return 2000;
	}
	else {
		var year = parseInt(trimLeft(yr));
		if (year < 57) {
			year += 2000;
		}
		else {
			year += 1900;
		}
		return year;
	}
}

function isNumeric(str) {
	var validChars = "0123456789";
	var isNumber = true;
	var char;
	for (var i = 0; i < str.length && isNumber == true; i++) {
		char = str.charAt(i); 
		if (validChars.indexOf(char) == -1) {
			isNumber = false;
		}
	}
	return isNumber;
}

function rad2deg(x) {
	return x*180.0/3.1415;
}

function deg2rad(x) {
	return x*3.1415/180.0;
}

function cart2sph(vector) {
	var x = vector[0], y = vector[1], z = vector[2];
	var lat, lon;
	var pi = 3.1415;
	if ((x == 0) && (y == 0)) {
		if (z > 0) {
			lat = 90;
		}
		else {
			lat = -90;
		}
	}
	else {
		lat = rad2deg(Math.atan(z / Math.sqrt(x*x + y*y)));
	}
	if (x == 0) {
		if (y > 0) {
			lon = 90;
		}
		else {
			lon = -90;
		}
	}
	else if (x > 0) {
		lon = rad2deg(Math.atan(y/x));
	}
	else {
		lon = rad2deg(pi + Math.atan(y/x));
	}
	if (lat > 85) {
		lat = 85;
	}
	else if (lat < -85) {
		lat = -85;
	}
	return new GLatLng(lat, lon);
}
