// jQuery plugin: wrapper for SyntaxHighlighter
// written by Nikita Melnichenko
// based on beautyOfCode jquery plugin

jQuery.SyntaxHighlighter_wrapper =
{
  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 (settings)
  {
    if (settings)
      jQuery.extend(jQuery.SyntaxHighlighter_wrapper.settings, settings);

    if (jQuery.SyntaxHighlighter_wrapper.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.SyntaxHighlighter_wrapper.brushByAlias[alias] = brush;
      });
    });

    jQuery.SyntaxHighlighter_wrapper.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;
  },
};

jQuery.fn.highlight_syntax = 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.SyntaxHighlighter_wrapper.settings, saveSettings);

    var brush = jQuery.SyntaxHighlighter_wrapper.brushByAlias[saveLanguage];

    if (!brush)
      return;

    // instantiate brush
    highlighter = new brush();

    // set brush options
    jQuery.extend(highlighter, settings);

    jQuery.SyntaxHighlighter_wrapper.addCssForBrush(brush, highlighter);

    highlighter.Highlight($item.html());
    highlighter.source = item;

    $item.replaceWith(highlighter.div);
  });
}

