(function($) {
  // Pulls in text from a link target (on page load) and displays it as a popup
  // on clicking the link.
  //
  // Needs some styles applied to the tooltip, e.g.
  //
  //     div.tooltip {
  //         width: 25em;
  //         border: 1px solid #bbb;
  //         border-color: #bbb #999 #999 #bbb;
  //         background-color: #ffc;
  //         color: #000;
  //     }
  //     div.tooltip div { /* contains the markup loaded from the link target */
  //         margin: 0.5em;
  //         padding: 0 0.3em;
  //     }
  //     div.tooltip a.closer {
  //         float: right;
  //         width: auto;
  //         margin: 0 0 0.2em 0.2em;
  //         border: 1px solid #bbb;
  //         border-width: 0 0 1px 1px;
  //         padding: 0 0.3em;
  //         background-color: #eee;
  //         color: #325186;
  //         font-size: 0.9em;
  //         text-decoration: underline;
  //         cursor: pointer;
  //     }
  //
  $.toolTip = function(link) {
    var element = $(link);
    var link_title = element.attr("title");
    var tooltip = $('<div class="tooltip"><a class="closer">Close</a>' +
                    '<div>Loading&hellip;</div></div>');
    tooltip.css({ position: 'absolute', zIndex: 2 });
    var text = tooltip.find('div');
    tooltip.hide();
    $('body').append(tooltip);
    element.bind("click", function(event) {
      if (text.text().match(/^Loading/)) {
        $.get(element.attr("href")+".js", function(data) { text.html(data); });
      }
      event.preventDefault();
      event.stopPropagation();
      position();
      tooltip.toggle();
      element.blur();
    });
    // hide tooltip on body click and escape
    $(document).click(function(event) {
      $('div.tooltip').hide();
    }).keyup(function(event) {
      if (event.keyCode == 27) $('div.tooltip').hide();
    });
    function position() {
      var viewport_width = $(window).width();
      var offset = element.offset();
      var left = Math.round(offset.left);
      if ($.browser.msie) left -= 30;
      var space_left = left;
      var space_right = viewport_width - space_left;
      var tooltip_width = tooltip.width();
      var min_margin = 10;
      if (viewport_width < (min_margin + tooltip_width)) {
        left = min_margin;
      } else if (space_right < (min_margin + tooltip_width)) {
        left = Math.round(space_right + offset.left - tooltip_width - min_margin);
      }
      tooltip.css({ left: left + 'px',
                    top: Math.round(offset.top) + 25 + 'px' });
    }
  };
  $.fn.toolTip = function() {
    this.each(function() { $.toolTip(this); });
  };

  // Get a hash of querystring params from an element with an href.
  // Only returns a result for the first item in the set.
  $.fn.queryParams = function() {
    if (! this.attr("href")) return {};
    var matches = this.attr("href").match(/\?(.*)/);
    if (! matches) return {};
    var querystring = matches[1];
    var params = {};
    $.each(querystring.split("&"), function() {
      var pair = this.split("=");
      if (pair.length == 2) {
        params[pair[0]] = decodeURIComponent(pair[1].replace(/\+/g, ' '));
      }
    });
    return params;
  };

  // Get a single querystring param by name from an element with an href.
  // Only returns a result for the first item in the set.
  $.fn.queryParam = function(key) {
      return this.queryParams()[key];
  };

  // Attach get satisfaction form
  $.getSatisfaction = function() {
    var base = 'http://s3.amazonaws.com/getsatisfaction.com/';
    var style = $("<link rel='stylesheet' type='text/css' href='" + base +
                  "/feedback/feedback.css'/>");
    $('head').append(style);
    $('body').append($('<div id="getsatisfaction"></div>'));

    var script = document.createElement('script');
    script.type = 'text/javascript';
    script.src = base + 'javascripts/feedback-v2.js';
    document.getElementsByTagName('head')[0].appendChild(script);
  };
  $.fn.getSatisfaction = function(product) {
    var fn = arguments.callee;
    fn.getSatifactionProduct = product;
    feedbackLink = this;
    $.getScript('http://s3.amazonaws.com/getsatisfaction.com/javascripts/feedback-v2.js', function() {
      $('body').append('<div id="get-satisfaction-container"></div>')
      $(feedbackLink).click(function(event) {
        var feedback_widget_options = {};
        feedback_widget_options.display = "overlay";  
        feedback_widget_options.company = "wordtracker";
        feedback_widget_options.placement = "hidden";
        feedback_widget_options.color = "#222";
        feedback_widget_options.style = "question";
        feedback_widget_options.container = "get-satisfaction-container"
        if (fn.getSatifactionProduct != undefined) {
          feedback_widget_options.product = fn.getSatifactionProduct;
        }
        var feedback_widget = new GSFN.feedback_widget(feedback_widget_options);
        feedback_widget.show()
        event.preventDefault();
        this.blur();
      });
    });
  };
})(jQuery);