/*
Roman Numerals to Numbers (Arabic) Converter:
By Kurt Grigg © http://www.btinternet.com/~kurt.grigg/javascript
*/




if  ((document.getElementById) && 
window.addEventListener || window.attachEvent){

var userIn = '';


(function(){
var keytxt = ['M','D','C','L','X','V','I'];
document.write('<div id="containerdiv">'
+'<div id="titlediv">Roman Numerals To Numbers Converter<\/div>'


+'Enter a numeral from <span class="info">I</span> to <span class="infovin">MMMCMXC</span><span class="info">M</span><span class="infovin">X</span><span class="info">CMXCIX</span>'


+'<div id="inputdiv">&nbsp;<\/div>'
+'<input type="button" id="vin" class="otherbuttons" value="Switch Vinculum On" onclick="vinculum(this.value);this.blur()" /><br/>');
for (i = 0; i < keytxt.length; i++){
 document.write('<input type="button" class="keys" value="'+keytxt[i]+'" onclick="drawInput(this.value);this.blur()" />');
}
document.write('<input type="button" class="otherbuttons" value="Remove Last Numeral" onclick="removeLastEntry();this.blur()" />'
+'<input id="rst" type="button" class="otherbuttons" value="Reset" onclick="removeAllEntries();this.blur()" /><div id="outputdiv">0<\/div><\/div>');
})();


function dumfoc(){
/*
Ugly but effective fixes for Opera's backspace 
button shortcut nonsense and the last button 
appearing to have focus even thought it doesn't?
Removes dotted ring from button text in Moz & Netscape too.
*/

if (window.opera){
 document.getElementById('rst').style.visibility = 'hidden';
 document.getElementById('rst').style.visibility = 'visible';
 }
}




function removeLastEntry(){ 
 var d = document;
 var temp = d.getElementById('inputdiv');
 userIn = userIn.substring(0,userIn.length-1);
 if (temp.lastChild.nodeName == 'SPAN'){
  temp.removeChild(temp.lastChild);
 }
 convertNumeralToNumber(userIn);
}


function removeAllEntries(){
userIn = '';
document.getElementById('outputdiv').firstChild.data = 0;
vinculumOn();
var temp = document.getElementById('inputdiv');
 while (temp.lastChild.nodeName == 'SPAN'){
  temp.removeChild(temp.lastChild);
 }
}


function drawInput(e){
if (e == 'I') vinculumOn();
var d = document;
var temp = d.getElementById('inputdiv');
var withVin = (/Off/.test(d.getElementById('vin').value));
if (withVin) e = e.toLowerCase();
userIn += e;
var draw = d.createElement('span'); 
 if (withVin){
  draw.style.borderTop = '2px solid #000000';
  draw.style.fontVariant = 'small-caps';
 }
draw.appendChild(d.createTextNode(e)); 
temp.appendChild(draw);
checkNumeral(userIn);
}



function vinculumOn(){
 var v = document.getElementById('vin');
 v.value = "Switch Vinculum On";
 v.style.color = '#000000';
}
function vinculumOff(){
 var v = document.getElementById('vin');
 v.value = "Switch Vinculum Off";
 v.style.color = '#ff0000';
}
function vinculum(s){
 var contr = (/On/.test(s));
 if (contr){
  vinculumOff();
 }
 else{
  vinculumOn();
 }
}


function powerOfTen(n){
 var t = Math.pow((n <= 100)?n*1000:n,10);
 t = t.toString();
 var pot = (t.indexOf('1e+') != -1);
 return pot;
}
function validSubtraction(x,y){
 var t = powerOfTen(x);
 var vs = ((t) && (y/5 == x || y/10 == x));
 return vs;
}


function checkNumeral(e){
var i,a,b,c;
var now_sub = false;
var pre_sub = false;
var valid_numeral = true;
for (i = 0; i < e.length; i++){
 a = NumeralValue(e.charAt(i));
 b = NumeralValue(e.charAt(i+1));
 c = NumeralValue(e.charAt(i-1));
 now_sub = validSubtraction(a,b);
 pre_sub = validSubtraction(c,a);
 if (!now_sub && b > a) {valid_numeral = false;break;}
 if (pre_sub && b >= c) {valid_numeral = false;break;}
 if (now_sub && c == a) {valid_numeral = false;break;}
 if (now_sub && c != -1 && c <= 5) {valid_numeral = false;break;}
 if (!powerOfTen(c) && now_sub && c <= b) {valid_numeral = false;break;}
 if (!powerOfTen(a) && a == b) {valid_numeral = false;break;}
}
if ((/C{4}|I{4}|M{4}|X{4}/.test(e)) || (/c{4}|m{4}|x{4}/.test(e))){
 valid_numeral = false;
 }
if (valid_numeral){
 convertNumeralToNumber(e);
 }
else{
 alert('Invalid numeral ... removing last entry'); 
 removeLastEntry(-1);
 }
}


function convertNumeralToNumber(e){
var n = 0;
var i,a,b;
for (i = 0; i < e.length; i++){
 a = NumeralValue(e.charAt(i));
 b = NumeralValue(e.charAt(i+1)); 
 if (b > a){
  n += b - a;
  i++;  
 } 
 else{
  n += a;
 }
}
document.getElementById('outputdiv').firstChild.data = n;
}


function NumeralValue(c){
var val = -1;
var n = [['m',1000000],
['d',500000],
['c',100000],
['l',50000],
['x',10000],
['v',5000],
['M',1000],
['D',500],
['C',100],
['L',50],
['X',10],
['V', 5],
['I',1]];
for (var j = 0; j < n.length; j++){
 if (c == n[j][0]){
  val = n[j][1];
  break;
 }
}
return val;
}

}