$(function(){
	form.start();
});

form = {

	phpScript: './ajax.php',

	addressId: [],

	post: {},

	start: function(){
		this.httpAjax({
			post: {
				ajax: 'setParam'
			},
			func: function(res){
				if(res.status == 'ok'){
					form.id = res.id;
					form.funcVals = res.funcVals;
					form.statusPos = res.statusPos;
					form.welcomeMsg = res.welcomeMsg;
					form.tryAgainMsg = res.tryAgainMsg;
					form.confirmButtonStr = res.confirmButtonStr;
					form.imgDir = res.imgDir;
					form.zipJsonDir = res.zipJsonDir;
					if(!form.chkIe()){
						form.chkValBlur();
						form.chkValClick();
						form.chkValChange();
					}
					zip2address.start();
					form.confirmEvent();
					if(res.chkAll.length){
						form.setChkAllButton(res.chkAll);
					}
					$('input[type="text"]:eq(0)', '#' + form.id).focus();
				}else{
					alert(res.status);
				}
			}
		});
	},

	setChkAllButton: function(_chkALl){
		var _i;
		for(_i = 0; _i < _chkALl.length; _i++){
			if(_chkALl[_i].pos == 'before_inputs'){
				$(_chkALl[_i].button).insertBefore($('#' + _chkALl[_i].name));
			}else if(_chkALl[_i].pos == 'after_inputs') {
				$(_chkALl[_i].button).insertAfter($('#' + _chkALl[_i].name));
			}
		}
		$('.chk-all-button > a', '#' + form.id).toggle(
			function(ev){
				ev.preventDefault();
				$(this).parent().siblings('.form').contents('label').children().attr('checked', true);
				var _to = $(this).attr('rel');
				var _current = $(this).attr('title');
				$(this).html('<span>' + _to + '</span>').attr('title', _to).attr('rel', _current);
				$(this).css({backgroundPosition:'left bottom'});
				form.chkVal($(this).parent().siblings('.form').attr('id'));
			},
			function(ev){
				ev.preventDefault();
				$(this).parent().siblings('.form').contents('label').children().attr('checked', false);
				var _to = $(this).attr('rel');
				var _current = $(this).attr('title');
				$(this).html('<span>' + _to + '</span>').attr('title', _to).attr('rel', _current);
				$(this).css({backgroundPosition:'left top'});
				form.chkVal($(this).parent().siblings('.form').attr('id'));
			}
		);
	},

	confirmButton: function(){
		this.confirmButtonDisable();
		this.getAllVals();
		var _tid = setInterval(function(){
			if(!$('.chk-proceeding').length){
				clearInterval(_tid);
				if($('.alert-top:visible').length){
					$('#' + form.id + '-msg').html(form.tryAgainMsg);
					form.confirmButtonEnable();
					$(document).scrollTop(0);
				}else{
					form.httpAjax({
						post: form.post,
						func: function(res){
							if(res.status == 'ok'){
								$('#' + form.id).fadeOut('fast', function(){
									$(this).contents().wrapAll('<div id="form-wrapped" style="display:none"></div>');
									$(this).append(res.dom).show();
									$('#' + form.id + '-msg').html(res.msg);
									form.sendEvent();
									form.backEvent();
									$(document).scrollTop(0);
								});
							}else if(res.status == 'cookieDisabled'){
								$('#' + form.id + '-msg').html(res.msg);
								$('.status', '#' + form.id).empty();
								form.confirmButtonEnable();
								$(document).scrollTop(0);
								alert('Sorry.. your browser does not accept cookie.');
							}else{
								$('.status', '#' + form.id).empty();
								form.confirmButtonEnable();
								$(document).scrollTop(0);
								alert(res.status);
							}
						}
					});
				}
			}
		}, 500);
	},

	confirmButtonDisable: function(){
		$('#form-confirm').text('proceeding ...').attr('disable', true).css({color:'#434343', backgroundPosition:'left bottom', cursor:'default'});
	},

	confirmButtonEnable: function(){
		$('#form-confirm', '#' + form.id).text(form.confirmButtonStr).removeAttr('disable').css({color:'#000000', backgroundPosition:'left top', cursor:'pointer'}).hover(function(){
			$(this).css({backgroundPosition:'left bottom'});
		},function(){
			$(this).css({backgroundPosition:'left top'});
		});
	},

	sendButton: function(){
		$('#' + form.id).slideUp('fast', function(){
			$(document).scrollTop(0);
			$('#' + form.id + '-msg').html('<p>Sending email ...</p><p><img src="' + form.imgDir + '/ajax-loader-big.gif" /></p>');
			form.httpAjax({
				post: {
					ajax: 'send'
				},
				func: function(res){
					if(res.status == 'ok'){
						$('#' + form.id).empty().remove();
						$('#' + form.id + '-msg').fadeOut('fast', function(){
							$(this).html(res.msg).fadeIn('fast');
						});
					}else{
						alert(res.status);
					}
				}
			});
		});
	
	},

	backEvent: function(){
		$('.back-button', '#' + form.id).click(function(ev){
			ev.preventDefault();
			$('#confirm').fadeOut('fast', function(){
				$(this).empty().remove();
				$('#form-wrapped').replaceWith($('#form-wrapped').contents());			
				$('#form-msg').html(form.welcomeMsg);			
				form.confirmButtonEnable();
				$('.status', '#' + form.id).empty();
				$(document).scrollTop(0);
			});
		});
	},


	sendEvent: function(){
		$('#' + form.id).submit(function(ev){
			ev.preventDefault();
			form.sendButton();		
		});
		$('#form-send', '#' + form.id).click(function(ev){
			ev.preventDefault();
			form.sendButton();		
		});
	},
	

	getAllVals: function(){
		var _name, _val;
		form.post = { ajax: 'confirm' };
		$('input:visible, textarea:visible, select:visible', '#' + form.id).each(function(){
			_name = $(this).attr('name').replace(/\[\]$/, '');
			_val = form.getVal(_name);
			_val = typeof _val == 'object' ? _val.join('|||') : _val;
			form.post[_name] = _val;
			form.chkVal(_name);
		});
	},

	confirmEvent: function(){
		$('#' + form.id).submit(function(ev){
			ev.preventDefault();
			form.confirmButton();		
		});
		$('#form-confirm', '#' + form.id).click(function(ev){
			ev.preventDefault();
			form.confirmButton();		
		});
	},

	chkValClick: function(){
		$('input[type="checkbox"], input[type="radio"]', '#' + form.id).click(function(){
			_name = $(this).attr('name').replace(/\[\]$/, '');
			form.chkVal(_name);
		});
	},

	chkValChange: function(){
		$('select', '#' + form.id).change(function(){
			form.chkVal($(this).attr('name'));
		});
	},

	chkValBlur: function(){
		$('input[type="text"], textarea', '#' + form.id).blur(function(){
			form.chkVal($(this).attr('name'));
		});
	},

	chkVal: function(_name){
		var _statusPos = form.statusPos[_name] ? form.statusPos[_name] : _name;
		$('span[class="status"]', '#' + _statusPos).html('<img src="' + form.imgDir + '/ajax-loader-small.gif" class="chk-proceeding" />');
		var _val = form.getVal(_name);
		_val = typeof _val == 'object' ? _val.join('|||') : _val;
		var _post = {
			ajax: 'chkVal',
			name: _name,
			val: _val
		};
		var _len, _i;
		if(form.funcVals[_name]){
			_post[_name] = _val;
			var _funcVals = new Array;
			var _temp;
			_len = form.funcVals[_name].length;			
			for(_i = 0; _i < _len; _i++){
				if(form.funcVals[_name][_i] != _name){
					_temp = form.getVal(form.funcVals[_name][_i]);
					_post[form.funcVals[_name][_i]] = typeof _temp == 'object' ? _temp.join('|||') : _temp;
				}
			}
		}else{
			_len = 1;
			_i = 1;
		}
		var _tid = setInterval(function(){
			if(_len = _i){
				clearInterval(_tid);
				form.httpAjax({
					post: _post,
					func: function(res){
						if(res.status == 'ok'){
							if(res.validity == 'valid'){
								form.valid(_name);
								$('#' + _name).removeClass('invalid-val');
								_name = _name.replace(/_[0-9]+$/, '');
								$('#' + _name + '-block').removeClass('invalid');
							}else{
								form.oops(_name, res.alert);
								$('#' + _name).addClass('invalid-val');
								_name = _name.replace(/_[0-9]+$/, '');
								$('#' + _name + '-block').addClass('invalid');
							}
						}else{
							alert(res.status);
						}
					}
				});
			}
		}, 100);
	},

	validEmpty: function(_name){
		var _statusPos = form.statusPos[_name] ? form.statusPos[_name] : _name;
		$('span[class="status"]', '#' + _statusPos).empty();
	},

	valid: function(_name){
		var _statusPos = form.statusPos[_name] ? form.statusPos[_name] : _name;
		$('span[class="status"]', '#' + _statusPos).html('<img src="' + form.imgDir + '/ok.gif" />');
	},

	oops: function(_name, _error){
		var _statusPos = form.statusPos[_name] ? form.statusPos[_name] : _name;
		$('span[class="status"]', '#' + _statusPos)
		.html('<span class="alert-top"></span><span class="alert-bottom"><span>' + _error + '</span></span>');
	},

	httpAjax: function(obj){
		$.ajax({
			url: this.phpScript,
			cache: false,
			type: 'POST',
			dataType: 'json',
			data: obj.post,
			error: function(XMLHttpRequest, textStatus, errorThrown){
//				alert("ERROR!\n\nXMLHttpRequest: " + XMLHttpRequest + "\ntextStatus: " + textStatus + "\nerrorThrown: " + errorThrown);
			},
			success: function(res){
				obj.func(res);
			}
		});
	},

	getVal: function(_name){
		var _e;
		_e = $('input[type="text"][name="' + _name + '"]');
		if(_e.length == 0){
			_e = $('textarea[name="' + _name + '"]');
			if(_e.length == 0){
				_e = $('option:selected', 'select[name="' + _name + '"]');
				if(_e.length == 0){
					_e = $('input[type="radio"][name="' + _name + '"]:checked');
					if(_e.length == 0){
						_e = $('input[type="hidden"][name="' + _name + '"]');
					}
				}
			}
		}
		if(_e.length > 0){
			return _e.val();
		}else{
			_name = _name.replace(/\[\]$/, '');
			return $('input[type="checkbox"][name="' + _name + '[]"]')
			.map(function(){ if($(this).attr('checked')){ return $(this).val(); } })
			.get();
		}
	},

	obj2str: function(obj, space){
		var lf = "\n";
		space = ((space == undefined) ? ' ' : space.replace(" ", "    "));
		var str = "";
		for(key in obj){
			str += space;
			if(typeof(obj[key]) != "object"){
				str += key + ":" + obj[key] + lf;
			}else{
				if(isNaN(parseInt(key))){
					str += key + ":Object()" + lf;
				}else{
					str += "[" + key + "]" + lf;
				}
				str += this.obj2str(obj[key], space);
			}
		}
		return str;
	},

	chkIe: function(){
		if($.browser.msie && $.browser.version.match(/^6/)){
			return true;
		}else{
			return false;
		}
	}

},

zip2address = {

	prefMap: [
    null,       '北海道',   '青森県',   '岩手県',   '宮城県',
    '秋田県',   '山形県',   '福島県',   '茨城県',   '栃木県',
    '群馬県',   '埼玉県',   '千葉県',   '東京都',   '神奈川県',
    '新潟県',   '富山県',   '石川県',   '福井県',   '山梨県',
    '長野県',   '岐阜県',   '静岡県',   '愛知県',   '三重県',
    '滋賀県',   '京都府',   '大阪府',   '兵庫県',   '奈良県',
    '和歌山県', '鳥取県',   '島根県',   '岡山県',   '広島県',
    '山口県',   '徳島県',   '香川県',   '愛媛県',   '高知県',
    '福岡県',   '佐賀県',   '長崎県',   '熊本県',   '大分県',
    '宮崎県',   '鹿児島県', '沖縄県'
	],

	start: function(){
		var _i, _name_1, _name_2, _name_3, _name_1Val, _name_2Val;
		if(form.addressId && form.addressId.length){
			for(_i = 0; _i < form.addressId.length; _i++){
				_name_1 = form.addressId[_i] + '_1';
				_name_2 = form.addressId[_i] + '_2';
				_name_3 = form.addressId[_i] + '_3';
				$('<p><button type="button" class="search-address">住所を検索</button></p>')
				.insertAfter($('.description', '#' + form.addressId[_i] + '-block')).click(function(){
					zip2address.ajax(
						$('input[type="text"][name="' + _name_1 + '"]',
						'#' + form.id).val(), $('input[type="text"][name="' + _name_2 + '"]',
						'#' + form.id).val(), _name_3
					);
				});
				$('input[type="text"][name="' + _name_1 + '"]', '#' + form.id).keyup(function(){
					_name_1Val = $(this).val();
					if(_name_1Val.match(/^[0-9]{0,2}$/)){
						form.validEmpty(_name_1);
						form.validEmpty(_name_3);
						$('input[type="text"][name="' + _name_3 + '"]', '#' + form.id).val('');
					}else if(_name_1Val && !_name_1Val.match(/^[0-9]+$/)){
						form.oops(_name_2, '半角数字のみ入力してください。');
						form.validEmpty(_name_3);
						$('input[type="text"][name="' + _name_3 + '"]', '#' + form.id).val('');
					}else{
						_name_2Val = $('input[type="text"][name="' + _name_2 + '"]', '#' + form.id).val();
						if(_name_2Val.match(/^[0-9]{4}$/) && _name_1Val.match(/^[0-9]{3}$/)){
							form.valid(_name_2);
							zip2address.ajax(_name_1Val, _name_2Val, _name_3);
						}
					}
				});
				$('input[type="text"][name="' + _name_2 + '"]', '#' + form.id).keyup(function(){
					_name_2Val = $(this).val();
					if(_name_2Val.match(/^[0-9]{0,3}$/)){
						form.validEmpty(_name_2);
						form.validEmpty(_name_3);
						$('input[type="text"][name="' + _name_3 + '"]', '#' + form.id).val('');
					}else if(_name_2Val && !_name_2Val.match(/^[0-9]+$/)){
						form.oops(_name_2, '半角数字のみ入力してください。');
						form.validEmpty(_name_3);
						$('input[type="text"][name="' + _name_3 + '"]', '#' + form.id).val('');
					}else{
						_name_1Val = $('input[type="text"][name="' + _name_1 + '"]', '#' + form.id).val();
						if(_name_2Val.match(/^[0-9]{4}$/) && _name_1Val.match(/^[0-9]{3}$/)){
							form.valid(_name_2);
							zip2address.ajax(_name_1Val, _name_2Val, _name_3);
						}
					}
				});
			}
		}
	},

	ajax: function(_zip1, _zip2, _address){
		$.getJSON(
			form.zipJsonDir + '/zip-' + _zip1 + '.json',
			function(json){
				var _val;
				var _zip = _zip1 + _zip2;
				if(json[_zip]){
					_val = zip2address.prefMap[json[_zip][0]] + json[_zip][1] + json[_zip][2];
					form.valid(_address);
				}else{
					_val = '';
					form.validEmpty(_address);
				}
				$('input[type="text"][name="' + _address + '"]', '#' + form.id).val(_val);
			}
		);
	}

}
