//Sub latlon2ij(whosGrid As String, Optional GridSpacing As String, Optional verbose As Boolean)  //W3FB11()
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Sub W3FB11()
////// CALC LAMBERT I,J (decimal) FROM LONG,LAT FOR GIVEN LAMBERT PARAMETERS
//////  Args: ALAT,ELON, ALAT1,ELON1,DX,ELONV,ALATAN
//
// SUBPROGRAM:  W3FB11        LAT/LON TO LAMBERT(I,J) FOR GRIB
//   PRGMMR: STACKPOLE        ORG: NMC42       DATE:88-11-28
function latlon2ij(ALAT, ELON, GridSpacing) //As String    //W3FB11()
{

	var ix, iy, ALAT1, ELON1, DX, ELONV, ALATAN, H, RERTH, RADPD, REBYDX, ALATN1, an;

	var ELON1L, ELONL, ELONVR, ALA1, RMLL, ELO1, ARG, POLEI, POLEJ, ALA, RM, ELO;

	var v2i, v2j;

	var image_mapwidth, image_mapheight, image_maporiginx, image_maporiginy;
	var grid_imin, grid_imax, grid_jmin, grid_jmax;

	switch (GridSpacing) {
	case "12km":
		ALAT1 = 49.037;
		ELON1 = -5.621;
		DX = 12000;
		ELONV = 17;
		ALATAN = 60;

		// image_size = 2000;
		image_size = 1600;
		image_mapwidth = 0.515955;
		image_mapheight = 0.82;
		image_maporiginx = 0.242022;
		image_maporiginy = 0.89;

		grid_imin = 1;
		grid_imax = 57;
		grid_jmin = 1;
		grid_jmax = 90;

		break;

	case "4km":
		ALAT1 = 49.398;
		ELON1 = -5.356;
		DX = 4000;
		ELONV = 17;
		ALATAN = 60;

		// image_size = 2000;
		image_size = 1600;
		image_mapwidth = 0.496574;
		image_mapheight = 0.82;
		image_maporiginx = 0.251713;
		image_maporiginy = 0.89;
		
		grid_imin = 1;
		grid_imax = 153;
		grid_jmin = 1;
		grid_jmax = 252;

		break;

	case "5.1km":
		ALAT1 = 49.405;
		ELON1 = -5.352;
		DX = 5143;
		ELONV = 17;
		ALATAN = 60;

		// image_size = 2000;
		image_size = 1600;
		image_mapwidth = 0.496206;
		image_mapheight = 0.82;
		image_maporiginx = 0.251897;
		image_maporiginy = 0.890;
		
		grid_imin = 1;
		grid_imax = 119;
		grid_jmin = 1;
		grid_jmax = 196;

		break;

	default:
		alert("Grid spacing not found");
		return "";
	}

	RERTH = 6371200;

	if (ALATAN > 0) {
			H = 1;
	} else {
			H = -1;
	}

	RADPD = Math.PI / 180;
	REBYDX = RERTH / DX;
	ALATN1 = ALATAN * RADPD;
	an = H * Math.sin(ALATN1);
	COSLTN = Math.cos(ALATN1);
	//
	//        MAKE SURE THAT INPUT LONGITUDES DO NOT PASS THROUGH
	//        THE CUT ZONE (FORBIDDEN TERRITORY) OF THE FLAT MAP
	//        AS MEASURED FROM THE VERTICAL (REFERENCE) LONGITUDE.
	//
	ELON1L = ELON1;
	if ((ELON1 - ELONV) > 180) {
			ELON1L = ELON1 - 360;
	}
	if ((ELON1 - ELONV) < -180) {
		ELON1L = ELON1 + 360;
	}

	ELONL = ELON;
	if ((ELON - ELONV) > 180) {
		ELONL = ELON - 360;
	}
	if ((ELON - ELONV) < -180) {
		ELONL = ELON + 360;
	}

	ELONVR = ELONV * RADPD;
	//
	//        RADIUS TO LOWER LEFT HAND (LL) CORNER
	//
	ALA1 = ALAT1 * RADPD;

	//alert(ALA1);

	RMLL = REBYDX * Math.pow(COSLTN, (1 - an)) * Math.pow((1 + an), an) * Math.pow((Math.cos(ALA1)) / (1 + H * Math.sin(ALA1)), an) / an;

	//
	//        USE LL POINT INFO TO LOCATE POLE POINT
	//
	ELO1 = ELON1L * RADPD;
	ARG = an * (ELO1 - ELONVR);
	POLEI = 1 - H * RMLL * Math.sin(ARG);
	POLEJ = 1 + RMLL * Math.cos(ARG);
	//
	//        RADIUS TO DESIRED POINT AND THE I J TOO
	//
	ALA = ALAT * RADPD;
	RM = REBYDX * Math.pow(COSLTN, (1 - an)) * Math.pow(1 + an, an) * Math.pow((Math.cos(ALA)) / (1 + H * Math.sin(ALA)), an) / an;

	ELO = ELONL * RADPD;
	ARG = an * (ELO - ELONVR);

	v2i = Math.round(POLEI + H * RM * Math.sin(ARG));
	v2j = Math.round(POLEJ - RM * Math.cos(ARG));
	ximage = (((v2i - grid_imin) / (grid_imax - grid_imin) + (image_maporiginx / image_mapwidth)) * image_mapwidth) * image_size ;
	yimage = (1 - ((v2j - grid_jmin) / (grid_jmax - grid_jmin) + (image_maporiginy / image_mapheight) - 1) * image_mapheight) * image_size ;

	return ximage + ", " + yimage + ", " + v2i + ", " + v2j;
}

