// -------------------------------------------------------------
// Define class Available.
//
// Usage:
//    var a = new Available();
//    var v = a.version(tm, dt);
//                           // Tm is time, dt is datatype 
//                           // (e.g., CGAS). Return version, or
//                           // false if data is not available.
//    var v = a.input_version(tm, dt);
//                           // Tm is time, dt is datatype 
//                           // (e.g., CGAS). Return input version 
//                           // (e.g., version of AS_AEROSOL file), or
//                           // false if data is not available.
//    var esdt = a.esdt(tm, dt);
//                           // Return ESDT string for given time
//                           // data type, or false if data isn't
//                           // available.
//    var tm = a.latest_month(dt);
//                           // Return Time for latest month that
//                           // has available data.
// -------------------------------------------------------------

function Available() {
    this.available_image = new Array(5);
    this.available_image[0] = available_init_0();
    this.available_image[1] = available_init_1();
    this.available_image[2] = available_init_2();
    this.available_image[3] = available_init_3();
    this.available_image[4] = available_init_4();

    this.inputv = new Array(5);
    this.inputv[0] = input_version_init_0();
    this.inputv[1] = input_version_init_1();
    this.inputv[2] = input_version_init_2();
    this.inputv[3] = input_version_init_3();
    this.inputv[4] = input_version_init_4();

    this.version_to_esdt = new Array(NUMBER_TYPE);
    for(var i = 0; i < this.version_to_esdt.length; ++i) {
	this.version_to_esdt[i] = new Array(4);
	for(var j = 0; j < this.version_to_esdt[i].length; ++j) {
	    this.version_to_esdt[i][j] = new Array();
	}
    }
    this.version_to_esdt[CGAS][TIME_MONTH]["F02_0006"] = "MIL3MAE.002";
    this.version_to_esdt[CGAS][TIME_SEASON]["F02_0006"] = "MIL3QAE.002";
    this.version_to_esdt[CGAS][TIME_ANNUAL]["F02_0006"] = "MIL3YAE.002";
    this.version_to_esdt[CGAS][TIME_MONTH]["F02_0008"] = "MIL3MAE.002";
    this.version_to_esdt[CGAS][TIME_SEASON]["F02_0008"] = "MIL3QAE.002";
    this.version_to_esdt[CGAS][TIME_ANNUAL]["F02_0008"] = "MIL3YAE.002";
    this.version_to_esdt[CGAS][TIME_MONTH]["F02_0010"] = "MIL3MAE.004";
    this.version_to_esdt[CGAS][TIME_SEASON]["F02_0010"] = "MIL3QAE.004";
    this.version_to_esdt[CGAS][TIME_ANNUAL]["F02_0010"] = "MIL3YAE.004";
    this.version_to_esdt[CGAS][TIME_MONTH]["F02_0012"] = "MIL3MAE.004";
    this.version_to_esdt[CGAS][TIME_SEASON]["F02_0012"] = "MIL3QAE.004";
    this.version_to_esdt[CGAS][TIME_ANNUAL]["F02_0012"] = "MIL3YAE.004";
    this.version_to_esdt[CGAS][TIME_MONTH]["F02_0014"] = "MIL3MAE.004";
    this.version_to_esdt[CGAS][TIME_SEASON]["F02_0014"] = "MIL3QAE.004";
    this.version_to_esdt[CGAS][TIME_ANNUAL]["F02_0014"] = "MIL3YAE.004";
    this.version_to_esdt[CGAS][TIME_MONTH]["F06_0016"] = "MIL3MAE.004";
    this.version_to_esdt[CGAS][TIME_SEASON]["F06_0016"] = "MIL3QAE.004";
    this.version_to_esdt[CGAS][TIME_ANNUAL]["F06_0016"] = "MIL3YAE.004";
    this.version_to_esdt[CGAS][TIME_MONTH]["F06_0017"] = "MIL3MAE.004";
    this.version_to_esdt[CGAS][TIME_SEASON]["F06_0017"] = "MIL3QAE.004";
    this.version_to_esdt[CGAS][TIME_ANNUAL]["F06_0017"] = "MIL3YAE.004";
    this.version_to_esdt[CGAS][TIME_MONTH]["F06_0021"] = "MIL3MAE.004";
    this.version_to_esdt[CGAS][TIME_SEASON]["F06_0021"] = "MIL3QAE.004";
    this.version_to_esdt[CGAS][TIME_ANNUAL]["F06_0021"] = "MIL3YAE.004";
    this.version_to_esdt[CGAS][TIME_MONTH]["F06_0023"] = "MIL3MAE.004";
    this.version_to_esdt[CGAS][TIME_SEASON]["F06_0023"] = "MIL3QAE.004";
    this.version_to_esdt[CGAS][TIME_ANNUAL]["F06_0023"] = "MIL3YAE.004";
    this.version_to_esdt[CGAS][TIME_MONTH]["F09_0025"] = "MIL3MAE.004";
    this.version_to_esdt[CGAS][TIME_SEASON]["F09_0025"] = "MIL3QAE.004";
    this.version_to_esdt[CGAS][TIME_ANNUAL]["F09_0025"] = "MIL3YAE.004";

    this.version_to_esdt[CGLS][TIME_MONTH]["F01_0006"] = "MIL3MLS.002";
    this.version_to_esdt[CGLS][TIME_SEASON]["F01_0006"] = "MIL3QLS.002";
    this.version_to_esdt[CGLS][TIME_ANNUAL]["F01_0006"] = "MIL3YLS.002";
    this.version_to_esdt[CGLS][TIME_MONTH]["F02_0008"] = "MIL3MLS.002";
    this.version_to_esdt[CGLS][TIME_SEASON]["F02_0008"] = "MIL3QLS.002";
    this.version_to_esdt[CGLS][TIME_ANNUAL]["F02_0008"] = "MIL3YLS.002";
    this.version_to_esdt[CGLS][TIME_MONTH]["F02_0010"] = "MIL3MLS.004";
    this.version_to_esdt[CGLS][TIME_SEASON]["F02_0010"] = "MIL3QLS.004";
    this.version_to_esdt[CGLS][TIME_ANNUAL]["F02_0010"] = "MIL3YLS.004";
    this.version_to_esdt[CGLS][TIME_MONTH]["F02_0012"] = "MIL3MLS.004";
    this.version_to_esdt[CGLS][TIME_SEASON]["F02_0012"] = "MIL3QLS.004";
    this.version_to_esdt[CGLS][TIME_ANNUAL]["F02_0012"] = "MIL3YLS.004";
    this.version_to_esdt[CGLS][TIME_MONTH]["F02_0014"] = "MIL3MLS.004";
    this.version_to_esdt[CGLS][TIME_SEASON]["F02_0014"] = "MIL3QLS.004";
    this.version_to_esdt[CGLS][TIME_ANNUAL]["F02_0014"] = "MIL3YLS.004";
    this.version_to_esdt[CGLS][TIME_MONTH]["F04_0016"] = "MIL3MLS.004";
    this.version_to_esdt[CGLS][TIME_SEASON]["F04_0016"] = "MIL3QLS.004";
    this.version_to_esdt[CGLS][TIME_ANNUAL]["F04_0016"] = "MIL3YLS.004";
    this.version_to_esdt[CGLS][TIME_MONTH]["F04_0017"] = "MIL3MLS.004";
    this.version_to_esdt[CGLS][TIME_SEASON]["F04_0017"] = "MIL3QLS.004";
    this.version_to_esdt[CGLS][TIME_ANNUAL]["F04_0017"] = "MIL3YLS.004";
    this.version_to_esdt[CGLS][TIME_MONTH]["F04_0021"] = "MIL3MLS.004";
    this.version_to_esdt[CGLS][TIME_SEASON]["F04_0021"] = "MIL3QLS.004";
    this.version_to_esdt[CGLS][TIME_ANNUAL]["F04_0021"] = "MIL3YLS.004";
    this.version_to_esdt[CGLS][TIME_MONTH]["F04_0023"] = "MIL3MLS.004";
    this.version_to_esdt[CGLS][TIME_SEASON]["F04_0023"] = "MIL3QLS.004";
    this.version_to_esdt[CGLS][TIME_ANNUAL]["F04_0023"] = "MIL3YLS.004";
    this.version_to_esdt[CGLS][TIME_MONTH]["F04_0025"] = "MIL3MLS.004";
    this.version_to_esdt[CGLS][TIME_SEASON]["F04_0025"] = "MIL3QLS.004";
    this.version_to_esdt[CGLS][TIME_ANNUAL]["F04_0025"] = "MIL3YLS.004";

    this.version_to_esdt[CGAL][TIME_MONTH]["F06_0012"] = "MIL3MAL.006";
    this.version_to_esdt[CGAL][TIME_SEASON]["F06_0012"] = "MIL3QAL.006";
    this.version_to_esdt[CGAL][TIME_ANNUAL]["F06_0012"] = "MIL3YAL.006";
    this.version_to_esdt[CGAL][TIME_MONTH]["F06_0016"] = "MIL3MAL.006";
    this.version_to_esdt[CGAL][TIME_SEASON]["F06_0016"] = "MIL3QAL.006";
    this.version_to_esdt[CGAL][TIME_ANNUAL]["F06_0016"] = "MIL3YAL.006";
    this.version_to_esdt[CGAL][TIME_MONTH]["F06_0018"] = "MIL3MAL.006";
    this.version_to_esdt[CGAL][TIME_SEASON]["F06_0018"] = "MIL3QAL.006";
    this.version_to_esdt[CGAL][TIME_ANNUAL]["F06_0018"] = "MIL3YAL.006";
    this.version_to_esdt[CGAL][TIME_MONTH]["F06_0020"] = "MIL3MAL.006";
    this.version_to_esdt[CGAL][TIME_SEASON]["F06_0020"] = "MIL3QAL.006";
    this.version_to_esdt[CGAL][TIME_ANNUAL]["F06_0020"] = "MIL3YAL.006";

    this.version_to_esdt[CGCL][TIME_MONTH]["F02_0016"] = "MIL3MCLD.002";
    this.version_to_esdt[CGCL][TIME_SEASON]["F02_0016"] = "MIL3QCLD.002";
    this.version_to_esdt[CGCL][TIME_ANNUAL]["F02_0016"] = "MIL3YCLD.002";
    this.version_to_esdt[CGCL][TIME_MONTH]["F02_0018"] = "MIL3MCLD.002";
    this.version_to_esdt[CGCL][TIME_SEASON]["F02_0018"] = "MIL3QCLD.002";
    this.version_to_esdt[CGCL][TIME_ANNUAL]["F02_0018"] = "MIL3YCLD.002";
    this.version_to_esdt[CGCL][TIME_MONTH]["F02_0020"] = "MIL3MCLD.002";
    this.version_to_esdt[CGCL][TIME_SEASON]["F02_0020"] = "MIL3QCLD.002";
    this.version_to_esdt[CGCL][TIME_ANNUAL]["F02_0020"] = "MIL3YCLD.002";

    this.version_to_esdt[CGGRP][TIME_MONTH]["F02_0007"] = "MIL3MRD.002";
    this.version_to_esdt[CGGRP][TIME_SEASON]["F02_0007"] = "MIL3QRD.002";
    this.version_to_esdt[CGGRP][TIME_ANNUAL]["F02_0007"] = "MIL3YRD.002";
    this.version_to_esdt[CGGRP][TIME_MONTH]["F02_0009"] = "MIL3MRD.003";
    this.version_to_esdt[CGGRP][TIME_SEASON]["F02_0009"] = "MIL3QRD.003";
    this.version_to_esdt[CGGRP][TIME_ANNUAL]["F02_0009"] = "MIL3YRD.003";
    this.version_to_esdt[CGGRP][TIME_MONTH]["F02_0011"] = "MIL3MRD.005";
    this.version_to_esdt[CGGRP][TIME_SEASON]["F02_0011"] = "MIL3QRD.005";
    this.version_to_esdt[CGGRP][TIME_ANNUAL]["F02_0011"] = "MIL3YRD.005";
    this.version_to_esdt[CGGRP][TIME_MONTH]["F02_0013"] = "MIL3MRD.005";
    this.version_to_esdt[CGGRP][TIME_SEASON]["F02_0013"] = "MIL3QRD.005";
    this.version_to_esdt[CGGRP][TIME_ANNUAL]["F02_0013"] = "MIL3YRD.005";
    this.version_to_esdt[CGGRP][TIME_MONTH]["F02_0015"] = "MIL3MRD.005";
    this.version_to_esdt[CGGRP][TIME_SEASON]["F02_0015"] = "MIL3QRD.005";
    this.version_to_esdt[CGGRP][TIME_ANNUAL]["F02_0015"] = "MIL3YRD.005";
    this.version_to_esdt[CGGRP][TIME_MONTH]["F02_0017"] = "MIL3MRD.005";
    this.version_to_esdt[CGGRP][TIME_SEASON]["F02_0017"] = "MIL3QRD.005";
    this.version_to_esdt[CGGRP][TIME_ANNUAL]["F02_0017"] = "MIL3YRD.005";
    this.version_to_esdt[CGGRP][TIME_MONTH]["F02_0019"] = "MIL3MRD.005";
    this.version_to_esdt[CGGRP][TIME_SEASON]["F02_0019"] = "MIL3QRD.005";
    this.version_to_esdt[CGGRP][TIME_ANNUAL]["F02_0019"] = "MIL3YRD.005";
    this.version_to_esdt[CGGRP][TIME_MONTH]["F02_0021"] = "MIL3MRD.005";
    this.version_to_esdt[CGGRP][TIME_SEASON]["F02_0021"] = "MIL3QRD.005";
    this.version_to_esdt[CGGRP][TIME_ANNUAL]["F02_0021"] = "MIL3YRD.005";
    this.version = available_version;
    this.input_version = available_input_version;
    this.latest_month = available_latest_month;
    this.esdt = available_esdt;
}

// -------------------------------------------------------------
// Check to see if the given image is available or not. If it is, 
// return the version. Otherwise, return false.
// -------------------------------------------------------------

function available_version(tm, dt) {
    if(tm.season_type() ==TIME_DAY) {
	return this.available_image[dt][tm.season + " " + tm.day + " " + tm.year];
    } else {
	return this.available_image[dt][tm.season + " " + tm.year];
    }
}

// -------------------------------------------------------------
// Return input file version, or false if no data available.
// -------------------------------------------------------------

function available_input_version(tm, dt) {
    if(tm.season_type() ==TIME_DAY) {
	return this.inputv[dt][tm.season + " " + tm.day + " " + tm.year];
    } else {
	return this.inputv[dt][tm.season + " " + tm.year];
    }
}

// -------------------------------------------------------------
// Determine latest available month for given data type. Returns
// A time.
// -------------------------------------------------------------

function available_latest_month(dt) {
    var first = 1;
    var max_tm;
    for(var i in this.available_image[dt]) {
	var t = i.split(" ");
	if(t.length ==2) { // Exclude daily data
	    var tm = new Time(t[0], t[1], 0);
	    if(tm.season_type() ==TIME_MONTH &&
	       (first ==1 ||
		compare_time(tm, max_tm) > 0)) {
		max_tm = tm;
		first = 0;
	    }
	}
    }
    return max_tm;
}

// -------------------------------------------------------------
// Check to see if the given image is available or not. If it is, 
// return the ESDT. Otherwise, return false.
// -------------------------------------------------------------

function available_esdt(tm, dt) {
    var v = this.version(tm, dt);
    if(!v) {
	return false;
    }
    return this.version_to_esdt[dt][tm.season_type()][v];
}
