var wday=['日','月','火','水','木','金','土'];
var d=document;
/* ブラウザタイプ */
uaIE=uaOK=uaNG=0;
if(d.getElementById){
	if(typeof ActiveXObject != 'undefined') uaIE=1;
	else uaOK=1;
} else uaNG=1;

/* XMLHttpRequest */
function completeUrl(url){
	if(url.match(/:\/\//))return url;
	if(url.match(/^\//))
		return window.location.href.match(/^(.*?:\/\/[^\/]+)/)[1]+url;
	else
		return window.location.href.match(/^([^?]+\/)/)[1]+url;
}
function getXML(url,handler,failedHandler){
	url=completeUrl(url);
	var req=false;
	function readyStateCheck(){
		if(req.readyState==4)
			if(req.status==200)
				handler(req);
			else if(failedHandler!=null)
				failedHandler();
			else
				alert('読み込みに失敗しました(E=bm1)');
	}
	if(window.XMLHttpRequest){
		try{
			req=new XMLHttpRequest();
		}catch(e){
			req=false;
		}
		if(req){
			req.onreadystatechange=readyStateCheck;
			req.open('GET',url,true);
			req.setRequestHeader('If-Modified-Since',Date());
			req.send(null);
		}
	}else if(typeof(ActiveXObject) != 'undefined'){
		try{
			req=new ActiveXObject('Msxml2.XMLHTTP');
		}catch(e){
			try{
				req=new ActiveXObject('Microsoft.XMLHTTP');
			}catch(e){
				req=false;
			}
		}
		if(req){
			req.onreadystatechange=readyStateCheck;
			req.open('GET',url,true);
			req.setRequestHeader('If-Modified-Since',Date());
			req.send();
		}
	}
}
function getXMLSync(url,failedHandler){
	url=completeUrl(url);
	var req=false;
	if(window.XMLHttpRequest){
		try{
			req=new XMLHttpRequest();
		}catch(e){
			req=false;
		}
		if(req){
			req.open('GET',url,false);
			req.setRequestHeader('If-Modified-Since',Date());
			req.send(null);
		}
	}else if(typeof(ActiveXObject) != 'undefined'){
		try{
			req=new ActiveXObject('Msxml2.XMLHTTP');
		}catch(e){
			try{
				req=new ActiveXObject('Microsoft.XMLHTTP');
			}catch(e){
				req=false;
			}
		}
		if(req){
			req.open('GET',url,false);
			req.setRequestHeader('If-Modified-Since',Date());
			req.send();
		}
	}
	if(req&&req.status==200)
		return req;
	else if(failedHandler!=null)
		failedHandler();
	else
		alert('読み込みに失敗しました(E=bm2)');
}
function postXML(url,body,handler,failedHandler){
	url=completeUrl(url);
	var req=false;
	function readyStateCheck(){
		if(req.readyState==4)
			if(req.status==200)
				handler(req);
			else if(failedHandler!=null)
				failedHandler()
			else
				alert('送信に失敗しました');
	}
	if(window.XMLHttpRequest){
		try{
			req=new XMLHttpRequest();
		}catch(e){
			req=false;
		}
		if(req){
			req.onreadystatechange=readyStateCheck;
			req.open('POST',url,true);
			req.setRequestHeader('If-Modified-Since',Date());
			req.send(body);
		}
	}else if(typeof(ActiveXObject) != 'undefined'){
		try{
			req=new ActiveXObject('Msxml2.XMLHTTP');
		}catch(e){
			try{
				req=new ActiveXObject('Microsoft.XMLHTTP');
			}catch(e){
				req=false;
			}
		}
		if(req){
			req.onreadystatechange=readyStateCheck;
			req.open('POST',url,true);
			req.setRequestHeader('If-Modified-Since',Date());
			req.send(body);
		}
	}
}
function postXMLSync(url,body,failedHandler){
	url=completeUrl(url);
	var req=false;
	if(window.XMLHttpRequest){
		try{
			req=new XMLHttpRequest();
		}catch(e){
			req=false;
		}
		if(req){
			req.open('POST',url,false);
			req.setRequestHeader('If-Modified-Since',Date());
			req.send(body);
		}
	}else if(typeof(ActiveXObject) != 'undefined'){
		try{
			req=new ActiveXObject('Msxml2.XMLHTTP');
		}catch(e){
			try{
				req=new ActiveXObject('Microsoft.XMLHTTP');
			}catch(e){
				req=false;
			}
		}
		if(req){
			req.open('POST',url,false);
			req.setRequestHeader('If-Modified-Since',Date());
			req.send(body);
		}
	}
	if(req&&req.status==200)
		return req;
	else if(failedHandler!=null)
		failedHandler();
	else
		alert('送信に失敗しました');
}
function clearResult(){
	var resultBox=d.getElementById('result');
	if(resultBox)
		resultBox.innerHTML='';
}
function writeResult(req){
	var result=parseResult(req);
	if(result){
		if(result.resultCode==0){
			var resultBox=d.getElementById('result');
			if(resultBox)
				resultBox.innerHTML=htmlEscape(result.message);
			else
				alert(result.message);
		}else{
			alert(result.message);
		}
		return result.resultCode;
	}
	return null;
}
function parseResult(req){
	if(!req)return null;
	var xmlobj=req.responseXML;
	if(xmlobj){
		var results=xmlobj.getElementsByTagName('result');
		var result={resultCode:-9,message:''};
		if(results.length>0){
			result.resultCode=parseInt(getElementTextNS('','resultCode',results[0],0),10);
			result.message=getElementTextNS('','message',results[0],0);
			return result;
		}
	}
	return null;
}
function getElementTextNS(prefix,local,Elem,index){
	var elems;
	var result='';
	if(prefix && uaIE){
		elems=Elem.getElementsByTagName(prefix+':'+local);
	} else {
try{
		elems=Elem.getElementsByTagName(local);
}catch(e){
	alert('caller:'+getElementTextNS.caller);
}
	}
	if(index!=undefined)
		elems=elems[index]?[elems[index]]:[];
	if(elems&&elems.length>0){
		for(var i=0;i<elems.length;i++){
			if(!elems[i].firstChild)continue;
			if(elems[i].firstChild.nextSibling)
				result+=elems[i].firstChild.nextSibling.nodeValue;
			else
				result+=elems[i].firstChild.nodeValue;
		}
		return result;
	} else {
		return '';
	}
}

/* DOM */
function searchElementById(obj,str){
	if(obj.hasChildNodes()){
		for(var i=0;i<obj.childNodes.length;i++){
			var N=obj.childNodes.item(i);
			if( N.nodeType == 3 ) continue;
			if(N.id && N.id==str){
				return N;
			}
			var found=searchElementById(N,str);
			if(found) return found;
		}
	}
}
function getChildByName(obj,str){
	if(obj.hasChildNodes()){
		for(var i=0;i<obj.childNodes.length;i++){
			var N=obj.childNodes.item(i);
			if(N.nodeType==3)continue;
			if(N.getAttribute('name') && N.getAttribute('name')==str){
				return N;
			}
		}
	}
	return null;
}
function showID(id) {
	var elem=d.getElementById(id);
	if(elem) elem.style.display = "block";
}
function hideID(id) {
	var elem=d.getElementById(id);
	if(elem) elem.style.display = "none";
}
function makeElement(tag) {
	var OBJ = d.createElement(tag);
	if( arguments.length > 1 ) {
		for( var i = 1; i < arguments.length; i++ ) {
			OBJ.appendChild( arguments[i] );
		}
	}
	return OBJ;
}
function makeText(t) {
	return d.createTextNode(t);
}
function prepareElement(obj){
	var d=(obj.document)?obj.document:document;
	if(obj.element=='text')
		return d.createTextNode(obj.contents);
	var E=d.createElement(obj.element);
	if(obj.id!=undefined)E.id=obj.id;
	if(obj.className!=undefined)E.className=obj.className;
	if(obj.accessKey!=undefined)E.accessKey=obj.accessKey;
	if(obj.attribute!=undefined)
		for(var p in obj.attribute)
			if(obj.attribute[p]!=undefined)E.setAttribute(p,obj.attribute[p]);
	if(obj.handler!=undefined)
		for(var p in obj.handler)
			if(obj.handler[p]!=undefined)
				addEvent(E,p,obj.handler[p],true);
	if(obj.innerHTML!=undefined)
		E.innerHTML=obj.innerHTML;
	if(obj.childNodes!=undefined)
		for(var i=0;i<obj.childNodes.length;i++){
			obj.childNodes[i].document=d;
			E.appendChild(prepareElement(obj.childNodes[i]));
		}
	if(obj.style!=undefined)
		for(var s in obj.style)
			if(obj.style[s]!=undefined)E.style[s]=obj.style[s];
	if(obj.checked!=undefined){
alert(E.id+':'+obj.checked);
		E.checked=obj.checked;
	}
	return E;
}
function clearSelectOption(select){
	while(select.length>0){
		select.remove(0);
	}
}
function addSelectOption(select,value,text){
	var option=makeElement('option');
	option.value=value;
	option.appendChild(makeText(text));
	select.appendChild(option);
}
function getElementStyle(elem,IEAttr,CSSAttr){
	if(elem.currentStyle){
		return elem.currentStyle[IEAttr];
	}else if(d.defaultView&&d.defaultView.getComputedStyle){
		var computed=d.defaultView.getComputedStyle(elem,null);
		return computed.getPropertyValue(CSSAttr);
	}
}

/* login check - returns defaultMode */
function check_login(){
	var req=getXMLSync('login.x?check=1');
	var result=parseResult(req);
	if(result&&result.resultCode==0)
		return parseInt(getElementTextNS('','defaultMode',req.responseXML,0)||1,10);
	else {
		var domain=document.domain.split(/\./).slice(1).join('.');
		setCookie('_nu',window.location.href,1/24,domain);
		if(req.responseXML){
			var loginUrl=getElementTextNS('','loginUrl',req.responseXML,0);
			if(loginUrl!=undefined)setCookie('_lu',loginUrl,1/(24*12),domain);
		}
		return 0;
	}
}
/* common */
function listupCommands(box,tag,cmds){
	for(var i=0;i<cmds.length;i++)
		box.appendChild(prepareElement({
			element:tag,
			handler:(cmds[i][1]||cmds[i][2]?{
				click:cmds[i][1],
				mouseover:addHover,
				mouseout:removeHover
				}:null),
			childNodes:[cmds[i][2]?{
				element:'a',
				attribute:{href:cmds[i][2][0],target:cmds[i][2][1]},
				childNodes:[{element:'text',contents:cmds[i][0]}]
				}:{element:'text',contents:cmds[i][0]}]
			}));
}
function baseDomain(){
	return document.domain.split(/\./).slice(1).join('.');
}
function commonHost(){
	return 'common.'+baseDomain();
}
function commonConfig(win,page){
	if(win==undefined)win=window;
	win.location.href='http://'+commonHost()+'/config.html'+(page==undefined?'':'?page='+page);
}
function commonLogout(){
	if(!confirm('Rstyleからログアウトします。\n'))return;
	top.location.href='http://'+commonHost()+'/logout.html';
}

/* cookie */
function getCookie(key){
	var re=new RegExp('\\b'+key+'=([^;]+)');
	var matched=d.cookie.match(re);
	if(matched){
		return unescape(matched[1]);
	}
	return null;
}
function setCookie(key,val,expire,domain,path){
	if(key!=null && val!=null){
		var setExpire=new Date();
		if(expire!=null)
			expire=parseFloat(expire);
		else
			expire=1000;
		setExpire.setTime(setExpire.getTime()+expire*1000*60*60*24);
		document.cookie=key+'='+escape(val)+';expires='+setExpire.toGMTString()+(domain!=undefined?';domain='+domain:'')+(path!=undefined?';path='+path:'');
		return true;
	}
	return false;
}
function deleteCookie(key){
	document.cookie=key+'=;expires=Thu,01-Jan-70 00:00:01 GMT';
	return true;
}

/* converter */
function htmlEscape(str){
	if(str==null||typeof(str)=='undefined')return '';
	return str.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;').replace(/\"/g,'&quot;');
}
function date_to_dd(d) {
	var year = d.getYear();
	var month = d.getMonth() + 1;
	var date = d.getDate();
	var hour = d.getHours();
	var min = d.getMinutes();
	if( year < 1000 ) year = 1900 + year;
	if( month < 10 ) month = "0" + month;
	if( date < 10 ) date = "0" + date;
	if( hour < 10 ) hour = "0" + hour;
	if( min < 10 ) min = "0" + min;
	return [ year + "-" + month + "-" + date, hour + ":" + min ];
}
function ymdToDate(ymd){
	var d=ymd.match(/^(\d{4})(\d{2})(\d{2})$/);
	if(!d)return;
	var date=new Date(d[1],parseInt(d[2],10)-1,d[3]);
	return date;
}
function dateStringToDate(str){
	var parsed=Date.parse(str);
	if(!isNaN(parsed))return new Date(str);
	var d=str.split(/\D+/);
	if(d.length==3)
		return new Date(parseInt(d[0],10),parseInt(d[1],10)-1,parseInt(d[2],10));
	else
		return new Date(parseInt(d[0],10),parseInt(d[1],10)-1,parseInt(d[2],10),parseInt(d[3],10),parseInt(d[4],10),parseInt(d[5],10));
}
function zeroPad(n,c){
	n=parseInt(n,10)+'';
	while(n.length<c)n='0'+n;
	return n;
}

function formatDate(format,date){
	format=format.toUpperCase();
	if(uaIE)date=new Date(date);
	format=format.replace(/HHMM/,zeroPad(date.getHours(),2)+zeroPad(date.getMinutes(),2)).replace(/SS/,zeroPad(date.getSeconds(),2));
	if(format.match(/(HH?)(\D)MM/)){
		var rp=zeroPad(date.getHours(),RegExp.$1.length)+RegExp.$2+zeroPad(date.getMinutes(),2);
		format=format.replace(/HH?\DMM/,rp);
	}
	format=format.replace(/YYYY/,date.getFullYear()).replace(/YY/,date.getFullYear().toString().substr(2,2)).replace(/MM/,zeroPad(date.getMonth()+1,2)).replace(/M/,date.getMonth()+1).replace(/DD/,zeroPad(date.getDate(),2)).replace(/D/,date.getDate()).replace(/W/,wday[date.getDay()]);
	return format;
}
/* event */
function addEvent(E,type,handler,isCapture){
	if(!E||!type||!handler)return false;
	if(E.addEventListener){
		E.addEventListener(type,handler,isCapture);
		return true;
//	}else if(E.attachEvent){
//		var rc=E.attachEvent('on'+type,handler);
//		return rc;
	}else{
		E['on'+type]=handler;
		return true;
	}
}
function removeEvent(E,type,handler,isCapture){
	if(!E||!type||!handler)return false;
	if(E.removeEventListener){
		E.removeEventListener(type,handler,isCapture);
		return true;
	}else if(E.detachEvent){
		E.detachEvent('on'+type,handler);
		return true;
	}else{
		delete E['on'+type];
		return true;
	}
}
function getTarget(e){
	e=getEvent(e);
	if(e){
		var t=(e.target)?e.target:((e.srcElement)?e.srcElement:null);
		if(t){
			if(t.nodeType==3)
				t=t.parentNode;
			return t;
		}
	}
	return null;
}
function getEvent(e){
	e=(e)?e:((window.event)?window.event:null);
	return e;
}
function getXY(e){
	e=getEvent(e);
	if(e){
		var xy={x:0,y:0};
		if(e.pageX){
			xy.x=e.pageX;
			xy.y=e.pageY;
		}else if(e.clientX){
			if(d.documentElement){
				xy.x=e.clientX+d.documentElement.scrollLeft-d.documentElement.clientLeft;
				xy.y=e.clientY+d.documentElement.scrollTop-d.documentElement.clientTop;
			}else{
				xy.x=e.clientX+d.body.scrollLeft-d.body.clientLeft;
				xy.y=e.clientY+d.body.scrollTop-d.body.clientTop;
			}
			if(d.body.parentElement&&d.body.parentElement.clientLeft){
				var p=d.body.parentElement;
				xy.x+=p.scrollLeft-p.clientLeft;
				xy.y+=p.scrollTop-p.clientTop;
			}
		}
		return xy;
	}
	return null;
}
function getXYnoScroll(e){
	e=getEvent(e);
	if(e){
		var xy={x:0,y:0};
		if(e.pageX){
			xy.x=e.pageX;
			xy.y=e.pageY;
		}else{
			xy.x=e.x;
			xy.y=e.y;
		}
		return xy;
	}
	return null;
}
function initializeUpdateListener(win){
	win.updateListener=new Object();
}
function updateObject(win,type,obj,notify){
	if(!win.updateListener)initializeUpdateListener(win);
	if(!win.updateListener[type])
		win.updateListener[type]={obj:null,updated:null,list:new Array()};
	win.updateListener[type].obj=obj;
	win.updateListener[type].updated=new Date();
	if(notify)notifyUpdateListener(win,type);
}
function getObject(win,type){
	if(!win.updateListener||!win.updateListener[type])return null;
	return win.updateListener[type].obj;
}
function removeObject(win,type){
	if(!win.updateListener||!win.updateListener[type])return true;
	win.updateListener[type].obj=null;
}
function addUpdateListener(listenWin,type,targetWin,handlerName,kickAtFirst){
	var exist=false;
	if(!listenWin.updateListener)initializeUpdateListener(listenWin);
	if(!listenWin.updateListener[type])
		listenWin.updateListener[type]={obj:null,updated:null,list:new Array()};
	for(var i=0;i<listenWin.updateListener[type].list.length;i++){
		if(listenWin.updateListener[type].list[i].handler==handlerName
		 &&listenWin.updateListener[type].list[i].win==targetWin){
			exist=true;
			break;
		}
	}
	if(!exist)
		listenWin.updateListener[type].list.push({win:targetWin,handler:handlerName});
	if(kickAtFirst)targetWin[handlerName]();
}
function removeUpdateListener(listenWin,type,targetWin,handlerName){
	if(listenWin.updateListener){
		if(listenWin.updateListener[type]){
			var newList=new Array();
			for(var i=0;i<listenWin.updateListener[type].list.length;i++){
				if(listenWin.updateListener[type].list[i].handler!=handlerName
				 ||listenWin.updateListener[type].list[i].win!=targetWin){
					newList.push(listenWin.updateListener[type].list[i]);
				}
			}
			if(newList.length!=listenWin.updateListener[type].list.length){
				listenWin.updateListener[type].list.length=0;
				for(i=0;i<newList.length;i++)
					listenWin.updateListener[type].list.push(newList[i]);
			}
		}
	}
}
function notifyUpdateListener(listenWin,type,ignore){
	if(!listenWin.updateListener||!listenWin.updateListener[type]){
		return;
	}
	var listener=listenWin.updateListener[type]
	listener.update=new Date();
	checklist:
	for(var i=0;i<listener.list.length;i++){
		if(!listener.list[i].win||listener.list[i].win.closed
		 ||!listener.list[i].win[listener.list[i].handler])
			continue;
		if(ignore){
			for(var j=0;j<ignore.length;j++){
				if(listener.list[i].handler==ignore[j][1]
				 &&listener.list[i].win==ignore[j][0])
					continue checklist;
			}
		}
		listener.list[i].win[listener.list[i].handler]();
	}
}
/* util */
function bodyWidth(){
	return (window.innerWidth)?window.innerWidth
	      :(d.documentElement&&d.documentElement.clientWidth)?d.documentElement.clientWidth
	      :d.body.clientWidth;
}
function bodyHeight(){
	return (window.innerHeight)?window.innerHeight
	      :(d.documentElement&&d.documentElement.clientHeight)?d.documentElement.clientHeight
	      :d.body.clientHeight;
}
function linkCSS(){
	var type,i;
	if(navigator.userAgent.indexOf('Macintosh')!=-1)
		type=(navigator.userAgent.indexOf('Safari')!=-1)?'safari':'mac';
	else if(uaIE==1)
		type='ie';
	else
		type='win';
	for(i=0;i<arguments.length;i++){
		document.write('<link rel="stylesheet" href="'+arguments[i]+'_'+type+'.css" type="text/css">');
	}
}
function addClassName(elem,t){
	if(elem==undefined)return;
	var cn=(elem.className!=undefined)?elem.className:'';
	var array=cn.split(/ +/).grepfunc(function(a){return a!=t});
	array.push(t);
	elem.className=array.join(' ');
}
function removeClassName(elem,t){
	var cn=(elem.className!=undefined)?elem.className:'';
	elem.className=cn.split(/ +/).grepfunc(function(a){return a!=t}).join(' ');
}
function hasClassName(elem,t){
	var cn=(elem.className!=undefined)?elem.className:'';
	var hasIt=cn.split(/ +/).grepfunc(function(a){return a==t});
	return hasIt.length;
}
function toggleClassName(elem,t){
	if(hasClassName(elem,t))
		removeClassName(elem,t);
	else
		addClassName(elem,t);
}
function addHover(){
	addClassName(this,'hover');
}
function removeHover(){
	removeClassName(this,'hover');
}
function adjustBodyWidth(){
	if(uaIE){
		d.body.style.width=(d.body.clientWidth)?(d.body.clientWidth-20)+'px':'90%';
		d.body.style.marginRight=0;
		d.body.style.paddingRight=0;
	}
}
function parseQueryString(qs){
	var hash={};
	qs=qs.replace(/^\?/,'');
	var pairs=qs.split(/[&;]/);
	for(var i=0;i<pairs.length;i++){
		var pair=pairs[i].split(/=/);
		while(true){
			try{
				hash[pair[0]]=(pair[1]==undefined)?'':decodeURIComponent(pair[1]);
				break;
			}catch(e){
				pair[1]=pair[1].slice(0,-1);
			}
		}
	}
	return hash;
}
function dumpObject(obj){
	var str,i,value;
	if(obj==null)return "null";
	if(obj==undefined)return "undefined";
	if(typeof(obj)=='number')return obj;
	if(typeof(obj)=='string')return "'"+obj.replace(/\'/g,"\\'")+"'";
	if(typeof(obj)=='boolean')return (obj)?1:0;
	if(typeof(obj)=='object'){
		if(obj.concat){
			str='['
			for(i=0;i<obj.length;i++)
				str+=dumpObject(obj[i])+',';
			return str.substring(0,str.length-1)+']';
		}else{
			str='{';
			for(i in obj)
				str+=i+':'+dumpObject(obj[i])+',';
			return str.substring(0,str.length-1)+'}';
		}
	}else{
		return typeof(obj);
	}
}
function jump(url, message) {
	if( message != "" ) {
		flag = confirm(message);
		if (flag) location.href = url;
	} else {
		location.href = url;
	}
}
function subw(fPath,wName,wWidth,wHeight,objRequired)
{
	var subw=window.open(fPath, wName, "toolbar=no,location=no,directories=no,status=yes,menubar=no,scrollbars=yes,resizable=yes,width="+wWidth+",height="+wHeight);
	if(objRequired) return subw;
}
function confSubw(message,url,wName,wWidth,wHeight) {
	flag = confirm(message);
	if (flag) subw(url,wName,wWidth,wHeight);
}
function calcSize(size){
	if(size<100)return size+'bytes';
	var s=size/1024;
	var u='KB';
	if(s>1024){
		s=s/1024;
		u='MB';
	}
	s=(s*10+"").replace(/\.\d+/,'')/10;
	return s+u;
}
function shiftMonth(date,shift){
	var newDate=new Date(date);
	if(shift==0)
		return newDate;
	var newYear=newDate.getFullYear();
	var newMonth=newDate.getMonth()+shift;
	if(newMonth>=12){
		while(newMonth>=12){
			newYear++;
			newMonth-=12;
		}
	}else{
		while(newMonth<0){
			newYear--;
			newMonth+=12;
		}
	}
	newDate.setYear(newYear);
	newDate.setMonth(newMonth);
	return newDate;
}


function debugPrint(str){
	if(document.getElementById('debug'))
		document.getElementById('debug').appendChild(prepareElement({element:'p',childNodes:[{element:'text',contents:str}]}));
}

Array.prototype.grepfunc=function(func){
	var result=[];
	for(var i=0;i<this.length;i++)
		if(func(this[i]))result.push(this[i]);
	return result;
}

function textToElementObject(str){
	var rex=/(?:\b(https?:\/\/|www\.)([@:\w.-]+(?:\/[^\s'"<>]*)?))|(?:\b[a-zA-Z\d][a-zA-Z\d._?\/+-]+@(?:[\w.-]+\.[a-zA-Z]{2,5}(?![a-zA-Z0-9\@_-])|\[\d+(?:\.\d+){3}\]))/i; /*'*/
	var result=[],m;
	while(str.length>0){
		if(m=str.match(rex)){
			if(m.index>0){
				var prem=str.slice(0,m.index).match(/(.*)$/gm);
				prem.pop();
				for(var i=0;i<prem.length;i++){
					if(prem[i].match(/^$/))
						result.push({element:'br'});
					else
						result.push({element:'text',contents:prem[i]});
				}
			}
			if(m[1]!=undefined&&m[1].length>0){ //url
				var url=m[0];
				if(m[1]=='www.')url='http://'+url;
				result.push({
					element:'a',
					attribute:{target:'_blank',title:url,href:url},
					childNodes:[{element:'text',contents:m[0]}]
					});
			}else{
				result.push({
					element:'a',
					attribute:{href:'mailto:'+m[0]},
					childNodes:[{element:'text',contents:m[0]}]
					});
			}
			str=str.slice(m.index+m[0].length);
		}else{
			var post=str.match(/(.*)$/gm);
			post.pop();
			for(var i=0;i<post.length;i++){
				if(post[i]==''||post[i].match(/^$/))
					result.push({element:'br'});
				else
					result.push({element:'text',contents:post[i]});
			}
			str='';
		}
	}
	return result;
}
function alertHandler(msg){
	return function(){alert(msg)};
}
function voidHandler(ret){
	if(ret==null)ret=true;
	return function(){return ret};
}

String.prototype.formatAsHtml=function(){
	var esc={'&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;'};
	return this.replace(/[&<>\"]/g,function(m){return esc[m]}).replace(/\s*$/gm,'<br>').replace(/\t/g,'    ').replace(/ /g,'&nbsp;');
}
String.prototype.byteLength=function(){
	return encodeURIComponent(this).replace(/%[0-9a-fA-F]{2}/g,'.').length;
}
