var bTracking = false;
var mouseX = 0; var mouseY = 0;
var imgX = 0; var imgY = 0;
var hspc = -1; var vspc = -1;
var zleft = 0; var zright = 0; var ztop = 0; var zbottom = 0;
var firstx = 0; var firsty = 0; var secondx = 0; var secondy = 0;
var sep = '_';
var bSelect = false;

function setCursor(zoom_value) {
  var i = document.getElementById('mapimg');

  switch (zoom_value) {
    case "zoomin":
      i.style.cursor = "crosshair";
      break;
    case "zoomout":
      i.style.cursor = "crosshair";
      break;
    case "pan":
      i.style.cursor = "move";
      break;
    case "select":
      i.style.cursor = "help";
      break;
    default:
      i.style.cursor = "hand";
      break;
  }
}

function findPosX(obj) {
 var curleft = 0;
 if (obj.offsetParent) {
  while (obj.offsetParent) {
   curleft += obj.offsetLeft
   obj = obj.offsetParent;
  }
 } else if (obj.x)
  curleft += obj.x;
 return curleft;
}

function findPosY(obj) {
 var curtop = 0;
 if (obj.offsetParent) {
  while (obj.offsetParent) {
   curtop += obj.offsetTop
   obj = obj.offsetParent;
  }
 } else if (obj.y)
  curtop += obj.y;
 return curtop;
}

function getObj(name) {
 if (document.getElementById) {
  this.obj = document.getElementById(name);
  this.style = document.getElementById(name).style;
 } else if (document.all) {
  this.obj = document.all[name];
  this.style = document.all[name].style;
 } else if (document.layers) {
  this.obj = getObjNN4(document,name);
  this.style = this.obj;
 }
}

function getObjNN4(obj,name) {
 var x = obj.layers;
 var foundLayer;
 for (var i=0;i<x.length;i++) {
  if (x[i].id == name)
   foundLayer = x[i];
  else if (x[i].layers.length)
   var tmp = getObjNN4(x[i],name);
  if (tmp) foundLayer = tmp;
 }
 return foundLayer;
}

function insideMap() {
  imgX = mouseX - hspc;
  imgY = mouseY - vspc;

  return ((imgX  >= 0) && (imgX < iWidth) && (imgY >= 0) && (imgY < iHeight) && !bSelect);
}

// Mouse down / drag
function mousedown(e) {
  if (!e) var e = window.event;
  var t = (e.target) ? e.target : e.srcElement;
  if (!(t.id == 'mapimg' || t.id == 'rubberband'))
    return true;

  getImageXY(e);
  if (!bTracking && insideMap()) {
    startRubber(e);
    return false;
  } else if (bTracking) {
    mousemove(e);
    stopRubber(e);
  }
//  return true;
  return false;
}

function mousemove(e) {
  getImageXY(e);

  var d = document.getElementById('coords');
  var t = document.getElementById('mapimg');

  if (bTracking) {
    x2 = mouseX = Math.min(Math.max(mouseX, hspc), iWidth + hspc);
    y2 = mouseY = Math.min(Math.max(mouseY, vspc), iHeight + vspc);
    setClip();

    var coordx1 = Math.floor(minx + Math.min(Math.max(imgX, 0), iWidth) * scale);
    var coordy1 = Math.floor(miny + Math.min(Math.max(imgY, 0), iHeight) * scale);
    var coordx2 = Math.floor(minx + Math.min(Math.max(mouseX, 0), iWidth) * scale);
    var coordy2 = Math.floor(miny + Math.min(Math.max(mouseY, 0), iHeight) * scale);

    d.innerHTML = "Dragging: (" + coordx1 + "," + coordy1 + ") (" + coordx2 + ", " + coordy2 + ")";
  } else {
    if (insideMap()) {
      var coordx = Math.round(minx + Math.min(Math.max(imgX, 0), iWidth) * scale);
      var coordy = Math.round(miny + Math.min(Math.max(imgY, 0), iHeight) * scale);
      d.innerHTML = "Coordinates: " + coordx + ", " + coordy;
    }
  }
  return false;
}

function mouseup(e) {
  if (bTracking) {
    mouseX = Math.min(Math.max(mouseX, hspc), iWidth + hspc);
    mouseY = Math.min(Math.max(mouseY, vspc), iHeight + vspc);
    mousedown(e);
  }
}

function getImageXY(e) {
  var i = document.getElementById('mapimg');
  if (hspc == -1 && vspc == -1) {
    hspc = findPosX(i);
    vspc = findPosY(i);
  }

  if (!e) var e = window.event;

//  if (e.pageX || e.pageY) {
//    mouseX = e.pageX - i.style.pixelLeft;
//    mouseY = e.pageY - i.style.pixelRight;
//  } else {
    mouseX = e.clientX + document.body.scrollLeft;
    mouseY = e.clientY + document.body.scrollTop;
//  }
}

function startRubber (e) {
 getImageXY(e);

 if (!bTracking) {
  x1 = mouseX;
  y1 = mouseY;
  x2 = x1;
  y2 = y1;
  firstx = imgX;
  firsty = imgY;

  var r = document.getElementById('rubberband');

  switch(current_tool) {
    case 'zoomout':
    case 'zoomin':
      r.style.border = 'solid 1px red'; break;
    case 'select':
      r.style.border = 'solid 1px blue'; break;
  }

  r.style.width = 0;
  r.style.height = 0;
  r.style.left = mouseX + 'px';
  r.style.top = mouseY + 'px';
  r.style.visibility = 'visible';

  bTracking = true;
 } else {
  stopRubber(e);
 }

}

// set up the call to submitApp
function stopRubber (e) {
  bTracking = false;

  secondx = zright - hspc;
  secondy = zbottom - vspc;

  // check for single click
  if (firstx == secondx && firsty == secondy) {
    x1 = x2 = firstx;
    y1 = y2 = firsty;
  } else {
    x1 = Math.min(firstx, secondx);
    x2 = Math.max(firstx, secondx);
    y1 = Math.min(firsty, secondy);
    y2 = Math.max(firsty, secondy);
  }
  if (insideMap()) {
    submitApp(current_tool);
  }
  return false;
}

function setClip() {
  zright  = Math.max(x1, x2);
  zleft   = Math.min(x1, x2);
  zbottom = Math.max(y1, y2);
  ztop    = Math.min(y1, y2);

  if ((x1 != x2) && (y1 != y2)) {
    var r = document.getElementById('rubberband');
    r.style.left = zleft + 'px';
    r.style.top = ztop + 'px';
    r.style.width = zright - zleft + 'px';
    r.style.height = zbottom - ztop + 'px';
  }
}

function submitApp (tool) {
  f = document.getElementById('appform');
  q = document.getElementById('searchform');

  //alert(tool);

  if (f) {
    f['data'].value = '';
    switch(tool) {
      case 'query_apn':
        f['tool'].value = 'display';
        var book = q['lstBook'].options[q['lstBook'].selectedIndex].value;
        var page = q['lstPage'].options[q['lstPage'].selectedIndex].value;
        var parcel = q['lstParcel'].options[q['lstParcel'].selectedIndex].value;
        f['apn'].value = sprintf("%d%03d%03d", book, page, parcel);
        break;

      case 'query_address':
        f['tool'].value = 'address';

        // when using the drop downs
        f['data'].value = q['txtNumber'].value + sep + q['lstStreet'].options[q['lstStreet'].selectedIndex].value;

        // simple text fields
        // f['data'].value = q['txtNumber'].value + sep + q['txtStreet'].value + sep + q['txtZipcode'].value;
        break;

      case 'query_owner':
        f['tool'].value = 'owner';
        f['data'].value = q['txtOwner'].value;
        break;

      case 'select':
        f['tool'].value = 'select';
        f['data'].value = firstx + sep + firsty + sep + secondx + sep + secondy;
        f['parcel'].value ='';
        if (f['selection']) f['selection'].value = '';
        if (f['buffer']) f['buffer'].value = '';
        break;

      case 'pan':
        f['tool'].value = 'pan';
        f['data'].value = firstx + sep + firsty;
        break;

      case 'zoomin':
        f['tool'].value = 'zoomin';
        f['data'].value = x1 + sep + y1 + sep + x2 + sep + y2;
//        f['data'].value = Math.min(firstx,secondx) + sep + Math.min(firsty,secondy);
//        f['data'].value += sep + Math.max(firstx,secondx) + sep + Math.max(firsty,secondy);
        break;

      case 'zoomout':
        f['tool'].value = 'zoomout';
        f['action'].value = '';
        f['data'].value = firstx + sep + firsty;
        break;

      default:
    }

    f.submit();
  } else {
    alert("cannot get mapform.");
  }
  return false;
}


function showHide ( d, a ) {
  eD = document.getElementById(d);
  eA = document.getElementById(a);
  if (eD && eA) {
    if (eD.style.display == 'none') {
      eD.style.display = 'block';
      eA.innerHTML = "hide";
    } else {
      eD.style.display = 'none';
      eA.innerHTML = "show";
    }
  }
}

function setPanTo( dt ) {
  var d = document.forms['communities'];
  if (d) {
    var a = dt.split(",");
    d.x.value = a[0];
    d.y.value = a[1];
    d.zoom.value = a[2];
    d.submit();
  }
}
