/* --------------- Constructor : refinementList --------------- */
function refinementList(keys, targets) {
	this.keys       = keys || {};
	this.key        = "";
	this.words      = {};
	this.keyNodes   = {};
	this.targets    = targets || [];
	this.page       = 0;
	this.entries    = 10;
	this.navigation = [];
}
refinementList.prototype = {
	make : function() {

		var container = document.createElementBA("div");

		var arr   = [];
		var keys  = this.keys;

		function _create(group, key) {
			var li = document.createElementBA("li");
			li.appendClassNameBA(group);
			var link = this.keyNodes[key] = document.createElementBA("a");
			link.setAttributeBA("href", "#" + encodeURI(key));
			link._refineKey = key;
			link.addEventListenerBA("click", function(e){
				e.preventDefault();
				this.select(e.currentTarget._refineKey || "", 0);
			}, this);
			link.appendChildBA((this.keys[group] && this.keys[group].items[key]) ? this.keys[group].items[key] : "すべて表示");
			li.appendChildBA(link);
			return li;
		}

		for (var group in keys) {
			var groupContainer = document.createElementBA("dl");
			groupContainer.appendClassNameBA(group);
			container.appendChildBA(groupContainer);

			var label = document.createElementBA("dt");
			label.appendChildBA(keys[group].label);
			groupContainer.appendChildBA(label);

			var itemListContainer = document.createElementBA("dd");
			groupContainer.appendChildBA(itemListContainer);

			var itemList = document.createElementBA("ul");
			itemListContainer.appendChildBA(itemList);

			for (var key in keys[group].items) {
				this.words[key] = keys[group].items[key];
				itemList.appendChildBA(_create.apply(this, [group, key]));
			}
		}

		var showAll = document.createElementBA("ul");
		showAll.appendChildBA(_create.apply(this, ["show-all", "show-all"]));
		showAll.appendClassNameBA("reset");
		container.appendChildBA(showAll);

		container.appendClassNameBA("refine-list");

/*		for (var i = 0, n = 2; i < n; i++) {
			var navigation = document.createElementBA("ul");
			navigation.appendClassNameBA("sequential-link");

			var prev = navigation.prev = document.createElementBA("li");
			prev.appendClassNameBA("sequential-previous");
			var link = document.createElementBA("a");
			link.setAttributeBA("href", "#prev");
			link.appendChildBA("前の" + this.entries + "件");
			link.addEventListenerBA("click", function(e){
				e.preventDefault();
				this.prev();
			}, this);
			prev.appendChildBA(link);

			var next = navigation.next = document.createElementBA("li");
			next.appendClassNameBA("sequential-forward");
			var link = document.createElementBA("a");
			link.setAttributeBA("href", "#next");
			link.appendChildBA("次の" + Math.min(this.targets.length - this.entries, this.entries) + "件");
			link.addEventListenerBA("click", function(e){
				e.preventDefault();
				this.next();
			}, this);
			next.appendChildBA(link);
			this.navigation.push(navigation);
		}
*/
		return container;
	},
	select : function(key, page) {
		key        = key  || "show-all";
		page       = page || 0;

		var newKey = (this.key != key);
		this.key   = key;

		var targets = this.targets.filter(function(node){
			node.appendClassNameBA("pseudo-disable");
			return (key == "show-all" || node.hasClassNameBA(key));
		});

		var pages  = parseInt((targets.length - 1) / this.entries);
		this.page  = page = (page < 0) ? 0 : (page > pages) ? pages : page;

		var count  = 0;
		var start  = this.entries * this.page;
		var end    = this.entries * (this.page + 1);

		for (var i = 0, n = targets.length; i < n && targets[i]; i++) {
			targets[i].removeClassNameBA("pseudo-disable");
		}

/*		this.navigation.forEach(function(navigation) {
			navigation.removeAllChildrenBA();

			if (this.page != 0) navigation.appendChildBA(navigation.prev);

			for (var i = 0, n = pages; i <= n; i++) {
				var li = document.createElementBA("li");
				li.appendClassNameBA("pagenate");
				var node = null;
				if (i != this.page) {
					node = document.createElementBA("a");
					node.setAttributeBA("href", "#" + i);
					node.addEventListenerBA("click", function(e){
						e.preventDefault();
						var node = e.target;
						this.select(this.key, parseInt(node.getAttributeBA("href").split("#")[1]));
					}, this);
				} else {
					node = document.createElementBA("span");
				}
				node.appendChildBA(i + 1);
				li.appendChildBA(node);
				navigation.appendChildBA(li);
			}

			if (this.page < pages) {
				navigation.appendChildBA(navigation.next);
				navigation.next.getElementsByTagNameBA("a")[0].innerHTML = "次の" + Math.min(targets.length - (this.page + 1) * this.entries, this.entries) + "件";
			}
		}, this);*/
		for (var i in this.keyNodes) {
			this.keyNodes[i].removeClassNameBA("pseudo-selected");
		}
		if (this.keyNodes[key]) {
			this.keyNodes[key].appendClassNameBA("pseudo-selected");
		}

		location.hash = key/* + "_page=" + (page + 1)*/;

/*		var field = document.getElementByIdBA("keyword");
		if (field) {
			field.innerHTML = (this.words[key]) ? "「" + this.words[key] + "」の" : "";
		}*/
	},
	next : function() {
		this.select(this.key, this.page + 1);
	},
	prev : function() {
		this.select(this.key, this.page - 1);
	}
}

/* --------------- Constructor : keywordList --------------- */
function keywordList() {
}
keywordList.prototype = {
	make : function(keys, baseHref, pageKeys) {

		if (!keys || !pageKeys) return null;
		if (!baseHref) baseHref = "";

		var ul = document.createElementBA("ul");

		for (var group in keys) {
			for (var key in keys[group].items) {
				if (pageKeys.indexOf(key) != -1) {
					var li = document.createElementBA("li");
					var link = document.createElementBA("a");
					link.setAttributeBA("href", baseHref + "#" + key);
					link.appendChildBA(keys[group].items[key]);
					li.appendClassNameBA(group);
					li.appendChildBA(link);
					ul.appendChildBA(li);
				}
			}
		}
		return ul;
	}
}

/* --------------- Main --------------- */
BAAddOnload(function(){
	var list = document.getElementByIdBA("content-list");
	if (list) {
		var refiner = new refinementList(__LN_REFINEMENT_KEYWORD_LIST__, list.getElementsByClassNameBA("content"));
		var keywordBlock = document.getElementByIdBA("case-keyword-block");
		if (keywordBlock) {
			keywordBlock.appendChildBA(refiner.make());
/*			list.insertBefore(refiner.navigation[0], list.getElementsByClassNameBA("link-list")[0]);
			list.appendChildBA(refiner.navigation[1]);*/
		}

		if(navigator.platform.indexOf("Win") != -1) {
			var plt = "os-windows";
		} else if (navigator.platform.indexOf("Mac") != -1) {
			var plt = "os-macintosh";
		} else {
			var plt = "show-all";
		}
		var hash = location.href.split("#")[1] || plt;
		var page = 0;
		if (hash.indexOf("_page=") != -1) {
			page = parseInt(hash.split("_page=")[1]) - 1;
			hash = hash.split("_page=")[0];
		}
		refiner.select(hash, page);
	}
	var __LN_PAGE_KEYWORDS__ = document.getElementsByTagNameBA("body")[0].getAttributeBA("class").split(/ +/);
	if (typeof(__LN_PAGE_KEYWORDS__) == "object" && __LN_PAGE_KEYWORDS__) {
		var pageKeys = document.getElementByIdBA("case-keyword-index");
		if (pageKeys) {
			var keywords = new keywordList;
			pageKeys.appendChildBA(keywords.make(__LN_REFINEMENT_KEYWORD_LIST__, __LN_BASE_URI__, __LN_PAGE_KEYWORDS__));
		}
	}
});
