var editPoint = -1;
var editLine = 0;
function setClipPoint(e) {
 var pos = getMousePos(e).difference(getPos(_collage)).difference(p.pos);
 if (editPoint >= 0) {
  p.clip[editPoint] = pos;
  _clip.rows[editPoint].x.value = pos.x;
  _clip.rows[editPoint].y.value = pos.y;
  editPoint = -1; 
  saveUndo();
 } else {
  var rightclick;
  if (e.which) rightclick = (e.which == 3);
  else if (e.button) rightclick = (e.button == 2);
  var minDist = 4;
  var min = -1;
  var minLineDist = 7;
  var minLine = -1;
  var dist, prev = p.clip.length-1;
  for (var i = 0; i < p.clip.length; i++) {
   dist = p.clip[i].distance(pos);
   if (dist < minDist) {
    minDist = dist;
    min = i;
   }
   dist = pos.distanceToLineSeg(p.clip[prev], p.clip[i]);
   if (dist < minLineDist) {
    minLineDist = dist;
    minLine = i;
   }
   prev = i;
  }
  if (rightclick) {
   if (min != -1) editPoint = min;
   else if (minLine != -1) editLine = minLine;
  } else {
   if (min != -1) removeClipPoint(min);
   else           addClipPoint(pos, realEditLine()+1);
  }
 }
 redraw(e);
}
function realEditLine() { return (editLine<=0)?p.clip.length-1:editLine-1; }
function removeClipPoint(index) {
  editPoint = -1;
  if (index < editLine)
    editLine--;
  p.clip.splice(index, 1);
  _clip.deleteRow(index)
  saveUndo();
}
function addClipPoint(pt, index) {
  editPoint = -1;
  if (index <= editLine)
    editLine++;
  p.clip.splice(index, 0, pt);
  fillClipRow(_clip.insertRow(index), pt);
  saveUndo();
}
/*function appendClipPoint(pt) {
  editPoint = -1;
  p.clip[p.clip.length] = pt;
  fillClipRow(_clip.insertRow(-1), pt);
  saveUndo();
}*/
function recreateClipPoints() {
  editPoint = -1;
  editLine = 0;
  while (_clip.rows.length > 0)
    _clip.deleteRow(0);
  for (var i = 0; i < p.clip.length; i++)
    fillClipRow(_clip.insertRow(-1), p.clip[i]);
}
function updateClip(e) {
  if (!e) e = window.event;
  var elem = getTarget(e);
  var index = elem.parentNode.parentNode.rowIndex;
  var value = parseFloat(elem.value);
  elem.value = value;
  if (elem == elem.parentNode.parentNode.x)
    p.clip[index].x = value;
  else
    p.clip[index].y = value;
  saveUndo();
  redraw(e);
}
function fillClipRow(row, p) {
  var cell = row.insertCell(-1);
  cell.appendChild(document.createTextNode('('));  
  var input = document.createElement('input');
  input.onchange = updateClip;
  input.type = 'text';
  input.value = p.x;
  input.className = 'number';
  cell.appendChild(input);
  row.x = input;
  cell.appendChild(document.createTextNode(','));
  var input = document.createElement('input');
  input.onchange = updateClip;
  input.type = 'text';
  input.value = p.y;
  input.className = 'number';
  cell.appendChild(input);
  row.y = input;
  cell.appendChild(document.createTextNode(')'));
  var but = document.createElement('img');
  but.onclick = removeClipPointFromButton;
  but.src = 'small_x.png';
  but.alt = but.title = 'Remove';
  but.className = 'button';
  cell.appendChild(but);
  but = document.createElement('img');
  but.onclick = addClipPointFromButton;
  but.src = 'small_p.png';
  but.alt = but.title = 'Add Point Before';
  but.className = 'button';
  cell.appendChild(but);
}
function removeClipPointFromButton(e) { removeClipPoint(getTarget(e).parentNode.parentNode.rowIndex); redraw(e); }
function addClipPointFromButton(e) { addClipPoint(new Point(0, 0), getTarget(e).parentNode.parentNode.rowIndex); redraw(e); }



var drag_pos = new Point(0, 0);
function drag_start(e){
 drag_pos = p.pos.difference(getMousePos(e));
}
function drag_update(e){
 var pos = getMousePos(e);
 _x.value = drag_pos.x + pos.x;
 _y.value = drag_pos.y + pos.y;
}




var resize_region = 0;
var resize_startPos = new Point(0, 0);
var resize_startDim = new Dimension(0, 0);
var resize_startMouse = new Point(0, 0);

function resize_start(e, region){
  resize_startMouse = getMousePos(e);
  resize_startPos = p.pos.copy();
  resize_startDim = p.dim.copy();
  resize_region = region;
}
function resize_update(e){
  var dpos = getMousePos(e).difference(resize_startMouse);
  var lock = e.shiftKey || _lock.checked;
  var center = e.altKey || _center.checked;
  var left = resize_startPos.x;
  var top = resize_startPos.y;
  var width = resize_startDim.w;
  var height = resize_startDim.h;
  if (resize_region & N) {
   top = (resize_startPos.y + dpos.y);
   height = (resize_startDim.h - dpos.y);
  }
  if (resize_region & S) {
   height = (resize_startDim.h + dpos.y);
   height = height<min_size?min_size:height;
  }
  if (resize_region & E) {
   width = (resize_startDim.w + dpos.x);
   width = width<min_size?min_size:width;
  }
  if (resize_region & W) {
   left = (resize_startPos.x + dpos.x);
   width = (resize_startDim.w - dpos.x);
  }
  if (height < min_size) {
   top = top - min_size + height;
   height = height<min_size?min_size:height;
  }
  if (width < min_size) {
   left = left - min_size + width;
   width = min_size;
  }
  if (lock) {
    var ratio = resize_startDim.w/resize_startDim.h;
    var maxWidth = Math.max(width, ratio*height);
    if (resize_region == N || resize_region == S)
      maxWidth = ratio*height;
    else if (resize_region == E || resize_region == W)
      maxWidth = width;
    if (resize_region & N)
      top = parseInt(top - maxWidth/ratio + height);
    if (resize_region & W)
      left = parseInt(left - maxWidth + width);
    width = parseInt(maxWidth);
    height = parseInt(maxWidth/ratio);
  }
  if (center) {    
    var dw = (width - resize_startDim.w);
    var dh = (height - resize_startDim.h);
    if (resize_region & E)
      left -= dw;
    if (resize_region & S)
      top -= dh;
    width += dw;
    height += dh;
  }
  _x.value = left;
  _y.value = top;
  _w.value = width;
  _h.value = height;
  resizeClip();
}


function wheel(e){
	var delta = 0;
	if (!e) e = window.event;
	if (e.wheelDelta) {
		delta = e.wheelDelta/40; 
		if (window.opera) delta = -delta;
	} else if (e.detail)
		delta = -e.detail;
	if (delta && (e.shiftKey || e.ctrlKey || e.altKey || e.metaKey)) {
		alpha_update(e, delta);
    if (e.preventDefault)
      e.preventDefault();
    e.returnValue = false;
    return false;
  }
}
if (window.addEventListener)
	window.addEventListener('DOMMouseScroll', wheel, false);
window.onmousewheel = document.onmousewheel = wheel;
function alpha_update(e, delta) {
  if (!picture || !picture.loaded) return;
  p.alpha += delta*5;
  p.alpha -= (p.alpha%5);
  if (p.alpha > 100) p.alpha = 100;
  else if (p.alpha < 1) p.alpha = 1;
  _alpha.value = p.alpha;
  saveUndo();
  redraw(e);
}
