/* ***** BEGIN LICENSE BLOCK *****
 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
 *
 * The contents of this file are subject to the Mozilla Public License Version
 * 1.1 (the "License"); you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 * http://www.mozilla.org/MPL/
 *
 * Software distributed under the License is distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
 * for the specific language governing rights and limitations under the
 * License.
 *
 * The Original Code is Mozilla Communicator client code, released
 * March 31, 1998.
 *
 * The Initial Developer of the Original Code is
 * Netscape Communications Corporation.
 * Portions created by the Initial Developer are Copyright (C) 1999-2000
 * the Initial Developer. All Rights Reserved.
 *
 * Contributor(s):
 *   Dan Haddix (dan6992@hotmail.com)
 *
 * Alternatively, the contents of this file may be used under the terms of
 * either of the GNU General Public License Version 2 or later (the "GPL"),
 * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
 * in which case the provisions of the GPL or the LGPL are applicable instead
 * of those above. If you wish to allow use of your version of this file only
 * under the terms of either the GPL or the LGPL, and not to allow others to
 * use your version of this file under the terms of the MPL, indicate your
 * decision by deleting the provisions above and replace them with the notice
 * and other provisions required by the GPL or the LGPL. If you do not delete
 * the provisions above, a recipient may use your version of this file under
 * the terms of any one of the MPL, the GPL or the LGPL.
 *
 * ***** END LICENSE BLOCK ***** */

var downTool = false;
var dragActive = false;
var dragObject = false;
var startX = null;
var startY = null;
var endX = null;
var endY = null;
var downTool = false;
var currentElement = [];
var currentTool = "pointer";
var currentRect = null;
var currentCir = null;
var currentPoly = null;
var currentPoint = null;
var rectCount = 1;
var cirCount = 1;
var polyCount = 1;
var pointCount = 1;
var xlock = false;
var ylock = false;
var resize = false;
var currentZoom = 1;
var clipBoard = [];

function Rect(coords, href, target, alt, construct){
  newRect = frameDoc.createElement("div");
  newRect.setAttribute("class", "rect");
  newRect.setAttribute("id", "rect"+rectCount++);
  newRect.setAttribute("name", "hotspot");
  currentRect = selectElement(frameDoc.body.appendChild(newRect));

  // Add resize handles
  // waiting for better drawing code
  handletl = frameDoc.createElement("div");
  handletl.setAttribute("class", "handletl");
  handletl.setAttribute("name", "handle");
  handletr = frameDoc.createElement("div");
  handletr.setAttribute("class", "handletr");
  handletr.setAttribute("name", "handle");
  handlebl = frameDoc.createElement("div");
  handlebl.setAttribute("class", "handlebl");
  handlebl.setAttribute("name", "handle");
  handlebr = frameDoc.createElement("div");
  handlebr.setAttribute("class", "handlebr");
  handlebr.setAttribute("name", "handle");
  handlet = frameDoc.createElement("div");
  handlet.setAttribute("class", "handlet");
  handlet.setAttribute("name", "handle");
  handlel = frameDoc.createElement("div");
  handlel.setAttribute("class", "handlel");
  handlel.setAttribute("name", "handle");
  handler = frameDoc.createElement("div");
  handler.setAttribute("class", "handler");
  handler.setAttribute("name", "handle");
  handleb = frameDoc.createElement("div");
  handleb.setAttribute("class", "handleb");
  handleb.setAttribute("name", "handle");
  currentRect.appendChild(handletl);
  currentRect.appendChild(handletr);
  currentRect.appendChild(handlebl);
  currentRect.appendChild(handlebr);
  currentRect.appendChild(handlet);
  currentRect.appendChild(handlel);
  currentRect.appendChild(handler);
  currentRect.appendChild(handleb);

  if (!coords){
    currentRect.style.left = startX+"px";
    currentRect.style.top = startY+"px";
    //currentRect.style.width = endX+"px";
    //currentRect.style.height = endX+"px";
  }
  else{
    var coordArray = coords.split(',');
    currentRect.style.left = coordArray[0]+"px";
    currentRect.style.top = coordArray[1]+"px";
    currentRect.style.width = (parseInt(coordArray[2])-parseInt(coordArray[0]))+"px";
    currentRect.style.height = (parseInt(coordArray[3])-parseInt(coordArray[1]))+"px";
    if (href)
      currentRect.setAttribute("hsHref", href);
    if (target)
      currentRect.setAttribute("hsTarget", target);
    if (alt)
      currentRect.setAttribute("hsAlt", alt);
  }
  if (construct)
    currentRect = null;
}

function Circle(coords, href, target, alt, construct){
  newCir = frameDoc.createElement("div");
  newCir.setAttribute("class", "cir");
  newCir.setAttribute("id", "cir"+cirCount++);
  newCir.setAttribute("name", "hotspot");
  currentCir = selectElement(frameDoc.body.appendChild(newCir));

  // Add resize handles
  handletl = frameDoc.createElement("div");
  handletl.setAttribute("class", "handletl");
  handletl.setAttribute("name", "handle");
  handletr = frameDoc.createElement("div");
  handletr.setAttribute("class", "handletr");
  handletr.setAttribute("name", "handle");
  handlebl = frameDoc.createElement("div");
  handlebl.setAttribute("class", "handlebl");
  handlebl.setAttribute("name", "handle");
  handlebr = frameDoc.createElement("div");
  handlebr.setAttribute("class", "handlebr");
  handlebr.setAttribute("name", "handle");
  currentCir.appendChild(handletl);
  currentCir.appendChild(handletr);
  currentCir.appendChild(handlebl);
  currentCir.appendChild(handlebr);

  if (!coords){
    currentCir.style.left = startX+"px";
    currentCir.style.top = startY+"px";
    //currentCir.style.width = endX+"px";
    //currentCir.style.height = endX+"px";
  }
  else{
    var coordArray = coords.split(',');
    radius = parseInt(coordArray[2]);
    currentCir.style.left = (parseInt(coordArray[0])-radius)+"px";
    currentCir.style.top = (parseInt(coordArray[1])-radius)+"px";
    currentCir.style.width = (radius*2)+"px";
    currentCir.style.height = (radius*2)+"px";
    if (href)
      currentCir.setAttribute("hsHref", href);
    if (target)
      currentCir.setAttribute("hsTarget", target);
    if (alt)
      currentCir.setAttribute("hsAlt", alt);
  }
  if (construct)
    currentCir = null;
}

function Poly(coords, href, target, alt, construct){
  dump('Poly Called\n');
  newPoly = frameDoc.createElement("div");
  newPoly.setAttribute("class", "poly");
  newPoly.setAttribute("id", "poly"+polyCount++);
  newPoly.setAttribute("name", "hotspot");
  currentPoly = selectElement(frameDoc.body.appendChild(newPoly));
  if (currentZoom > 1){
    currentPoly.style.width = imageEl.offsetWidth+"px";
    currentPoly.style.height = imageEl.offsetHeight+"px";
  }
  if (!coords){
    addPoint(null, startX, startY, true);
    //currentPoly.onclick = addPoint;
    currentPoly.style.cursor = "crosshair";
  }
  else{
    var coordArray = coords.split(',');
    var len = coordArray.length;
    for (i=0; i<len; i++){
      addPoint(null, coordArray[i], coordArray[i+1]);
      i++;
    }
    if (href)
      currentPoly.setAttribute("hsHref", href);
    if (target)
      currentPoly.setAttribute("hsTarget", target);
    if (alt)
      currentPoly.setAttribute("hsAlt", alt);
    polyFinish(null, construct);
  }
}

function addPoint(event, pointX, pointY, start){
  if (event){
    dump('addPoint Called with event\n');
    pointX = event.clientX+window.frames[0].pageXOffset;
    pointY = event.clientY+window.frames[0].pageYOffset;
    event.stopPropagation();
    if (event.detail == 2){
      polyFinish();
      return;
    }
  }
  else
    dump('addPoint Called\n');
  newPoint = frameDoc.createElement("div");
  newPoint.setAttribute("class", "point");
  newPoint.setAttribute("id", "point"+pointCount++);
  newPoint.style.left = pointX+"px";
  newPoint.style.top = pointY+"px";
  if (start){
    newPoint.setAttribute("class", "pointStart");
    newPoint.style.cursor = "pointer";
    //newPoint.onclick = polyFinish;
    //newPoint.addEventListener("click", polyFinish, false);
  }
  currentPoly.appendChild(newPoint);
}

function polyFinish(event, construct){
  dump("polyfinish called\n");
  var len = currentPoly.childNodes.length;
  if (len >=3){
    var polyLeft = 1000000;
    var polyTop = 1000000;
    var polyWidth = 0;
    var polyHeight = 0;
    for(p=0; p<len; p++){
      var curEl = currentPoly.childNodes[p];
      curEl.setAttribute("class", "point");
      curEl.style.cursor = "default";
      pointLeft = parseInt(curEl.style.left);
      pointTop = parseInt(curEl.style.top);
      polyLeft = Math.min(polyLeft, pointLeft);
      polyTop = Math.min(polyTop, pointTop);
      dump(polyLeft+"\n");
    }
    for(p=0; p<len; p++){
      var curEl = currentPoly.childNodes[p];
      curEl.style.left = (parseInt(curEl.style.left)-polyLeft)+"px";
      curEl.style.top = (parseInt(curEl.style.top)-polyTop)+"px";
    }
    for(p=0; p<len; p++){
      var curEl = currentPoly.childNodes[p];
      polyWidth = Math.max(polyWidth, (parseInt(curEl.style.left)+3));
      polyHeight = Math.max(polyHeight, (parseInt(curEl.style.top)+3));
    }
    if (parseInt(currentPoly.style.left) >= 0){
      polyLeft += parseInt(currentPoly.style.left);
      polyTop += parseInt(currentPoly.style.top);
    }
    currentPoly.style.left = polyLeft+"px";
    currentPoly.style.top = polyTop+"px";
    currentPoly.style.width = polyWidth+"px";
    currentPoly.style.height = polyHeight+"px";
    //currentPoly.childNodes[0].onclick = null;
    //currentPoly.onclick = null;
    currentPoly.style.cursor = "auto";
    //currentPoly.childNodes[0].removeEventListener("click", polyFinish, false);
    //currentPoly.removeEventListener("click", addPoint, true);
    if (!construct)
      hotSpotProps(currentPoly);
  }
  else
    deleteElement(currentPoly);
  if (event)
    event.stopPropagation();

  currentPoly = null;
}

function deleteElement(el){
  if (el){
    if (el.length){
      var len = currentElement.length;
      for(i=0; i<len; i++)
        frameDoc.body.removeChild(currentElement[i]);
    }
    else
      frameDoc.body.removeChild(el);
  }
}

function selectAll(){
  objList = frameDoc.getElementsByName("hotspot");
  listLen = objList.length;
  var objCount = 0;
  for(a=0; a<listLen; a++){
     selectElement(objList[a], objCount);
     objCount++;
  }
}

function selectElement(el, add){
  if (add){
    if (currentElement[0].getAttribute("class") != "poly"){
      len = currentElement[0].childNodes.length;
      for(i=0; i<len; i++)
        currentElement[0].childNodes[i].style.visibility = "hidden";
    }
    currentElement.push(el);
    document.getElementById("Map:Cut").setAttribute("disabled", "false");
    document.getElementById("Map:Copy").setAttribute("disabled", "false");
    return currentElement[currentElement.length-1];
  }
  else{
    if (currentElement[0]){
      if (currentElement[0].getAttribute("class") != "poly"){
        len = currentElement[0].childNodes.length;
        for(i=0; i<len; i++)
          currentElement[0].childNodes[i].style.visibility = "hidden";
      }
    }
    currentElement = null;
    currentElement = [];
    currentElement[0] = el;
    if (el != null){
    if (currentElement[0].getAttribute("class") != "poly"){
      len = currentElement[0].childNodes.length;
      for(i=0; i<len; i++)
        currentElement[0].childNodes[i].style.visibility = "visible";
    }
      document.getElementById("Map:Cut").setAttribute("disabled", "false");
      document.getElementById("Map:Copy").setAttribute("disabled", "false");
    return currentElement[0];
  }
    else{
      document.getElementById("Map:Cut").setAttribute("disabled", "true");
      document.getElementById("Map:Copy").setAttribute("disabled", "true");
    }
  }
}

function deSelectElement(el){
  var len = currentElement.length;
  var j=0;
  for(i=0; i<len; i++){
    dump(j+"\n");
    currentElement[j] = currentElement[i];
    if (currentElement[i] != el)
      j++;
  }
  currentElement.pop();
  if (currentElement.length == 1){
    selectElement(currentElement[0]);
  }
  if (currentElement.length >= 1){
    document.getElementById("Map:Cut").setAttribute("disabled", "false");
    document.getElementById("Map:Copy").setAttribute("disabled", "false");
  }
  else{
    document.getElementById("Map:Cut").setAttribute("disabled", "true");
    document.getElementById("Map:Copy").setAttribute("disabled", "true");
  }
}

function marqueeSelect(){
  marTop = parseInt(marquee.style.top);
  marLeft = parseInt(marquee.style.left);
  marRight = parseInt(marquee.style.width)+marLeft;
  marBottom = parseInt(marquee.style.height)+marTop;
  marquee.style.visibility = "hidden";
  marquee.style.top = "-5px";
  marquee.style.left = "-5px";
  marquee.style.width = "1px";
  marquee.style.height = "1px";
  marquee = null;
  objList = frameDoc.getElementsByName("hotspot");
  listLen = objList.length;
  var objCount = 0;
  for(a=0; a<listLen; a++){
    objTop = parseInt(objList[a].style.top);
    objLeft = parseInt(objList[a].style.left);
    objRight = parseInt(objList[a].style.width)+objLeft;
    objBottom = parseInt(objList[a].style.height)+objTop;
    if ((objTop >= marTop) && (objLeft >= marLeft) && (objBottom <= marBottom) && (objRight <= marRight)){
       //objList[i].style.borderColor = "#ffff00";
       selectElement(objList[a], objCount);
       objCount++;
    }
  }
}

function upMouse(event){
  if (currentTool != "poly"){
    if (marquee){
      marqueeSelect();
    }
    if (currentRect){
      if (!resize)
        hotSpotProps(currentRect);
      else
         resize = false;
    }
    else if (currentCir){
      if (!resize)
        hotSpotProps(currentCir);
      else
        resize = false;
    }
    else if (currentPoint)
      polyFinish(null, true);
      
    currentRect = null;
    currentCir = null;
    currentPoint=null;
    downTool = false;
    dragActive = false;
    dragObject = false;
    xlock = false;
    ylock = false;
  }
}

function moveMouse(event){
  if (downTool){
    endX = event.clientX+window.frames[0].pageXOffset;
    endY = event.clientY+window.frames[0].pageYOffset;

    if (dragActive){
      if (currentElement.length > 0){
        if (currentCir){
          radiusWidth = Math.abs((endX-startX));
          radiusHeight = Math.abs((endY-startY));
          circleRadius = Math.max(radiusWidth, radiusHeight);
          currentCir.style.top = Math.max(startY-circleRadius, 0)+"px";
          currentCir.style.left = Math.max(startX-circleRadius, 0)+"px";
          currentCir.style.width = (circleRadius*2)+"px";
          currentCir.style.height = (circleRadius*2)+"px";
        }
        else if (currentRect || marquee){
          var rectObject = (currentRect)? currentRect : marquee;
          if (!xlock){
            if (endX > startX){
              rectWidth = endX-startX;
              rectObject.style.left = Math.max(startX, 0 )+"px";
              rectObject.style.width = rectWidth+"px";
            }
            else{
              rectWidth = startX-endX;
              rectObject.style.left = Math.max(endX, 0)+"px";
              rectObject.style.width = rectWidth+"px";
            }
          }
          if (!ylock){
            if (endY > startY){
              rectHeight = endY-startY;
              rectObject.style.top = startY+"px";
              rectObject.style.height = rectHeight+"px";
            }
            else{
              rectHeight = startY-endY;
              rectObject.style.top = endY+"px";
              rectObject.style.height = rectHeight+"px";
            }
          }
        }
      }
    }
    else{
      if (currentTool == "rect"){
        if ((((endX-startX) > 1) || ((endX-startX) < -1)) && (((endY-startY) > 1) || ((endY-startY) < -1))){
          Rect();
          dragActive = true;
        }
      }
      if (currentTool == "cir"){
        if ((((endX-startX) > 1) || ((endX-startX) < -1)) && (((endY-startY) > 1) || ((endY-startY) < -1))){
          Circle();
          dragActive = true;
        }
      }
      if (currentTool == "pointer"){
        if (dragObject){
          var len = currentElement.length;
          var maxX = false;
          var maxY = false;
          for(i=0; i<len; i++){
            newX = Math.max(0, (endX-currentElement[i].startX));
            newY = Math.max(0, (endY-currentElement[i].startY));
            if (newX == 0)
              maxX = true;
            if (newY == 0)
              maxY = true;
          }
          for(i=0; i<len; i++){
            newX = Math.max(0, (endX-currentElement[i].startX));
            newY = Math.max(0, (endY-currentElement[i].startY));
            if ((newX > 0) && (maxX != true))
              currentElement[i].style.left = newX+"px";
            if ((newY >0) && (maxY != true))
              currentElement[i].style.top = newY+"px";
          }
        }
        else if (currentPoint){
           endX = endX-parseInt(currentPoint.parentNode.style.left);
           endY = endY-parseInt(currentPoint.parentNode.style.top);
           newX = Math.max((0-parseInt(currentPoint.parentNode.style.left)), (endX-currentPoint.startX));
           newY = Math.max((0-parseInt(currentPoint.parentNode.style.top)), (endY-currentPoint.startY));
           currentPoint.style.left = newX+"px";
           currentPoint.style.top = newY+"px";
        }
        else{
          marquee = frameDoc.getElementById("marquee");
          marquee.style.visibility = "visible";
          dragActive = true;
        }
      }
    }
  }
}


function downMouse(event){
  dump(event.target.parentNode.id+"\n");
  if (event.button == 0){
    if (currentTool != "poly"){
      startX = event.clientX+window.frames[0].pageXOffset;
      startY = event.clientY+window.frames[0].pageYOffset;
      downTool = true;
      if (currentTool == "pointer"){
        if (event.target.getAttribute("name") == "hotspot"){
          var el = event.target;
          var isSelected = false;

          if (event.target.getAttribute("cir") == "true")
            el = event.target.parentNode;

          if (event.shiftKey){
            var len = currentElement.length;
            var deselect = false;
            for(i=0; i<len; i++){
              if (currentElement[i] == el){
                deSelectElement(el);
                return;
              }
            }
            selectElement(el, true);
            isSelected = true; 
          }
          else{
            var len = currentElement.length;
            for(i=0; i<len; i++){
              if (currentElement[i] == el)
                isSelected = true;
            }
          }

          if (isSelected){
            var len = currentElement.length;
            for(i=0; i<len; i++){
              currentElement[i].startX = parseInt(event.clientX+window.frames[0].pageXOffset)-parseInt(currentElement[i].style.left);
              currentElement[i].startY = parseInt(event.clientY+window.frames[0].pageYOffset)-parseInt(currentElement[i].style.top);
            }
          }
          else{
            curObj = selectElement(el);
            curObj.startX = parseInt(event.clientX+window.frames[0].pageXOffset)-parseInt(curObj.style.left);
            curObj.startY = parseInt(event.clientY+window.frames[0].pageYOffset)-parseInt(curObj.style.top);
          }
          dragObject = true;
        }
        else if (event.target.getAttribute("name") == "handle"){
          dump("down on a handle\n");
          resize = true;
          el = event.target;
          curObj = selectElement(el.parentNode);
          if (curObj.className == "rect"){
            currentRect = curObj;
            switch (el.className){
              case "handletl":
                startX = parseInt(curObj.style.left)+parseInt(curObj.style.width);
                startY = parseInt(curObj.style.top)+parseInt(curObj.style.height);
                break;
              case "handletr":
                startX = parseInt(curObj.style.left);
                startY = parseInt(curObj.style.top)+parseInt(curObj.style.height);
                break;
              case "handlebl":
                startX = parseInt(curObj.style.left)+parseInt(curObj.style.width);
                startY = parseInt(curObj.style.top);
                break;
              case "handlebr":
                startX = parseInt(curObj.style.left);
                startY = parseInt(curObj.style.top);
                break;
              case "handlet":
                xlock = true;
                startY = parseInt(curObj.style.top)+parseInt(curObj.style.height);
                break;
              case "handleb":
                xlock = true;
                startY = parseInt(curObj.style.top);
                break;
              case "handlel":
                ylock = true;
                startX = parseInt(curObj.style.left)+parseInt(curObj.style.width);
                break;
              case "handler":
                ylock = true;
                startX = parseInt(curObj.style.left);
                break;
              default:
                return;
            } 
          }
          else{
            currentCir = curObj;
            startX = parseInt(curObj.style.left)+(parseInt(curObj.style.width)/2);
            startY = parseInt(curObj.style.top)+(parseInt(curObj.style.height)/2);
          }
        }
        else if (event.target.getAttribute("class") == "point"){
          dump("down on a point\n");
          selectElement(event.target.parentNode);
          currentPoint = event.target;
          currentPoint.startX = parseInt(event.clientX+window.frames[0].pageXOffset)-(parseInt(currentPoint.style.left)+parseInt(currentPoint.parentNode.style.left));
          currentPoint.startY = parseInt(event.clientY+window.frames[0].pageYOffset)-(parseInt(currentPoint.style.top)+parseInt(currentPoint.parentNode.style.top));
          currentPoly = currentPoint.parentNode;
        }
        else{
          dump(event.target+"\n");
          selectElement(null);
        }
      }
    }
  }
}

function clickMouse(event){
  if (event.button == 0){
    dump("body clicked\n");
    //alert(frameDoc.+'\n');
    startX = event.clientX+window.frames[0].pageXOffset;
    startY = event.clientY+window.frames[0].pageYOffset;
    if (currentTool == "poly"){
      if (event.target != currentPoly){
        if (currentPoly != null){
          if (event.target == currentPoly.childNodes[0]){
            polyFinish();
          }
          else if (event.detail == 2){
            polyFinish();
          }
        }
        else{
          Poly();
        }
      }
      else{
        addPoint(event);          
      }
    }
  }
}

function changeTool(event, what){
  if (!currentPoly){
    for(i=0; i<4; i++){
      buttonArray[i].setAttribute("toggled", 0);
      if (event.target == buttonArray[i]){
        buttonArray[i].setAttribute("toggled", 1);
      }
    }
    currentTool = what;
    if (currentTool != "pointer"){
      frameDoc.getElementById("bgDiv").style.cursor = "crosshair";
      frameDoc.body.style.cursor = "crosshair";
    }
    else{
      frameDoc.getElementById("bgDiv").style.cursor = "default";
      frameDoc.body.style.cursor = "default";
    }

    dump(what+" selected\n");
  }
  else {
    for(i=0; i<4; i++){
      if (event.target == buttonArray[i]){
        buttonArray[i].setAttribute("toggled", 0);
      }
    }
  }
}

function zoom(direction, ratio){
  dump('zoom called; ratio='+ratio+'\n');
  if (direction == "in")
    ratio = currentZoom*2;
  else if (direction == "out")
    ratio = currentZoom/2;

  if (ratio > 4 || ratio < 1 || ratio == currentZoom)
    return;

  if (ratio == 1){
    document.getElementById('Map:ZoomIn').setAttribute('disabled', 'false');
    document.getElementById('Map:ZoomOut').setAttribute('disabled', 'true');
    document.getElementById('Map:Apercent').setAttribute('checked', 'true');
    document.getElementById('Map:Bpercent').setAttribute('checked', 'false');
    document.getElementById('Map:Cpercent').setAttribute('checked', 'false');
  }
  else if (ratio == 4){
    document.getElementById('Map:ZoomIn').setAttribute('disabled', 'true');
    document.getElementById('Map:ZoomOut').setAttribute('disabled', 'false');
    document.getElementById('Map:Apercent').setAttribute('checked', 'false');
    document.getElementById('Map:Bpercent').setAttribute('checked', 'false');
    document.getElementById('Map:Cpercent').setAttribute('checked', 'true');
  }
  else {
    document.getElementById('Map:ZoomIn').setAttribute('disabled', 'false');
    document.getElementById('Map:ZoomOut').setAttribute('disabled', 'false');
    document.getElementById('Map:Apercent').setAttribute('checked', 'false');
    document.getElementById('Map:Bpercent').setAttribute('checked', 'true');
    document.getElementById('Map:Cpercent').setAttribute('checked', 'false');
  }

  objList = frameDoc.getElementsByName("hotspot");
  len = objList.length;
  for(i=0; i<len; i++){
    if (ratio > currentZoom){
      objList[i].style.width = (parseInt(objList[i].style.width)*(ratio/currentZoom))+"px";
      objList[i].style.height = (parseInt(objList[i].style.height)*(ratio/currentZoom))+"px";
      objList[i].style.top = (parseInt(objList[i].style.top)*(ratio/currentZoom))+"px";
      objList[i].style.left = (parseInt(objList[i].style.left)*(ratio/currentZoom))+"px";
    }
    else{
      objList[i].style.width = (parseInt(objList[i].style.width)/(currentZoom/ratio))+"px";
      objList[i].style.height = (parseInt(objList[i].style.height)/(currentZoom/ratio))+"px";
      objList[i].style.top = (parseInt(objList[i].style.top)/(currentZoom/ratio))+"px";
      objList[i].style.left = (parseInt(objList[i].style.left)/(currentZoom/ratio))+"px";
    }
    if (objList[i].getAttribute("class") == "poly"){
      pointList = objList[i].childNodes;
      plen = pointList.length;
      dump('i='+i+'\n');
      for(j=0; j<plen; j++){
        dump('i='+i+'\n');
        if (ratio > currentZoom){
          pointList[j].style.top = (parseInt(pointList[j].style.top)*(ratio/currentZoom))+"px";
          pointList[j].style.left = (parseInt(pointList[j].style.left)*(ratio/currentZoom))+"px";
        }
        else{
          pointList[j].style.top = (parseInt(pointList[j].style.top)/(currentZoom/ratio))+"px";
          pointList[j].style.left = (parseInt(pointList[j].style.left)/(currentZoom/ratio))+"px";
        }
      }
      currentPoly = objList[i];
      polyFinish(null, true);
      currentPoly = null;
    }
    dump('i='+i+'\n');
  }
  
  imgEl = frameDoc.getElementById("mainImg");
  bgDiv = frameDoc.getElementById("bgDiv");
  dump(imgEl.getAttribute("width")+'\n');
  if (ratio > currentZoom){
    imgEl.setAttribute("width", (parseInt(imgEl.offsetWidth)*(ratio/currentZoom)));
    imgEl.setAttribute("height", (parseInt(imgEl.offsetHeight)*(ratio/currentZoom)));
    bgDiv.style.width = imgEl.offsetWidth;
    bgDiv.style.height = imgEl.offsetHeight;
  }
  else{
    imgEl.setAttribute("width", (parseInt(imgEl.offsetWidth)/(currentZoom/ratio)));
    imgEl.setAttribute("height", (parseInt(imgEl.offsetHeight)/(currentZoom/ratio)));
    bgDiv.style.width = imgEl.offsetWidth;
    bgDiv.style.height = imgEl.offsetHeight;
  }
  currentZoom = ratio;  
}

function cutCopy(cut){
  len = currentElement.length;
  if (len >= 1){
    clipBoard = [];
    for (i=0; i<len; i++){
      el = currentElement[i];
      if (el.className == 'rect'){
        coords = parseInt(el.style.left)+","+parseInt(el.style.top)+","+(parseInt(el.style.left)+parseInt(el.style.width))+","+(parseInt(el.style.top)+parseInt(el.style.height));
        href = el.getAttribute('hsHref');
        target = el.getAttribute('hsTarget');
        alt = el.getAttribute('hsAlt');
        clipBoard[i] = 'Rect(\"'+coords+'\", \"'+href+'\", \"'+target+'\", \"'+alt+'\", true)';
      }
      else if (el.className == 'cir'){
        radius = Math.floor(parseInt(el.style.width)/2);
        coords = (parseInt(el.style.left)+radius)+","+(parseInt(el.style.top)+radius)+","+radius;
        href = el.getAttribute('href');
        target = el.getAttribute('hsTarget');
        alt = el.getAttribute('hsAlt');
        clipBoard[i] = 'Circle(\"'+coords+'\", \"'+href+'\", \"'+target+'\", \"'+alt+'\", true)';
      }
      else{
        var coords = '';
        var pointlen = el.childNodes.length;
        for(j=0; j<pointlen; j++){
          coords += (parseInt(el.style.left)+parseInt(el.childNodes[j].style.left))+","+(parseInt(el.style.top)+parseInt(el.childNodes[j].style.top))+",";
        }
        coords = coords.substring(0, (coords.length-1));
        href = el.getAttribute('href');
        target = el.getAttribute('hsTarget');
        alt = el.getAttribute('hsAlt');
        clipBoard[i] = 'Poly(\"'+coords+'\", \"'+href+'\", \"'+target+'\", \"'+alt+'\", true)';
      }
      if (cut){
        deleteElement(el);
      }
    }
    document.getElementById('Map:Paste').setAttribute('disabled', 'false');
  }
}

function paste(){
  len = clipBoard.length;
  func = '';
  for (i=0; i<len; i++){
    func += clipBoard[i]+'\;';
  }
  eval(func);
}

  function nudge(event, dir){
  /*prevent scrolling
  event.stopPropagation(); 
  event.preventDefault();*/

  len = currentElement.length;
  amount = 1;
  if (event.shiftKey)
    amount = 5;

  
  boundRectTop = 1000000;
  boundRectLeft = 1000000;
  for (i=0; i<len; i++){
    curTop = parseInt(currentElement[i].style.top);
    curLeft = parseInt(currentElement[i].style.left);
    if (curTop < boundRectTop)
      boundRectTop = curTop;
    if (curLeft < boundRectLeft)
      boundRectLeft = curLeft;
  }

  for (i=0; i<len; i++){
    if (dir == "up"){
      curTop = parseInt(currentElement[i].style.top);
      if (boundRectTop >= amount)
        currentElement[i].style.top = (curTop-amount) + "px";
      else
        currentElement[i].style.top = (curTop-boundRectTop) + "px";
    }
    else if (dir == "left"){
      curLeft = parseInt(currentElement[i].style.left);
      if (boundRectLeft >= amount)
        currentElement[i].style.left = (curLeft-amount) + "px";
      else
        currentElement[i].style.left = (curLeft-boundRectLeft) + "px";
    }
    else if (dir == "down"){
      curTop = parseInt(currentElement[i].style.top);
      currentElement[i].style.top = (curTop+amount) + "px";
    }
    else if (dir == "right"){
      curLeft = parseInt(currentElement[i].style.left);
      currentElement[i].style.left = (curLeft+amount) + "px";
    }
  }
}
  