var cs_keywords = "";

var cs_keywordArray = 
  new Array ( "abstract","event","new","struct","as","explicit","null",
	      "switch","base","extern","object","this","bool","false",
	      "operator","throw","break","finally","out","true","byte",
	      "fixed","override","try","case","float","params","typeof",
	      "catch","for","private","uint","char","foreach","protected",
	      "ulong","checked","goto","public","unchecked","class","if",
	      "readonly","unsafe","const","implicit","ref","ushort",
	      "continue","in","return","using","decimal","int","sbyte",
	      "virtual","default","interface","sealed","volatile","delegate",
	      "internal","short","void","do","is","sizeof","while","double",
	      "lock","stackalloc","else","long","static","enum","namespace",
	      "string");

// construct cs_keywords regexp
cs_keywords = "(";
for( var n=0; n<cs_keywordArray.length; n++)
  cs_keywords += "\\b" + cs_keywordArray[n] + "\\b|";
cs_keywords += "string)";

var shell_keywords = "";

var shell_keywordArray = 
  new Array ( "export" );

// construct shell_keywords regexp
shell_keywords = "(";
for( var n=0; n<shell_keywordArray.length; n++)
  shell_keywords += "\\b" + shell_keywordArray[n] + "\\b|";
shell_keywords += "string)";

function paintColors () {
  var elems = document.getElementsByTagName("div");
  for( var n=0; n<elems.length; n++ ) {
    if( elems[n].className == "code csharp" ) {
      format( elems[n], formatCs );
    } else if( elems[n].className == "code xml") {
      format( elems[n], formatXml );
    } else if( elems[n].className == "code makefile") {
      format( elems[n], formatMake );
    } else if( elems[n].className == "code shell") {
      format( elems[n], formatShell );
    } else if( elems[n].className == "console") {
      format( elems[n], formatConsole );
    } else if( elems[n].className == "code php" ) {
      format( elems[n], formatPHP );
    } else if( elems[n].className == "code css" ) {
      format( elems[n], formatCSS );
    }
  }
}

// setup handler onload
window.onload = paintColors;

var text = "";

function format( node, func ) {
  text = node.innerHTML;

  var div = document.createElement("div");
  var className = node.className;
	
  while (text.charAt (0) == "\n" || text.charAt (0) == "\r" ) {
    text = text.substr (1);
  }
  
  while( text.charAt (text.length) == "\n" || 
	 text.charAt (text.length) == "\r" ) {
    text = text.splice (0, -1);
  }
  
  div.innerHTML = func (text);
  node.parentNode.replaceChild(div, node);
  div.className = className;
}

function formatCs( text ) {
  var re = / /g;
  text = text.replace (re, "&nbsp;");
  
  // cant get this one to work in the good syntax
  re = new RegExp ("\"((((?!\").)|\\\")*)\"","g");
  text = text.replace (re,"<span style='color:purple'>\"$1\"</span>");
  
  re = /\/\/(((.(?!\"\<\/span\>))|"(((?!").)*)"\<\/span\>)*)(\r|\n|\r\n)/g;
  text = text.replace (re,"<span style='color:green'>//$1</span><br/>");
	
  re = new RegExp (cs_keywords,"g");
  text = text.replace (re,"<span style='color:blue'>$1</span>");
	
  re = /\t/g;
  text = text.replace (re,"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;");
	
  re = /\n/g;
  text = text.replace (re,"<br/>"); 
	
  div = document.createElement("div");
  div.innerHTML = text;
	
  spans = div.getElementsByTagName ("span")
  for( var i = 0; i < spans.length; i++) {
    if (spans [i].parentNode.nodeName == "SPAN") {
      spans [i].style.color = "";
    }
  }
  
  return div.innerHTML;
}

function formatPHP( text ) {
  var re = / /g;
  text = text.replace (re, "&nbsp;");
 
  // cant get this one to work in the good syntax
  re = new RegExp ("\"((((?!\").)|\\\")*)\"","g");
  text = text.replace (re,"<span style='color:purple'>\"$1\"</span>");
 
  re = /\/\/(((.(?!\"\<\/span\>))|"(((?!").)*)"\<\/span\>)*)(\r|\n|\r\n)/g;
  text = text.replace (re,"<span style='color:green'>//$1</span><br/>");

  re = new RegExp (cs_keywords,"g");
  text = text.replace (re,"<span style='color:blue'>$1</span>");

  re = /\t/g;
  text = text.replace (re,"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;");

  re = /\n/g;
  text = text.replace (re,"<br/>");

  div = document.createElement("div");
  div.innerHTML = text;

  spans = div.getElementsByTagName ("span")
  for( var i = 0; i < spans.length; i++) {
    if (spans [i].parentNode.nodeName == "SPAN") {
      spans [i].style.color = "";
    }
  }
  
  return div.innerHTML;
}

function formatCSS( text ) {
    var re = / /g;
  text = text.replace (re, "&nbsp;");
    re = /\t/g;
  text = text.replace (re,"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;");
  re = /\n/g;
  text = text.replace (re,"<br/>");
  return text;
}

function formatXml( text ) {	
  var re = / /g;
  text = text.replace (re, "&nbsp;");

  re = /\t/g;
  text = text.replace (re, "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;");
	
  re = /\<\s*(\/?)\s*(.*?)\s*(\/?)\s*\>/g;
  text = text.replace (re,"{blue:&lt;$1}{maroon:$2}{blue:$3&gt;}");
	
  re = /{(\w*):(.*?)}/g;
  text = text.replace (re,"<span style='color:$1'>$2</span>");

  re = /"(.*?)"/g;
  text = text.replace (re,"\"<span style='color:purple'>$1</span>\"");

  re = /\r\n|\r|\n/g;
  text = text.replace (re, "<br/>");
	
  return text;
}

function formatMake( text ) {	
  var re = /\t/g;
  text = text.replace (re, "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;");

  re = /\r\n|\r|\n/g;
  text = text.replace (re, "<br/>");

  re = / /g;
  text = text.replace (re, "&nbsp;");

  re = /([^:>]+?):/g;
  text = text.replace (re, "<span style='color:blue;'>$1</span>:");
	
  return text;
}

function formatConsole( text ) {	
  var re = /\t/g;
  text = text.replace (re, "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;");

  re = /\r\n|\r|\n/g;
  text = text.replace (re, "<br/>");

  re = / /g;
  text = text.replace (re, "&nbsp;");

  re = /(\[[^\]]+?\])/g;
  text = text.replace (re, "<b>$1</b>");
	
  return text;
}

function formatShell( text ) {	
  var   re = / /g;
  text = text.replace (re, "&nbsp;");

  re = /#(.*)(\r|\n|\r\n)/g;
  text = text.replace (re,"<span style='color:maroon'>#$1</span><br/>");

  re = new RegExp (shell_keywords,"g");
  text = text.replace (re,"<span style='color:blue'>$1</span>");

  re = /"(.*?)"/g;
  text = text.replace (re,"\"<span style='color:purple'>$1</span>\"");

  re = /\t/g;
  text = text.replace (re, "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;");

  re = /\r\n|\r|\n/g;
  text = text.replace (re, "<br/>");

  return text;
}
