// Copyright (c) 2009, Revla Co., Ltd
// All rights reserved.

// ソースコード形式かバイナリ形式か、変更するかしないかを問わず、以下の条件を満たす場合に限り、再頒布および使用が許可されます。

//	* ソースコードを再頒布する場合、上記の著作権表示、本条件一覧、および下記免責条項を含めること。
//	* バイナリ形式で再頒布する場合、頒布物に付属のドキュメント等の資料に、上記の著作権表示、本条件一覧、および下記免責条項を含めること。
//	* 書面による特別の許可なしに、本ソフトウェアから派生した製品の宣伝または販売促進に、株式会社レブラの名前またはコントリビューターの名前を使用してはならない。 

// 本ソフトウェアは、著作権者およびコントリビューターによって「現状のまま」提供されており、明示黙示を問わず、商業的な使用可能性、および特定の目的に対する適合性に関する暗黙の保証も含め、またそれに限定されない、いかなる保証もありません。著作権者もコントリビューターも、事由のいかんを問わず、損害発生の原因いかんを問わず、かつ責任の根拠が契約であるか厳格責任であるか（過失その他の）不法行為であるかを問わず、仮にそのような損害が発生する可能性を知らされていたとしても、本ソフトウェアの使用によって発生した（代替品または代用サービスの調達、使用の喪失、データの喪失、利益の喪失、業務の中断も含め、またそれに限定されない）直接損害、間接損害、偶発的な損害、特別損害、懲罰的損害、または結果損害について、一切責任を負わないものとします。

dojo.require('dojo.parser');

dojo.addOnLoad(
	function() {

		//「確認」押下時のチェック用Action Listenerの登録
		(function() {
			var checker = function() {
				dojo.style('name_err', 'display', 'none');
				dojo.style('ruby_err', 'display', 'none');
				dojo.style('tel_err', 'display', 'none');
				dojo.style('email_err', 'display', 'none');
				dojo.style('address_err', 'display', 'none');
				var ok = true;

				switch (dojo.byId('name').value) {
				case '':
				case undefined:
				case null:
					dojo.style('name_err', 'display', 'block');
					ok = false;
					break;
				default:
					;
				}

				if (!/^[ア-ンあ-ん][ア-ンあ-ん 　]*$/.
					test(dojo.byId('ruby').value)) {
					dojo.style('ruby_err', 'display', 'block');
					ok = false;
				}

				ok = (function(ok) {
					var tel1 = dojo.byId('tel1').value;
					var tel2 = dojo.byId('tel2').value;
					var tel3 = dojo.byId('tel3').value;
					var re = /^\d{2,4}$/;
					if (!re.test(tel1) || !re.test(tel2) || !re.test(tel3)) {
						dojo.style('tel_err', 'display', 'block');
						return false;
					}
					return ok;
				})(ok);

				var email = dojo.trim(dojo.byId('email').value),
				re
				= /^[*+!.&#$|\'\\%\/\w^`{}=?~:-]+@(?:(?:[^\W_]|-)+\.)+[^\W_]{2,}$/,
				ourselves = ['info@revla.net', 'inquiry@revla.net'];
				if (!re.test(email) || 0 <= dojo.indexOf(ourselves, email)) {
					dojo.style('email_err', 'display', 'block');
					ok = false;
				}

				return (function(ok) {
					var grp = ['state', 'city', 'address'];
					for (var i=grp.length-1; 0<=i; --i)
						switch (dojo.byId(grp[i]).value) {
						case '':
						case undefined:
						case null:
							dojo.style('address_err', 'display', 'block');
							return false;
						default:
							;
						}
					return ok;
				})(ok);
			};

			var clearUrls = function() {
				var urls = [
					dojo.byId('url0'),
					dojo.byId('url1'),
					dojo.byId('url2')
				];
				for (var i=urls.length-1; 0<=i; --i)
					switch (urls[i]) {
					case null:
					case undefined:
						break;
					default:
						if (urls[i].value === 'http://')
							urls[i].value = '';
					}
			};

			dojo.style('confirm', 'display', 'inline');
			dojo.connect(
				dojo.byId('confirm'),
				'onclick',
				null,
				function(evt) {
					if (checker()) {
						clearUrls();
						document.forms['contactFrm'].submit();
					}
					return false;
				}
			);
		})();

		// 参照サイト有無指定時のAction Listener登録
		(function() {
			var noreference = dojo.byId('noreference');

			dojo.style(
				'references',
				'display',
				noreference.checked ? 'none' : 'block'
			);

			dojo.connect(
				noreference,
				'onclick',
				null,
				function(evt) {
					dojo.style(
						'references',
						'display',
						noreference.checked ? 'none' : 'block'
					);
					return false;
				}
			);
		})();

		// 予算、開設時期の決定、未定指定時のAction Listener登録
		(function() {
			var targets = [
				{src:'budget_decided', dest:'budgetclass', newstyle:'inline'},
				{src:'budget_notdecided', dest:'budgetclass', newstyle:'none'},
				{src:'opening_decided', dest:'opening_date', newstyle:'inline'},
				{src:'opening_notdecided', dest:'opening_date', newstyle:'none'}
			];

			var bindOnClickEvent = function(src, dest, newstyle) {
				dojo.connect(
					src,
					'onclick',
					null,
					function(evt) {dojo.style(dest, 'display', newstyle);}
				);
			};

			dojo.style(
				'budgetclass',
				'display',
				dojo.attr(dojo.byId('budget_decided'), 'checked')
					? 'inline' : 'none'
			);
			dojo.style(
				'opening_date',
				'display',
				dojo.attr(dojo.byId('opening_decided'), 'checked')
					? 'inline' : 'none'
			);
			for (var i = targets.length - 1, target, src; 0 <= i; --i) {
				target = targets[i];
				if (dojo.attr(src=dojo.byId(target.src), 'checked'))
					dojo.style(target.dest, 'display', target.newstyle);
				bindOnClickEvent(src, target.dest, target.newstyle);
			}
		})();

		// 開設年指定時の月選択Action Listenerの登録
		(function() {
			var createMonthList = function() {
				var dt = new Date();
				var cyear = '' + dt.getFullYear();
				var year = dojo.byId('year');
				var month = dojo.byId('month');
				var input_month = dojo.byId('input_month');

				month.options.length = 0;
				for (var i = 1, ci; i <= 12; ++i) {
					ci = '' + i;
					month.options[month.options.length] =
					new Option(ci, ci, false, ci===input_month);
				}
				if (0 <= year.selectedIndex
				&&	cyear === year.options[year.selectedIndex].value)
					for (i = dt.getMonth() - 1; 0 <= i; --i)
						month.options[i] = null;
			};

			/*
			(function() {
				var dt = new Date();
				var cyear = dt.getFullYear();
				var year = dojo.byId('year');
				var input_year = dojo.byId('input_year');

				year.options[0] =
				new Option(''+cyear, ''+cyear, false, ''+cyear===input_year);
				for (var i = cyear + 1, limit = cyear + 5; i < limit; ++i)
					year.options[year.options.length] =
					new Option(''+i, ''+i, false, ''+i===input_year);

				createMonthList();
			})();
			*/

			createMonthList();

			dojo.connect(
				dojo.byId('year'),
				'onchange',
				null,
				function(evt) {createMonthList(); return false;}
			);
		})();

		// 郵便番号検索表示Action Listenerの登録
		(function() {
			var clearLocation = function() {
				dojo.byId('state').selectedIndex = 0;
				dojo.byId('city').value =
				dojo.byId('address').value =
				dojo.byId('state_kana').innerHTML =
				dojo.byId('city_kana').innerHTML =
				dojo.byId('address_kana').innerHTML = '';
			};

			var checkResult = function(response) {
				var results = response.getElementsByTagName('result');
				var message = dojo.byId('message');
				var code;
				var count;

				if (results.length < 1) {
					message.innerHTML = '住所データを読み込めませんでした。';
					return false;
				}
				for (var i=0, len=results.length; i<len; ++i) {
					if (code = results[i].getAttribute('result_code')) {
						if (code==='0') {
							message.innerHTML = '存在しない郵便番号です。';
							return false;
						}
						continue;
					}
					if ((count=results[i].getAttribute('result_values_count'))
					&&	count <= 0) {
						message.innerHTML = '存在しない郵便番号です。';
						return false;
					}
				}
				return true;
			};

			var parseAddress = function(address) {
				var values = address.getElementsByTagName('value');
				var keys = [
					'state',
					'state_kana',
					'city',
					'city_kana',
					'address',
					'address_kana'
				];
				var items = {};
				var key, tmp;
				for (var i=0, keylen=keys.length, j, valuelen=values.length;
					i<keylen;
					++i) {
					key = keys[i];
					for (j=0; j<valuelen; ++j)
						if (tmp = values[j].getAttribute(key)) {
							items[key] = tmp;
							break;
						}
				}
				return items;
			},
			editAddress = function(items) {
				var rubies = [
					{item:'state', ruby:'state_kana', title:'都道府県'},
					{item:'city', ruby:'city_kana', title:'市区町村'},
					{item:'address', ruby:'address_kana', title:'住所'}
				];
				var tags = '';
				var tmp;
				var contents = [];
				for (var i=0, rubylen=rubies.length; i<rubylen; ++i) {
					contents[i] = {};
					tmp = rubies[i];
					if (!(contents[i].item = items[tmp.item])) continue;
					contents[i].title = tmp.title;
					contents[i].ruby = items[tmp.ruby];
					contents[i].name = tmp.item;
					contents[i].kana = tmp.ruby;
				}
				return contents;
			},
			showSingle = function(contents) {
				var content;
				var id;
				var j;
				var olen;

				for (var i=0, len=contents.length; i<len; ++i) {
					content = contents[i];
					id = dojo.byId(content.name);
					switch (content.name) {
					case 'state':
						for (j=0, olen=id.options.length; j<olen; ++j)
							if (id.options[j].value === content.item) {
								id.selectedIndex = j;
								break;
							}
						break;
					default:
						id.value = content.item;
					}
					dojo.byId(content.kana).innerHTML = content.ruby;
				}
			},
			showCandidate = function(contents) {
				var tags = '';
				var content;
				for (var i=0, len=contents.length; i<len; ++i) {
					content = contents[i];
					if (!content.ruby)
						tags +=
						'<span class="item">' + content.item + '</span>&nbsp';
					else
						tags +=
						'<ruby>' +
							'<rb>' + content.item + '</rb>' +
							'<rp>(</rp>' +
							'<rt>' + content.ruby + '</rt>' +
							'<rp>)</rp>' +
						'</ruby>&nbsp';
				}
				return tags;
			};

			var result = dojo.byId('result');

			var displayAddress = function(response) {
				var addresses = response.getElementsByTagName('ADDRESS_value');
				var addrlen = addresses.length;
				if (addrlen < 2)
					showSingle(editAddress(parseAddress(addresses[0])));
				else {
					result.innerHTML = '<ul>';
					for (var i=0; i<addrlen; ++i)
						result.innerHTML +=
						'<li>' +
						showCandidate(editAddress(parseAddress(addresses[i]))) +
						'</li>';
					result.innerHTML += '</ul>';
				}
			};

			var xhr_request = function(evt) {
				var	zip =
				'' + dojo.byId('zip1').value + '' + dojo.byId('zip2').value;
				var	message = dojo.byId('message');

				result.innerHTML = message.innerHTML = '';
				clearLocation();
				if (zip.length < 7) return false;

				if (!/^\d{7}$/.test(zip)) {
					message.innerHTML =
					'郵便番号は、全て半角数字で入力してください。';
					return false;
				}

				dojo.xhrPost({
					url: '/index.php/contact/zip/format/xml',
					load: function(response, ioArgs) {
					//	console.log('load response', response);
					//	console.log('load ioArgs');
					//	console.dir(ioArgs);
						if (checkResult(response)) displayAddress(response);
						return response;
					},
					error: function(response, ioArgs) {
					//	console.log('error response', response);
					//	console.log('error ioArgs');
					//	console.dir(ioArgs);
						return response;
					},
					timeout: 10000,
					handleAs: 'xml',
					content: {
						zip: zip,
						isIE: dojo.isIE ? 'IE' : 'nonIE'
					}
				});

				return false;
			};

			dojo.style('duty', 'display' , 'block');
			dojo.connect(dojo.byId('zip1'), 'onkeyup', null, xhr_request);
			dojo.connect(dojo.byId('zip2'), 'onkeyup', null, xhr_request);

			(function() {
				var keys = [
					{src:'state', evt:'onclick', dst:'state_kana'},
					{src:'city', evt:'onkeypress', dst:'city_kana'},
					{src:'address', evt:'onkeypress', dst:'address_kana'}
				],
				key;

				for (var i=keys.length-1; i<=0; --i) {
					key = keys[i];
					dojo.connect(
						dojo.byId(keys.src),
						keys.evt,
						null,
						function(evt) {
							dojo.byId(keys.dst).innerHTML = '';
							return false;
						}
					);
				}
			})();

		})();
	}
);
