jQuery.qtm = {
  _referrer: function() {
    return document.referrer;
  },
  keywordFromUrl: function(url) {
    var is_yahoo = /\/{2}[^\/:\?]*yahoo[^\/:\?]+/;
    var param = is_yahoo.test(url) ? 'p' : 'q';
    var parse_url = new RegExp('\\b' + param + '=([^&#]+)');
    var result = parse_url.exec(url);
    return (result == null) ? "" : result[1];
  },
  url: function(username, project, keyword) {
    var base_url = "http://www.quizthemarket.com/";
    return base_url + username + "/" + project + "?k=" + keyword;
  },
  link: function(username, project, text) {
    var keyword = jQuery.qtm.keywordFromUrl(jQuery.qtm._referrer());
    if (! keyword) {
      return null;
    }
    
    return $("<a/>")
      .attr({
        href: jQuery.qtm.url(username, project, keyword)
      })
      .text(text)
      .click(function(event) {
        var link = this;
        
        var rounded_corners = {
          padding: "1em",
          "-moz-border-radius": "10px",
          "-webkit-border-radius": "10px"
        };

        var fixedStyles = function(width, height) {
          return {
            position: "fixed",
            width: width.toString() + "px",
            height: height.toString() + "px",
            top: "80px",
            left: (($(document).width() - width) / 2).toString() + "px",
            border: "none",
            background: "white",
            "z-index": "101"
          };
        };

        var createWrapper = function() {
          var styles = { position: "relative" };
          return $("<div/>")
            .addClass("qtm-wrapper")
            .css(jQuery.extend(fixedStyles(600, 450), rounded_corners))
            .hide();
        };
        
        var createCloseButton = function(container) {
          return $("<a/>")
            .attr("href", "")
            .css({
              position: "absolute",
              top: "-18px",
              left: "-18px",
              width: "40px",
              height: "42px",
              background: "url(http://www.quizthemarket.com/images/close-survey.png) no-repeat",
              outline: "0"
            })
            .click(function() {
              container.remove();
            });
        };
        
        var createIframe = function(wrapper, loader) {
          return $("<iframe/>")
            .attr("src", link.href)
            .css({
              width: "100%",
              height: "100%",
              border: "none",
              overflow: "hidden"
            })
            .appendTo(wrapper)
            .load(function() {
              wrapper.fadeIn("fast", function() {
                loader.hide();
              });
            });
        };
        
        var createLoader = function() {
          return $("<div/>")
            .css(jQuery.extend({
              "text-align": "center"
            }, fixedStyles(200, 100), rounded_corners))
            .append($("<h1/>").html("Loading&hellip;").css("margin", "0.5em"))
            .append($("<p/>")
              .css("margin", "2em 0")
              .append($("<img/>").attr("src", "http://www.quizthemarket.com/images/survey-loader.gif")));
        };
        
        var createOverlay = function(container) {
          return $("<div/>")
            .css({
              position: "absolute",
              width: "100%",
              height: "100%",
              top: "0",
              left: "0",
              background: "black",
              opacity: "0.7",
              "z-index": "100"
            })
            .appendTo(container)
            .hide()
            .click(function() {
              container.remove();
            });
        };
        
        var container = $("<div/>").addClass("qtm-survey").appendTo("body");
        var loader = createLoader();
        var wrapper = createWrapper();
        wrapper.append(createCloseButton(container));
        var iframe = createIframe(wrapper, loader);
        container.append(loader);
        createOverlay(container).fadeIn("slow", function() {
          wrapper.appendTo(container);
        });
        event.preventDefault();
      });
  }
};
