/******************************************************************************
 * フォーム
 */

function PheatherForm() {
	this.initialize.apply(this, arguments);
}

PheatherForm.id = function(object, method) {
	return object + '_' + method;
}

PheatherForm.name_class = function(object) {
	return object + '_form_name';
}

PheatherForm.value_class = function(object) {
	return object + '_form_value';
}

PheatherForm.error_value_class = function(object) {
	return object + '_form_error_value';
}

PheatherForm.variable_id = function(object, method) {
	return object + '_' + method + '_variable';
}

PheatherForm.static_id = function(object, method) {
	return object + '_' + method + '_static';
}

PheatherForm.confirm_id = function(object) {
	return object + '_form_confirm_message';
}

PheatherForm.retry_id = function(object) {
	return object + '_form_retry_button';
}

PheatherForm.prototype = {
	initialize: function(id, define) {
		this._id = id;
		this._define = define;
		this._mode = 'form';
		
		this._errors = [];
		
		
		if (this._define.required_message == null) {
			this._define.required_message = '';
		}
		if (this._define.empty_message == null) {
			this._define.empty_message = 'が空です';
		}
		if (this._define.invalidated_message == null) {
			this._define.invalidated_message = 'が不正です';
		}
		if (this._define.confirm_message == null) {
			this._define.confirm_message = 'よろしいですか?';
		}
		if (this._define.error_color == null) {
			this._define.error_color = 'red';
		}
		
		$(this._id).innerHTML += this.render();
		this.variable_mode();
		$(this._define.object + '_form').form_object = this;
		$(this._define.object + '_form').onsubmit = this.submit;
		
		$(PheatherForm.retry_id(this._define.object)).form_object = this;
		$(PheatherForm.retry_id(this._define.object)).onclick = this.retry;
	}, 
	
	render: function() {
		var row = null;
		var result = '';
		
		result += '<form ';
		
		result += 'id="' + this._define.object + '_form" ';
		result += 'name="' + this._define.object + '_form" ';
		result += 'action="' + this._define.action + '" ';
		result += 'method="' + this._define.method + '" ';
		result += 'class="inputform" ';
		if (this._define.multipart) {
			result += 'enctype="multipart/form-data"';
		}
		
		result += '>';
		result += '<div id="' + PheatherForm.confirm_id(this._define.object) + '"></div>';
		
		result += '<table>';
			
		if (this._define.rows != null) {
			for (i = 0; i < this._define.rows.length; i++) {
				row = this._define.rows[i];
				
				result += '<tr>';
				
				if (row.require != null && row.require == true) {
					result += '<th class="required"><div class="' + PheatherForm.name_class(this._define.object) + '">' + label_tag(this._define.object, row.method, row.label) + this._define.required_message + '</th>';
				}
				else {
					result += '<th><div class="' + PheatherForm.name_class(this._define.object) + '">' + label_tag(this._define.object, row.method, row.label) + '</th>';
				}
				
				result += '<td><div class="' + PheatherForm.value_class(this._define.object) + '" style="padding: 3px 0;">';
				result += '<span id="' + PheatherForm.variable_id(this._define.object, row.method) + '">';
				switch (row.type) {
					case 'text': 
						result += text_field(this._define.object, row.method, row.options);
						break;
					case 'textarea': 
						result += text_area(this._define.object, row.method, row.options);
						break;
					case 'check': 
						result += check_box(this._define.object, row.method, row.options);
						break;
					case 'select': 
						result += select(this._define.object, row.method, row.choices, row.options);
						break;
				}
				result += '</span>';
				
				result += '<span id="' + PheatherForm.static_id(this._define.object, row.method) + '">' + get_object_method(this._define.object, row.method) + '</span>';
				
				result += '</div></td>';
				
				result += '</tr>';
			}
		}
		
		result += '</table>';
		
		result += '<div id="' + this._define.object + '_form_button" class="submit">';
		result += '<span id="' + PheatherForm.retry_id(this._define.object)	 + '">' + button_tag(this._define.retry_message) + '</span>';
		result += '&nbsp;&nbsp;&nbsp;&nbsp;';
		result += submit_tag(this._define.submit);
		result += '</div>';
		
		result += '</form>';
		
		return result;
	}, 
	
	variable_mode: function() {
		var message = '';
		var row = null;
		
		for (i = 0; i < this._define.rows.length; i++) {
			row = this._define.rows[i];
			
			Element.show(PheatherForm.variable_id(this._define.object, row.method));
			Element.hide(PheatherForm.static_id(this._define.object, row.method));
		}
		
		Element.hide(PheatherForm.retry_id(this._define.object));
		
		if (this._errors.length > 0) {
			message += '<ul>';
			for (i = 0; i < this._errors.length; i++) {
				message += '<li>' + this._errors[i] + '</li>';
			}
			message += '</ul>';
		}
		
		$(PheatherForm.confirm_id(this._define.object)).innerHTML = message;
		//Element.hide(PheatherForm.confirm_id(this._define.object));
	}, 
	
	static_mode: function() {
		var row = null;
		
		for (i = 0; i < this._define.rows.length; i++) {
			row = this._define.rows[i];
			Element.hide(PheatherForm.variable_id(this._define.object, row.method));
			Element.show(PheatherForm.static_id(this._define.object, row.method));
		};
		
		Element.show(PheatherForm.retry_id(this._define.object));
		
		$(PheatherForm.confirm_id(this._define.object)).innerHTML = this._define.confirm_message;
		//Element.show(PheatherForm.confirm_id(this._define.object));
	}, 
	
	validate: function() {
		var row = null;
		var value = null;
		var option = null;
		var re = null;
		var result = false;
		
		this._errors = [];
		
		for (i = 0; i < this._define.rows.length; i++) {
			row = this._define.rows[i];
			
			value = Form.Element.getValue(PheatherForm.id(this._define.object, row.method));
			
			$(PheatherForm.variable_id(this._define.object, row.method)).parentNode.className = PheatherForm.value_class(this._define.object);
			// $(PheatherForm.variable_id(this._define.object, row.method)).parentNode.setStyle({ 'border': 'none' });
			
			if (row.require != null && row.require == true) {
				if (value != null && value.length == 0) {
					this._errors.push(row.label + this._define.empty_message);
					$(PheatherForm.variable_id(this._define.object, row.method)).parentNode.className = PheatherForm.error_value_class(this._define.object);
					// $(PheatherForm.variable_id(this._define.object, row.method)).parentNode.className = 'error_field';
					// $(PheatherForm.variable_id(this._define.object, row.method)).parentNode.setStyle({ 'border': '2px solid ' + this._define.error_color });
				}
			}
			
			if (row.validate != null && value != null && value.length > 0) {
				switch (row.validate) {
					case 'alpha': 
						re = /^[a-z\s]+$/i
						if (!re.test(value)) {
							this._errors.push(row.label + this._define.invalidated_message);
						}
						break;
					case 'number': 
						if (!/^[0-9]+$/.test(value)) {
							this._errors.push(row.label + this._define.invalidated_message);
						}
						break;
					case 'kana': 
						re = /^[ァ-ン　\s]+$/i
						if (!re.test(value)) {
							this._errors.push(row.label + this._define.invalidated_message);
						}
						break;
					case 'hiragana': 
						re = /^[ぁ-ん　\s]+$/i
						if (!re.test(value)) {
							this._errors.push(row.label + this._define.invalidated_message);
						}
						break;
					case 'email': 
						if (!/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.([a-z]){2,4})$/.test(value)) {
							this._errors.push(row.label + this._define.invalidated_message);
						}
						break;
					case 'telephone': 
						if (!/^[0-9]+\-[0-9]+\-[0-9]+$/.test(value)) {
							this._errors.push(row.label + this._define.invalidated_message);
						}
						break;
				}
			}
			
			switch (row.type) {
				case 'text': 
					$(PheatherForm.static_id(this._define.object, row.method)).innerHTML = value;
					break;
				case 'textarea': 
					$(PheatherForm.static_id(this._define.object, row.method)).innerHTML = value.replace('\n', '<br />');
					break;
				case 'check': 
					if (value) {
						$(PheatherForm.static_id(this._define.object, row.method)).innerHTML = 'はい';
					}
					else {
						$(PheatherForm.static_id(this._define.object, row.method)).innerHTML = 'いいえ';
					}
					break;
				case 'select': 
					options = $(PheatherForm.id(this._define.object, row.method)).options;
					$(PheatherForm.static_id(this._define.object, row.method)).innerHTML = options[options.selectedIndex].text;
					break;
			}
		};
		
		if (this._errors.length == 0) {
			return true;
		}
		else {
			return false;
		}
	}, 
	
	retry: function() {
		this.form_object._mode = 'form';
		this.form_object.variable_mode();
	}, 
	
	submit: function() {
		var result = false;
		
		this.form_object.message = '';
		if (this.form_object._mode == 'form') {
			if (this.form_object.validate()) {
				this.form_object._mode = 'static';
				this.form_object.static_mode();
			}
			else {
				this.form_object.variable_mode();
				location.href = '#' + this.form_object._define.object + '_form';
			}
		}
		else {
			if (this.form_object.validate()) {
				define = this.form_object._define;
				postBody = 'object=' + define.object;
				postBody += '&webmaster=' + define.webmaster;
				postBody += '&from=' + define.from;
				postBody += '&subject=' + define.subject;
				postBody += '&mail_template=' + define.mail_template;
				postBody += '&complete_template=' + define.complete_template;
				
				for(i = 0; i < define.rows.length; i++) {
					row = define.rows[i];
					value = Form.Element.getValue(PheatherForm.id(define.object, row.method));
					postBody += '&' + row.method + '=' + value;
				}
				new Ajax.Updater(define.object, define.action, { method: define.method, parameters: postBody });
				result = false;
			}
			else {
				this.form_object._mode = 'form';
				this.form_object.variable_mode();
				location.href = '#' + this.form_object._define.object + '_form';
			}
		}
		
		return result;
	}
}
