///////////////////////
//new global variables
var GmapVarMap;
var GmapVarMapSize;
var GmapVarMapElement;
var GmapVarMarkersIcons = new Array();
var GmapVarMarkers = new Array();
var GmapVarMarkersCoordinates = new Array();
var GmapVarMarkerLimit = 1;
var GmapVarZoom = 13;
var GmapVarMarkerDragable = false;
var GmapVarMarkersOptions = new Array();

var GmapVarOnClickMarkerAdd = false;
var GmapVarOnClickMarkerAddHandler = false;

var GmapVarDrawEvent = new Array();
var GmapVarPolyEditEnabled;

var GmapVarPolylines = new Array();
var GmapVarPolygons = new Array();

var GmapVarPolylineOptions = new Array();
var GmapVarPolygonsOptions = new Array();





function GmapInit(elementId, size, zoom, centerCoordinates, mapType){
   if (GBrowserIsCompatible()){
      if (mapType == undefined){
         mapType = G_NORMAL_MAP;
      }

      if (centerCoordinates == undefined){
         centerCoordinates = new Array(43.519676, 16.450653);
      }

      if (size == undefined){
         size = new Array(800, 600);
      }

      if (zoom == undefined){
         zoom = 13;
      }


      GmapVarMapElement = elementId;
      GmapVarMapSize = size;
      GmapVarZoom = zoom;
      GmapVarMap = new GMap2(document.getElementById(elementId), {size: new GSize(size[0], size[1])});
      GmapVarMap.setCenter(new GLatLng(centerCoordinates[0], centerCoordinates[1]), parseInt(zoom), mapType);
      //geocoder = new GClientGeocoder();


      //navigation
      GmapVarMap.addControl(new GLargeMapControl3D());
      //buttons
      GmapVarMap.addControl(new GHierarchicalMapTypeControl());
      //GmapVarMap.addControl(new GOverviewMapControl());


      //enable scroll zoom
      GmapVarMap.enableScrollWheelZoom();


      //GmapLoading();
   }
}





function GmapIsLoaded(ifLoadedFunction){
   if (ifLoadedFunction == undefined){
      ifLoadedFunction = function(){};
   }

   if ($("#lmc3d").size()){
      ifLoadedFunction();
      return;
   }

   setTimeout('GmapIsLoaded('+ifLoadedFunction+')', 100);
}





function GmapLoading(){
   var top = GmapVarMapSize[1] / 2 - 10;
   var left = GmapVarMapSize[0] / 2 - 50;
   $("#"+GmapVarMapElement).append('<div style="position: absolute;z-index: 0;width: '+GmapVarMapSize[0]+'px;height: '+GmapVarMapSize[1]+'px;background-color: #555;" id="GmapShadow"></div>');
   $("#GmapShadow").fadeTo(0, 0.33);

   $("#"+GmapVarMapElement).append('<div style="margin-top: '+top+'px;margin-left: '+left+'px;position: absolute;z-index: 0;width: 100px;background-color: #fff;border: solid 1px #555;text-align: center;padding: 5px;" id="GmapLoading"><img src="/tolteam/lightbox/images/loading.gif" align="texttop" /> Loading...</div>');


   GmapIsLoaded(function(){
      GmapEndLoading();
   });
}





function GmapEndLoading(){
   $("#GmapShadow").fadeTo(500, 0);
   $("#GmapLoading").hide();
   setTimeout('$("#GmapShadow").hide();', 500);
}





function GmapDragable(dragable){
   if (dragable == undefined){
      return GmapVarMarkerDragable;
   }

   GmapVarMarkerDragable = dragable;
}





function GmapMarkerDescription(markerId){
   if (GmapVarMarkersOptions[markerId] == undefined){
      GmapVarMarkersOptions[markerId] = {};
   }

   if (GmapVarMarkersOptions[markerId].descriptionTitle == undefined){
      GmapVarMarkersOptions[markerId].descriptionTitle = '';
   }

   if (GmapVarMarkersOptions[markerId].description == undefined){
      GmapVarMarkersOptions[markerId].description = '';
   }


   return GmapVarMarkersOptions[markerId];
}





function GmapPolyEditEnabled(enabled){
   if (enabled == undefined){
      return GmapVarPolyEditEnabled;
   }

   GmapVarPolyEditEnabled = enabled;
}





function GmapZoom(zoom){
   if (zoom == undefined){
      return GmapVarZoom;
   }

   GmapVarZoom = zoom;
}





function GmapMarkersNum(){
   return GmapVarMarkers.length / 2;
}





function GmapChangeMarkerIcon(markerId, hover){
   if (!GmapVarMarkers[markerId]){
      return;
   }

   if (hover){
      GmapMarker(markerId).setImage(GmapVarMarkersOptions[markerId].hoverIcon.image);
      return;
   }

   GmapMarker(markerId).setImage(GmapVarMarkersOptions[markerId].icon.image);
}





function GmapOnClickMarkerAdd(markerAdd, options){
   if (markerAdd == undefined){
      return GmapVarOnClickMarkerAdd;
   }


   if (options == undefined){
      options = {};
   }

   if (options.icon == undefined){
      if (GmapMarkerIcon(10000000) == undefined){
         GmapCreateMarkerIcon(10000000, "static/images/markers/greenMarker.png", [32, 32], "static/images/markers/markerShadow.png", [59, 32], [15, 31], [15, 1]);
      }
      options.icon = GmapMarkerIcon(10000000);
   }

   if (options.hoverIcon == undefined){
      if (GmapMarkerIcon(10000001) == undefined){
         GmapCreateMarkerIcon(10000001, "static/images/markers/greenMarker.png", [32, 32], "static/images/markers/markerShadow.png", [59, 32], [15, 31], [15, 1]);
      }
      options.hoverIcon = GmapMarkerIcon(10000001);
   }

   if (options.onAddFunction == undefined){
      options.onAddFunction = function(){};
   }


   if (options.onChangeFunction == undefined){
      options.onChangeFunction = function(){};
   }

   if (options.onClickFunction == undefined){
      options.onClickFunction = function(){};
   }


   GmapVarOnClickMarkerAdd = markerAdd;
   if (markerAdd){
      GmapVarOnClickMarkerAddHandler = GEvent.addListener(GmapVarMap, "click", function(overlay, latlng){
         if (latlng != undefined){
            var coordinates = latlng.toUrlValue().split(',');
            var markerId = GmapVarMarkers.length + 1;
            GmapCreateMarker(coordinates, markerId, options);
            options.onAddFunction(markerId);
         }
      });
   }
   else {
      GEvent.removeListener(GmapVarOnClickMarkerAddHandler);
   }
}





function GmapMarkerCoordinates(markerNum, coordinates){
   if (coordinates == undefined){
      return GmapVarMarkersCoordinates[markerNum];
   }

   GmapVarMarkersCoordinates[markerNum] = new Array(coordinates[0],
                                                    coordinates[1]);
}





function GmapMarker(markerId){
   return GmapVarMarkers[markerId];
}





function GmapCreateMarker(coordinates, markerId, options){
   if (GmapVarMarkers[markerId] != undefined){
      GmapVarMap.removeOverlay(GmapVarMarkers[markerId]);
   }

   if (options == undefined){
      options = {};
   }

   if (options.onChangeFunction == undefined){
      options.onChangeFunction = function(){};
   }

   if (options.onClickFunction == undefined){
      options.onClickFunction = function(){};
   }


   var markerOptions = {icon: options.icon};
   if (GmapDragable()){
      markerOptions.draggable = true;
   }

   GmapVarMarkersOptions[markerId] = options;
   GmapVarMarkers[markerId] = new GMarker(new GLatLng(coordinates[0], coordinates[1]), markerOptions);

   GmapVarMap.addOverlay(GmapVarMarkers[markerId]);

   GmapMarkerCoordinates(markerId, coordinates);




   GEvent.addListener(GmapMarker(markerId), "click", function(overlay, latlng){
      options.onClickFunction();
   });


   GEvent.addListener(GmapMarker(markerId), "dragend", function(latlng){
      GmapMarkerCoordinates(markerId, [latlng.lat(), latlng.lng()]);
      options.onChangeFunction(markerId);
   });




   if (options.hoverIcon != undefined){
      GEvent.addListener(GmapMarker(markerId), "mouseover", function(overlay, latlng){
         GmapMarker(markerId).setImage(options.hoverIcon.image);
      });

      GEvent.addListener(GmapMarker(markerId), "mouseout", function(overlay, latlng){
         GmapMarker(markerId).setImage(options.icon.image);
      });
   }
}





function GmapChangeIcon(markerId, icon){
   var coordinates = GmapMarkerCoordinates(markerId);
   GmapVarMarkersOptions[markerId].icon = icon;

   GmapCreateMarker(coordinates, markerId, GmapVarMarkersOptions[markerId]);
}





function GmapPolyline(polyId){
   return GmapVarPolylines[polyId];
}





function GmapPolygon(polyId){
   return GmapVarPolygons[polyId];
}





function GmapMoveMarker(coordinates, markerNum, setCenter){
   if (setCenter == undefined){
      GmapVarMap.setCenter(new GLatLng(coordinates[0], coordinates[1]));
   }

   GmapCreateMarker(coordinates, markerNum);
}





function GmapMarkerIcon(markerIconNum, GIcon){
   if (GIcon == undefined){
      return GmapVarMarkersIcons[markerIconNum];
   }

   GmapVarMarkersIcons[markerIconNum] = GIcon;
}





function GmapRemoveMarker(markerId, options){
   if (options.onRemoveFunction == undefined){
      options.onRemoveFunction = function(){};
   }

   GmapVarMap.removeOverlay(GmapVarMarkers[markerId]);
   GmapVarMarkers[markerId] = '';
   options.onRemoveFunction(markerId);
}





function GmapRemovePolyline(polyId, options){
   if (options.onRemoveFunction == undefined){
      options.onRemoveFunction = function(){};
   }

   GmapVarMap.removeOverlay(GmapVarPolylines[polyId]);
   GmapVarPolylines[polyId] = '';
   options.onRemoveFunction(polyId);
}





function GmapRemovePolygon(polyId, options){
   if (options.onRemoveFunction == undefined){
      options.onRemoveFunction = function(){};
   }

   GmapVarMap.removeOverlay(GmapVarPolygons[polyId]);
   GmapVarPolygons[polyId] = '';
   options.onRemoveFunction(polyId);
}





function GmapTriggerPolygonMouseOver(polyId){
   GmapPolygon(polyId).setStrokeStyle({color : "#555555"});
   GmapPolygon(polyId).setFillStyle({color : "#555555"});
}





function GmapTriggerPolygonMouseOut(polyId){
   GmapPolygon(polyId).setStrokeStyle({color : "#ff5555"});
   GmapPolygon(polyId).setFillStyle({color : "#ff5555"});
}





function GmapTriggerPolylineMouseOver(polyId){
   GmapPolyline(polyId).setStrokeStyle({color : "#555555"});
}





function GmapTriggerPolylineMouseOut(polyId){
   GmapPolyline(polyId).setStrokeStyle({color : "#ff5555"});
}





function GmapPolygonDefaultOptions(options){
   if (options.onChangeFunction == undefined){
      options.onChangeFunction = function(){};
   }

   if (options.onEndLineFunction == undefined){
      options.onEndLineFunction = function(){};
   }

   if (options.maxVertices == undefined){
      options.maxVertices = 0;
   }




   if (options.fillColor == undefined){
      options.fillColor = "#ff0000";
   }

   if (options.fillOpacity == undefined){
      options.fillOpacity = "#ff0000";
   }

   if (options.borderColor == undefined){
      options.borderColor = "#ff0000";
   }

   if (options.borderWidth == undefined){
      options.borderWidth = 2;
   }

   if (options.borderOpacity == undefined){
      options.borderOpacity = 0.7;
   }



   //start hover
   if (options.hover != undefined){
      options.hover = true;
   }
   else {
      options.hover = false;
   }

   if (options.hoverFillColor == undefined){
      options.hoverFillColor = "#0000ff";
   }

   if (options.hoverFillOpacity == undefined){
      options.hoverFillOpacity = 0.7;
   }

   if (options.hoverBorderColor == undefined){
      options.hoverBorderColor = "#ff0000";
   }

   if (options.hoverBorderWidth == undefined){
      options.hoverBorderWidth = 2;
   }

   if (options.hoverBorderOpacity == undefined){
      options.hoverBorderOpacity = 0.7;
   }
   //end hover

   if (options.coordinates == undefined){
      options.coordinates = [];
   }


   return options;
}





function GmapCreateMarkerIcon(markerIconNum, image, imgSize, imageShadow, imgShadowSize, iconAnchorPoint, infoWindowAnchorPoint){
   var Icon = {};
   Icon.image = image;
   Icon.iconSize = new GSize(imgSize[0], imgSize[1]);

   Icon.shadow = imageShadow;
   Icon.shadowSize = new GSize(imgShadowSize[0], imgShadowSize[1]);

   Icon.iconAnchor = new GPoint(iconAnchorPoint[0], iconAnchorPoint[1]);
   Icon.infoWindowAnchor = new GPoint(infoWindowAnchorPoint[0], infoWindowAnchorPoint[1]);


   GmapMarkerIcon(markerIconNum, new GIcon(Icon));
   return GmapMarkerIcon(markerIconNum);
}





function GmapEnablePolygonDraw(options){
   if (!GmapPolyEditEnabled()){
      return;
   }


   if (options.onChangeFunction == undefined){
      options.onChangeFunction = function(){};
   }

   if (options.onEndLineFunction == undefined){
      options.onEndLineFunction = function(){};
   }

   if (options.maxVertices == undefined){
      options.maxVertices = 0;
   }


   if (options.fillColor == undefined){
      options.fillColor = "#0000ff";
   }

   if (options.filOpacity == undefined){
      options.filOpacity = 0.3;
   }

   if (options.borderColor == undefined){
      options.borderColor = "#ff0000";
   }

   if (options.borderWidth == undefined){
      options.borderWidth = 2;
   }

   if (options.borderOpacity == undefined){
      options.borderOpacity = 0.7;
   }



   //start hover
   if (options.hover != undefined){
      options.hover = true;
   }
   else {
      options.hover = false;
   }

   if (options.hoverFillColor == undefined){
      options.hoverFillColor = "#0000ff";
   }

   if (options.hoverFillOpacity == undefined){
      options.hoverFillOpacity = 0.3;
   }

   if (options.hoverBorderColor == undefined){
      options.hoverBorderColor = "#0000ff";
   }

   if (options.hoverBorderWidth == undefined){
      options.hoverBorderWidth = 2;
   }

   if (options.hoverBorderOpacity == undefined){
      options.hoverBorderOpacity = 0.7;
   }
   //end hover

   if (options.coordinates == undefined){
      options.coordinates = [];
   }


   var poly = new GPolygon(options.coordinates, options.borderColor, options.borderWidth, options.borderOpacity, options.fillColor, options.fillOpacity);
   GmapVarMap.addOverlay(poly);
   var polyId = GmapVarPolygons.length + 1;
   GmapVarPolygons[polyId] = poly;
   GmapDraw(polyId, poly, 'POLYGON', options);
}





function GmapEnablePolylineDraw(options){
   if (!GmapPolyEditEnabled()){
      return;
   }


   if (options.onChangeFunction == undefined){
      options.onChangeFunction = function(){};
   }

   if (options.onEndLineFunction == undefined){
      options.onEndLineFunction = function(){};
   }

   if (options.maxVertices == undefined){
      options.maxVertices = 0;
   }



   if (options.borderColor == undefined){
      options.borderColor = "#ff0000";
   }

   if (options.borderWidth == undefined){
      options.borderWidth = 2;
   }

   if (options.borderOpacity == undefined){
      options.borderOpacity = 0.7;
   }



   //start hover
   if (options.hover != undefined){
      options.hover = true;
   }
   else {
      options.hover = false;
   }

   if (options.hoverBorderColor == undefined){
      options.hoverBorderColor = "#0000ff";
   }

   if (options.hoverBorderWidth == undefined){
      options.hoverBorderWidth = 5;
   }

   if (options.hoverBorderOpacity == undefined){
      options.hoverBorderOpacity = 0.7;
   }
   //end hover

   if (options.coordinates == undefined){
      options.coordinates = [];
   }


   var poly = new GPolyline(options.coordinates, options.borderColor, options.borderWidth, options.borderOpacity, options.fillColor, options.fillOpacity);
   GmapVarMap.addOverlay(poly);
   var polyId = GmapVarPolylines.length + 1;
   GmapVarPolylines[polyId] = poly;
   GmapDraw(polyId, poly, 'POLYLINE', options);
}





function GmapDraw(polyId, poly, type, options){
   if (GmapVarDrawEvent[type] == undefined){
      GmapVarDrawEvent[type] = [];
   }


   if (options.onChangeFunction == undefined){
      options.onChangeFunction = function(){};
   }

   if (options.onEndLineFunction == undefined){
      options.onEndLineFunction = function(){};
   }

   if (options.maxVertices == undefined){
      options.maxVertices = 0;
   }


   poly.enableDrawing();
   if (GmapPolyEditEnabled()){
      var obj = {};
      if (options.maxVertices == undefined || options.maxVertices == 0){
         obj = {maxVertices : options.maxVertices};
      }

      GEvent.bind(poly, "mouseover", {poly : poly}, function(){
         if (GmapPolyEditEnabled()){
            poly.enableEditing(obj);
         }
      });


      poly.disableEditing({onEvent: "mouseout"});
   }



   //set colors
   poly.setStrokeStyle({color: options.borderColor, weight: options.borderWidth, opacity: options.borderOpacity});
   if (options.fillColor != undefined && options.fillOpacity != undefined){
      poly.setFillStyle({color: options.fillColor, opacity: options.fillOpacity});
   }



   if (options.hover){
      GEvent.bind(poly, "mouseover", {}, function(){
         poly.setStrokeStyle({color: options.hoverBorderColor, weight: options.hoverBorderWidth, opacity: options.hoverBorderOpacity});
         if (options.hoverFillColor != undefined && options.hoverFillOpacity != undefined){
            poly.setFillStyle({color: options.hoverFillColor, opacity : options.hoverFillOpacity});
         }
      });
      GEvent.bind(poly, "mouseout", {}, function(){
         poly.setStrokeStyle({color: options.borderColor, weight: options.borderWidth, opacity: options.borderOpacity});
         if (options.fillColor != undefined && options.fillOpacity != undefined){
            poly.setFillStyle({color: options.fillColor, opacity: options.fillOpacity});
         }
      });
   }


   GEvent.bind(poly, "lineupdated", {poly : poly, polyId : polyId}, options.onChangeFunction);



   GEvent.addListener(poly, "endline", function(){
      //clear GmapVarDrawEvent
      if (GmapVarDrawEvent[type][polyId] != undefined){
         GEvent.removeListener(GmapVarDrawEvent[type][polyId]);
      }

      options.onEndLineFunction(poly, polyId);


      GmapVarDrawEvent[type][polyId] = GEvent.addListener(poly, "click", function(latlng, index){
         if (index + 1 == poly.getVertexCount()){
            GmapDraw(polyId, poly, type, options);
         }
         else if (typeof index == "number"){
            if (confirm("Are you sure you want to delete this point?")){
               poly.deleteVertex(index);
            }
         }
         else {
            //var newColor = "#0000ff";
            //cells.color.style.backgroundColor = newColor
            //poly.setStrokeStyle({color: newColor, weight: 4});
         }
      });
   });
}





function GmapPolyCoordinates(poly){
   var coords = new Array();
   for (var i = 0; i <= poly.getVertexCount() - 1; i++){
      coords[i] = poly.getVertex(i);
   }

   return coords;
}





function GmapChangeZoom(onChange){
   GEvent.addListener(GmapVarMap, "zoomend", onChange);
}





function GmapChangeType(onChange){
   GEvent.addListener(GmapVarMap, "maptypechanged", onChange);
}





function GmapSetCenter(coordinates){
   GmapVarMap.setCenter(new GLatLng(coordinates[0], coordinates[1]), GmapZoom());
}






/*function GmapImageSize(imgSrc, onLoadFunction){
   var newImg = new Image();
   

   newImg.onload = function(){
      var height = newImg.height;
      var width = newImg.width;

      //alert('onLoad '+newImg.height);
      return new Array(width, height);
      onLoadFunction();
   }

   newImg.src = imgSrc;
}*/
