(function(jQuery){
  jQuery.fn.modal = function (options) {
    var defaults = {
      width: 600,
      scriptExec: false,
      useWebtrends: false,
      closeClass: false,
      appendInside: 'body',
      closeImage: null,
      loadingImage: '/en_US/us/assets/components/widget/ajax-loader.gif',
      onopen: function() {},
      onclose: function() {},
      container: 'modal-container'
    }
    var options =  $.extend(defaults, options);

    $(this).data('options',options);

    if(options.closeImage) {
      var img_close = new Image();
      img_close.src = options.closeImage;
    }

    $(this).click(function() {
      var href = $(this).attr("href");
      var _this = this;

      if (href != null) {
        this.blur();

      // Determine size & positioning
      var bodyHeight = $(document).height();
      var bodyWidth = $(window).width();
      var visibleHeight = $(window).height();

      // Create backdrop
      backdrop = $(document.createElement("div"))
      backdrop.css({
        width: bodyWidth,
        height: bodyHeight,
        opacity: 0.6,
        position: 'absolute',
        'z-index': 9000,
        top: '0px',
        left: '0px',
        backgroundColor: 'black'
      });
      $("body").append(backdrop);

      if(options.loadingImage) {
        loadingImage = $(document.createElement("div"));
        var img = new Image();
        img.src = options.loadingImage;
        imageHeight = img.height;
        imageWidth = img.width;
        loadingImage.css({
          'z-index': 9001,
          position: 'absolute',
          height:imageHeight*4,
          width:imageWidth*4,
          top: (visibleHeight/2-2*imageHeight+$(window).scrollTop()),
          left: (bodyWidth/2-2*imageWidth),
          backgroundColor:'white',
          backgroundImage:"url("+options.loadingImage+")",
          backgroundRepeat:'no-repeat',
          backgroundPosition:'center center'
        });        
        $("body").append(loadingImage);
      }

      // Load popup content
        var body = $(options.appendInside);
        var modal = $(document.createElement("div")).css("width", options.width);

        modal.load((options.container?href + " ."+options.container:href), function(responseText, textStatus, xhr) {
          if(options.loadingImage) {
            loadingImage.stop();
            loadingImage.remove();
          }

          if (textStatus != "success") {
            backdrop.stop();
            backdrop.remove();
            return;
          }
      
          var closeme = $(document.createElement("div"));

          backdrop.add(closeme).click(function() {
            backdrop.stop();
            backdrop.remove();
            backdrop = null;
            modalwindow.stop();
            modalwindow.remove();
            modalwindow = null;
            closeme.stop();
            closeme.remove();
            closeme = null;
            options.onclose();
          });
      
          // Create modal window
          modalwindow = $(this);
          modalwindow.addClass("modal-window");
          modalwindow.css({
            visibility: "hidden",
            position: 'absolute',
            'z-index': 9002,
            backgroundColor: 'white'
          });
          body.append(modalwindow);

          // Position window
          var windowHeight = modalwindow.innerHeight();
          var windowTop = $(window).scrollTop();
          if (windowHeight + 40 > visibleHeight)
            windowTop += 20;
          else
            windowTop += (visibleHeight - windowHeight) / 2;
          var windowLeft = (bodyWidth - options.width) / 2;
      
          modalwindow.css({
            top: windowTop,
            left: windowLeft,
            visibility: "visible"
          });

          if(options.closeClass) {
            closelinks = $("a."+options.closeClass);
            closelinks.data('closeme',closeme);
            closelinks.data('onclose',options.onclose);
            closelinks.data('backdrop',backdrop);
            closelinks.data('modalwindow',modalwindow);
            closelinks.click(function() {
              thiscloseme = $(this).data('closeme');
              thisonclose = $(this).data('onclose');
              $(this).data('backdrop').stop();
              $(this).data('backdrop').remove();
              $(this).data('modalwindow').stop();
              $(this).data('modalwindow').remove();
              thiscloseme.stop();
              thiscloseme.remove();
              thisonclose();
              return false;
            });
            closelinks.show();
          }      

          if(options.closeImage) {
            var img = new Image()
            img.src = options.closeImage;
            closeme.css({
              position: 'absolute',
              height:img.height,
              width:img.width,
              'z-index': 9004,
              top: windowTop-((img.height-1)/2),
              left: windowLeft+options.width-((img.width-1)/2)
            });
            if($.browser.msie && $.browser.version=="6.0") {
              closeme.css({cursor:"hand",backgroundImage: "none",filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+(options.closeImage)+"',sizingMethod='crop')"});
            }
            else {
              closeme.css({backgroundImage: "url('"+(options.closeImage)+"')",cursor:"pointer"});
            }
            body.append(closeme);
          }

          // Execute script on page
          if((options.scriptExec)&&(options.container!=null)) {
            lines = responseText.split("\n");
            exec_lines = "";
            add_to_exec = false;
            jQuery.map(lines,function(s) {
              if(s.search(/EXECUTE-BEGIN/i)>=0) add_to_exec=true;
              if(add_to_exec) exec_lines += s;
              if(s.search(/EXECUTE-END/i)>=0) {
                add_to_exec=false;
                try {
                  eval(exec_lines);
                }
                catch(err) {
                  if(typeof console != "undefined") console.log("error in target javascript");
                }
                exec_lines="";
              }
            });
          }

          // Execute webtrends
          if((options.useWebtrends)&&(options.container!=null)&&(href!=null)) {
            lines = responseText.split("\n");
            exec_lines = "";
            page_title = null;
            add_to_exec = false;
            done = false;
            title_line="";
            jQuery.map(lines,function(s) {
              if(done) return;
              title_line = s.match(/<title>(.*)<\/title>/);
              if(title_line) page_title = title_line[1];
              if(s.search(/wrs_trackpage\s*\(/)>=0) {
                add_to_exec=true;
                exec_lines += 'wrs_trackclick("DCS.dcsuri='+href+'",';
                if(page_title!=null) {
                  if(page_title.length==0) page_title = href;
                  exec_lines += '"WT.ti='+page_title+'",';
                }
              }
              else {
                if(add_to_exec) exec_lines += s;
              }
              if(add_to_exec&&(s.search(/\)/)>=0)) {
                add_to_exec=false;
                try {
                  eval(exec_lines);
                }
                catch(err) {
                  if(typeof console != "undefined") console.log("error in webtrends javascript");
                }
                done = true;
              }
            });
          }

          options.onopen();
        });
      return false;
    }
  });

  };

})(jQuery);

