// ==UserScript==
// @name          CPSyntax
// @author        Joshua Heyer
// @namespace  http://shog9.com/greasemonkey/scripts/
// @description   Use Alex Gorbatchev's client-side syntax highlighting for code samples in CP forums (scripts are loaded from CP server-side storage,and run unprivileged)
// @version        4
// @include       http://*.codeproject.com/*
// @include       http://*.codetools.com/*
// @include       http://*.thecodeproject.com/*
// ==/UserScript==
//
// Tested with SyntaxHighlighter 1.5 (or rather, a version slightly modified for this purpose)

// no sense loading anything if this isn't even a forum - do a quick test for a forum table
var forumTable = document.evaluate("//table[@id='ForumTable']", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
if ( forumTable )
{
   // specialized highlighting for certain forums
   var forumLink = document.evaluate(".//a[substring-after(@href, 'forumid=')]", forumTable, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;

   var forumId = 0;
   if ( forumLink.href.match(/forumid=(\d*)/) )
      forumId = RegExp.$1;
      
   var forumLUT = 
   {
      1640 : "javascript", // web dev forum
      1647 : "cpp",     // CPP forum
      1649 : "c#",      // C# forum
      12076 : "c#",     // ASP.NET forum
      1650 : "c#",      // .NET forum
      1646 : "vb",      // VB forum
      1725 : "sql",     // SQL / ADO / ADO.NET forum
      3421 : "xml",     // XML / XSL
      "default" : "javascript"      // default for other forums (javascript)
   };
   
   var langLUT = 
   {
      "python" : "shBrushPython.js.txt",
      "ruby" : "shBrushRuby.js.txt",
      "sql" : "shBrushSql.js.txt",
      "vb" : "shBrushVb.js.txt",
      "xml" : "shBrushXml.js.txt",
      "cpp" : "shBrushCpp.js.txt",
      "c#" : "shBrushCSharp.js.txt",
      "css" : "shBrushCss.js.txt",
      "delphi" : "shBrushDelphi.js.txt",
      "java" : "shBrushJava.js.txt",
      "javascript" : "shBrushJScript.js.txt",
      "php" : "shBrushPhp.js.txt"
   };
   
   if ( !forumLUT[forumId] )
      forumId = "default";
   
   // styles
   var styles = document.createElement("style");
   styles.innerHTML = "@import url(/script/profile/upload/20101/SyntaxHighlighter.css.txt);";
   document.body.insertBefore(styles, document.body.firstChild);

   // base highlighter script
   var script = document.createElement("script");
   script.src = "/script/profile/upload/20101/" + "shCore.js.txt";
   script.language = "javascript";
   document.body.insertBefore(script, document.body.firstChild);

   // set of brushes to load
   var langsToLoad = { };
   
   // mark code blocks for highlighting
   var codeBlocks = document.evaluate(".//pre", forumTable, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
   for (var i=0; i<codeBlocks.snapshotLength; ++i)
   {
      var block = codeBlocks.snapshotItem(i);
      block.setAttribute("name", "code");
      var lang = forumLUT[forumId];
      if ( langLUT[block.className] )
      {
         lang = block.className;
      }
      else
      {
         block.className = lang;
      }
      if ( lang )
      {
         langsToLoad[lang] = true;
         block.innerHTML = block.innerHTML.replace(/<br>/gi, "\n");
      }   
   }

   // load the brushes...
   for (var lang in langsToLoad)
   {
      script = document.createElement("script");
      script.src = "/script/profile/upload/20101/" + langLUT[lang];
      script.language = "javascript";
      document.body.insertBefore(script, document.body.firstChild);   
   }
   
   // do the highlighting
   script = document.createElement("script");
   script.language = "javascript";
   script.innerHTML = "dp.SyntaxHighlighter.ClipboardSwf = '/script/profile/upload/20101/clipboardswf.txt';dp.SyntaxHighlighter.HighlightAll('code', false, true);";
   document.body.insertBefore(script, document.body.firstChild);
}   
