// http://www.geocities.com/TimesSquare/Castle/3224/digits.html

levels = null;
dict = null;
bIgnore1 = false;
bIgnore2 = false;

function makeLevels()
	{
	levels = new Array();
	levels[0] = new oLevel('I', 'V');
	levels[1] = new oLevel('X', 'L');
	levels[2] = new oLevel('C', 'D');
	levels[3] = new oLevel('M', null);
	}

function makeDict()
	{
	dict = new Array();
	dict['I'] = 1;
	dict['V'] = 5;
	dict['X'] = 10;
	dict['L'] = 50;
	dict['C'] = 100;
	dict['D'] = 500;
	dict['M'] = 1000
	}

function convert(v) {
	v = v.toString();
	if (levels == null)
		makeLevels();
	return toRoman(v);
}
	
function toRoman(v) {
	var sResult = '';
	for (var l = 0; l < v.length; l++)
		sResult = translateDigit(l, v) + sResult;

	return sResult.toLowerCase();
}

function translateDigit(l, v) {
	if (bIgnore1)
		{
		bIgnore1 = false;
		return ''
		}

	if (bIgnore2)
		{
		bIgnore2 = false;
		return ''
		}

	var d = v.charAt(v.length - l - 1);
	
	if (l >= 3)
		
		{

		var n = d * Math.pow(10, l-3);
		var ms = '';

		for (var m = 0; m < n; m++)
			ms += 'M';
		
		return ms
		}


	var s1 = levels[l].one;
	var s5 = levels[l].five;

	switch(d)
		{
		case ('0'):
			{
			return ''
			}
		case('1'):
			{
			return s1
			}
		case('2'):
			{
			return s1 + s1
			}
		case('3'):
			{
			return s1 + s1 + s1
			}
		case('4'):
			{
			return s1 + s5
			}
		case('5'):
			{
			return s5
			}
		case('6'):
			{
			return s5 + s1
			}
		case('7'):
			{
			return s5 + s1 + s1
			}
		case('8'):
			{
			return s5 + s1 + s1 + s1
			}
		case('9'):
			{
			if (v.charAt(v.length - l - 2) == '9')
				{
				bIgnore1 = true;
				if (v.charAt(v.length - l - 3) == '9')
					{
					bIgnore2 = true
					return s1 + levels[l + 3].one
					}
				else
					if (v.charAt(v.length - l - 3) == '4')
						{
						bIgnore2 = true;
						return s1 + levels[l + 2].five
						}
					else
						return s1 + levels[l + 2].one
				}
			else
				if (v.charAt(v.length - l - 2) == '4')
					{
					bIgnore1 = true;	
					return s1 + levels[l + 1].five
					}
				else
					return s1 + levels[l + 1].one
			}
		default:
			{
			return d
			}
		}
}

function oLevel(s1, s5) {
	this.one = s1;
	this.five = s5;
	return this
}
