function openwin(url, w, h, scroll)
{
	var x = (window.screen.width - w) / 2;
	var y = 0;
	var option =
		'width='  + w + ', ' +
		'height=' + h + ', ' +
		'left='   + x + ', ' +
		'top='    + y + ', ' +
		'menubar=no, toolbar=no, scrollbars=' + scroll + ', status=yes, resizable=yes';

	var jswin = window.open(url, 'jswin', option);

	window.onunload = function()
	{
		if (!jswin.closed) {
			jswin.close();
		}
		this.onunload = null;
	};
}
function ontouch(elem, color)
{
	if (typeof color === 'undefined') {
/*
		var color = '#FFE7D7';
*/
	}
	elem.onmouseover = function()
	{
		this.style.backgroundColor = color;
	};
	elem.onmouseout = function()
	{
		this.style.backgroundColor = '';
	};
	elem.onmouseover();
}
function pasteTag(id, tagname)
{
	var textarea = document.getElementById(id);
	var begin_tag = '<'  + tagname + '>';
	var close_tag = '</' + tagname + '>';
	paste(textarea, begin_tag, close_tag);
}
function paste(textarea, begin_str, close_str)
{
	if (typeof document.selection !== 'undefined') {
		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 (typeof textarea.selectionStart !== 'undefined') {
		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 focusInput(elems)
{
	var count = elems.length;
	var i = 0;
	while (i < count) {
		var elem = elems[i];
		var name = elem.tagName;
		if (name === 'INPUT') {
			var type = elem.type;
			if (type === 'text' || type === 'password') {
				if (elem.value === '') {
					elem.focus();
					return elem;
				}
			}
		} else if (name === 'TEXTAREA') {
			elem.focus();
			return elem;
		}
		++i;
	}
	return null;
}
function clearInput(id)
{
	var elem = document.getElementById(id);
	elem.value = '';
	elem.focus();
}
function resizeTextarea(ev, min_rows)
{
	if (ev.type == 'keyup') {
		var key = ev.keyCode;
		// BS Ent Ctrl Del
		if (key != 8 && key != 13 && key != 17 && key != 46) {
			return;
		}
	}
	var textarea = ev.target || ev.srcElement;
	var match = textarea.value.match(/\r\n?|\n/g);
	var lines = match == null ? 1 : match.length + 2;
	if (typeof min_rows == 'undefined') {
		min_rows = 10;
	}
	var rows;
	rows = Math.max(min_rows, lines);
	rows = Math.min(rows, min_rows * 3);
	textarea.setAttribute('rows', rows);
}
window.onload = function()
{
	if (document.forms.length === 0) {
		return;
	}

	/*@cc_on
	var doc = document;
	eval('var document = doc;');
	@*/

	focusInput(document.forms[0].elements);

	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*$/;

	var form, rules;
	if ((form = document.getElementById('writeform')) !== null) {
		rules = {
			'title':
				{
					'name'    : '題名',
					'required': true
				},
			'name':
				{
					'name'    : '名前',
					'required': true
				},
			'mail':
				{
					'name'    : 'メールアドレス',
					'required': false,
					'regexp'  : REGEXP_MAIL
				},
			'mail2':
				{
					'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
				},
			'pass':
				{
					'name'        : '編集キー',
					'required'    : false,
					'min'         : 4,
					'regexp'      : REGEXP_PASS,
					'regexp_error': 'は半角英数字にして下さい。'
				}
		}
	} else if ((form = document.getElementById('editform')) !== null) {
		rules = {
			'id':
				{
					'name'    : '記事番号',
					'required': true,
					'regexp'  : REGEXP_NUMBER
				},
			'pass':
				{
					'name'    : '編集キー',
					'required': true
				}
		};
	} else if ((form = document.getElementById('mailform')) !== null) {
		rules = {
			'title':
				{
					'name'    : '題名',
					'required': true
				},
			'name':
				{
					'name'    : '名前',
					'required': true
				},
			'mail':
				{
					'name'    : 'メールアドレス',
					'required': true,
					'regexp'  : REGEXP_MAIL
				},
			'mail2':
				{
					'name'    : 'メールアドレス2',
					'required': true,
					'regexp'  : REGEXP_MAIL
				},
			'mes':
				{
					'name'    : '本文',
					'required': true
				}
		};
	} else if ((form = document.getElementById('searchform')) !== null) {
		rules = {
			'word':
				{
					'name'    : 'キーワード',
					'required': true
				}
		};
	} else if ((form = document.getElementById('urlform')) !== null) {
		rules = {
			'account':
				{
					'name'    : 'アカウント名',
					'required': true,
					'regexp'  : /^[a-z\d\-_.+]+$/
				}
		};
	} else if ((form = document.getElementById('lostform')) !== null) {
		rules = {
			'mail':
				{
					'name'    : 'メールアドレス',
					'required': true,
					'regexp'  : REGEXP_MAIL
				}
		};
	}

	if (form !== null) {
		form.onsubmit = function()
		{
			var manager = new ValidatorManager(form, rules);
			return manager.execute();
		};
	}
};
function ValidatorManager(form, rules)
{
	var validator = new Validator();

	this.execute = function()
	{
		var is_error;
		var message_list = [];
		var elem_list = [];
		for (var name in rules) {
			if (typeof form[name] === 'undefined') {
				continue;
			}

			var elem = form[name];
			var result = validator.execute(elem.value, rules[name]);
			if (result !== true) {
				message_list.push(result);
				is_error = true;
			} else {
				is_error = false;
			}
			elem_list.push([elem, is_error]);
		}

		if (message_list.length !== 0) {
			alert(message_list.join('\n'));

			// フォームの背景を着色
			var focus_elem = null;
			var count = elem_list.length;
			var i = 0;
			while (i < count) {
				elem = elem_list[i][0];
				is_error = elem_list[i][1];
				if (is_error) {
					if (focus_elem === null) {
						focus_elem = elem;
					}
					elem.style.backgroundColor = '#FFE7D7';
				} else {
					elem.style.backgroundColor = '';
				}
				++i;
			}
			focus_elem.focus();
			return false;
		}
		return true;
	};
}
function Validator()
{
	this.input;

	this.execute = function(input, rule)
	{
		this.input = input;

		for (var name in rule) {
			if (typeof this[name] === 'function') {
				var result = this[name](rule[name]);
				if (result === true) {
					return true;
				} else if (typeof result === 'string') {
					var err_name = name + '_error';
					if (typeof rule[err_name] === 'string') {
						// エラー文を上書き
						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 'が正しくありません。';
		}
	};
}

