// Aikido Grading Syllabus
var Aikido = Class.create({
	initialize: function () {
		this.form = [
			/* 0 */'Tachi waza',
			/* 1 */'Suwari waza',
			/* 2 */'Hanmi Handachi waza',
			/* 3 */'Dan grade'
		];
		this.attacks = [
			/* 0 */'Ai Hanmi katate dori',
			/* 1 */'Katate dori',
			/* 2 */'Shomen uchi',
			/* 3 */'Katate Ryote dori',
			/* 4 */'Ryote dori',
			/* 5 */'Kata dori',
			/* 6 */'Yokomen uchi',
			/* 7 */'Ushiro Ryote dori',
			/* 8 */'Various forms of attack',
			/* 9 */'(Knee walking)',
			/* 10 */'Kata dori men uchi',
			/* 11 */'Ushiro Ryo Kata dori',
			/* 12 */'Chudan tsuki',
			/* 13 */'Jodan tsuki',
			/* 14 */'Ushiro Ryo hiji dori',
			/* 15 */'Mae Ryo kata dori',
			/* 16 */'Ryo Kata dori',
			/* 17 */'Ushiro eri dori',
			/* 18 */'Muna dori',
			/* 19 */'Ushiro Katate dori kubi shime',
			/* 20 */'Various situations',
			/* 21 */'Various strikes and grips',
			/* 22 */'All applications'
		];
		this.finishers = [
			/* 0 */'Ikkyo',
			/* 1 */'Shiho nage',
			/* 2 */'Irimi nage',
			/* 3 */'Tenchi nage',
			/* 4 */'Shikko',
			/* 5 */'Kokyu ho',
			/* 6 */'Nikyo',
			/* 7 */'Kote gaeshi',
			/* 8 */'Uchi kaiten nage',
			/* 9 */'Kokyu nage',
			/* 10 */'Ude kime nage',
			/* 11 */'Sokumen Irimi nage',
			/* 12 */'Sankyo',
			/* 13 */'Yonkyo',
			/* 14 */'Sumi otoshi',
			/* 15 */'Aiki otoshi',
			/* 16 */'Koshi nage',
			/* 17 */'Soto kaiten nage',
			/* 18 */'Uchi kaiten nage',
			/* 19 */'Gokyo',
			/* 20 */'Juji garami',
			/* 21 */'Hiji kime osae',
			/* 22 */'Ude kime nage from the possibility of Shiho nage',
			/* 23 */'Kaiten nage',
			/* 24 */'Hiji kime osae from the possibility of Ikkyo and Nikyo ura',
			/* Specials */
			/* 25 */'Jiyuwaza (one attacker) against all forms of attack',
			/* 26 */'Randori with two attackers plus Jo & Tanto dori',
			/* 27 */'Randori with 3 attackers',
			/* 28 */'Aikiken & Aikijo'
		];
		this.grades = [
			{index: -5, name: 'Gokyu', description: '5th Kyu', syllabus: [
				{form: 0, attack: 0, finish: [0,1,2]},				// Tachi waza, Ai Hanmi katate dori, Ikkyo - Shiho nage - Irimi nage
				{form: 0, attack: 1, finish: [1,3]},				// Tachi waza, Katate dori, Shiho nage - Tenchi nage
				{form: 0, attack: 2, finish: [0,2]},				// Tachi waza, Shomen uchi, Ikkyo - Irimi nage
				{form: 1, attack: 4, finish: [5]},					// Suwari waza, Ryote dori, Kokyu ho
				{form: 1, attack: 9, finish: [4]}					// Suwari waza, Knee walking, Shikko (sitting)
			]},
			{index: -4, name: 'Yonkyu', description: '4th Kyu', syllabus: [
				{form: 0, attack: 1, finish: [0,6,7,2,8,9,10,11]},	// Tachi waza, Katate dori, Ikkyo - Nikyo - Kote gaeshi - Irimi nage - Uchi kaiten nage - Kokyu nage - Ude kime nage - Sokumen Irimi nage
				{form: 0, attack: 5, finish: [0,6]},				// Tachi waza, Kata dori, Ikkyo - Nikyo
				{form: 0, attack: 0, finish: [6,12,7,10]},			// Tachi waza, Ai Hanmi katate dori, Nikyo - Sankyo - Kote gaeshi - Ude kime nage
				{form: 0, attack: 2, finish: [7]},					// Tachi waza, Shomen uchi, Kote gaeshi
				{form: 0, attack: 6, finish: [1,10]},				// Tachi waza, Yokomen uchi, Shiho nage - Ude kime nage
				{form: 0, attack: 4, finish: [3]},					// Tachi waza, Ryote dori, Tenchi nage
				{form: 0, attack: 7, finish: [12]},					// Tachi waza, Ushiro Ryote dori, Sankyo
				{form: 1, attack: 0, finish: [0,2]},				// Suwari waza, Ai Hanmi katate dori, Ikkyo - Irimi nage
				{form: 1, attack: 2, finish: [0,2]}					// Suwari waza, Shomen uchi, Ikkyo - Irimi nage
			]},
			{index: -3, name: 'Sankyu', description: '3rd Kyu', syllabus: [
				{form: 0, attack: 3, finish: [0,6,7,10,5]},			// Tachi waza, Katate Ryote dori, Ikkyo - Nikyo - Kote gaeshi - Ude kime nage - Kokyu ho
				{form: 0, attack: 4, finish: [0,1]},				// Tachi waza, Ryote dori, Ikkyo - Shiho nage
				{form: 0, attack: 7, finish: [0,6,7,1,2,10]},		// Tachi waza, Ushiro Ryote dori, Ikkyo - Nikyo - Kote gaeshi - Shiho nage - Irimi nage- Ude kime nage
				{form: 0, attack: 6, finish: [0,6,12,13,7,2]},		// Tachi waza, Yokomen uchi, Ikkyo - Nikyo - Sankyo - Yonkyo - Kote gaeshi - Irimi nage
				{form: 0, attack: 2, finish: [6,12,13]},			// Tachi waza, Shomen uchi, Nikyo - Sankyo - Yonkyo
				{form: 0, attack: 8, finish: [9]},					// Tachi waza, Various forms of attack, Kokyu nage
				{form: 1, attack: 1, finish: [0,6]},				// Suwari waza, Katate dori, Ikkyo - Nikyo
				{form: 1, attack: 5, finish: [0,6]},				// Suwari waza, Kata dori, Ikkyo - Nikyo
				{form: 1, attack: 2, finish: [0,12,13,7]},			// Suwari waza, Shomen uchi, Ikkyo - Sankyo - Yonkyo - Kote gaeshi
				{form: 2, attack: 1, finish: [1,8]},				// Hanmi Handachi waza, Katate dori, Shiho nage - Uchi kaiten nage
				{form: 2, attack: 2, finish: [2]}					// Hanmi Handachi waza, Shomen uchi, Irimi nage
			]},
			{index: -2, name: 'Nikyu', description: '2nd Kyu', syllabus: [
				{form: 0, attack: 10, finish: [0,6,12,7,1,2]},		// Tachi waza, Kata dori men uchi, Ikkyo - Nikyo - Sankyo - Kote gaeshi - Shiho nage - Irimi nage
				{form: 0, attack: 11, finish: [0,6,12,11]},			// Tachi waza, Ushiro Ryo Kata dori, Ikkyo - Nikyo - Sankyo - Sokumen Irimi nage
				{form: 0, attack: 5, finish: [12,13]},				// Tachi waza, Kata dori, Sankyo - Yonkyo
				{form: 0, attack: 1, finish: [12,13,14,15,16]},		// Tachi waza, Katate dori, Sankyo - Yonkyo - Sumi otoshi - Aiki otoshi - Koshi nage
				{form: 0, attack: 2, finish: [1,17,18]},			// Tachi waza, Shomen uchi, Shiho nage - Soto kaiten nage - Uchi kaiten nage
				{form: 0, attack: 6, finish: [19]},					// Tachi waza, Yokomen uchi, Gokyo
				{form: 0, attack: 4, finish: [7,2]},				// Tachi waza, Ryote dori, Kote gaeshi - Irimi nage
				{form: 0, attack: 0, finish: [16]},					// Tachi waza, Ai Hanmi katate dori, Koshi nage
				{form: 0, attack: 3, finish: [2]},					// Tachi waza, Katate Ryote dori, Irimi nage
				{form: 0, attack: 7, finish: [20,11]},				// Tachi waza, Ushiro Ryote dori, Juji garami - Sokumen Irimi nage
				{form: 0, attack: 12, finish: [0,2]},				// Tachi waza, Chudan tsuki, Ikkyo - Irimi nage
				{form: 0, attack: 13, finish: [21]},				// Tachi waza, Jodan tsuki, Hiji kime osae
				{form: 0, attack: 14, finish: [0]},					// Tachi waza, Ushiro Ryo hiji dori, Ikkyo
				{form: 0, attack: 15, finish: [11]},				// Tachi waza, Mae Ryo kata dori, Sokumen Irimi nage
				{form: 0, attack: 8, finish: [9]},					// Tachi waza, Various forms of attack, Kokyu nage
				{form: 1, attack: 16, finish: [0,6]},				// Suwari waza, Ryo Kata dori, Ikkyo - Nikyo
				{form: 1, attack: 6, finish: [0,6,12,13,19,2]},		// Suwari waza, Yokomen uchi, Ikkyo - Nikyo - Sankyo - Yonkyo - Gokyo - Irimi nage
				{form: 1, attack: 5, finish: [12]},					// Suwari waza, Kata dori, Sankyo
				{form: 1, attack: 1, finish: [7,2]},				// Suwari waza, Katate dori, Kote gaeshi - Irimi nage
				{form: 2, attack: 2, finish: [7]},					// Hanmi Handachi waza, Shomen uchi, Kote gaeshi
				{form: 2, attack: 4, finish: [1]},					// Hanmi Handachi waza, Ryote dori, Shiho nage
				{form: 2, attack: 5, finish: [17]}					// Hanmi Handachi waza, Kata dori, Soto kaiten nage
			]},
			{index: -1, name: 'Ikkyu', description: '1st Kyu', syllabus: [
				{form: 0, attack: 17, finish: [7,1]},				// Tachi waza, Ushiro eri dori, Kote gaeshi - Shiho nage
				{form: 0, attack: 13, finish: [0,6,12,1,2,23]},		// Tachi waza, Jodan tsuki, Ikkyo - Nikyo - Sankyo - Shiho nage - Irimi nage - Kaiten nage
				{form: 0, attack: 12, finish: [6,12,7,23]},			// Tachi waza, Chudan tsuki, Nikyo - Sankyo - Kote gaeshi - Kaiten nage
				{form: 0, attack: 2, finish: [19]},					// Tachi waza, Shomen uchi, Gokyo
				{form: 0, attack: 18, finish: [1]},					// Tachi waza, Muna dori, Shiho nage
				{form: 0, attack: 19, finish: [5,1]},				// Tachi waza, Ushiro Katate dori kubi shime, Kote gaeshi - Shiho nage
				{form: 0, attack: 3, finish: [20]},					// Tachi waza, Katate Ryote dori, Juji Garami
				{form: 0, attack: 20, finish: [0,6,12,13,23,14]},	// Tachi waza, Various situations:, Ikkyo - Nikyo - Sankyo - Yonkyo - Kaiten nage - Sumi otoshi
				{form: 0, attack: 21, finish: [16,11]},				// Tachi waza, Various strikes and grips:, Koshi nage - Sokumen Irimi nage
				{form: 0, attack: 22, finish: [22]},				// Tachi waza, All applications of:, Ude kime nage from the possibility of Shiho nage
				{form: 0, attack: 20, finish: [24]},				// Tachi waza, Hiji kime osae from the possibility of Ikkyo and Nikyo ura
				{form: 1, attack: 6, finish: [7]},					// Suwari waza, Yokomen uchi, Kote gaeshi
				{form: 1, attack: 2, finish: [19]},					// Suwari waza, Shomen uchi, Gokyo
				{form: 2, attack: 2, finish: [0,6,19]},				// Hanmi Handachi waza, Shomen uchi, Ikkyo - Nikyo - Gokyo
				{form: 2, attack: 1, finish: [6]}					// Hanmi Handachi waza, Katate dori, Nikyo
			]},
			{index: 0, name: 'Shodan', description: '1st Dan', syllabus: [
				{form: 3, attack: 20, finish: [25]}					// ...
			]},
			{index: 1, name: 'Nidan', description: '2nd Dan', syllabus: [
				{form: 3, attack: 20, finish: [26]}					// ...
			]},
			{index: 2, name: 'Sandan', description: '3rd Dan', syllabus: [
				{form: 3, attack: 20, finish: [27]}					// ...
			]},
			{index: 3, name: 'Yondan', description: '4th Dan', syllabus: [
				{form: 3, attack: 20, finish: [28]}					// ...
			]}
		];
	}
});

var aikido = new Aikido();

var gradeTemplate = new Template('<label for="lab_#{name}"><input id="lab_#{name}" type="radio" name="syllabus" value="#{index}" onclick="showSyllabus(#{index});" /> #{name} (#{description})</label> ');

var fromAttacks = true;
var allGrades = true;

function getSyllabus(index) {
	fromAttacks = $('attacks').checked;
	allGrades = $('allgrades').checked;
	var grades = $R(allGrades?-5:index,index);
	// Forms
	var syllabus = [];

	// Get syllabus from attacks
	if (fromAttacks) {
		aikido.grades.each (function(grade) {
			// Select a grade to deal with
			if (grades.include(grade.index)) {
				// If this grade is not the selected grade, use a different colour-shade
				var colour = (grade.index!=index)?'#bbb':'#000';
				// Loop through the syllabus for this grade, adding techniques to the attacks array
				grade.syllabus.each (function(technique) {
					var finishers = [];
					technique.finish.each (function(finisher) {
						finishers.push(aikido.finishers[finisher]);
					});
					finishers.sort();
					var existingTechnique = syllabus.find(function (one) {
						return (one.header==aikido.form[technique.form])&&(one.col1==aikido.attacks[technique.attack]);
					});
					if (existingTechnique!=undefined) {
						existingTechnique.col2 = existingTechnique.col2.concat(finishers.map (function(it) {
							if (grade.index!=index) it += '<sup>'+grade.description+'</sup>';
							return '<span style="color: '+colour+'">'+it+'</span>';
						}));
					}
					else
						syllabus.push({
							header: aikido.form[technique.form],
							col1: aikido.attacks[technique.attack],
							col2: finishers.map (function(it) {
								if (grade.index!=index) it += '<sup>'+grade.description+'</sup>';
								return '<span style="color: '+colour+'">'+it+'</span>';
							})
						});
				});
			}
		});
	}
	// Get syllabus from techniques
	else {
		aikido.grades.each (function(grade) {
			// Select a grade to deal with
			if (grades.include(grade.index)) {
				// If this grade is not the selected grade, use a different colour-shade
				var colour = (grade.index!=index)?'#bbb':'#000';
				// Collect all forms for this grade
				for (var form=0; form<aikido.form.length; form++) {

					// Collect all finishers for this grade
					var finishers = [];
					grade.syllabus.each (function(technique) {
						if (technique.form!=form) return;
						finishers = finishers.concat(technique.finish);
					});
					// Loop through finishers
					finishers.uniq().each (function(one) {
						var attacks = [];
						grade.syllabus.each (function(technique) {
							if (technique.finish.include(one) && technique.form==form) {
								attacks.push(aikido.attacks[technique.attack]);
							}
						});

						if (0<attacks.length) {
							attacks.sort();

							var existingTechnique = syllabus.find(function (syl) {
								return (syl.header==aikido.form[form])&&(syl.col1==aikido.finishers[one]);
							});
							if (existingTechnique!=undefined){
								existingTechnique.col2 = existingTechnique.col2.concat(attacks.map (function(it) {
									if (grade.index!=index) it += '<sup>'+grade.description+'</sup>';
									return '<span style="color: '+colour+'">'+it+'</span>';
								}));
							}
							else
								syllabus.push({
									header: aikido.form[form],
									col1: aikido.finishers[one],
									col2: attacks.map (function(it) {
										if (grade.index!=index) it += '<sup>'+grade.description+'</sup>';
										return '<span style="color: '+colour+'">'+it+'</span>';
									})
								});
						}
					});

				}
			}
		});
	}

	return syllabus;
}

var lastSyllabus = -5;
function showSyllabus(index) {
	lastSyllabus = index;
	var syllabus = getSyllabus(index);
	var output = '';
	var lastHeader = '';
	syllabus.sort(function(a,b){
		return ((a.col1 < b.col1) ? -1 : ((a.col1 > b.col1) ? 1 : 0));
	});
	var form = [];
	/*syllabus.sort(function(a,b){
		return ((a.header < b.header) ? -1 : ((a.header > b.header) ? 1 : 0));
	});*/
	syllabus.each (function(one) {
		var formIndex = aikido.form.indexOf(one.header);
		if (form[formIndex]==undefined)
			form[formIndex] = '';

		/*if (one.header!=lastHeader)
		lastHeader = one.header;*/

		form[formIndex]+=
			'<tr>'+
				'<th>'+one.col1+'</th>'+
				'<td>'+one.col2.sort().join(', ')+'</td>'+
			'</tr>';
	});

	for (var i=0; i<form.length; i++) 
	if (form[i]!=undefined) {
		output+=
			'<h3>'+aikido.form[i]+'</h3>'+
			'<table cellspacing="2" cellpadding="4" border="0"><tbody>'+
				form[i]+
			'</tbody></table>';
	}


	$('syllabus').update(output);
}

function initialise() {
	showSyllabus(lastSyllabus);
}

document.observe('dom:loaded', function () {
	if (!/syllabus/i.test(document.title)) return;
	$('lab_Gokyu').checked = true;
	initialise.defer();
});

/*
var oldOnload = null;
if (typeof window.onload == 'function') oldOnload = window.onload;
window.onload = function () {
	if (oldOnload!=null) oldOnload();
	var oSensei = $('osensei');
	oSensei.onclick = function() {
		window.location.href = oSensei.down().href;
	}
}
*/
