function openwin(url, w, h)
{
	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=no, 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 clearInput(id)
{
	var elem = document.getElementById(id);
	elem.value = '';
	elem.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;
}
window.onload = function()
{
	if(document.forms.length === 0)
	{
		return false;
	}

	focusInput(document.forms[0].elements);

	var REGEXP_PASS   = /^[a-z\d]+$/i;
	var REGEXP_NUMBER = /^[1-9]\d*$/;

	var form;
	if((form = document.getElementById('writeform')) !== null)
	{
		var rules =
		{
			'title' :
				{
					'name'     : '題名',
					'required' : true
				},
			'name' :
				{
					'name'     : '名前',
					'required' : true
				},
			'mail' :
				{
					'name'     : 'メールアドレス',
					'required' : false,
				},
			'url' :
				{
					'name'     : 'URL',
					'required' : false,
				},
			'mes' :
				{
					'name'     : '本文',
					'required' : true
				},
			'pass' :
				{
					'name'         : '編集キー',
					'required'     : false,
					'min'          : 4,
					'regexp'       : REGEXP_PASS,
					'regexp_error' : 'は半角英数字にして下さい。'
				}
		}
	}
	else if((form = document.getElementById('editform')) !== null)
	{
		var rules =
		{
			'id' :
				{
					'name'     : '記事番号',
					'required' : true,
					'regexp'   : REGEXP_NUMBER
				},
			'pass' :
				{
					'name'     : '編集キー',
					'required' : true
				}
		};
	}
	else if((form = document.getElementById('mailform')) !== null)
	{
		var rules =
		{
			'title' :
				{
					'name'     : '題名',
					'required' : true
				},
			'name' :
				{
					'name'     : '名前',
					'required' : true
				},
			'mail' :
				{
					'name'     : 'メールアドレス',
					'required' : true,
				},
			'mes' :
				{
					'name'     : '本文',
					'required' : true
				}
		};
	}
	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 'が正しくありません。';
		}
	};
}

