/**
 * 使用例
 *
 * <script type="text/javascript">
 * 	<!--
 * 	var zipCode = new RaccoonZipCode();
 * 
 * 	zipCode.loadingListener = function() {
 * 		document.getElementById('addressCompletion').innerHTML = '[読み込み中]';
 * 		try {
 * 			document.getElementById('addressCompletion').style.cursor = "none";
 * 		} catch(e) {}
 * 	};
 * 
 * 	zipCode.readyListener = function() {
 * 		document.getElementById('addressCompletion').innerHTML = '[郵便番号から住所を入力]';
 * 		try {
 * 			document.getElementById('addressCompletion').style.cursor = "pointer";
 * 		} catch(e) {}
 * 	};
 * 
 * 	zipCode.show = function(errorCode) {
 * 		switch (errorCode) {
 * 			case 1:
 * 				document.getElementById('zipCodeErrorMessage').innerHTML = "郵便番号を入力してください";
 * 				break;
 * 			case 2:
 * 				document.getElementById('zipCodeErrorMessage').innerHTML = "郵便番号が見つかりません";
 * 				break;
 * 		}
 * 	};
 * 
 * 	zipCode.hide = function() {
 * 		document.getElementById('zipCodeErrorMessage').innerHTML = "";
 * 	};
 * 
 * 	zipCode.complete = function(prefecture, city, town) {
 * 		zipCode.selectDropDown(prefecture, document.getElementById('t_prefecture'));
 * 		document.getElementById('t_address').value = city + " " + town;
 * 	};
 * 
 * 	zipCode.ready();
 *
 * 	// -->
 * </script>
 */
var RaccoonZipCode = function() {};

RaccoonZipCode.prototype.errorMessage = null;

RaccoonZipCode.prototype.settings = {
	"method": "GET",
	"path": "/js/address_completion/zipdata/",
	"extension": ".js"
};

RaccoonZipCode.prototype.isLoading = false;

RaccoonZipCode.prototype.load = function(zipCode1, zipCode2) {
	this.hide();

	if (this.isLoading) {
		return;
	}
	if (!this.validate(zipCode1, zipCode2)) {
		this.show(1);
		return;
	}
	var request = this.createRequest();
	var parentClass = this;

	request.open(this.settings["method"], this.settings["path"] + zipCode1 + this.settings["extension"]);
	request.onreadystatechange = function() {
		if (request.readyState == 4) {
			if (request.status == 200) {
				var zipData = eval("({" + request.responseText + "})");
				if (zipData["" + zipCode1 + zipCode2] != null) {
					parentClass.complete(zipData["" + zipCode1 + zipCode2][0], zipData["" + zipCode1 + zipCode2][1], zipData["" + zipCode1 + zipCode2][2]);
				}
				else {
					parentClass.show(2);
				}
			}
			else {
				parentClass.show(2);
			}
			parentClass.ready();
		}
	};
	this.loading();
	request.send("");
};

RaccoonZipCode.prototype.loading = function() {
	this.loadingListener();
	this.isLoading = true;
};

RaccoonZipCode.prototype.loadingListener = function() {};

RaccoonZipCode.prototype.ready = function() {
	if (this.createRequest() == null) {
		return false;
	}
	this.readyListener();
	this.isLoading = false;
};

RaccoonZipCode.prototype.readyListener = function() {};

RaccoonZipCode.prototype.validate = function(zipCode1, zipCode2) {
	if (zipCode1.length != 3) {
		return false;
	}
	if (zipCode2.length != 4) {
		return false;
	}

	return true;
};

/**
 * errorCode
 *  1: 郵便番号が入力されていないか、不正な郵便番号の場合
 *  2: 郵便番号から住所が見つからなかった場合
 */
RaccoonZipCode.prototype.show = function(errorCode) {};


RaccoonZipCode.prototype.hide = function() {
	if (this.errorMessage) {
		this.errorMessage.innerHTML = "";
	}
};

RaccoonZipCode.prototype.createRequest = function() {
	var request = null;
	try {
		request = new ActiveXObject('Msxml2.XMLHTTP');
	} catch(e) {
		try {
			request = new new ActiveXObject('Microsoft.XMLHTTP');
		} catch(e) {
			try {
				request = new XMLHttpRequest();
			} catch(e) {
			}
		}
	}

	return request;
};

RaccoonZipCode.prototype.complete = function(prefecture, city, town){};

RaccoonZipCode.prototype.selectDropDown = function(prefecture, prefectureForm) {
	var regex = new RegExp(prefecture, "");
	for (var i = 0; i <= prefectureForm.length; ++i) {
		if (prefectureForm.options[i].text.match(regex)) {
			prefectureForm.options[i].selected = true;
			break;
		}
	}
};

