//
// 2008/02/28作成
// 都道府県表示 Javascript Library
// 
// Author: Tadafumi Sato
// Support: http://exposed.egoism.jp/wordpress/
// License: MIT License
// 
// --使用方法--
//
// 1.Htmlの準備
// 表示させたいHtml内に、<div id="todouhuken"></div>
// を記述します。
// 
// 2.Javascriptのコードを記述
// 
// var ins = new Todouhuken_Lib();
// var hash = {
//     id: "todouhuken",　
//         //任意のものを指定して下さい。defalutは、"todouhuken"
//	   separater: " | ",
//         //任意のものを指定して下さい。defalutは、"  "
//	   callback: function(){},
//	   br_number: [7, 14, 23, 30, 35, 39] 
//　　     //どの位置で段落にするかを指定します。
//         //番号は、地方公共団体コードから先頭の0を除いたものです。
// }
// ins.viewTodouhuken(hash);
//
// これで、表示できます。
// --
//
// --callbackについて--
//
// callbackには、各都道府県要素をclickした場合の
// イベントを指定してください。
// また、その場合指定された関数には、引数として
// var callback = function(clickした都道府県の名前, 地方公共団体コード){}
// が渡されます。
// --
//
// --その他のメソッドについて--
// 
// ins.getTownCode(県名)　→　地方公共団体コードを返す。なければfalseを返す。
// ins.getTownName(地方公共団体コード)　→　県名を返す。なければfalseを返す。
// --

////Todouhuken library 本体
var Todouhuken_Lib = function(user){
	
	this.version = '0.1';
	this.id = "todouhuken";
	this.separater = "  ";
	this.user_callback = function(){}
	this.br_number = [1, 7, 14, 23, 30, 35, 39, 46, 47]
	
	if(user){
		if(user["id"]){
			this.id = user["id"];
		}
		if(user["separater"]){
			this.separater = user["separater"];
		}
		if(user["br_number"]){
			this.br_number = user["br_number"];
		}
		if(user["callback"]){
			this.user_callback = user["callback"];
		}
	}
}

////都道府県データ

//参考
//地方公共団体コード JIS X 0401
//Wikipedia Portal:日本の都道府県 http://ja.wikipedia.org/wiki/P:PJ
Todouhuken_Lib.prototype.todouhuken = {
	//北海道
	"北海道": "01",
	//東北
	"青森県": "02",
	"岩手県": "03",
	"宮城県": "04",
	"秋田県": "05",
	"山形県": "06",
	"福島県": "07",
	//関東
	"茨城県": "08",
	"栃木県": "09",
	"群馬県": "10",
	"埼玉県": "11",
	"千葉県": "12",
	"東京都": "13",
	"神奈川県": "14",
	//中部
	"新潟県": "15",
	"富山県": "16",
	"石川県": "17",
	"福井県": "18",
	"山梨県": "19",
	"長野県": "20",
	"岐阜県": "21",
	"静岡県": "22",
	"愛知県": "23",
	//近畿
	"三重県": "24",
	"滋賀県": "25",
	"京都府": "26",
	"大阪府": "27",
	"兵庫県": "28",
	"奈良県": "29",
	"和歌山県": "30",
	//中国
	"鳥取県": "31",
	"島根県": "32",
	"岡山県": "33",
	"広島県": "34",
	"山口県": "35",
	//四国
	"徳島県": "36",
	"香川県": "37",
	"愛媛県": "38",
	"高知県": "39",
	//九州
	"福岡県": "40",
	"佐賀県": "41",
	"長崎県": "42",
	"熊本県": "43",
	"大分県": "44",
	"宮崎県": "45",
	"鹿児島県": "46",
	//沖縄
	"沖縄県": "47"
}

////都道府県表示メソッド
Todouhuken_Lib.prototype.viewTodouhuken = function(user){
	
	if(user){
		if(user["id"]){
			this.id = user["id"];
		}
		if(user["separater"]){
			this.separater = user["separater"];
		}
		if(user["br_number"]){
			this.br_number = user["br_number"];
		}
		if(user["callback"]){
			this.user_callback = user["callback"];
		}
	}
	//thisを保存
	//onloadイベント時には、thisがwindowになってしまうため
	var this_tmp = this;
	//window読み込み時のイベント
	//body内のdiv要素がhead内での読み込み時には、まだないため完了時の実行
	var onloadevent = function(callback_tmp){
		
		//body内のdivを取得
		var outdiv = document.getElementById(this_tmp.id);
		////var align = document.createAttribute("align");
		////align.nodeValue = "left";
		////outdiv.setAttributeNode(align);
		
		//div内に入れ子になるdiv要素
		var indiv = document.createElement("div");
		//
		//var align = document.createAttribute("align");
		//align.nodeValue = "left";
		//indiv.setAttributeNode(align);
		
		var callback = function(){
			
			if(!!window.attachEvent){
				
				arg = 
				[
					window.event.srcElement.firstChild.nodeValue,
					this_tmp.todouhuken[window.event.srcElement.firstChild.nodeValue]
				]
				
				//各都道府県名が格納されるspan要素(window.event.srcElement)をthisとして、callback
				this_tmp.user_callback.apply(window.event.srcElement, arg);
				window.event.srcElement.style.color = "#ff0000";
				
			}else if(navigator.userAgent.indexOf('Gecko')){
				
				arg = 
					[
						this.firstChild.nodeValue,
						this_tmp.todouhuken[this.firstChild.nodeValue]
					]
				
				//各都道府県名が格納されるspan要素をthisとしてcallback
				this_tmp.user_callback.apply(this, arg);
				this.style.color = "#ff0000";
				
			}
		}
		
		//strの配列内での有無
		var in_array = function(str, array){
			
			for(var i = 0; i < array.length; i++){
				if(array[i] == parseInt(str, 10)){
					//alert(str);
					return true
				}
			}
			return false
		}
		
		//div内に、イベントを追加した各要素をappend
		//br_number内に現在の都道府県コードある場合は、div要素を更新して段落とする
		for(var name in this_tmp.todouhuken){
			
			var span = document.createElement("span")
			var text = document.createTextNode(name);
			var span_sparater = document.createElement("span")
			var text_sparater = document.createTextNode(this_tmp.separater);
			
			span.style.color = "#0000ff";
			span.style.textDecoration = "underline";
			span.style.cursor = "pointer";
			span.appendChild(text);
			span_sparater.appendChild(text_sparater);
			
			if(!!window.attachEvent){
				span.attachEvent("onclick", callback);
			}else if(navigator.userAgent.indexOf('Gecko')){
				span.addEventListener("click", callback, false);
			}
			
			indiv.appendChild(span)
			indiv.appendChild(span_sparater)
			
			if(in_array(this_tmp.todouhuken[name], this_tmp.br_number)){
				outdiv.appendChild(indiv);
				indiv = document.createElement("div");
				//
				//var align = document.createAttribute("align");
				//align.nodeValue = "left";
				//indiv.setAttributeNode(align);
			}
			if((this_tmp.todouhuken[name] == "47")&&(in_array("47", this_tmp.br_number) == false)){
				outdiv.appendChild(indiv);
			}
		}
	}
	//イベントを追加
	if(!!window.attachEvent){
		window.attachEvent("onload", onloadevent);
	}else if(navigator.userAgent.indexOf('Gecko')){
		window.addEventListener("load", onloadevent, false);
	}
}

////名前から、地方公共団体コードを取得するメソッド
Todouhuken_Lib.prototype.getTownCode = function(townname){
	
	for(var name in this.todouhuken){
		if(name == townname){
			return this.todouhuken[name]
		}
	}
	return false
}

////コードから、県名を取得するメソッド
Todouhuken_Lib.prototype.getTownName = function(towncode){
	
	for(var name in this.todouhuken){
		if(this.todouhuken[name] == towncode){
			return name
		}
	}
	return false
}

/*
//Example
var testfunc = function(arg1 , arg2){
	
	alert("arg1 : " + arg1);
	alert("arg2 : " + arg2);
	alert("func : " + ins.getTownName("43"));
	alert("test : " + this.nodeName);
	
}

var hash = {
	
	id: "todouhuken",
	separater: "  ",
	callback: testfunc,
	br_number: [7, 14, 23, 30, 35, 39]
	
}

var ins = new Todouhuken_Lib();
ins.viewTodouhuken(hash);
*/