<!--


function page_loaded() {
	form = document.forms["select_date"];
	sync_buttons();
}


function msg(p) { alert(p); }


function pad(n) {
	if (n < 10) return ("0" + n);
	return "" + n;
}


function scan_url_params() {
	url_params = window.location.search.substring(1);
	params = url_params.split("&");

	for (i=0; i<params.length; ++i) {
		param = params[i];
		param = param.split("=");
		name = param[0];
		val = param[1];

		switch (name) {
		case "time": time_frame = val; break;
		case "sat": set_sat_dir(val); break;
		case "rgn": region_key = val; break;
		case "size": image_size = val; break;
		case "year": year = val - 0; break;
		case "month": month = val - 0; break;
		case "day": day = val - 0; break;
		case "pass": pass = val - 0;
			switch (val) {
			case "ascending":
			case "m":
			case "morning":
			case "d": pass = 0; pass_mode = "local"; break;
			case "descending":
			case "e":
			case "evening":
			case "n": pass = 1; pass_mode = "local"; break;
			case "utc_am": pass = 0; pass_mode = "utc"; break;
			case "utc_pm": pass = 1; pass_mode = "utc"; break;
			}
		case "product": product = val; break;
		case "keep": set_keepers(val); break;
		case "zoom": zoom = val - 0; break;
		}
	}
	if (keep_date) {
		if (time_frame == "week") { date_to_week(); }
	}
}



function year_options() {
	str = "<option value=0>Year&nbsp;&nbsp;";
	for (var i=yearStart; i<=yearEnd; ++i) {
		str += "<option value=" + i; if (year == i) { str += " selected"; } str += ">";
		str += i;
	}
	return str;
}

function set_year() {
	si = form.year.selectedIndex;
	if (si == 0) { sync_year(); }
	else {
		year = parseInt(form.year.options[si].value);
		if (time_frame == "month") update_display();
	}
}

function sync_year() {
	form.year.options[year - yearStart + 1].selected = true;
}



function month_options() {
	str = "<option>Month";
	for (var i=1; i<=12; ++i) {
		str += "<option"; if (month == i) { str += " selected"; } str += ">";
		str += month_names[i].substring(0, 3);
	}
	return str;
}

function set_month() {
	si = form.month.selectedIndex;
	if (si == 0) { sync_month(); }
	else {
		month = si;
		if (time_frame == "month") update_display();
	}
}

function sync_month() {
	form.month.options[month].selected = true;
}



function week_options() {
	return get_week_options(yearStart, monthStart, week_dayStart, num_weeks, week_num);
}



function day_options() {
	str = "<option>Day";
	for (var i=1; i<=31; ++i) {
		str += "<option"; if (day == i) { str += " selected"; } str += ">";
		str += pad(i);
	}
	return str;
}

function set_day() {
	si = form.day.selectedIndex;
	if (si == 0) { sync_day(); }
	else { day = si; }
}

function sync_day() {
	form.day.options[day].selected = true;
}



function pass_options() {
	str = "<option>Passes";
	num_opts = pass_titles.length;
	for (var i=0; i<num_opts; ++i) {
		switch (pass_mode) {
		case "local": match_i = i; break;
		case "utc": match_i = i - 2; break;
		}
		str += "<option "; if (pass == match_i) { str += " selected"; }
		str += ">" + pass_titles[i];
	}
	return str;
}

function set_pass() {
	si = form.pass.selectedIndex
	if (si == 0) { sync_pass();  return; }
	switch (si) {
	case 1:
	case 2: pass_mode = "local"; pass = si - 1; break;
	case 3:
	case 4: pass_mode = "utc"; pass = si - 3; break;
	}
	update_display();
}

function sync_pass() {
	i = 1;
	if (pass_mode == "utc") i += 2;
	form.pass.options[pass + i].selected = true;
}

function pass_key() {
	i = pass;
	if (pass_mode == "utc") i += 2;
	return(pass_keys[i]);
}


function pass_title() {
	switch (pass_mode) {
	case "utc": return(pass_titles[pass + 2]);
	default: return(pass_titles[pass] + " Passes");
	}
}


function satellite_options() {
	str = "<option>Instrument:";
	for (var i=1; i<=num_sats; ++i) {
		str += "<option value=" + satellites[i].key;
		if (sat_num == i) { str += " selected"; } str += ">";
		str += satellites[i].name;
	}
	return str;
}

function set_satellite() {
	si = form.satellite.selectedIndex;
	if (si == 0) { sync_satellite(); }
	else { sat_num = si; scan_sat(); }
}

function sync_satellite() {
	form.satellite.options[sat_num].selected = true;
	scan_sat();
}

function scan_sat() {
	sat_name = form.satellite.options[sat_num].text;
	sat_dir = form.satellite.options[sat_num].value;
}

function sync_next_sat_button() {
	var str = ""; if (count_sats_with_data_at_this_time() < 2) { str = "_off"; }
	document.images["next_sat"].src = "../images/btns/bg/ice/next_sat" + str + ".gif";
}


function get_output_text() {

	str = "";

	switch (time_frame) {
	case "day3": str += "Average of 3 days ending: "; break;
	case "week": str += "Average of week ending: "; break;
	case "month": str += "Average of month: "; break;
	}

	switch (time_frame) {
	case "month": str += year + "/" + pad(month) + ", "; break;
	default: str += year + "/" + pad(month) + "/" + pad(day) + ", "; break;
	}

	switch (time_frame) {
	case "day": str += pass_title() + ", "; break;
	}

	str += sat_name;

	return(str);
}


function createArray(n) {
	this.length = n;
	return this;
}


function avail(key, name, TF) {
	this.key = key
	this.name = name
	this.TF = TF
}


function instrument(key, title) {
	this.key = key;
	this.title = title;
}


function gap(gapSatellite, gapYear, gapMonth, gapDay) {
	this.gapSatellite = gapSatellite;
	this.gapYear = gapYear;
	this.gapMonth = gapMonth;
	this.gapDay = gapDay;
}

function is_gap(sat_n) {
	for (var i = 1; i <= nGap; ++i) {
		if ((sat_n == gaps[i].gapSatellite) && (year == gaps[i].gapYear) && (month == gaps[i].gapMonth) && (day == gaps[i].gapDay)) return true;
	}
	return false;
}

function range(num, beginYear, beginMonth, beginDay, endYear, endMonth, endDay) {
	this.num = num;
	this.beginMonth = beginMonth;
	this.beginDay = beginDay;
	this.beginYear = beginYear;
	this.endMonth = endMonth;
	this.endDay = endDay;
	this.endYear = endYear;
}

function valid_day(inDay) {
	if (month == 2) {
		if (inDay > get_Feb_length()) return false;
	}
	else if (inDay > month_lengths[month]) return false;
	return true;
}


function exist_data(sat_n) {
	count = 0;
	for (var i = 1; i <=nsi; ++i) {
		if (sat_n == sat_range[i].num) {
			count++;
			if (within_range(i)) return true
			else {
				endIdx = i
				if (count == 1) bgnIdx = i
			}
		}
	}
	firstY = sat_range[bgnIdx].beginYear
	firstM = sat_range[bgnIdx].beginMonth
	firstD = sat_range[bgnIdx].beginDay
	lastY = sat_range[endIdx].endYear
	lastM = sat_range[endIdx].endMonth
	lastD = sat_range[endIdx].endDay
	return false
}


function within_range(idx) {
	bYear = sat_range[idx].beginYear;
	eYear = sat_range[idx].endYear;
	if ((year < bYear) || (year > eYear)) return false;
	if (year == bYear) {
		bMonth = sat_range[idx].beginMonth;
		if (month < bMonth) return false;
		if (month == bMonth) {
			switch (time_frame) {
			case "month": return true;
			default:
				bDay = sat_range[idx].beginDay;
				if (day < bDay) return false;
			}
		}
	}
	if (year == eYear) {
		eMonth = sat_range[idx].endMonth;
		if (month > eMonth) return false;
		if (month == eMonth) {
			switch (time_frame) {
			case "month": return true;
			default:
				eDay = sat_range[idx].endDay;
				if (day > eDay) return false;
			}
		}
	}
	return true;
}


function exist_satellite() {
	noDataMsg = "Currently available satellites are:\n";
	if (satellites[sat_num].TF == 0) {
		for (var i = 1; i <= 6; i++)
			if (satellites[i].TF != 0) noDataMsg += "F" + satellites[i].name + "\n";
		noDataMsg += "Please select an available satellite.";
		alert(noDataMsg);
		return false;
	}
	return true;
}


function valid_select() {
	switch (time_frame) {
	case "week": return(1);
	case "day":
	case "day3":
		if ( !valid_day(day)) {
			msg = "The day you selected does not exist.\n";
			msg += "Please check your calendar and select an appropriate day.";
			alert(msg);
			return false;
		}
	}

	if ( !exist_satellite()) { return false; }

	if ( !exist_data(sat_num) || is_gap(sat_num)) { return false; }
	
	return true
}


function next_satellite() {
	sat_num++;
	if (sat_num > num_sats) { sat_num = 1; }

	if ((satellites[sat_num].TF == 0) || !exist_data(sat_num) || is_gap(sat_num)) {
		nextSatelliteCounter++;
		if (nextSatelliteCounter == num_sats) {
			nextSatelliteCounter = 0;
			satellite_found = 0;
		}
		else next_satellite();
	}
	else {
		sync_satellite();
		display_image();
		nextSatelliteCounter = 0;
		satellite_found = 1;
	}
}



function count_sats_with_data_at_this_time() {
	var sat_count = 0
	for (var n = 1; n <= num_sats; n++) {
		if (exist_data(n) && !is_gap(n)) { sat_count++; str += "yes"; }
	}
	return (sat_count);
}


function no_satellite_message(mode) {
	if (message_given) { return; }

	str = "There are no " + inst.title + " data for ";
	
	switch (time_frame) {
	case "month": str += year + "/" + pad(month); break;
	default: str += year + "/" + pad(month) + "/" + pad(day); break;
	}
	
	str += "\n\n";

	switch (mode) {
	case "date_selected": str += "Try clicking \"Previous\" or \"Next\".\n\n"; break;
	case "prev": str += "The previous available date will be shown.\n\n"; break;
	case "next": str += "The next available date will be shown.\n\n"; break;
	}

	str += "Click \"Help\" for data availability.";
	alert(str);
}


function get_sats_with_data_at_this_time() {
	str = ""
	for (var sat_n = 1; sat_n <= num_sats; sat_n++) {
		if (exist_data(sat_n) && !is_gap(sat_n)) {
			if (str != "") str += ", ";
			str += "F" + satellites[sat_n].name;
		}
	}
	return (str);
}



function out_of_range_msg(side, mode) {

	msg = "Data are not available ";

	if ( side < 0 ) { msg += "before "; y = yearStart; m = pad(monthStart); d = pad(dayStart); }
	if ( side > 0 ) { msg += "after "; y = yearEnd; m = pad(monthEnd); d = pad(dayEnd); }

	switch (time_frame) {
	case "day":
	case "day3": dayt = y + "/" + m + "/" + d; break;
	case "month": dayt = y + "/" + m; break;
	}
	
	msg += dayt + ".\n";

	switch (mode) {

	case "nearest": msg += "Images for " + dayt + " will be shown."; break;

	case "hang":
		y1 = yearStart; m1 = pad(monthStart); y2 = yearEnd; m2 = pad(monthEnd);
		msg += "Please select a month between " + y1 + "/" + m1 + " and " + y2 + "/" + m2 + ".";
		break;
	}

	alert(msg);
}


function update_display() {
	switch (time_frame) {
	case "day": set_day_within_range(); break;
	case "day3": set_day3_within_range(); break;
	case "month": set_month_within_range(); break;
	}

	if (!exist_data(sat_num) || is_gap(sat_num) ) {
		next_satellite();
		if (!satellite_found) { no_satellite_message("date_selected"); }
	}

	sync_buttons(); sync_next_sat_button();
	display_image();
}


function display_image() {
	if (otherDisplay || valid_select()) {

		set_folders();

		qstr = get_qstr();

		switch(inst.key) {
		case "amsr":
			document.images["sst"].src = rootSmall + img_name("sst") + qstr;
		}

		document.images["wind"].src = rootSmall + img_name("wind") + qstr;
		document.images["vapor"].src = rootSmall + img_name("vapor") + qstr;
		document.images["liquid"].src = rootSmall + img_name("liquid") + qstr;
		document.images["rain"].src = rootSmall + img_name("rain") + qstr;
		if (time_frame == "day") {
			document.images["time"].src = rootSmall + img_name("time") + qstr;
		}

		form.output.value = get_output_text();

		otherDisplay = false;
	}
}


function img_tag(p) {

	switch(inst.key) {
	case "ssmi":
	case "amsr":
		w = 480; padding = 0; break;
	default: w = 360; padding = 0;
	}

	h = w / 2;

	str = "";
	str += "<table border='0' cellspacing='0' cellpadding='" + padding + "'><tr><td align='center'>";	

	str += "<p class='small'>";

	switch(p) {
	case "sst": str += "Sea Surface Temperature (&deg; C)"; break;
	case "wind": str += "Surface Wind Speed (m/s)"; break;
	case "vapor": str += "Atmospheric Water Vapor (mm)"; break;
	case "liquid": str += "Cloud Liquid Water (mm)"; break;
	case "rain": str += "Rain Rate (mm/hr)"; break;
	case "time": str += "Observation Time (hour of day UTC)"; break;
	}

	str += "<br>";

	str += "<a href='JavaScript: view_large_image(" + p + ")'>";

	str += "<img";
	str += " alt='Click to view this image in full size'";
	str += " src=" + rootSmall + img_name(p);
	str += " name=" + p;
	str += " width=" + w + " height=" + h + " border=1>";

	str += "</a>"

	str += "<img src='../images/nav/white.gif' width='3' height='1'>";
	
	switch(p) {
	case "rain": dir = time_frame + "/"; break;
	default: dir = ""; break;
	}
	h = h + 2;
	str += "<img src='img/key/" + dir + p + ".gif' width='20' height='" + h + "'>";

	str += "</td></tr></table>";

	return str;
}


function output_tag() {

	padding = 3; str = "";

	str += "<table border='0' cellspacing='0' cellpadding='" + padding + "'><tr><td  nowrap>";
	str += "<p class='smaller'>";
	str += "<img src='../images/nav/white.gif' width='50' height='1'>";
	str += "Images currently shown:&nbsp&nbsp<input type=text name=output size=55 value='" + get_output_text() + "'>";
	str += "</td></tr></table>";

	return str;
}


function view_large_image(param) {
	url = inst.key + "_image_view.html?";
	url += "&time=" + time_frame;
	url += "&sat=" + sat_dir;
	url += "&year=" + year;
	url += "&month=" + month;
	if (time_frame != "month") { url += "&day=" + day; }
	if (time_frame == "day") { url += "&pass=" + pass_key(); }
	url += "&product=" + param;

	//window.location = url;
	spawn_window(url,"landscape");
}

function set_folders() {
	img_root = "../graphics/" + inst.key + "/"

	switch(inst.key) {
	case "amsr": break;
	default: img_root += "graphics_";
	}
	img_root += "v0" + version + "/" + sat_dir + "/";
	rootLarge = img_root + "large/" + region_key + "/";
	rootSmall = img_root + "small/" + region_key + "/";
}

function get_path_mid(par) {
	switch(inst.key) {
	case "ssmi":
	case "amsr":
		str = time_frame + "/";
		if (time_frame == "day") {
			switch (pass_mode) {
			case "utc": str += "chrono/"; break;
			case "local": str += "passes/"; break;
			}
		}
		str += par + "/";
		switch (time_frame) {
		case "day":
		case "day3": str += pad(year) + "/" + pad(month) + "/";
		}
		return str;
	}

	switch (time_frame) {
	case "week": return "weeks/";
	default: return "y" + pad(year) + "/m" + pad(month) + "/";
	}
}


function get_data_path_mid() {
	switch (time_frame) {
	case "week": return "weeks/";
	default: return "y" + pad(year) + "/m" + pad(month) + "/";
	}
}


function set_product(p) {
	document.images[product].src = "../images/btns/geo_param/" + product + ".gif";
	product = p;
	display_image();
	document.images[product].src = "../images/btns/geo_param/" + product + "_on.gif";
}



function img_name(par) {
//msg('year ' + year + ' month ' + month + ' day ' + day);
	str = get_path_mid(par);

	str += sat_dir + "_" + pad(year) + "_" + pad(month) + "_";

	switch (time_frame) {
	case "month": break;
	default: str += pad(day) + "_";
	}

	switch (time_frame) {
	case "day":  str += pass_key(); break;
	case "day3": str += "3day"; break;
	default: str += time_frame;
	}
	
	str += "_" + par;
	
	switch(inst.key) {
	case "ssmi": str += "_v" + version;
	}

	str += img_ext;
//msg(rootSmall + str)
	return str;
}


function get_img_url() {
	set_folders();
	///msg(rootLarge + img_name(product));
	return(rootLarge + img_name(product));
}


function show_key_commands() {
	str = "Keyboard Commands:\n";
	str += "Supported Only in Internet Explorer (IE)\n";
	str += "\n";
	switch (inst.key) {
	case "amsr":
		if (time_frame == "day") str += "t: Time of Observation\n";
		str += "s: Sea Surface Temperature\n";
	}
	str += "w: Surface Wind Speed\n";
	str += "v: Atmospheric Water Vapor\n";
	str += "l,c: Cloud Liquid Water\n";
	str += "r: Rain Rate\n";
	alert(str);
}


function download_binary_data() {

	ftp_root = "ftp://ftp.ssmi.com/"
	switch(inst.key) {
	case "ssmi": ftp_root += "ssmi/"
	case "amsr":
		fyl = ftp_root + sat_dir + "/bmaps_v0" + version + "/";
		fyl += get_data_path_mid();
		window.location = fyl;
		return(0);
	}

	if (valid_select()) {
		fyl = "../graphics/" + inst.key + "/data/" + sat_dir + "/bmaps_v0" + version + "/";
		fyl += get_data_path_mid() + sat_dir + "_" + year + pad(month);

		switch (time_frame) {
		case "month": break;
		default: fyl += pad(day);
		}

		status = get_data_status();

		switch (status) {
		case "nrt": // fyl += "rt"; break;
			msg = "The data you have requested is not final.\n\n"
			msg += "The most recent " + inst.title + " data (within about " + days_till_final + " days of current time) is called near-real time (NRT). The NRT images are continuously being updated (improved geolocaton and sensor/algorithm calibration) and become a final product after about " + days_till_final + " days. Graphic images of the NRT data are available, but the binary data files are only available for the final product.\n\n"
			msg += "If you want the binary data for the NRT products please contact smith@remss.com"
			alert(msg); break;

		case "final": fyl += "v" + version; break;
		}

		switch (time_frame) {
		case "day3": fyl += "_d3d"; break;
		}

		fyl += ".gz";

		switch (status) {
		case "nrt": break;
		case "final": window.location = fyl; break;
		}
	}
}

function get_data_status() {
	switch (time_frame) {
	case "week":
	case "month":
		return("final");
	}

	if (year * 10000 + month * 100 + day <= yearEnd_final * 10000 + monthEnd_final * 100 + dayEnd_final) return("final");
	return("nrt");
}


function get_help() {
	switch (time_frame) {
	case "day":
	case "day3":
		spawn_window(inst.key + "_help_daily.html","help"); break;
	case "week":
	case "month":
		spawn_window(inst.key + "_help_averaged.html","help"); break;
	}
}


function get_qstr() {
	if ( data_may_need_refreshing() ) {
		now = new Date(); return("?" + now.getTime());
	}
	return("");
}

function scan_refresh_timeframe() {
	re_year = year; re_month = month; re_day = day;
}


function data_may_need_refreshing() {
	switch (time_frame) {
	case "week":
	case "month":
		return(0);
	}


	if (year > re_year) return(1);
	if (year < re_year) return(0);

	// year must be same

	if (month > re_month) return(1);
	if (month < re_month) return(0);

	// month must be same

	if (day >= re_day) return(1);
	return(0);

}



function keep_options() {
	str = "";

	switch (inst.key) {
	case "qscat":

		str += "<input type='checkbox' name='keep_rgn'";
		if (keep_rgn) {str += " checked"; }
		str += ">Region ";

		str += "<input type='checkbox' name='keep_size'";
		if (keep_size) {str += " checked"; }
		str += ">Size ";
	}

	str += "<input type='checkbox' name='keep_date'";
	if (keep_date) {str += " checked"; }
	str += ">Date ";

	return(str);
}


function view_daily() { switch_time_frame("daily"); }
function view_3day() { switch_time_frame("3day"); }
function view_weekly() { switch_time_frame("weekly"); }
function view_monthly() { switch_time_frame("monthly"); }


function switch_time_frame(tym) {
	switch (inst.key) {
	case "amsr": url = "amsre"; break;
	case "qscat": url = "scatterometer"; break;
	default: url = inst.key;
	}

	url += "_data_" + tym + ".html?"

	rgn = 0; syz = 0; dayt = 0;
	switch (inst.key) {
	case "qscat":
		if (form.keep_rgn.checked) rgn = 1;
		if (form.keep_size.checked) syz = 1;
	}
	if (form.keep_date.checked) dayt = 1;

	if (rgn) { url += "&rgn=" + region_key; }
	if (syz) { url += "&size=" + image_size; }

	if (dayt) {
		if (time_frame == "week") { week_to_date(); }
		url += "&year=" + year;
		url += "&month=" + month;
		if (day > 0) url += "&day=" + day;
		url += "&pass=" + pass;
	}

	switch (inst.key) {
	case "qscat": url += "&keep=" + rgn + syz + dayt; break;
	default: url += "&keep=" + dayt;
	}

	window.location = url;
}


function week_to_date() {
	dt = new Date(yearStart,monthStart-1,week_dayStart,1);
	dt = new Date(dt.getTime() + (week_num - 1) * milisecs_per_week);

	year = dt.getFullYear();
	month = dt.getMonth() + 1;
	day = dt.getDate();
}


function date_to_week() {
	if (year > 0 && month > 0 && day > 0) {

		dt0 = new Date(yearStart,monthStart-1,week_dayStart,24);
		dt1 = new Date(year,month-1,day,12);

		week_num = 2 + Math.floor( ( dt1.getTime() - dt0.getTime() ) / milisecs_per_week );
	}
}


function ymd_time(y,m,d) {
	dt = new Date(y,m,d);
	return (dt.getTime());
}


// -->
