/* -*- coding: utf-8-unix; indent-tabs-mode: t -*-
 *
 * (C) 2009-2010 E-Shoppy Project
 * required: jQuery v1.3
 *
 */

$(function(){
	$('#kwd').Keyword();
});

$.preloadImages = function(){
	var N = arguments.length;
	for (var i = 0; i < N; i++) {
		$('<img>').attr('src', arguments[i]);
	}
};

$.fn.Disable = function(){
	return this.each(function(){
		this.disabled = true;
	}); 
};

$.fn.Enable = function(){
	return this.each(function(){
		this.disabled = false;
	}); 
};

$.fn.Keyword = function(word){
	if (word == undefined) word = '検索キーワード';
	return this.each(function(){
		$(this).focus(function(){
			if ($(this).val() == word) $(this).css('color', '#000').val('');
		}).blur(function(){
			if ($(this).val() == '') $(this).css('color', '#666').val(word);
		}).blur();
	});
};

$.fn.StrCounter = function(options){
	return this.each(function(){
		$(this).click(function(){
			var id = $(this).attr('id').split('-');
			if (id[1] == '') return alert('No defined attribute: id="counter-***"');
			var str = $(this.form).find('input[name='+id[1]+'], textarea[name='+id[1]+']').val();
			alert('テキストは'+str.length+'文字です。');
			return false;
		});
	});
};

$.fn.Click = function(url, options){
	options = $.extend({ confirm: '' }, options);
	return this.each(function(){
		$(this).click(function(){
			if (options.confirm != '' && !confirm(options.confirm)) return false;
			location.href = url;
			return false;
		});
	});
};

$.fn.PostalSearch = function(url, options){
	options = $.extend({ toolbar: 'no',	location: 'yes', directories: 'no',	menubar: 'no',
						 scrollbars: 'yes', resizable: 'yes', width: 520, height: 400 }, options);
	var winOptions = [];
	for (var i in options) {
		winOptions.push(i+'='+options[i]);
	}
	self.name = 'mainwin';
	return this.each(function(){
		var form = $(this);
		form.find('.PostalSearch').each(function(){
			$(this).click(function(){
				var id = $(this).attr('id');
				var code = form.find('#'+id+'_code');
				var query = [];
				query.push('zip='+code.attr('name'));
				query.push('area='+form.find('#'+id+'_area').attr('name'));
				query.push('city='+form.find('#'+id+'_city').attr('name'));
				query.push('town='+form.find('#'+id+'_town').attr('name'));
				query.push('id='+code.val());
				var win = window.open(url+'?'+query.join('&'), 'postal', winOptions.toString());
				if (win) win.focus();
				return false;
			});
		});
	});
};

$.fn.PostalSearchFromCode = function(options){
	options = $.extend({ url: '', zipcode: '#zip_code', messages: '#messages',
						 target_suffix: '', target_zip: '', target_area: '',
						 target_city: '', target_town: '' }, options);
	var url = options.url;
	var zipcode = options.zipcode;
	var messages = options.messages;
	return this.each(function(){
		return $(this).click(function(){
			var form = this.form;
			var val = new String($(zipcode).val());
			if (!val.match(/^\d\d\d\d\d\d\d$/)) {
				alert('郵便番号(7桁)を入力して下さい。');
				return false;
			}
			$(form).find('input,select').Disable();
			var query = ['zip_code='+val];
			if (parent.opener != undefined) query.push('complement=1');
			$.ajax({
				type: 'GET',
				url: url+'?'+query.join('&'),
				async: true,
				cache: false,
				beforeSend: function(){
					$(messages).empty().append('郵便番号から検索しています...');
				},
				success: function(text, status){
					$(messages).empty().append(text);
					$('.PostalSearchInput').PostalSearchInput(options);
				},
				complete: function(){
					$(form).find('input,select').Enable();
				}
			});
			return false;
		});
	});
};

$.fn.PostalSearchFromArea = function(options){
	options = $.extend({ url: '', area: '#area', messages: '#messages',
					     target_suffix: '', target_zip: '', target_area: '',
						 target_city: '', target_town: '' }, options);
	var url = options.url;
	var area = options.area;
	var messages = options.messages;
	return this.each(function(){
		return $(this).change(function(){
			var form = this.form;
			$(form).find('input,select').Disable();
			var query = [];
			query.push('zip_are_id='+$(area).val());
			query.push($(this).attr('name')+'='+$(this).val());
			if (parent.opener != undefined) query.push('complement=1');
			$.ajax({
				type: 'GET',
				url: url+'?'+query.join('&'),
				async: true,
				cache: false,
				beforeSend: function(){
					$(messages).empty().append('地域から検索しています...');
				},
				success: function(text, status){
					$(messages).empty().append(text);
					$('.PostalSearchInput').PostalSearchInput(options);
				},
				complete: function(){
					$(form).find('input,select').Enable();
				}
			});
			return false;
		});
	});
};

$.fn.PostalSearchFromAreaToCity = function(options){
	options = $.extend({ url: '', city: '#city' }, options);
	var url = options.url;
	var city = options.city;
	return this.each(function(){
		return $(this).change(function(){
			var form = this.form;
			$(form).find('input,select').Disable();
			var zip_are_id = $(this).val();
			$.ajax({
				type: 'GET',
				url: url+'?zip_are_id='+zip_are_id,
				async: true,
				cache: false,
				success: function(text, status){
					try{
						eval('var data = ' + text); // JSON
					} catch(e) {
						alert(e);
						return;
					}
					var sel = $(city).get(0);
					sel.options[0] = new Option('市区町村郡', '');
					sel.length = 1;
					var N = data.length;
					for (var i = 0; i < N; i++) {
						sel.options[i+1] = new Option(data[i].label, data[i].id);
					}
					sel.length = N + 1;
				},
				complete: function(){
					$(form).find('input,select').Enable();
				}
			});
			return false;
		});
	});
};

$.fn.PostalSearchInput = function(options){
	options = $.extend({ target_suffix: '', target_zip: '', target_area: '',
						 target_city: '', target_town: '' }, options);
	if (parent.opener == undefined) return false;
	var target = $(parent.opener.document);
	var suffix = options.target_suffix;
	var zip = options.target_zip;
	var area = options.target_area;
	var city = options.target_city;
	var town = options.target_town;
	return this.each(function(){
		return $(this).click(function(){
			var p = $(this).parent();
			var zip_code = p.find('input[name=zip_code]').val();
			var zip_are_id = p.find('input[name=zip_are_id]').val();
			var zip_city_name = p.find('input[name=zip_city_name]').val();
			var zip_town_name = p.find('input[name=zip_town_name]').val();
			if (zip != "") target.find('input[name='+zip+suffix+']').val(zip_code);
			if (area != "") target.find('select[name='+area+suffix+']').val(zip_are_id);
			if (city != "") target.find('input[name='+city+suffix+']').val(zip_city_name);
			if (town != "") target.find('input[name='+town+suffix+']').val(zip_town_name).focus();
			window.close();
			parent.opener.focus();
			return false;
		});
	});
};

/*
 * パスワード作成
 *
 * 使用例:
 *
 * <script type="text/javascript">
 * <!--
 * $(function() {
 *    $('input.passgen').PassGenerator({ digit: 10 });
 * });
 * //-->
 * </script>
 *
 * <form action="/path/to" method="post">
 * パスワード1:<input name="field1" type="password" value="" size="20" maxlength="20" />
 * <input type="button" value="パスワード1作成" id="passgen-field1" class="passgen" />
 *
 * パスワード2:<input name="field2" type="password" value="" size="20" maxlength="20" />
 * <input type="button" value="パスワード2作成" id="passgen-field2" class="passgen" />
 * </form>
 *
 */
$.fn.PassGenerator = function(options){
	options = $.extend({ confirm: "次のパスワードを入力しますか？\n"+
						 "パスワードをメモしてから確認(OK)ボタンを押して下さい。",
						 chars: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-",
						 digit: 8 }, options);
	var chars = options.chars; // 使用文字
	var D = options.digit; // パスワードの桁数
	var N = chars.length;
	return this.each(function(){
		$(this).click(function(){
			var c = [];
			for (var i = 0; i < D; i++) c.push(chars.charAt(Math.floor(Math.random() * N)));
			var passwd = prompt(options.confirm, c.join(''));
			if (passwd != null && passwd != "") {
				var id = $(this).attr('id').split('-');
				$(this.form).find('input[name='+id[1]+']').val(passwd);
			}
			return false;
		});
	});
};

