window.onload = function() {
	if (document.forms.length > 0) {
		focusFirstElement(document.forms[0]);
	}
};
function ontouch(el, color)
{
	if (typeof color == 'undefined') {
		color = '#FFE7D7';
	}
	el.onmouseover = function() {
		this.style.backgroundColor = color;
	};
	el.onmouseout = function() {
		this.style.backgroundColor = '';
	};
	el.onmouseover();
}
function openwin(url, width, height)
{
	var left = (window.screen.width - width) / 2;
	var top = 0;
	var option =
		'width='      + width  + ', ' +
		'height='     + height + ', ' +
		'left='       + left   + ', ' +
		'top='        + top    + ', ' +
		'menubar='    + 'no'   + ', ' +
		'toolbar='    + 'no'   + ', ' +
		'scrollbars=' + 'no'   + ', ' +
		'status='     + 'yes'  + ', ' +
		'resizable='  + 'yes';

	var jswin = window.open(url, 'jswin', option);

	window.onunload = function() {
		if (!jswin.closed) {
			jswin.close();
		}
		this.onunload = null;
	};
}
function paste(textarea, begin_str, close_str)
{
	if ('selection' in document) {
		textarea.focus();

		var range = document.selection.createRange();
		var str = begin_str + range.text + close_str;
		range.text = str;

		var t_range = textarea.createTextRange();
		t_range.moveToPoint(range.offsetLeft, range.offsetTop);
		// IEが改行を1文字と認識する対策
		var count = str.split('\n').length - 1;
		t_range.moveStart('character', count - str.length);
		t_range.select();
	} else if ('selectionStart' in textarea) {
		var scrl_y = textarea.scrollTop;
		var input = textarea.value;
		var s_pos = textarea.selectionStart;
		var e_pos = textarea.selectionEnd;

		textarea.selectionStart += close_str.length;
		textarea.value =
			input.substr(0, s_pos) +
			begin_str +
			input.substr(s_pos, e_pos - s_pos) +
			close_str +
			input.substr(e_pos);

		e_pos += begin_str.length + close_str.length;
		textarea.setSelectionRange(s_pos, e_pos);
		textarea.scrollTop = scrl_y;
	} else {
		textarea.value += begin_str + close_str;
	}
	textarea.focus();
}
function pasteTag(id, tagname)
{
	var textarea = document.getElementById(id);
	var begin_tag = '<'  + tagname + '>';
	var close_tag = '</' + tagname + '>';
	paste(textarea, begin_tag, close_tag);
}
function focusFirstElement(form)
{
	var elems = form.elements;
	for (var i = 0, l = elems.length; i < l; ++i) {
		var el = elems[i];
		var name = el.tagName;
		if (name == 'INPUT' && el.value == '') {
			if (el.type == 'text' || el.type == 'password') {
				el.focus();
				return el;
			}
		} else if (name == 'SELECT' && el.value == '') {
			el.focus();
			return el;
		} else if (name == 'TEXTAREA') {
			el.focus();
			return el;
		}
	}
	return null;
}
function clearInput(id)
{
	var el = document.getElementById(id);
	el.value = '';
	el.focus();
}
function resizeTextarea(textarea, max_rows)
{
	var min_rows = textarea.rows;
	if (typeof max_rows == 'undefined') {
		max_rows = min_rows * 3;
	}
	var resize = function() {
		var match = textarea.value.match(/\r\n?|\n/g);
		var lines = match == null ? 1 : match.length + 2;
		textarea.rows = Math.max(min_rows, Math.min(lines, max_rows));
	};
	textarea.onkeyup = function(ev) {
		ev = ev || window.event;
		var key = ev.keyCode;
		var ctrlkey = ev.ctrlKey && !('oncut' in this);
		// BackSpace Enter Delete
		if (key == 8 || key == 13 || key == 46 || ctrlkey) {
			resize();
		}
	};
	if ('oncut' in textarea) {
		textarea.oncut = textarea.onpaste = function() {
			// oncut -> 切取 -> resize
			setTimeout(resize, 1);
		};
	}
	textarea.onfocus = textarea.onmouseup = resize;
	textarea.onfocus();
}
function validate(form)
{
	var manager = new ValidatorManager();
	return manager.execute(form);
}
function ValidatorManager()
{
	var REGEXP_MAIL = /^[a-z\d\-_.+]+@([a-z\d\-]+\.)+[a-z]{2,7}$/;
	var REGEXP_URL = /^(https?|ftp):\/\/([a-z\d\-]+\.)+[a-z]{2,7}[\w!#$%&\'()*+,\-.\/:;=?@~]*$/;
	var REGEXP_PASS = /^[a-z\d]+$/i;
	var REGEXP_NUMBER = /^[1-9]\d*$/;

	this.rules = {
		writeform: {
			title: {
				name: '題名',
				required: true
			},
			name: {
				name: '名前',
				required: true
			},
			mail: {
				name: 'メールアドレス',
				required: false,
				regexp: REGEXP_MAIL
			},
			url: {
				name: 'URL',
				filter: function(s) {return s == 'http://' ? '' : s;},
				required: false,
				regexp: REGEXP_URL
			},
			mes: {
				name: '本文',
				required: true
			},
			file: {
				name: '画像',
				required: false,
				required_error: 'を選択して下さい。'
			},
			pass: {
				name: '編集キー',
				required: false,
				min: 4,
				regexp: REGEXP_PASS,
				regexp_error: 'は半角英数字にして下さい。'
			}
		},
		editform: {
			id: {
				name: '記事番号',
				required: true,
				regexp: REGEXP_NUMBER
			},
			pass: {
				name: '編集キー',
				required: true
			}
		},
		mailform: {
			title: {
				name: '題名',
				required: true
			},
			name: {
				name: '名前',
				required: true
			},
			mail: {
				name: 'メールアドレス',
				required: true,
				regexp: REGEXP_MAIL
			},
			mes: {
				name: '本文',
				required: true
			}
		},
		searchform: {
			word: {
				name: 'キーワード',
				required: true
			}
		},
		urlform: {
			account: {
				name: 'アカウント名',
				required: true,
				regexp: /^[a-z\d\-_.+]+$/
			}
		}
	};

	this.execute = function(form) {
		var validator = new Validator();
		var id = form.attributes.id.value;
		var rules = this.rules[id];
		var msg_list = [];
		var pair_list = [];

		for (var name in rules) {
			if (!(name in form)) {
				continue;
			}
			var el = form[name];
			var result = validator.execute(el.value, rules[name]);
			if (result != true) {
				msg_list.push(result);
				var is_error = true;
			} else {
				var is_error = false;
			}
			pair_list.push([el, is_error]);
		}

		if (msg_list.length == 0) {
			return true;
		}

		alert(msg_list.join('\n'));
		var focused = false;
		for (var i = 0, l = pair_list.length; i < l; ++i) {
			el = pair_list[i][0];
			is_error = pair_list[i][1];
			if (is_error) {
				if (focused == false) {
					focused = true;
					el.focus();
				}
				el.style.backgroundColor = '#FFE7D7';
			} else {
				el.style.backgroundColor = '';
			}
		}
		return false;
	};
}
function Validator()
{
	this.input;

	this.execute = function(input, rule) {
		this.input = input;
		for (var name in rule) {
			if (typeof this[name] != 'function') {
				continue;
			}
			var result = this[name](rule[name]);
			if (result == true) {
				return true;
			} else if (typeof result == 'string') {
				var err_name = name + '_error';
				if (err_name in rule) {
					result = rule[err_name];
				}
				return rule.name + result;
			}
		}
		return true;
	};
	this.filter = function(func) {
		if (typeof func == 'function') {
			this.input = func(this.input);
		}
	};
	this.required = function(required) {
		if (this.input == '') {
			if (required) {
				return 'を入力して下さい。';
			}
			return true;
		}
	};
	this.min = function(min) {
		if (this.input.length < min) {
			return 'は' + min + '文字以上にして下さい。';
		}
	};
	this.max = function(max) {
		if (this.input.length > max) {
			return 'は' + max + '文字以下にして下さい。';
		}
	};
	this.regexp = function(regexp) {
		if (!regexp.test(this.input)) {
			return 'が正しくありません。';
		}
	};
}
