(function($){
$.fn.fancyZoom = function(options){

  var options   = options || {};
  var directory = options && options.directory ? options.directory : '../images/fancyzoom';
  var zooming   = false;

  if ($('#zoom').length == 0) {
    var ext = ($.browser.msie && parseInt($.browser.version) < 7) ? 'gif' : 'png';
    var html = '';
    if (options.hasBg) {
    	html += '<div id="zoom-bg" style="display:none; z-index: 999"></div>';
    }
    html += '<div id="zoom" style="display:none;"> \
                  <table id="zoom_table" style="border-collapse:collapse; width:100%; height:100%;"> \
                    <tbody> \
                      <tr> \
                        <td class="tl" style="background:url(' + directory + '/tl.' + ext + ') 0 0 no-repeat; width:20px; height:20px; overflow:hidden;" /> \
                        <td class="tm" style="background:url(' + directory + '/tm.' + ext + ') 0 0 repeat-x; height:20px; overflow:hidden;" /> \
                        <td class="tr" style="background:url(' + directory + '/tr.' + ext + ') 100% 0 no-repeat; width:20px; height:20px; overflow:hidden;" /> \
                      </tr> \
                      <tr> \
                        <td class="ml" style="background:url(' + directory + '/ml.' + ext + ') 0 0 repeat-y; width:20px; overflow:hidden;" /> \
                        <td class="mm" style="background:#fff; vertical-align:top; padding:10px;"> \
                          <div id="zoom_content"> \
                          </div> \
                        </td> \
                        <td class="mr" style="background:url(' + directory + '/mr.' + ext + ') 100% 0 repeat-y;  width:20px; overflow:hidden;" /> \
                      </tr> \
                      <tr> \
                        <td class="bl" style="background:url(' + directory + '/bl.' + ext + ') 0 100% no-repeat; width:20px; height:20px; overflow:hidden;" /> \
                        <td class="bm" style="background:url(' + directory + '/bm.' + ext + ') 0 100% repeat-x; height:20px; overflow:hidden;" /> \
                        <td class="br" style="background:url(' + directory + '/br.' + ext + ') 100% 100% no-repeat; width:20px; height:20px; overflow:hidden;" /> \
                      </tr> \
                    </tbody> \
                  </table> \
                  <a href="#" title="Close" id="zoom_close" style="position:absolute; top:0; left:0;"> \
                    <img src="' + directory + '/closebox.' + ext + '" alt="Close" style="border:none; margin:0; padding:0;" /> \
                  </a> \
                </div>';

    $('body').append(html);

    $('html').click(function(e){if($(e.target).parents('#zoom:visible').length == 0) hide();});
    $(document).keyup(function(event){
        if (event.keyCode == 27 && $('#zoom:visible').length > 0) hide();
    });

    $('#zoom_close').click(hide);
  }
  
  if (options.hasBg) {
      var bg = $('#zoom-bg');
  } 

  var zoom          = $('#zoom');
  var zoom_table    = $('#zoom_table');
  var zoom_close    = $('#zoom_close');
  var zoom_content  = $('#zoom_content');
  var middle_row    = $('td.ml,td.mm,td.mr');

  this.each(function(i) {
  	if (options.ajax || options.iframe) {
  		options.url = $(this).attr('href');
    	$(this).attr('href', '#');
    } else {
    	$($(this).attr('href')).hide();
    }
    $(this).click(show);
  });

  return this;

  function show(e) {
  
    if (zooming) return false;
    
    $('object').css('visibility', 'hidden');
	
	zooming         = true;
	
	if (options.ajax || options.iframe) {
		var content = options.url;
	} else {
		var content = $($(this).attr('href'));
	}
	var zoom_width  = options.width;
	var zoom_height = options.height;
	
	var width	= $(window).width();
	var height	= $(window).height();
	var x		= $(document).scrollLeft();
	var y		= $(document).scrollTop();
	
	var window_size = {'width':width, 'height':height, 'x':x, 'y':y}

	var width              = (zoom_width || content.width()) + 60;
	var height             = (zoom_height || content.height()) + 60;
	var d                  = window_size;

	// ensure that newTop is at least 0 so it doesn't hide close button
	var newTop             = Math.max((d.height/2) - (height/2) + y, 0);
	var newLeft            = (d.width/2) - (width/2);
	var curTop             = e.pageY || 0;
	var curLeft            = e.pageX || 0;

	zoom_close.attr('curTop', curTop);
	zoom_close.attr('curLeft', curLeft);
	zoom_close.attr('scaleImg', options.scaleImg ? 'true' : 'false');
	
	if (options.hasBg) {
		var bgAlpha = parseFloat(options.bgAlpha) || .8;
    	bg.hide().css({
    		position: 'absolute',
    		top: '0px',
    		left: '0px',
    		'background-color': options.bgColor || '#000000',
    		opacity: bgAlpha
    	});
    	if ($.browser.msie && parseInt($.browser.version) < 7) {
    		bg.css('filter', 'alpha(opacity='+(bgAlpha*100)+')')
    	}
    	resizeBg();
    	$(window).bind('resize', resizeBg);
  	}

    $('#zoom').hide().css({
		position	: 'absolute',
		top				: curTop + 'px',
		left			: curLeft + 'px',
		width     : '1px',
		height    : '1px',
		zIndex    : '1000'
	});

    fixBackgroundsForIE();
    zoom_close.hide();

    if (options.closeOnClick) {
      $('#zoom').click(hide);
    }

	if (options.scaleImg) {
  		zoom_content.html(content.html());
  		$('#zoom_content img').css('width', '100%');
	} else {
		zoom_content.html('');
	}
	
	
	if (options.hasBg) {
		bg.css('display', 'block');
	}
	
    $('#zoom').animate({
      top     : newTop + 'px',
      left    : newLeft + 'px',
      opacity : "show",
      width   : width,
      height  : height
    }, 500, null, function() {
     	if (options.scaleImg != true) {
     		if (options.ajax) {
    			zoom_content.css({width:(width-60)+'px', height:(height-60)+'px', overflow:'hidden'});
    			zoom_content.load(content);
    		} else if (options.iframe) {
    			zoom_content.css({width:(width-60)+'px', height:(height-60)+'px', overflow:'hidden'});
    			zoom_content.html('<iframe src="'+content+'" width="'+(width-60)+'" height="'+(height-60)+'" frameborder="0" scrolling="no"></iframe>');    		
    		} else {
    			zoom_content.html(content.html());
    		}
  		}
		unfixBackgroundsForIE();
		zoom_close.show();
		zooming = false;
		resizeBg();
    })
    if ($.browser.msie) {
	    middle_row.animate({
	      height  : height-60
	    }, 500);
    }
    return false;
  }

  function hide() {
    
    if (zooming) return false;
	
	zooming = true;
	
	if (options.hasBg) {
		$('#zoom-bg').hide();
		$(window).unbind('resize', resizeBg);
	}
	
	$('#zoom').unbind('click');
	fixBackgroundsForIE();
	if (zoom_close.attr('scaleImg') != 'true') {
  		zoom_content.html('');
	}
	if (options.ajax || options.iframe) {
		zoom_content.attr('style', '');
	}
	zoom_close.hide();
	$('#zoom').animate({
      	top     : zoom_close.attr('curTop') + 'px',
      	left    : zoom_close.attr('curLeft') + 'px',
     	opacity : "hide",
      	width   : '1px',
      	height  : '1px'
    	},
    	500,
    	null,
    	function() {
    	$('object').css('visibility', 'visible');
  		if (zoom_close.attr('scaleImg') == 'true') {
			zoom_content.html('');
			}
  		unfixBackgroundsForIE();
		zooming = false;
		resizeBg();
    });
    if ($.browser.msie) {
	    middle_row.animate({
	      opacity : "hide",
	      height  : '1px'
	    }, 500);
    }
    return false;
  }

  function switchBackgroundImagesTo(to) {
    $('#zoom_table td').each(function(i) {
      var bg = $(this).css('background-image').replace(/\.(png|gif|none)\"\)$/, '.' + to + '")');
      $(this).css('background-image', bg);
    });
    var close_img = zoom_close.children('img');
    var new_img = close_img.attr('src').replace(/\.(png|gif|none)$/, '.' + to);
    close_img.attr('src', new_img);
  }

  function fixBackgroundsForIE() {
    if ($.browser.msie && parseInt($.browser.version) > 6) {
      switchBackgroundImagesTo('gif');
    }
	}

  function unfixBackgroundsForIE() {
    if ($.browser.msie && parseInt($.browser.version) > 6) {
      switchBackgroundImagesTo('png');
    }
	}
	
	function resizeBg() {
		if (options.hasBg) {
			$('#zoom-bg').css('height', 0);
			$('#zoom-bg').css({width:$(window).width(), height:$(document).height()});
		}
	}
}
})(jQuery);
