/**
 * Author: Akshay Bhurtun
 * This class has a bunch of java-style static methods to load, render, and 
 * control the data to be displayed on a map
 *
 * $Id: MapUtils.js,v 1.19 2009/07/20 07:24:19 abhurtun Exp $
 */


var currentSpanInnerHTML;

function MapUtils()
{}

MapUtils.processError=function processError(errorCode)
{
   if(typeof(processTravelMapError) == "function")
      processTravelMapError(errorCode);
   else
      alert("Error [" + errorCode + "] encountered");
}

MapUtils.getDefaultRect=function getDefaultRect()
{
   return {left:6582393.376552952,top:3919288.3893912523,right:7862474.011553582,bottom:3151240.0083908746};
}

/**
 * Function to select the default map which is currently set to the map of 
 * Australia
 */
MapUtils.useDefaultMap=function useDefaultMap(currentMap)
{
   if(currentMap != null)
   {
      map.setRect(MapUtils.getDefaultRect());
      map.setResetRect(map.getRect());
   }
}

/**
 * Actual function to load a map
 */
MapUtils.loadMap=function loadMap(mapContainer, categoryContainer) 
{
   var fnName = "loadMap()";
   
   if(conf_ptvDebug)
   {
      qxp.dev.log.Logger.ROOT_LOGGER.setMinLevel(qxp.dev.log.Logger.LEVEL_INFO);
      qxp.dev.log.Logger.getClassLogger(qxp.core.Init).setMinLevel(qxp.dev.log.Logger.LEVEL_ERROR);
   }
   
   if(conf_enableSafariFix)
   {
      qxp.Class = com.ptvag.webcomponent.util.EventUtils;
      qxp.Class.needToAddScroll = function() 
      {
         var clientInstance = qxp.sys.Client.getInstance();
         return !clientInstance.isWebkit() || parseInt(clientInstance.getMajor()) >= 500; 
      }; 
      qxp.Class.getAbsoluteMouseX = function(evt) 
      {
         var EventUtils = com.ptvag.webcomponent.util.EventUtils;
         var needToAddScroll = EventUtils.NEED_TO_ADD_SCROLL;
         if (needToAddScroll == null) 
         {
            needToAddScroll = EventUtils.needToAddScroll();
            EventUtils.NEED_TO_ADD_SCROLL = needToAddScroll;
         }
         return EventUtils.getEvent(evt).clientX +(needToAddScroll ?
                com.ptvag.webcomponent.util.DomUtils.getScrollX(window) : 0); 
      }; 
      qxp.Class.getAbsoluteMouseY = function(evt) 
      {
         var EventUtils = com.ptvag.webcomponent.util.EventUtils;
         var needToAddScroll = EventUtils.NEED_TO_ADD_SCROLL;
         if (needToAddScroll == null) 
         {
            needToAddScroll = EventUtils.needToAddScroll();
            EventUtils.NEED_TO_ADD_SCROLL = needToAddScroll;
         }
         return EventUtils.getEvent(evt).clientY +(needToAddScroll ?
                com.ptvag.webcomponent.util.DomUtils.getScrollY(window) : 0); 
      };
   }
   
   var container = document.getElementById(mapContainer);
   
   if(container == null)
   {
      log.warn(fnName + "Missing mapContainer");
      return;
   }
   // set zoom level
   MapUtils.setMaxZoomLevel(2);
   
   map = new com.ptvag.webcomponent.map.Map(container, MapUtils.getDefaultRect(), false, conf_profileGroup);
   map.getController().setActionMode(com.ptvag.webcomponent.map.MapController.ACTION_MODE_MOVE);
   
   //map.setProfileGroup(conf_profileGroup);
   map.setBackendServer("Australia");
   
   // copyright
   map.setCopyrightURL(conf_copyright_logo);
      
   if(conf_map_layers_disableBlending != null && conf_map_layers_disableBlending.length != 0)
   {
      var layerNames = conf_map_layers_disableBlending.split(",");
      
      for(var i=0; i<layerNames.length; i++)
      {
         var tempLayer = map.getLayer(layerNames[i]);
         if(tempLayer != null)
         {
            tempLayer.setBlendingOpacityOut(conf_map_layers_blending);
            tempLayer.setBlendingOpacityOver(conf_map_layers_blending);
            tempLayer.setAreaOpacity(conf_map_layers_blending);
         }
      }
   } 
   
   MapUtils.initialiseToolbar(map.getLayer("toolbar"), map);      
   // remove toolbar elements
   if(conf_remove_toolbarElements != null && conf_remove_toolbarElements.length != 0)
   {
      var toolbarElem_names = conf_remove_toolbarElements.split(",");
      var toolbar = map.getLayer("toolbar");
      for(var i=0; i<toolbarElem_names.length; i++)
      {
         toolbar.removeElement(toolbarElem_names[i]);
      }
   }
   
   
   // add window layer
   /*var win = new ia.layer.MapInternalWindow(map, "windowId");
   win.set({ areaLeft:0, areaTop:0, areaOpacity:1 });
   win.setEnabled(false);
   map.addLayer(win, "window1");*/
   
   
   if(typeof(preMapHandler) == "function")
   {
      preMapHandler();
   }
   else
   {
      log.info(fnName, "preMapHandler Function not defined");
   }
   
   // add infoLayer
   var infoLayer = new ia.layer.InfoLayer(map, conf_loadingImage);
   infoLayer.set({ areaLeft:0, areaTop:0, areaOpacity:1 });
   infoLayer.setEnabled(false);
   map.addLayer(infoLayer, "infoLayer");
   
   log.debug(fnName, "Animating map [" + conf_animateMap + "]");
   map.setAnimate(conf_animateMap);
   
   if(conf_animateMap)
   {
      eval("map.setAnimator(new com.ptvag.webcomponent.map.animator." + conf_animator + "())");
   }
   
   map.setAllowMouseWheelZoom(conf_allowMouseWheelZoom);
   
   if(typeof(getPOIsOnPage) == "undefined")
   {
      log.warn(fnName, "Function getPOIsOnPage() is missing");
      return;
   }  
   
   /*var StaticPOIManager = new com.ptvag.webcomponent.map.ServerDrawnObjectManager();
   var mapPOIManager = map.getServerDrawnObjectManager();
   var staticPOIFormatter = mapPOIManager.getStaticPOIFormatter();
   mapPOIManager.setDefaultStaticPOITooltips(false);*/
   //mapPOIManager.addEventListener(StaticPOIManager.STATIC_POIS_AVAILABLE, handlePOIs);
   //mapPOIManager.addEventListener(StaticPOIManager.STATIC_POI_HOVERED, hoverOverPOIOnMap);
   //mapPOIManager.addEventListener(StaticPOIManager.STATIC_POI_CLICKED, clickOnPOIOnMap);
   //vectorLayer.addClickArea(null, null, null, null, generalClickHandler);
   
   var clientPOILayer = getPOIsOnPage();
   if(clientPOILayer == null)
   {
      log.warn(fnName, "No points to display on map");
      return;
   }
   
   
   if(typeof(clientPOILayer) == "string")
   {
      container.innerHTML ="<img src='./mapping.do?key=" + clientPOILayer + "'/>";
      return;
   }
   
   //clientPOILayer.plotPOIs(null);
   var poisAsLatLong = clientPOILayer.getAllPOIs();
   var routes = clientPOILayer.getRoutes();
   
   for(var i=0; i<routes.length; i++)
   {
      poisAsLatLong = poisAsLatLong.concat(routes[i].getRoutePOIs());
   }
   
   var poisAsSmartUnit = new Array();
   
   if(poisAsLatLong == null || poisAsLatLong.length == 0)
   {
      log.warn(fnName, "No points provided, defaulting to Map of Australia");
   }
   
   var poiCount = poisAsLatLong.length;
   
   var vectorLayer = map.getLayer("vector");
   var vector = com.ptvag.webcomponent.map.vector;
   var lineCoords = new Array();
   
   for(var i=0; i<poiCount; i++)
   {
      var coordAsSmartUnit = poisAsLatLong[i].getPOI(); 
      if(coordAsSmartUnit.x == null || coordAsSmartUnit.x == 0 || 
         coordAsSmartUnit.y == null || coordAsSmartUnit.y == 0)
      {
         coordAsSmartUnit= ptvWrapper.getSmartCoordinate(poisAsLatLong[i].getPOI());
      }
      poisAsSmartUnit[i] = coordAsSmartUnit;
   }
   
   if(poisAsSmartUnit.length > 0)
   {
      map.setZoom(conf_zoomLevel_default);
      map.setViewToPoints(poisAsSmartUnit, false, conf_keepZoom);
   }
   
   //var poisearch = new com.ptvag.mnp.poisearchservice.POISearchService(map);    
   
   map.setResetRect(map.getRect()); 
   
   
   // enable/disable layers loaded from configuration
   if(conf_map_layers != null)
   {
      var layers = conf_map_layers.split(",");
   
      for(var i=0; i<layers.length; i++)
      {
         var layerConf = layers[i].split("=");
         var currentLayer = map.getLayer(layerConf[0]);
         
         if(currentLayer != null)
            currentLayer.setEnabled(layerConf[1].toLowerCase() == "true");
      }
   }
   
   map.addEventListener("historyChanged", function(){MapUtils.onAdjustingMapCenterFinished(clientPOILayer)});
   
   if(typeof postMapHandler == 'function') 
   {
      postMapHandler();
   }
}

MapUtils.initialiseToolbar=function initialiseToolbar(toolbar, mapElement)
{
   var fnName = "MapUtils.initialiseToolBar() ";
   toolBarElems = toolbar.getElementIds();
            
   for(var i=0; i<toolBarElems.length; i++)
   {
      var toolbarElem = toolbar.removeElement(toolBarElems[i]);

      
      if(toolBarElems[i] == 'map-view')
      {
         var mapView_prevFn = toolbarElem.clickHandler;
         toolbarElem.clickHandler= function ()
         {
            mapView_prevFn();
             
            mapElement.getLayer("sat").setEnabled(false);
            mapElement.getLayer("label").setEnabled(true);
            mapElement.getLayer("background").setEnabled(true);
            var currentZoom = mapElement.getZoom();
            
            /*MapUtils.setMaxZoomLevel();
            var refreshZoom = currentZoom+2;
            mapElement.setZoom(refreshZoom);*/
         }
      }
      
      if(toolBarElems[i] == 'hybrid-view')
      {
         var hybridView_prevFn = toolbarElem.clickHandler;
         toolbarElem.clickHandler= function ()
         {
            var satMapEnabled = mapElement.getLayer("sat").getEnabled();
            hybridView_prevFn();
            mapElement.getLayer("label").setEnabled(true);
            mapElement.getLayer("background").setEnabled(false);
            mapElement.getLayer("coursegrained").setEnabled(true);
            
            mapElement.getLayer("sat").setLayerOpacity(1);
            mapElement.getLayer("label").setLayerOpacity(1);

            if(!satMapEnabled)
            {
               //MapUtils.setMaxZoomLevel(2);
            }
         }
      }
      
      else if(toolBarElems[i] == 'aerial-view')
      {
         var aerialView_prevFn = toolbarElem.clickHandler;
         toolbarElem.clickHandler= function () 
         {
            var satMapEnabled = mapElement.getLayer("sat").getEnabled();
             aerialView_prevFn();
             mapElement.getLayer("label").setEnabled(false);
             mapElement.getLayer("background").setEnabled(false);
             mapElement.getLayer("coursegrained").setEnabled(true);
             
             
             if(!satMapEnabled)
             {
                //MapUtils.setMaxZoomLevel(2);
             }
         }
      }
      
      toolbar.addElement(toolbarElem);
   }
}
var origTileWidths =com.ptvag.webcomponent.map.CoordUtil.TILE_WIDTHS;
MapUtils.setMaxZoomLevel=function setMaxZoomLevel(maxZoomLevel)
{
   if(maxZoomLevel == null)
      maxZoomLevel = 0;
   var minZoom = 23;   // the new zoom level for "very far out"
   var zoomLevelCount = minZoom - maxZoomLevel + 1;
   var CoordUtil = com.ptvag.webcomponent.map.CoordUtil;
   
   var newTileWidths = [];
   
   for (var i = maxZoomLevel; i <= minZoom; ++i) 
      newTileWidths.push(origTileWidths[i]);
   
   CoordUtil.ZOOM_LEVEL_COUNT = zoomLevelCount;
   CoordUtil.ZOOM_MAX_TILE_WIDTH = newTileWidths[zoomLevelCount - 1];
   CoordUtil.ZOOM_BASE = CoordUtil.ZOOM_MAX_TILE_WIDTH /Math.pow(CoordUtil.ZOOM_LEVEL_FACTOR, CoordUtil.ZOOM_LEVEL_COUNT - 1);
   
   CoordUtil.TILE_WIDTHS = newTileWidths;
   
   /*if(maxZoomLevel > 0)
   {
      var currentZoom = map.getZoom();
      var computedZoom = currentZoom - maxZoomLevel;
      if(currentZoom < maxZoomLevel)
      {
         map.setZoom(currentZoom + 1);
      }
      if(computedZoom < 0)
         computedZoom = 0;
         
      if(currentZoom < maxZoomLevel)   
         setTimeout("map.setZoom(" + computedZoom + ")", 1000);
      else
         map.setZoom(computedZoom);
   }*/
   
}

/**
 * Function invoked when there has been a change in the center of the map
 */

MapUtils.onAdjustingMapCenterFinished=function onAdjustingMapCenterFinished(clientPOILayer)
{
   var fnName = "onAdjustingMapCenterFinished() ";
   log.debug(fnName, "invoking postMapHandler() ");
   clientPOILayer.getCustomLayerManager().retrieveLayers();
   
   if(typeof(onMapChange) == "function")
      onMapChange(clientPOILayer);
}

MapUtils.toggleInfoLayer=function toggleInfoLayer(enabled, infoData)
{
   var fnName = "enableInfoLayer() ";
   
   var infoLayer = map.getLayer("infoLayer");
   //infoLayer.setInfo(infoData);
   if(infoLayer != null)
      infoLayer.setEnabled(enabled);
};

/**
 * Function to load secondary layers
 */
MapUtils.loadSecondaryLayers=function loadSecondaryLayers(secondLayer)
{
   var fnName = "loadSecondaryLayers() "; 
   var customLayer = "customRouteLayer";
   
   var clientPOILayer = map.getLayer(customLayer);
   
   if(secondLayer != null)
   {
      customLayer = secondLayer.layerName;
      clientPOILayer = secondLayer;
   }
      
   
   if(clientPOILayer == null)
   {
      clientPOILayer = new ia.layer.ClientPOILayer(map.getLayer("vector"));
      clientPOILayer.layerName=customLayer;
      //map.addLayer(clientPOILayer, customLayer);
   }

   if(!conf_enablerouting)
      clientPOILayer.setEnabled(false);   
   var layers = map.getLayers();
   var vectorLayer = map.getLayer("vector");
   for (var i = 0;; ++i) 
   {
      if (layers[i] == vectorLayer) 
      {
         map.addLayer(clientPOILayer, customLayer, 0, layers[i + 1]);
         log.debug(fnName, "new layer [" + customLayer + "] added");
         break;
      }
   }
   
   log.debug(fnName, "Enable Routing [" + conf_enablerouting + "]");
   
   if(conf_renderMouseClick)
      MapUtils.enableRouting(customLayer, conf_enablerouting);
   
   //enablePinPointZoom();
}

/**
 * Function to enable routing 
 */

MapUtils.removeRoutePOI=function removeRoutePOI(layerName, routeId, poiid)
{
   var fnName = "MapUtils.removeRoutePOI() ";
   var customLayer = map.getLayer(layerName);
   
   if(customLayer == null)
   {
      log.warn(fnName, "No layer provided!");
      return;
   }
   if(routeId == null)
   {
      log.debug(fnName, "route Id missing, will not remove poi with id [" + poiid + "]");
      return;
   }
   customLayer.removePOIFromRoute(routeId, poiid);
}

var clickCount = 0;
var clickTimer = null;
MapUtils.enableRouting=function enableRouting(layerName, showRoute)
{
   var fnName = "enableRouting() ";
   var clickArea = new com.ptvag.webcomponent.map.vector.ClickArea();

   var vectorLayer = map.getLayer("vector");   
   clickArea.setHandler(function(evt) 
   {
      ++clickCount;
      var childFnName = fnName + " setHandler()";
      var smartLongitude = evt.clickX;
      var smartLatitude = evt.clickY;
      
      if(clickCount == 1)
      {
         if(clickTimer != null)
            clearTimeout(clickTimer);
         clickTimer = setTimeout("clickCount=0;", 500);
      }
      log.debug(fnName, "clickCount [" + clickCount + "]");
      if(clickCount > 1)
      {
         clickCount=0;
         if(clickTimer != null)
            clearTimeout(clickTimer);
         clickTimer = null;
         map.setCenter({x:evt.clickX,y:evt.clickY});
         map.setZoom(map.getZoom()-2);
         return;
      }
      
      var realCoord = ptvWrapper.getRealCoordinate({x:evt.clickX, y:evt.clickY});
      
      //var id = vectorLayer.addElement(new com.ptvag.webcomponent.map.vector.Circle(smartLongitude, smartLatitude, "#000000", 10));
      log.debug(childFnName, "x: [" + realCoord.x + "] y: [" + realCoord.y+ "]");
      
      var customLayer = map.getLayer(layerName);
      if(customLayer == null)
      {
         log.fatal(fnName, "CustomLayer [" + layerName +"] layer undefined!");
         return;
      }
      //var poiid = layerName+ "_" + customLayer.getCounter();
      var routeNameElements = document.getElementsByName(conf_routeElemId);
      var routeId = "defaultRoute";
      if(routeNameElements != null && routeNameElements.length > 0 && 
         routeNameElements[0].value != null && routeNameElements[0].value.length > 0)
         routeId = routeNameElements[0].value;
      
      var userPOI = null;
      var currentPOI = null;
      var route = null;
      if(showRoute)
         route = customLayer.getRouteById(routeId);
      
      if(route != null)
         currentPOI = route.getDefaultVIAPOI();
      
      else
         currentPOI = MapUtils.getDefaultClientPOI();
      currentPOI.longitude = realCoord.x;
      currentPOI.latitude = realCoord.y;
      currentPOI.x = evt.clickX;
      currentPOI.y = evt.clickY;
      currentPOI.routeId = routeId;  
      
      if(typeof(preMapClickProcessing) == "function")
      {
         var updatedPOI = preMapClickProcessing(currentPOI);
         if(updatedPOI == null)
            return;
         currentPOI = updatedPOI; 
      }
      if(conf_renderMouseClick == true)
         userPOI = customLayer.addPOI(currentPOI);
      else if(showRoute) 
         userPOI = route.addRoutePOI(new ClientPOI(currentPOI));
         
      if(typeof(onMapClick) == "function")
      {
         log.debug(fnName, "Invoking user defined onMapClick() function...");
         onMapClick(userPOI);
      }
      if(conf_renderMouseClick == true)
      {
         if(userPOI != null)
            userPOI.render(map.getLayer("vector"), userPOI.getPOI().showTT);
      }
      
      if(showRoute)
      {
         routeId = userPOI.$("routeId");
         customLayer.drawRoute(routeId);
      }
      
   });
   vectorLayer.addElement(clickArea);
}

/**
 * Function to display categories. This function creates a div of check boxes
 * based on different categories
 * 
 * @param elementId - HTML element id to populate 
 * @layerName - the layer name which contains the different POIs
 * @showAll - By default check all of the checkBoxes
 * @excludeCategories - a map of categoryNames
 */
MapUtils.showCategories=function showCategories(elementId, layerName, showAll, excludeCategories)
{
   var fnName = "showCategories()";

   var categoryArea = document.getElementById(elementId);
   
   if(categoryArea == null)
      return;
   
   var poiLayer = map.getLayer(layerName);
   
   if(poiLayer == null)
   {
      log.warn(fnName, "POILayer with Name [" + layerName + "] is null");
      return;
   }
   
   var categories = poiLayer.getCategories();
   
   var buffer = "";
   var template = "<input type='checkbox' value='$value' " + (showAll?"checked='checked'":"''")+ " onclick=\"MapUtils.togglePOIsByCategory('"+ layerName + "', '$value', this.checked)\"/>$value ($description)<br/>";
   for(var i=0; i<categories.length; i++)
   {
      if(categories[i].getPOIs().length == 0)
         continue;
      
      if(excludeCategories != null)
      {
         var doExclude = false;
         eval("doExclude = excludeCategories." + categories[i].getCategoryId().replace(/\ /g, '_'));
         if(doExclude)
            continue;         
      }
      var display = template.replace(/\$value/g, categories[i].getCategoryId());
      
      var poiIndexes = "";
      for(var j=0; j<categories[i].getPOIs().length; j++)
      {
         var index = categories[i].getPOIs()[j].$("index");
         var poiid = categories[i].getPOIs()[j].$("poiid");
         poiIndexes += "<a style=\"cursor:pointer\" onclick=\"MapUtils.showPOIByPoiId('" + layerName + "'," + poiid + ")\">" + index + "</a> ,";
      }
      
      if(poiIndexes.length > 0)
         poiIndexes = poiIndexes.substring(0, poiIndexes.length-1);
      display = display.replace(/\$description/g, poiIndexes);
      
      buffer += display;
   }
   categoryArea.innerHTML = buffer;
}

MapUtils.togglePOIsByCategory=function togglePOIsByCategory(layerName, categoryId, show)
{
   var fnName = "togglePOIsByCategory()";
   
   log.debug(fnName, "category [" + categoryId + "] show? [" + show + "]");
   
   var poiLayer = map.getLayer(layerName);
   
   if(show)
      poiLayer.plotPOIs(categoryId);
   else
      poiLayer.hidePOIsByCategory(categoryId);
}


MapUtils.showPOIByPoiId=function showPOIByPoiId(layerName, poiid)
{
   var fnName = "showPOIByPoiId()";
   log.debug(fnName, "START");
   var clientPOILayer = map.getLayer(layerName);
   var poi = clientPOILayer.getPOIByPoiId(poiid);
   MapUtils.recenterOnPOI(poi);
   poi.render(map.getLayer("vector"), true);
}


/**
 * function to recenter on a clientPOI object. A clientPOI is a wrapper for the
 * actual longitude and latitude.
 *
 * @param poi - clientPOI object
 * @param alwaysRecenter - recenter on the point even if it's visible
 */
MapUtils.recenterOnPOI=function recenterOnPOI(poi, alwaysRecenter)
{
   var fnName = "recenterOnPOI()";
   var coord = ptvWrapper.getSmartCoordinate(poi.getPOI());
   
   var rect = map.getRect();
   
   if(alwaysRecenter != null && alwaysRecenter == true)
      map.setCenter(coord)
   
   else if(coord.x < rect.left || coord.x > rect.right || coord.y > rect.top || coord.y < rect.bottom)
      map.setCenter(coord);
}



/**
 * Function to retrieve all of the clientPOI objects from a particular layer.
 *
 * @return array of ClientPOI objects
 */
MapUtils.getAllClientPOIsFromLayer=function getAllClientPOIsFromLayer(layerName)
{
   var fnName = "getAllClientPOIsFromLayer() ";
   
   var clientPOIs = map.getLayer(layerName).getAllPOIs();
   
   log.debug(fnName, "Number of clientPOIs retrieved [" + clientPOIs.length + "]");
   
   return clientPOIs;
}

MapUtils.getAllRoutesFromLayer=function getAllRoutesFromLayer(layerName)
{
   return map.getLayer(layerName).getRoutes();
}



MapUtils.getDefaultClientPOI=function getDefaultClientPOI()
{
   return {longitude:0,latitude:0,poiid:"",index:0,summary:"",label:"",drawPriority:0,radius:3,fill:true,hideTT:true,routeId:"defaultRoute",fontFamily:"",fontWeight:"",fontColor:"",fontSize:"",imageMarker:"",textVAlign:0,textHAlign:0,preTTLoadHandler:"",postTTLoadHandler:"",closeTTLoadHandler:"",hoverHandler:"",exitHoverHandler:"",clickHandler:"",preClickHandler:"",hideTT:true,hideTTCloseButton:false};
};









function handlePOIs(evt)
{
   var fnName = "handlePOI()";
   var pois = evt.getData();
   
   log.debug("POIS: " + evt);
   
}

/** 
 * Gets the maps dimensions so that we can have these to the database
 */
MapUtils.getMapDimensions=function getMapDimensions() {
	var rect = map.getRect();
	var topLeft = ptvWrapper.getRealCoordinate({x:rect.left,y:rect.top});
	var bottomRight = ptvWrapper.getRealCoordinate({x:rect.right,y:rect.bottom});
	return [topLeft, bottomRight];
}

/**
 * Gets the zoom level
 */
MapUtils.getZoomLevel=function getZoomLevel() {
	return map.getZoom();
}

/**
 * Zooms the map to a given set of dimensions
 */
MapUtils.zoomMapToDimensions=function zoomMapToDimensions(topLat, topLon, bottomLat, bottomLon) {
	  var topCoord = ptvWrapper.getSmartCoordinate({longitude:topLon,latitude:topLat});
	  var bottomCoord = ptvWrapper.getSmartCoordinate({longitude:bottomLon,latitude:bottomLat});
	  map.setRect(topCoord.x,topCoord.y,bottomCoord.x,bottomCoord.y);
}


/*==============================================================================
 Printing
*/

MapUtils.generateMapUrl=function generateMapUrl(layerName, width, height)
{
   var fnName = "MapUtils.generateMapUrl() ";
   // map dimensions
   
   // get bounding box
   var dimensions = MapUtils.getMapDimensions();
   var upperLeftLatitude = dimensions[0].y;
   var upperLeftLongitude = dimensions[0].x;
   
   var lowerRightLatitude = dimensions[1].y;
   var lowerRightLongitude = dimensions[1].x;
   
   // get POIs
   var pois = MapUtils.getAllClientPOIsFromLayer(layerName);
   
   //alert("zoomLevel [" + map.getZoom() + "]");
   
   var httpRequest = ConnectionUtils.getXmlHttpObject();
   
   log.debug(fnName, "Number of POIs [" + pois.length + "]");
   var buffer = "";
   var poiCounter = 0;
   // pois 
   for(var i=0; i<pois.length; i++)
   {
      if(pois[i].getVectorElements()[0] == null)
         continue;
      var poiString = pois[i].getPOI();
      var data = "pois[" + poiCounter++ + "]";
      //var temp = "";
      var value = "";
      for(prop in poiString)
      {
         eval("value = poiString." + prop);
         buffer += data + "." + prop + "=" + value + "&";
      } 
   }
   
   buffer += "width=" + width + "&height=" + height + "&";
   buffer += "upperLeftLatitude=" + upperLeftLatitude + "&upperLeftLongitude=" + upperLeftLongitude + "&";
   buffer += "lowerRightLatitude=" + lowerRightLatitude + "&lowerRightLongitude=" + lowerRightLongitude + "&";
   var routes = MapUtils.getAllRoutesFromLayer(layerName);
   
   // routes
   
   for(var i=0; i<routes.length; i++)
   {
      
      if(routes[i].getCurrentRoute() == null)
         continue;
      
      var routePOIs = routes[i].getRoutePOIs();
      for(var j=0; j<routePOIs.length; j++)
      {
         var poiString = routePOIs[j].getPOI();
         var data = "pois[" + poiCounter++ + "]";
         var value = "";
         for(prop in poiString)
         {
            eval("value = poiString." + prop);
            buffer += data + "." + prop + "=" + value + "&";
         } 
      }
      var routeCoordinates = routes[i].getRouteCoordinates();
      
      // get route geometry
      var temp = "";
      var currentRoute = "routes[" + routes[i].getRouteId() + "]";
      
      for(var j=0; j<routeCoordinates.length; j++)
      {
         var coord = ptvWrapper.getRealCoordinate(routeCoordinates[j]);
         temp += "{longitude:" + coord.x + ",";
         temp += "latitude:" + coord.y + "}";
         if(j < routeCoordinates.length-1)
            temp += ";";
      }
      
      if(temp.length > 0)
      {
         buffer += currentRoute + ".addCoord=" + temp + "&";
         buffer += currentRoute + ".routeColor=" + routes[i].getRouteColor() + "&";
         buffer += currentRoute + ".routeWidth=" + routes[i].getRouteWidth() + "&";
      }
   }
   
   httpRequest.open('POST', conf_mappingServlet, false);
   httpRequest.setRequestHeader("charset", "UTF-8");
   httpRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
   
   httpRequest.send(buffer);
   
   
   if(httpRequest != null && httpRequest.readyState == 4)
   {
      if (httpRequest.status == 200)
      {
         var responseXML = null;
         if(window.ActiveXObject)
         {
            responseXML = new ActiveXObject("Microsoft.XMLDOM");
            responseXML.loadXML(httpRequest.responseText);
         }
         else
            responseXML = httpRequest.responseXML; 
         
         var key = responseXML.getElementsByTagName("imageUrl")[0].lastChild.data;
         return conf_mappingServlet + "?key=" + key;
      }
   }
   
}

/*==============================================================================
   CustomLayers
*/

MapUtils.getCustomLayerManager=function getCustomLayerManager(layerName)
{
   return map.getLayer(layerName).getCustomLayerManager();
};


MapUtils.getMap=function getMap()
{
   return map;
}
