
var CookieNamePrefix = "aqn_drafting_";
var SetNamePostfix = "_SET";


/**
 * @param draft_type_name type of draft, for example, "trousers"
 */
function displayMeasurementSets(draft_type_name)
{
    var set_names = listMeasurementsSets(draft_type_name);

    if (debug & DBG_SHOW_COOKIES) {
	var s = "Measurements sets names: ";
	for (var si = 0;  si < set_names.length;  si++) {
	    s += "<" + set_names[si] + "> ";
	}
	alert(s);
    }
    with (document) {
	var table = document.getElementById('setsTable');

	//  Delete any exisitng rows in table.
	while (table.rows.length > 3) {
	    table.deleteRow(-1);	// delete last row in table
	}

	for (var si = 0, rowi = 0;  si < set_names.length;  si++, rowi++) {
	    var set_name = set_names[si];
	    var new_row = table.insertRow(-1);	// -1 == insert as last row
	    var new_cell;
	    (new_cell = new_row.insertCell(0)).innerHTML =
		"<input type=button value=\"delete\" onClick='measurementsDelete(\"" + draft_type_name + "\", \"" + set_name + "\")'/>";
	    (new_cell = new_row.insertCell(0)).innerHTML =
		"<input type=button value=\"load\" onClick='measurementsLoad(\"" + draft_type_name + "\", \"" + set_name + "\")'/>";
	    var mod_time = parseInt(readCookie(formMeasSetCookieName(draft_type_name, set_name)));	// date created/modified
	    var mod_date = new Date(mod_time);
	    (new_cell = new_row.insertCell(0)).innerHTML = /*urlDecode(*/mod_date.toLocaleString() /*)*/;
	    (new_cell = new_row.insertCell(0)).innerHTML = set_name;
	}
    }
}


/**
 * Format a cookie name for a measurement.
 *
 * @param draft_type_name type of draft, for example, "trousers"
 * @param save_name user-supplied name for set of measurements for draft
 * @param meas_name name of measurement, for example, "chest_meas", "F1_meas", etc.
 *
 * @return a cookie name: a string
 */
function formMeasCookieName(draft_type_name, save_name, meas_name)
{
    return CookieNamePrefix + draft_type_name + "_" + save_name + "_" + meas_name;
}


/**
 * Format a cookie name for a measurements set.
 *
 * @param draft_type_name type of draft, for example, "trousers"
 * @param save_name user-supplied name for set of measurements for draft
 *
 * @return a cookie name: a string
 */
function formMeasSetCookieName(draft_type_name, save_name)
{
    return CookieNamePrefix + draft_type_name + "_" + save_name + SetNamePostfix;
}


/**
 * Returns an array of measurements set names (strings).
 * The names are the user-specified names, without any prefix or postfix, for example "aqn1".
 * See measurementsSave() for info on cookie naming.
 *
 * @param draft_type_name type of draft, for example, "trousers"
 *
 * @return array of measurements sets' name (array of strings)
 */
function listMeasurementsSets(draft_type_name)
{
    var set_names = fetchAllCookieNames(CookieNamePrefix + draft_type_name + '.*' + SetNamePostfix + '$');
    var names = new Array();
    for (var si = 0;  si < set_names.length;  si++) {
	var s = set_names[si];		// s is something like: "aqn_drafting_trousers_aqn1_SET"
	s = s.substring(0, s.length - SetNamePostfix.length);	// chop of trailing SetNamePostfix
	s = s.substring(CookieNamePrefix.length);	// chop of leading CookieNamePrefix
	s = s.substring(draft_type_name.length + 1);	// chop of leading "<draft type name>_"
	names[names.length] = s;	// "_aqn1"!
    }
    return names;
}


/**
 * Delete the measurements set with the specified name.
 * See measurementsSave() for more info.
 *
 * @param draft_type_name type of draft, for example, "trousers"
 * @param save_name user-supplied name for set of measurements for draft
 *
 * @return nothing
 */
function measurementsDelete(draft_type_name, save_name)
{
    var elems = new Array();

    var answer = confirm("Are you sure you want to delete \"" + save_name + "\"?");
    if (! answer) return;

    var all_meas_elems = new Array();
    all_meas_elems = getElementsByRegExpId("_meas$", undefined, "input");
    /*
    alert("measurementsLoad(): " +
	"draft_type_name <" + draft_type_name +
	"> save_name <" + save_name +
	">\nall_meas_elems.length <" + all_meas_elems.length +
	">");
    */
    for (var ai = 0;  ai < all_meas_elems.length;  ai++) {
	var melem = all_meas_elems[ai];
	if (debug & DBG_SHOW_NODES) alert("ai: <" + ai + "> nodeValue: <" + melem.nodeValue + "> id: <" + melem.id + ">");

	var cookie_name = formMeasCookieName(draft_type_name, save_name, melem.id);
	if (debug & DBG_SHOW_COOKIES) alert("cookie_name <" + cookie_name + ">");

	eraseCookie(cookie_name);
    }
    // Delete measurement set's name's cookie and re-display the sets.
    eraseCookie(formMeasSetCookieName(draft_type_name, save_name));
    displayMeasurementSets(draft_type_name);

    alert("Success!  Deleted measurements set named " + save_name + ".");
}


/**
 * Sets the value of all elements with ID "xxx_meas" and save them.
 * See measurementsSave() for more info.
 *
 * @param draft_type_name type of draft, for example, "trousers"
 * @param save_name user-supplied name for set of measurements for draft
 *
 * @return nothing
 */
function measurementsLoad(draft_type_name, save_name)
{
    var elems = new Array();

    var all_meas_elems = new Array();
    all_meas_elems = getElementsByRegExpId("_meas$", undefined, "input");
    /*
    alert("measurementsLoad(): " +
	"draft_type_name <" + draft_type_name +
	"> save_name <" + save_name +
	">\nall_meas_elems.length <" + all_meas_elems.length +
	">");
    */
    for (var ai = 0;  ai < all_meas_elems.length;  ai++) {
	var melem = all_meas_elems[ai];
	if (debug & DBG_SHOW_NODES) alert("ai: <" + ai + "> nodeValue: <" + melem.nodeValue + "> id: <" + melem.id + ">");

	var cookie_name = formMeasCookieName(draft_type_name, save_name, melem.id);
	if (debug & DBG_SHOW_COOKIES) alert("cookie_name <" + cookie_name + ">");

	var cookie_value = readCookie(cookie_name);
	melem.value = cookie_value;
    }

    alert("Success!  Loaded measurements set named " + save_name + ".");
}


/**
 * Grabs the value of all elements with ID "xxx_meas" and save them.
 * Measurements are saved in cookies named:  aqn_drafting_<draft type e.g. "trousers">_<user's name for draft>_<measurement name>,
 * for example:  "trousers_Andy's draft_F1_meas".
 * Additionally, the presence of a cookie named aqn_drafting_<draft type>_<user's name for draft><SetNamePostfix> indicates that there is
 * already a set of measurements saved with the user-specified name.
 *
 * @param draft_type_name type of draft, for example, "trousers"
 * @param save_name user-supplied name for set of measurements for draft
 *
 * @return nothing
 */
function measurementsSave(draft_type_name, save_name)
{
    if (contains(listMeasurementsSets(draft_type_name), save_name)) {
	var answer = confirm("You already have a set named " + save_name + ".  Do you want to overwrite it?");
	if (! answer) return;
    }

    var elems = new Array();

    var all_meas_elems = new Array();
    all_meas_elems = getElementsByRegExpId("_meas$", undefined, "input");
    /*
    alert("measurementsSave(): " +
	"draft_type_name <" + draft_type_name +
	"> save_name <" + save_name +
	">\nall_meas_elems.length <" + all_meas_elems.length +
	">");
    */
    for (var ai = 0;  ai < all_meas_elems.length;  ai++) {
	var melem = all_meas_elems[ai];
	if (debug & DBG_SHOW_NODES) alert("ai: <" + ai + "> nodeValue: <" + melem.nodeValue + "> id: <" + melem.id + ">");

	var cookie_name = formMeasCookieName(draft_type_name, save_name, melem.id);
	if (debug & DBG_SHOW_COOKIES) alert("cookie_name <" + cookie_name + ">");
	createCookie(cookie_name, melem.value, 3650);
    }

    var set_name = formMeasSetCookieName(draft_type_name, save_name);
    createCookie(set_name, (new Date()).getTime(), 3650);
    displayMeasurementSets(draft_type_name);

    alert("Success!  Saved measurements set named " + save_name + ".");
}
