﻿//Javascript source code
var map;
var alerted = false;
var isCheckEntriesBusy = false;
var defCenter = new GLatLng(46.5, 10);
var mapCenter;
var azimut, sweep, leftbound, rightbound, split, splitnr, newCamTilt;
var defZoom = 7;
var zoomAlpView = 2;
var lastZoom = 7;
var nrLastPans = 20;
var distSweep = 6;
var maxWidth = 14400;
var hialtState = false;
var lastPans = new Array(nrLastPans);
var ttlines;
var txtLineMovable, txtLineFixed, txtLineGeneral;

switch (lg) {
    case "ge":
        txtLineMovable = "Direkt auf die gelbe Linie klicken, um sie beweglich zu machen";
        txtLineFixed = "Jetzt folgt die grüne Linie Ihren Mausbewegungen. Auf die grüne Linie klicken, um sie zu fixieren";
        txtLineGeneral = "Die roten Linien sind berührungsempfindlich";
        break;
    case "it":
        txtLineMovable = "Cliccare direttamente sulla linea gialla, per farla muovere";
        txtLineFixed = "Adesso la linea verde segue i movimenti del suo mouse. Clicca sulla linea verde per fissarla.";
        txtLineGeneral = "Le linee rosse sono sensibili al contatto con il mouse";
        break;
    default:
        txtLineMovable = "Click directly on the yellow line to make it movable";
        txtLineFixed = "Now the green line follows the mouse. Click on the green line to fix it.";
        txtLineGeneral = "The red lines are sensitive when touched with the mouse";
}

var firstTouch = true;
var nrBackPoints;
var currBackPoint;
var backPoints = new Array();
var hPreviewTimer;
var hChangeTimer, changedEl;
var hSetMapZoom;
var prevPanData;
var summitPoints;

var centerMarkLatLng = new GLatLng;
var centerMark = new GMarker(centerMarkLatLng, {draggable:false, bouncy:false});
var dirMarkLatLng = new GLatLng;
var dirLine;
var dirLineColor = "#ff0000";
var dirLineWidth = 3;
var dirLineStatus = "fixed";
var leftMarkLatLng = new GLatLng;
var leftViewLine;
var leftViewLineColor = "#ff0000";
var leftViewLineWidth = 1;
var leftViewLineStatus = "fixed";
var rightMarkLatLng = new GLatLng;
var rightViewLine;
var rightViewLineColor = "#ff0000";
var rightViewLineWidth = 1;
var rightViewLineStatus = "fixed";
var sweepArea = new GPolygon;
var splitViewLine = new Array();
var hMapListenerClick, hMapListenerMousemove;
var hDirLineListenerClick, hDirLineListenerMouseover, hDirLineListenerMouseout;
var hLeftViewLineListenerClick, hLeftViewLineListenerMouseover, hLeftViewLineListenerMouseout;
var hRightViewLineListenerClick, hRightViewLineListenerMouseover, hRightViewLineListenerMouseout;

var XMLHTTPObj = getXMLHTTP();
initSummits();

var mapClickStatus = "getpos";
var mapMoveStatus = "off";

document.onclick = eventHandlerClick;
document.onmouseover = eventHandlerMouseOver;
document.onmouseout = eventHandlerMouseOut;
//document.onmousedown = eventHandlerMouseDown;
//document.onmouseup = eventHandlerMouseUp;

//var dirMark = new GMarker(dirMarkLatLng, {draggable:true, bouncy:false, title:"Blickrichtung"});
//var leftMark = new GMarker(leftMarkLatLng, {draggable:true, bouncy:false, title:"Linker Rand des Blickfelds"});
//var rightMark = new GMarker(rightMarkLatLng, {draggable:true, bouncy:false, title:"Rechter Rand des Blickfelds"});

var coveragePolygon = new GPolygon([
new GLatLng(48,6),
new GLatLng(48,16),
new GLatLng(46,16),
new GLatLng(46,12),
new GLatLng(45,12),
new GLatLng(45,8),
new GLatLng(43,8),
new GLatLng(43,5),
new GLatLng(47,5),
new GLatLng(47,6),
new GLatLng(48,6)],
"#f33f00", 1, 1, "#0000ff", 0.3);

var coveragePolygon1 = new GPolygon([
new GLatLng(25, 0),
new GLatLng(60, 0),
new GLatLng(60, 90),
new GLatLng(60, 180),
new GLatLng(25, 180),
new GLatLng(25, 90),
new GLatLng(25, 0)],
"#f33f00", 0, 1, "#0000ff", 0.2);
var coveragePolygon2 = new GPolygon([
new GLatLng(25, 0),
new GLatLng(60, 0),
new GLatLng(60, -85),
new GLatLng(25, -85),
new GLatLng(25, 0)],
"#f33f00", 0, 1, "#0000ff", 0.2);

function loadMap() {
 if (GBrowserIsCompatible()) {
  map = new GMap2(document.getElementById("map"), {draggableCursor: 'crosshair'});
  map.setCenter(defCenter, defZoom);
////  if (document.getElementById("lat").value == "47.422001" && document.getElementById("lon").value == "10.984401") {
//    map.setCenter(defCenter, 7);
//  } else {
//    if (Number(document.getElementById("lon").value) == Number.NaN || Number(document.getElementById("lat").value == Number.NaN)) {
//      map.setCenter(defCenter, 7);
//    } else {
//      if (Number(document.getElementById("lon").value) == 0 && Number(document.getElementById("lat").value) == 0) {
//        map.setCenter(defCenter, 7);
//      } else {
//        map.setCenter(new GLatLng(document.getElementById("lat").value, document.getElementById("lon").value), 11);
//      }  
//    }
//  }

  map.addControl(new GMapTypeControl());
  map.addMapType(G_PHYSICAL_MAP);
  //map.addMapType(G_SATELLITE_3D_MAP);
  map.setMapType(G_PHYSICAL_MAP);
  map.enableScrollWheelZoom();
  map.enableDoubleClickZoom();
  map.addControl(new GLargeMapControl(), new GControlPosition(G_ANCHOR_BOTTOM_LEFT, new GSize(10, 50)));
  map.addControl(new GScaleControl());
  //map.addControl(new google.maps.LocalSearch(), new GControlPosition(G_ANCHOR_BOTTOM_RIGHT, new GSize(10,20)));
  hMapListenerClick = GEvent.addListener(map, "click", function(overlay, latlng, overlaylatlng) { handleMapEventsClick(overlay, latlng, overlaylatlng) });
}
}

//GSearch.setOnLoadCallback(loadMap);

function getLngLat(latlng) {
 document.getElementById("lon").value = latlng.lng();
 document.getElementById("lat").value = latlng.lat();
}

function submitData() {
 alerted = false;
 if (!checkEntries()) return;
 var email = document.getElementById("email").value;
 if (email.length == 0 || email.search(/@/) < 0) {
   if (lg == "en") {
     alert("Enter a valid e-mail address");
   } else {
     if (lg == "it") {
       alert("Inserire un indirizzo e-mail valido");
     } else {
       alert("Geben Sie bitte eine gültige E-Mail-Adresse an");
     }
   }
   return;
 }
 if (trim(document.getElementById("title").value).length == 0) {
   if (lg == "en") {
     alert("Enter a title");
   } else {
     if (lg == "it") {
       alert("Inserisci un titolo");
     } else {
       alert("Geben Sie bitte einen Titel an");
     }
   }
   return;
 }
 document.getElementById("inputemail").value = email;
 var a = new Date();
 a = new Date(a.getTime() +1000*60*60*24*365);
 document.cookie = "email=" + escape(email) + "; expires="+a.toGMTString()+";";
 getSweep(document.getElementById("leftbound"));
 var values = getValuesString("submit");
 //alert("submit");
 pushToHistory(values);
// document.getElementById("inputcomment").value = values;
// document.getElementById("dataform").submit();
 var URL = "panquery.aspx?mode=email&data=" + escape(values);
 //eval('window.open("' + URL + '", "_blank", "top=10, left=10, width=500, height=200, scrollbars=no, menubar=no, toolbar=no, status=no")');
 document.getElementById("iMail").src = URL;
 document.getElementById("emailquery").style.visibility = "visible";
}

function showFullPan(event) {
    alerted = false;
    if (!checkEntries()) return;
    if (trim(document.getElementById("title").value).length == 0) {
      if (lg == "en") {
        alert("Enter a title");
      } else {
        if (lg == "it") {
          alert("Inserisci un titolo");
        } else {
          alert("Geben Sie bitte einen Titel an");
        }
      }
      return;
    }
    var lb = Number(document.getElementById("leftbound").value);
    var rb = Number(document.getElementById("rightbound").value);
    var res = Number(document.getElementById("resolution").value);
    if (rb <= lb) rb += 360;
    //alert("lb: " + lb + "; rb: " + rb + "; res: " + res + "; (rb - lb) * res: " + ((rb - lb) * res));
    if ((rb - lb) * res > maxWidth) {
        rb = Math.round((lb + maxWidth / res) * 1000000) / 1000000;
        if (lg == "en") {
        alert("The panorama width will be restricted to " + maxWidth + " pixels (" + lb + "° - " + rb + "°) to reduce server load.");
      } else {
        if (lg == "it") {
            alert("La larghezza panorama sarà limitata a " + maxWidth + " pixel (" + lb + "° - " + rb + "°) per ridurre il carico del server.");
        } else {
            alert("Die Breite des Panoramas wird auf " + maxWidth + " Pixel (" + lb + "° - " + rb + "°) eingeschränkt, um die Belastung des Servers zu reduzieren.");
        }
      }
      document.getElementById("rightbound").value = rb;
    }    
    getSweep(document.getElementById("leftbound"));
    var values = getValuesString("submit");
    pushToHistory(values);
    var URL = "http://www.udeuschle.selfhost.pro/panoramas/panqueryfull.aspx?mode=newstandard&data=" + escape(values);
    //var URL = "http://localhost/panoramas_test/panqueryfull.aspx?mode=newstandard&data=" + escape(values);
    
    //eval('window.open("' + URL + '", "_blank", "top=10, left=10, width=' + (screen.availWidth - 20) + ', height=' + (screen.availHeight - 70) + ', scrollbars=yes, menubar=yes, toolbar=yes, status=yes")');

    var w = window.open("", "_blank", "top=10, left=10, width=" + (screen.availWidth - 20) + ", height=" + (screen.availHeight - 50) + ", scrollbars=yes, menubar=yes, toolbar=yes, status=yes");
    //w.resizeTo(screen.availWidth - 20, screen.availHeight - 40);
    w.location.href = URL;

    /*
    document.getElementById("getFullPan").href = URL;
    aClick(event, document.getElementById('getFullPan'));
    */
}

    /*
    function aClick(event, anchorObj) {
    if (anchorObj.click) {
        alert("Click inherent");
        anchorObj.click()
    } else if (document.createEvent) {
        alert("Click invoked");
        if (event.target !== anchorObj) {
            var evt = document.createEvent("MouseEvents");
            evt.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
            var allowDefault = anchorObj.dispatchEvent(evt);
            // you can check allowDefault for false to see if
            // any handler called evt.preventDefault().
            // Firefox will *not* redirect to anchorObj.href
            // for you. However every other browser will.
            alert(allowDefault);
        }
    }
    }
    */

function getValuesString(mode) {
    var h;
    var tiltsplit = document.getElementById("tiltsplit").checked;
    var tilt = getDegFromForm(document.getElementById("tilt").value, -60, 60);
    var colorcodinglimit = document.getElementById("colorcodinglimit").value;

    h = "lon:" + getDegFromForm(document.getElementById("lon").value, -180, 180);
     h += "$$$lat:" + getDegFromForm(document.getElementById("lat").value, -90, 90);
     h += "$$$alt:" + document.getElementById("alt").value;
     h += "$$$altcam:" + document.getElementById("altcam").value;
     h += "$$$hialt:" + document.getElementById("hialt").checked;
     h += "$$$resolution:" + document.getElementById("resolution").value;
     h += "$$$azimut:" + getDegFromForm(document.getElementById("azimut").value, 0, 360);
     h += "$$$sweep:" + getDegFromForm(document.getElementById("sweep").value, 1, 360);
     h += "$$$leftbound:" + getDegFromForm(document.getElementById("leftbound").value, 0, 360);
     h += "$$$rightbound:" + getDegFromForm(document.getElementById("rightbound").value, 0, 360);
//     h += "$$$split:" + document.getElementById("split").value;
//     h += "$$$splitnr:" + document.getElementById("splitnr").value;
     h += "$$$split:" + split;
     h += "$$$splitnr:" + splitnr;
     //alert("tilt: " + tilt + "; tiltsplit: " + tiltsplit + "; mode: " + mode + "; newCamTilt: " + document.getElementById("newCamTilt").value);
     if (tilt == "auto" && !tiltsplit && mode == "submit" && document.getElementById("newCamTilt").value != "") {
       h += "$$$tilt:" + document.getElementById("newCamTilt").value;
     } else {
       h += "$$$tilt:" + getDegFromForm(document.getElementById("tilt").value, -60, 60);
     }
     h += "$$$tiltsplit:" + tiltsplit;
     h += "$$$elexagg:" + document.getElementById("elexagg").value;
     h += "$$$range:" + document.getElementById("range").value;
     h += "$$$colorcoding:" + document.getElementById("colorcoding").checked;
     //h += "$$$colorcodinglimit:" + document.getElementById("colorcodinglimit").value;
     if (colorcodinglimit == "auto" && document.getElementById("newColCodeLimit").value != "") {
         h += "$$$colorcodinglimit:" + document.getElementById("newColCodeLimit").value;
     } else {
         h += "$$$colorcodinglimit:" + colorcodinglimit;
     }
     h += "$$$title:" + document.getElementById("title").value;
     h += "$$$description:" + document.getElementById("descriptors").value;
     h += "$$$email:" + document.getElementById("email").value;
     h += "$$$language:" + lg;
     h += "$$$screenwidth:" + screen.availWidth;
     h += "$$$screenheight:" + screen.availHeight;
     //alert(h);
     return h;
}

function disableAlt() {
    if (document.getElementById("hialt").checked) {
        document.getElementById("alt").style.visibility = "hidden";
        document.getElementById("alt").value = "auto";
    } else {
        document.getElementById("alt").style.visibility = "visible";
    }
}

function toggleCCLimit() {
    if (document.getElementById("colorcoding").checked) {
        document.getElementById("colorcodinglimitspan").style.visibility = "visible";
    } else {
        document.getElementById("colorcodinglimitspan").style.visibility = "hidden";
    }
}

function resetTitle() {
var a = Number(document.getElementById("lon").value);
var b = Number(document.getElementById("lat").value);
if ((isNaN(a) || a == 0) && (isNaN(b) || b == 0)) {
  document.getElementById("title").value = "Zugspitze";
} else {
  if (document.getElementById("title").value == "Zugspitze") document.getElementById("title").value = "";
}
}

function showObj(show, obj, refobj, objoffsetleft, objoffsettop) {
var leftrefobj = refobj.offsetLeft;
var toprefobj = refobj.offsetTop;
var parent = refobj.offsetParent;
while (parent.nodeName != "BODY") {
  leftrefobj += parent.offsetLeft;
  toprefobj += parent.offsetTop;
  parent = parent.offsetParent;
}
obj.style.left = (leftrefobj + objoffsetleft) + 'px';
obj.style.top = (toprefobj + objoffsettop) + 'px';
if (show) {
  obj.style.visibility='visible';
} else {
  obj.style.visibility='hidden';
}
}

function isValid(value) {
if (!isNaN(value)) {
  if (value < 0 || value > 360) {
    if (lg == "en") {
      alert("Enter values between 0 and 360");
    } else {
      if (lg == "it") {
        alert("Immettere i valori tra 0 e 360");
      } else {
        alert("Bitte Werte zwischen 0 und 360 eingeben");
      }
    }     
    return false;
  }
}
return true;
}

function checkEntries(alertMode) {
  var text;

  //alert("checkEntries: alertMode=" + alertMode + "; isCheckEntriesBusy=" + isCheckEntriesBusy + "; alerted=" + alerted);

    if (alertMode != "silent") {
      if (isCheckEntriesBusy) return true;
      if (alerted) { alerted = false; return true; }
      isCheckEntriesBusy = true;
    }
    if (lg == "en") {
      text = checkEntry("Latitude", document.getElementById("lat"), 25, 60, "deg", false);
      text += checkEntry("Longitude", document.getElementById("lon"), -75, 180, "deg", false);
      text += checkEntry("Altitude", document.getElementById("alt"), 0, 999999, null, true);
      text += checkEntry("Camera altitude", document.getElementById("altcam"), 0, 999999, null, false);
      text += checkEntry("View direction", document.getElementById("azimut"), 0, 360, "dirs", false);
      text += checkEntry("View sweep", document.getElementById("sweep"), 1, 360, "deg", false);
      text += checkEntry("Left edge", document.getElementById("leftbound"), 0, 360, "dirs", false);
      text += checkEntry("Right edge", document.getElementById("rightbound"), 0, 360, "dirs", false);
      text += checkEntry("Zoom factor", document.getElementById("zoom"), 0.05, 30, null, false);
      text += checkEntry("Resolution", document.getElementById("resolution"), 0.1, 600, null, false);
      text += checkEntry("Vertical view angle", document.getElementById("tilt"), -60, 60, "deg", true);
      text += checkEntry("Range of sight", document.getElementById("range"), 1, 750, null, false);
      text += checkEntry("Elevation exaggeration", document.getElementById("elexagg"), 0.1, 10, null, false);
      text += checkEntry("Upper limit of color scale", document.getElementById("colorcodinglimit"), 0, 750, null, true);
    } else {
      if (lg == "it") {
        text = checkEntry("Latitudine", document.getElementById("lat"), 25, 60, "deg", false);
        text += checkEntry("Longitudine", document.getElementById("lon"), -75, 180, "deg", false);
        text += checkEntry("Altitudine", document.getElementById("alt"), 0, 999999, null, true);
        text += checkEntry("Altezza dal suolo", document.getElementById("altcam"), 0, 999999, null, false);
        text += checkEntry("Direzione dello sguardo", document.getElementById("azimut"), 0, 360, "dirs", false);
        text += checkEntry("Campo visivo", document.getElementById("sweep"), 1, 360, "deg", false);
        text += checkEntry("Margine sinistro", document.getElementById("leftbound"), 0, 360, "dirs", false);
        text += checkEntry("Margine destro", document.getElementById("rightbound"), 0, 360, "dirs", false);
        text += checkEntry("Fattore dello zoom", document.getElementById("zoom"), 0.05, 30, null, false);
        text += checkEntry("Risoluzione", document.getElementById("resolution"), 0.1, 600, null, false);
        text += checkEntry("Inclinazione dello sguardo", document.getElementById("tilt"), -60, 60, "deg", true);
        text += checkEntry("Visilibità", document.getElementById("range"), 1, 750, null, false);
        text += checkEntry("Fattore di esagerazione", document.getElementById("elexagg"), 0.1, 10, null, false);
        text += checkEntry("Limite massimo di scala di colori", document.getElementById("colorcodinglimit"), 0, 750, null, true);
      } else {
        text = checkEntry("Breite", document.getElementById("lat"), 25, 60, "deg", false);
        text += checkEntry("Länge", document.getElementById("lon"), -75, 180, "deg", false);
        text += checkEntry("Höhe", document.getElementById("alt"), 0, 999999, null, true);
        text += checkEntry("Kamerahöhe", document.getElementById("altcam"), 0, 999999, null, false);
        text += checkEntry("Blickrichtung", document.getElementById("azimut"), 0, 360, "dirs", false);
        text += checkEntry("Blickfeld", document.getElementById("sweep"), 1, 360, "deg", false);
        text += checkEntry("Linker Rand", document.getElementById("leftbound"), 0, 360, "dirs", false);
        text += checkEntry("Rechter Rand", document.getElementById("rightbound"), 0, 360, "dirs", false);
        //text += checkEntry("Aufteilung", document.getElementById("split"), 1, 360, "deg", false);
        //text += checkEntry("Aufteilung", document.getElementById("splitnr"), 1, 72, null, false);
        text += checkEntry("Zoomfaktor", document.getElementById("zoom"), 0.05, 30, null, false);
        text += checkEntry("Auflösung", document.getElementById("resolution"), 0.1, 600, null, false);
        text += checkEntry("Blickneigung", document.getElementById("tilt"), -60, 60, "deg", true);
        text += checkEntry("Sichtweite", document.getElementById("range"), 1, 750, null, false);
        text += checkEntry("Überhöhungsfaktor", document.getElementById("elexagg"), 0.1, 10, null, false);
        text += checkEntry("Obergrenze der Farbskala", document.getElementById("colorcodinglimit"), 0, 750, null, true);
      }
    }
    if (alertMode != "silent") {
      if (text == "") {
          alerted = false;
          isCheckEntriesBusy = false;
        return true;
      } else {
        alerted = true;
        alert(text);
        isCheckEntriesBusy = false;
      }
    } else {
      if (text == "") {
        return true;
      } else {
        return false;
      }
    }
}

function checkEntry(item, obj, min, max, dirs, auto) {
var text;
var firstChar;
value = obj.value;
if (value.indexOf("_") >= 0) value = value.substring(0, value.indexOf("_") - 1);
value = value.replace(/,/, ".");
value = trim(value);
firstChar = new String(value).substr(0,1);
var v = new String(value).toLowerCase().valueOf();
if (auto) {
    if (v == "") {
        v = "auto";
        obj.value = "auto";
    }
    if (v == "auto") return "";
}
if (dirs == "dirs") {
    if (v == "n") return "";
    if (v == "no" || v == "ne") return "";
    if (v == "o" || v == "e") return "";
    if (v == "so" || v == "se") return "";
    if (v == "s") return "";
    if (v == "sw") return "";
    if (v == "w") return "";
    if (v == "nw") return "";
}
//alert(item + ", #" + value + "#, #" + v + "#, #" + firstChar + "#");
if (dirs) {
  v = getDegFromForm(v, min, max);
} else {
  v = Number(value);
}
if (v == 0) {
    if (firstChar == "0") return "";
} else {
    if (v >= min && v <= max) return "";
}

switch (lg) {
    case "ge":
        text = "\n" + item + ": Geben Sie einen Wert zwischen " + min + " und " + max + " ein";
        break;
    case "it":
        text = "\n" + item + ": Inserire un valore tra " + min + " e " + max;
        break;
    default:
        text = "\n" + item + ": Enter a value between " + min + " and " + max;
}

if (dirs == "dirs") {
    switch (lg) {
        case "ge":
            text += " oder eine Himmelsrichtung";
            break;
        case "it":
            text = " o la direzione della bussola";
            break;
        default:
            text = " or a cardinal points of compass";
    }
}

if (auto) {
    switch (lg) {
        case "ge":
            text += " oder 'auto'";
            break;
        case "it":
            text = " o 'auto'";
            break;
        default:
            text = " or 'auto'";
    }
}

return text;
}

function getDegFromForm(value, min, max) {
  var deg;
  if (value == "auto") return "auto";
  value = value.replace(/,/, ".");
//alert(value);
  switch(value.toLowerCase()) {
    case "n": return 0;
    case "no":
    case "ne": return 45; 
    case "o":
    case "e": return 90; 
    case "so":
    case "se": return 135; 
    case "s": return 180; 
    case "sw": return 225; 
    case "w": return 270; 
    case "nw": return 315;
  }
  value = value.replace(/[^-0-9.]/g, " ");
//  value = value.replace(/°/g, " ");
//  value = value.replace(/\'/g, " ");
//  value = value.replace(/\"/g, " ");
  value = value.replace(/  /g, " ");
  value = value.replace(/  /g, " ");
  value = trim(value);
  deg = Number(value);
  var parts = value.split(" ");
  if (parts.length == 1) {
      return Math.round(deg * 1000000) / 1000000;
  } else {
    //alert(parts);
    deg = Number(parts[0]);
    //alert("0: " + deg);
    if (!isNaN(deg)) {
      var a = Number(parts[1]);
      if (!isNaN(a)) {
        deg += a/60;
        //alert("1: " + deg);
        if (parts.length > 2) {
          var b = Number(parts[2]);
          if (!isNaN(b)) {
              deg += b / 3600;
              //alert("2: " + deg);
          } else {
            return NaN;
          }
        }
      } else {
        return NaN;
      }
    }
  }
  //alert("fin: " + deg);
  if (!isNaN(deg)) {
      if (min <= deg && deg <= max) return Math.round(deg * 1000000) / 1000000;
  }
  return NaN;
}

function init() {
  //alert("init: cookieText:" + document.cookie);
  if (document.cookie) {
    var cookieText = unescape(document.cookie);
    evalCookie(cookieText);
  }
  loadMap();
  setSweepArea(); 
  if (firstTouch) {
      ttlines.style.top = (map.fromLatLngToContainerPixel(defCenter).y - 20) + "px";
      ttlines.style.left = (map.fromLatLngToContainerPixel(defCenter).x - 75) + "px";
      ttlines.innerHTML = txtLineGeneral;
      ttlines.style.visibility = "visible";
      firstTouch = false;
  }
  resetDir();
}

function finish() {
    var a = new Date();
    a = new Date(a.getTime() + 1000*60*60*24*365);
    for (var i = 0; i < 20; i++) {
      if (lastPans[i] && lastPans[i].length != 0) {
        //eval('document.cookie = "lastpan' + i + ' = " + lastPans[i] + "; expires="+a.toGMTString()+";";');
        document.cookie = "lastpan" + i + " = " + escape(lastPans[i]) + "; expires="+a.toGMTString()+";";
      }  
    }
    document.cookie = "lastpan=" + escape(getValuesString()) + "; expires="+a.toGMTString()+";";
    document.cookie = "lastmap=" + escape(getMapParameters()) + "; expires=" + a.toGMTString() + ";";
    document.cookie = "email=" + escape(document.getElementById("email").value) + "; expires="+a.toGMTString()+";";
    //alert("finish: cookieText:" + document.cookie);
    GUnload();
}

function pushToHistory(panText) {
    //alert("pushToHistory: panText:" + panText);
    //alert("pushToHistory: lastPans 1:" + lastPans);
    var panCoreString = getPanCoreString(panText);
    var lastPans1 = new Array();
    lastPans1[0] = panText;
    var j = 0;
    for (var i = 0; i < nrLastPans; i++) {
        if (lastPans[i] && (getPanCoreString(lastPans[i]) != panCoreString)) {
            j += 1;
            lastPans1[j] = lastPans[i];
        }
    }
    //alert("pushToHistory: lastPans1 1:" + lastPans1);
    for (i = 0; (i <= j) && (i < nrLastPans); i++) lastPans[i] = lastPans1[i];
    for (i = j + 1; i < nrLastPans; i++) lastPans[i] = "";
    //alert("pushToHistory: lastPans 2:" + lastPans);
    setHistoryView();
}

function setHistoryView() {
    document.getElementById("hisContainer").innerHTML = "";
    for (i = 0; i < nrLastPans; i++) {
        if (lastPans[i] && (lastPans[i].length != 0)) {
            var oDiv = document.createElement("div");
            oDiv.id = "lastPan" + i;
            var h, text;
            text = getPanCoreString(lastPans[i]);
            oDiv.appendChild(document.createTextNode(text));
            document.getElementById("hisContainer").appendChild(oDiv);
        }
    }
}

function getPanCoreString(panText) {
    var title, description, lat, lon;
    var parts = panText.split("$$$");
    for (var i = 0; i < parts.length; i++) {
        var parts1 = parts[i].split(":");
        if (parts1[0] == "title") title = parts1[1];
        if (parts1[0] == "description") description = parts1[1];
        if (parts1[0] == "lat") lat = Math.round(parts1[1] * 100000) / 100000;
        if (parts1[0] == "lon") lon = Math.round(parts1[1] * 100000) / 100000;
    }
    var result = title;
    if (description.length > 0) result += "; " + description;
    result += "; B " + lat + "°; L " + lon + "°";
    return result;
}

function getMapParameters() {
  var h;
  h = "centerlat:" + map.getCenter().lat();
  h += "$$$centerlon:" + map.getCenter().lng();
  h += "$$$zoom:" + map.getZoom();
  return h;
}

function evalCookie(cookieText) {
//alert("init: cookieText:" + cookieText);
  var items = cookieText.split(";");
  for (var i = 0; i < items.length; i++) {
    var parts = items[i].split("=");
    parts[0] = parts[0].replace(/ /, "");
    if (parts[0] == "email") document.getElementById("email").value = parts[1];
    else if (parts[0] == "lastpan") {
      setQuery(parts[1]);
    }
    else if (parts[0].substr(0, 7) == "lastpan" && parts[0].length > 7) {
      lastPans[Number(parts[0].substr(7))] = parts[1];
    }
    else if (parts[0] == "lastmap") setMap(parts[1]);
  }
//alert("init: lastPans:" + lastPans);
  setHistoryView();
//  for (i = 0; i < nrLastPans; i++) {
//      if (lastPans[i] && (lastPans[i].length != 0)) {
//          var oDiv = document.createElement("div");
//          oDiv.id = "lastPan" + i;
//          var h, text;
//          text = getPanCoreString(lastPans[i]);
//          oDiv.appendChild(document.createTextNode(text));
//          document.getElementById("hisContainer").appendChild(oDiv);
//      }
//  }
}

function setMap(mapParameterString) {
  var lat = defCenter.lat();
  var lon = defCenter.lng();
  var items = mapParameterString.split("$$$");
  for (var i = 0; i < items.length; i++) {
    var values = items[i].split(":", 2);
    if (values[0] == "centerlat") lat = values[1];
    if (values[0] == "centerlon") lon = values[1];
    if (values[0] == "zoom") defZoom = Number(values[1]);
  }
  defCenter = new GLatLng(lat, lon);
  //alert("setmap: defCenter:" + defCenter + "; " + "defZoom:" + defZoom);
}

function setQuery(queryText) {
//alert(queryText);
  var items = queryText.split("$$$");
  for (var i = 0; i < items.length; i++) {
    var values = items[i].split(":", 2);
    if (values[0] == "lon") document.getElementById("lon").value = values[1];
    if (values[0] == "lat") document.getElementById("lat").value = values[1];
    if (values[0] == "alt") document.getElementById("alt").value = values[1];
    if (values[0] == "altcam") document.getElementById("altcam").value = values[1];
//if (values[0] == "hialt") alert("hialt: " + values[1]);
    if (values[0] == "hialt") {
      if (values[1] == "true") {
        document.getElementById("hialt").checked = true;
      } else {
        document.getElementById("hialt").checked = false;
      }
    }  
    if (values[0] == "azimut") document.getElementById("azimut").value = values[1];
    if (values[0] == "sweep") document.getElementById("sweep").value = values[1];
    if (values[0] == "leftbound") document.getElementById("leftbound").value = values[1];
    if (values[0] == "rightbound") document.getElementById("rightbound").value = values[1];
//    if (values[0] == "split") document.getElementById("split").value = values[1];
//    if (values[0] == "splitnr") document.getElementById("splitnr").value = values[1];
    if (values[0] == "resolution") document.getElementById("resolution").value = values[1];
    getZoom(document.getElementById("resolution"));
    if (values[0] == "tilt") document.getElementById("tilt").value = values[1];
    if (values[0] == "tiltsplit") {
        if (values[1] == "true") {
            document.getElementById("tiltsplit").checked = true;
        } else {
        document.getElementById("tiltsplit").checked = false;
        }
    }
    if (values[0] == "elexagg") document.getElementById("elexagg").value = values[1];
    if (values[0] == "range") document.getElementById("range").value = values[1];
    if (values[0] == "title") document.getElementById("title").value = values[1];
    if (values[0] == "description") document.getElementById("descriptors").value = values[1];
    if (values[0] == "colorcoding") {
        if (values[1] == "true") {
            document.getElementById("colorcoding").checked = true;
        } else {
            document.getElementById("colorcoding").checked = false;
        }
    }
    toggleCCLimit();
    if (values[0] == "colorcodinglimit") document.getElementById("colorcodinglimit").value = values[1];
}
  setMapCenter(); 
}

function setMapCenter() {
  var lat = document.getElementById("lat").value;
  var lon = document.getElementById("lon").value;
  if (lat && lon) {
      defCenter = new GLatLng(lat, lon);
      defZoom = 10;
      loadMap();
      //currBackPoint = 0;
      pushBackPoint(defCenter);
      setSweepArea();
  }
}

function getQueryItem(queryText, item) {
  var items = queryText.split("$$$");
  for (var i = 0; i < items.length; i++) {
    var values = items[i].split(":", 2);
    if (values[0] == item) return values[1];
  }
  return "";
}

function trim(text) {
  var i = 0;
  while (text.length > 1 && text.substr(0,1) == " ") text = text.substr(1);
  if (text == " ") return "";
  while (text.length > 1 && text.substr(text.length - 1, 1 == " ")) text = text.substr(0, text.length - 1);
  return text;
}

function getZoom(el) {
    var resolution = Number(document.getElementById("resolution").value);
    var zoom = Number(document.getElementById("zoom").value);
    if (el.id == "resolution") {
        if (isNaN(resolution) || resolution == 0) {
            document.getElementById("zoom").value = "";
        } else {
            document.getElementById("zoom").value = Math.round(resolution / 20 * 100) / 100;
        }
    }
    if (el.id == "zoom") {
        if (isNaN(zoom) || zoom == 0) {
            document.getElementById("resolution").value = "";
        } else {
        document.getElementById("resolution").value = Math.round(zoom * 20);
        }
    }
    //    var split = Number(document.getElementById("split").value);
//    var splitnr = Number(document.getElementById("splitnr").value);
//    var sweep = Number(document.getElementById("sweep").value);
//    if (el.id == "split") {
//        if (isNaN(split) || split == 0) {
//            document.getElementById("splitnr").value = "";
//            document.getElementById("zoom").innerHTML = "";
//        } else {
//            document.getElementById("splitnr").value = Math.ceil(document.getElementById("sweep").value / split);
//            document.getElementById("zoom").innerHTML = (Math.round(60 / split * 10) / 10) + "x";
//        }
//    }
//    if (el.id == "splitnr") {
//        if (isNaN(split) || split == 0) {
//            document.getElementById("split").value = "";
//            document.getElementById("zoom").innerHTML = "";
//        } else {
//            split = document.getElementById("sweep").value / splitnr;
//            document.getElementById("split").value = split;
//            document.getElementById("zoom").innerHTML = (Math.round(60 / split * 10) / 10) + "x";
//        }
//    }
}

function getSweep(el) {
    var dir = document.getElementById("azimut").value;
    if (dir.replace(/ /, "").length == 0) {
        dir = NaN;
    } else {
        dir = Number(getDegFromForm(dir, 0, 360));
    }
    var sweep = document.getElementById("sweep").value;
    if (sweep.replace(/ /, "").length == 0) {
        sweep = NaN;
    } else {
        sweep = Number(getDegFromForm(sweep, 1, 360));
    }
    var leftBound = document.getElementById("leftbound").value;
    if (leftBound.replace(/ /, "").length == 0) {
        leftBound = NaN;
    } else {
        leftBound = Number(getDegFromForm(leftBound, 0, 360));
    }
    var rightBound = document.getElementById("rightbound").value;
    if (rightBound.replace(/ /, "").length == 0) {
        rightBound = NaN;
    } else {
        rightBound = Number(getDegFromForm(rightBound, 0, 360));
    }
    var resolution = document.getElementById("resolution").value;
    if (resolution.replace(/ /, "").length == 0) {
        resolution = NaN;
    } else {
        resolution = Number(resolution);
    }
    //    var split = document.getElementById("split").value;
    //    if (split.replace(/ /, "").length == 0) {
    //        split = NaN;
    //    } else {
    //        split = Number(getDegFromForm(split, 1, 360));
    //    }
    //alert(dir + " " + sweep + " " + leftBound + " " + rightBound + " " + split);
    //alert(el.id);
    switch (el.id) {
        case "sweep":
        case "azimut":
            if (!isNaN(dir) && !isNaN(sweep)) {
                leftBound = dir - sweep / 2;
                if (leftBound < 0) leftBound += 360;
                document.getElementById("leftbound").value = Math.round(leftBound * 10) / 10;
                rightBound = dir + sweep / 2;
                if (rightBound > 360) rightBound -= 360;
                document.getElementById("rightbound").value = Math.round(rightBound * 10) / 10;
                split = 1200 / resolution;
                splitnr = Math.ceil(sweep / split * 0.99);
                //                if (split >= sweep) {
                //                    split = sweep;
                //if (split > 60) split = 60;
                //document.getElementById("resolution").value = resolution;
                //getZoom(document.getElementById("resolution"));
                //                }
            }
            break;
        case "leftbound":
            if (!isNaN(leftBound) && !isNaN(rightBound)) {
                if (leftBound == rightBound) {
                    rightBound += sweep;
                    if (rightBound > 360) rightBound -= 360;
                }
            }
        case "rightbound":
            if (!isNaN(leftBound) && !isNaN(rightBound)) {
                if (rightBound < leftBound) rightBound += 360;
                if (rightBound == leftBound) {
                    sweep = 360;
                } else {
                    sweep = rightBound - leftBound;
                }
                document.getElementById("sweep").value = Math.round(sweep * 10) / 10;
                dir = leftBound + sweep / 2;
                if (dir > 360) dir -= 360;
                document.getElementById("azimut").value = Math.round(dir * 10) / 10;
                split = 1200 / resolution;
                splitnr = Math.ceil(sweep / split * 0.99);
                //                if (split > sweep) {
//                    split = sweep;
//                    //if (split > 60) split = 60;
//                    document.getElementById("split").value = document.getElementById("sweep").value;
//                    getZoom(document.getElementById("split"));
//                }
                //getZoom(document.getElementById("resolution"));
            }
            //alert(azimut + "; " + leftBound + "; " + rightBound + "; " + sweep + "; " + split);
    }
}

function setSweepArea() {
    if (!checkEntries("silent")) return;
    var lat = Number(getDegFromForm(document.getElementById("lat").value, -90, 90));
    var lon = Number(getDegFromForm(document.getElementById("lon").value, -180, 180));
    defCenter = new GLatLng(lat, lon);
    azimut = Number(getDegFromForm(document.getElementById("azimut").value, 0, 360));
    sweep = Number(getDegFromForm(document.getElementById("sweep").value, 1, 360));
    leftbound = Number(getDegFromForm(document.getElementById("leftbound").value, 0, 360));
    rightbound = Number(getDegFromForm(document.getElementById("rightbound").value, 0, 360));
    //split = Number(getDegFromForm(document.getElementById("split").value));
    //alert("setSweepArea: " + defCenter + "; " + azimut + "; " + sweep + "; " + leftbound + "; " + rightbound + "; " + split);
    setCenterMark(defCenter);
    clearTimeout(hPreviewTimer);
    //alert("setSweepArea");
    hPreviewTimer = setTimeout(loadPreview, 1000);
}

function setCenterMark(latlng) {
    //alert(currBackPoint + "; " + backPoints.length + "; " + backPoints + ";;;; " + defCenter );
    if (backPoints.length > 1) {
        document.getElementById("backPoints").style.visibility = "visible";
        if (backPoints.length - 1 > currBackPoint) {
            document.getElementById("iBPLeft").style.visibility = "visible";
        } else {
            document.getElementById("iBPLeft").style.visibility = "hidden";
        }
        if (currBackPoint > 0) {
            document.getElementById("iBPRight").style.visibility = "visible";
        } else {
            document.getElementById("iBPRight").style.visibility = "hidden";
        }
    } else {
        document.getElementById("backPoints").style.visibility = "hidden";
    }
    //alert(document.getElementById("map").offsetTop + "; " + document.getElementById("map").offsetLeft);
    document.getElementById("backPoints").style.top = (document.getElementById("map").offsetTop + 424) + "px";
    document.getElementById("backPoints").style.left = (document.getElementById("map").offsetLeft + 350) + "px";

    ttlines = document.getElementById("ttlines");
    //alert("setCenterMark: " + dirLineColor + "; " + dirLineWidth + "; " + dirLineStatus);
    map.clearOverlays();
    if (hDirLineListenerMouseover) GEvent.removeListener(hDirLineListenerMouseover);
    if (hDirLineListenerMouseout) GEvent.removeListener(hDirLineListenerMouseout);
    if (hDirLineListenerClick) GEvent.removeListener(hDirLineListenerClick);
    if (hLeftViewLineListenerMouseover) GEvent.removeListener(hLeftViewLineListenerMouseover);
    if (hLeftViewLineListenerMouseout) GEvent.removeListener(hLeftViewLineListenerMouseout);
    if (hLeftViewLineListenerClick) GEvent.removeListener(hLeftViewLineListenerClick);
    if (hRightViewLineListenerMouseover) GEvent.removeListener(hRightViewLineListenerMouseover);
    if (hRightViewLineListenerMouseout) GEvent.removeListener(hRightViewLineListenerMouseover);
    if (hRightViewLineListenerClick) GEvent.removeListener(hRightViewLineListenerClick);
    centerMarkLatLng = latlng;

    var x = map.fromLatLngToContainerPixel(centerMarkLatLng).x;
    var y = map.fromLatLngToContainerPixel(centerMarkLatLng).y;
    if (x <= 0 || x >= document.getElementById("map").offsetWidth || y <= 0 || y >= document.getElementById("map").offsetHeight) map.panTo(centerMarkLatLng);

    centerMark.setLatLng(centerMarkLatLng);
    map.addOverlay(centerMark);
    if (!isNaN(azimut)) {
        dirMarkLatLng = getSphericalPointByDistance(centerMarkLatLng, azimut, distSweep);
        dirLine = new GPolyline([centerMarkLatLng, dirMarkLatLng], dirLineColor, dirLineWidth, 1, { geodesic: true, clickable: true });
        map.addOverlay(dirLine);
        hDirLineListenerMouseover = GEvent.addListener(dirLine, "mouseover", this.handleDirLineMouseover);
        hDirLineListenerMouseout = GEvent.addListener(dirLine, "mouseout", this.handleDirLineMouseout);
        hDirLineListenerClick = GEvent.addListener(dirLine, "click", this.handleDirLineClick);
        if (!isNaN(leftbound) && !isNaN(rightbound)) {
            //alert("setCenterMark: " + defCenter + "; " + azimut + "; " + sweep + "; " + leftbound + "; " + rightbound + "; " + split);
            leftMarkLatLng = getSphericalPointByDistance(centerMarkLatLng, leftbound, distSweep);
            leftViewLine = new GPolyline([centerMarkLatLng, leftMarkLatLng], leftViewLineColor, leftViewLineWidth, 1, { geodesic: true, clickable: true });
            map.addOverlay(leftViewLine);
            hLeftViewLineListenerMouseover = GEvent.addListener(leftViewLine, "mouseover", this.handleLeftViewLineMouseover);
            hLeftViewLineListenerMouseout = GEvent.addListener(leftViewLine, "mouseout", this.handleLeftViewLineMouseout);
            hLeftViewLineListenerClick = GEvent.addListener(leftViewLine, "click", this.handleLeftViewLineClick);
            rightMarkLatLng = getSphericalPointByDistance(centerMarkLatLng, rightbound, distSweep);
            rightViewLine = new GPolyline([centerMarkLatLng, rightMarkLatLng], rightViewLineColor, rightViewLineWidth, 1, { geodesic: true, clickable: true });
            map.addOverlay(rightViewLine);
            hRightViewLineListenerMouseover = GEvent.addListener(rightViewLine, "mouseover", this.handleRightViewLineMouseover);
            hRightViewLineListenerMouseout = GEvent.addListener(rightViewLine, "mouseout", this.handleRightViewLineMouseout);
            hRightViewLineListenerClick = GEvent.addListener(rightViewLine, "click", this.handleRightViewLineClick);
            var sweepAreaArray = new Array();
            sweepAreaArray.push(centerMarkLatLng);
            for (var i = 0.1; i <= distSweep; i += 0.1) {
                sweepAreaArray.push(getSphericalPointByDistance(centerMarkLatLng, leftbound, i));
            }             
            i = leftbound + 10; 
            var r, j;
            if (leftbound < rightbound) r = rightbound; else r = rightbound + 360;
            while (i < r) {
                if (i < 360) j = i; else j = i - 360;
                sweepAreaArray.push(getSphericalPointByDistance(centerMarkLatLng, j, distSweep));
                i += 10;
            }
            for (i = distSweep; i >= 0.1; i -= 0.1) {
                sweepAreaArray.push(getSphericalPointByDistance(centerMarkLatLng, rightbound, i));
            }
            sweepArea = new GPolygon(sweepAreaArray, "#ff0000", 1, 0.2, "#ff0000", 0.2, {clickable:false});
            map.addOverlay(sweepArea);
//            if (!isNaN(split) && split > 0) {
//                var i = leftbound + split; 
//                var r, j, n = 0;
//                if (leftbound < rightbound) r = rightbound; else r = rightbound + 360;
//                while (i < r) {
//                  if (i < 360) j = i; else j = i - 360;
//                  var viewLineMarkLatLng = getSphericalPointByDistance(centerMarkLatLng, j, distSweep);
//                  splitViewLine[n] = new GPolyline([centerMarkLatLng, viewLineMarkLatLng], "#ff0000", 1, 0.7, { geodesic: true, clickable: false });
//                  map.addOverlay(splitViewLine[n]);
//                  n++;
//                  i += split;
//                }
//            }
        }
    }
    //resetTitle();
}

function radFromDeg(angleDeg) {
    return angleDeg / 180 * Math.PI;
}

function degFromRad(angleRad) {
    return angleRad * 180 / Math.PI;
}

function azimutSpherical(latlng1, latlng2) {
    var dLon = radFromDeg(latlng2.lng()) - radFromDeg(latlng1.lng());
    var a = degFromRad(
            Math.atan2(Math.sin(dLon) * Math.cos(radFromDeg(latlng2.lat())),
            Math.cos(radFromDeg(latlng1.lat())) * Math.sin(radFromDeg(latlng2.lat())) - Math.sin(radFromDeg(latlng1.lat())) * Math.cos(radFromDeg(latlng2.lat())) * Math.cos(dLon))
            );
    if (a < 0) a += 360;
    return a;
}

function getSphericalPointByDistance(latlng, azimut, distance) {
    var lat1 = radFromDeg(latlng.lat());
    var lon1 = radFromDeg(latlng.lng());
    azimut = radFromDeg(azimut);
    distance = radFromDeg(distance);
    var lat2 = Math.asin(Math.sin(lat1) * Math.cos(distance) + Math.cos(lat1) * Math.sin(distance) * Math.cos(azimut));
    var lon2 = lon1 + Math.atan2(Math.sin(azimut) * Math.sin(distance) * Math.cos(lat1), Math.cos(distance) - Math.sin(lat1) * Math.sin(lat2));
    var ll = new GLatLng(degFromRad(lat2), degFromRad(lon2));
//    var ll = new GLatLng(degFromRad(radFromDeg(latlng.lat()) + Math.asin(Math.sin(radFromDeg(distance)) * Math.sin(radFromDeg(90 - azimut)))), 
//    degFromRad(radFromDeg(latlng.lng()) + Math.atan(Math.tan(radFromDeg(distance)) * Math.cos(radFromDeg(90 - azimut)))));
    return ll;
}

function getEventElement(event) {
    if (!event) event = window.event;
    var el;
    if (event.srcElement) {
        el = event.srcElement;
    } else {
        if (event.target) el = event.target;
    }
    return el;
}

//function eventHandlerMouseDown(event) {
//    var el = getEventElement(event);
//    alert("mapMouseButtonDown: "+el.id);
//    if (el.id == "map") {
//        mapMouseButtonPressed = true;
//        alert("mapMouseButtonDown");
//    }
//}

//function eventHandlerMouseUp(event) {
//    var el = getEventElement(event);
//    alert("mapMouseButtonUp: " + el.id);
//    if (el.id == "map") {
//        mapMouseButtonPressed = false;
//        alert("mapMouseButtonUp");
//    }
//}

function eventHandlerClick(event) {
    var el = getEventElement(event);
    var n;
    if (el) {
        if (el.id.substr(0, 7) == "lastPan") {
            document.getElementById("history").style.visibility = "hidden";
            nr = el.id.substr(7);
            setQuery(lastPans[nr]);
            resetDir();
        }
        if (el.id.substr(0, 12) == "summitPoints") {
            document.getElementById("ddsummits").style.visibility = "hidden";
            nr = el.id.substr(12);
            var parts = summitPoints[nr].split("§");
            document.getElementById("lat").value = parts[2];
            document.getElementById("lon").value = parts[3];
            //document.getElementById("alt").value = parts[4];
            document.getElementById("alt").value = "auto";
            document.getElementById("summitfilter").value = parts[0];
            document.getElementById("title").value = parts[0] + " " + parts[1];
            document.getElementById("hialt").checked = true;
            document.getElementById("altcam").value = "10";
//            document.getElementById("azimut").value = "S";
//            document.getElementById("sweep").value = "60";
//            document.getElementById("leftbound").value = "150";
//            document.getElementById("rightbound").value = "210";
            document.getElementById("zoom").value = "1";
            document.getElementById("resolution").value = "20";
            document.getElementById("tilt").value = "auto";
            document.getElementById("newCamTilt").value = "";
            document.getElementById("range").value = "300";
            document.getElementById("elexagg").value = "1.2";
            setMapCenter();
            setSweepArea();
//            resetDir();
        }
        if (el.id == "iBPRight") {
            //alert(currBackPoint + "; " + backPoints.length + "; " + backPoints);
            if (currBackPoint > 0) {
                currBackPoint -= 1;
                document.getElementById("lon").value = backPoints[currBackPoint].lng();
                document.getElementById("lat").value = backPoints[currBackPoint].lat();
                document.getElementById("alt").value = "auto";
                setSweepArea();
                resetDir();
            }
        }
        if (el.id == "iBPLeft") {
            //alert(currBackPoint + "; " + backPoints.length + "; " + backPoints);
            if (currBackPoint < backPoints.length - 1) {
                currBackPoint += 1;
                document.getElementById("lon").value = backPoints[currBackPoint].lng();
                document.getElementById("lat").value = backPoints[currBackPoint].lat();
                document.getElementById("alt").value = "auto";
                setSweepArea();
                resetDir();
            }
        }
        if (el.id == "typic") {
            if (document.getElementById("shelp").style.visibility == "hidden") {
                document.getElementById("shelp").style.visibility = "visible";
            } else {
                document.getElementById("shelp").style.visibility = "hidden";
            }
        }
        if (el.name == "dir") {
            if (el.value == "360") {
                document.getElementById("leftbound").value = "0";
                document.getElementById("rightbound").value = "360";
            }
            if (el.value == "N") {
                document.getElementById("leftbound").value = "330";
                document.getElementById("rightbound").value = "30";
            }
            if (el.value == "NO") {
                document.getElementById("leftbound").value = "15";
                document.getElementById("rightbound").value = "75";
            }
            if (el.value == "O") {
                document.getElementById("leftbound").value = "60";
                document.getElementById("rightbound").value = "120";
            }
            if (el.value == "SO") {
                document.getElementById("leftbound").value = "105";
                document.getElementById("rightbound").value = "165";
            }
            if (el.value == "S") {
                document.getElementById("leftbound").value = "150";
                document.getElementById("rightbound").value = "210";
            }
            if (el.value == "SW") {
                document.getElementById("leftbound").value = "195";
                document.getElementById("rightbound").value = "255";
            }
            if (el.value == "W") {
                document.getElementById("leftbound").value = "240";
                document.getElementById("rightbound").value = "300";
            }
            if (el.value == "NW") {
                document.getElementById("leftbound").value = "285";
                document.getElementById("rightbound").value = "345";
            }
            //document.getElementById("hialt").checked = true;
            document.getElementById("tilt").value = "auto";
            document.getElementById("tiltsplit").checked = false;
            document.getElementById("newCamTilt").value = "";
            getSweep(document.getElementById("leftbound"));
            getSweep(document.getElementById("rightbound"));
            document.getElementById("resolution").value = "20";
            getZoom(document.getElementById("resolution"));
            setSweepArea();
        }
    }
}

function eventHandlerMouseOver(event) {
    var el = getEventElement(event);
    if (el) {
        if ((el.id.substr(0, 7) == "lastPan") || (el.id.substr(0, 12) == "summitPoints")) {
            el.style.backgroundColor = "lightgrey";
            el.style.cursor = "pointer";
        }
        if (el.id == "restriction") {
            map.addOverlay(coveragePolygon);
            map.addOverlay(coveragePolygon1);
            map.addOverlay(coveragePolygon2);
            showObj(true, document.getElementById('coverage'), el, -200, 30);
            lastZoom = map.getZoom();
            //hSetMapZoom = setTimeout("setMapZoom(" + zoomAlpView + ")", 500);
            if (lastZoom > zoomAlpView) {
                hSetMapZoom = setTimeout(function() { setMapZoom(zoomAlpView) }, 500);
            }
        }
        if (el.id == "asource") {
          showObj(true, document.getElementById('dsource'), el, -150, 30);
        }
        if (el.id == "dsourceclose" || el.id == "map") {
          showObj(false, document.getElementById('dsource'), el, 0, 30);
        }
      }
}

function eventHandlerMouseOut(event) {
    var el = getEventElement(event);
    if (el) {
        if ((el.id.substr(0, 7) == "lastPan") || (el.id.substr(0, 12) == "summitPoints")) {
            el.style.backgroundColor = "lightyellow";
            el.style.cursor = "default";
        }
        if (el.id == "restriction") {
            clearTimeout(hSetMapZoom);
            map.removeOverlay(coveragePolygon);
            map.removeOverlay(coveragePolygon1);
            map.removeOverlay(coveragePolygon2);
            map.setZoom(lastZoom);
            showObj(false, document.getElementById('coverage'), el, 0, 30);
        }
      }
}

function eventHandlerBlur(el) {
    //    if (!event) event = window.event;
    //    var el;
    //    if (event.srcElement) {
    //        el = event.srcElement;
    //    } else {
    //        if (event.target) el = event.target;
    //    }
    //alert("eventHandlerChange: " + el.id);
  if (el) {

    //document.getElementById("test1").innerHTML = "Blur:" + el.id + " " + new Date();

        if (!checkEntries()) return false;
        if (el.id == "hialt") hialtState = document.getElementById("hialt").checked;
        if (el.id == "lon" || el.id == "lat") document.getElementById("hialt").checked = hialtState;
        if (el.id == "azimut" || el.id == "sweep" || el.id == "leftbound" || el.id == "rightbound") getSweep(el);
        //if (el.id == "split" || el.id == "splitnr") getZoom(el);
        if (el.id == "resolution" || el.id == "zoom") getZoom(el);
        if (el.id == "tilt") {
            var tiltvalue = trim(document.getElementById("tilt").value);
            document.getElementById("newCamTilt").value = "";
            if (tiltvalue == "auto" || tiltvalue == "") {
                document.getElementById("tiltsplit1").style.visibility = "visible";
                document.getElementById("tiltsplit2").style.visibility = "visible";
            } else {
                document.getElementById("tiltsplit1").style.visibility = "hidden";
                document.getElementById("tiltsplit2").style.visibility = "hidden";
            }
        }
        //if (el.id == "lat" || el.id == "lon" || el.id == "azimut" || el.id == "sweep" || el.id == "leftbound" || el.id == "rightbound" || el.id == "hialt" || el.id == "resolution") {
        setSweepArea();
        resetDir();
        //}
    }
}

function eventHandlerChange(el) {
    //alert("eventHandlerChange: " + el.id);
    changedEl = el;
    clearTimeout(hChangeTimer);
    hChangeTimer = setTimeout(eventHandlerChange1, 2000);
}

function eventHandlerChange1() {
    var el = changedEl;
    if (el) {
        //alert(el.id);
        alerted = false;
        if (!checkEntries()) return false;
        if (el.id == "lon" || el.id == "lat") document.getElementById("hialt").checked = hialtState;
        if (el.id == "azimut" || el.id == "sweep" || el.id == "leftbound" || el.id == "rightbound") getSweep(el);
        //if (el.id == "split" || el.id == "splitnr") getZoom(el);
        if (el.id == "resolution" || el.id == "zoom") getZoom(el);
        if (el.id == "tilt") {
            var tiltvalue = trim(document.getElementById("tilt").value);
            document.getElementById("newCamTilt").value = "";
            if (tiltvalue == "auto" || tiltvalue == "") {
                document.getElementById("tiltsplit1").style.visibility = "visible";
                document.getElementById("tiltsplit2").style.visibility = "visible";
            } else {
                document.getElementById("tiltsplit1").style.visibility = "hidden";
                document.getElementById("tiltsplit2").style.visibility = "hidden";
            }
        }
        //if (el.id == "lat" || el.id == "lon" || el.id == "azimut" || el.id == "sweep" || el.id == "leftbound" || el.id == "rightbound" || el.id == "hialt" || el.id == "resolution") {
        setSweepArea();
        resetDir();
        //}
    }
}

function pushBackPoint(point) {
    if (backPoints.length > 0) {
        //alert(point + "; " + backPoints[backPoints.length - 1] + "; " + (String(point) == String(backPoints[backPoints.length - 1])));
        if (String(point) != String(backPoints[backPoints.length - 1])) {
            while (backPoints.length - 1 > currBackPoint) backPoints.pop();
            backPoints.push(point);
            currBackPoint = backPoints.length - 1;
        }
    } else {
        backPoints.push(point);
        currBackPoint = backPoints.length - 1;
    } 
}

function handleMapEventsClick(overlay, latlng, overlaylatlng) {
    document.getElementById('shelp').style.visibility = 'hidden';
    if (!overlay) {
        if (mapClickStatus == "getpos") {
            var lon = Math.round(latlng.lng() * 100000) / 100000;
            var lat = Math.round(latlng.lat() * 100000) / 100000;
            document.getElementById("lon").value = lon;
            document.getElementById("lat").value = lat;
            //alert(lat + "; " + lon);
            pushBackPoint(new GLatLng(lat, lon));
            setSweepArea();
        }
    }
}

function handleMapEventsMousemove(latlng) {
    //alert("mousemove: " + latlng + "; " + map.fromLatLngToContainerPixel(latlng) + "; " + map.fromLatLngToContainerPixel(latlng).y + "; " + "test");
    ttlines.style.top = map.fromLatLngToContainerPixel(latlng).y + "px";
    ttlines.style.left = map.fromLatLngToContainerPixel(latlng).x + "px";
    //alert(ttlines.style.top + "; " + ttlines.style.left);
    if (mapClickStatus == "silent") {
        if (hMapListenerMousemove) GEvent.removeListener(hMapListenerMousemove);
        //document.getElementById("descriptors").value = latlng + "; " + azimutSpherical(centerMarkLatLng, latlng);
        var azimut, leftBound, rightBound, sweep;
        if (dirLineStatus == "movable") {
            azimut = Math.round(azimutSpherical(centerMarkLatLng, latlng) * 100000) / 100000;
            document.getElementById("azimut").value = Math.round(azimut * 10) / 10;
            //alert("dirline");
            getSweep(document.getElementById("azimut"));
        }
        if (rightViewLineStatus == "movable") {
            azimut = Number(getDegFromForm(document.getElementById("azimut").value, 0, 360));
            rightBound = Math.round(azimutSpherical(centerMarkLatLng, latlng) * 100000) / 100000;
            if (rightBound < azimut) rightBound += 360;
            if (rightBound > azimut + 180 && rightBound < azimut + 270) rightBound = azimut + 180;
            if (rightBound >= azimut + 270 && rightBound < azimut + 360) rightBound = azimut + 3;
            if (rightBound < azimut + 3) rightBound = azimut + 3;
            leftBound = azimut - (rightBound - azimut);
            sweep = rightBound - leftBound;
            if (rightBound > 360) rightBound -= 360;
            if (leftBound < 0) leftBound += 360;
            document.getElementById("rightbound").value = Math.round(rightBound * 10) / 10;
            document.getElementById("leftbound").value = Math.round(leftBound * 10) / 10;
            document.getElementById("sweep").value = Math.round(sweep * 10) / 10;
//            document.getElementById("split").value = document.getElementById("sweep").value;
            //alert("rightline");
            getSweep(document.getElementById("leftbound"));
        }
        if (leftViewLineStatus == "movable") {
            azimut = Number(getDegFromForm(document.getElementById("azimut").value, 0, 360));
            leftBound = Math.round(azimutSpherical(centerMarkLatLng, latlng) * 100000) / 100000;
            if (leftBound > azimut) leftBound -= 360;
            if (leftBound < azimut - 180 && leftBound > azimut - 270) leftBound = azimut - 180;
            if (leftBound <= azimut - 270 && leftBound > azimut - 360) leftBound = azimut - 3;
            if (leftBound > azimut - 3) leftBound = azimut - 3;
            rightBound = azimut + (azimut - leftBound);
            sweep = rightBound - leftBound;
            if (leftBound < 0) leftBound += 360;
            if (rightBound > 360) rightBound -= 360;
            document.getElementById("rightbound").value = Math.round(rightBound * 10) / 10;
            document.getElementById("leftbound").value = Math.round(leftBound * 10) / 10;
            document.getElementById("sweep").value = Math.round(sweep * 10) / 10;
//            document.getElementById("split").value = document.getElementById("sweep").value;
            //alert("leftline");
            getSweep(document.getElementById("leftbound"));
        }
        //alert("mousemove: " + azimut + "; " + leftBound + "; " + rightBound + "; " + sweep + "; " + split);
        setSweepArea();
        resetDir();
        hMapListenerMousemove = GEvent.addListener(map, "mousemove", function(latlng) { handleMapEventsMousemove(latlng) });
    }
}

function handleDirLineMouseover() {
    if (dirLineStatus == "fixed" && leftViewLineStatus == "fixed" && rightViewLineStatus == "fixed") {
        map.disableDragging();
        GEvent.removeListener(hMapListenerClick);
        map.getDragObject().setDraggableCursor("pointer");
        dirLine.setStrokeStyle({ color: "#ffff00", weight: 3, opacity: 1 });
        hMapListenerMousemove = GEvent.addListener(map, "mousemove", function(latlng) { handleMapEventsMousemove(latlng) });
        ttlines.innerHTML = txtLineMovable;
        ttlines.style.visibility = "visible";
    }
}

function handleDirLineMouseout() {
    if (dirLineStatus == "fixed" && leftViewLineStatus == "fixed" && rightViewLineStatus == "fixed") {
        ttlines.style.visibility = "hidden";
        if (hMapListenerMousemove) GEvent.removeListener(hMapListenerMousemove);
        map.getDragObject().setDraggableCursor("crosshair");
        dirLine.setStrokeStyle({ color: dirLineColor, weight: dirLineWidth, opacity: 1 });
        hMapListenerClick = GEvent.addListener(map, "click", function(overlay, latlng, overlaylatlng) { handleMapEventsClick(overlay, latlng, overlaylatlng) });
        map.enableDragging();
    } 
}

function handleDirLineClick() {
    if (dirLineStatus == "fixed") {
        dirLineStatus = "movable";
        dirLineColor = "#00ff00";
        dirLineWidth = 4;
        mapClickStatus = "silent";
        map.disableDragging();
        map.getDragObject().setDraggableCursor("pointer");
        setSweepArea();
        resetDir();
        hMapListenerMousemove = GEvent.addListener(map, "mousemove", function(latlng) { handleMapEventsMousemove(latlng) });
        ttlines.innerHTML = txtLineFixed;
    } else 
    if (dirLineStatus == "movable") {
        ttlines.style.visibility = "hidden";
        if (hMapListenerMousemove) GEvent.removeListener(hMapListenerMousemove);
        dirLineStatus = "fixed";
        dirLineColor = "#ff0000";
        dirLineWidth = 3;
        mapClickStatus = "getpos";
        map.getDragObject().setDraggableCursor("crosshair");
        hMapListenerClick = GEvent.addListener(map, "click", function(overlay, latlng, overlaylatlng) { handleMapEventsClick(overlay, latlng, overlaylatlng) });
        map.enableDragging();
        setSweepArea();
        resetDir();
    } 
}

function handleLeftViewLineMouseover() {
    if (dirLineStatus == "fixed" && leftViewLineStatus == "fixed" && rightViewLineStatus == "fixed") {
        map.disableDragging();
        GEvent.removeListener(hMapListenerClick);
        map.getDragObject().setDraggableCursor("pointer");
        leftViewLine.setStrokeStyle({ color: "#ffff00", weight: 3, opacity: 1 });
        hMapListenerMousemove = GEvent.addListener(map, "mousemove", function(latlng) { handleMapEventsMousemove(latlng) });
        ttlines.innerHTML = txtLineMovable;
        ttlines.style.visibility = "visible";
    }
}

function handleLeftViewLineMouseout() {
    if (dirLineStatus == "fixed" && leftViewLineStatus == "fixed" && rightViewLineStatus == "fixed") {
        ttlines.style.visibility = "hidden";
        if (hMapListenerMousemove) GEvent.removeListener(hMapListenerMousemove);
        map.getDragObject().setDraggableCursor("crosshair");
        leftViewLine.setStrokeStyle({ color: leftViewLineColor, weight: leftViewLineWidth, opacity: 1 });
        hMapListenerClick = GEvent.addListener(map, "click", function(overlay, latlng, overlaylatlng) { handleMapEventsClick(overlay, latlng, overlaylatlng) });
        map.enableDragging();
    }
}

function handleLeftViewLineClick() {
    if (leftViewLineStatus == "fixed") {
        leftViewLineStatus = "movable";
        leftViewLineColor = "#00ff00";
        leftViewLineWidth = 4;
        mapClickStatus = "silent";
        map.disableDragging();
        setSweepArea();
        map.getDragObject().setDraggableCursor("pointer");
        hMapListenerMousemove = GEvent.addListener(map, "mousemove", function(latlng) { handleMapEventsMousemove(latlng) });
        ttlines.innerHTML = txtLineFixed;
    } else
    if (leftViewLineStatus == "movable") {
        ttlines.style.visibility = "hidden";
        if (hMapListenerMousemove) GEvent.removeListener(hMapListenerMousemove);
        leftViewLineStatus = "fixed";
        leftViewLineColor = "#ff0000";
        leftViewLineWidth = 1;
        mapClickStatus = "getpos";
        map.getDragObject().setDraggableCursor("crosshair");
        map.enableDragging();
        setSweepArea();
    }
}

function handleRightViewLineMouseover() {
    if (dirLineStatus == "fixed" && leftViewLineStatus == "fixed" && rightViewLineStatus == "fixed") {
        map.disableDragging();
        GEvent.removeListener(hMapListenerClick);
        map.getDragObject().setDraggableCursor("pointer");
        rightViewLine.setStrokeStyle({ color: "#ffff00", weight: 3, opacity: 1 });
        hMapListenerMousemove = GEvent.addListener(map, "mousemove", function(latlng) { handleMapEventsMousemove(latlng) });
        ttlines.innerHTML = txtLineMovable;
        ttlines.style.visibility = "visible";
    }
}

function handleRightViewLineMouseout() {
    if (dirLineStatus == "fixed" && leftViewLineStatus == "fixed" && rightViewLineStatus == "fixed") {
        ttlines.style.visibility = "hidden";
        if (hMapListenerMousemove) GEvent.removeListener(hMapListenerMousemove);
        map.getDragObject().setDraggableCursor("crosshair");
        rightViewLine.setStrokeStyle({ color: rightViewLineColor, weight: rightViewLineWidth, opacity: 1 });
        hMapListenerClick = GEvent.addListener(map, "click", function(overlay, latlng, overlaylatlng) { handleMapEventsClick(overlay, latlng, overlaylatlng) });
        map.enableDragging();
    }
}

function handleRightViewLineClick() {
    if (rightViewLineStatus == "fixed") {
        rightViewLineStatus = "movable";
        rightViewLineColor = "#00ff00";
        rightViewLineWidth = 4;
        mapClickStatus = "silent";
        map.disableDragging();
        setSweepArea();
        map.getDragObject().setDraggableCursor("pointer");
        hMapListenerMousemove = GEvent.addListener(map, "mousemove", function(latlng) { handleMapEventsMousemove(latlng) });
        ttlines.innerHTML = txtLineFixed;
    } else
    if (rightViewLineStatus == "movable") {
        ttlines.style.visibility = "hidden";
        if (hMapListenerMousemove) GEvent.removeListener(hMapListenerMousemove);
        rightViewLineStatus = "fixed";
        rightViewLineColor = "#ff0000";
        rightViewLineWidth = 1;
        mapClickStatus = "getpos";
        map.getDragObject().setDraggableCursor("crosshair");
        map.enableDragging();
        setSweepArea();
    }
}

function loadPreview() {
   if (!checkEntries("silent")) return false;
   var data = getValuesString();
    //alert("loadPreview: " + data);
    if (data != prevPanData) {
        //if (prevPanData) alert(data.replace(/\$\$\$/g,"\n") + "\n\n" + prevPanData.replace(/\$\$\$/g,"\n"));
        document.getElementById("newCamTilt").value = "";
        prevPanData = data;
        document.getElementById("iPreview").src = "panquery.aspx?mode=preview&data=" + escape(data);
    }
}

function toggleSummitMode(el) {
    var el1;
    if (el.id == "summitstarts") el1 = document.getElementById("summitcontains");
    else el1 = document.getElementById("summitstarts");
    if (el.checked) el1.checked = false; else el1.checked = true;
    getSummits();
}

function getXMLHTTP() {
    try {
        return new ActiveXObject("Msxml2.XMLHTTP")
    } catch (e1) {
        try {
            return new ActiveXObject("Microsoft.XMLHTTP")
        } catch (e2) {
            return typeof XMLHttpRequest != "undefined" ?
          new XMLHttpRequest() : null;
        }
    }
}

function getSummits() {
    var filter = document.getElementById("summitfilter").value;
    var dds = document.getElementById("ddsummits");
    var mode;
    var h, h1 = "";
    if (dds.innerHTML.length == 0) {
      if (lg == "en") {
        h1 = "Close";
      } else {
        if (lg == "it") {
          h1 = "Chiudere";
        } else {
          h1 = "Schließen";
        }
      }
      h1 = "<a href=\"javascript:void(0)\" onclick=\"document.getElementById('ddsummits').style.visibility = 'hidden';document.getElementById('summitfilter').value = '';\">" + h1 + "</a><br />";
    }
    if (dds.innerHTML.substring(0, 4) != "Load" && dds.innerHTML.substring(0, 4) != "Date") {
      if (lg == "en") {
        h = "Loading data...";
      } else {
        if (lg == "it") {
          h = "Caricamento dei dati...";
        } else {
          h = "Daten laden...";
        }
      }
      dds.innerHTML = h + "<br />" + h1 + dds.innerHTML;
    }
    dds.style.visibility = "visible";
    if (document.getElementById("summitstarts").checked) mode = "starts"; else mode = "contains";
    if (XMLHTTPObj) {
        //alert(filter + ", " + mode + ", " + XMLHTTPObj.readyState + ", " + (XMLHTTPObj.status));
        if (XMLHTTPObj.readyState) XMLHTTPObj.abort();
        XMLHTTPObj.onreadystatechange = showSummits;
        XMLHTTPObj.open("GET", "summitquery.aspx?mode=" + mode + "&filter=" + filter, true);
        //XMLHTTPObj.overrideMimeType("text/html; charset=ISO-8859-1");
        XMLHTTPObj.send(null)
    }
}

function initSummits() {
    if (XMLHTTPObj) {
        XMLHTTPObj.open("GET", "summitquery.aspx?mode=init", true);
        XMLHTTPObj.send(null)
    }
}

function showSummits() {
    //alert("showSummits: " + XMLHTTPObj.readyState + ", " + XMLHTTPObj.status);
    var h;
    var dds = document.getElementById("ddsummits");
    if (lg == "en") {
      h = "Close";
    } else {
      if (lg == "it") {
        h = "Chiudere";
      } else {
        h = "Schließen";
      }
    }
    var cls = "<a href=\"javascript:void(0)\" onclick=\"document.getElementById('ddsummits').style.visibility = 'hidden';document.getElementById('summitfilter').value = '';\">" + h + "</a>";
    if (XMLHTTPObj.readyState == 4 && XMLHTTPObj.status == 200) {
        summitPoints = XMLHTTPObj.responseText.split("|");
        if (trim(summitPoints[0]).length > 0) {
          dds.innerHTML = cls;
          for (i = 0; i < summitPoints.length; i++) {
            var parts = summitPoints[i].split("§");
            var oDiv = document.createElement("div");
            oDiv.id = "summitPoints" + i;
            oDiv.appendChild(document.createTextNode(parts[0] + ", " + parts[4] + " m " + parts[1]));
            dds.appendChild(oDiv);
          }
          dds.innerHTML += cls;
          dds.style.visibility = "visible";
        } else {
          dds.style.visibility = "hidden";
        }
    }
}

function resetDir() {
    document.getElementById("dir1").checked = false;
    document.getElementById("dir2").checked = false;
    document.getElementById("dir3").checked = false;
    document.getElementById("dir4").checked = false;
    document.getElementById("dir5").checked = false;
    document.getElementById("dir6").checked = false;
    document.getElementById("dir7").checked = false;
    document.getElementById("dir8").checked = false;
    document.getElementById("dir9").checked = false;
}

function setMapZoom(zoomValue) {
  map.setZoom(zoomValue);
}
