
// Our custom drag and drop implementation, extending YAHOO.util.DD
YAHOO.example.DDOnTop = function(id, sGroup, config) 
{
    YAHOO.example.DDOnTop.superclass.constructor.apply(this, arguments);
};


YAHOO.extend(YAHOO.example.DDOnTop, YAHOO.util.DD,
{

 onDrag: function (e)
    {
      respectBoundaries(this.pzo.id);
    },
	endDrag: function(e)
	{
		
		var iw = 'imagewindow' + this.pzo.id;
		var ff = 'fullframeimage' + this.pzo.id;
		var ci = 'croppedimage' + this.pzo.id;
		var uci = 'uncroppedimage' + this.pzo.id;
		
		var ffleft = getPXdim( ff, 'left', 'checkZero', '');
		var fftop = getPXdim( ff, 'top', 'checkZero', '' );

		var ffwidth = getPXdim( ff, 'width', '', '' );
		var ffheight = getPXdim( ff, 'height', '', '' );


		var imagewindoww = getPXdim( iw, 'width', '', '' );
		var imagewindowh = getPXdim( iw, 'height', '', '' );

		var newcroppedimagew = imagewindoww;
		var newcroppedimageh = imagewindowh;

		if ( ffwidth < imagewindoww )
		  {
		    newcroppedimagew = ffwidth;
		    newcroppedimageh = ffheight;
		  }



		ffleft=Math.abs(ffleft);
		fftop=Math.abs(fftop);

	
		var gix = ffleft + (imagewindoww/2);
		var giy = fftop + (imagewindowh/2);
	
	
		gix = gix * Math.pow(2,this.pzo.res);
		giy = giy * Math.pow(2,this.pzo.res);

		this.pzo.clickx_scaled = gix;
		this.pzo.clicky_scaled = giy;

		var scaledImageWindowWH = scale4res(this.pzo.res, imagewindoww, imagewindowh);
		this.pzo.imagewindoww_scaled = scaledImageWindowWH[0];
		this.pzo.imagewindowh_scaled = scaledImageWindowWH[1];

	
		var newsrc = this.pzo.mediahost + "/cgi/i/image/getimage-idx?c=" + this.pzo.c + ";cc=" + this.pzo.cc + ";entryid=" + this.pzo.entryid + ";viewid=" + this.pzo.viewid + ";x=" + gix + ";y=" + giy + ";width=" + newcroppedimagew + ";height=" + newcroppedimageh + ";res=" + this.pzo.res;
		var newele = "<img class=\"croppedimage\" id=\"" + ci + "\" src=\"" + newsrc + "\">";


		$(ci).replace(newele); 
	
		YAHOO.util.Dom.setStyle([ci], 'left', ffleft + 'px');
		YAHOO.util.Dom.setStyle([ci], 'top', fftop + 'px');


		adjustZoomRefCrop( this.pzo ); 
	}

  
  
	
});


function adjustZoomRefCrop( pzo )
{

  if ( ( ! pzo.thumbh ) || ( ! pzo.thumbw ) )
    {
      return;
    }

  var zrtcinner = 'zoomrefthumbcropinner' + pzo.id;
  var zrtcouter = 'zoomrefthumbcropouter' + pzo.id;

  var w_perc = pzo.imagewindoww_scaled/pzo.maxw;
  var h_perc = pzo.imagewindowh_scaled/pzo.maxh;

  var w= Math.round(w_perc*pzo.thumbw);
  var h= Math.round(h_perc*pzo.thumbh);

  var x_perc = pzo.clickx_scaled/pzo.maxw;
  var y_perc = pzo.clicky_scaled/pzo.maxh;
    
  var left = Math.round((x_perc*pzo.thumbw)-(.5*w));
  var top = Math.round((y_perc*pzo.thumbh)-(.5*h));

  if ( w > pzo.thumbw )
    {
      w = pzo.thumbw;
    }

  if ( h > pzo.thumbh )
    {
      h = pzo.thumbh;
    }

  if ( top < 0 )
    {
      top = 0;
    }

  if (left < 0 )
    {
      left = 0;
    }

  if ( top + h > pzo.thumbh )
    {
      top = pzo.thumbh - h;
    }

  if ( left + w > pzo.thumbw )
    {
      left = pzo.thumbw - w;
    }
  
  YAHOO.util.Dom.setStyle([zrtcinner], 'width', w+2 + 'px');
  YAHOO.util.Dom.setStyle([zrtcinner], 'height', h+2 + 'px');

  YAHOO.util.Dom.setStyle([zrtcinner], 'top', top-1 + 'px');
  YAHOO.util.Dom.setStyle([zrtcinner], 'left', left-1 + 'px');

  YAHOO.util.Dom.setStyle([zrtcinner], 'border-style', 'solid');


  YAHOO.util.Dom.setStyle([zrtcouter], 'width', w + 'px');
  YAHOO.util.Dom.setStyle([zrtcouter], 'height', h + 'px');

  YAHOO.util.Dom.setStyle([zrtcouter], 'top', top + 'px');
  YAHOO.util.Dom.setStyle([zrtcouter], 'left', left + 'px');

  YAHOO.util.Dom.setStyle([zrtcouter], 'border-style', 'solid');


}

function respectBoundaries(pzoid)
{

  var iw = 'imagewindow' + pzoid;
  var ff = 'fullframeimage' + pzoid;

		
  var ffleft = getPXdim( ff, 'left', 'checkZero', '');
  var fftop = getPXdim( ff, 'top', 'checkZero', '' );

  var ffwidth = getPXdim( ff, 'width', '', '' );
  var ffheight = getPXdim( ff, 'height', '', '' );


  var imagewindoww = getPXdim( iw, 'width', '', '' );
  var imagewindowh = getPXdim( iw, 'height', '', '' );


  if ( ffwidth < imagewindoww )
    {
      YAHOO.util.Dom.setStyle([ff], 'left', ((imagewindoww/2) - (ffwidth/2)) + 'px');
    }
  else if ( ( ffwidth <= imagewindoww ) || ( ffleft >= 0 ) )
    {
      YAHOO.util.Dom.setStyle([ff], 'left', '0px');
    }
  else if ( ffleft < 0-ffwidth+imagewindoww )
    {
      YAHOO.util.Dom.setStyle([ff], 'left', imagewindoww-ffwidth + 'px');
    }

  if ( ffheight < imagewindowh )
    {
      YAHOO.util.Dom.setStyle([ff], 'top', ((imagewindowh/2) - (ffheight/2)) + 'px');
    }
  else if ( ( ffheight <= imagewindowh ) || ( fftop >= 0 ) )
    {
      YAHOO.util.Dom.setStyle([ff], 'top', '0px');
    }
  else if ( fftop < 0-ffheight+imagewindowh )
    {
      YAHOO.util.Dom.setStyle([ff], 'top', imagewindowh-ffheight + 'px');
    }
}
	


function imageZoom(event, pzo)
{ 



  var iw = 'imagewindow' + pzo.id;
  var ff = 'fullframeimage' + pzo.id;
  var ci = 'croppedimage' + pzo.id;
  var uci = 'uncroppedimage' + pzo.id;

  var fullframew = getPXdim(ff, 'width', '', '');
  var fullframeh = getPXdim(ff, 'height', '', '');

  YAHOO.util.Dom.removeClass(['imagesize' + pzo.res], 'imagesizezoomed');	
	
  var clickx, clicky;


  if ( ( event.target.id == "zti" ) || ( event.target.id == "zto" ) )
    {
      clickx = fullframew/2;
      clicky = fullframeh/2;
    }
  else
    {
      var clickXY = imageClickCoords(event);
      clickx = clickXY[0];
      clicky = clickXY[1];
    }

  scaledClickXY = scale4res(pzo.res, clickx, clicky);
  var clickx_scaled = scaledClickXY[0];
  var clicky_scaled = scaledClickXY[1];

  if ( ( event.target.id == "zti" ) || ( event.target.id == "zto" ) )
    {
      if ( pzo.clickx_scaled )
	{
	  clickx_scaled = pzo.clickx_scaled;
	}
      if ( pzo.clicky_scaled )
	{
	  clicky_scaled = pzo.clicky_scaled;
	}
    }

  var imagewindoww = getPXdim(iw, 'width', '', 'makeAbs');
  var imagewindowh = getPXdim(iw, 'height', '', 'makeAbs');


  if ( (event.shiftKey) || ( event.target.id == "zto") )
    {
      pzo.res += 1;
    }
  else
    {
      pzo.res -= 1;
    }

  if (pzo.res < 0)
    {
      pzo.res = 0;
    }
  else if ( pzo.res > pzo.levels )
    {
      pzo.res = pzo.levels;
    }

  pzo.clickx_scaled = clickx_scaled;
  pzo.clicky_scaled = clicky_scaled;

  var xlimit = pzo.maxw - (imagewindoww * Math.pow(2,pzo.res+1)/(pzo.levels));
  if ( clickx_scaled > xlimit )
    {
      clickx_scaled = xlimit;
    }

  var ylimit = pzo.maxh - (imagewindowh * Math.pow(2,pzo.res+1)/(pzo.levels));
  if ( clicky_scaled > ylimit )
    {
	   clicky_scaled = ylimit;
    }




  var neww = pzo.maxw / Math.pow(2, pzo.res);
  var newh = pzo.maxh / Math.pow(2, pzo.res);
	
  var newclickx = clickx_scaled / Math.pow(2, pzo.res);
  var newclicky = clicky_scaled / Math.pow(2, pzo.res);
	
  var fullframeimageleft = (imagewindoww/2) - (neww/2);
  var fullframeimagetop = (imagewindowh/2) - (newh/2);
	
	
  fullframeimageleft = fullframeimageleft - newclickx + (neww/2);
  fullframeimagetop = fullframeimagetop - newclicky + (newh/2);
	
	
  YAHOO.util.Dom.setStyle([ff], 'left', fullframeimageleft + 'px');
  YAHOO.util.Dom.setStyle([ff], 'top', fullframeimagetop + 'px');

  YAHOO.util.Dom.setStyle([ff], 'width', neww + 'px');
  YAHOO.util.Dom.setStyle([ff], 'height', newh + 'px');
	 
	
  YAHOO.util.Dom.setStyle([uci], 'width', neww + 'px');
  YAHOO.util.Dom.setStyle([uci], 'height', newh + 'px');

  var newcroppedimagew = imagewindoww;
  var newcroppedimageh = imagewindowh;

  if ( newh < imagewindoww )
    {
      newcroppedimagew = neww;
      newcroppedimageh = newh;
    }

    respectBoundaries(pzo.id);

    fullframeimageleft = getPXdim(ff, 'left', 'checkkZero', 'makeAbs');
    fullframeimagetop = getPXdim(ff, 'top', 'checkZero', 'makeAbs');
	

  var scaledImageWindowWH = scale4res(pzo.res, imagewindoww, imagewindowh);
  pzo.imagewindoww_scaled = scaledImageWindowWH[0];
  pzo.imagewindowh_scaled = scaledImageWindowWH[1];

  var newsrc = pzo.mediahost + "/cgi/i/image/getimage-idx?c=" + pzo.c + ";cc=" + pzo.cc + ";entryid=" + pzo.entryid + ";viewid=" + pzo.viewid + ";x=" + clickx_scaled + ";y=" + clicky_scaled + ";width=" + newcroppedimagew + ";height=" + newcroppedimageh + ";res=" + pzo.res;
	
  //tried just replacing the src, but interface was clunky. releplacing element is better.
  var newele = "<img class=\"croppedimage\" id=\"" + ci + "\" src=\"" + newsrc + "\">";

  //  var objImage = new Image();
  // objImage.onLoad=imagesLoaded();
  //objImage.src=newsrc;

  $(ci).replace(newele); 

  YAHOO.util.Dom.setStyle([ci], 'left', fullframeimageleft + 'px');

  YAHOO.util.Dom.setStyle([ci], 'top', fullframeimagetop + 'px');

  //if element does not exist, code craps out in addClass method.
  if ( YAHOO.util.Dom.inDocument('imagesize' + pzo.res) )
    {
      YAHOO.util.Dom.addClass(['imagesize' + pzo.res], 'imagesizezoomed');	
    }

  adjustZoomRefCrop(pzo);

  adjustUI(pzo);


}


//function imagesLoaded()
//{
//  alert('image loaded');
//}

function adjustUI(pzo)
{

  if (pzo.res == 0)
    {
      YAHOO.util.Dom.setStyle(['ztioff'], 'visibility', 'visible');
    }
  else if (pzo.res == pzo.levels)
    {
      YAHOO.util.Dom.setStyle(['ztooff'], 'visibility', 'visible');
    }
  else
    {
      YAHOO.util.Dom.setStyle(['ztioff'], 'visibility', 'hidden');
      YAHOO.util.Dom.setStyle(['ztooff'], 'visibility', 'hidden');
    }
}

function getPXdim( elementName, dimName, checkZero, makeAbs )
{
	var dimVal = YAHOO.util.Dom.getStyle(elementName, dimName);
	dimVal = Number(dimVal.replace(/px/g, ''));
	
	if (checkZero)
	{
		if (dimVal > 0)
		{
		   dimVal = 0;
		}
	}
	
	if (makeAbs)
	{
		dimVal=Math.abs(dimVal);
	}
	
	return(dimVal);
}



function imageClickCoords(event)
{
	var elt = Event.element(event);
	var imageclickx;
	var imageclicky;
	if ('IMG' == elt.tagName)
	{
	    var epx = Event.pointerX(event);
	    var epy = Event.pointerY(event);
		var imagepositionx,imagepositiony;

		var offsets = Position.cumulativeOffset(elt);
		imagepositionx = offsets[0] || 0;
		imagepositiony = offsets[1] || 0;
		
		
		var offsetsPos = Position.positionedOffset(elt);
		var offsetx = offsetsPos[0] || 0;
		var offsety = offsetsPos[1] || 0;
		
		
		imageclickx = epx - imagepositionx + offsetx;
		imageclicky = epy - imagepositiony + offsety;
	}
	return [imageclickx, imageclicky];
}

function imageClickCoordsX(event)
{
	var elt = Event.element(event);
	var imageclickx;
	var imageclicky;
	if ('IMG' == elt.tagName)
	{
	    var epx = Event.pointerX(event);
	    var epy = Event.pointerY(event);
				
		var imagepositionx,imagepositiony;
		[imagepositionx,imagepositiony] = Position.cumulativeOffset($(elt));

		var offsetsP = Position.positionedOffset(elt);
		var offsetx = offsetsP[0] || 0;
		var offsety = offsetsP[1] || 0;
		
		imageclickx = epx + offsetx;
		imageclicky = epy + offsety;
	
	}
	return [imageclickx, imageclicky];
}





function scale4res(res, x, y)
{
	x = x * Math.pow(2,res);
	y = y * Math.pow(2,res);
	return[x,y];
}




