/**
 * Author: Akshay Bhurtun
 * Date: 12 Feb 2009
 *
 * CustomLayerManager used to manage the varios PTV layers
 *
 * $Id: CustomLayerManager.js,v 1.1 2009/02/23 05:55:12 vpulla Exp $
 */


/*==============================================================================
   CustomLayerManager
*/

function CustomLayerManager(containerLayer_)
{
   var layerCollection = new Array();
   var containerLayer = containerLayer_;
   var requestCount = 0;
   var poiSearchType = 0;
   
   this.setPOISearchType=function setPOISearchType(poiSearchType_)
   {
      poiSearchType = poiSearchType_;
   };
   
   this.getPOISearchType=function getPOISearchType()
   {
      return poiSearchType;
   };
   
   /**
    * generate the Layers as a list of URL params (used when retrieving the layer
    * information from the server)
    */
   this.getLayersAsURLParams=function getLayersAsURLParams()
   {
      var buffer = "";
      for(var i=0; i<layerCollection.length; i++)
      {
         buffer += "&layers[" + i + "].layerType=" + layerCollection[i].layerType;
         buffer += "&layers[" + i + "].attributes=" + layerCollection[i].attNames;
         buffer += "&layers[" + i + "].maxResults=" + layerCollection[i].maxResults; 
      }
      return buffer;
   }
   
   /**
    * Add a new layer to the collection
    */
   
   this.addLayer=function addLayer(ptvLayerType, ptvLayerDescription, ptvLayerAttNames, defaultPOI, drawPOIByDefault, layerHandlerFn, maxResults)
   {
      if(layerCollection == null)
         return;
      var attNames = new Array();
      var tempLayer = {layerType:ptvLayerType,ptvLayerDescription:ptvLayerDescription,attNames:ptvLayerAttNames, defaultPOI:defaultPOI, drawPOIByDefault:drawPOIByDefault, layerHandlerFn:layerHandlerFn, maxResults:maxResults};
      layerCollection[layerCollection.length] = tempLayer;
   };
   
   /**
    * get a particular layer by type
    */
   this.getLayerByType=function getLayerByType(ptvLayerType)
   {
      var fnName = cName + "getLayerByType() ";
      for(var i=0; i<layerCollection.length; i++)
      {
         if(layerCollection[i].layerType == ptvLayerType)
            return layerCollection[i];
      }
   };
   
   /**
    * clear all of the pois belonging to that layer from the map
    */
   this.clearLayers = function clearLayers()
   {
      for(var i=0; i<layerCollection.length; i++)
      {
         var layerType = layerCollection[i].ptvLayerDescription;
         
         var category = containerLayer.getCategoryById(layerType);
         containerLayer.hidePOIsByCategory(layerType);
         if(category != null)
            category.setPOIs(new Array());
      }
   };
   
   /**
    * Populate the various server POIs.
    * serverPOIViews is an array of POIs of the following structure
    * POI: {
    *          poiID:...,
    *          poiType:...,
    *          longitude:...,
    *          latitude:...,
    *          attributes:
    *          {
    *             attName1:...,
    *             attName2:...,
    *             ...
    *          }
    *
    *      }
    */
   this.populateLayers=function populateLayers(serverPOIViews)
   {
      var fnName = cName + "rpc_populateLayers() ";
      //this.clearPTVLayers();
      this.clearLayers();
      for(var i=0; i<serverPOIViews.length; i++)
      {
         var poiid = serverPOIViews[i].poiID;
         var poiType = serverPOIViews[i].poiType;
         
         var ptvLayer = this.getLayerByType(poiType);
         var defaultLayerPOI = ptvLayer.defaultPOI;
         
         var poi = {};
   
         for(var attr in defaultLayerPOI)
         {
            eval("poi." + attr + "=defaultLayerPOI." + attr);
         }
         
         poi.poiid = poiid;
         
         var summary = "";
         
         //var ptvAttributes = {};
         for(var param in serverPOIViews[i].attributes)
         {
            var valueData = "";
            eval("valueData = serverPOIViews[" + i + "].attributes." + param);
            var elementClass = poiType + "_" + param;
            summary += "<div class='" + elementClass +"'><span class='ptvAttributeName'>" + param + ":</span>" + valueData + "</div>";
            //eval("ptvAttributes." + attributeNames[k] + "=\"" + valueData + "\";"); 
         }
         // for backward compatibility
         poi.ptvAttributes = serverPOIViews[i].attributes;
         
         poi.serverPOI = serverPOIViews[i];
         poi.summary = summary;
         poi.categoryId = ptvLayer.ptvLayerDescription;
         poi.longitude = serverPOIViews[i].longitude;
         poi.latitude = serverPOIViews[i].latitude;
         
         var clientPOI = containerLayer.addPOI(poi);
         if(ptvLayer.layerHandlerFn != null)
         {
            if(typeof(ptvLayer.layerHandlerFn) == "function")
               ptvLayer.layerHandlerFn(clientPOI);
            else if(typeof(ptvLayer.layerHandlerFn) == "string")
               eval(ptvLayer.layerHandlerFn);
         }
         if(ptvLayer.drawPOIByDefault)
            clientPOI.render(containerLayer.getVectorLayer());          
      }
   };
   
   
   this.retrieveLayers=function retrieveLayers()
   {
      var url = conf_poiSearchServlet + "?";
      url += "containerLayerName=" + containerLayer.layerName
      url += "&poiSearchType=" + poiSearchType;
      
      var dimensions = MapUtils.getMapDimensions();
      url += "&upperLeftLatitude=" + dimensions[0].y;
      url += "&upperLeftLongitude=" + dimensions[0].x;
      url += "&lowerRightLatitude=" + dimensions[1].y;
      url += "&lowerRightLongitude=" + dimensions[1].x;
      
      url += this.getLayersAsURLParams();
      
      ConnectionUtils.invokeServerViaRPC("CUSTOMLAYER_REQUEST" + requestCount++, url);
   }
   
}