(function($){

  $.fn.gifpopup = function(options) {

    return this.each(function() {
      var obj = this;
      obj.settings = jQuery.extend({}, jQuery.fn.gifpopup.defaults, options);
      obj.stay = false;
      obj.gif = null;
      var isAnimating = false;
      var id = (obj.settings.id ? obj.settings.id : $(obj).attr("id") );

      obj.init = function() {
        var img = new Image();
        img.onload = function() {
          obj.init2(img);
        }
        img.src = obj.settings.gifurl;
      }

      obj.init2 = function(img) {
        if (obj.settings.initialHeight == 0) obj.settings.initialHeight = img.height;
        if (obj.settings.previewHeight == 0) obj.settings.previewHeight = img.height;
        obj.gif = $("<div />").addClass("tomte").css({
          "opacity":obj.settings.initialOpacity,
          "height":obj.settings.initialHeight,
          "overflow":"hidden",
          "position":"absolute",
          "z-index":"10000",
          "margin-left":obj.settings.x,
          "margin-top":obj.settings.y
        }).append($(img));
        $(obj).before(obj.gif);

        var pos = obj.getCookie();
        if (pos) {
          obj.gif.css({
            "margin-left":pos.left,
            "margin-top":pos.top,
            "height":"auto",
            "opacity":"1"
          });
        }
        else {
          $(obj).mouseenter(function(e){obj.startAnimate();obj.positionGif(e);});
          $(obj).mousemove(function(e){obj.startAnimate();obj.positionGif(e);});
          $(obj).mouseleave(function(){obj.stopAnimate();});
          $(obj).click(function(e){obj.stayGif();});
          obj.gif.mouseenter(function(e){obj.startAnimate();obj.positionGif(e);});
          obj.gif.mousemove(function(e){obj.startAnimate();obj.positionGif(e);});
          obj.gif.mouseleave(function(){obj.stopAnimate();});
          obj.gif.click(function(e){obj.stayGif();});
        }
      },

      obj.startAnimate = function() {
        if (!obj.stay && !isAnimating) {
          isAnimating = true;
          setTimeout(obj.animShow, obj.settings.previewHiddenTime);
        }
      }

      obj.stopAnimate = function() {
        if (!obj.stay) {
          isAnimating = false;
          obj.gif.stop(true);
          obj.gif.css({
            "height":obj.settings.initialHeight,
            "opacity":obj.settings.initialOpacity
          });
        }
      }

      obj.positionGif = function(e) {
        if (!obj.stay && obj.settings.followMouse) {
          obj.gif.css({
            "margin-left":e.pageX - $(obj).offset().left,
            "margin-top":e.pageY - $(obj).offset().top + 1
          });
        }
      }

      obj.animShow = function() {
        if (isAnimating) {
          obj.gif.css({
            "height":obj.settings.initialHeight,
            "opacity":obj.settings.initialOpacity
          }).animate(
            {
              "height":obj.settings.previewHeight,
              "opacity":obj.settings.previewOpacity
            },
            obj.settings.previewAnimTime,
            function(){
              setTimeout(obj.animHide, obj.settings.previewShownTime);
            }
          );
        }
      }

      obj.animHide = function() {
        if (isAnimating) {
          obj.gif.animate(
            {
              "height":obj.settings.initialHeight,
              "opacity":obj.settings.initialOpacity
            },
            obj.settings.previewAnimTime,
            function(){
              setTimeout(obj.animShow, obj.settings.previewHiddenTime);
            }
          );
        }
      }

      obj.stayGif = function(e) {
        if (!obj.stay) {
          isAnimating = false;
          obj.gif.stop(true);
          obj.stay = true;
          obj.gif.css({
            "height":"auto",
            "opacity":"1"
          });

          obj.setCookie();
          obj.incNofClicks();
          var nof = obj.getNofClicks();
          if (obj.settings.ongifclicked) obj.settings.ongifclicked(obj, nof);
          if (nof == obj.settings.nofGifs && obj.settings.onallclicked) obj.settings.onallclicked();
        }
      }

      obj.setCookie = function() {
        var c_name = id;
        var c_val = parseInt(obj.gif.css("margin-left")) + "|" + parseInt(obj.gif.css("margin-top"));
        var exdate = new Date();
        exdate.setDate(exdate.getDate() + 30);
        document.cookie = c_name + "=" + c_val + ";path=/;expires="+exdate.toUTCString();
      }

      obj.getCookie = function() {
        if (document.cookie.length > 0) {
          var c_name = id;
          var c_start = document.cookie.indexOf(c_name + "=");
          if (c_start != -1) {
            c_start = c_start + c_name.length + 1;
            var c_end = document.cookie.indexOf(";", c_start);
            if (c_end == -1) c_end = document.cookie.length;
            var c_val = unescape(document.cookie.substring(c_start, c_end)).split('|');
            return {left:parseInt(c_val[0]), top:parseInt(c_val[1])};
          }
        }
        return null;
      }

      obj.incNofClicks = function() {
        var nof = obj.getNofClicks() + 1;
        var exdate = new Date();
        exdate.setDate(exdate.getDate() + 100);
        document.cookie = "nofclicks=" + nof + ";path=/;expires="+exdate.toUTCString();
      }

      obj.getNofClicks = function() {
        var nof = 0;
        if (document.cookie.length > 0) {
          var c_start = document.cookie.indexOf("nofclicks=");
          if (c_start != -1) {
            c_start += 10;
            var c_end = document.cookie.indexOf(";", c_start);
            if (c_end == -1) c_end = document.cookie.length;
            nof = parseInt(document.cookie.substring(c_start, c_end));
            if (isNaN(nof)) nof = 0;
          }
          else obj.createClickCookie();
        }
        else obj.createClickCookie();
        return nof;
      }

      obj.createClickCookie = function() {
        var exdate = new Date();
        exdate.setDate(exdate.getDate() + 30);
        document.cookie = "nofclicks=0;path=/;expires="+exdate.toUTCString();
      }

      obj.init();

    });

    return this;
  }

  $.fn.gifpopup_nofClicks = function() {
    nof = 0;
    this.each(function(){
      nof = this.getNofClicks();
    });
    return nof;
  }

  $.fn.gifpopup.defaults = {
    gifurl : "path/img1.gif",
    previewShownTime : 100,
    previewHiddenTime : 100,
    previewAnimTime:200,
    initialOpacity:1,
    previewOpacity:1,
    initialHeight:0,
    previewHeight:0,
    followMouse : true,
    x : 0,
    y: 0,
    nofGifs:5,
    ongifclicked: null,
    onallclicked: null
  };

})(jQuery);


