
var base_url = "";
var initializers = [];
var tooltip_counter = 0;

function isIE()
{
	return /msie/i.test(navigator.userAgent) && !/opera/i.test(navigator.userAgent);
}

function jmk_highlight()
{
	if(typeof dp === undefined)
	{
		setTimeout("jmk_highlight();", 500);
	}
	else
	{
		$.beautyOfCode.init(base_url + 'clipboard.swf');  
		$("pre > code").each(function() {
			var t = $(this);
			var code = t.html();
			var language = code.match(/lang:[a-z#]+/);
			if(!language) return;
			//if(isIE()) return;

			lang = language[0].substr(5);
			code = code.replace("lang:" + lang, "");
			if(isIE()) 
			{
				return;
			}
			else
			{
				t.html(code);
				t.parent().beautifyCode(lang);
			}
		});
	}
}

function jmk_init(_base_url)
{
	base_url = _base_url;

	$(document).ready(function() 
	{
		$(".will-highlight").hover(
		function() { $(this).addClass("highlighted"); },
		function() { $(this).removeClass("highlighted"); }
		);
/*
		$(".has-transparent").hover(
			function() 
			{ 
				$(this).addClass("highlighted").find(".transparent").show();
			},
			function() 
			{ 
				$(this).removeClass("highlighted").find(".transparent").hide();
			});*/
		// load syntaxhighlighter if there is a code segment
		if($("pre code").is("*"))
		{			
			$.getScript(base_url + "js/shCore.js", function() {
				$.getScript(base_url + "js/shBrushCpp.js", function() {
				$.getScript(base_url + "js/shBrushJava.js", function() {
				$.getScript(base_url + "js/shBrushCSharp.js", function() {
					$.getScript(base_url + "js/shBrushPython.js", function() {
						$.getScript(base_url + "js/shBrushXml.js", function() {
							 setTimeout("jmk_highlight();", 500);
						});
					});
				});
                });
				});
			});
		}
		// enable hints for all text type inputs
		$('input[type=text]').setHint();
		$('input[type=password]').setHint();

		// enable tooltips for all imgs, a, and divs that have title attribute
		/*
		$('img[title],a[title],div[title],tr[title]').each(function() { 
			var t = $(this);
			var title = t.attr("title");
			t
				// remove title
				.attr("title", "")
				// setup events
				.mouseover(function(e) {
					tooltip_counter += 1;
					if(tooltip_counter == 1)
						$("#tooltip").show();
					e.stopPropagation();
				})
				.mousemove(function(e) {
					$("#tooltip").css({ left: e.pageX + 13, top: e.pageY }).html(title);
					e.stopPropagation();
				})
				.mouseout(function(e) {
					tooltip_counter -= 1;
					if(tooltip_counter == 0)
						$("#tooltip").hide();
					e.stopPropagation();
				});
		});*/

		// when the form is submitted when the text box has its title (dummy value), remove it
		$('form').submit(function() {
			$('input').each(function() {
				var $input = $(this);
				var title = $input.attr("title");
				if (this.value === title && $input.hasClass("blur")) {
					$input.val('').removeClass("blur");
				}				
			});
		});

		// if an image url ends with /0 through /3, link them the original
		/*
		$(".entry img").each(function() {
			var t = $(this);
			if(t.attr("src").match(/\/[0-3]$/)) 
			{
				
				t
					.css("cursor", "pointer")
					.click(function() 
					{ 
						jmk_open_image(t.attr("src").replace(/\/[0-3]$/, "")); 
					});
			}
		});*/

		// make lightbox galleries
		$("a.imglink").lightBox();
		for(var i = 0; i < initializers.length; ++i)
			initializers[i]();

		$("a.confirm").each(function() {
			var t = $(this);
			t
//				.attr("href", "#")
				.click(function() 
				{ 
					return confirm("Really proceed?");
				});
		});

		$("table.tabular tr")
			.mouseover(function() { $(this).addClass("selected"); })
			.mouseout(function() { $(this).removeClass("selected"); })
			.click(function() {
				var a = $(this).find("a");
				if(a) document.location = a.attr("href"); 
			});
				

	});
}

function filter_alphanumerics(val)
{
	var ret = "";
	var limited = /^[-()~!\#\$ \^&\*\=+|:;\?"<,\.>'\/]$/; 
	for(var i = 0; i < val.length; ++i)
		if(!limited.test(val[i]))
			ret += val[i];
		else if(ret.length > 0 && ret[ret.length-1] != "-")
			ret += "-";
	if(ret.length > 0 && ret[ret.length-1] == "-")
		ret = ret.substr(0, ret.length-1);
	return ret;
}

function pad(val, minlength, padding)
{
	val = "" + val;
	while(val.length < minlength)
		val = padding + val;
	return val;
}

(function ($) {

	$.fn.setHint = function (blurClass) {
		if (!blurClass) blurClass = 'blur';
		
		return this.each(function () {
			var $input = $(this),
				title = $input.attr('title'),
				$form = $(this.form),
				$win = $(window),
				type = $input.attr("type");

			function remove() {
				if (this.value === title && $input.hasClass(blurClass)) {										
					$input.val('').removeClass(blurClass);
				}
			}

			// only apply logic if the element has the attribute
			if (title) { 
				// on blur, set value to title attr if text is blank
				$input.blur(function () {
					if (this.value === '') {
						$input.val(title).addClass(blurClass);
					}
				}).focus(remove).blur(); // now change all inputs to title
				
				// clear the pre-defined text when form is submitted
				$form.submit(remove);
				$win.unload(remove); // handles Firefox's autocomplete
			}
		});
	};

	$.fn.setTooltip = function(tooltip)
	{
	}

})(jQuery);

$.fn.insertAtCaret = function (myValue) {
        return this.each(function(){
                //IE support
                if (document.selection) {
                        this.focus();
                        sel = document.selection.createRange();
                        sel.text = myValue;
                        this.focus();
                }
                //MOZILLA/NETSCAPE support
                else if (this.selectionStart || this.selectionStart == '0') {
                        var startPos = this.selectionStart;
                        var endPos = this.selectionEnd;
                        var scrollTop = this.scrollTop;
                        this.value = this.value.substring(0, startPos)
                                      + myValue
                              + this.value.substring(endPos,
this.value.length);
                        this.focus();
                        this.selectionStart = startPos + myValue.length;
                        this.selectionEnd = startPos + myValue.length;
                        this.scrollTop = scrollTop;
                } else {
                        this.value += myValue;
                        this.focus();
                }
        });

};


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);
  });
}

