/**
 * 
 */
(function($) { 

   // version number
   var t = $.tools.overlay,
       w = $(window); 
      
   // extend global configuragion with effect specific defaults
   $.extend(t.conf, { 
      start: { 
         top: null,
         left: null
      },
      
      fadeInSpeed: 'fast',
      zIndex: 9999
   });         
   
   // utility function
   function getPosition(el) {
      var p = el.offset();
      return {
         top: p.top + el.height() / 2, 
         left: p.left + el.width() / 2
      }; 
   }
   
//{{{ load 

   var loadEffect = function(pos, onLoad) {
      
      var overlay = this.getOverlay(),
          conf = this.getConf(),
          trigger = this.getTrigger(),
          self = this,
          oWidth = overlay.outerWidth({margin:true}),
          oHeight = overlay.outerHeight({margin:true}),
          img = overlay.data("img"),
          position = conf.fixed ? 'absolute' : 'absolute';  
      
      
      // growing image is required.
      if (!img) { 
         var bg = overlay.css("backgroundImage");
         
         if (!bg) { 
            throw "background-image CSS property not set for overlay"; 
         }
         
         // url("bg.jpg") --> bg.jpg
         bg = bg.slice(bg.indexOf("(") + 1, bg.indexOf(")")).replace(/\"/g, "");
         overlay.css("backgroundImage", "none");
         
         img = $('<img src="' + bg + '"/>');
         img.css({border:0, display:'none'}).width(oWidth).height(oHeight); 
         $('body').append(img); 
         overlay.data("img", img);
      }
      
      // initial top & left
      var itop = conf.start.top || Math.round(w.height() / 2), 
          ileft = conf.start.left || Math.round(w.width() / 2);
      
      if (trigger) {
         var p = getPosition(trigger);
         itop = p.top;
         ileft = p.left;
      } 
      
      // put overlay into final position
      if (conf.fixed) {
         itop -= w.scrollTop();
         ileft -= w.scrollLeft();
      } else {
         pos.top += w.scrollTop();
         pos.left += w.scrollLeft();            
      }
         
      // initialize background image and make it visible
      img.css({
         position: 'absolute',
         top: itop, 
         left: ileft,
         width: 0,
         height: 0,
         zIndex: conf.zIndex
      }).show();
      
      pos.position = position;
      overlay.css(pos);
      
      // begin growing
      img.animate({        
         top: overlay.css("top"), 
         left: overlay.css("left"), 
         width: oWidth,
         height: oHeight
         }, conf.speed, function() {
         
         // set close button and content over the image
         overlay.css("zIndex", conf.zIndex + 1).fadeIn(conf.fadeInSpeed, function()  { 
               
            if (self.isOpened() && !$(this).index(overlay)) {  
               onLoad.call(); 
            } else {
               overlay.hide();   
            } 
         });
         
      }).css("position", position);
      
   };
//}}}
   
   
   var closeEffect = function(onClose) {

      // variables
      var overlay = this.getOverlay().hide(), 
          conf = this.getConf(),
          trigger = this.getTrigger(),
          img = overlay.data("img"),
          
          css = { 
            top: conf.start.top, 
            left: conf.start.left, 
            width: 0,
            height: 0
          };
      
      // trigger position
      if (trigger) { $.extend(css, getPosition(trigger)); }
      
      
      // change from fixed to absolute position
      if (conf.fixed) {
         img.css({position: 'absolute'})
            .animate({ top: "+=" + w.scrollTop(), left: "+=" + w.scrollLeft()}, 0);
      }
       
      // shrink image      
      img.animate(css, conf.closeSpeed, onClose);  
   };
   
   
   // add overlay effect   
   t.addEffect("tms_apple", loadEffect, closeEffect); 
   
})(jQuery); 
      
