var Register = Class.create();
Register.prototype = {
	initialize: function(element, options) {
		this.element = $(element);
		this.options = Object.extend({
			config: {}
		}, options || {});

		this.icons = new Array('/static/images/loading.gif', '/static/images/correct.gif');

		var validation_nodes = this.element.getElementsByTagName('input');
		this.validation_active_nodes = new Array();
		this.validateListener = this.validate.bindAsEventListener(this);

		for (var i = 0; i < validation_nodes.length; i++) {
			var validation_node = validation_nodes[i];
			var validation_rule = this.options.config[validation_nodes[i].id];
			if (validation_rule) validation_node._rule = validation_rule[0];
			else validation_node._rule = 'NORMAL';

			switch(validation_node.type) {
				case 'button':
				case 'checkbox':
				case 'radio':
					Event.observe(validation_node, 'click', this.validateListener, false);
				case 'text':
				case 'password':
					Event.observe(validation_node, 'blur', this.validateListener, false);
					this.validation_active_nodes.push(validation_node);
					break;
			}
		}
	},
	detach: function(event) {
		var validation_nodes = this.validation_active_nodes;
		for (var i = 0; i < validation_nodes.length; i++) {
			switch(validation_nodes[i].type) {
				case 'button':
				case 'checkbox':
				case 'radio':
					Event.stopObserving(validation_nodes[i], 'click', this.validationListener, false);
				case 'text':
				case 'password':
					Event.stopObserving(validation_nodes[i], 'blur', this.validationListener, false);
					break;
			}
		}
	},
	validate: function(event) {
		var event_node = Event.element(event);
		var event_node_id = event_node.id;

		switch(event_node._rule) {
			case 'EXCEPT':
				break;
			case 'NORMAL':
				this._loading(event_node_id);
				this._ajaxValidate(event_node_id);
				break;
			case 'GROUP':
				this._loading(event_node_id);
				this._ajaxValidate(event_node_id);
				break;
			case 'DUPLICAION':
				this._loading(event_node_id);
				var validation_rule = this.options.config[event_node_id];
				for (var i = 0; i < validation_rule.length; i++) {
					if(i != 0) this._loading(validation_rule[i]);
				}
				this._ajaxValidate(event_node_id);
				break;
		}
	},
	_ajaxValidate: function(event_node_id) {
		var url = 'https://www.b-pass.jp/ajax/validate';
		new Ajax.Request(url, {
			method: 'post',
			parameters: Form.serialize(this.element.id),
			onComplete: function(httpObj) {
				var validate_result = eval("(" + httpObj.responseText + ")");
				this._classify(validate_result, event_node_id);
			}.bind(this)
		})
	},
	_classify: function(validation_result, validation_id) {
		var validation_node = $(validation_id);
		switch(validation_node._rule) {
			case 'NORMAL':
				this._setErrorMessage(validation_result, validation_id);
				break;
			case 'GROUP':
				this._setErrorMessageForGroup(validation_result, validation_id);
				break;
			case 'DUPLICAION':
				this._setErrorMessage(validation_result, validation_id);
				var validation_rule = this.options.config[validation_id];
				for (var i = 0; i < validation_rule.length; i++) {
					if(i != 0) {
						this._setErrorMessage(validation_result, validation_rule[i]);
					}
				}
				break;
		}
	},
	_setErrorMessage: function(validation_result, target_node) {
		var error_node = document.getElementsByClassName('regist-error', $(target_node).parentNode)[0];
		if (validation_result[target_node]) {
			error_node.innerHTML = validation_result[target_node];
			$(target_node).style.backgroundColor = "#FFFF99";
		} else {
			this._correct(target_node);
			$(target_node).style.backgroundColor = "";
		}
	},
	_setErrorMessageForGroup: function(validation_result, target_node) {
		var error_node = document.getElementsByClassName('regist-error', $(target_node).parentNode)[0];
		if (validation_result[target_node]) {
			error_node.innerHTML = validation_result[target_node];
			var validation_rule = this.options.config[target_node];
			for (var i = 0; i < validation_rule.length; i++) {
				if(i != 0) {
					$(validation_rule[i]).style.backgroundColor = "#FFFF99";
				}
			}
		} else {
			this._correct(target_node);
			var validation_rule = this.options.config[target_node];
			for (var i = 0; i < validation_rule.length; i++) {
				if(i != 0) {
					$(validation_rule[i]).style.backgroundColor = "";
				}
			}
		}
	},
	_loading: function(event_node_id) {
		var error_node = document.getElementsByClassName('regist-error', $(event_node_id).parentNode)[0];
		error_node.innerHTML = "";

		var img = document.createElement('img');
		Element.addClassName(img, 'loading-img');
		img.setAttribute('src', this.icons[0]);
		error_node.appendChild(img);
	},
	_correct: function(event_node_id) {
		var error_node = document.getElementsByClassName('regist-error', $(event_node_id).parentNode)[0];
		error_node.innerHTML = "";

		var img = document.createElement('img');
		Element.addClassName(img, 'loading-img');
		img.setAttribute('src', this.icons[1]);
		error_node.appendChild(img);
	}
}
function setAddress(jsonData) {
	var error_node = document.getElementsByClassName('regist-error', $('regist-zipsearch').parentNode)[0];
	var loading = function(target_node, result_flag) {
		var error_node = document.getElementsByClassName('regist-error', $(target_node).parentNode)[0];
		error_node.innerHTML = "";

		if (result_flag) {
			var img = document.createElement('img');
			Element.addClassName(img, 'loading-img');
			img.setAttribute('src', '/static/images/correct.gif');
			error_node.appendChild(img);
		}
	}

	if (jsonData.zip == null) {
		$('regist-prefecture').value = ""
		$('regist-address1').value = "";
		$('regist-address2').value = "";
		$('regist-zipcode').focus();

		loading('regist-zipcode', false);
		loading('regist-prefecture', false);
		loading('regist-address1', false);
		loading('regist-address2', false);
		error_node.innerHTML = "住所を取得できませんでした。";
	} else {
		$('regist-prefecture').value = jsonData.zip.prefecture_kanji;
		$('regist-address1').value = jsonData.zip.city_kanji;
		$('regist-address2').value = jsonData.zip.address_kanji;
		$('regist-address2').focus();
		$('regist-zipcode').style.backgroundColor = "";
		$('regist-prefecture').style.backgroundColor = "";
		$('regist-address1').style.backgroundColor = "";
		error_node.innerHTML = "";

		loading('regist-zipcode', true);
		loading('regist-prefecture', true);
		loading('regist-address1', true);
		loading('regist-address2', true);
	}
	jsonpObj.removeScriptTag();
}
function searchAddress(event) {
	var error_node = document.getElementsByClassName('regist-error', $('regist-zipsearch').parentNode)[0];
	error_node.innerHTML = "";

	var img = document.createElement('img');
	Element.addClassName(img, 'loading-img');

    img.setAttribute('src', '/static/images/loading.gif');
	error_node.appendChild(img);

	var url = '/zippable/?';
//	var url = 'http://192.168.222.128:2000/?';
//	var url = 'http://192.168.251.22:2000/?';
//	var url = 'http://192.168.153.127:3000/?';
	var parameter = 'zip=' + $F('regist-zipcode');
	jsonpObj = new JSONscriptRequest(url + parameter + '&callback=setAddress');
	jsonpObj.buildScriptTag();
	jsonpObj.addScriptTag();
}
function endRegister() {
//	if (myRegistration) {
//		myRegistration.detach();
//		delete myRegistration;
//	}
	Event.stopObserving(window, 'load', initRegister, false);
//	Event.stopObserving(window, 'unload', endRegister, false);
}
function initRegister() {
	var validation_options = {
		'regist-cansel': ['EXCEPT'],
		'regist-zipsearch': ['EXCEPT'],
		'regist-year': ['GROUP', 'regist-year', 'regist-month', 'regist-day'],
		'regist-month': ['GROUP', 'regist-year', 'regist-month', 'regist-day'],
		'regist-day': ['GROUP', 'regist-year', 'regist-month', 'regist-day'],
		'regist-password': ['DUPLICAION', 'regist-repassword'],
		'regist-repassword': ['DUPLICAION', 'regist-password']
	};
	myRegistration = new Register('regist-form', { config: validation_options });

        if( $('regist-read-term') )
            $('regist-read-term').onclick = function() {
  		new Effect.toggle('regist-term', 'Blind', { duration: 0.5 });
            }
        
        if( $('regist-close-term') )
	    $('regist-close-term').onclick = function() {
		new Effect.BlindUp('regist-term', { duration: 0.5 });
	    }

        if( $('regist-zipsearch') )
	    $('regist-zipsearch').onclick = function() {
		searchAddress();
	    }
        if( $('regist-cansel') )
	    $('regist-cansel').onclick = function() {
		$('regist-form').action = "/";
	    }
        Event.observe(window, 'unload', endRegister, false);
}
Event.observe(window, 'load', initRegister, false);
