var sharp = '#'; var flat = 'b';
//var double_sharp = 'x';
//var sharp = '#'; var flat = 'b';
var double_sharp = 'x'; var double_flat = flat+flat;
var sharp_notes = new Array('C', 'C'+sharp, 'D', 'D'+sharp, 'E', 'F', 'F'+sharp, 'G', 'G'+sharp, 'A', 'A'+sharp, 'B');
var flat_notes = new Array('C', 'D'+flat, 'D', 'E'+flat, 'E', 'F', 'G'+flat, 'G', 'A'+flat, 'A', 'B'+flat, 'B');
var chord_names = new Array('maj', 'm', '+', '°', '5', '6', 'm6', '', 'maj', 'm', '+', '°', 'm/maj', 'custom');

function update_chord() {
	var notes = new Array();
	var chord_form = document.forms[0];
	var cname = chord_form.f_chord_name.selectedIndex;
	var root_note = parseInt(chord_form.f_root_note.options[chord_form.f_root_note.selectedIndex].value);
	var tones = new Array();
	var tonestr = new Array();
	var toneopt = new Array();
	var tonestring = '';
	var accidental = '';
	var accval = 0;
	notes = sharp_notes;
	if (document.getElementById('f_root_acc_flat').checked) {
		accidental = flat;
		accval = -1;
	}
	else if (document.getElementById('f_root_acc_sharp').checked) {
		notes = sharp_notes;
		accidental = sharp;
		accval = 1;
	}
	var chord_name = notes[root_note];
	//chord_name += accidental + chord_form.f_chord_name.options[chord_form.f_chord_name.selectedIndex].value;
	chord_name += accidental + chord_names[chord_form.f_chord_name.selectedIndex];
				
	tones[1] = root_note + accval;
	tones[3] = root_note + accval + 4;
	tones[5] = root_note + accval + 7;
	
	tonestr[1] = notes[root_note] + accidental;
	
	switch (cname)
	{
		case 0:		// major
			tonestr[3] = notes[(root_note + 4) % 12] + accidental;
			tonestr[5] = notes[(root_note + 7) % 12] + accidental;
			break;
		case 1:		// minor
			tonestr[3] = notes[(root_note + 4) % 12] + accidental + flat;
			tonestr[5] = notes[(root_note + 7) % 12] + accidental;
			tones[3]--;
			break;
		case 2:		// aug
			tonestr[3] = notes[(root_note + 4) % 12] + accidental;
			tonestr[5] = sharp_notes[(root_note + 7) % 12] + accidental + sharp;
			tones[5]++;
			break;
		case 3:		// dim
			tonestr[3] = notes[(root_note + 4) % 12] + accidental + flat;
			tonestr[5] = notes[(root_note + 7) % 12] + accidental + flat;
			tones[3]--;
			tones[5]--;
			break;
		case 4:		// power chord
			tonestr[5] = notes[(root_note + 7) % 12] + accidental;
			tones[5] = root_note + accval + 7;
			break;
		case 5:		// maj6
			tonestr[3] = notes[(root_note + 4) % 12] + accidental;
			tonestr[5] = notes[(root_note + 7) % 12] + accidental;
			tonestr[6] = notes[(root_note + 9) % 12] + accidental;
			tones[6] = root_note + accval + 9;
			break;
		case 6:		// m6
			tonestr[3] = notes[(root_note + 4) % 12] + accidental + flat;
			tonestr[5] = notes[(root_note + 7) % 12] + accidental;
			tonestr[6] = notes[(root_note + 9) % 12] + accidental;
			tones[6] = root_note + accval + 9;
			tones[3]--;
			break;
		case 7:		// dom 7
			tonestr[3] = notes[(root_note + 4) % 12] + accidental;
			tonestr[5] = notes[(root_note + 7) % 12] + accidental;
			tonestr[7] = notes[(root_note + 11) % 12] + accidental + flat;
			tones[7] = root_note + accval + 11 - 1;
			break;
		case 8:		// maj7
			tonestr[3] = notes[(root_note + 4) % 12] + accidental;
			tonestr[5] = notes[(root_note + 7) % 12] + accidental;
			tonestr[7] = notes[(root_note + 11) % 12] + accidental;
			tones[7] = root_note + accval + 11;
			break;
		case 9:		// min7
			tonestr[3] = notes[(root_note + 4) % 12] + accidental + flat;
			tonestr[5] = notes[(root_note + 7) % 12] + accidental;
			tonestr[7] = notes[(root_note + 11) % 12] + accidental + flat;
			tones[3]--;
			tones[7] = root_note + accval + 11 - 1;
			break;
		case 10:	// +7
			tonestr[3] = notes[(root_note + 4) % 12] + accidental;
			tonestr[5] = sharp_notes[(root_note + 7) % 12] + accidental + sharp;
			tonestr[7] = notes[(root_note + 11) % 12] + accidental + flat;
			tones[7] = root_note + accval + 11 -1;
			tones[5]++;
			break;
		case 11:	// dim7
			tonestr[3] = notes[(root_note + 4) % 12] + accidental + flat;
			tonestr[5] = notes[(root_note + 7) % 12] + accidental + flat;
			tonestr[7] = notes[(root_note + 11) % 12] + accidental + flat + flat;
			tones[3]--;
			tones[7] = root_note + accval + 11 -2;
			tones[5]--;
			break;
		case 12:	// m/maj7
			tonestr[3] = notes[(root_note + 4) % 12] + accidental + flat;
			tonestr[5] = notes[(root_note + 7) % 12] + accidental;
			tonestr[7] = notes[(root_note + 11) % 12] + accidental;
			tones[3]--;
			tones[7] = root_note + accval + 11;
			break;
		case 13:
			tonestr[1]='';
			chord_name = '';
			break;
	}

	if (!document.getElementById('f_ext9').disabled)
	{
		if (document.getElementById('f_ext9').checked) {
			tonestr[9] = notes[(root_note + 14) % 12] + accidental;
			tones[9] = root_note + accval + 14;
			chord_name += '9';
		}
		else if (document.getElementById('f_ext11').checked) {
			tonestr[9] = notes[(root_note + 14) % 12] + accidental;
			tones[9] = root_note + accval + 14;
			tonestr[11] = notes[(root_note + 17) % 12] + accidental;
			tones[11] = root_note + accval + 17;
			toneopt[9] = true;
			chord_name += '11';
		}
		else if (document.getElementById('f_ext13').checked) {	// 9th is more preferable than 11th (11th clashes)
			tonestr[9] = notes[(root_note + 14) % 12] + accidental;
			tones[9] = root_note + accval + 14;
			tonestr[11] = notes[(root_note + 17) % 12] + accidental;
			tones[11] = root_note + accval + 17;
			tonestr[13] = notes[(root_note + 21) % 12] + accidental;
			tones[13] = root_note + accval + 21;
			toneopt[9] = true;
			toneopt[11] = true;
			chord_name += '13';
		}
		else {
			chord_name += '7';
		}
	}
	
	if (document.getElementById('f_alt_sus2').checked) {
		tonestr[3] = '';
		tonestr[2] = notes[(root_note + 2) % 12] + accidental;
		tones[2] = root_note + accval + 2;
		chord_name += 'sus2';
	}
	if (document.getElementById('f_alt_sus4').checked) {
		tonestr[3] = '';
		tonestr[4] = notes[(root_note + 5) % 12] + accidental;
		tones[4] = root_note + accval + 5;
		chord_name += 'sus4';
	}
	if (document.getElementById('f_add9').checked) {
		tonestr[9] = notes[(root_note + 14) % 12] + accidental;
		tones[9] = root_note + accval + 14;
		chord_name += 'add9';
	}
	if (document.getElementById('f_add11').checked) {
		tonestr[11] = notes[(root_note + 17) % 12] + accidental;
		tones[11] = root_note + accval + 17;
		chord_name += 'add11';
	}
	if (document.getElementById('f_add13').checked) {
		tonestr[13] = notes[(root_note + 21) % 12] + accidental;
		tones[13] = root_note + accval + 21;
		chord_name += 'add13';
	}
	if (document.getElementById('f_alt_flat5').checked) {
		tonestr[5] += flat;
		tones[5]--;
		chord_name += flat + '5';
	}
	else if (document.getElementById('f_alt_sharp5').checked) {
		tonestr[5] += sharp;
		tones[5]++;
		chord_name += sharp + '5';
	}
	if (document.getElementById('f_alt_flat9').checked) {
		tonestr[9] = notes[(root_note + 14) % 12] + accidental + flat;
		tones[9] = root_note + accval + 14 - 1;
		toneopt[9] = false;
		chord_name += flat + '9';
	}
	else if (document.getElementById('f_alt_sharp9').checked) {
		tonestr[9] = notes[(root_note + 14) % 12] + accidental + sharp;
		tones[9] = root_note + accval + 14 + 1;
		toneopt[9] = false;
		chord_name += sharp + '9';
	}
	if (document.getElementById('f_alt_sharp11').checked) {
		tonestr[11] = notes[(root_note + 17) % 12] + accidental + sharp;
		tones[11] = root_note + accval + 17 + 1;
		toneopt[11] = false;
		chord_name += sharp + '11';
	}
	if (document.getElementById('f_alt_flat13').checked) {
		tonestr[13] = notes[(root_note + 21) % 12] + accidental + flat;
		tones[13] = root_note + accval + 21 - 1;
		toneopt[13] = false;
		chord_name += flat + '13';
	}
	
	if (tones[5] == root_note + accval + 7 && cname != 4) toneopt[5] = true;
	tonestring = '';
	tcbcount = 1;
	numnotes = 0;
	numopts = 0;
	for (i = 0; i < tonestr.length; i++) {
		if (tonestr[i]) numnotes++;
		if (toneopt[i]) numopts++;
	}
	finalnotes = 0;
	for (i = 1; i <= 9; i++) {
		disable_element('f_tone'+i);
		document.getElementById('f_custom'+i).disabled = true;
		if (cname == 13) { if(i<=4) document.getElementById('f_custom'+i).disabled = false;}
		else {
			document.getElementById('f_custom'+i).disabled = true;
			document.getElementById('f_custom'+i).selectedIndex = 0;
		}
		document.getElementById('f_ltone'+i).innerHTML = '';
	}
	for (i = 0; i < tonestr.length; i++) {
		if (tonestr[i]) {
			document.getElementById('f_tone'+tcbcount).disabled = false;
			document.getElementById('f_tone'+tcbcount).checked = true;;
			if (!toneopt[i])
			{
				document.getElementById('f_ltone'+tcbcount).innerHTML = '<strong>'+calc_note(tonestr[i])+'</strong>';
				finalnotes++;
				//document.getElementById('f_opt'+tcbcount).value = 0;
			}
			else {
				document.getElementById('f_ltone'+tcbcount).innerHTML = '<strong>('+calc_note(tonestr[i])+')</strong>';
				if (numnotes>4)
				{
					document.getElementById('f_tone'+tcbcount).disabled = true;
				}
				//document.getElementById('f_opt'+tcbcount).value = 1;
			}
			document.getElementById('f_tone'+tcbcount).value = ((tones[i]+3)%12);
			tcbcount++;
			tones[i] = tones[i] % 12;
			//if (!toneopt[i]) tonestring += calc_note(tonestr[i]);
			//else tonestring += '('+calc_note(tonestr[i])+')';
			//if (i != tonestr.length-1) tonestring += '-';
		}
	}
	if (chord_name=='')
	{
		chord_name = 'Custom Chord';
	}
	if (document.getElementById('chord_name'))
	{
		document.getElementById('chord_name').firstChild.nodeValue = chord_name;
	}
	document.getElementById('chord_name2').firstChild.nodeValue = 'Current Chord: '+chord_name;
	//document.getElementById('chord_tones').innerHTML = tonestring;
}

function calc_note(note)
{
	var acc = 0;
	var newnote = note.charAt(0);
	for (j = 1; j < note.length; j++)
		if (note.charAt(j) == sharp) acc++;
		else acc--;
				
	switch (acc) {
		case 1:
			newnote += sharp;
			break;
		case 2:
			newnote += '<span style="font-size: smaller;">'+double_sharp+'</span>';
			break;
		case 3:
			newnote += sharp+'<span style="font-size: smaller;">'+double_sharp+'</span>';
			break;
		case 4:
			newnote += '<span style="font-size: smaller;">'+double_sharp+double_sharp+'</span>';
			break;
		case -1:
			newnote += flat;
			break;
		case -2:
			newnote += '<span style="font-size: smaller;">'+flat+flat+'</span>';
			break;
		case -3:
			newnote += '<span style="font-size: smaller;">'+flat+flat+flat+'</span>';
			break;
		default:
			break;
	}
	return newnote;
}

function update_chord_name() {
	// enable/disable parts of form depending on chord type
	var cname = document.forms[0].f_chord_name.selectedIndex;
	if (cname != 4 && cname != 13) {
		enable_element('f_ext9');
		enable_element('f_ext11');
		enable_element('f_ext13');
		enable_element('f_alt_flat9');
		enable_element('f_alt_sharp11');
		enable_element('f_alt_flat13');
		enable_element('f_alt_sharp9');
		enable_element('f_add9');
		enable_element('f_add11');
		enable_element('f_add13');
		enable_element('f_alt_flat5');
		enable_element('f_alt_sharp5');
		enable_element('f_alt_sus2');
		enable_element('f_alt_sus4');
	} else {
		disable_element('f_add9');
		disable_element('f_add11');
		disable_element('f_add13');
		disable_element('f_alt_flat5');
		disable_element('f_alt_sharp5');
	}

	if (cname == 2 || cname == 3 || cname == 10 || cname == 11) {
		disable_element('f_alt_flat5');
		disable_element('f_alt_sharp5');
	}
	
	if (cname <7 || cname >12) {
		disable_element('f_ext9');
		disable_element('f_ext11');
		disable_element('f_ext13');
		disable_element('f_alt_sharp9');
		disable_element('f_alt_flat9');
		disable_element('f_alt_sharp11');
		disable_element('f_alt_flat13');

	} else {
		
		if (cname == 9 || cname == 11 || cname == 12) disable_element('f_alt_sharp9');
		if (cname == 10) disable_element('f_alt_flat13');
		else if (cname == 11) disable_element('f_alt_sharp11');

		
		if (document.getElementById('f_ext9').checked) disable_element('f_add9');
		else if (document.getElementById('f_ext11').checked) {
			disable_element('f_add9');
			disable_element('f_add11');
		}
		else if (document.getElementById('f_ext13').checked) {
			disable_element('f_add9');
			disable_element('f_add11');
			disable_element('f_add13');
		}
	}

	if (cname == 0 || cname == 1) {
		disable_element('f_alt_flat9');
		disable_element('f_alt_sharp9')
		disable_element('f_alt_sharp11');;
		disable_element('f_alt_flat13');
	}
	if (cname == 0 || cname == 2 || cname == 5 || cname == 7 || cname == 8 || cname == 10) {
		if (document.getElementById('f_ext9').checked || document.getElementById('f_add9').checked) disable_element('f_alt_sus2');
		if (document.getElementById('f_ext11').checked || document.getElementById('f_add11').checked) disable_element('f_alt_sus4');		
	} else {
		disable_element('f_alt_sus2');
		disable_element('f_alt_sus4');
	}
	
	

	if (cname == 5 || cname == 6) disable_element('f_add13');

	update_chord();
}

function disable_element(id) {
	var elm = document.getElementById(id);
	elm.disabled = true;
	elm.checked = false;
}
function enable_element(id) {
	document.getElementById(id).disabled = false;
}

function update_root_acc(cb) {
	if (cb == 0) document.getElementById('f_root_acc_sharp').checked = false;
	else document.getElementById('f_root_acc_flat').checked = false;
	update_chord();
}
function update_7_ext(cb) {
	for (i = 9; i <= 13; i += 2)
		if (i != cb) document.getElementById('f_ext'+i).checked = false;
	update_chord_name();
}
function update_alt(cb) {
	if (cb == 0) {
		document.getElementById('f_alt_sharp5').checked = false;
		document.getElementById('f_alt_sharp11').checked = false;		
	}
	else if (cb == 1) document.getElementById('f_alt_flat5').checked = false;

	if (cb == 2) document.getElementById('f_alt_sharp9').checked = false;
	else if (cb == 3) document.getElementById('f_alt_flat9').checked = false;

	if (cb == 4)
	{
		document.getElementById('f_alt_flat5').checked = false;
	}

	update_chord_name();
}

function update_tone(cb) {
	//if (document.forms[0].f_chord_name.selectedIndex == 13)
	//document.getElementById('f_custom'+cb).disabled = !document.getElementById('f_tone'+cb).checked;
}

function update_strings() {
	var numstrings = 4; //document.getElementById('f_num_strings').selectedIndex + 4;
	for (i = numstrings+1; i <= 4; i++)
		document.getElementById('f_string'+i).disabled = true;
	for (i = 1; i<=numstrings; i++)
		document.getElementById('f_string'+i).disabled = false;
}

function update_standard_tuning() {
	//A=0 A#=1 B=2 C=3 C#=4 D=5 D#=6 E=7 F=8 F#=9 G=10 G#=11

	switch(document.getElementById('f_standard_tuning').options[document.getElementById('f_standard_tuning').selectedIndex].value) {

		case 'gdae':
			var tuning = new Array(7, 0, 5, 10);
			break;
		case 'gdad':
			var tuning = new Array(5, 0, 5, 10);
			break;
		case 'gdgd':
			var tuning = new Array(10, 5, 10, 5);
			break;
		case 'fcgd':
			var tuning = new Array(5,10,3,8);
			break;
		case 'daeb':
			var tuning = new Array(2,7,0,5);
			break;
		case 'cgda':
			var tuning = new Array(0,5,10,3);
			break;
		case 'dgcf':
			var tuning = new Array(8,3,10,5);
			break;
		case 'aeae':
			var tuning = new Array(7,0,7,0);
			break;
		case 'gcgc':
			var tuning = new Array(3,10,3,10);
			break;	
		case 'adad':
			var tuning = new Array(5,0,5,0);
			break;
		case 'gceg':
			var tuning = new Array(10,7,3,10);
			break;				
		case 'adf#d':
			var tuning = new Array(5,9,5, 0);
			break;
		case 'g#ebe':
			var tuning = new Array(7,2,7,11);
			break;				
		case 'gdbd':
			var tuning = new Array(5,2,5,10);
			break;
			//A=0 A#=1 B=2 C=3 C#=4 D=5 D#=6 E=7 F=8 F#=9 G=10 G#=11
		case 'ac#ae':
			var tuning = new Array(7,0,5,0);
			break;				
		case 'dgbe':
			var tuning = new Array(7,2,10,5);
			break;
		case 'cgda':
			var tuning = new Array(0,5,10,3);
			break;				
		case 'adgd':
			var tuning = new Array(5,10,5,0);
			break;
		case 'eadg':
			var tuning = new Array(10,5,0,7);
			break;			
		
		default:
			break;
	}
	//document.getElementById('f_num_strings').selectedIndex = tuning.length-4;
	for (i = 1; i <= tuning.length; i++)
		document.getElementById('f_string'+i).selectedIndex = tuning[i-1];
	for (i = tuning.length+1; i <= 4; i++)
		document.getElementById('f_string'+i).selectedIndex = 0;
	update_strings();
}

function check_submit()
{
	finalnotes = 0;
	for (i = 1; i <= 9; i++) {
		if (document.getElementById('f_tone'+i).disabled == false && document.getElementById('f_tone'+i).checked == true)
			finalnotes++;
	}
	if (finalnotes>4)
	{
		alert('The number of notes in this chord is more than the number of strings! The computer has already disabled what it feels are optional notes, but there are still too many! Try unchecking some of the notes in the chord. Removing the bass (root) note is usually acceptable, especially if playing with other musicians.');
		return false;
	}
	return true;
}
