
units =  new Array("Lille transport", "Stor transport", "Sender", "Lille jagerfly", "Man-o-war", "Stjerne krydser", "Phoenix", "Kampskib", "Stealth bombefly", "Stealth bomber", "Destroyer", "Imperiale stjernebase", "Spionage sonde", "Genbrugsvogn", "Kolonisationsskib", "Morter", "Lille tyngdekanon", "Stor tyngdekanon", "Ionkanon", "Antiluftskyts", "Positron lighter", "Interval kanon", "Laserkanonbatteri", "Solkanon", "Lille kraftfelt", "Stort kraffelt", "Solcelle");


function parse() {
  var lines;
  var test;
  var temp;
  var s = document.forms['rapport'].elements['data'].value;
  
  lines = flushlines(s.split("\n"));
  
  if (document.forms['rapport'].elements['anon'].checked) {
    lines = anonymize(lines);
  }

  lines = reformat(lines);
  
  if (document.forms['rapport'].elements['usecolors'].checked) {
    lines = vbFormat(lines);
  }
  
  lines = addLink(lines);

  if (document.forms['rapport'].elements['usecolors'].checked) {
    lines = addCentering(lines);
  }
  
  document.forms['output'].elements['data'].value = lines.join("\n");
}


function addLink(lines) {
  
  if(lines.length > 0) {
    lines.splice(lines.length, 0, " ");
    lines.splice(lines.length, 0, " ");
    lines.splice(lines.length, 0, " ");

    if (document.forms['rapport'].elements['usecolors'].checked) {
      lines.splice(lines.length, 0, "[b][url=http://www.henrik-berg.dk/si/parser/][color=33CCCC]Link til SI kamprapport formateringsscript af SleeperService[/color][/url][/b]");
    }
    else {
      lines.splice(lines.length, 0, "SI kamprapport formateringsscript af SleeperService, findes på http://www.henrik-berg.dk/si/parser");
    }
  }
  return lines;
}


function printArray(arr) {

  document.write("<br />");
  for(var i=0; i < arr.length; i++) {
    document.write(i, " ", arr[i], "<br />");
  }
}


function reformat(lines) {

  var i = 0;
  var newlines;
  var newlines2;
  var combat_units;
  var linesToSliceAway;
  while(i < lines.length-1) {
    
    lines[i] = lines[i].replace(/metal and/i, "metal og");
    lines[i] = lines[i].replace(/kryptonite more/i, "kryptonit i brokker");
    lines[i] = lines[i].replace(/Vedkommende absorberer/i, "Vedkommende tager");

    if(lines[i].match(/^Type/) && lines[i+1].match(/^Nummer/)) {
      
      linesToSliceAway = 2;
      
      combat_units = findParticipatingUnits(lines[i]);
      
      newlines = zipUnitsAndNumbers(combat_units, lines[i+1]);
      
      /* add stealth bomber aftermath if needed */
      if(i+2 < lines.length && lines[i+2].match(/Nummer efter/)) {
	newlines2 = zipUnitsAndNumbers(combat_units, lines[i+2]);
	linesToSliceAway++;
      }
      else {
	newlines2 = Array();
      }

      lines = lines.slice(0, i).concat(newlines, newlines2, lines.slice(i+linesToSliceAway));
      i = i + newlines.length + newlines2.length - 2 + 1;

    }
    else {
      i = i + 1;
    }

  }
  return(lines);
}


function addCentering(lines) {

  if(lines.length > 0) {
    lines.splice(0, 0, "[center]");
    lines.splice(lines.length, 0, "[/center]");
  }
  return(lines);
}


function vbFormat(lines) {
  
  var i = 0;

  while(i < lines.length) {

    if(lines[i].match(/(^runde - \d -)|(stealth bomber first attack)/i)) {
      
      lines[i] = "[b][size=3][color=FFFF33]" + lines[i] + "[/color][/size][/b]";
      
      if(i > 0) {
	lines.splice(i-1, 1, " ");
	i++;
      }

    }
    else if(lines[i].match(/^(forsvar)|(den forsvarende part)/i)) {
      lines[i] = "[b][size=2][color=0066CC]" + lines[i] + "[/color][/size][/b]";

      /* this ugly hack ensure that we have some important newlines */
      if(i > 0) {
	lines[i-1] = lines[i-1] + " ";
      }
    }
    else if(lines[i].match(/^(angrib)|(den angribende part)/i)) {
      lines[i] = "[b][size=2][color=FF0000]" + lines[i] + "[/color][/size][/b]";
    }
    
    lines[i] = lines[i].replace(/^$/, " ");

    lines[i] = lines[i].replace(/(\d+(\.\d{3})* rå jern)/ig, "[b][color=FF9933]$1[/color][/b]").replace(/(\d+(\.\d{3})* metal)/ig, "[b][color=666666]$1[/color][/b]").replace(/(\d+(\.\d{3})* kryptonit)/ig, "[b][color=00FF00]$1[/color][/b]").replace(/(\d+(\.\d{3})* krydderi)/ig, "[b][color=FF33CC]$1[/color][/b]");
    
    i++;
  }
  return(lines);
}


function findUnit(line) {
  var pos;
  for(var i=0; i < units.length; i++) {
    pos = line.search(new RegExp(units[i], "i"));
    if(pos == 0) {
      return(i);
    }
  }
  return(-1);
}


function zipUnitsAndNumbers(unit_array, line) {
  var i;
  var res = new Array();
  var numbers = trim(line.replace(/^Nummer (før|efter)?/, "")).split(/\s+/);
  
  if(unit_array.length != numbers.length) {
    alert("Antal enheder kunne ikke findes");
    return(new Array("YYYYYY"));
  }
  
  if(line.match("før")) {
    res.push(" ");
    res.push("Enheder inden stealth bomber first strike:");
  }
  else if(line.match("efter")) {
    res.push(" ");
    res.push("Enheder efter stealth bomber first strike:");
  }

  for(i=0; i < unit_array.length; i++) {
    res.push(unit_array[i] + ": " + numbers[i]);
  }
  return(res);  
}


function findParticipatingUnits(line) {
  var j;
  var res = new Array();
  var newline = trim(line.replace(/^Type/, ""));

  while(newline.length > 0) {
    j = findUnit(newline);
    if(j == -1) {
      alert("Ukendt enhed på linien: [" + newline + "]");
      return(new Array("XXXXX"));
    }
    else {
      res.push(units[j]);
      newline = trim(newline.slice(units[j].length));
    }
  }
  return(res);
}


function anonymize(lines) {

  for(var i=0; i < lines.length; i++) {
    lines[i] = lines[i].replace(/\[\d+:\d+:\d+\]/g, "[xx:xx:xx]");
  }
  return(lines);
}


function flushlines(lines) {

  var i = 0;
  while(i < lines.length) {
    if(lines[i].match(/^(den (angribende|forsvarende) flåde)|(In the first attack)/i)) {
       lines.splice(i, 1);
    }
    else if(i > 0 && lines[i-1].match(/^Nummer/i) && lines[i].match(/round|shield|defense/i)) {
       lines.splice(i, 1);
    }
    else { 
      i = i + 1;
    }
  }

  /* delete empty lines at the beginning */
  while(lines.length > 0 && lines[0].match(/^\s*$/)) {
    lines.splice(0, 1);
  }

  /* delete empty lines at the end */
  i = lines.length-1;
  while(i >= 0) {
    if(lines[i].match(/^\s*$/)) {
      lines.splice(i, 1);
      i = i - 1;
    }
    else { 
      break;
    }
  }
  return(lines);
}


function trim(s) {
  return(s.replace(/^\s+|\s+$/g, ""));
}


