 /*
 * Nex Fullsize
 * Copyright 2009 Christof Haemmerle, Nex9, LLC 
 * http://www.nex9.com
 * 
 * This Code is heavyly based on Drew Wilson fullsize plugin. 
 * www.drewwilson.com
 * www.addfullsize.com
 *
 * Version 0.1
 *
 *
 * This Nex Fullsize jQuery plug-in is dual licensed under the MIT and GPL licenses:
 *   http://www.opensource.org/licenses/mit-license.php
 *   http://www.gnu.org/licenses/gpl.html
 */

(function($){

  $.fn.nexFullsize = function(options) {

    var defaults = {  
        shadow: true,  
        zoomInSpeed: 200,  
        zoomOutSpeed: 200,
        fadeInSpeed: 250,  
        fadeOutSpeed: 250,  
        iconOffset: 8,
        forceTitleBar: false,
        destroy: false
      };  
    var opts = $.extend(defaults, options);
    
    // // plugin dependency
    // if (jQuery.livequery) {
    //   jQuery.livequery.registerPlugin("pluginMethodName");
    // };
    
    // Remove all Fullsize Icons on destroy request
    if(opts.destroy == true){
      $("div.fullsize-icon").remove();
    }

    // If ESC key pressed, close Fullsize
    $(document).keydown(function(event){
      if(event.keyCode == 27){
        $("div.fullsize-wrapper, div.fullsize-sh-wrap").fadeOut(opts.fadeOutSpeed, function(){
          $(this).remove();
        });
      }
    });
    
    
    $(this).live('click', function() {
      
      if( $(this).attr("longdesc") ){
        
        // Declare the current Image as a variable, and gather some of it's properties.
        var org_image = $(this);  
        var img_title = org_image.attr("title");
        var img_src = org_image.attr("longdesc");
        
        // If a Fullsize Popup is currently active, we will remove it before creating a new one.  
        $("div.fullsize-wrapper, div.fullsize-sh-wrap").remove();
        
        // Gather window & scroll positions.
        var win_w = $(window).width();
        var win_h = $(window).height();
        var scrolltop = $(window).scrollTop();
        var scrollleft = $(window).scrollLeft();
        
        // Setup the Loading DIV 
        var loading_left = ((win_w / 2) + scrollleft) - 25;
        var loading_top = ((win_h / 2) + scrolltop) - 25;
        var full_loading = $("<div></div>").addClass('fullsize-loading').css({"margin-left":loading_left, "margin-top":loading_top});
        var full_loading_inner = $("<div></div>").addClass('fullsize-loading-inner');
        $(full_loading).prepend(full_loading_inner);
        $("body").prepend(full_loading);
        
        
        // Setup the Fullsize Image         
        var full_img = new Image();
        $(full_img).load(function(){
          $(this).hide();
          
          // Determine how to position the Fullsize Image into the center of the page.
          var new_offset = org_image.offset();
          img_w = this.width;
          img_h = this.height;
      
          // If the Image is bigger than the window, shrink it to fit in the window.
          aspect = img_w / img_h;
          if ((img_w + 50) > win_w) {
            img_w = win_w - 50;
            img_h = img_w / aspect;
          }
          if ((img_h + 100) > win_h) {
            img_h = win_h - 100;
            img_w = img_h * aspect;
          }
          
          var img_left = Math.round(((win_w - img_w) / 2) + scrollleft);
          var img_top = Math.round(((win_h - img_h) / 2) + scrolltop);
          if(img_left < 0) {
            img_left = 0;
          }
          if(img_top < 0) {
            img_top = 0;
          } 

          $(this).css({"height": org_image.height() + "px", "width":org_image.width() + "px"});
          $("div.fullsize-loading").remove();
          var full_wrap = $("<div></div>").addClass("fullsize-wrapper").css({"display":"none", "margin-top":new_offset.top, "margin-left":new_offset.left});            
          $(full_wrap).prepend(this);
          
          // If there is a 'Title' attribute on the Original Image, display the Title bar.        
          if(img_title != "" || opts.forceTitleBar == true) {
            var full_close = $("<a></a>").addClass("fullsize-close");
            var full_title = $("<div></div>").addClass("fullsize-title").css({"max-width":img_w});
            var full_title_text = $("<div></div>").addClass("fullsize-title-text").text(img_title);             
            $(full_title).prepend(full_close);
            $(full_title).prepend(full_title_text);
            $(full_wrap).prepend(full_title);
            $("body").prepend(full_wrap);
            if(img_top != 0) {
              img_top = img_top - 12;
            } 
          } else {
            $(this).addClass("fullsize-close");
            $("body").prepend(full_wrap);         
          }
  
          // Setup Shadows
          if (opts.shadow == true) {
            if ($.browser.safari) {
              $(full_wrap).css({"-webkit-box-shadow":"0 2px 16px #000", "box-shadow":"0 2px 16px #000"});
            } else {
              var full_sh_wrap = $("<div></div>").addClass("fullsize-sh-wrap").css({"display":"none", "width": org_image.width(), "margin-top":new_offset.top, "margin-left":new_offset.left});
              var full_sh_top = $("<div></div>").addClass("fullsize-sh-top");
              var full_sh_top_left = $("<div></div>").addClass("fullsize-sh-top-l");
              var full_sh_top_middle = $("<div></div>").addClass("fullsize-sh-top-m");
              var full_sh_top_right = $("<div></div>").addClass("fullsize-sh-top-r");
              $(full_sh_top).append(full_sh_top_left).append(full_sh_top_right).append(full_sh_top_middle);
              $(full_sh_wrap).prepend(full_sh_top);
              var full_sh_body = $("<div></div>").addClass("fullsize-sh-body");
              var full_sh_body_r = $("<div></div>").addClass("fullsize-sh-body-r");
              $(full_sh_body).append(full_sh_body_r);
              $(full_sh_wrap).append(full_sh_body);
              var full_sh_bottom = $("<div></div>").addClass("fullsize-sh-bottom");
              var full_sh_bottom_left = $("<div></div>").addClass("fullsize-sh-bottom-l");
              var full_sh_bottom_middle = $("<div></div>").addClass("fullsize-sh-bottom-m");
              var full_sh_bottom_right = $("<div></div>").addClass("fullsize-sh-bottom-r");
              $(full_sh_bottom).append(full_sh_bottom_left).append(full_sh_bottom_right).append(full_sh_bottom_middle);
              $(full_sh_wrap).append(full_sh_bottom);
              $("body").prepend(full_sh_wrap);
            
              // Setup shadow Animations
              $(full_sh_body).animate({
                height: parseInt(full_wrap.height()) + img_h - 22     
              }, {queue:false, duration:opts.zoomInSpeed});
              $(full_sh_wrap).fadeIn(opts.fadeInSpeed).animate({
                height: parseInt(full_wrap.height()) + img_h + 22,
                width: img_w + 22,
                marginTop: img_top - 9,
                marginLeft: img_left - 11         
              }, {queue:false, duration:opts.zoomInSpeed});
            }
          }

          // Setup Animations
          $(this).fadeIn(opts.fadeInSpeed).animate({
            height: img_h,
            width: img_w        
          }, {queue:false, duration:opts.zoomInSpeed});
          $(full_wrap).fadeIn(opts.fadeInSpeed).animate({
            width: img_w,
            marginTop: img_top,
            marginLeft: img_left      
          }, {queue:false, duration:opts.zoomInSpeed});         
  
          $(".fullsize-close").click(function(){
            closeFullsize(full_img, full_wrap, org_image, $(this)); 
          });
              
        }).attr("src",img_src).addClass("fullsize-image");
      }
      
      function closeFullsize(full_img, full_wrap, org_image, ele) {
        var offsets = org_image.offset();
        $(full_img).fadeOut(opts.fadeOutSpeed).animate({
          height: org_image.height(),
          width: org_image.width()        
        }, { queue:false, duration:opts.zoomOutSpeed });
                  
        if (opts.shadow == true) {
          $("div.fullsize-sh-wrap").remove();
        }
        
        $(full_wrap).fadeOut(opts.fadeOutSpeed).animate({
          width: org_image.width(),
          marginTop: offsets.top,
          marginLeft: offsets.left      
        }, { queue:false, duration:opts.zoomOutSpeed, complete: function(){ ele.remove(); } });
      
      }
      
      return false;
      
    });
    
  }
})(jQuery);  