// (C) Two Corner Timing LLC
// $Id: two20101108.js 3994 2010-11-08 05:46:53Z gritton $

var ie;

// preload
// Tasks to be run before the final page load

var perf_dates, perf_from, perf_to, perf_anyto,
    perf_var, perf_varmix, perf_varmix_vars, perf_varmix_blendall,
    perf_vs, perf_vsmix, perf_vsmix_vars, perf_vsmix_blendall;
var sa_mix, sa_mixcb, sa_mix_name, sa_mix_vars, sa_mix_blendall, sa_prefix;

function preload()
{
    // Because the worst browser has the best market share
    ie = /*@cc_on!@*/false;

    if (perf_dates = document.getElementById("perf_dates"))
    {
	// Get the necessary elements for the Performance page
	perf_from = document.getElementById("perf_from");
	perf_to = document.getElementById("perf_to");
	perf_var = document.getElementById("perf_var");
	perf_vs = document.getElementById("perf_vs");
	perf_varmix = document.getElementById("perf_varmix");
	perf_vsmix = document.getElementById("perf_vsmix");
	perf_anyto = document.getElementById("anyto").value;

	perf_from.onchange = perf_from.onkeypress = perf_to.onchange =
	    perf_to.onkeypress = perf_custom_dates;
	perf_dates.onchange = perf_canned_dates;
	perf_var.onchange = perf_select_var;
	perf_vs.onchange = perf_select_vs;
	perf_canned_dates();

	perf_varmix_vars = new Array();
	perf_varmix_blendall = new Array();
	getmix("var", perf_varmix, perf_varmix_vars, perf_varmix_blendall,
	       perf_relay_varmix);
	perf_vsmix_vars = new Array();
	perf_vsmix_blendall = new Array();
	getmix("vs", perf_vsmix, perf_vsmix_vars, perf_vsmix_blendall,
	       perf_relay_vsmix);

	// Add the "mix" option to signal menus
	var lastopt = perf_var.lastChild;
	if (lastopt.value != "mix" &&
	    lastopt.previousSibling.value != "mix")
	{
	    perf_var.appendChild(document.createElement("option"));
	    lastopt = document.createElement("option");
	    lastopt.value = "mix";
	    lastopt.appendChild(document.createTextNode("Mix..."));
	    perf_var.appendChild(lastopt);
	}
	perf_select_var();
	lastopt = perf_vs.lastChild;
	if (lastopt.value != "mix" &&
	    lastopt.previousSibling.value != "mix")
	{
	    perf_vs.appendChild(document.createElement("option"));
	    lastopt = document.createElement("option");
	    lastopt.value = "mix";
	    lastopt.appendChild(document.createTextNode("Mix..."));
	    perf_vs.appendChild(lastopt);
	}
	perf_select_vs();
    }

    sa_mix = document.getElementById("sub_mix");
    if (!sa_mix)
	sa_mix = document.getElementById("edit_mix");
    if (sa_mix)
    {
	// Get necessary elements for the Subscribe and My Account pages page
	sa_prefix = sa_mix.id.match("[^_]*")[0];
	sa_mix_vars = new Array();
	sa_mix_blendall = new Array();
	var name = new Array();
	getmix(sa_prefix, sa_mix, sa_mix_vars, sa_mix_blendall, sa_relay_mix,
	       name, sa_relay_mix_name);
	sa_mix_name = name[0];
	// Add the "mix" checkbox to subscribe/account
	var br = document.createElement("br");
	br.className = "bigbr";
	var label = document.createElement("label");
	label.htmlFor = sa_prefix + "_mixcb";
	sa_mixcb = document.createElement("input");
	sa_mixcb.type = "checkbox";
	sa_mixcb.id = label.htmlFor;
	sa_mixcb.className = "checkbox";
	sa_mixcb.name = sa_prefix + "varmix";
	label.appendChild(sa_mixcb);
	var span = document.createElement("span");
	span.appendChild(document.createTextNode(" Mix..."));
	label.appendChild(span);
	sa_mix.parentNode.appendChild(br);
	sa_mix.parentNode.appendChild(label);

	for (; label; label = label.previousSibling)
	{
	    var el = label.firstChild;
	    if (!el)
		continue;
	    if (el.nodeName != "INPUT")
		el = el.nextSibling;
	    if (el.nodeName == "INPUT" && el.name.search('var..') >= 0)
	    {
		if (ie)
		    el.onpropertychange = sa_pop_mix;
		else
		    el.onchange = sa_pop_mix;
	    }
	}
    }

    var ce_height;
    var login = document.getElementById("login");
    if (login)
    {
	// Align the right edges of the login form.
	// Center the login form within the top bar.
	var login_name = document.getElementById("login_name");
	var login_password = document.getElementById("login_password");
	var login_button = document.getElementById("login_button");
	var right_delta = (login_name.offsetLeft + login_name.clientWidth) -
	    (login_button.offsetLeft + login_button.clientWidth);
	if (right_delta < 0)
	    login_name.style.width =
		(login_name.clientWidth - right_delta) + 'px';
	else if (right_delta > 0)
	    login_password.style.width =
		(login_password.clientWidth + right_delta) + 'px';
	login.style.marginTop = login.offsetHeight >= 150 ? 0
	    : (150 - login.offsetHeight) / 2 + 'px';
	ce_height = login.clientHeight;
    }
    else
    {
	// Center the quick signal box within the top bar.
	var signal_summaries = document.getElementById("signal_summaries");
	signal_summaries.style.marginTop =
	    signal_summaries.offsetHeight >= 150 ? 0
	    : (150 - signal_summaries.offsetHeight) / 2 + 'px';
	ce_height = signal_summaries.clientHeight;
    }

    // Push the sidebar down if necessary
    var sidebar = document.getElementById("sidebar");
    if (sidebar.offsetTop < ce_height)
	sidebar.style.top = (ce_height + 25) + 'px';
}

function getmix(prefix, mix, vars, blendall, relay, name, relay_name)
{
    var tbody = mix.firstChild;
    for (var tr = tbody.firstChild ? tbody.firstChild
	 : tbody.nextSibling.firstChild; tr; tr = tr.nextSibling)
	for (var td = tr.firstChild; td; td = td.nextSibling)
	    for (var lt = td.firstChild; lt; lt = lt.nextSibling)
	    {
		if (lt.name == prefix + "mixname")
		{
		    name[0] = lt;
		    lt.onkeypress = lt.onkeyup = lt.onchange = relay_name;
		    continue;
		}
		var el = lt.firstChild;
		if (!el)
		    continue;
		if (el.nodeName != "INPUT")
		    el = el.nextSibling;
		if (el.name != prefix + "mixA")
		    vars.push(el);
		else
		    blendall[el.value ? 1 : 0] = el;
		if (relay)
		{
		    if (ie)
			el.onpropertychange = relay;
		    else
			el.onchange = relay;
		}
	    }
}


// perf_custom_dates, perf_canned_dates, perf_canned_vardate
// Gray out and auto-change the performance date fields whan a canned date
// range is chosen

function perf_custom_dates(e)
{
    if (ie || e.type != "keypress" || e.which >= 32 || e.which == 8 ||
	e.keyCode == 46)
    {
	perf_dates.value = "custom";
	perf_from.style.color = "black";
	perf_to.style.color = "black";
    }
}

function perf_canned_dates()
{
    if (perf_dates.value == "custom")
    {
	perf_from.style.color = "black";
	perf_to.style.color = "black";
    }
    else
    {
	var from = perf_dates.value == "live"
	    ? document.getElementById("live" + perf_var.value + "from")
	    : document.getElementById(perf_dates.value + "from");
	perf_from.value = from ? from.value : '';
	perf_from.style.color = "#689090";
	perf_to.value = perf_anyto;
	perf_to.style.color = "#689090";
    }
}

function perf_canned_vardate()
{
    if (perf_dates.value == "live")
    {
	var from = document.getElementById("live" + perf_var.value + "from");
	perf_from.value = from ? from.value : '';
    }
}


// perf_select_var, perf_select_vs
// Pop up or down the varmix/vsmix tables

var perf_var_in_callback, perf_vs_in_callback;

function perf_select_var()
{
    if (ie)
    {
	if (perf_var_in_callback)
	    return;
	perf_var_in_callback = true;
    }
    perf_canned_vardate();
    perf_pop_mix(perf_var, perf_varmix, perf_varmix_vars, perf_varmix_blendall,
		 6);
    if (ie)
	perf_var_in_callback = false;
}

function perf_select_vs()
{
    if (ie)
    {
	if (perf_vs_in_callback)
	    return;
	perf_vs_in_callback = true;
    }
    perf_pop_mix(perf_vs, perf_vsmix, perf_vsmix_vars, perf_vsmix_blendall, 5);
    if (ie)
	perf_vs_in_callback = false;
}

var vert_done;

function perf_pop_mix(v, mix, vars, blendall, prefix_len)
{
    if (v.value.length <= 1 || v.value == "BH")
	mix.style.visibility = "hidden";
    else
    {
	if (v.value != "mix")
	{
	    for (var i = 0; i < vars.length; i++)
		vars[i].checked = 
		    v.value.search(vars[i].name.substr(prefix_len)) >= 0;
	    blendall[v.value.search('A') >= 0 ? 1 : 0].checked = true;
	}

	var td = mix.parentNode;
	if (!td.style.width)
	    td.style.width = mix.clientWidth + 'px';
	if (!vert_done)
	{
	    vert_done = 1;
	    var tbody = td.parentNode.parentNode;
	    var tr;
	    for (tr = tbody.firstChild; tr; tr = tr.nextSibling)
		if (tr.style)
		    tr.saved_height = tr.clientHeight;
	    tr = document.createElement("tr");
	    tr.appendChild(document.createElement("td"));
	    tbody.appendChild(tr);
	    tbody.style.height = mix.clientHeight + 'px';
	    for (tr = tbody.firstChild; tr; tr = tr.nextSibling)
		if (tr.saved_height)
		    tr.style.height = tr.saved_height + 'px';
	}
	mix.style.visibility = "visible";
    }
}


// perf_relay_var_mix, perf_relay_vs_mix
// Keep a performance mix checkbox in sync with its menu

function perf_relay_varmix(e)
{
    if (ie)
    {
	if (perf_var_in_callback)
	    return;
	perf_var_in_callback = true;
	var cb = window.event.target
	    ? window.event.target : window.event.srcElement;
	if (!cb.tct_initial)
	{
	    cb.tct_initial = true;
	    perf_var_in_callback = false;
	    return;
	}
    }
    perf_relay_mix(perf_var, perf_varmix_vars, perf_varmix_blendall, 6);
    if (ie)
	perf_var_in_callback = false;
}

function perf_relay_vsmix(e)
{
    if (ie)
    {
	if (perf_vs_in_callback)
	    return;
	perf_vs_in_callback = true;
	var cb = window.event.target
	    ? window.event.target : window.event.srcElement;
	if (!cb.tct_initial)
	{
	    cb.tct_initial = true;
	    perf_vs_in_callback = false;
	    return;
	}
    }
    perf_relay_mix(perf_vs, perf_vsmix_vars, perf_vsmix_blendall, 5);
    if (ie)
	perf_vs_in_callback = false;
}

function perf_relay_mix(sel, vars, blendall, prefix_len)
{
    // Build a tag representing the mix table
    var vt = blendall[1].checked ? 'A' : '';
    for (var i = 0; i < vars.length; i++)
	if (vars[i].checked)
	    vt += vars[i].name.substr(prefix_len);

    // Look for a menu item with this value
    var opt;
    for (opt = sel.firstChild; opt; opt = opt.nextSibling)
	if (opt.value == vt)
	{
	    sel.value = vt;
	    break;
	}
    if (!opt)
	sel.value = "mix";
}


// sa_pop_mix
// Pop up or down the mix table and associate it with a checkbox

var sa_assoc_cb, sa_assoc_text, sa_defname, sa_in_callback;

function sa_pop_mix(e)
{
    if (ie)
	e = window.event;
    var cb = e.target ? e.target : e.srcElement;

    if (ie)
    {
	if (sa_in_callback)
	    return;
	sa_in_callback = true;
	if (!cb.tct_initial)
	{
	    cb.tct_initial = true;
	    sa_in_callback = false;
	    return;
	}
    }

    if (cb.checked || cb != sa_assoc_cb && cb != sa_mixcb)
    {
	if (sa_assoc_text)
	    sa_assoc_text.style.fontWeight = "normal";
	if (sa_assoc_cb == sa_mixcb)
	    sa_assoc_cb.checked = false;
	sa_assoc_text = cb.nextSibling;
	if (!sa_assoc_text.firstChild)
	    sa_assoc_text = sa_assoc_text.nextSibling;
	sa_assoc_text.style.fontWeight = "bold";
	sa_assoc_cb = cb;

	var vt = cb == sa_mixcb ? '' : cb.name.match('var.*')[0].substr(3);
	sa_defname = cb.value.search('^".*"$') < 0;
	sa_mix_name.value =
	    cb == sa_mixcb ? '' : cb.value.replace(/^"|"$/g, '');
	for (var i = 0; i < sa_mix_vars.length; i++)
	    sa_mix_vars[i].checked = 0 <=
		vt.search(sa_mix_vars[i].name.substr(sa_prefix.length + 3));
	sa_mix_blendall[vt.search('A') >= 0 ? 1 : 0].checked = true;
	if (!vert_done)
	{
	    vert_done = 1;
	    if (sa_mix.parentNode.clientHeight < sa_mix.clientHeight)
		sa_mix.parentNode.style.height = sa_mix.clientHeight + 'px';
	}
	sa_mix.style.visibility = "visible";
	cb.checked = true;
    }
    else
    {
	sa_assoc_text.style.fontWeight = "normal";
	sa_assoc_cb = null;
	sa_assoc_text = null;
	sa_mix.style.visibility = "hidden";
    }
    if (ie)
	sa_in_callback = false;
}


// sa_relay_mix, sa_relay_mix_name
// Keep a mix checkbox in sync with the mix table

var sa_cbnum = 0;

function sa_relay_mix(e)
{
    if (ie)
    {
	if (sa_in_callback)
	    return;
	sa_in_callback = true;
	var cb = window.event.target
	    ? window.event.target : window.event.srcElement;
	if (!cb.tct_initial)
	{
	    cb.tct_initial = true;
	    sa_in_callback = false;
	    return;
	}
    }

    // Build a tag representing the mix table
    var vt = sa_mix_blendall[1].checked ? 'A' : '';
    for (var i = 0; i < sa_mix_vars.length; i++)
	if (sa_mix_vars[i].checked)
	    vt += sa_mix_vars[i].name.substr(sa_prefix.length + 3);

    // Update a default name
    var name;
    if (sa_defname)
    {
	if (vt == "zwyph")
	    name = "Zero Five";
	else
	{
	    name = '';
	    for (var i = 0; i < sa_mix_vars.length; i++)
		if (sa_mix_vars[i].checked)
		    name += (name ? '/' : '') + sa_mix_vars[i].value;
	    if (sa_mix_blendall[1].checked)
		name += " 100%";
	}
	sa_mix_name.value =
	    vt.length > 1 + sa_mix_blendall[1].checked ? name : '';
    }
    else
	name = '"' + sa_mix_name.value + '"';

    // If there's no associated checkbox, create a new one
    if (sa_assoc_cb == sa_mixcb && vt.search('[a-z]{2}$') >= 0)
    {
	var label = document.createElement("label");
	label.htmlFor = sa_prefix + "_cb" + ++sa_cbnum;
	sa_assoc_cb = document.createElement("input");
	sa_assoc_cb.type = "checkbox";
	sa_assoc_cb.id = label.htmlFor;
	sa_assoc_cb.className = "checkbox";
	sa_assoc_cb.checked = true;
	if (ie)
	{
	    sa_assoc_cb.tct_initial = true;
	    sa_assoc_cb.onpropertychange = sa_pop_mix
	}
	else
	    sa_assoc_cb.onchange = sa_pop_mix;
	label.appendChild(sa_assoc_cb);
	sa_assoc_text.style.fontWeight = "normal";
	sa_assoc_text = document.createElement("span");
	sa_assoc_text.style.fontWeight = "bold";
	sa_assoc_text.appendChild(document.createTextNode(''));
	label.appendChild(sa_assoc_text);
	sa_mixcb.parentNode.parentNode.insertBefore(
					document.createElement("br"),
					sa_mixcb.parentNode.previousSibling);
	sa_mixcb.parentNode.parentNode.insertBefore(label,
					sa_mixcb.parentNode.previousSibling);
	sa_mixcb.checked = false;
    }

    // Update the associated checkbox
    if (sa_assoc_cb != sa_mixcb)
    {
	sa_assoc_cb.name = sa_prefix + "var" + vt;
	sa_assoc_cb.value = name;
	sa_assoc_text.firstChild.nodeValue = ' ' + name;
    }
    if (ie)
	sa_in_callback = false;
}

function sa_relay_mix_name(e)
{
    if (ie)
    {
	e = window.event;
	if (!e.srcElement.tct_initial)
	{
	    e.srcElement.tct_initial = true;
	    return;
	}
    }

    if (ie || e.type != "keypress" || e.which >= 32 || e.which == 8 ||
	e.keyCode == 46)
    {
	if (e.type != "keypress" && e.type != "keyup" ||
	    sa_mix_name.value != '')
	    sa_defname = sa_mix_name.value == '';
	if (sa_assoc_cb != sa_mixcb)
	    sa_relay_mix(e);
    }
}

