function resetValue (p_dest)
{
	var dest = document.getElementById (p_dest);
	if	(dest == null)	return;
	dest.value = '';

	var dest = document.getElementById (p_dest + '_opt');
	if	(dest == null)	return;
	dest.selectedIndex = -1;
}

function setValue (p_src, p_dest)
{
	if	(p_src.selectedIndex == -1)
		return;
	var value = p_src.options[p_src.selectedIndex].value;
	if	(value == '')
		return;
	var dest = document.getElementById (p_dest);
	if	(dest == null)
		return;
	dest.value = value;
}

function matchValue (p_src, p_menu)
{
	if	(p_src.value == '')
		return;
	var value = p_src.value.toUpperCase();
	var menu = document.getElementById (p_menu);
	if	(menu == null)
		return;
	var options = menu.options;
	var len = options.length;
	for (var i = 0; i < len; i++)
	{
		if	(value != options[i].value.toUpperCase())  continue;
		menu.selectedIndex = i;
		if	(menu.onchange)
		{
            try { menu.onchange() } catch(err) { };
        }
		break;
	}
}

var CW_SC_set_name = new Array();
function setName (p_to, p_from1, p_from2)
{

	var dest = document.getElementById (p_to);
	if	(dest == null)	return;
	if	(CW_SC_set_name[p_to] == null)
		CW_SC_set_name[p_to] = (dest.value == '')? 0: 1;
	if	(CW_SC_set_name[p_to] == 1)
		return;

	var f1 = document.getElementById (p_from1);
	if	((f1 == null)||(f1.value == ''))
		return;
	var f2 = document.getElementById (p_from2);
	if	((f2 == null)||(f2.value == ''))
		return;
	dest.value = f1.value + ' ' + f2.value;
}

function changedName (p_to)
{

	var dest = document.getElementById (p_to);
	if	(dest == null)	return;
	CW_SC_set_name[p_to] = (dest.value == '')? 0: 1;
}

var CW_SC_CPU_menus = new Array ('ma', 'c_manuf', 'f', 'c_family',
	'so', 'c_socket', 'mo', 'c_model', 'p', 'c_part' );
var CW_SC_menu_style = 0;
var CW_SC_prev_ma = '';
var CW_SC_prev_f = '';

function getCPUMenus(p_sel, p_bench)
{

	var value;
	var obj;
	var	i;
	var	field;
	var par;
	var params = 's=' + ((p_sel == null)? '': escape(p_sel)) +
		'&ms=' + CW_SC_menu_style;
	for (i = 0; i < CW_SC_CPU_menus.length; i += 2)
	{
		par = CW_SC_CPU_menus[i];
		field = CW_SC_CPU_menus[i + 1] + '_opt';
		obj = document.getElementById(field);
		if	(obj == null)	continue;
		if	(obj.selectedIndex == -1)	continue;
		value = obj.options[obj.selectedIndex].value;
		if	(value == '')	continue;
		value = escape(value);
		params += '&' + par + '=' + value.replace(/\+/, '%2B');
	}
	var url = (p_bench)? '/cgi-bin/ajax/bench_parts.pl':
		'/cgi-bin/ajax/cpu_parts.pl';

	new Ajax.Request(url,
	{
		method: 'get',
		parameters: params,
		onSuccess: function(transport)
		{
			var text = transport.responseText || '';
			if (text != '')
			{
				var i;
				var j;
				var html_arr = text.split(/\~\~\~/);
				if	(html_arr[0] == 'DIV')
				{
					for (i = 0, j = 0; i < CW_SC_CPU_menus.length; i += 2, j++)
					{
						obj = document.getElementById('div_' + CW_SC_CPU_menus[i + 1]);
						obj.innerHTML = (html_arr[j + 1] == null)? '': ' ' + html_arr[j + 1] + ' ';
					}
				}
				// Set values for blank form fields if necessary
				else if (html_arr[0] == 'SET')
				{
					var kv;
					var js_arr = html_arr[1].split(/\s*\n\s*/);
					for (i = 0; i < js_arr.length; i++)
					{
						if	(!js_arr[i].match(/=/))  continue;
						kv = js_arr[i].split(/\s*=\s*/);
						if	(kv[1] == '')	continue;
						if	(kv[1] == undefined)	continue;
						obj = document.getElementById(kv[0]);
						if	((obj != null)&&(obj.value == ''))
						{
							obj.value = kv[1];
							if	(obj.onchange)
							{
					            try { obj.onchange() } catch(err) { };
					        }
						}
					}
				}
			}
		}
	});
}

function getBenchResults(p_par)
{

	var params = 'result=1';
	var	obj = document.getElementById ('c_family');
	if	(obj != null)
		params += '&f=' + obj.value.replace(/\+/, '%2B');
	obj = document.getElementById ('c_part');
	if	(obj != null)
		params += '&p=' + obj.value.replace(/\+/, '%2B');
	obj = document.getElementById ('c_part_ids');
	if	(obj != null)
		params += '&i=' + obj.value.replace(/\+/, '%2B');
	obj = document.getElementById ('c_test');
	if	(obj == null)
	{
		alert ("Internal error: select box 'c_test' not found!");
		return;
	}
	var i = obj.selectedIndex;
	if	(i == -1)
	{
		alert ("Please select benchmark");
		return;
	}

	if	(p_par)
	{
		i += p_par;
		if	(i < 0)		return;
		if	(obj.options[i] == null)	return;
		obj.selectedIndex = i;
	}

	//	Enable/disable buttons
	var but = document.getElementById ('BB_PREV');
	if	(but != null)
		but.disabled = (i == 0)? true: false;
	but = document.getElementById ('BB_NEXT');
	if	(but != null)
		but.disabled = (obj.options[i + 1] == null)? true: false;

	params += '&b=' + escape(obj.options[i].value);

	new Ajax.Request('/cgi-bin/ajax/bench_parts.pl',
	{
		method: 'get',
		parameters: params,
		onSuccess: function(transport)
		{
			var text = transport.responseText || '';
			if (text == '')	return;
			var obj = document.getElementById ('c_benchmarks');
			if	(obj == null)
				window.status ("Internal error: div tag 'c_benchmarks' not found");
			else
				obj.innerHTML = text;
			BarReload();
		}
	});
}

function AddToSelect (p_from, p_to, p_hidden, p_type)
{

	var from_obj = document.getElementById (p_from);
	if	(from_obj == null)	return;
	var from_options = from_obj.options;
	var sel = from_obj.selectedIndex;
	var len = from_obj.length;
	if	(sel == -1)
	{
		if	((len == 1)&&(from_options[0].value != ''))
		{
			from_obj.selectedIndex = 0;
			sel = 0;
		}
		else if	((len == 2)&&(from_options[0].value == '')&&
			(from_options[1].value != ''))
		{
			from_obj.selectedIndex = 1;
			sel = 1;
		}
		else
			return;
	}

	var	to_obj = document.getElementById(p_to);
	if	(to_obj == null)	return;

	var	hidden_obj = document.getElementById(p_hidden);
	if	(hidden_obj == null)	return;
	var choices = hidden_obj.value.split(/\|/);

	var i;
	len = choices.length;
	var uniq = new Object;
	for (i = 0; i < len; i++)
	{
		uniq[choices[i]] = 1;
	}

	var value, text, obj;
	var added = 0;
	len = from_obj.length;
	for (i = 0; i < len; )
	{
		if	((!from_options[i].selected)||(from_options[i].value == ''))
		{
			i++;
			continue;
		}
		value = from_options[i].value;
		from_options[i] = null;
		len--;
		sel = i;

		if	(value == '')	continue;
		while	(value.match(/\{\w+\}$/))
		{
			obj = value.replace(/^.+\{(\w+)\}$/, "$1");
			value = value.replace(/\{\w+\}$/, '');
			obj = document.getElementById(obj);
			if	(obj != null)	obj.checked = true;
		}
		if	(p_type !=  '')
			value = p_type + '_' + value;
		if	(uniq[value])	continue;
		uniq[value] = 1;
		added++;
	}
	if	(sel >= from_obj.length)
		sel = from_obj.length - 1;
	from_obj.selectedIndex = sel;

	if	(added == 0)	return;

	choices.length = 0;
	for (value in uniq)
	{
		if	(value != '')	choices.push (value);
	}

	var tbody = document.createElement('tbody');
	var old_tbody = to_obj.getElementsByTagName('tbody');
	if	(old_tbody == null)		return;
	old_tbody = old_tbody[0];

	len = choices.length;
	var tr, td;
	if	(len == 0)
	{
		AddHelpRow (tbody);
	}
	else
	{
		choices = choices.sort();

		for (i = 0; i < len; i++)
		{
			value = choices[i];
			text = value.replace(/_/g, ' ');
			text = text.replace(/^Socket Socket /i, 'Socket ');
			if	(text == 'Socket *')	text = 'Socket &lt;Not specified&gt;';
			tr = document.createElement('tr');
			td = document.createElement('td');
			td.align = 'center';
			td.vAlign = 'top';
			td.innerHTML = "<input type='button' name='P' value='X' class='del_button' onClick='DeleteSelected(this, \"c_part\", \"" +
				value + "\")'>";
			tr.appendChild(td);
			td = document.createElement('td');
			td.innerHTML = text;
			tr.appendChild(td);
			tbody.appendChild(tr);
		}
	}
	to_obj.replaceChild(tbody, old_tbody);

	AddStripes(to_obj);

	hidden_obj.value = choices.join('|');

	//	Reset fields if the source pull-down menu doesn't have any other choices
	var len = from_obj.length;
	if	((len == 0)||((len == 1)&&(from_options[0].value == '')))
		ResetFields ();
}

function ResetFields ()
{
	resetValue('c_manuf');
	resetValue('c_family');
	resetValue('c_socket');
	getCPUMenus('c_manuf', 1)
}

function DeleteSelected(p_obj, p_hidden, p_value)
{

	var table;
	var parent = p_obj;
	while ((parent != null)&&(parent.nodeName != 'TR'))
	{
		parent = parent.parentNode;
	}
	if	(parent != null)
	{
		table = parent;
		while ((table != null)&&(table.nodeName != 'TABLE'))
		{
			table = table.parentNode;
		}
		parent.parentNode.removeChild(parent);
		if	(table != null)		AddStripes(table);
	}

	var	hidden_obj = document.getElementById(p_hidden);
	if	(hidden_obj == null)	return;
	var choices = hidden_obj.value.split(/\|/);

	var	i;
	var len = choices.length;
	for (i = 0; i < len; i++)
	{
		if	(choices[i] == p_value)
		{
			choices.splice(i, 1);
			break;
		}
	}

	if	((choices.length == 0)&&(table != null))
	{
		DeleteAllSelected (table.id, p_hidden);
		return;
	}


	hidden_obj.value = choices.join('|');
}

function DeleteAllSelected(p_table, p_hidden)
{

	var table_obj = document.getElementById (p_table);
	if	(table_obj != null)
	{
		var tbody = document.createElement('tbody');
		AddHelpRow (tbody);
		var old_tbody = table_obj.getElementsByTagName('tbody');
		if	(old_tbody != null)
			table_obj.replaceChild(tbody, old_tbody[0]);
	}

	var	hidden_obj = document.getElementById(p_hidden);
	if	(hidden_obj != null)	hidden_obj.value = '';
}

function AddHelpRow (p_tbody)
{

	var tr = document.createElement('tr');
	var td = document.createElement('td');
	td.innerHTML = "<span style='color: #808080'><p><b>NO CPUs SELECTED.</b> <p>To browse benchmarks: <p><ol><li> Optionally, use <b>CPU Manufacturer</b> field to limit a list of families, sockets, models and part numbers only to those, produced by specific manufacturer.</li>" +
		"<li> Choose CPU family or processor socket in the pull-down menus on the left.</li> <li> Optionally, select one or more models or part numbers, that you want to see benchmarks for.</li> <li> Click on the <b>Add to selected</b> button to add selected family, socket, " +
		"models or part numbers to the \"Currently selected CPUs / families\" list.</li> <li> To add different processors click on the <b>Reset fields</b> button to reset manufacturer, family and other fields to their original values, and repeat steps 1 - 4.</li>" +
		"<li> Click on the <b>Show benchmark chart</b> button to see the chart for all selected chips.</li> </ol> </span>";
	tr.appendChild(td);
	p_tbody.appendChild(tr);
}

function AddStripes (p_table)
{

	var trs = p_table.getElementsByTagName('tr');
	var len = trs.length;
	var i;
	var bg = 1;
	for (i = 0; i < len; i++)
	{
		trs[i].className = 'row' + bg;
		bg = 3 - bg;
	}
}

