var zoomImg = {

 border: '1px solid gray',
 duration: 300,

 srcSearch: /(.*)(\.[a-zA-Z0-9])+/,
 srcReplace: '$1_big$2',

 URLPrefix: '',

 zoomInCurSrc: 'zoomin.cur',
 zoomOutCurSrc: 'zoomout.cur',

 loaderSrc: 'ajax-loader.gif',
 loaderDx: 10,
 loaderDy: 10,

 hMargin: 10,
 wMargin: 10,

 ieDx: 0,
 ieDy: 0,


 ie: document.all && !window.opera,
 ds: null,

 getDocSize: function() {
  var w = (document.body.scrollWidth > document.body.offsetWidth)?document.body.scrollWidth:document.body.offsetWidth; 
  var h = (document.body.scrollHeight > document.body.offsetHeight)?document.body.scrollHeight:document.body.offsetHeight;
  var cw = document.compatMode=='CSS1Compat' && !window.opera?document.documentElement.clientWidth:document.body.clientWidth;
  var ch = document.compatMode=='CSS1Compat' && !window.opera?document.documentElement.clientHeight:document.body.clientHeight;
  if (w < cw) w = cw;
  if (h < ch) h = ch;
  return {w:w,h:h};
 },

 getXY: function(el) {
  var x = y = 0;
  first = true;
  while (el) {
   x += el.offsetLeft;
   y += el.offsetTop;
   if (!first && document.all) {
    if (window.opera) {
     if (el.style.marginTop) y -= zoomImg.parsePx(el.style.marginTop);
    }
    else {
     if (el.style.marginLeft) x -= zoomImg.parsePx(el.style.marginLeft);
     if (el.style.paddingLeft) x -= zoomImg.parsePx(el.style.paddingLeft);
    }
   }
   first = false;
   el = el.offsetParent;
  }
  return {x:x,y:y};
 },

 parsePx: function(v) {
  return parseInt(v.substring(0,v.length-2));
 },

 onLoadBigImage: function() {

  var img = document.getElementById('zoomIn');
  zoomImg.removeHandlers();

  $('#zoomLoader').remove();
  $('#zoomIn').show();

  var minW = zoomImg.parsePx(img.style.width);
  var minH = zoomImg.parsePx(img.style.height);

  var ti = new Image();
  ti.src = img.src;
  var maxW = ti.width;
  var maxH = ti.height; 
  var imgXY = zoomImg.getXY(img); 
  
  var dt = parseInt((maxH - minH) / 2); 
  if ((dt - imgXY.y) > zoomImg.hMargin) dt = imgXY.y - zoomImg.hMargin; 
  else if ((imgXY.y + minH + dt) > (zoomImg.ds.h - zoomImg.hMargin)) dt = dt * 2 - (zoomImg.ds.h - zoomImg.hMargin - imgXY.y - minH); 
  
  var dl = parseInt((maxW - minW) / 2); 
  if ((dl - imgXY.x) > zoomImg.wMargin) dl = imgXY.x - zoomImg.wMargin; 
  else if ((imgXY.x + minW + dl) > (zoomImg.ds.w - zoomImg.wMargin)) dl = dl * 2 - (zoomImg.ds.w - zoomImg.wMargin - imgXY.x - minW); 
  
  if (window.opera) $('#zoomIn').css('cursor','pointer'); else $('#zoomIn').css('cursor',"url('"+zoomImg.zoomOutCurSrc+"'), pointer"); $('#zoomIn').attr('title','Вернуть исходный размер');
  $('#zoomIn').animate({
   width: maxW + 'px',
   height: maxH + 'px',
   top: (t - dt) + 'px',
   left: (l - dl) + 'px'
  }, zoomImg.duration);

  $('#zoomIn').click(function(){ // zoom out
   $(this).animate({
    width: minW + 'px',
    height: minH + 'px',
    top: t + 'px',
    left: l + 'px'
   }, zoomImg.duration);
   $(this).queue(function(){
    $(this).remove();
   });
   zoomImg.setHandlers();
  });

 },

 zoomIn: function() {

  $("#zoomIn").remove();
  var iSrc = $(this).get(0).src.replace(zoomImg.srcSearch, zoomImg.srcReplace);
  var coord = zoomImg.getXY($(this).get(0));
  l = coord.x;
  t = coord.y;
  if (zoomImg.ie) {
   l += zoomImg.ieDx;
   t += zoomImg.ieDy;
  }
  var bW = $(this).attr('width');
  var bH = $(this).attr('height');

  $(new Image()).attr('id','zoomIn').css('display','none').css('border',zoomImg.border).css('position','absolute').css('width',bW+'px').css('height',bH+'px').css('margin','0px').css('left',l+'px').css('top',t+'px').css('z-index','999999').attr('src',iSrc).prependTo($('body'));
  var ni = document.getElementById('zoomIn');
  if (ni.complete) {
   zoomImg.onLoadBigImage();
  }
  else {
   $(ni).load(zoomImg.onLoadBigImage);
   $('#zoomLoader').remove();
   $(new Image()).attr('id','zoomLoader').css('position','absolute').css('margin','0px').css('left',(l+zoomImg.loaderDx)+'px').css('top',(t+zoomImg.loaderDy)+'px').css('z-index','999998').attr('src',zoomImg.loaderSrc).prependTo($('body'));
  }

 },

 setHandlers: function() {
  $(".zoom").each(function(){
   $(this).click(zoomImg.zoomIn);
   if (window.opera) $(this).css('cursor','pointer');
   else $(this).css('cursor',"url('"+zoomImg.zoomInCurSrc+"'), pointer");
   $(this).attr('title','Увеличить изображение');
  });
 },

 removeHandlers: function() {
  $(".zoom").each(function(){
   $(this).unbind('click', zoomImg.zoomIn);
   $(this).css('cursor','default');
   $(this).removeAttr('title');
  });
 },

 ini: function() {
  zoomImg.zoomInCurSrc = zoomImg.URLPrefix + zoomImg.zoomInCurSrc; 
  zoomImg.zoomOutCurSrc = zoomImg.URLPrefix + zoomImg.zoomOutCurSrc;
  zoomImg.loaderSrc = zoomImg.URLPrefix + zoomImg.loaderSrc;
  zoomImg.ds = zoomImg.getDocSize();
  zoomImg.setHandlers();
 }
  
}
