
var EOLData = (function ($) {

	var EOLData = {

		tag_pair: {
			'table' : 'tr',
			'ul'    : 'li',
			'div'   : 'div'
		},

		getInnerTag: function (parent) {
			var pieces = parent.split(/\W/);
			if (pieces[0] in this.tag_pair) {
				return this.tag_pair[pieces[0]];
			}
			return this.tag_pair.div;
		},

		EmptyHeaderRenderer: function (group, wrapper, base) {
		},

		GroupHeaderRenderer: function (group, wrapper, base) {
			if (group.group_name.length) {
				$('<h3 class="subtitle03">' + group.group_name + '</h3>').appendTo(base);
				return true;
			}
			return false;
		},

		YuhoYearHeaderRenderer: function (group, wrapper, base) {
			if (group.year) {
				var year = group.year.toString().substr(0, 4);
				var month = group.year.toString().substr(4, 2);
				$('<h3 class="subtitle03">' + year + '年' + month + '月期</h3>').appendTo(base);
				return true;
			}
			return false;
		},

		TanshinYearHeaderRenderer: function (group, wrapper, base) {
			if (group.header) {
				var year = group.header.toString().substr(0, 4);
				var month = group.header.toString().substr(4, 2);
				$('<h3 class="subtitle03">' + year + '年' + month + '月期</h3>').appendTo(base);
				return true;
			}
			return false;
		},

		TableItemRenderer: function (item, wrapper, inner, base) {
			var inner = $('<' + inner + ' />')

			inner.html([
				'<td class="title"><a href="' + item.link + '" target="_blank">' + item.title + '</a></td>',
				'<td class="pdf"><img src="/ir/img/filetype_icon/' + (item.type ? item.type : 'pdf') + '.gif" /> (' + item.file_size + 'KB)</td>'
			].join("\n"));

			wrapper.append(inner);
		},

		YuhoTableItemRenderer: function (item, wrapper, inner, base, group) {
			var inner = $('<' + inner + ' />')

			var doc = null;
			if (item.title_type.length > 0) {
				switch (item.title_type) {
					// 有価証券報告書Htmlリンクの表示
					case "50":
					case "450":
						if ((group.html_url || '').length > 0) {
							doc = '<td class="document"><a href="' + group.html_url + '" target="_blank">HTML形式</a><img src="/ir/img/filetype_icon/url.gif" /></td>';
						}
						break;
					// 半期報告書Htmlリンクの表示
					case "60":
						if ((group.hanpo_html_url || '').length > 0) {
							doc = '<td class="document"><a href="' + group.hanpo_html_url + '" target="_blank">HTML形式</a><img src="/ir/img/filetype_icon/url.gif" /></td>';
						}
						break;
					// 第1四半期報告書Htmlリンクの表示
					case "150":
						if ((group.shihanki_1q_html_url || '').length > 0) {
							doc = '<td class="document"><a href="' + group.shihanki_1q_html_url + '" target="_blank">HTML形式</a><img src="/ir/img/filetype_icon/url.gif" /></td>';
						}
						break;
					// 第2四半期報告書Htmlリンクの表示
					case "250":
						if ((group.shihanki_2q_html_url || '').length > 0) {
							doc = '<td class="document"><a href="' + group.shihanki_2q_html_url + '" target="_blank">HTML形式</a><img src="/ir/img/filetype_icon/url.gif" /></td>';
						}
						break;
					// 第3四半期報告書Htmlリンクの表示
					case "350":
						if ((group.shihanki_3q_html_url || '').length > 0) {
							doc = '<td class="document"><a href="' + group.shihanki_3q_html_url + '" target="_blank">HTML形式</a><img src="/ir/img/filetype_icon/url.gif" /></td>';
						}
						break;	
					default:
						doc = '<td class="document">&nbsp;</td>';
						break;
					}
			}

			if (!doc) {
				doc = '<td class="document">&nbsp;</td>';
			}

			inner.html([
				'<td class="title"><a href="' + item.link_yuho_pdf + '" target="_blank">' + item.title_yuho_pdf + '</a></td>',
				'<td class="pdf"><img src="/ir/img/filetype_icon/pdf.gif" /> (' + item.file_size + 'KB)</td>',
				doc
			].join("\n"));

			wrapper.append(inner);
		},

		TanshinTableItemRenderer: function (item, wrapper, inner, base) {
			var inner = $('<' + inner + ' />')

			inner.html([
				'<td class="date">' + item.format_date + '</td>',
				'<td class="title"><a href="' + item.link_tanshin + '" target="' + item.new_target + '">' + item.tanshin_type + '</a></td>',
				'<td class="pdf"><img src="/ir/img/filetype_icon/pdf.gif" /> (' + item.tanshin_size + 'KB)</td>'
			].join("\n"));

			wrapper.append(inner);
		},

		AnnoucementTableItemRenderer: function (item, wrapper, inner, base) {
			var inner = $('<' + inner + ' />');

			inner.html([
				'<td class="date">' + item.format_date + '</td>',
				'<td class="icon"><img src="/ir/img/category_icon/' + item.news_type + '.gif" /></td>',
				'<td class="title"><a href="' + item.link + '" target="' + item.new_target + '">' + item.title + '</a></td>',
				'<td class="pdf"><img src="/ir/img/filetype_icon/pdf.gif" /> (' + item.file_size + 'KB)</td>'
			].join("\n"));

			wrapper.append(inner);
		}

	};

	EOLData.ItemDataHandler = function (data, options) {
		this.data = data;
		this.original = data;
		this.options = options;

		this.years = [];
		this.year_data = {};
	};

	EOLData.ItemDataHandler.prototype = {

		itemHeader     : 'item',
		itemCountHeader: 'item_count',
		itemDateHeader : 'date',

		messageOnError      : '現在掲載されている情報はございません。',
		messageOnNoDataFound: '現在掲載されている情報はございません。',

		handle: function () {
			// error if the number of records is less than 0.
			if (this.data[this.itemCountHeader] < 0) {
				if (typeof this.options.onError == 'function') {
					this.options.onError.apply(this);
				} else {
					this.error(this.options.messageOnError || this.messageOnError);
				}
			}
			// no data was found.
			else if (this.data[this.itemCountHeader] == 0) {
				if (typeof this.options.onNoRecordFound == 'function') {
					this.options.onNoDataFound.apply(this);
				} else {
					this.error(this.options.messageOnNoDataFound || this.messageOnNoDataFound);
				}
			} else {
				if (this.options.yearSeparate) {
					this.allocateByYear();
					this.show(this.years[0]);
					if (this.options.selectWith) {
						this.select();
					}
				} else {
					this.show(null);
				}
			}
		},

		error: function (message) {
			var base = $(this.options.listBase);
			$('<p class="notice">' + message + '</p>').appendTo(base);
		},

		select: function () {
			var self = this;
			var base = $(this.options.selectWith);
			var select = $('<select />');
			for (var i = 0, l = this.years.length; i < l; i++) {
				var year = this.years[i];
				var option = $('<option value=' + year + '>' + year + '年</option>');
				option.appendTo(select);
			}

			select.bind('change', function () {
				var select = this;
				self.show(select.options[select.selectedIndex].value);
			});

			base.append(select);			
		},

		show: function (year) {
			var base = $(this.options.listBase);
			base.children().remove(); // clean up

			var data = year ? this.year_data[year] : this.data[this.itemHeader];
			var tag = this.options.wrapWith || 'div';
			var inner = EOLData.getInnerTag(tag);

			var wrapper = $('<' + tag + ' />');

			if (this.options.wrapperClass) {
				wrapper.addClass(this.options.wrapperClass);
			}

			for (var i = 0, l = this.options.limitCount ? this.options.limitCount : data.length; i < l; i++) {
				if (!(i in data)) {
					continue;
				}

				if (typeof this.options.onItemRendered == 'function') {
					this.options.onItemRendered.apply(this, [data[i], wrapper, inner, base]);
				} else {
					this.item(data[i], wrapper, inner, base);
				}
			}

			base.append(wrapper);

			if (typeof this.options.onAfterRendered == 'function') {
				this.options.onAfterRendered.apply(this, [wrapper, base]);
			}
		},

		item: function (item, wrapper, inner, base) {
			EOLData.TableItemRenderer(item, wrapper, inner, base);
		},

		allocateByYear: function () {
			var temp = {};
			for (var i = 0, l = this.data[this.itemCountHeader]; i < l; i++) {
				var item = this.data[this.itemHeader][i];
				var year = item[this.itemDateHeader].substr(0, 4);
				if (!(year in temp)) {
					this.years.push(year);
					temp[year] = [];
				}
				temp[year].push(item);
			}
			this.year_data = temp;
		}

	};


	EOLData.AllocatedDataHandler = function (data, options) {
		this.data = data;
		this.original = data;
		this.options = options;

		this.allocated_headers = [];
		this.allocated_data = {};
	};

	EOLData.AllocatedDataHandler.prototype = {

		itemHeader     : 'item',
		itemCountHeader: 'item_count',
		allocateColumn : 'tanshin_year',
		itemDateHeader : 'date',

		messageOnError      : '現在掲載されている情報はございません。',
		messageOnNoDataFound: '現在掲載されている情報はございません。',

		handle: function () {
			// error if the number of records is less than 0.
			if (this.data[this.itemCountHeader] < 0) {
				if (typeof this.options.onError == 'function') {
					this.options.onError.apply(this);
				} else {
					this.error(this.options.messageOnError || this.messageOnError);
				}
			}
			// no data was found.
			else if (this.data[this.itemCountHeader] == 0) {
				if (typeof this.options.onNoRecordFound == 'function') {
					this.options.onNoDataFound.apply(this);
				} else {
					this.error(this.options.messageOnNoDataFound || this.messageOnNoDataFound);
				}
			} else {
				this.allocateByColumn();
				this.show(null);
			}
		},

		error: function (message) {
			var base = $(this.options.listBase);
			$('<p class="notice">' + message + '</p>').appendTo(base);
		},

		show: function (year) {
			var base = $(this.options.listBase);
			base.children().remove(); // clean up

			var data = year ? this.year_data[year] : this.data[this.itemHeader];
			var tag = this.options.wrapWith || 'div';
			var inner = EOLData.getInnerTag(tag);

			for (var i = 0, l = this.allocated_headers.length; i < l; i++) {
				var wrapper = $('<' + tag + ' />');
				var header = this.allocated_headers[i];
				var group = {};

				group.header = header;
				group[this.itemHeader] = this.allocated_data[header];

				if (this.options.wrapperClass) {
					wrapper.addClass(this.options.wrapperClass);
				}

				var header_shown = false;
				if (typeof this.options.onHeaderRendered == 'function') {
					header_shown = this.options.onHeaderRendered.apply(this, [group, wrapper, base]);
				} else {
					header_shown = this.header(group, wrapper, base);
				}

				if (header_shown) {
					for (var ii = 0, ll = group[this.itemHeader].length; ii < ll; ii++) {
						var item = group[this.itemHeader][ii];
						if (typeof this.options.onItemRendered == 'function') {
							this.options.onItemRendered.apply(this, [item, wrapper, inner, base, group]);
						} else {
							this.item(item, wrapper, inner, base, group);
						}
					}

					base.append(wrapper);
				}

				if (typeof this.options.onAfterRendered == 'function') {
					this.options.onAfterRendered.apply(this, [wrapper, base]);
				}
			}
		},

		item: function (item, wrapper, inner, base) {
			EOLData.TableItemRenderer(item, wrapper, inner, base);
		},

		allocateByColumn: function () {
			var temp = {};
			for (var i = 0, l = this.data[this.itemCountHeader]; i < l; i++) {
				var item = this.data[this.itemHeader][i];
				var value = item[this.allocateColumn];
				if (!(value in temp)) {
					this.allocated_headers.push(value);
					temp[value] = [];
				}
				temp[value].push(item);
			}
			this.allocated_data = temp;
		}

	};

	EOLData.GroupDataHandler = function (data, options) {
		this.data = data;
		this.original = data;
		this.options = options;

		this.years = [];
		this.year_data = {};
	};

	EOLData.GroupDataHandler.prototype = {

		groupHeader     : 'group',
		groupCountHeader: 'group_count',
		itemHeader      : 'item',
		itemCountHeader : 'item_count',
		itemDateHeader  : 'date',

		messageOnError      : '現在掲載されている情報はございません。',
		messageOnNoDataFound: '現在掲載されている情報はございません。',

		handle: function () {
			// error if the number of records is less than 0.
			if (this.data[this.groupCountHeader] < 0) {
				if (typeof this.options.onError == 'function') {
					this.options.onError.apply(this);
				} else {
					this.error(this.options.messageOnError || this.messageOnError);
				}
			}
			// no data was found.
			else if (this.data[this.groupCountHeader] == 0) {
				if (typeof this.options.onNoRecordFound == 'function') {
					this.options.onNoDataFound.apply(this);
				} else {
					this.error(this.options.messageOnNoDataFound || this.messageOnNoDataFound);
				}
			} else {
				this.show();
			}
		},

		error: function (message) {
			var base = $(this.options.listBase);
			$('<p class="notice">' + message + '</p>').appendTo(base);
		},

		show: function () {
			var base = $(this.options.listBase);
			var data = this.data[this.groupHeader];
			var tag = this.options.wrapWith || 'div';
			var inner = EOLData.getInnerTag(tag);

			for (var i = 0, l = this.data[this.groupCountHeader]; i < l; i++) {
				var wrapper = $('<' + tag + ' />');
				var group = this.data[this.groupHeader][i];

				if (this.options.wrapperClass) {
					wrapper.addClass(this.options.wrapperClass);
				}

				var header_shown = false;
				if (typeof this.options.onHeaderRendered == 'function') {
					header_shown = this.options.onHeaderRendered.apply(this, [group, wrapper, base]);
				} else {
					header_shown = this.header(group, wrapper, base);
				}

				if (header_shown) {
					for (var ii = 0, ll = group[this.itemHeader].length; ii < ll; ii++) {

						var item = group[this.itemHeader][ii];
						if (typeof this.options.onItemRendered == 'function') {
							this.options.onItemRendered.apply(this, [item, wrapper, inner, base, group]);
						} else {
							this.item(item, wrapper, inner, base, group);
						}
					}

					base.append(wrapper);
				}

				if (typeof this.options.onAfterRendered == 'function') {
					this.options.onAfterRendered.apply(this, [wrapper, header_shown, base]);
				}
			}
		},

		header: function (group, wrapper, base) {
			EOLData.EmptyHeaderRenderer(group, wrapper, base);
		},

		item: function (item, wrapper, inner, base) {
			EOLData.TableItemRenderer(item, wrapper, inner, base);
		}
	};

	return EOLData;

})(jQuery);


