var cnt = 0;
var map;
var pts1 = "";
var pts2 = "";
var mapState = 0;

var inBounds = 1;
// var map = null;
var grMarker = null;
var oMarker = null;
var routingPointFrom = null;
var routingPointTo = null;
var routingAddressFrom = null;
var routingAddressTo = null;
var routeMode = false;
var northBounds = null;

var prGrMarker;
var prgrx = null;
var prgry = null;
var prgrt = null;
var prar1 = new Array();
var prar2 = new Array();
var prmcn = null;
var prmzm = null;
var prrf = null;
var prrt = null;

var xCenter = null;
var bounds = null;
var lbounds = null;
var gbounds = null;
var poly = null;

var currentPoint = "";
var currentInput = null;
var currentOutput = null;

var offset = 0;
var o = 0;

if (GBrowserIsCompatible()) {
  var mapTypeControl = new GMapTypeControl();
  var smallMapControl = new GSmallMapControl();
  var overviewControl = new GOverviewMapControl();
  var largeMapControl = new GLargeMapControl();
 }

function initMap4(){
  if (GBrowserIsCompatible()) {
    // var areax = 23.7249;  // var areay = 37.9745;  // var zoom = 11;
    zoom = 12;
    center = new GLatLng(38.08782386165401, 23.84960174560547);
    map = new GMap2(document.getElementById("mapCanvas"));
    map.setCenter(center, zoom);
    northBounds = map.getBounds();
    map.addControl(smallMapControl);
    mapLoaded = 1;
  }
}

function initMapNear(){
  if (GBrowserIsCompatible()) {
    // var areax = 23.7249;  // var areay = 37.9745;  // var zoom = 11;
    zoom = 12;
    center = new GLatLng(38.08782386165401, 23.84960174560547);
    map = new GMap2(document.getElementById("mapCanvas"));
    map.setCenter(center, zoom);
    mapLogo();
    northBounds = map.getBounds();
    map.addControl(largeMapControl);
    map.addControl(mapTypeControl);
    map.addControl(overviewControl);
    mapLoaded = 1;
  }
}

function mapLogo(){
  return;
  logo = new GScreenOverlay('/images/e-odigos_screenoverlay.png',
			    new GScreenPoint(70, .92, 'pixels', 'fraction'),  // screenXY
			    new GScreenPoint(0, 0),  // overlayXY
			    new GScreenSize(113, 30)  // size on screen
			    );
  map.addOverlay(logo);
}

function setGBounds(){
  lb = northBounds;
  gbounds.extend(lb.getNorthEast());
  gbounds.extend(lb.getSouthWest());
}

function enlargeMap(){
  mapState = 1;
  $("#mapCanvas").css("height", "400px");
  var toggleText = "<img src=/images/magn-.gif> <a href=\"javascript:shrinkMap()\" class=magntext>Σμίκρυνση χάρτη</a>";
  $("#toggle").html(toggleText);
  map.checkResize();
  map.removeControl(smallMapControl);
  map.addControl(largeMapControl);
  map.addControl(mapTypeControl);
  map.addControl(overviewControl);
  centerMap();
}

function shrinkMap(){
  mapState = 0;
  $("#mapCanvas").css("height", "100px");
  var toggleText = "<img src=/images/magn+.gif> <a href=\"javascript:enlargeMap()\" class=magntext>Μεγέθυνση χάρτη</a>";
  $("#toggle").html(toggleText);
  map.checkResize();
  map.removeControl(largeMapControl);
  map.removeControl(mapTypeControl);
  map.removeControl(overviewControl);
  map.addControl(smallMapControl);
  centerMap();
}

function myGenClick(point){
  if ($("#chk:checked").val() == "on")
    myClick3(point);
  else
    myClick2(point);
}


function myClick2(point){
  marker = createMarker (point, "", point.toString(), 'green');
  map.addOverlay(marker);
  map.setCenter(point);
  xCenter = point;
}



//////////////////////////////////////// MARKERS ////////////////////////////////////////

// Markers
function Markers(){
  this.init();
}

Markers.prototype.init = function(){
  if (this.markersList != null && this.markersList.length > 0){
    for (i in this.markersList)
      map.removeOverlay(this.markersList[i]);
  }

  this.markersList = new Array();
  this.markersGeo = new Array();
  this.windowTabs = new Array();
  this.tabsIndex = new Array();
  lbounds = new GLatLngBounds();
  gbounds = new GBounds();
}

Markers.prototype.add  = function(id, point, title, name, html, icontype, address, geostring, maxTitle, maxContent){

  // extend bounds
  lbounds.extend(point);
  gbounds.extend(point);

  // create tab
  if (name.length >= 8)
    name = name.substring(0,6) + "...";
  var tab = new GInfoWindowTab(name, html);

  if ((xid = arraySearch(this.markersGeo, geostring)) >= 0){ // combine to existing marker
    var marker = this.markersList[xid]; 
    map.removeOverlay(marker);
    // find tab position
    var position = xid + "@" + this.windowTabs[xid].length;
    this.tabsIndex[id] = position;
    // add tab to windowTabs array and bind to marker
    this.windowTabs[xid].push(tab);
    marker.bindInfoWindowTabsHtml(this.windowTabs[xid]);
    // add overlay
    map.addOverlay(marker);
  }
  else { // add new marker
    var marker = createMarker(id, point, title, name, html, address, icontype);
    // tabs: create, add to windowTabs array, bind to marker
    var tabs = new Array();
    tabs.push(tab);
    this.windowTabs[id] = tabs;
    marker.bindInfoWindowTabsHtml(this.windowTabs[id], {maxTitle: maxTitle, maxContent: maxContent});
    // add overlay
    map.addOverlay(marker);
    // add to Markers arrays
    this.markersList[id] = marker;
    this.markersGeo[id] = geostring;
    GEvent.addListener(marker, "infowindowopen", function() {
			 if (mapState == 0)
			   enlargeMap();
    });
  }
}


var Markers = new Markers;


function inArray(array, value){
  var i;
  for (i in array) {
    if (array[i] === value) {
      return true;
    }
  }
  return false;
}

function arrayKeyExists(array, value){
  var i;
  for (i in array) {
    if (i == value)
      return true;
  }
  return false;
}

function arraySearch(array, value){
  var i;
  for (i in array) {
    if (array[i] === value) {
      return i;
    }
  }
  return -1;
}


//////////////////////////////////////// MARKERS ////////////////////////////////////////


function getSpots(){
  var icontype = 'red';
  Markers.init();
  o = offset;

  $.getJSON("/ajaxGeospots",{page: page, q: q, s: s, r: r, o: o }, function(j){
	      if (!initResults)
		$("#resContainer").html("");
    for (var i = 0; i < j.length; i++) {
      var point = new GLatLng(j[i].f, j[i].l);
      var html = j[i].text;
      var title = j[i].title;
      var name = j[i].name;
      var address = j[i].address;
      var geostring = j[i].geostring;
      var id = j[i].id;
      var resHtml = j[i].resHtml;
      Markers.add(id, point, title, name, html, icontype, address, geostring);
      if (!initResults)
	$("#resContainer").append(resHtml);
      if (i == j.length - 1)
	centerMap();
    }
    if (initResults)
      initResults = false;
    $(".rounded").corner();
	    });
}

function getSpotsCircle(){
  var icontype = 'red';
  Markers.init();
  o = offset;
  var cntr = xCenter.toString();
  var rd = $("#r").val();
  var ct = $("#c").val();

  $.getJSON("/ajaxGeospots",{page: page, n: cntr, r: rd, c: ct }, function(j){
	      if (!initResults)
		$("#resContainer").html("");
    for (var i = 0; i < j.length; i++) {
      var point = new GLatLng(j[i].f, j[i].l);
      var html = j[i].text;
      var title = j[i].title;
      var name = j[i].name;
      var address = j[i].address;
      var geostring = j[i].geostring;
      var id = j[i].id;
      var resHtml = j[i].resHtml;
      Markers.add(id, point, title, name, html, icontype, address, geostring);
      if (!initResults)
	$("#resContainer").append(resHtml);
      if (i == j.length - 1)
	centerMap();
    }
    if (initResults)
      initResults = false;
    $(".rounded").corner();
	    });
}



function centerMap(){
  var gpoint = gbounds.mid();
  var z = map.getBoundsZoomLevel(lbounds);
  var x = gpoint.toString();
  x = x.replace(/\(/,"");
  x = x.replace(/\)/,"");
  var sp = x.split(",");
  var lng = sp[0];
  var lat = sp[1];
  var lpoint = new GLatLng(lat, lng);
  map.setCenter(lpoint, z);
}

function myClick3(point){
  pts2 = point.toString();
  var marker = new GMarker(point);
  map.addOverlay(marker);
  pts1 = xCenter;
  calculate();
}

function myClick(point){
  if (cnt == 0){
    pts1 = point.toString();
    $("#results").append("first point: " + pts1 + "<br>");
    var marker = new GMarker(point);
    map.addOverlay(marker);
    cnt++;
  }
  else if (cnt == 1){
    pts2 = point.toString();
    $("#results").append("second point: " + pts2 + "<br>");
    $("#results").append("<br><input type=button onclick=javascript:calculate() value=calculate><br><br>");
    var marker = new GMarker(point);
    map.addOverlay(marker);
    cnt++;
  }
  else if (cnt == 2){
    map.clearOverlays();
    cnt =0;
    $("#results").html("");
  }
  
}

function calculate(){

  $.get("ajaxCalculate.php", { first: pts1, second: pts2 },
	function(data){
	  $("#results").append(data);
	});
}


function createMarker(id, point, t, html, name, address, icontype) {
    var iconfile = '/images/markers/' + icontype + 'T-dot-16.png';
    var sizex = '16';
    var sizey = '16';
  
    var tabs = new Array();

  var ico = createIcon(iconfile, sizex, sizey);
  ico.printImage = iconfile.replace(".png",".gif");
  ico.mozPrintImage = iconfile.replace(".png",".gif");
  var marker = new GMarker(point, { title: t, icon: ico});
  GEvent.addListener(marker, "click", function() {
    oMarker = marker;
  });

//  GEvent.addListener(marker, "click", function() {
//    marker.openInfoWindowHtml(html);
//    oMarker = marker;
//  });

  return marker;
}


function createIcon(iconn, sizex, sizey)
{
  var icon = new GIcon();
  icon.image = iconn;
  icon.shadow = "http://www.google.com/mapfiles/shadow50.png";
  icon.iconSize = new GSize(sizex, sizey);
  icon.shadowSize = new GSize(20, sizey);
  icon.iconAnchor = new GPoint(9, sizey);
  icon.infoWindowAnchor = new GPoint(9, 2);
  icon.infoShadowAnchor = new GPoint(18, 25);
  return icon;
}


function postGeocode(response){
  var inp = $('#' + currentInput);
  var outp = $('#' + currentOutput);
  outp.css("background-color", "#fff");
  if (!response || response.Status.code != 200) {
    outp.html("<font color=red>Η διεύθυνση δεν βρέθηκε</font>");
  }
  else {
    placeMarks = response.Placemark;
    placemarksCount = placeMarks.length;
    if (placemarksCount == 1){
      outp.html('');
      inp.css("background", "url(/images/green_check_18.png) no-repeat");
      inp.css("text-indent", "20px");
      selectPlacemark(0);
    }
    else {
      outpCssBox(currentOutput);
      outp.html("Βρέθηκαν περισσότερα από 1 αποτελέσματα:");
      var moreResults = "";
      for (j = 0; j < response.Placemark.length; j++){
          pl = placeMarks[j];
	  var addr = pl.address.replace(/, Greece/, "");
	  moreResults += "<a href=\"javascript:selectPlacemark(" + j + ")\" class=moreA>" + addr + "</a><br><br>";
      }
      outp.append("<br><br>");
      outp.append(moreResults);
    }
  }
}

function geocode(input, output){
  currentInput = input;
  currentOutput = output;
  var inp = $('#' + input);
  var outp = $('#' + output);
  outp.html("resolving address...");
  var geocodeThis = inp.val();
  if (geocodeThis == currentPoint)
    return;
  if (!streetsMode)
    map.clearOverlays();
  var gc = new GClientGeocoder();
  gc.setBaseCountryCode('GR');
  gc.getLocations(geocodeThis, postGeocode);
}

function geocodeSimple(){
  var x = $("#startPoint").val();
  if (x == currentPoint)
    return;
  map.clearOverlays();
  var gc = new GClientGeocoder();
  gc.setBaseCountryCode('GR');
  var xx = gc.getLatLng(x, function(point) {
			  marker = createMarker (point, "", point.toString(), 'green');
			  map.addOverlay(marker);
			  map.setCenter(point);
			  xCenter = point;
			  drawRadiusCircle();
			} );
}


function drawRadiusCircle(){
  var radius = $("#r").val();
  var nodes = 400;
  if (poly != null)
    map.removeOverlay(poly);
  drawCircle(xCenter, radius, nodes);
}


function drawCircle(center, radius, nodes, liColor, liWidth, liOpa, fillColor, fillOpa)
{
  // Esa 2006
  //calculating km/degree
  var latConv = center.distanceFrom(new GLatLng(center.lat()+0.1, center.lng()))/100;
  var lngConv = center.distanceFrom(new GLatLng(center.lat(), center.lng()+0.1))/100;

  //  $("#results").append(latConv);
  //  $("#results").append("<br>");
  //  $("#results").append(lngConv);

  //Loop 
  var points = [];
  var step = parseInt(360/nodes)||5;
  for(var i=0; i<=360; i+=step)
    {
      //      alert(i+"\n"+(radius/latConv * Math.cos(i*Math.PI/180)));
      var pint = new GLatLng(center.lat() + (radius/latConv * Math.cos(i * Math.PI/180)), center.lng() + 
			     (radius/lngConv * Math.sin(i * Math.PI/180)));
      points.push(pint);
      bounds.extend(pint); //this is for fit function
    }
  points.push(points[0]); // Closes the circle, thanks Martin
  fillColor = fillColor||liColor||"#0055ff";
  liWidth = liWidth||2;
  poly = new GPolygon(points,liColor,liWidth,liOpa,fillColor,fillOpa);
  map.addOverlay(poly);
}

function doSearch(){
  geocode('a', 'aHelp');
  getSpotsCircle();
}

function nameClick(nameId){
  if (arrayKeyExists(Markers.tabsIndex, nameId)){ // combined marker
    var position = Markers.tabsIndex[nameId];
    var sp = position.split("@");
    var markerId = sp[0];
    var tabId = sp[1];
    var xmarker = Markers.markersList[markerId];
    GEvent.addListener(xmarker, "infowindowopen", function() {
			 var iw = map.getInfoWindow();
			 iw.selectTab(tabId);
			 if (mapState == 0)
			   enlargeMap();
    });
    GEvent.trigger(xmarker, "click"); 
  }
  else { // simple marker
    var xmarker = Markers.markersList[nameId];
    GEvent.trigger(xmarker, "click"); 
  }
  if (mapState == 0)
    enlargeMap();
  window.location = String(window.location).replace(/\#.*$/, "") + "#mapLocation";
}

function drawPaging(){
  var currentPage = Math.floor((offset/r)) + 1;
  var paging = "Σελίδα: ";
  var bp = "<img src=/images/button_prev.png border=0 align=left>";
  var bn = "<img src=/images/button_next.png border=0 align=left>";
  var bp_ = "<img src=/images/button_prev_.png border=0 align=left>";
  var bn_ = "<img src=/images/button_next_.png border=0 align=left>";
  paging += currentPage;
  paging += " από ";
  paging += noOfPages;
  paging += "&nbsp;&nbsp;";
  if (offset > 0)
    paging += "<a href=\"javascript:changePage(" + (currentPage - 2) * r + ");\">" + bp + "</a>";
  else
    paging += bp_;
  paging += "&nbsp;";
  if (currentPage != noOfPages)
    paging += "<a href=\"javascript:changePage(" + (currentPage) * r + ");\">" + bn + "</a>";
  else
    paging += bn_;
  $("#pagingHtmlTop").html(paging);
  $("#pagingHtmlBottom").html(paging);
}

function changePage(o){
  offset = o;
  $("#resContainer").html('loading...<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>'); // handsome script ;)
  var rs = "";
  drawPaging();
  getSpots();
}

function selectPlacemark(pid){
  if (streetsMode) { // directions geocoding
    place = placeMarks[pid];
    address = place.address;
    point = new GLatLng(place.Point.coordinates[1],
		      place.Point.coordinates[0]);
    if (currentInput == 'srcinp'){
      routingPointFrom = point;
      routingAddressFrom = address;
    }
    else if (currentInput == 'dstinp' || currentInput == 'mapinp'){
      routingPointTo = point;
      routingAddressTo = address;
    }
    if (routingPointFrom != null && routingPointTo != null){
      doRoute();
      var outp = $('#' + currentOutput);
      outp.html('');
      outpCssNoBox(currentOutput);
      return;
    }
  }
  var inp = $('#' + currentInput);
  var outp = $('#' + currentOutput);
  outp.css("background-color","");
  Markers.init();
  map.clearOverlays();
  place = placeMarks[pid];
  outpCssNoBox(currentOutput);
  address = place.address;
  address_short = address.replace(/, Greece/, "");
  inp.val(address_short);
  outp.html('');
  inp.css("background", "url(/images/green_check_18.png) no-repeat");
  inp.css("text-indent", "20px");
  point = new GLatLng(place.Point.coordinates[1],
		      place.Point.coordinates[0]);
  title = address_short;
  name = address_short;
  //  html = "<div style=\"width: 300px; height: 80px;\">";
  html = "<div>";
  html += "<b>Διεύθυνση</b>: <br>";
  html += address_short;
  if (streetsMode)  // directions geocoding
    html += "<br><br><a href=\"javascript:clickRoute();\">Διαδρομή</a>";
  html += "</div>";

  maxContent = "";
  maxContent += "<div align=center>";
  maxContent += "<form name=form2 action=\"javascript:preRoute();\">";
  maxContent += "<table><tr valign=top><td width=250><br><br><br>";
  maxContent += "<table>";
  maxContent += "<tr>";
  maxContent += "<td><div style=\"overflow: hidden; width: 16px; height: 16px; position: relative;\"><img style=\"border: 0px none ; margin: 0px; padding: 0px; position: absolute; left: -32px; top: 0px; -moz-user-select: none;\" src=\"http://maps.gstatic.com/intl/en_ALL/mapfiles/dlimgs2.png\"/></div></td>";
  maxContent += "<td><input type=text id=srcinp size=35></td>";
  maxContent += "<td rowspan=2><div style=\"overflow: hidden; width: 18px; height: 18px; position: relative;\"><a href=\"javascript:toggleSrcDst()\"><img style=\"border: 0px none ; margin: 0px; padding: 0px; position: absolute; left: -210px; top: 0px; -moz-user-select: none;\" src=\"http://maps.gstatic.com/intl/en_ALL/mapfiles/dlimgs2.png\"/></a></div></td>";
  maxContent += "</tr>";
  
  maxContent += "<tr>";
  maxContent += "<td><div style=\"overflow: hidden; width: 16px; height: 16px; position: relative;\"><img style=\"border: 0px none ; margin: 0px; padding: 0px; position: absolute; left: -160px; top: 0px; -moz-user-select: none;\" src=\"http://maps.gstatic.com/intl/en_ALL/mapfiles/dlimgs2.png\"/></div></td>";
  maxContent += "<td><input type=text id=dstinp size=35></td>";
  maxContent += "</tr>";
  maxContent += "<tr><td colspan=3 align=center><input type=submit value=Go></td></tr>";
  maxContent += "</table>";
  maxContent += "</td>";
  maxContent += "<td width=250 align=left><div id=rououtp></div></td>";
  maxContent += "</tr></table>";
  maxContent += "</form>";
  maxContent += "</div>";

  if (!routeMode) {
    if (streetsMode) 
      Markers.add(1, point, title, name, html, 'green', address, '', 'Διαδρομή', maxContent);
    else
      Markers.add(1, point, title, name, html, 'green', address, '');
  }
  bounds = new GLatLngBounds();
  bounds.extend(point);
  xCenter = point;
  if (streetsMode && !routeMode){
    var xmarker = Markers.markersList[1];
    GEvent.trigger(xmarker, "click"); 
  }
  else
    drawRadiusCircle();
}

function outpCssBox(output){
  var outp = $('#' + output);
  outp.css("zIndex", "2");
  outp.css("position", "absolute");
  outp.css("height", "300px");
  outp.css("padding", "3px");
  outp.css("border", "1px solid #7090C5");
  outp.css("overflow", "auto");
}

function outpCssNoBox(output){
  var outp = $('#' + output);
  outp.css("zIndex", "2");
  outp.css("position", "absolute");
  outp.css("height", "12px");
  outp.css("padding", "3px");
  outp.css("border", "0px");
}

function resetCss(){
  var curObj = $(this);
  curObj.css("background", "");
  curObj.css("text-indent", "0px");
}


function doRoute() {

  if (routingPointFrom==null || routingPointTo==null){
    //    alert("Δεν έχετε ορίσει αφετηρία και προορισμό");
    return;
  }

  map.clearOverlays();
  $("#resContainer").html('');

  var directions = new GDirections(map, document.getElementById("resContainer"));
      
  //Create an array to house the two GLatLng Objects
  var arrLocation = new Array(2);
  arrLocation[0] = routingPointFrom;
  arrLocation[1] = routingPointTo;
      

  //Clear the mapa nd directions of any old information
  //      directions.clear();
      
  //Load the map and directions from the specified waypoints
  directions.loadFromWaypoints(arrLocation, { locale: "el_GR", getPolyline: true });
  //  routeMode = false;
} 


function preRoute(){
  var si = $("#srcinp").val();;
  var di = $("#dstinp").val();;
  if (routingPointFrom == null){
    if (si == ""){
      alert("Παρακαλώ επιλέξτε αφετηρία");
      return;
    }
    else {
      geocode('srcinp', 'rououtp');
    }
  } 
  if (routingPointTo == null){
    if (di == ""){
      alert("Παρακαλώ επιλέξτε προορισμό");
      return;
    }
    else 
      geocode('dstinp', 'rououtp');
  } 
  if (routingPointFrom != null && routingPointTo != null){
    doRoute();
  }
}

function initMapClient(){
  if (GBrowserIsCompatible()) {
    // var areax = 23.7249;  // var areay = 37.9745;  // var zoom = 11;
    zoom = 16;
    center = new GLatLng(gy, gx);
    map = new GMap2(document.getElementById("mapCanvas"));
    map.setCenter(center, zoom);
    map.addControl(largeMapControl);
    map.addControl(mapTypeControl);
    map.addControl(overviewControl);
    mapLoaded = 1;

    $.getJSON("/ajaxGeospots",{page: page, q: cid }, function(j){
      var icontype = "green";
      var point = new GLatLng(j[0].f, j[0].l);
      var html = j[0].text;
      var title = j[0].title;
      var name = j[0].name;
      var address = j[0].address;
      var geostring = j[0].geostring;
      var id = j[0].id;
      var resHtml = j[0].resHtml;
      Markers.add(id, point, title, name, html, icontype, address, geostring);
      nameClick(id);
      routingAddressTo = address;
      routingPointTo = point;
    });
  }
}

function clickRoute(){
  routeMode = true;
  iw = map.getInfoWindow();
  iw.maximize();
  setTimeout("fillDst()", 500);
}

function fillDst(){
  $("#dstinp").val($("#mapinp").val());
}

function toggleSrcDst(){
  var tmp = $("#srcinp").val();
  $("#srcinp").val($("#dstinp").val());
  $("#dstinp").val(tmp);
  tmp = routingPointFrom;
  routingPointFrom = routingPointTo;
  routingPointTo = tmp;
  tmp = routingAddressFrom;
  routingAddressFrom = routingAddressTo;
  routingAddressTo = tmp;
}

function clearMap(){
  map.clearOverlays;
  routingAddressFrom = routingAddressTo = routingPointFrom = routingPointTo = null;
  routeMode = false;
}

function clientRoute(){
  routeMode = true;
  geocode("srcinp", "srcoutp");
}
