//
// ZImg v.0.1 (22.03.2008)
// Разработчик: http://altra.ru
// Если Вы хотите использовать этот скрипт, свяжитесь с разработчиком
//
         
// Размер картинки loader для ее центрирования
lw=31;
lh=31;
// Число шагов увеличения и скорость
sn=20;
sp=50;
//
egif="/img/e.gif";
lgif="/img/loader.gif";
zborder="1px solid black";
// Массив изображений для загрузки в фоне
zimg_img=new Array();
zimg_img2=new Array(); // для сохранения исходных, в случае, если исходник убираем при увеличении
// Массивы для перемещения и изменения размеров
zx0=new Array();
zx1=new Array();
zw0=new Array();
zw1=new Array();
zy0=new Array();
zy1=new Array();
zh0=new Array();
zh1=new Array();
zst=new Array();
//
var n=10000; // начальный z-index
var ie=(document.all);
var ns6=(document.getElementById&&!document.all);

// Перемещение и изменение размеров объектов
function timer() {
  for(id in zst) {
    if (zst[id]!=0) {
      z=document.getElementById("zoomer"+id).style;
      if (zst[id]>0) {
        // Увеличение
        x=((zx1[id]-zx0[id])/sn*(sn-zst[id]+1))+zx0[id];
        y=((zy1[id]-zy0[id])/sn*(sn-zst[id]+1))+zy0[id];
        w=((zw1[id]-zw0[id])/sn*(sn-zst[id]+1))+zw0[id];
        h=((zh1[id]-zh0[id])/sn*(sn-zst[id]+1))+zh0[id];
        zst[id]=zst[id]-1;
        if (zst[id]==sn-1) {
          z.border=zborder;
        }
        if (zst[id]==0) {
          z.border="1px solid black";
          z.padding="9px";
          z.background="white";
          x=x-10;
          y=y-10;
        }
      } else {
        // Уменьшение
        x=((zx1[id]-zx0[id])/sn*(-zst[id]-1))+zx0[id];
        y=((zy1[id]-zy0[id])/sn*(-zst[id]-1))+zy0[id];
        w=((zw1[id]-zw0[id])/sn*(-zst[id]-1))+zw0[id];
        h=((zh1[id]-zh0[id])/sn*(-zst[id]-1))+zh0[id];
        zst[id]=zst[id]+1;
        if (zst[id]==0) {
          document.getElementById("img"+id).src=zimg_img2[id].src;
          z.display="none";
        }
        if (zst[id]==-sn+1) {
          if (ns6) {
            x+=10;
            y+=10;
            zx1[id]+=10;
            zy1[id]+=10;
          }
          z.border=zborder;
          z.padding="0";
          z.background="transparent";
        }
      }
      z.left=x+"px";
      z.top=y+"px";
      z.width=w+"px";
      z.height=h+"px";
      zi=document.getElementById("zimg"+id).style;
      zi.width=w+"px";
      zi.height=h+"px";
    }
  }
  setTimeout("timer()",sp);
}

// Картинка загружена, показываем
function load_complete(id) {
  if (!zimg_img2[id]) {
    zimg_img2[id]=new Image();
  }
  zimg_img2[id].src=document.getElementById("img"+id).src;
  z=document.getElementById("zoomer"+id).style;
  // Координаты видимой области
  sx1=getBodyScrollLeft();
  sy1=getBodyScrollTop();
  sx2=sx1+getClientWidth();
  sy2=sy1+getClientHeight();
  // Новые координаты картинки стараемся сделать по центру со старыми, но не вылезти за край экрана
  x1=zx0[id]-Math.round((zimg_img[id].width-zw0[id])/2);
  if (x1+zimg_img[id].width>sx2) x1=x1-(x1+zimg_img[id].width-sx2);
  if (x1<sx1) x1=sx1;
  y1=zy0[id]-Math.round((zimg_img[id].height-zh0[id])/2);
  if (y1+zimg_img[id].height>sy2) y1=y1-(y1+zimg_img[id].height-sy2);
  if (y1<sy1) y1=sy1;
  //
  zx1[id]=x1;
  zy1[id]=y1;
  zw1[id]=zimg_img[id].width;
  zh1[id]=zimg_img[id].height;
  //
  z.padding="0";
  z.zIndex=++n;
  zi=document.getElementById("zimg"+id).style;
  document.getElementById("zimg"+id).src=egif;
  zi.width=zw0[id]+"px";
  zi.height=zh0[id]+"px";
  document.getElementById("zimg"+id).src=zimg_img[id].src;
  zst[id]=sn;
  document.getElementById("img"+id).src=egif;
  setTimeout("timer()",0);
}

// Запрос на загрузку (вызывается по клику на картинке)
function zoom(filename,id) {
  zfile=document.getElementById("img"+id).src;
  zfile=zfile.substr(zfile.lastIndexOf("/")+1);
  if (zfile!=egif) {
    document.getElementById("zimg"+id).src=lgif;
    pos=getElementPosition("img"+id);
    z=document.getElementById("zoomer"+id).style;
    i=document.getElementById("img"+id).style;
    zi=document.getElementById("zimg"+id).style;
    z.left=pos.left+"px";
    z.top=pos.top+"px";
    // Сохраняем начальные координаты и размеры
    zx0[id]=pos.left;
    zw0[id]=parseInt(i.width);
    zy0[id]=pos.top;
    zh0[id]=parseInt(i.height);
    // Отступы для центрирования loader внутри zoomer
    iw=parseInt(i.width);
    ih=parseInt(i.height);
    px=Math.round((iw-lw)/2);
    py=Math.round((ih-lh)/2);
    z.padding=py+"px "+px+"px";
    //
    z.width=lw+"px";
    z.height=lh+"px";
    zi.width=lw+"px";
    zi.height=lh+"px";
    z.display="block";
    //
    zimg_img[id]=new Image();
    zimg_img[id].onload=function lc() {load_complete(id)};
    zimg_img[id].src=filename;
  }
}

// Определяет координаты объекта на странице
function getElementPosition(elemId) {
  var elem=document.getElementById(elemId);
  var w=elem.offsetWidth;
  var h=elem.offsetHeight;
  var l=0;
  var t=0;
  while (elem) {
    l+=elem.offsetLeft;
    t+=elem.offsetTop;
    elem=elem.offsetParent;
  }
  return {"left":l,"top":t,"width":w,"height":h};
}

// Определение размеров окна и прокрутки документа
function getClientWidth() {
  return document.compatMode=='CSS1Compat'&&!window.opera?document.documentElement.clientWidth:document.body.clientWidth;
}
function getClientHeight() {
  return document.compatMode=='CSS1Compat'&&!window.opera?document.documentElement.clientHeight:document.body.clientHeight;
}
function getBodyScrollTop() {
  return self.pageYOffset||(document.documentElement&&document.documentElement.scrollTop)||(document.body&&document.body.scrollTop);
}
function getBodyScrollLeft() {
  return self.pageXOffset||(document.documentElement&&document.documentElement.scrollLeft)||(document.body&&document.body.scrollLeft);
}

// Drag & Drop
dz=false;
if (ns6) {
//  window.captureEvents(Event.MOUSEDOWN | Event.MOUSEMOVE | Event.MOUSEUP);
//  document.releaseEvents(Event.MOUSEMOVE);
}
if (ie||document.getElementById) {
  document.onmousedown=down;
  document.onmouseup=up
}
//
function down(e){
  if (ie&&window.event.srcElement.parentElement) {
    if (window.event.srcElement.parentElement.id.indexOf("zoomer")!=-1) {
      document.onmousemove=move;
      dz=window.event.srcElement.parentElement; 
      mx=window.event.offsetX;
      my=window.event.offsetY;
      di=window.event.srcElement.parentElement.id.substr(6);
      dx0=window.event.clientX;
      dy0=window.event.clientY;
      w=window.event.srcElement.parentElement.id.charAt(window.event.srcElement.parentElement.id.length-1); 
      if (window.event.srcElement.parentElement.style.zIndex<n) {
        dx0++; // если не поверх всех, то первым кликом активируем, но не уменьшаем
        window.event.srcElement.parentElement.style.zIndex=++n;
      }
    }
  }
  if (ns6) {
    if (e.target.parentNode.id.indexOf("zoomer")!=-1) {
      document.onmousemove=move;
      dz=e.target.parentNode.style;
      mx=e.clientX-parseInt(dz.left);
      my=e.clientY-parseInt(dz.top);
      di=e.target.parentNode.id.substr(6);
      dx0=e.clientX;
      dy0=e.clientY;
      w=e.target.parentNode.id.charAt(e.target.parentNode.id.length-1);
      if (dz.zIndex<n) {
        dx0++; // если не поверх всех, то первым кликом активируем, но не уменьшаем
        dz.zIndex=++n;  
      }
    } 
  }
  return false;
}
//
function move(e) {
  if (ie&&dz) {
    dz.style.posLeft=window.event.clientX-mx+getBodyScrollLeft();
    dz.style.posTop=window.event.clientY-my+getBodyScrollTop();
  }
  if (ns6&&dz) {
    dz.top=parseInt(e.clientY)-my+"px";
    dz.left=parseInt(e.clientX)-mx+"px";
  }
  return false;
}
//
function up(e) {
  if (dz) {
    if (ie&&dz) {
      ux=window.event.clientX;
      uy=window.event.clientY;
      if ((ux==dx0)&&(uy==dy0)&&(zst[di]==0)) {
        zx1[di]=ux-mx+getBodyScrollLeft();
        zy1[di]=uy-my+getBodyScrollTop();
        zst[di]=-sn;
        n--;
      }
    }
    if (ns6&&dz) {
      ux=parseInt(e.clientX);
      uy=parseInt(e.clientY);
      // Уменьшаем
      if ((ux==dx0)&&(uy==dy0)&&(zst[di]==0)) {
        zx1[di]=ux-mx;
        zy1[di]=uy-my;
        zst[di]=-sn;
        n--;
      }
    }
  }
  if (ie||ns6) document.onmousemove=null;
  dz=null;
}