﻿(function($){
	$.contentsDisplay = function(options) {
		//設定をオーバーライド
		options = $.extend(true, {}, $.contentsDisplay.defaults, options);
	
		//現在のページ
		var currentPage = 1;
		//ページごとの件数
		var itemsPerPage =options.itemsPerPage;
		//この数字以上ページがあった場合、ナビゲーションを省略
		var naviDisplayLimit = options.naviDisplayLimit;
		
		//各都道府県のデータが存在するかどうかを格納するハッシュ
		var prefsExists = {};
		//各都道府県の市区群のデータが存在するかどうかを格納するハッシュ
		var citiesExists = {};
		
		//データを挿入する場所を予め変数に代入
		var $pref = $(options.selectPrefSelector);
		var $city = $(options.selectCitySelector);
		var $items = $(options.itemsAreaSelector);
		var $navi = $(options.pageNaviSelector);
		var $result = $(options.resultNumSelector);
		
		//カセットに付加するクラス
		var cassetteClass = options.cassetteClass;
		
		//最初に都道府県のoptionを格納して、HTML上では空にしておく(「指定しない」は残す)
		var $prefOptions = $("option", $pref).clone();
		$("option", $pref).not(":first-child").remove();
		
		//扱うデータによって処理を変えるためにハッシュを生成
		var dataSet = {
			//area.txtを処理するためのハッシュ
			area: {
				file: options.areaFile,           //読み込むファイルのパス
				loaded: false,                        //ファイルがロードされたかどうか
				data: {},                                //整形されたデータを格納するハッシュ
				//配列からハッシュに変換するメソッド
				arr2hash: function(arr) {
					var data = {};
					var prefId, cityId;
					for(var i = 0; i < arr.length; i++) {
						prefId = arr[i][0];
						cityId = arr[i][1];
						if(data["p_" + prefId]) {
							if(data["p_" + prefId]["c_" + cityId]) {
								data["p_" + prefId]["c_" + cityId].push(arr[i]);
							} else {
								data["p_" + prefId]["c_" + cityId] = arr[i];
							}
						}else{
							data["p_" + prefId]={};
							data["p_" + prefId]["c_" + cityId] = arr[i];
						}
					}
					this["data"] = data;
				},
				//整形したデータを表示するメソッド
				displayData: function() {
					//要素をすべて削除(「指定しない」は残す)
					$("option", $city).not(":first-child").remove();
					
					if(inputPrefId) {
						//データの存在する市区群をselectに表示
						$.each(this["data"]["p_" + inputPrefId], function(i) {
							//if(citiesExists["p_" + inputPrefId]["c_" + this[1]] !== undefined) {
								$city.append("<option value=\"" + this[1] + "\">" + this[2] + "</option>");
							//}
						});
					}
				}
			},
			//genkou.txtを処理するためのハッシュ
			genkou: {
				file: options.genkouFile,      //読み込むファイルのパス
				loaded: false,                        //ファイルがロードされたかどうか
				data: {},                                //整形されたデータを格納するハッシュ
				//配列からハッシュに変換するメソッド
				arr2hash: function(arr) {
					//各都道府県、市区群のデータが存在するか調べる
					var prefId, cityId;
					for(var i = 0; i < arr.length; i++) {
						prefId = arr[i][6];
						cityId = arr[i][7];
						if(!prefsExists[prefId]) {
							prefsExists[prefId] = 1;
						}
						if(citiesExists["p_" + prefId]) {
							if(!citiesExists["p_" + prefId]["c_" + cityId]) {
								citiesExists["p_" + prefId]["c_" + cityId] = 1;
							}
						} else {
							citiesExists["p_" + prefId] ={};
							citiesExists["p_" + prefId]["c_" + cityId] = 1;
						}
					}
					//データの存在する都道府県をselectに表示
					$prefOptions.filter(function(i) {
						return prefsExists[$(this).attr("value")] !== undefined;
					}).appendTo($pref);
					this.data = arr;
				},
				//整形したデータを表示するメソッド
				displayData: function() {
					//要素をすべて削除
					$("div."+cassetteClass, $items).remove();
					
					//itemsのHTML
					var itemsHtml = "";
					
					//データを整形
					var data = this.data;
					var forDisplay = $.grep(data, function(item, index) {
						return (inputPrefId == item[6]) && (!inputCityId || inputCityId == item[7]);
					});
					var dataNum = forDisplay.length;
					
					//詳細画面、応募画面のURLを生成
					var urlCommonHead = options.urlCommonPart;
					var shousaiUrlTmpl = urlCommonHead + options.shousaiJsp;
					var ouboUrlTmpl = urlCommonHead + options.ouboJsp;
					var shousaiParams = "?mp=1&ST=" + options.shousaiSTValue;
					var ouboParams = "?mp=1&ST=" + options.ouboSTValue;
					
					//文字列としてDOMを構成
					var loopStart = (currentPage - 1) * itemsPerPage;
					var loopEnd = (loopStart + itemsPerPage < dataNum)? loopStart + itemsPerPage: dataNum;
					for(i = loopStart; i < loopEnd; i++) {
						var commonParams = "&edition_cd=" + forDisplay[i][1] + "&rqmt_id=" + forDisplay[i][0];
						itemsHtml += "<div class=\"" + cassetteClass + "\">\n";
						itemsHtml += "<div class=\"ms clr\">\n";
						itemsHtml += "<div class=\"ls\">\n";
						itemsHtml += "<h2 class=\"shop_name\">" + forDisplay[i][5] + "</h2>\n";
						itemsHtml += "<address>" + forDisplay[i][8] + "</address>\n";
						itemsHtml += "<p class=\"job\"><em>" + forDisplay[i][2] + "</em></p>\n";
						itemsHtml += "<!--/ls--></div>\n";
						itemsHtml += "<div class=\"rs clr\">\n";
						itemsHtml += "<ul class=\"clr\">\n";
						itemsHtml += "<li><a href=\"" + shousaiUrlTmpl + shousaiParams + commonParams + "\" target=\"_blank\">詳細</a></li>\n";
						itemsHtml += "<li><a href=\"" + ouboUrlTmpl + ouboParams  + commonParams +  "\" target=\"_blank\">応募</a></li>\n";
						itemsHtml += "</ul>\n";
						itemsHtml += "<!--/rs--></div>\n";
						itemsHtml += "<!--/ms--></div>\n";
						itemsHtml += "<table cellspacing=\"0\">\n";
						itemsHtml += "<tr>\n";
						itemsHtml += "<th>給与</th>\n";
						itemsHtml += "<td class=\"td_kyuyo\">" + forDisplay[i][3] + "</td>\n";
						itemsHtml += "<th>アクセス</th>\n";
						itemsHtml += "<td class=\"td_access\">" + forDisplay[i][4] + "</td>\n";
						itemsHtml += "</tr>\n";
						itemsHtml += "</table>\n";
						itemsHtml += "<!--/cassette--></div>\n";
					}
					//最後にデータを挿入
					$items.append(itemsHtml);
					
					if(dataNum > 0) {
						//件数を表示
						this.setResult(dataNum, loopStart, loopEnd);
						//ナビゲーションを表示
						this.setNavigation(dataNum);
					} else {
						$navi.empty();
						$result.empty();
					}
				},
				//ナビゲーションを生成、表示するメソッド
				setNavigation: function (dataNum) {
					var self = this;
					
					//現在選択されている要素の総ページ数
					var allPages = Math.ceil(dataNum / itemsPerPage);
					
					//naviのHTML
					var naviHtml = "";
					
					//prevBtn
					if(currentPage > 1) {
						naviHtml += "<a href=\"#\" class=\"page_" + (currentPage - 1) + "\">&laquo;前へ</a>・・・| \n";
					}
					//ページナビ
					if(allPages > 1) {
						var centerNum = Math.floor(naviDisplayLimit / 2 + 1);
						var odd = Number(!(naviDisplayLimit % 2));
						
						var naviPageStart = (allPages < naviDisplayLimit || currentPage - centerNum + 1 <= 0)? 1: (currentPage > allPages - centerNum)? allPages - naviDisplayLimit + 1: currentPage - centerNum + 1;
						var naviPageEnd = (allPages < naviDisplayLimit || currentPage + (centerNum -1 * odd) - 1 >= allPages)? allPages: (currentPage < centerNum + 1)? naviDisplayLimit :currentPage + (centerNum - 1 * odd) - 1;
						
						//alert(naviPageStart +" "+ naviPageEnd);
						for(var i = naviPageStart; i <= naviPageEnd; i++) {
							naviHtml += (currentPage != i)? "<a href=\"#\" class=\"page_" + i + "\">" + i + "</a> | \n":  i + " | \n";
						}
					}
					//nextBtn
					if(currentPage < allPages && allPages > 1) {
						naviHtml += "・・・<a href=\"#\" class=\"page_" + (currentPage + 1) + "\">次へ&raquo;</a>\n";
					}
					//「"現在のページ" / "総ページ数" ページ」表示
					naviHtml += "　" + currentPage + " / " + allPages + "ページ\n";
					 
					//naviにhtmlを挿入
					$navi.html(naviHtml);
					
					//btnにイベントを設定
					$("a", $navi).click(function(e) {
						var pageTo = $(this).attr("class").split("_")[1];
						currentPage = Number(pageTo);
						self.displayData();
						e.preventDefault();
						return false;
					});
				},
				//件数を表示するメソッド
				setResult: function(dataNum, start, end) {
					var resltlHtml = "<em>" + dataNum + "</em>件あり、<span>" + ((end - start == 1)? 1: (start + 1) + "〜" + end) + "</span>件を表示しています。";
					$result.html(resltlHtml);
				}
			}
		}
		
		//入力された値を格納する変数
		var inputPrefId, inputCityId;
		
		//selectのイベント定義
		$pref.change(function() {
			inputPrefId = $pref.val();
			inputCityId = "";
			currentPage = 1;
			dataSet["area"]["displayData"]();
			dataSet["genkou"]["displayData"]();
		});
		$city.change(function() {
			inputCityId = $city.val();
			currentPage = 1;
			dataSet["genkou"]["displayData"]();
		});
		
		//リロード後、「指定しない」が選択されている状態にしておく(IE)
		$("option:first-child", $city).attr("selected", "selected");
		
		//最初にloadを実行
		load("area");
		load("genkou");

		//ファイル読み込み→データ整形
		function load(type) {
			$.ajax({
				url: dataSet[type]["file"],
				type: "GET",
				dataType: "text",
				beforeSend: function(XMLHttpRequest){
					this; // the options for this ajax request
				},
				complete: function(XMLHttpRequest, textStatus) {
					this; // the options for this ajax request
				},
				error: function(XMLHttpRequest, textStatus, errorThrown) {
					// typically only one of textStatus or errorThrown 
					// will have info
					alert(textStatus);
					this; // the options for this ajax request
				},
				success: function (raw, textStatus) {
					dataSet[type]["loaded"] = true;      //ロード完了
					var arr = csv2arraySimple(raw);       //データを配列に変換
					dataSet[type]["arr2hash"](arr);      //配列から整形してハッシュに
					
					this; // the options for this ajax request
				}
			});
		}

		//jQueryライブラリを使用する場合
		function csv2array(raw){
			return $.csv2array(raw);
		}

		//タブ区切りテキストを配列に変換
		function csv2arraySimple(raw){
			var ret = [];
			var rows = raw.replace("\r", "").split("\n");
			for(var i=0; i < rows.length; i++){
				if(rows[i]){
					ret.push(rows[i].split("\t"));
				}
			}
			return ret;
		}
		
		function htmlEncode(str){
			return str.replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
		}
	}

	//default
	$.contentsDisplay.defaults = {
		itemsPerPage: 20,                                                                    //ページごとの件数
		naviDisplayLimit: 5,                                                                  //この数字以上ページがあった場合、ナビゲーションを省略
		selectPrefSelector: "#prefid",                                                //都道府県を選択するフォームのセレクタ
		selectCitySelector: "#cityid",                                                 //市区群を選択するフォームのセレクタ
		itemsAreaSelector: "#contents",                                           //データを表示する箇所のセレクタ
		pageNaviSelector: "div.pagination p",                                   //ページナビを表示する箇所のセレクタ
		resultNumSelector: "div.result_number p",                          //件数を表示する箇所のセレクタ
		cassetteClass: "cassette",                                                      //カセットに付加するクラス
		areaFile: "./data/0343949020area.txt",                                                     //areaデータのCSVのパス
		genkouFile: "./data/0343949020genkou.txt",                                           //genkouデータのCSVのパス
		urlCommonPart: "http://www.froma.com/s/p/baito/",     //詳細画面、応募画面のURLの共通部分
		shousaiSTValue: "26",                                                            //詳細画面のURLのパラメータ「ST」の値
		ouboSTValue: "27",                                                                //応募画面のURLのパラメータ「ST」の値
		shousaiJsp: "F13010Bs.jsp",                                                 //詳細画面のJSP
		ouboJsp: "F14010Bs.jsp"                                                       //応募画面のJSP
	}
})(jQuery);
