function prepare_in(num) {
    ret = ( '' + num ).replace( /,/g, '.' );
    ret = ret.replace( /[^0-9\.-]/g, '' );
    
	if( !/[0-9]/.test( ret ) ) ret = 1;
	
    return eval( ret );
}


function prepare_out(num) {
	var positon;
	var strNum = num.toString();
	var wasNonNull = 0;
	var numCnt = 0;
	var ret = num;
	for( x = 0; x < strNum.length; x++ ) {
		chr = strNum.charAt(x);
		if( /[0-9]/.test( chr ) ) {
			if( chr == '0' ) {
				if(wasNonNull) numCnt ++;
			}
			else {
				numCnt ++;
				wasNonNull = 1;
			}
		}
		if( !/[0-9,\.]/.test( chr ) ) break;
		if( numCnt == 12 ) {
			positon = x;
			break;
		}
	}
	
	if( numCnt == 12 ) {
		strNum.toLowerCase();
		index = strNum.indexOf("e");
		tmp = "";
		x = strNum.length - 1;
		if( index != -1 ) {
			for( x = strNum.length - 1; x > -1; x-- ) {
				tmp = strNum.charAt(x) + tmp;
				if( x == index ) break;
			}
			x--;
		}
		for( ; x > -1; x-- ) {
			chr = strNum.charAt(x);
			if( /[0-9]/.test( chr ) ) {
				tmp = "0" + tmp;
			}
			else {
				tmp = strNum.charAt(x) + tmp;
			}
			if( x == positon ) break;
		}
		x--;
		var rnd;
		if( /[5-9]/.test( strNum.charAt(positon) ) ) {
			rnd = 1;
		}
	    else {
			rnd = 0;
		}
		if( rnd == 1 ) {
			for(; x > -1; x-- ) {
				chr = strNum.charAt(x);
				if( /[0-9]/.test( chr ) ) {
					chr += rnd;
					rnd = 0;
					if( chr > 9 ) {
						chr = 0;
						rnd = 1;
					}
					tmp = chr + tmp;
				}
				else {
					tmp = strNum.charAt(x) + tmp;
				}
			}
			if( rnd == 1 ) {
				tmp = "1" + tmp;
			}
		}
		else {
			for(; x > -1; x-- ) {
				tmp = strNum.charAt(x) + tmp;
			}
		}
		var val = tmp.valueOf() * 1;
		if( Math.abs( (val - num) / num ) < 1e-10 ) ret = val;
	}
	return ret;
}


var NAMES = new Array();
function convert( obj, skipfill ) {
	var f = obj.form;
	
	var fr_obj = /^unit_/.test( obj.name ) ? f.val_from : obj;
	var to_obj = /_from$/.test( fr_obj.name ) ? f.val_to : f.val_from;
	var fr_uni = f.unit_from;
	var to_uni = f.unit_to;
	
//	//test
//	if( f.unit_from[fr_uni.selectedIndex].value == "show_all" ) { _show_all( fr_uni ); }
//	if( f.unit_from[to_uni.selectedIndex].value == "show_all" ) { _show_all( to_uni ); }
	
	if( fr_obj.name == 'val_to' ) {
		fr_uni = f.unit_to;
		to_uni = f.unit_from;
	}
	to_obj.value = conv( fr_obj.value, fr_uni, to_uni );
	

	var sel1 = f.unit_from.selectedIndex;
	var sel2 = f.unit_to.selectedIndex;
	
	_stat( obj, f.unit_from[sel1].getAttribute( "num" ), f.unit_from[sel2].getAttribute( "num" ) );
	
	if( !NAMES[0] ) NAMES[0] = document.getElementById( "name_from" );
	if( !NAMES[1] ) NAMES[1] = document.getElementById( "name_to" );

	NAMES[0].innerHTML = f.unit_from[sel1].getAttribute( "dess" );
	NAMES[1].innerHTML = f.unit_from[sel2].getAttribute( "dess" );
	
	if( skipfill == true || skipfill == 1 ) return;
	
	if( !skipfill ) {
		var loc = document.location.href;
		loc = loc.replace( /#[^#]*$/, "" );
	}
	else if ( skipfill == 2 ) {
		var loc = '';
	}
	
	var tmp = f.unit_from[sel1].text.replace( /\s/g, "_" );
	tmp = tmp.replace( /[\s_]*\[[^\[\]]+\][\s_]*/, '' );
	loc += "#" + f.val_from.value + "_" + tmp;
	
	tmp = f.unit_from[sel2].text.replace( /\s/g, "_" );
	tmp = tmp.replace( /[\s_]*\[[^\[\]]+\][\s_]*/, '' );
	loc += "_in_" + tmp;
	
	if( !skipfill ) {
		document.location.href = loc;
	}
	else if ( skipfill == 2 ) {
	//	var exp = new Date();
	//	exp.setTime( exp.getTime() + 365 * 24 * 60 * 60 * 1000 );
	//	exp = ";expires=" + exp.toGMTString();
		var exp = '';
	
		document.cookie = "conv=" + loc + ";path=/;Domain=." + location.host + exp;
		document.cookie = "cat=" + f.cat.value + ";path=/;Domain=." + location.host + exp;
	}
}



function autofill( hash ) {
	if( !hash ) hash = document.location.hash;
	hash = hash.replace( /^[^#]+(#.+)$/, "$1" );
	
	var m = decodeURI( hash ).match( /^#([^\s_]+)[\s_]+(.+)_in_(.+)$/ );
	if( !m ) return;
	
	var f = document.forms.frm;
	var cfrom = f.unit_from;
	var cto = f.unit_to;
	var cval = f.val_from;
	
	var reconv = false;
	cval.value = m[1];
	if( m[1] != 1 ) {
		reconv = true;
	}
	
	for( var i = 0; i < cfrom.options.length; i ++ ) {
		if( cfrom.options[i].text.replace( /[\s_]*\[[^\[\]]+\][\s_]*/, '' ) == m[2].replace( /_/g, " " ) ) {
			cfrom.selectedIndex = i;
			_apply_div(i, 'from');
			if( i > 0 ) reconv = true;
			break;
		}
	}
	for( var i = 0; i < cto.options.length; i ++ ) {
		if( cto.options[i].text.replace( /[\s_]*\[[^\[\]]+\][\s_]*/, '' ) == m[3].replace( /_/g, " " ) ) {
			cto.selectedIndex = i;
			_apply_div(i, 'to');
			if( i > 0 ) reconv = true;
			break;
		}
	}
	
	//if( reconv && m[2] != m[3] ) {
	if( reconv ) {
		convert( cval, true );
	}
}


function ch_dir() {
	var f = document.forms.frm;
	
	if( f.unit_from.selectedIndex == f.unit_to.selectedIndex ) return;
	
	_cancel_sch();
	
	var tmp = f.unit_from.selectedIndex;
	f.unit_from.selectedIndex = f.unit_to.selectedIndex;
	_apply_div(f.unit_to.selectedIndex, 'from');
	f.unit_to.selectedIndex = tmp;
	_apply_div(tmp, 'to');

	convert( f.val_from );
}

var STO = false;
function _stat( obj, id1, id2 ) {
	if( id1 == null || id2 == null ) return;
	if( obj.tagName != 'SELECT' ) return;
	id1 = parseInt( id1 );
	id2 = parseInt( id2 );
	if( !id1 || !id2 || id1 == id2 ) return;
	
	if( STO ) clearTimeout( STO );
	STO = setTimeout( function() {
		_get( '/stat/?from=' + id1 + '&to=' + id2, function() {} );
	}, 500 );
}


//==========================

var SELD = [false,false];
var MOUSEDOWN = false;
function _sel(obj, num) {
	if( SELD[num] ) {
		with( SELD[num][0].style ) {
			backgroundColor = SELD[num][1];
			color = "";
		}
	}
	SELD[num] = [obj,obj.style.backgroundColor];
	with( obj.style ) {
		backgroundColor = "highlight";
		color = "highlighttext";
	}
}

var SELECTS = [];
function _apply_sel(num,tt) {
	if( !SELECTS[tt] ) SELECTS[tt] = document.forms.frm.elements[ "unit_" + tt ];
	SELECTS[tt].selectedIndex = num;
	convert( SELECTS[tt] );
}

var ROWS = [];
var DIVS = [];
function _apply_div(num, tt) {
	var id = tt + '_' + num;
	if( !ROWS[id] ) ROWS[id] = document.getElementById( id );
	if( ROWS[id].style.display == 'none' ) return false;
	_sel( ROWS[id], tt == 'from' ? 0 : 1 );
	
	//---
	if( !DIVS[tt] ) DIVS[tt] = document.getElementById( "div_" + tt );
	
	var tmp = ROWS[id].scrollHeight * (num + 6);
	if( tmp > DIVS[tt].scrollTop + DIVS[tt].clientHeight ) {
		DIVS[tt].scrollTop = tmp - DIVS[tt].clientHeight;
	}
	tmp = ROWS[id].scrollHeight * (num - 2);
	if( tmp < DIVS[tt].scrollTop ) {
		DIVS[tt].scrollTop = tmp;
	}
	return true;
}

function _keydn(e, cc) {
	var max = document.forms.frm.unit_from.length - 1;
	
	var num = 0;
	var tt = cc == 0 ? 'from' : 'to';
	if( SELD[cc] ) {
		var m = SELD[cc][0].id.match( /^(from|to)_([0-9]+)$/ );
		num = m[2];
	}
	
	var tmp = num;
	if( !e ) e = event;
		if( e.keyCode == 38 ) num --;
	else if( e.keyCode == 40 ) num ++;
	else if( e.keyCode == 35 ) num = max;
	else if( e.keyCode == 36 ) num = 0;
	else if( e.keyCode == 9 ) {
		var tt = e.shiftKey ? 'from' : 'to';
		if( tt == 'to' && cc == 1 ) return true;
		if( tt == 'from' && cc == 0 ) return true;
		if( !DIVS[tt] ) DIVS[tt] = document.getElementById( "div_" + tt );
		DIVS[tt].focus();
		return false;
	}
	else if( e.keyCode == 8 ) {
		_search( document.forms.frm.unit_from, e, tt );
		return true;
	}
	else return true;
	
	if( num < 0 ) num = 0;
	if( num > max ) num = max;
	
	e.returnValue = false;
	
//#################
	tmp = num > tmp ? 1 : -1;
	if( e.keyCode == 35 ) tmp = -1;
	else if( e.keyCode == 36 ) tmp = 1;
	while( !_apply_div(num, tt) ) {
		num += tmp;
		if( num < 0 ) return true;
		if( num > max ) return true;
	}
//#################
	
	_apply_sel(num,tt);
}


//==========================
var SF = [];
function _search(obj, e, tt) {
	if( !e ) e = event;

	if( !DIVS[tt] ) DIVS[tt] = document.getElementById( "div_" + tt );
	
	var val = '';
	var el = obj;
	if( !/^search/.test( el.id ) ) {
		var key = e.charCode == undefined ? String.fromCharCode(e.keyCode) : String.fromCharCode(e.charCode);
		if( !/^[a-z0-9]$/i.test( key ) && e.keyCode != 8 ) return;
		
		if( !SF[tt] ) SF[tt] = document.getElementById( "search_" + tt );
		el = SF[tt];
		val = el.value + (e.keyCode == 8 ? '' : key );
		
		if( val != '' ) {
			el.style.display = "";
			el.focus();
		}
		el.value = val;
		e.returnValue = false;
		return false;
	}
	else if( /^(38|40|9)$/.test( e.keyCode.toString() ) ) {
		DIVS[tt].focus();
		_keydn(e, tt == 'from' ? 0 : 1);
		return true;
	}
	else val = el.value;
	
	if( val == '' ) el.style.display = "none";
	
	var max = document.forms.frm.unit_from.length;
	var id;
	var reg = new RegExp( val, "i" );
	var once = true;
	var hide = [];
	var show = [];
	for( var i = 0; i < max; i ++ ) {
		id = tt + '_' + i;
		if( !ROWS[id] ) ROWS[id] = document.getElementById( id );
		
		with( _get_tds( ROWS[id] )[0] ) {
			innerHTML = innerHTML.replace( /<[^<>]+>/g, "" );
		}
		
		if( val == "" ) {
			show.push( id );
		}
		else if( reg.test( _get_tds( ROWS[id] )[0].innerHTML ) ) {
			show.push( id );
			if( once ) {
				once = false;
				_apply_div(i,tt);
				_apply_sel(i,tt);
			}
		}
		else {
			hide.push( id );
		}
	}
	
	el.style.color = show.length == 0 ? 'red' : '';
	if( show.length == 0 ) return false;
	
	for( var i = 0; i < show.length; i ++ ) {
		ROWS[show[i]].style.display = "";
		//if( val.length > 1 ) _light( _get_tds( ROWS[show[i]] )[0], val );
	}
	for( var i = 0; i < hide.length; i ++ ) {
		ROWS[hide[i]].style.display = "none";
	}
	
	if( val == '' ) {
		DIVS[tt].focus();
		return true;
	}
}

function _cancel_sch() {
	var tmp = ["from","to"];
	var tt;
	for( var i = 0; i < tmp.length; i ++ ) {
		tt = tmp[i];
		if( !SF[tt] ) SF[tt] = document.getElementById( "search_" + tt );
		SF[tt].value = "";
		_search( SF[tt], event, tt );
	}
}

function _get_tds(obj) {
	var el = obj.childNodes;
	var ret = [];
	for( var i = 0; i < el.length; i ++ ) {
		if( !el[i].tagName || el[i].tagName != 'TD' ) continue;
		ret.push( el[i] );
	}
	return ret;
}