var Concertina = {
	init: function() {
		var concertinas, noOfConcertinas, folds, noOfFolds, foldLinks, noOfFoldLinks, foldTitleLink, activeFold, i, j, k;
		concertinas = Base.getElementsByClass('concertina');
		noOfConcertinas = concertinas.length;
		for (i = 0; i < noOfConcertinas; i++) {
			folds = concertinas[i].childNodes;
			noOfFolds = folds.length;
			for (j = 0; j < noOfFolds; j++) {
				if (folds[j].nodeType == 1) {
					Concertina.collapse(folds[j]);
					foldLinks = folds[j].getElementsByTagName('a');
					noOfFoldLinks = foldLinks.length;
					foldTitleLink = foldLinks[0];
					Base.addEventListener(foldTitleLink, 'click', Concertina.clickListener);
					for (k = 1; k < noOfFoldLinks; k++) {
						Base.addEventListener(foldLinks[k], 'focus', Concertina.focusListener);
					}
				}
			}
			if (location.hash.length > 1) {
				activeFold = document.getElementById(location.hash.substring(1));
				if (activeFold && activeFold.parentNode == concertinas[i]) {
					Concertina.expand(activeFold);
				}
			}
		}
	},
	collapse: function(fold) {
		Base.removeClass(fold, 'expanded');
		Base.addClass(fold, 'collapsed');
	},
	collapseAll: function(concertina) {
		var folds, i;
		folds = concertina.childNodes;
		for (i = 0; i < folds.length; i++) {
			if (folds[i].nodeType == 1) {
				Concertina.collapse(folds[i]);
			}
		}
	},
	expand: function(fold) {
		Concertina.collapseAll(fold.parentNode);
		Base.removeClass(fold, 'collapsed');
		Base.addClass(fold, 'expanded');
	},
	clickListener: function(event) {
		var fold = this.parentNode.parentNode;
		if (Base.hasClass(fold, 'collapsed')) {
			Concertina.expand(fold);
		} else {
			Concertina.collapse(fold);
		}
		Base.preventDefault(event);
	},
	focusListener: function(event) {
		var element = this;
		while (element.parentNode) {
			if (Base.hasClass(element.parentNode, 'concertina')) {
				Concertina.expand(element);
				return;
			}
			element = element.parentNode;
		}
	}
};
Base.start(Concertina);
