jQuery.beautyOfCode = {  
  initialized: false,  
  
  settings: {  
  
    // hide line numbers?  
    noGutter: false,  
  
    // show copy, plain, ... links  
    addControls: true,  
  
    // collapse to control bar. cant be used  
    // with addControls set to false  
    collapse: false,  
  
    // show column numbers  
    showColumns: false,  
  
    // start with another line number?  
    firstLine: 1  
  },  
  
  brushByAlias: {},  
  
  init: function (clipboardSwf, settings) {  
    dp.SyntaxHighlighter.ClipboardSwf = clipboardSwf;  
  
    if (settings)  
      jQuery.extend(jQuery.beautyOfCode.settings, settings);  
  
    if (jQuery.beautyOfCode.isInitialized)  
      return;  
  
    // creates a map of each registered brush by alias  
    jQuery.each(dp.sh.Brushes, function (i, brush) {  
      var aliases = brush.Aliases;  
  
      if(aliases == null)  
       return;  
  
      jQuery.each(aliases, function (ii, alias) {  
        jQuery.beautyOfCode.brushByAlias[alias] = brush;  
      });  
    });  
  
    jQuery.beautyOfCode.isInitialized = true;  
  },  
  
  addCssForBrush: function (brush, highlighter) {  
    if (brush.isCssInitialized)  
      return;  
  
    var headNode = $("head")[0];  
    if(highlighter.Style && headNode)  
    {  
      var styleNode = document.createElement('style');  
      styleNode.setAttribute('type', 'text/css');  
  
      if(styleNode.styleSheet) // for IE  
        styleNode.styleSheet.cssText = highlighter.Style;  
      else // for everyone else  
        $(styleNode).text(highlighter.Style);  
  
      headNode.appendChild(styleNode);  
    }  
  
    brush.isCssInitialized = true;  
  },  
  
  beautifyAll: function() {  
    jQuery("pre.code:has(code[class])").each(function (i, item) {  
  
      function getOptionValue(name, list)  
      {  
        var regex = new RegExp('^' + name + '\\[(\\w+)\\]$', 'gi');  
        var matches = null;  
  
        for(var i = 0; i < list.length; i++)  
         if((matches = regex.exec(list[i])) != null)  
          return matches[1];  
  
        return null;  
      }  
  
      var $item = jQuery(item);  
      var $code = $item.children("code");  
      var code = $code[0];  
  
      var options = code.className.split(" ");  
      var language = options[0];  
  
      var settings = {};  
  
      if ($code.hasClass("boc-nogutter"))  
        settings.noGutter = true;  
  
      if ($code.hasClass("boc-nocontrols"))  
        settings.addControls = false;  
  
      if ($code.hasClass("boc-showcolumns"))  
        settings.showColumns = true;  
  
      if ($code.hasClass("boc-collapse"))  
        settings.collapse = true;          
  
      var firstLine = getOptionValue("boc-firstline", options, 1);  
      if (firstLine)  
        settings.firstLine = firstLine;  
  
      $item.beautifyCode(language, settings);  
    });  
  }  
};  
  
jQuery.fn.beautifyCode = function (language, settings) {  
  
  var saveLanguage = language;  
  var saveSettings = settings;  
  
  // iterate all elements  
  this.each( function (i, item) {  
    var $item = jQuery(item);  
  
    var settings = jQuery.extend({}, jQuery.beautyOfCode.settings, saveSettings);  
  
    var brush = jQuery.beautyOfCode.brushByAlias[saveLanguage];  
  
    if (!brush)  
      return;  
  
    // instantiate brush  
    highlighter = new brush();  
  
    // set brush options  
    jQuery.extend(highlighter, settings);  
  
    jQuery.beautyOfCode.addCssForBrush(brush, highlighter);  
  
    // IE Bug?: code in pre has to be skipped  
    // in order to preserver line breaks.  
    if ($item.is("pre") && ($code = $item.children("code")))  
      $item.text($code.text());  
  
    highlighter.Highlight($item.html());  
    highlighter.source = item;  
  
    $item.replaceWith(highlighter.div);  
  });  
}